Advance standalone admission, finite artillery and native validation
This commit is contained in:
@@ -0,0 +1,533 @@
|
||||
{
|
||||
"target": "Everon, vanilla factions, 12 players",
|
||||
"cases": {
|
||||
"independent_native_build": {
|
||||
"status": "pending",
|
||||
"evidence": []
|
||||
},
|
||||
"prison_geometry_and_spawn": {
|
||||
"status": "pending",
|
||||
"evidence": []
|
||||
},
|
||||
"escape_loop": {
|
||||
"status": "pending",
|
||||
"evidence": []
|
||||
},
|
||||
"join_late": {
|
||||
"status": "pending",
|
||||
"evidence": []
|
||||
},
|
||||
"reconnect_identity": {
|
||||
"status": "pending",
|
||||
"evidence": []
|
||||
},
|
||||
"death_unconsciousness_revive": {
|
||||
"status": "pending",
|
||||
"evidence": []
|
||||
},
|
||||
"respawn_and_spectators": {
|
||||
"status": "pending",
|
||||
"evidence": []
|
||||
},
|
||||
"partial_escape": {
|
||||
"status": "pending",
|
||||
"evidence": []
|
||||
},
|
||||
"defeat_restart": {
|
||||
"status": "pending",
|
||||
"evidence": []
|
||||
},
|
||||
"interrupted_reports": {
|
||||
"status": "pending",
|
||||
"evidence": []
|
||||
},
|
||||
"stale_contacts": {
|
||||
"status": "pending",
|
||||
"evidence": []
|
||||
},
|
||||
"support_losses": {
|
||||
"status": "pending",
|
||||
"evidence": []
|
||||
},
|
||||
"ammunition_depletion": {
|
||||
"status": "pending",
|
||||
"evidence": []
|
||||
},
|
||||
"cleanup_no_duplicate_orders_or_spawns": {
|
||||
"status": "pending",
|
||||
"evidence": []
|
||||
},
|
||||
"twelve_players": {
|
||||
"status": "pending",
|
||||
"evidence": []
|
||||
},
|
||||
"equivalent_workload_fps_improvement": {
|
||||
"status": "pending",
|
||||
"evidence": []
|
||||
},
|
||||
"own_identity_release_package": {
|
||||
"status": "pending",
|
||||
"evidence": []
|
||||
}
|
||||
},
|
||||
"development_checks": {
|
||||
"scripted_local_escape_and_restart": {
|
||||
"status": "passed",
|
||||
"scope": "Two scripted offline Workbench rounds; 40 assertions; excludes manual play and multiplayer",
|
||||
"evidence": [
|
||||
"docs/evidence/native-2026-09-19-003520/report.json",
|
||||
"docs/evidence/native-2026-09-19-003520/console.log.txt",
|
||||
"docs/evidence/native-2026-09-19-003520/source-sha256.json"
|
||||
]
|
||||
},
|
||||
"clean_native_runtime": {
|
||||
"status": "pending",
|
||||
"scope": "The 065351 source snapshot passed two environment/restart rounds with zero native errors. Subsequent production changes require another current-source full-loop run before this release gate can pass. Historical evidence remains recorded in scripted_environment_restart.",
|
||||
"evidence": [
|
||||
"docs/evidence/native-2026-09-19-065351/report.json",
|
||||
"docs/evidence/native-2026-09-19-065351/console.log.txt",
|
||||
"docs/evidence/native-2026-09-19-065351/source-sha256.json"
|
||||
]
|
||||
},
|
||||
"scripted_helicopter_loss_and_restart": {
|
||||
"status": "passed",
|
||||
"scope": "Two complete local Workbench rounds; 45 passing assertions including partial third-round startup; does not cover all-player death or multiplayer",
|
||||
"evidence": [
|
||||
"docs/evidence/native-2026-09-19-003902/report.json",
|
||||
"docs/evidence/native-2026-09-19-003902/console.log.txt",
|
||||
"docs/evidence/native-2026-09-19-003902/source-sha256.json"
|
||||
]
|
||||
},
|
||||
"scripted_death_spectator_restart": {
|
||||
"status": "passed",
|
||||
"scope": "Two local Workbench rounds on headless Gamescope; 20 assertions; identity roster, actual character death, local camera activation, all-dead defeat and restart. Does not verify real network reconnect or remote spectator streaming.",
|
||||
"evidence": [
|
||||
"docs/evidence/native-2026-09-19-011025/report.json",
|
||||
"docs/evidence/native-2026-09-19-011025/console.log.txt",
|
||||
"docs/evidence/native-2026-09-19-011025/source-sha256.json"
|
||||
]
|
||||
},
|
||||
"scripted_physical_radios": {
|
||||
"status": "passed",
|
||||
"scope": "Two headless Workbench rounds; 30 assertions including roster/death checks. Three six-person squads with real manpacks, uplink/downlink delivery and interrupted receiving-radio loss. Does not yet prove observed-contact-driven strategic assignments.",
|
||||
"evidence": [
|
||||
"docs/evidence/native-2026-09-19-011738/report.json",
|
||||
"docs/evidence/native-2026-09-19-011738/console.log.txt",
|
||||
"docs/evidence/native-2026-09-19-011738/source-sha256.json"
|
||||
]
|
||||
},
|
||||
"scripted_native_hq_response": {
|
||||
"status": "passed",
|
||||
"scope": "Two headless Workbench rounds; 24 assertions. Real vanilla visual perception, radio report delivery, HQ downlink and distinct native search waypoints for other existing squads. Inherited catalog teardown and vehicle errors still fail the overall runtime report.",
|
||||
"evidence": [
|
||||
"docs/evidence/native-2026-09-19-012234/report.json",
|
||||
"docs/evidence/native-2026-09-19-012234/console.log.txt",
|
||||
"docs/evidence/native-2026-09-19-012234/rereintroduced-hq.log.txt",
|
||||
"docs/evidence/native-2026-09-19-012234/source-sha256.json"
|
||||
]
|
||||
},
|
||||
"scripted_silent_escape_regression": {
|
||||
"status": "passed",
|
||||
"scope": "Two headless muted Workbench rounds, 52 assertions, no script/runtime exceptions; current roster and physical-radio patrol composition. Seven inherited vehicle schema errors remain.",
|
||||
"evidence": [
|
||||
"docs/evidence/native-2026-09-19-013224/report.json",
|
||||
"docs/evidence/native-2026-09-19-013224/runner.json.txt",
|
||||
"docs/evidence/native-2026-09-19-013224/source-sha256.json"
|
||||
]
|
||||
},
|
||||
"scripted_mortar_inventory_losses": {
|
||||
"status": "passed",
|
||||
"scope": "Two headless muted local Workbench rounds; 30 assertions. One authored gun, four physical crew, manpack, 27 inventory shells; removed ammunition and destroyed assets stay depleted/lost. Actual mortar firing remains unverified. Seven inherited vehicle schema errors remain.",
|
||||
"evidence": [
|
||||
"docs/evidence/native-2026-09-19-014052/report.json",
|
||||
"docs/evidence/native-2026-09-19-014052/source-sha256.json"
|
||||
]
|
||||
},
|
||||
"scripted_core_only_escape": {
|
||||
"status": "passed",
|
||||
"scope": "Two muted headless Core-only Workbench rounds, 26 assertions. Loaded addons are engine core, vanilla ArmaReforger and ERR_Core. No successor AI/Intel/Chat/Map loaded. Physical clues, radio defence, helicopter occupancy, victory and restart pass. Native vehicle schema and catalog teardown errors remain; manual and multiplayer acceptance pending.",
|
||||
"evidence": [
|
||||
"docs/evidence/native-2026-09-19-015043/report.json",
|
||||
"docs/evidence/native-2026-09-19-015043/runner.json.txt",
|
||||
"docs/evidence/native-2026-09-19-015043/source-sha256.json"
|
||||
]
|
||||
},
|
||||
"scripted_core_native_objectives": {
|
||||
"status": "passed",
|
||||
"scope": "Two Core-only muted headless Workbench rounds, 38 assertions, no script or VM exceptions. Native phase tasks, completion, discovery-responsive instructions, defence countdown/reset, escape and restart. Seven inherited vehicle schema errors remain; UI usability and network replication remain unverified.",
|
||||
"evidence": [
|
||||
"docs/evidence/native-2026-09-19-015605/report.json",
|
||||
"docs/evidence/native-2026-09-19-015605/runner.json.txt",
|
||||
"docs/evidence/native-2026-09-19-015605/source-sha256.json"
|
||||
]
|
||||
},
|
||||
"scripted_companions_after_core_split": {
|
||||
"status": "passed",
|
||||
"scope": "One muted headless full-integration Workbench round, 26 assertions, no script or VM exceptions. Existing companions still complete the escape after Core takes ownership of recovery, markers and native tasks. Seven inherited vehicle schema errors remain.",
|
||||
"evidence": [
|
||||
"docs/evidence/native-2026-09-19-015947/report.json",
|
||||
"docs/evidence/native-2026-09-19-015947/runner.json.txt",
|
||||
"docs/evidence/native-2026-09-19-015947/source-sha256.json"
|
||||
]
|
||||
},
|
||||
"scripted_death_after_core_objectives": {
|
||||
"status": "passed",
|
||||
"scope": "One full-integration muted headless Workbench round, 10 assertions, no script/VM exceptions. Real death, one-life identity rules, spectator activation and all-dead defeat still work after adding native Core objectives. Seven inherited vehicle errors remain; this does not verify rendered task UI or network clients.",
|
||||
"evidence": [
|
||||
"docs/evidence/native-2026-09-19-020149/report.json",
|
||||
"docs/evidence/native-2026-09-19-020149/source-sha256.json"
|
||||
]
|
||||
},
|
||||
"scripted_authored_sites_and_finite_stock": {
|
||||
"status": "passed",
|
||||
"scope": "Two Core-only muted headless Workbench rounds, 62 assertions and no script/VM exceptions. Four configured sites, 52 authored stock entities, invalid-definition rejection, clear crate footprints, physical storage-to-player clue transfer, no refill or replacement after cache loss, radio progression, extraction and restart. Seven inherited vehicle schema errors remain.",
|
||||
"evidence": [
|
||||
"docs/evidence/native-2026-09-19-022704/report.json",
|
||||
"docs/evidence/native-2026-09-19-022704/console.log.txt",
|
||||
"docs/evidence/native-2026-09-19-022704/source-sha256.json"
|
||||
]
|
||||
},
|
||||
"scripted_sites_companion_escape": {
|
||||
"status": "passed",
|
||||
"scope": "Two full-integration muted headless Workbench rounds; 52 assertions. Configured sites, physical cache-document transfers and the escape loop work with all companions. The inherited pair of catalog teardown errors and seven vehicle schema errors remain.",
|
||||
"evidence": [
|
||||
"docs/evidence/native-2026-09-19-023120/report.json",
|
||||
"docs/evidence/native-2026-09-19-023120/source-sha256.json"
|
||||
]
|
||||
},
|
||||
"scripted_site_guard_radios": {
|
||||
"status": "passed",
|
||||
"scope": "One muted headless full-integration Workbench round, 15 assertions, no script/VM exceptions. All four authored six-person guard squads have physical manpacks; production uplink/downlink works and removal of the receiving radio interrupts delivery. Death, local spectator and defeat also pass. Seven inherited vehicle schema errors remain.",
|
||||
"evidence": [
|
||||
"docs/evidence/native-2026-09-19-023514/report.json",
|
||||
"docs/evidence/native-2026-09-19-023514/source-sha256.json"
|
||||
]
|
||||
},
|
||||
"scripted_base_catalog_and_commands": {
|
||||
"status": "passed",
|
||||
"scope": "Two Core-only muted headless Workbench rounds, 92 assertions and no script/VM exceptions. Injected prisoner/guard factions, invalid catalog rejection, server service authorization/parser checks, settings persistence and normal escape/restart pass. These service calls do not establish remote RPC ownership or UI acceptance. Seven inherited vehicle schema errors remain.",
|
||||
"evidence": [
|
||||
"docs/evidence/native-2026-09-19-025539/report.json",
|
||||
"docs/evidence/native-2026-09-19-025539/source-sha256.json"
|
||||
]
|
||||
},
|
||||
"scripted_invalid_startup": {
|
||||
"status": "passed",
|
||||
"scope": "One Core-only muted headless fault-injection run, four assertions. A deliberately invalid in-memory faction configuration prevents all site/player/stock spawning, stops services, retains the admin-readable diagnosis and rejects progression into gameplay. The expected startup ERROR is deliberately retained alongside seven inherited vehicle schema errors; this is negative-path evidence, not a clean runtime pass.",
|
||||
"evidence": [
|
||||
"docs/evidence/native-2026-09-19-030156-expected-startup-failure/report.json",
|
||||
"docs/evidence/native-2026-09-19-030156-expected-startup-failure/source-sha256.json"
|
||||
]
|
||||
},
|
||||
"scripted_unconscious_radio_survivor": {
|
||||
"status": "passed",
|
||||
"scope": "Two Core-only muted headless escape/restart rounds, 102 assertions, no script/VM exceptions. Actual native character unconsciousness lasts 35 seconds, preserves survivor/identity/body/camera, prevents radio progress and does not cause defeat. Restored consciousness restarts defence without another life. Controller transitions are scripted; medical treatment, bleedout and remote revive remain unverified. Seven inherited vehicle schema errors remain.",
|
||||
"evidence": [
|
||||
"docs/evidence/native-2026-09-19-030347/report.json",
|
||||
"docs/evidence/native-2026-09-19-030347/source-sha256.json"
|
||||
]
|
||||
},
|
||||
"scripted_companion_base_command_contracts": {
|
||||
"status": "passed",
|
||||
"scope": "Two full-integration muted headless Workbench rounds, 96 assertions, no script/VM exceptions. Core catalog/admin checks, existing HQ and Intel aliases, guarded journal access, complete escape and restart pass with all companions loaded. Seven inherited vehicle schema errors remain.",
|
||||
"evidence": [
|
||||
"docs/evidence/native-2026-09-19-030903/report.json",
|
||||
"docs/evidence/native-2026-09-19-030903/source-sha256.json"
|
||||
]
|
||||
},
|
||||
"scripted_death_after_base_admin": {
|
||||
"status": "passed",
|
||||
"scope": "One full-integration muted headless Workbench round, 32 assertions and no script/VM exceptions. Catalog and command checks plus native death, spent-life retention, local spectator activation and all-dead defeat pass after Core owns controller command initialization. Seven inherited vehicle schema errors remain.",
|
||||
"evidence": [
|
||||
"docs/evidence/native-2026-09-19-031256/report.json",
|
||||
"docs/evidence/native-2026-09-19-031256/source-sha256.json"
|
||||
]
|
||||
},
|
||||
"scripted_alternate_cache_initial_escape": {
|
||||
"status": "passed",
|
||||
"scope": "One Core-only muted headless Workbench round; 65 assertions and no script/VM exceptions. Seven sites and 117 stock items prepare. The southern crate is deleted before taking documents; western documents independently permit radio defence and extraction. Optional discovery rejects unconscious and distant players and emits one transition event. Seven inherited vehicle schema errors remain. Subsequent tests correct cover orientation and add obstruction/collision checks; no manual or multiplayer acceptance.",
|
||||
"evidence": [
|
||||
"docs/evidence/native-2026-09-19-033110/report.json",
|
||||
"docs/evidence/native-2026-09-19-033110/source-sha256.json"
|
||||
]
|
||||
},
|
||||
"scripted_alternate_cache_restart_and_visibility": {
|
||||
"status": "passed",
|
||||
"scope": "Two Core-only muted headless Workbench cache-loss escape/restart rounds; 148 passing assertions. Seven sites, 117 stock items, independent western radio clues after primary crate deletion, no refills/replacement, upright colliding outpost cover, blocked/clear nearby discovery, one discovery event and unconscious radio interruption. Two inherited catalog-manager script errors and seven vehicle schema errors fail the overall native report. No manual, medical-treatment, multiplayer or FPS acceptance.",
|
||||
"evidence": [
|
||||
"docs/evidence/native-2026-09-19-033719/report.json",
|
||||
"docs/evidence/native-2026-09-19-033719/console.log.txt",
|
||||
"docs/evidence/native-2026-09-19-033719/source-sha256.json"
|
||||
]
|
||||
},
|
||||
"scripted_expanded_route_companion_escape": {
|
||||
"status": "passed",
|
||||
"scope": "One full-companion muted headless Workbench escape round, 48 assertions, no script/VM exceptions. The seven-site mission prepares its finite stock with HQ/Intel/Chat/Map loaded; primary-cache document transfer, preserved admin aliases, radio interruption and physical extraction pass. Seven inherited vehicle schema errors remain; no multiplayer or manual gameplay claim.",
|
||||
"evidence": [
|
||||
"docs/evidence/native-2026-09-19-034344/report.json",
|
||||
"docs/evidence/native-2026-09-19-034344/source-sha256.json"
|
||||
]
|
||||
},
|
||||
"scripted_six_site_guard_radios": {
|
||||
"status": "passed",
|
||||
"scope": "One full-companion muted headless Workbench round, 37 assertions, no script/VM exceptions. All six physical six-person guard squads have manpacks. Production uplink/downlink delivers, removal of the actual receiving radio interrupts an order, and death/spectator/defeat completes. Seven inherited vehicle schema errors remain. This checks the selected production route, not every possible multi-hop path or multiplayer.",
|
||||
"evidence": [
|
||||
"docs/evidence/native-2026-09-19-034556/report.json",
|
||||
"docs/evidence/native-2026-09-19-034556/rereintroduced-hq.log.txt",
|
||||
"docs/evidence/native-2026-09-19-034556/source-sha256.json"
|
||||
]
|
||||
},
|
||||
"scripted_twelve_physical_occupants": {
|
||||
"status": "passed",
|
||||
"scope": "One Core-only hidden muted Workbench fixture, 60 passing assertions. The vanilla Mi-8 exposes 17 pilot/cargo positions and twelve real characters occupy distinct seats. Isolated synthetic account records check partial escape, dead/unconscious/disconnected occupants and recycled IDs. The fixture requests its own terminal reset; it is not twelve network clients or manual flight. Seven inherited vehicle resource errors remain.",
|
||||
"evidence": [
|
||||
"docs/evidence/native-2026-09-19-040125/report.json",
|
||||
"docs/evidence/native-2026-09-19-040125/source-sha256.json"
|
||||
]
|
||||
},
|
||||
"scripted_invalid_extraction_transport": {
|
||||
"status": "passed",
|
||||
"scope": "One hidden muted negative startup fixture, three passing assertions. A real under-capacity vanilla vehicle in the in-memory test catalog prevents play/player spawn and rolls back prepared site content. Expected startup ERROR and seven inherited vehicle resource errors are retained.",
|
||||
"evidence": [
|
||||
"docs/evidence/native-2026-09-19-040443-expected-startup-failure/report.json",
|
||||
"docs/evidence/native-2026-09-19-040443-expected-startup-failure/source-sha256.json"
|
||||
]
|
||||
},
|
||||
"scripted_invalid_extraction_boundary": {
|
||||
"status": "passed",
|
||||
"scope": "One hidden muted negative startup fixture, three passing assertions. A zero-radius extraction boundary with the normal helicopter prevents play/player spawn and rolls back prepared site content. Expected startup ERROR and seven inherited vehicle resource errors are retained.",
|
||||
"evidence": [
|
||||
"docs/evidence/native-2026-09-19-040657-expected-boundary-failure/report.json",
|
||||
"docs/evidence/native-2026-09-19-040657-expected-boundary-failure/source-sha256.json"
|
||||
]
|
||||
},
|
||||
"scripted_personal_results_and_mission_time": {
|
||||
"status": "passed",
|
||||
"scope": "One hidden muted Core fixture, 100 passing assertions and no script/VM exceptions. Twelve physical occupants, isolated partial/account result cases, real local controller and hidden vanilla result widgets rejecting stale end-data IDs, legacy settings upgrade, admin time/speed changes applying next round only, and actual native clock progression. Seven inherited vehicle resource errors remain. Synthetic identity rebinding is not real network reconnect or replicated client UI acceptance.",
|
||||
"evidence": [
|
||||
"docs/evidence/native-2026-09-19-040928/report.json",
|
||||
"docs/evidence/native-2026-09-19-040928/source-sha256.json"
|
||||
]
|
||||
},
|
||||
"scripted_early_extraction_loss": {
|
||||
"status": "passed",
|
||||
"scope": "Two hidden muted Core rounds; six assertions. Helicopter loss during prison causes natural defeat/restart while the actual prisoner is alive, with the specific loss reason. Two inherited catalog teardown and seven vehicle errors remain; no network acceptance.",
|
||||
"evidence": [
|
||||
"docs/evidence/native-2026-09-19-041233/report.json",
|
||||
"docs/evidence/native-2026-09-19-041233/source-sha256.json"
|
||||
]
|
||||
},
|
||||
"scripted_core_extraction_clock_restart": {
|
||||
"status": "passed",
|
||||
"scope": "Two hidden muted Core-only escape/restart rounds; 194 assertions, no script/VM exceptions. Both initialize at saved 06:15 and 4x, verify native progression and complete the physical escape loop. Private profile restored exactly; seven inherited vehicle errors remain. No remote or long-duration clock acceptance.",
|
||||
"evidence": [
|
||||
"docs/evidence/native-2026-09-19-041445/report.json",
|
||||
"docs/evidence/native-2026-09-19-041445/source-sha256.json",
|
||||
"docs/evidence/native-2026-09-19-041445/test-settings.json"
|
||||
]
|
||||
},
|
||||
"scripted_companion_extraction_clock_integration": {
|
||||
"status": "passed",
|
||||
"scope": "One hidden muted companion-loaded escape; 48 assertions, no script/VM exceptions. Base catalog/admin and companion aliases, physical intel, interrupted defence, extraction and personal winner title pass with the new services. Seven inherited vehicle errors remain; network result replication is unverified.",
|
||||
"evidence": [
|
||||
"docs/evidence/native-2026-09-19-042046/report.json",
|
||||
"docs/evidence/native-2026-09-19-042046/source-sha256.json"
|
||||
]
|
||||
},
|
||||
"scripted_finite_ground_transport": {
|
||||
"status": "passed",
|
||||
"scope": "One hidden muted Core transport fixture; 23 assertions, no script/VM exceptions. Surveyed parking, five usable seats, actual driver/passenger occupancy, native engine startup, 58.5 L initial fuel, depletion/loss and no replacement/reinitialization pass. Fixture explicitly requests reset; seven inherited vehicle schema errors remain. No manual driving or multiplayer claim.",
|
||||
"evidence": [
|
||||
"docs/evidence/native-2026-09-19-044205/report.json",
|
||||
"docs/evidence/native-2026-09-19-044205/source-sha256.json"
|
||||
]
|
||||
},
|
||||
"scripted_radio_service_companion_escape": {
|
||||
"status": "passed",
|
||||
"scope": "One hidden muted full-companion escape; 48 assertions, no script/VM exceptions. New production radio service passes real-time departure/reset/continuous completion, native extraction and personal result integration. Seven inherited vehicle schema errors remain; new isolated async radio edge-case fixture and network acceptance are separate.",
|
||||
"evidence": [
|
||||
"docs/evidence/native-2026-09-19-044924/report.json",
|
||||
"docs/evidence/native-2026-09-19-044924/source-sha256.json"
|
||||
]
|
||||
},
|
||||
"scripted_player_admission_guards": {
|
||||
"status": "passed",
|
||||
"scope": "One hidden muted Core native lifecycle fixture, 54 assertions, no script/VM exceptions. Ordinary initial spawn, 20 remaining prison slots around one player, reserved positions, physical body obstruction, actual handler refusal/owned cleanup, controlled actor protection and deferred vertical drift. Fixture requests terminal reset; seven inherited vehicle errors remain. No remote preload or reconnect acceptance.",
|
||||
"evidence": [
|
||||
"docs/evidence/native-2026-09-19-050403/report.json",
|
||||
"docs/evidence/native-2026-09-19-050403/source-sha256.json"
|
||||
]
|
||||
},
|
||||
"scripted_radio_admission_restart": {
|
||||
"status": "passed",
|
||||
"scope": "Two hidden muted Core escape/restart rounds; 340 assertions, no script/VM errors. Physical radio edge cases with deferred state recovery, ordinary real-time defence, live native objective details and fresh prisoner spawning through admission guard. Synthetic radio membership/timestamps are not remote-client evidence. Seven inherited vehicle errors remain.",
|
||||
"evidence": [
|
||||
"docs/evidence/native-2026-09-19-050515/report.json",
|
||||
"docs/evidence/native-2026-09-19-050515/source-sha256.json"
|
||||
]
|
||||
},
|
||||
"scripted_objective_widget_restart": {
|
||||
"status": "passed",
|
||||
"scope": "Two hidden muted Core escape/restart rounds, 374 assertions, no script/VM errors. Native detail close/rebind/reopen, event unsubscribe and delayed callback checks pass alongside radio and admission regressions. Launch/stopped-source and raw-log hashes verify. Seven inherited resource errors remain; later weak-task deletion guard and real remote UI acceptance are separate.",
|
||||
"evidence": [
|
||||
"docs/evidence/native-2026-09-19-051452/report.json",
|
||||
"docs/evidence/native-2026-09-19-051452/source-sha256.json",
|
||||
"docs/evidence/native-2026-09-19-051452/source-provenance.json"
|
||||
]
|
||||
},
|
||||
"scripted_admission_companion_death": {
|
||||
"status": "passed",
|
||||
"scope": "One hidden muted companion death/spectator/defeat fixture, 32 assertions, no script/VM errors. Native damage, spent-life retention and local spectator activation pass after admission and delayed observer changes. Launch/stopped-source and log hashes verify; seven inherited resource errors remain. No remote reconnect or streaming claim.",
|
||||
"evidence": [
|
||||
"docs/evidence/native-2026-09-19-052932/report.json",
|
||||
"docs/evidence/native-2026-09-19-052932/source-sha256.json",
|
||||
"docs/evidence/native-2026-09-19-052932/source-provenance.json"
|
||||
]
|
||||
},
|
||||
"scripted_admission_companion_escape": {
|
||||
"status": "passed",
|
||||
"scope": "One hidden muted companion escape, 48 assertions, no script/VM errors. New radio and spawn admission services preserve physical intel, admin aliases and extraction. Seven inherited resource errors remain; objective teardown refinements have separate evidence.",
|
||||
"evidence": [
|
||||
"docs/evidence/native-2026-09-19-052352/report.json",
|
||||
"docs/evidence/native-2026-09-19-052352/source-sha256.json",
|
||||
"docs/evidence/native-2026-09-19-052352/source-provenance.json"
|
||||
]
|
||||
},
|
||||
"scripted_deleted_task_widget_cleanup": {
|
||||
"status": "passed",
|
||||
"scope": "One hidden muted Core objective UI fixture, 30 assertions, no script/VM exceptions. Native close/rebind/reopen, actual isolated task deletion, cleared weak references, global task-event cleanup, no delayed callbacks and restored real objective assignment. Final 116-addon-file launch/stopped manifest and log hash verify. Seven inherited resource errors remain; no manual or remote UI claim.",
|
||||
"evidence": [
|
||||
"docs/evidence/native-2026-09-19-053124/report.json",
|
||||
"docs/evidence/native-2026-09-19-053124/source-sha256.json",
|
||||
"docs/evidence/native-2026-09-19-053124/source-provenance.json"
|
||||
]
|
||||
},
|
||||
"native_medical_consumption_recovery": {
|
||||
"status": "passed",
|
||||
"scope": "24 local hidden/muted Workbench assertions: real blood loss, bandage consumption, native saline treatment slot/effect, duplicate refusal, natural consciousness recovery and90-second expiry. No direct consciousness restoration. Seven inherited engine errors remain; no manual interaction or multiplayer claim.",
|
||||
"evidence": [
|
||||
"docs/evidence/native-2026-09-19-062406/report.json",
|
||||
"docs/evidence/native-2026-09-19-062406/runner.json.txt",
|
||||
"docs/evidence/native-2026-09-19-062406/source-sha256.json"
|
||||
]
|
||||
},
|
||||
"native_environment_and_faction_catalogs": {
|
||||
"status": "passed",
|
||||
"scope": "67 local hidden/muted Workbench assertions: exact two-vehicle faction catalogs with native inventory/medical/radio support, authored defaults, persisted date/profile, leap-date validation, next-round commands, native clear/overcast/rain and clock preservation. Zero script/VM or engine errors. One round only; multiplayer and repeated restart qualification remain pending.",
|
||||
"evidence": [
|
||||
"docs/evidence/native-2026-09-19-063559/report.json",
|
||||
"docs/evidence/native-2026-09-19-063559/runner.json.txt",
|
||||
"docs/evidence/native-2026-09-19-063559/source-sha256.json"
|
||||
]
|
||||
},
|
||||
"scripted_twelve_prisoner_kit": {
|
||||
"status": "passed",
|
||||
"scope": "155 combined native assertions passed with zero engine errors: one controlled prisoner and eleven physical test characters fit inside the prison, each has the exact unique starting inventory, can receive and return a clue, and test actors are cleaned up. This is not twelve network clients or manual inventory UI validation.",
|
||||
"evidence": [
|
||||
"docs/evidence/native-2026-09-19-063949/report.json",
|
||||
"docs/evidence/native-2026-09-19-063949/console.log.txt",
|
||||
"docs/evidence/native-2026-09-19-063949/source-sha256.json"
|
||||
]
|
||||
},
|
||||
"scripted_recovery_abandonment": {
|
||||
"status": "passed",
|
||||
"scope": "54 combined native assertions passed with zero engine errors, including all-incapacitated status, event deduplication, survivor preservation beyond the death grace, authorization checks and abandonment while the warning is active. Health state is controlled by this policy fixture; actual treatment has a separate fixture.",
|
||||
"evidence": [
|
||||
"docs/evidence/native-2026-09-19-064406/report.json",
|
||||
"docs/evidence/native-2026-09-19-064406/console.log.txt",
|
||||
"docs/evidence/native-2026-09-19-064406/source-sha256.json"
|
||||
]
|
||||
},
|
||||
"scripted_environment_restart": {
|
||||
"status": "passed",
|
||||
"scope": "Two actual local Workbench rounds; 107 assertions with zero script/VM or engine errors. Real production settings owner saves a leap date and overcast profile for the next instance, preserves active weather/clock in round one, applies choices in round two and cleans owned fixture files. Remote agreement and manual administration remain unqualified.",
|
||||
"evidence": [
|
||||
"docs/evidence/native-2026-09-19-065351/report.json",
|
||||
"docs/evidence/native-2026-09-19-065351/console.log.txt",
|
||||
"docs/evidence/native-2026-09-19-065351/source-sha256.json"
|
||||
]
|
||||
},
|
||||
"scripted_total_document_loss": {
|
||||
"status": "passed",
|
||||
"scope": "58 native assertions and zero errors. All four finite radio documents were deleted; distant and unpossessed actors and an obstructing wall were rejected. A clear close approach by the actual controlled participant identifies the station once and permits normal tuning, without replacement clues. Partial knowledge has a separate passing fixture.",
|
||||
"evidence": [
|
||||
"docs/evidence/native-2026-09-19-070733/report.json",
|
||||
"docs/evidence/native-2026-09-19-070733/console.log.txt",
|
||||
"docs/evidence/native-2026-09-19-070733/source-sha256.json"
|
||||
]
|
||||
},
|
||||
"scripted_initial_guards_and_patrols": {
|
||||
"status": "passed",
|
||||
"scope": "295 native assertions and zero errors. Preparation observes all six original squads with six distinct conscious members and completed native spawn requests. Both patrols move existing actors and complete five native waypoints in cyclic order. Native startup queue references repeat but clear as waypoints complete; final queues are unique. Repeated route Stop preserves a foreign Search. No HQ order transit or multiplayer claim.",
|
||||
"evidence": [
|
||||
"docs/evidence/native-2026-09-19-070919/report.json",
|
||||
"docs/evidence/native-2026-09-19-070919/console.log.txt",
|
||||
"docs/evidence/native-2026-09-19-070919/source-sha256.json"
|
||||
]
|
||||
},
|
||||
"scripted_partial_document_loss": {
|
||||
"status": "passed",
|
||||
"scope": "60 native assertions and zero errors. One real clue supplies partial knowledge before all four finite documents are deleted. Distant/NPC/obstructed observers are rejected; clear close approach identifies the station once and permits tuning. No replacement documents, remote clients or manual gameplay claim.",
|
||||
"evidence": [
|
||||
"docs/evidence/native-2026-09-19-071654/report.json",
|
||||
"docs/evidence/native-2026-09-19-071654/console.log.txt",
|
||||
"docs/evidence/native-2026-09-19-071654/source-sha256.json"
|
||||
]
|
||||
},
|
||||
"scripted_patrol_hq_resume": {
|
||||
"status": "passed",
|
||||
"scope": "272 local native assertions, zero errors, all companions. Same physical squad traverses patrol, real HQ delivered-order Search preempts it, release preserves route, and movement/cyclic completion resumes. No extra force, radio-transit or remote-client claim.",
|
||||
"evidence": [
|
||||
"docs/evidence/native-2026-09-19-072838/report.json",
|
||||
"docs/evidence/native-2026-09-19-072838/console.log.txt",
|
||||
"docs/evidence/native-2026-09-19-072838/source-sha256.json"
|
||||
]
|
||||
},
|
||||
"scripted_pending_guard_cancellation": {
|
||||
"status": "passed",
|
||||
"scope": "68 native assertions and zero errors. Empty and partial PENDING-owned groups receive no late dispatch or members after Stop2x while uncancelled control reaches six. Rollback deletes captured actors/groups, six-second observation stays quiet, original mission groups intact. No multiplayer claim.",
|
||||
"evidence": [
|
||||
"docs/evidence/native-2026-09-19-073601/report.json",
|
||||
"docs/evidence/native-2026-09-19-073601/console.log.txt",
|
||||
"docs/evidence/native-2026-09-19-073601/source-sha256.json"
|
||||
]
|
||||
},
|
||||
"scripted_radio_feedback_restart": {
|
||||
"status": "passed",
|
||||
"scope": "Two complete Core escape/restart rounds, 564 assertions and zero errors. Both verify initial radio wait, transmission, unconscious interruption, recovery, leave/reset and completion feedback plus existing administration, roster, documents, objective UI and extraction. Station teardown diagnostics enabled. No remote feedback, ordinary gameplay or later placement-source qualification.",
|
||||
"evidence": [
|
||||
"docs/evidence/native-2026-09-19-073806/report.json",
|
||||
"docs/evidence/native-2026-09-19-073806/console.log.txt",
|
||||
"docs/evidence/native-2026-09-19-073806/source-sha256.json",
|
||||
"docs/evidence/native-2026-09-19-073806/source-provenance.json"
|
||||
]
|
||||
},
|
||||
"scripted_casualty_loading": {
|
||||
"status": "passed",
|
||||
"scope": "87 clean native assertions. Actual local controlled casualty, real five-second action completion boundary, owner handshake, native reservation and observed child-seat occupancy; synthetic helper admission and direct completion only, no held input or remote RPC qualification.",
|
||||
"evidence": [
|
||||
"docs/evidence/native-2026-09-19-075514/report.json",
|
||||
"docs/evidence/native-2026-09-19-075514/console.log.txt",
|
||||
"docs/evidence/native-2026-09-19-075514/source-sha256.json"
|
||||
]
|
||||
},
|
||||
"scripted_casualty_removal": {
|
||||
"status": "passed",
|
||||
"scope": "66 clean native assertions. Actual inherited vanilla removal action, authored exterior door, real exit event, vacant bench and live incapacitated grounded body. Direct completion only, no ordinary held input, remote transit or post-removal extraction result assertion.",
|
||||
"evidence": [
|
||||
"docs/evidence/native-2026-09-19-080058/report.json",
|
||||
"docs/evidence/native-2026-09-19-080058/console.log.txt",
|
||||
"docs/evidence/native-2026-09-19-080058/source-sha256.json"
|
||||
]
|
||||
},
|
||||
"scripted_mortar_inventory_current": {
|
||||
"status": "passed",
|
||||
"scope": "37 clean companion-loaded native assertions. Four physical crew, real manpack operator, exactly 27 distinct HE shells, finite depletion and permanent gun/crew loss. No firing or later readiness/transfer source qualification.",
|
||||
"evidence": [
|
||||
"docs/evidence/native-2026-09-19-080226/report.json",
|
||||
"docs/evidence/native-2026-09-19-080226/console.log.txt",
|
||||
"docs/evidence/native-2026-09-19-080226/source-sha256.json"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"core": "2528466DE220D91C",
|
||||
"ai": "5192138CB9D5B911",
|
||||
"intel": "D31039C7C53E348A",
|
||||
"chat": "FA804F411BDDF2C6",
|
||||
"map": "9AAEE9041D79809E"
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
# Core document discovery setting
|
||||
|
||||
The physical document discovery service belongs to Core. Its existing `intelRevealChancePercent` setting is now configurable in Core-only games through the same administrator-only command used by the companion Chat addon:
|
||||
|
||||
| Command | Result |
|
||||
| --- | --- |
|
||||
| `/esc intel reveal show` | Display the current saved percentage |
|
||||
| `/esc intel reveal set N` | Save a whole number from 0 to 100 |
|
||||
| `/esc intel reveal help` | Explain the range, document rules and when changes apply |
|
||||
|
||||
The first recovered document identifies its destination exactly with the configured percentage chance. Otherwise it provides a rough location. A second eligible document for the same location always identifies it. Setting 0 therefore still permits progression through the two independent two-document caches; setting 100 identifies the destination on the first document. A change affects newly recovered documents immediately. Existing knowledge and documents already counted by discovery are not reset or reprocessed.
|
||||
|
||||
The server retains the existing authentication, rate limit and command-length checks. Malformed values, out-of-range values and failed saves preserve the previous setting. Existing show and successful-set reply formats remain unchanged. Invalid discovery values now include the valid range and progression explanation. Other settings and time/abandon commands keep their existing behavior.
|
||||
|
||||
Chat delegates the reveal alias to Core instead of defining a duplicate. Its `intel carrying` and HQ commands remain companion-specific. This does not expose administration to ordinary players or add a new RPC.
|
||||
|
||||
## Validation
|
||||
|
||||
`tests/test_admin_setting_policy.py` executes the actual Core alias mapping, strict integer parser and settings range predicates through the source-local C++ harness. It checks percentage endpoints, malformed numeric text, radio-duration boundaries, unknown aliases and companion-only exclusions. `python3 tools/check.py` includes it.
|
||||
|
||||
`ERR_NativeAdminSettingsProbe.Run(ERR_GameMode mode)` is an opt-in WORKBENCH test awaiting central native execution. It checks actual authorized read/help dispatch and unauthorized/invalid mutation rejection. Valid changes exercise the same production setting-command handler with a separate `ERR_Settings` instance at `$profile:erri-native-admin-settings-probe.json`; they never mutate the active mission's settings. The fixture rejects already-existing fixture files, verifies native save/reload and unrelated values, then removes only its own fixture primary, backup and temporary files.
|
||||
|
||||
A policy pass does not prove native script compilation, remote RPC ownership or readable chat presentation. Run the native probe inside Core-only and companion regression fixtures, then retain real-client administration in multiplayer acceptance.
|
||||
@@ -0,0 +1,66 @@
|
||||
# Architecture
|
||||
|
||||
## Dependencies
|
||||
|
||||
`core -> ArmaReforger`; `ai -> core`; `intel -> core`; `map -> core`; `chat -> core, ai, intel, map`. Every project declares the vanilla dependency explicitly. Addon GUIDs are listed in `addons.json`; metadata supplies new resource GUIDs. `tools/check.py` rejects external addon dependencies, duplicate resource identities, unresolved resources and legacy Escapists symbols.
|
||||
|
||||
Core owns `ERR_GameMode`, mission rules, native spawn lifecycle integration, settings, the location registry, the vanilla faction catalog and authored scenario construction. `ERR_Phase` transitions are checked centrally. `ERR_LocationComponent` registers stable location IDs and replicates discovery. Mission phase, discovery and persistent settings mutations are server-owned.
|
||||
|
||||
The mode exposes `OnPhaseChanged`, `OnGroup`, `OnTick`, `OnStop` and server-side `OnLocationDiscovered` events. `ERR_CommandService` is the response-coordinator interface. AI supplies its implementation through `CreateCommandService`. Core owns `ERR_DiscoveryService`, recovering physical documents and remembering consumed folder identities, and presents discovered objective markers. Intel subscribes to group and mission ticks only to distribute optional extra documents to enemies. Map supplies its shared field-map item through the scenario resource hook. Chat sends authenticated owner RPCs to mutate validated settings or read HQ status. Scenario placement, radio defence, extraction and mission transitions are separate services; native player assignment uses an account-bound admission gate. Further contracts for support/logistics remain migration work.
|
||||
|
||||
## HQ information flow
|
||||
|
||||
Physical group members observe through vanilla AI perception. `ERR_HQObservation` requires fresh visual observations; `ERR_HQReport` snapshots the available information. The radio graph uses living, correctly affiliated actors actually carrying radios. Reports traverse bounded physical routes, with delay and inventory/affiliation checks at each hop. The delivered contact registry expires stale reports. Orders return through the radio graph before an existing eligible group receives a native search waypoint.
|
||||
|
||||
The coordinator is the sole source of strategic response orders. Individual units retain vanilla tactical combat. It does not spawn reinforcements when alerted. Initial physical forces are authored by the scenario. No distant-unit virtual simulation is implemented.
|
||||
|
||||
The current coordinator is a reduced implementation. Full contact scheduling, supporting aircraft and physical logistics remain incomplete. A finite physical mortar controller now compiles; its initialization, ammunition depletion and permanent asset loss pass local tests. Actual firing has not been validated. Aircraft availability helpers must not be mistaken for an operational controller.
|
||||
|
||||
## Bounded work and ownership
|
||||
|
||||
HQ bounds group/contact registries and staggers report checks; routes have hop limits and timeouts. Intel has a bounded insertion queue. Core remembers physical folders already consumed, so handing a folder to another player cannot rediscover a location. The journal buffers and rotates output. Spawn retries are bounded and server-authored tickets constrain spawn resources and positions.
|
||||
|
||||
Stop events cancel service timers, remove HQ waypoints and despawn owned AI groups through the native group lifecycle. Composition walls have explicit hierarchy ownership. Two scripted round completions across restart are recorded, but full entity-count and memory soak tests are still required. The engine destroys the world during a scenario restart; merely clearing an owner array is not evidence of complete entity cleanup.
|
||||
|
||||
## Round player lifecycle
|
||||
|
||||
`ERR_PlayerRoster` owns life records by backend identity; transient connection IDs are only lookup keys. Spawn, disconnect and rebind publish `OnChanged`. The native reconnect component retains the same physical character for voluntary as well as involuntary departures during its configured reservation interval. Reservation expiry does not restore a spent life. The defeat check includes reserved living characters. A server with no connected players pauses defeat and clears the radio defence timer.
|
||||
|
||||
First-time arrivals may spawn during prison, search or defence. Prison placement checks a bounded grid against physical obstacles and pending reservations; a full grid waits without spending the failure budget. Late spawn positions are checked beside conscious, on-foot survivors, with the same prison grid as fallback. Native preloads receive account/controller/request/data/actor-bound tickets. Final assignment rechecks current life, phase, connection and placement; stop, disconnect and closed-admission phases cancel owned pending actors and callbacks. See [player lifecycle](player-lifecycle.md). New arrivals during extraction observe until the next round. Dead players cannot request another life. Unconscious characters remain survivors and retain their own camera; they do not hold the radio objective.
|
||||
|
||||
The server selects a living friendly survivor for each spectator and replicates only its replication ID and fallback position. A local camera follows that survivor; owner RPCs allow `/esc spectate next` and `/esc spectate previous`. Only the selected survivor and occupied vehicle are pinned for streaming to that spectator. Loss, target changes and mission stop release pins. Reconnect, remote streaming and multi-client camera behavior still require multiplayer tests.
|
||||
|
||||
## Base objective presentation
|
||||
|
||||
`ERR_Objectives` subscribes to phase and tick events and publishes one native `SCR_Task` per active phase, completing the previous task or failing it on defeat. The independent radio service emits start/completion events; Core mission rules alone advance phases. Native task replication carries current instructions to joining players; task markers remain list-only because the discovery registry owns map disclosure. Radio descriptions update on five-second boundaries and show interruptions. These APIs compile against installed vanilla scripts; actual task UI presentation and remote-client delivery still require gameplay validation.
|
||||
|
||||
## Authored sites and finite scavenging
|
||||
|
||||
Core reads `ERR_ScenarioDefinition` from `Configs/ERR/EveronSites.conf`. `ERR_SiteService` owns the resulting locations, guards, containers and stock. The scenario component handles pending/ready/failed preparation separately from mission progression. Location IDs are supplied by configuration and replicated; templates carry no fixed scenario identity. Initial inventory items are created once, and retries move the same entities into the container. Readiness requires observed physical inventory contents. A completed service never refills stock or replaces destroyed sites.
|
||||
|
||||
`ERR_DocumentComponent` binds each mandatory physical clue to a radio location. Core recovery applies it only to that destination; optional generic enemy intel retains its broader discovery behavior. Definition validation requires a starting map and, for Everon, two separate guaranteed clue sources at least 100 metres apart. Each has enough documents to identify the radio independently. Optional supply/outpost locations use bounded five-second conscious-participant visibility scans. Radio identification also permits an eight-metre clear-view approach to the physical station, preserving progress if every finite document is lost. Prison and extraction locations do not gain proximity disclosure. Location names and discovery state replicate to the map, while actual knowledge transitions publish the server-side discovery event. Native tests mutate separate definition instances to verify invalid inputs are rejected. [Authoring details and current stock](site-authoring.md).
|
||||
|
||||
## Base configuration and administration
|
||||
|
||||
`ERR_FactionCatalog` is authored in `Configs/ERR/VanillaFactions.conf` and injected through the game mode resource. The scenario chooses guard groups from it; spawning, spawn authorization and spectator filtering use its player faction; HQ and support use its enemy faction. Startup rejects missing, identical or non-hostile faction keys, and site preparation rejects guard groups with mismatched affiliation. Shared intel and waypoint resources belong to `ERR_Resources`, not a faction selector. A new catalog alone does not provide new factions or suitable support compositions.
|
||||
|
||||
Core owns the `/esc` command registration, owner RPC, server-derived admin authorization, rate limit and command service. `/esc status`, `settings` and `mission radio show|set N` work without companion addons. Spectator cycling is available to players through its existing owner RPC. Chat extends the service with existing HQ/Intel aliases and HQ journal output; it does not install a second command transport. Native service fixtures test parsing and rejected mutations, not remote RPC identity enforcement.
|
||||
|
||||
Preparation failure is retained in replicated state. Spawning remains disabled, local guidance can explain failure before a character exists, and administrators can request the detailed cause. Waiting for site preparation does not consume a player's bounded spawn-attempt budget. The failure path stops services instead of silently leaving their timers running. Remote and visible pre-spawn presentation remain runtime acceptance work.
|
||||
|
||||
|
||||
## Extraction and personal results
|
||||
|
||||
`ERR_ExtractionService` owns the registered helicopter, capacity validation and immutable account-identity escape snapshot. It emits `OnResolved` to mission progression and never replaces its asset. A living registered participant must physically occupy that vehicle beyond the escape boundary during extraction; unconscious and reserved disconnected occupants remain eligible. Early helicopter loss is terminal even before radio completion. Late preparation failure rolls back all authored site content.
|
||||
|
||||
The native end-data connection ID list is retained only as a framework adapter. Core publishes an account-derived personal result on each player's controller, keyed to the current mission replication ID and reset at round startup/audit. Binding/rebinding republishes the result. The successor victory content ignores stale end-data winner IDs and refreshes if personal-result replication arrives after the end screen opens. Local widget tests and real network reconnect acceptance are distinct.
|
||||
|
||||
`ERR_TimeService` configures the native world clock once before the prison phase. Core administration saves start time and progression for the next round while showing the current applied values separately. The native manager advances and replicates time; there is no per-tick clock reset. See [mission time](mission-time.md) and [extraction](extraction.md).
|
||||
|
||||
## Radio defence service and objective details
|
||||
|
||||
`ERR_RadioDefenceService` owns tune authorization, eligible conscious defenders, continuous occupancy and one-time completion. GameMode consumes its events to advance phases and expose extraction; native tasks carry instructions to clients. The service requires current connected life records and the configured player faction, so unregistered actors, disconnected bodies and hostile characters cannot hold transmission. Empty-server sampling resets progress before mission work pauses. See [radio defence](radio-defence.md) for exact boundaries and test scope.
|
||||
|
||||
`ERR_ObjectiveText` supplies hints and native task descriptions from the same mission state. Radio identification can update local guidance within the search phase, and extraction instructions use the configured replicated radius. `ERR_ObjectiveDetails` subscribes open successor task details directly to native display-data changes; it removes that subscription on task switch and widget detach. Detach also removes native global task-event callbacks, and pending overflow work is cancelled before assignee labels are deleted. Other task types retain their native behavior. See [objective widget lifecycle](objective-widget-lifecycle.md).
|
||||
|
||||
Optional ground transport belongs to the existing site definition/service and its rollback path. It has bounded parking checks, actual native fuel and compartments, and no replacement/refill loop. See [ground transport](ground-transport.md).
|
||||
@@ -0,0 +1,48 @@
|
||||
# Bounded base gameplay audit: starting kit and casualty recovery
|
||||
|
||||
Current implementation update: an independently authored prisoner prefab now specifies its starting inventory; Core observes all-incapacitated survivors and supports explicit administrator abandonment. Separate native prisoner, medical and casualty mechanism fixtures have been added. Their actual evidence and remaining limits are recorded in the companion documents and validation log. The audit below is the original finding record, not a claim that these implementations remain absent.
|
||||
|
||||
This source audit covers the first Everon release for up to 12 players. It identifies the next three implementation/acceptance priorities; it does not claim that the ordinary escape route is impossible. No health settings, loadouts, original missions or shared staging were changed by this review. No engine was launched.
|
||||
|
||||
## 1. Establish an explicit successor starting kit
|
||||
|
||||
**Observed implementation gap; not a reproduced spawn or progression failure.** `addons/core/Configs/ERR/VanillaFactions.conf:4` selects vanilla `Character_US_Unarmed.et`. That prefab changes headgear/jacket and the jacket inventory target; it does not clear the inherited pants inventory or equipment slots. Its inheritance is:
|
||||
|
||||
- `{2F912ED6E399FF47}Prefabs/Characters/Factions/BLUFOR/US_Army/Character_US_Unarmed.et`
|
||||
- `{284E735C6C70DAD2}Prefabs/Characters/Factions/BLUFOR/US_Army/Character_US_BaseLoadout.et`
|
||||
- `{836E7E39AAC5888B}Prefabs/Characters/Factions/BLUFOR/US_Army/Character_US_Base.et`
|
||||
- `{37578B1666981FCE}Prefabs/Characters/Core/Character_Base.et`
|
||||
|
||||
Installed vanilla `Character_US_BaseLoadout.et:4–16` authors binoculars and a watch. Its `InitialInventoryItems` at lines 39–53 authors a handheld radio, compass, map, two dressings, tourniquet, morphine, E-tool, two flares and flashlight. Read-only unpacked evidence is available under `/tmp/erri-vanilla/Prefabs/Characters/Factions/BLUFOR/US_Army/`. The unarmed child keeps the pants contents and changes the jacket target to its rolled-up jacket. Actual inventory initialization/capacity and the exact retained runtime item count still need a native inventory assertion.
|
||||
|
||||
Thus “unarmed” currently means no weapon, not stripped prisoner equipment. Maps/binoculars and medical supplies cannot be balanced solely by reading the successor's site stock. Author a successor prisoner prefab that explicitly retains or clears each intended inherited slot/item; preserve vanilla character health and interaction components. Then assert actual starting inventory, compatible magazine capacity, clue pickup and finite stock across a representative 12-character setup before manual testing.
|
||||
|
||||
`EveronSites.conf:14–17` stocks five PM pistols, eight magazines and one map in the prison. Five pistols for 12 players is **not established as a defect**: seven initially unarmed prisoners may be intentional. The two subsequent caches contain eight plus four AK-74s. Decide the desired scarcity explicitly and test the first guarded escape at that loadout; do not automatically increase weapons or remove inherited medical supplies based on this audit.
|
||||
|
||||
## 2. Prove treatment and casualty loading through real vanilla interactions
|
||||
|
||||
**Acceptance gap; no broken medical item or missing character component was demonstrated.** `EveronSites.conf:82–97` provides a hidden medical stash with 12 dressings, six saline bags and six morphine injections. Its position is 6340/7400, discovery radius 25m, and `RevealOnEscape` is 0. The visible clue caches provide dressings, but neither provides saline or a medical-stash clue. Finding the advanced stash therefore currently depends on approaching it; that is a route/discovery decision, not evidence of an impossible route.
|
||||
|
||||
The current native base fixture restores consciousness directly with `CharacterControllerComponent.SetUnconscious(false)` (`ERR_NativeBaseSmoke.c:389`). The extraction fixture boards conscious actors using native `GetInVehicle` (`ERR_NativeExtractionProbe.c:78`), then makes a passenger unconscious while already aboard (`:120`). These tests establish mission handling of consciousness and occupied seats. They do not establish treating real blood loss, consuming medicine, transferring an injured player from ground to a seat, or remaining aboard during treatment and flight.
|
||||
|
||||
Relevant installed sources are `scripts/Game/Components/Damage/SCR_CharacterDamageManagerComponent.c`, `scripts/Game/Components/Gadgets/SCR_ConsumableSalineBag.c`, and `Prefabs/Items/Medicine/SalineBag_01/SalineBag_01_base.et`. The saline effect checks damaged blood, target saline-storage availability and occupied treatment slots; `ApplyEffect` moves the real bag into the treatment slot. The concrete bag's inherited configuration applies a 1500-unit restoration over 90 seconds after a 10-second action. These resources were inspected directly from the installed `addons/data/data*.pak` archives; no original Escapists medical implementation was reused.
|
||||
|
||||
Next scope: a native wounded-character fixture using actual stock and vanilla treatment APIs, followed by manual action/animation checks. Verify bleeding control, tourniquet application/removal, saline consumption/effect completion, morphine, regained consciousness without directly toggling it, drag/carry/load of an unconscious casualty, and release of treatment/seat state after interruption. Keep finite supply depletion and failure cases. Only then decide whether the hidden medical site needs a clue or earlier saline availability.
|
||||
|
||||
## 3. Design an outcome when every survivor is incapacitated
|
||||
|
||||
**Concrete unhandled policy branch; a persistent native hang has not been reproduced.** `ERR_PlayerRoster.c:80–86` reports any living used-life actor as a survivor. `ERR_GameMode.c:320–330` starts the 30-second defeat grace only when that method returns false. Therefore an entire living but incapacitated group does not enter the defeat grace. This correctly preserves a recoverable unconscious player, including reconnect reservations, but does not distinguish a whole group that cannot recover or help one another.
|
||||
|
||||
Installed `scripts/Game/GameMode/Misc/SCR_GameModeHealthSettings.c` defaults `m_bKillIndefinitelyUnconsciousPlayers` to false and permits unconsciousness. The successor inherits the empty health-settings component in vanilla `Prefabs/MP/Modes/GameMode_Base.et` without overriding that policy (`addons/core/Prefabs/ERR/GameMode.et`). Installed `SCR_CharacterDamageManagerComponent.c:789–819` explicitly distinguishes indefinite unconsciousness, including blood below the unconsciousness threshold. A test that simply restores consciousness after 35 seconds does not exercise this state.
|
||||
|
||||
Choose and test a recovery policy before changing code. Concrete options are:
|
||||
|
||||
1. Preserve vanilla recovery indefinitely, but provide a clear shared “no conscious rescuers” state and an explicit round-abandonment/restart path. Define who may invoke it and how reconnecting rescuers affect it.
|
||||
2. Add a separate all-incapacitated grace, longer than the supported treatment/recovery window, that resets when someone becomes conscious. Defeat must wait for the chosen grace and account for reserved actors, ongoing treatment and possible recovery; do not replace `Alive` with `CanFight` in the existing defeat check.
|
||||
3. Offer an explicit voluntary give-up decision while retaining recoverable unconsciousness. This requires its own player-facing authorization/confirmation design and must not silently consume another life or kill a recoverable teammate.
|
||||
|
||||
Reproduce an actual low-blood incapacitation case with damage enabled before selecting thresholds. Test one recoverable casualty with a rescuer, a recovering all-unconscious group, an unrecoverable group, interrupted treatment, reconnecting rescuers and extraction with unconscious passengers. This is deliberately separate from the already-tested 35-second unconscious survivor protection and from multiplayer transport validation.
|
||||
|
||||
## Scope limits
|
||||
|
||||
No confirmed shortage of core medical components or incompatible medicine was found from the inspected inheritance. Runtime inventory, normal user actions, medical animations, medical balance and physical casualty loading remain unproven. The supported 12-player limit is a release target, not proof that five starting weapons are wrong. Original feature parity, manual flight/navigation, multiplayer and measured performance remain tracked elsewhere.
|
||||
@@ -0,0 +1,41 @@
|
||||
# Base replacement is the primary deliverable
|
||||
|
||||
The project replaces the abandoned Escapists base with a maintainable, independently authored mission. Porting the user's companion mods is secondary. A passing companion feature test does not establish that the base replacement is complete.
|
||||
|
||||
The installed original package (1.6.30, metadata targeting Reforger 1.8.0.10) was inventoried read-only: 299 script paths, plus resource category counts, are recorded in `original-resource-inventory.json`. This identifies responsibilities that the old base supplied. No original implementation, compositions or UI resources were imported. Names in that inventory are reference data, not successor dependencies. The first release remains Everon, vanilla factions and up to 12 players; complete original feature parity is deferred.
|
||||
|
||||
The [complete responsibility inventory](original-feature-coverage.md) assigns every original script entry to an unfinished replacement area. This is a filename-based coverage map, not proof of behavior equivalence.
|
||||
|
||||
## Base responsibilities and current gaps
|
||||
|
||||
| Responsibility | Successor implementation | Still required |
|
||||
| --- | --- | --- |
|
||||
| Mission setup and progression | Core phase rules, server settings/commands, saved starting time/progression, replicated startup failure status, definition validation and asynchronous site preparation | Player-facing setup, failure reporting, manual setup and failure-presentation validation |
|
||||
| Prison and player start | New vanilla composition, physical gate and supplies, native spawning | Manual escape and 12-player equipment/space validation; additional surveyed layouts |
|
||||
| Scavenging and discovery | Core owns two independent radio-clue caches, a medical stash, outpost stock, targeted documents and named discovery markers | Manual route access, inventory usability, medical treatment and gameplay balance |
|
||||
| Location population | Seven configured sites, six guard squads, finite stock/props, proximity discovery events and preparation rollback | Additional compositions, destruction presentation, manual access and multiplayer cleanup validation |
|
||||
| Radio objective | Separate radio service authorizes registered connected players, tracks continuous conscious occupancy and emits events; Core publishes native task progress | Native task and radio-progress UI validation, unconscious/revive and simultaneous-player validation |
|
||||
| Extraction and results | Separate extraction service, twelve physical occupants, partial UUID results, result-widget refresh, early loss and capacity validation | Manual boarding/piloting, actual remote reconnect and result delivery, casualty loading and empty-server flight verification |
|
||||
| Player lifecycle | Identity roster, native reconnect reservation, one life, bounded reserved spawn slots, final native assignment checks, local unconsciousness/recovery, spectator camera, defeat/restart | Dedicated server and real multi-client reconnect/streaming tests |
|
||||
| Ground transport | Authored optional finite UAZ, surveyed parking, native fuel/seats/engine and loss checks | Manual road access/driving, simultaneous use and network ownership |
|
||||
| Factions and assets | Injected faction/asset catalog drives prisoner, guard group, extraction and friendly/enemy lookup | Additional catalog combinations and remote validation; provenance review and release packaging |
|
||||
| Enemy strategic response | Optional AI addon supplies the sole HQ coordinator through `ERR_CommandService` | Complete virtualHQ integration after base contracts stabilize; no competing original response system |
|
||||
|
||||
## Immediate implementation order
|
||||
|
||||
1. Completed development check: Core-only alternate-cache escape/restart, seven-site finite inventory, physical cover/discovery and full-companion primary-route/radio regressions. Full gameplay acceptance remains pending.
|
||||
2. Expand and manually validate the authored locations, scavenging route and objective presentation so a person can play without test teleports or hidden knowledge.
|
||||
3. Validate player lifecycle and restart on a dedicated server; resolve native errors before declaring a clean build.
|
||||
4. Integrate existing HQ, Intel, Chat and Map behavior against those base interfaces, followed by equivalent-workload performance measurements.
|
||||
|
||||
Core scenario: `{AD62322D5213C440}Missions/ERR_Everon_Base.conf`. Full integration scenario: `{C1E20667DCE324ED}Missions/ERR_Everon.conf`. Both use the newly authored Everon child world. The Core-only case uses vanilla tactical AI; loading AI installs the HQ coordinator. The production target includes virtualHQ, while the isolated Core case proves the base does not need a companion to advance its objectives.
|
||||
|
||||
Run the base diagnostic without visible windows or sound:
|
||||
|
||||
```sh
|
||||
python3 tools/headless_workbench.py --compat /tmp/erri-headless-compat --profile /tmp/erri-workbench-profile --project core --smoke victory --rounds 2
|
||||
```
|
||||
|
||||
This diagnostic moves actors and the helicopter programmatically. It proves integration paths, not manual playability, multiplayer correctness or FPS improvement.
|
||||
|
||||
The focused [manual gameplay gap audit](base-gameplay-gaps.md) records inherited starting equipment, real treatment/casualty-loading work and the all-incapacitated outcome policy. These require implementation decisions and native gameplay validation before first release.
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"/tmp/erri-vanilla/Prefabs/Vehicles/Helicopters/Mi8MT/Mi8_base.et": "2b6c425e48beda9f67082204023fdbace7773ab0e9b25b7e9f72de6bef22a571"
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
# Parked extraction helicopter: verified landing-gear support
|
||||
|
||||
The parent's native `logs_2026-09-19_07-20-14` showed ten seconds of an intact, upright, motionless authored Mi8 with a valid controller/simulation/physics and `HasAnyGroundContact()==false`. The caller/helper were alive and correctly positioned. Native helicopter simulation exposes this aggregate contact flag and terrain altitude, but no per-wheel query equivalent to wheeled simulation. The installed vanilla available-action condition also simply reads the aggregate flag; it provides no alternative initialization mechanism. No physics wake, engine start, teleport or simulation mutation is added to production.
|
||||
|
||||
`ERR_CasualtyGroundSupport` supplies a conservative fallback only for the known Mi8 family when its physics body is asleep and its engine is off. The ordinary native contact path is retained. Existing speed (0.5m/s), angular velocity (0.1rad/s) and upright (up.y >= 0.85) limits still apply to both routes. Powered hovering cannot use the fallback.
|
||||
|
||||
The installed Mi8_base.et defines three landing-gear bones: `v_wheel_F` with radius 0.30m and `v_wheel_bL`/`v_wheel_bR` with radius 0.45m. Native PointInfo resolves their actual world pivots. All three pivots must exist and remain separated by at least one metre, guarding against failed/collapsed resolution. At each tire bottom, a short vertical trace spans 0.10m above to 0.12m below. Every trace must hit upward-facing collision (normal.y >= 0.85). Hits on the aircraft or its children, dynamic entities and entities without physical support are rejected. Terrain/static collision can support the aircraft; altitude alone cannot. The small tolerance covers collision/placement precision and does not claim exact zero-distance tire contact. Active aircraft without a native contact flag fail closed; unsupported dynamic platforms are outside this fallback.
|
||||
|
||||
Native PointInfo bone resolution, actual tire-to-ground gaps, awake state and trace normal/entity behavior are still **unverified in the engine for this patch**. The opt-in fixture prints all of them. If the untouched aircraft is awake or its authored geometry lies outside the tight support tolerance, the test will fail explicitly; do not silently widen it or activate physics simply to get a pass.
|
||||
|
||||
## Files and integration
|
||||
|
||||
New files:
|
||||
|
||||
- `addons/core/Scripts/Game/ERR/ERR_CasualtyGroundSupport.c`
|
||||
- `addons/core/Scripts/Game/ERR/ERR_NativeCasualtyGroundProbe.c`
|
||||
- `tests/test_casualty_ground_policy.py`
|
||||
|
||||
Apply `ground-support-integration.patch` only to the indicated AircraftReady/Nearby and native casualty-fixture hunks. Its latest central-service baseline preserves the separately reviewed committed-lifecycle changes. Add `test_casualty_ground_policy.py` to the parent's `tools/check.py` test list. No new outcome or BaseSmoke steps are required: the existing `casualty-service` readiness stage runs the bounded ground probe before causing unconsciousness.
|
||||
|
||||
The positive native check reads the untouched actual mission helicopter. It then spawns a separate empty aircraft twenty metres higher, protects that disposable entity from damage, and verifies airborne rejection. On that clone only, it sets a 90-degree tilt and reads the resulting native up vector, then assigns and immediately reads a nonzero native velocity. The production motion policy is checked independently with those actual values, while full AircraftReady must also reject the clone. This is not a travelled-distance/flight-control test. The clone is deleted on completion or failure. The mission aircraft's transform, velocity, activation, engine and health handling are never changed.
|
||||
|
||||
The focused support policy test passed. Native compilation, positive wheel support and the negative physics checks remain pending. `source-sha256.json` identifies the exact installed Mi8 configuration inspected.
|
||||
@@ -0,0 +1,11 @@
|
||||
# Fixture incapacitation correction
|
||||
|
||||
The native casualty fixture used a protected actor, but installed `ForceUnconsciousness` calls resilience `HandleDamage(..., EDamageType.TRUE, ...)`. Native evidence showed protection could swallow that operation and leave the actor conscious.
|
||||
|
||||
The isolated base-probe patch snapshots the actual damage-handling flag, enables it for one synchronous `ForceUnconsciousness` call, reads the actual resilience decrease, and restores the original flag before assertions or cleanup. It asserts decreased resilience, a living actor and exact flag restoration. The existing asynchronous native controller-state check and five-second settling interval remain. No health, consciousness or resilience is restored afterward; no production medical or damage behavior changes.
|
||||
|
||||
`test_casualty_incapacitation.py` executes the actual extracted fixture method against a narrow damage API fake. Both original flag values are preserved; blocked reduction, missing hit zone/manager and dead actor cases fail. This is source-level regression evidence, not native runtime proof.
|
||||
|
||||
The latest parent identifier fixes are retained in the local removal-probe baseline: `doorReference` and `exitTransform`. Installed generated source confirms `BaseCompartmentManagerComponent.GetDoorReference(int)` returns `CompartmentDoorReference`; that class exposes `GetReferencedDoorCompartmentManager()` and inherits `GetAnimDoorIndex()` from `BaseCompartmentDoor`. The native compiler rejected the previous local identifier `reference`; the API return type itself exists. This patch does not include or repeat those already-applied identifier changes.
|
||||
|
||||
Merge only `casualty-incapacitation.patch` and new `tests/test_casualty_incapacitation.py`; no central source or engine was touched by this agent.
|
||||
@@ -0,0 +1,48 @@
|
||||
# Ground casualty loading into extraction transport
|
||||
|
||||
This independently authored implementation adds a five-second `Load casualty into extraction helicopter` action only to the successor Prisoner prefab, using its existing Chest and LowerTorso interaction contexts. It keeps inherited vanilla medical interactions. The service and owner bridge compile natively, and the five-second action and inherited medical actions have been inspected in the native fixture. Ground support, completed interaction and multiplayer qualification are still pending; the earlier successful child-bench mechanism experiment alone does not qualify this complete interaction. Ground exit placement still fails its separate native assertion, so this implementation deliberately supplies no unload action or claim.
|
||||
|
||||
The server accepts only distinct, connected participants whose current controller, connection and used-life roster record all match their current bodies through the canonical server-owned `ERR_PlayerRoster.CurrentActor` check. The bound roster identity must be non-null; this also preserves the existing offline Workbench identity path. A reserved disconnected body is deliberately ineligible. The rescuer must be conscious and on foot; the living target must be natively incapacitated, on the ground, not entering/exiting a vehicle and observed settled for at least five seconds. Settlement is sampled through the round tick with a maximum two-second observation gap; it does not infer that unobserved sub-tick movement was impossible. Recovery, falling, movement, stale observation or identity changes reset the observation window.
|
||||
|
||||
Both actors must be within 12 metres of the registered extraction aircraft and within three metres of one another. The mission must be active in EXTRACTION. The intact helicopter needs actual simulation ground contact or the conservative sleeping, engine-off three-wheel support check described in [casualty-ground-support.md](casualty-ground-support.md), an upright vertical component at least 0.85, linear velocity at most 0.5 m/s and angular velocity at most 0.1 rad/s. Native body interaction contexts provide initial line-of-sight presentation. A new shared native raycast revalidates rescuer-to-casualty sight on the server at request and commit, then again on the owner immediately before entry. It accepts an unobstructed segment or contact with the intended casualty and its attachments. This first version does not supply carrying/dragging animations, arbitrary vehicle loading, or a player unloading action.
|
||||
|
||||
Only actual child transport benches of the registered Mi8 are selectable. The service rejects its root navigator CARGO slot, patient slots, pilot/turret slots, occupied, inaccessible, locked or reserved slots. The exact slot must belong to the actual aircraft's hierarchy and the installed Mi8 seat-part prefab. Native seat classes and health settings remain unchanged. A native reservation plus service tickets prevents duplicate requests for the same caller, casualty or bench. Reservation replication/contention still needs remote tests.
|
||||
|
||||
## Ownership and commit boundary
|
||||
|
||||
A stock `MoveInVehicle` request may retry for missing replicated vehicle entities. This service does not invoke that method or queue callbacks. It uses a successor-specific controller handshake:
|
||||
|
||||
1. Action completion passes live server checks and reserves a bench. The target's controller receives a prepare request identifying the actual mode instance and ticket. Preparation cannot move anyone.
|
||||
2. The target owner validates its current body/phase, starts a three-second local `System.GetTickCount` lease, and sends ready. The server accepts ready only from the ticket's exact controller/body and revalidates identity, current physical state, settled duration, reservation and a five-second preparation deadline.
|
||||
3. The server commits one command with exact mode, caller, casualty, aircraft, seat-owner replication IDs and the slot ID. This is the final authorization boundary. The owner consumes the unexpired lease before executing, rechecks matching mode/body/aircraft, native incapacitation, ranges, grounded craft and the real child seat, then calls native `GetInVehicle` once. Missing entities and native refusals fail once; no delayed retry can later acquire a seat. Duplicate or expired commits cannot execute.
|
||||
4. The server never trusts either a positive or negative client acknowledgement as permission to resolve or release a seat. It observes actual target-seat occupancy and aircraft membership, with an eight-second post-commit budget. The local lease bounds how long a delayed commit may start movement without requiring clocks synchronized between machines. Before commit, identity/physical changes cancel the request. After commit, caller or casualty connection changes alone do not cancel the authorized move or release its reservation: the immutable original body/aircraft/seat are observed until completion or expiry. Death of a still-existing target body retains the committed reservation through physical occupancy or expiry, because the owner can still have pre-death replicated state. Occupancy by a dead target resolves as failure. Loss of the physical aircraft/body or terminal/explicit Stop ends observation without compensating teleports or health changes.
|
||||
|
||||
An already committed native movement is not rolled back if conditions subsequently change. A false resolution means loading was not confirmed by this service, not that a committed native command was magically revoked. Terminal/identity changes are also rechecked on the owner; replication ordering under real latency remains a required multiplayer test. The service removes only a reservation still owned by the same surviving target reference, never another player's reservation. Native reservation cleanup after entity deletion also requires explicit runtime verification.
|
||||
|
||||
The mode adapter owns Tick/Stop/roster subscriptions and replicates only the current extraction-aircraft reference for client action presentation. Roster events run cleanup even when the ordinary mission tick returns early on an empty server. PREPARING roster callbacks are no-ops and cannot permanently stop the service. Terminal/explicit Stop latches before notifying subscribers, releases owned tickets and removes subscriptions. No new persistent settings, public entity-selection RPC, automatic spawning or original Escapists resource is introduced.
|
||||
|
||||
## Integration and checks
|
||||
|
||||
New production files:
|
||||
|
||||
- `addons/core/Scripts/Game/ERR/ERR_CasualtyLoadingService.c`
|
||||
- `addons/core/Scripts/Game/ERR/ERR_CasualtyLoadingOwner.c`
|
||||
- `addons/core/Scripts/Game/ERR/ERR_CasualtyLoadingGameMode.c`
|
||||
- `addons/core/Scripts/Game/ERR/ERR_LoadCasualtyAction.c`
|
||||
|
||||
The successor Prisoner prefab owns the action and `tools/check.py` includes the casualty policy regression. The action reuses the existing Prisoner resource identity; new nested action/UI component IDs are successor-authored.
|
||||
|
||||
Offline checks execute production timing/range/aircraft-motion policy bodies and the complete repository suite. Native work must inspect the real spawned action and inherited medicine actions, show strict rejection for nonparticipants/old bodies/wrong phase, then exercise genuine two-player authorization and physical movement. Test cancellation during action progress, recovery during progress, duplicate callers, last-seat contention, native refusal, loss of replication visibility, delayed/reordered/expired handshake, disconnect/reconnect, aircraft loss and terminal transition. Confirm native seat reservation cleanup and actual single occupancy. Do not count synthetic fixture roster identities as proof of remote controller ownership.
|
||||
|
||||
## Bounded local service fixture
|
||||
|
||||
`ERR_NativeCasualtyServiceProbe.c` is excluded outside WORKBENCH. Opt-in `casualty-service` uses Core steps 1400/1402 and a 45-second fixture deadline. It moves the actual local controlled player beside the real helicopter and causes native incapacitation once; the ordinary owner-controller handshake and target roster checks remain real. Only a separately spawned physical helper receives a synthetic `CurrentLife` adapter. Before enabling that adapter, the fixture explicitly checks real-target membership and strict rejection of the helper, including in a valid physical extraction state. This is not a second authenticated network player.
|
||||
|
||||
The fixture deliberately advances legal mission phases to reach extraction; it does not claim a completed radio objective. It checks a fresh settling window, native external bench reservations, a physical successor wall blocking sight, the real action's completion boundary, duplicate requests, actual player occupancy, reservation release, preserved target identity and idempotent Stop. It does not simulate holding action input, remote packet timing or Stop during an in-flight command. It retains inherited medical-action presence. On completion the normal test reset ends the round; cleanup deletes only the helper/obstacle and releases fixture-owned reservations, with no forced recovery, seated-player teleport, body deletion or unrelated health restoration.
|
||||
|
||||
The WORKBENCH mode override routes owner callbacks to the helper adapter only during this explicit case. Core smoke and the hidden runner expose the opt-in `casualty-service` case. [075514](evidence/native-2026-09-19-075514/report.json) completes this local fixture with 87 passing assertions and zero engine or script/VM errors. The production one-shot initial placement lets the original aircraft settle naturally; separate raised, tilted and moving aircraft are rejected. A single actual native damage request incapacitates the controlled player, then the real action completion boundary and owner-controller handshake load that living body into the selected child bench exactly once. External reservations and physical obstruction reject requests; successful loading releases the reservation, retains player identity and survives idempotent Stop without another completion.
|
||||
|
||||
The real local controller takes the server/local fast path; this does not exercise remote Owner/Server RPC transit. Only the helper membership is adapted, and action completion is invoked directly rather than holding input for five seconds. The fixture requests its own reset after loading, without a complete radio-to-extraction playthrough. Real two-player input, latency/reordering, disconnect/death while pending, last-seat contention and entity-removal cleanup remain separate requirements. Earlier contact and damage-fixture failures are preserved in the validation log.
|
||||
|
||||
|
||||
The separate [stock removal fixture](native-casualty-remove.md) passes in [080058](evidence/native-2026-09-19-080058/report.json): the helicopter's inherited door action removes a test-owned casualty from a real bench, leaving it living and incapacitated beside the authored exit with the seat vacant and accessible. This supplements loading with a local native removal path. It is not the production service's real-player/remote handshake, held action input, or a new extraction-result calculation.
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"scripts/Game/UserActions/SCR_RemoveCasualtyUserAction.c": "fb82fba4e3fd2cc94457942605eb09b13ad10bb033b51615732c7a5ff6611ac0",
|
||||
"scripts/GameCode/UserAction/SCR_CompartmentUserAction.c": "1bb3aeb3aaba90e582a41b737558879e712faf3a57a7542fae89c12e536b50f9",
|
||||
"scripts/Game/generated/Components/CompartmentAccessComponent.c": "a3a0907d771293d2423649aa0ff0e71b7f457279defac05fd693baf4dd7c447e",
|
||||
"scripts/Game/generated/CompartmentDoorInfo.c": "bcb885c5bcb13ce4ad98275be1a8079a96e0f0deb9f2470ba581b15da0ec410a",
|
||||
"scripts/Game/generated/CompartmentDoorReference.c": "c653c63c1835919ec5c5d29fbe7a5d22ee4a805d8ebc806e448dacbfcb4056b8",
|
||||
"scripts/Game/generated/BaseCompartmentDoor.c": "35f6797ac5bc69ccdf3de755601d2a5f74f4ead567cbda35f8a1f5478459f3c6",
|
||||
"Prefabs/Vehicles/Helicopters/Mi8MT/VehParts/Seats/VehPart_MI8_seats_base.et": "1b9a2e55a9a1cb884886488b6e170f437b6c1a615b584449819b96a6c78ad973",
|
||||
"Prefabs/Vehicles/Helicopters/Mi8MT/Mi8_base.et": "2b6c425e48beda9f67082204023fdbace7773ab0e9b25b7e9f72de6bef22a571",
|
||||
"Prefabs/Vehicles/Core/Configs/CargoCompartment_Base.conf": "326668ddc77c1ccb48ce10a0bea33be3bec77803cacae523d3e1f0c93249c5bc"
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
# Base mission configuration
|
||||
|
||||
The independent Core scenario loads `Configs/ERR/VanillaFactions.conf` through `ERR_GameMode.m_FactionDefinition` and `Configs/ERR/EveronSites.conf` through the scenario component. Both are successor resources. Changing a configuration requires restarting the scenario; the live round is not repopulated.
|
||||
|
||||
## Factions and assets
|
||||
|
||||
The catalog explicitly selects the player faction, enemy faction, prisoner character, guard group and extraction helicopter. Current defaults are unarmed US prisoners, Soviet guards and the vanilla unarmed Mi-8 transport. Both factions must exist in the world's faction manager and consider one another hostile. Required prefab resources must resolve. The extraction resource must be a helicopter with a pilot position and at least twelve pilot/passenger seats; invalid extraction setup rolls back prepared sites before players spawn. Guard groups must have the catalog's enemy affiliation; an incompatible group is rejected rather than relabelled.
|
||||
|
||||
This provides an injection boundary, not automatic support for arbitrary addons. A different faction also needs matching characters, inventories, world manager configuration and companion support compositions. The current mortar crew remains a vanilla Soviet composition and rejects a different enemy faction.
|
||||
|
||||
Supply/guard placement and finite stock are described in [site authoring](site-authoring.md).
|
||||
|
||||
## Administration
|
||||
|
||||
Open the normal game chat and enter a command. Core provides:
|
||||
|
||||
| Command | Access | Effect |
|
||||
| --- | --- | --- |
|
||||
| `/esc status` | Server administrator | Current objective or startup failure cause; adds HQ status when Chat is loaded |
|
||||
| `/esc settings` | Server administrator | Current shared settings and values |
|
||||
| `/esc mission radio show` | Server administrator | Radio defence duration in seconds |
|
||||
| `/esc mission radio set N` | Server administrator | Save a whole-number duration from 30 to 1800 seconds |
|
||||
| `/esc mission time show` | Server administrator | Current clock and saved next-round time/speed |
|
||||
| `/esc mission time set HH:MM` | Server administrator | Save next-round start time, 00:00–23:59 |
|
||||
| `/esc mission speed show` | Server administrator | Current clock and saved next-round time/speed |
|
||||
| `/esc mission speed set N` | Server administrator | Save next-round time progression, 1–24× |
|
||||
| `/esc spectate next` | Spectating player | Select the next surviving friendly player |
|
||||
| `/esc spectate previous` | Spectating player | Select the previous surviving friendly player |
|
||||
|
||||
The server derives administrator status from the requesting controller's authenticated player ID. Clients cannot send an administrator flag through the RPC. Requests are limited in length and rate; malformed numbers and out-of-range values leave the previous setting intact. Saved values belong to the server profile, not client profiles. Changing radio duration affects the current defence calculation, so configure it before starting the transmission.
|
||||
|
||||
Clock settings apply once at the next round startup; changing them does not jump the current clock. Older valid settings files load the new defaults (14:00, 1×) without being rewritten. See [mission time](mission-time.md).
|
||||
|
||||
With the companion Chat addon, existing HQ interval/squad/radius and Intel carrying/reveal aliases remain available, as do `hq show` and `hq log`. They extend the same Core command service and authorization path.
|
||||
|
||||
The command parser and setting mutations have native service tests. Actual remote RPC ownership, chat usability and pre-spawn presentation still need multiplayer/UI acceptance.
|
||||
|
||||
## Failed preparation
|
||||
|
||||
If the faction/catalog setup or authored site preparation fails, the mode retains the reason, stops its services and refuses progression or spawning. It does not fall back to a partially prepared mission. A local hint describes the failure and `/esc status` gives administrators the cause. Correct the resource/configuration and restart the scenario. There is no automatic retry that recreates stock or forces after failure.
|
||||
|
||||
Waiting for normal site preparation does not consume a player's spawn retry budget. Once ready, actual failed spawn requests are bounded. This does not remove the one-life or identity requirements.
|
||||
|
||||
Core also provides `/esc mission abandon`: an administrator-only explicit defeat and normal restart for an active round. See [recovery policy](recovery.md).
|
||||
@@ -0,0 +1,35 @@
|
||||
# Current development status
|
||||
|
||||
Evidence checkpoint: 19 September 2026, through archived run `080058`. Later running tests are not included. The primary deliverable is an independently authored replacement for the abandoned Escapists base mission, with the existing companion behavior integrated through its interfaces. The first release targets vanilla Everon and up to twelve players. It must complete prison → scavenging/intel → radio defence → helicopter extraction without the original mod or dependent extensions loaded.
|
||||
|
||||
The successor has its own five addon projects, scenario/resource identities, authored Everon sites and vanilla asset references. The base loop and several failure paths have passed scripted local Workbench checkpoints. This is a development implementation, not a released or fully accepted replacement. [Acceptance](acceptance.json) remains pending for manual gameplay, real multiplayer, performance and release qualification.
|
||||
|
||||
## Established development checkpoints
|
||||
|
||||
| Area | What the recorded evidence establishes | Important limit |
|
||||
| --- | --- | --- |
|
||||
| Independent base loop | Core-only and companion-loaded scripted escape, interrupted radio defence, extraction, defeat and restart have completed. Native task details and personal result widgets have focused lifecycle checks. | Historical runs exercise their recorded sources; they do not qualify later changes or manual play. See [validation](validation.md). |
|
||||
| Prison, equipment and medicine | [Prisoner fixture](evidence/native-2026-09-19-063949/report.json) places one controlled player and eleven physical characters inside the prison, verifies explicit starter inventory and real clue transfers. [Medical fixture](evidence/native-2026-09-19-062406/report.json) demonstrates blood-loss treatment, consumed supplies and native consciousness recovery. | These are not twelve connected clients or ordinary treatment input/animation tests. Five initial pistols are a balance choice to evaluate in play; the count alone is not a demonstrated defect. |
|
||||
| Scavenging and discovery | Finite stock/lost containers remain depleted; two independent clue caches support progression. [Document-loss fixture](evidence/native-2026-09-19-071654/report.json) verifies close physical radio discovery after partial knowledge and loss of all documents. | Manual route visibility, travel, inventory interaction and threat balance remain unqualified. |
|
||||
| Player lifecycle and extraction | Native admission/finalization, local observer cleanup, physical helicopter seat capacity and identity-based results have focused checks. [Recovery fixture](evidence/native-2026-09-19-064406/report.json) preserves incapacitated survivors and verifies explicit authorized abandonment. | [Casualty-loading fixture](evidence/native-2026-09-19-075514/report.json) now loads the real local incapacitated player from the ground into a reserved bench and releases the reservation. Its helper identity is synthetic; remote reconnect and two-client rescue remain unproved. |
|
||||
| Existing physical forces | [Patrol fixture](evidence/native-2026-09-19-070919/report.json) demonstrates real cyclic movement. [Companion fixture](evidence/native-2026-09-19-072838/report.json) verifies HQ Search preemption and physical patrol resumption without creating response forces. [Cancellation fixture](evidence/native-2026-09-19-073601/report.json) verifies stopped incomplete groups do not dispatch late members. | The delivered-order patrol test bypasses radio transit. Broader reports, combat, support and losses need integrated qualification. |
|
||||
| Environment and native errors | [Environment/restart fixture](evidence/native-2026-09-19-065351/report.json) passes two real rounds with zero native errors after restricting vehicle catalogs to required assets. | Earlier vehicle-schema errors are historical, not evidence every current run fails. Intermittent medical-kit teardown attribution remains unresolved; a later [full-loop checkpoint](evidence/native-2026-09-19-073806/report.json) also passes two rounds without native errors. Subsequent initial-placement changes still need their own qualification. |
|
||||
|
||||
## Immediate blockers and next work
|
||||
|
||||
1. **Resolve the remaining ordinary-game errors and establish player admission.** The [scenario-header launch](evidence/game-2026-09-19-080004/report.json) compiles production Game without WORKBENCH/ENF_WB, verifies the Core header and vanilla MissionSystems, and reaches `phase 0 -> 1` without the earlier guard-spawn crash being captured. It remains a failed run: vanilla splash `SCR_WidgetExportRuleRoot` errors persist and the local player's identity cannot be bound, so spawning is withheld. Preserve identity validation while diagnosing the offline launch/admission path. This is partial startup evidence, not clean startup or a playable session. [Runner details](ordinary-game-startup.md).
|
||||
2. **Qualify casualty loading beyond the local success.** [075514](evidence/native-2026-09-19-075514/report.json) passes the complete local service fixture with no native errors: naturally settled helicopter, actual incapacitation, completion-time authorization, external reservations, blocked sight, one owner-handshake load into the selected bench, identity retention and cleanup. Earlier parked-contact and fixture-damage failures remain archived. [Stock removal fixture](evidence/native-2026-09-19-080058/report.json) also verifies the inherited door action clears the bench and leaves a living incapacitated body beside its authored exit. Real action input, remote ownership/RPC timing, competing rescuers, disconnect/death during a pending load and entity-deletion cleanup still need their own tests. [Casualty service](casualty-loading.md), [support investigation](casualty-ground-support.md).
|
||||
3. **Rerun the current integrated base and companions.** Guard cancellation and replicated radio feedback have clean evidence from [two complete Core rounds](evidence/native-2026-09-19-073806/report.json); the later placement/casualty changes now have a focused local pass. A full current-source escape/restart regression must still exercise those changes together with discovery/task presentation, ordinary victory, early aircraft loss, death and abandonment. Keep failed iterations and source/log provenance; do not substitute earlier clean snapshots.
|
||||
|
||||
4. **Play the complete route with ordinary input.** Validate prison gate/equipment access, scavenging and medical interactions, finding the radio without fixture knowledge, defend/recover behavior, ground-vehicle route, manual helicopter boarding/takeoff/navigation and partial escape. Tune the authored layout and finite supplies from actual play. The implemented all-incapacitated policy is preserved vanilla recovery plus explicit administrator abandonment; no automatic recovery is promised.
|
||||
5. **Finish and qualify physical HQ support.** Infantry observation/report/order paths and patrol integration exist. Operational mortar firing, aircraft support, transport/rearming and depot/logistics behavior remain incomplete. Preserve a single HQ coordinator, radio-delivered reports, finite physical forces/ammunition and loss retention; cover interrupted reports, stale contacts and duplicate-order prevention. The [responsibility inventory](original-feature-coverage.md) remains a scope map, not behavioral proof.
|
||||
|
||||
## First-release qualification still required
|
||||
|
||||
Establish a dedicated-server test environment and real clients, then cover concurrent/late joins in each phase, preload cancellation, reconnect and connection-ID reuse, reserved bodies, spent lives, death/unconsciousness/treatment, spectators and streaming cleanup. Verify remote task/map/radio/result updates, settings authorization, seat contention, partial escape, empty-server behavior, defeat and repeated restart with up to twelve connected players. Local fixtures narrow these risks but do not close them.
|
||||
|
||||
Collect real matched original/successor workloads with repeated client-frame and server-tick recordings. No FPS improvement has been demonstrated; the [comparison tool](performance-comparison.md) currently has synthetic regression evidence only.
|
||||
|
||||
Finally complete provenance/dependency review, build and test the package under the successor's own identities, and satisfy the [release checker](release-qualification.md) with current source-bound evidence. No release package has been published. RHS, additional terrains, complete original parity, alternate starts and distant-unit simulation remain later scope.
|
||||
|
||||
Older audits such as [base gameplay gaps](base-gameplay-gaps.md) preserve findings made before subsequent implementations. Read their update notes and linked native evidence before treating an old missing-feature statement as a current defect. This status page consolidates priorities; the evidence ledger remains authoritative for individual recorded checks.
|
||||
@@ -0,0 +1,673 @@
|
||||
{
|
||||
"escapists-ai/Scripts/Game/EscapistsAI/EAI_GroupTactics.c": [
|
||||
"ESCT_CharacterHelper",
|
||||
"ESCT_FactionManager",
|
||||
"ESCT_Misc",
|
||||
"ESCT_WaypointManagerComponent"
|
||||
],
|
||||
"escapists-ai/Scripts/Game/EscapistsAI/EAI_NativeRadioCall.c": [
|
||||
"ESCT_AICallSupportTo",
|
||||
"ESCT_CharacterHelper",
|
||||
"ESCT_ESupportCallState",
|
||||
"ESCT_SupportCallerComponent"
|
||||
],
|
||||
"escapists-ai/Scripts/Game/EscapistsAI/EAI_DisableAmbientEvents.c": [
|
||||
"ESCT_AmbientEventBase",
|
||||
"ESCT_AmbientEventInfo",
|
||||
"ESCT_AmbientEventSystem",
|
||||
"ESCT_ESupportType",
|
||||
"ESCT_MortarBarrageBase",
|
||||
"ESCT_SupportBase",
|
||||
"ESCT_SupportInfo",
|
||||
"ESCT_SupportPicker"
|
||||
],
|
||||
"escapists-ai/Scripts/Game/EscapistsAI/EAI_AssaultParachute.c": [
|
||||
"ESCT_CharacterHelper"
|
||||
],
|
||||
"escapists-ai/Scripts/Game/EscapistsAI/EAI_StartingOutfit.c": [
|
||||
"ESCT_EscapistsGameMode",
|
||||
"SCRTC_BaseGameMode"
|
||||
],
|
||||
"escapists-ai/Scripts/Game/EscapistsAI/EAI_GroupLookup.c": [
|
||||
"ESCT_EGroupLookupExclusionType",
|
||||
"ESCT_EGroupSize",
|
||||
"ESCT_EMilitaryBranchType",
|
||||
"ESCT_EntityCatalogHelper",
|
||||
"ESCT_FactionLookupValue",
|
||||
"ESCT_GroupLookup",
|
||||
"ESCT_GroupLookupData",
|
||||
"ESCT_Logger",
|
||||
"ESCT_Misc"
|
||||
],
|
||||
"escapists-ai/Scripts/Game/EscapistsAI/EAI_FactionRelations.c": [
|
||||
"ESCT_CharacterHelper",
|
||||
"ESCT_Faction",
|
||||
"ESCT_FactionManager"
|
||||
],
|
||||
"escapists-ai/Scripts/Game/EscapistsAI/EAI_RuntimeGuards.c": [
|
||||
"ESCT_EscapistsGameMode",
|
||||
"ESCT_SpawnLogic"
|
||||
],
|
||||
"escapists-ai/Scripts/Game/EscapistsAI/EAI_HQ.c": [
|
||||
"ESCT_CharacterHelper",
|
||||
"ESCT_EGameState",
|
||||
"ESCT_FactionManager",
|
||||
"ESCT_GameStateManagerComponent",
|
||||
"ESCT_Misc",
|
||||
"SCRTC_BaseGameMode"
|
||||
],
|
||||
"escapists-ai/Scripts/Game/EscapistsAI/EAI_HQObservation.c": [
|
||||
"ESCT_CharacterHelper"
|
||||
],
|
||||
"escapists-ai/Scripts/Game/EscapistsAI/EAI_AircraftAmmo.c": [
|
||||
"ESCT_SpawnHelpers"
|
||||
],
|
||||
"escapists-ai/Scripts/Game/EscapistsAI/EAI_HQNetwork.c": [
|
||||
"ESCT_CharacterHelper",
|
||||
"ESCT_FactionManager"
|
||||
],
|
||||
"escapists-ai/Scripts/Game/EscapistsAI/EAI_Performance.c": [
|
||||
"ESCT_Player"
|
||||
],
|
||||
"escapists-ai/Scripts/Game/EscapistsAI/EAI_HQBodySearch.c": [
|
||||
"ESCT_CharacterHelper",
|
||||
"ESCT_EMilitaryBranchType",
|
||||
"ESCT_Faction",
|
||||
"ESCT_FactionManager",
|
||||
"ESCT_Misc",
|
||||
"ESCT_RoadNavigation",
|
||||
"ESCT_WaypointManagerComponent"
|
||||
],
|
||||
"escapists-ai/Scripts/Game/EscapistsAI/EAI_Mines.c": [
|
||||
"ESCT_CharacterHelper",
|
||||
"ESCT_FactionManager"
|
||||
],
|
||||
"escapists-ai/Scripts/Game/EscapistsAI/EAI_DependencyGuards.c": [
|
||||
"ESCT_City",
|
||||
"ESCT_CivilianPresenceComponent",
|
||||
"ESCT_EscapistsConfigComponent",
|
||||
"ESCT_EscapistsGameMode",
|
||||
"ESCT_PlayerDamageManagerComponent",
|
||||
"ESCT_StorageArsenalComponent"
|
||||
],
|
||||
"escapists-ai/Scripts/Game/EscapistsAI/EAI_HQRoadblocks.c": [
|
||||
"ESCT_CharacterHelper",
|
||||
"ESCT_EMilitaryBranchType",
|
||||
"ESCT_Faction",
|
||||
"ESCT_FactionManager",
|
||||
"ESCT_GroupHelper",
|
||||
"ESCT_Misc",
|
||||
"ESCT_RoadNavigation",
|
||||
"ESCT_SpawnHelpers",
|
||||
"ESCT_WaypointManagerComponent"
|
||||
],
|
||||
"escapists-ai/Scripts/Game/EscapistsAI/EAI_MineTask.c": [
|
||||
"ESCT_CharacterHelper",
|
||||
"ESCT_WaypointManagerComponent"
|
||||
],
|
||||
"escapists-ai/Scripts/Game/EscapistsAI/EAI_SettlementSafety.c": [
|
||||
"ESCT_ELocationType",
|
||||
"ESCT_Location",
|
||||
"ESCT_LocationSystem"
|
||||
],
|
||||
"escapists-ai/Scripts/Game/EscapistsAI/EAI_AIResponseSystem.c": [
|
||||
"ESCT_CharacterHelper",
|
||||
"ESCT_CharacterLookupData",
|
||||
"ESCT_EMilitaryBranchType",
|
||||
"ESCT_EntityCatalogHelper",
|
||||
"ESCT_Faction",
|
||||
"ESCT_FactionManager",
|
||||
"ESCT_GroupHelper",
|
||||
"ESCT_Misc",
|
||||
"ESCT_RoadNavigation",
|
||||
"ESCT_SpawnHelpers",
|
||||
"ESCT_WaypointManagerComponent"
|
||||
],
|
||||
"escapists-ai/Scripts/Game/EscapistsAI/EAI_StingerEquipment.c": [
|
||||
"ESCT_CharacterHelper",
|
||||
"ESCT_EscapistsGameMode",
|
||||
"ESCT_FactionManager"
|
||||
],
|
||||
"escapists-ai/Scripts/Game/EscapistsAI/EAI_AirAssault.c": [
|
||||
"ESCT_CharacterHelper",
|
||||
"ESCT_EGameState",
|
||||
"ESCT_EMilitaryBranchType",
|
||||
"ESCT_Faction",
|
||||
"ESCT_GameStateManagerComponent",
|
||||
"ESCT_Misc",
|
||||
"ESCT_SpawnHelpers",
|
||||
"ESCT_WaypointManagerComponent"
|
||||
],
|
||||
"escapists-ai/Scripts/Game/EscapistsAI/EAI_HQStatus.c": [
|
||||
"ESCT_CharacterHelper"
|
||||
],
|
||||
"escapists-ai/Scripts/Game/EscapistsAI/EAI_SniperOptics.c": [
|
||||
"ESCT_CharacterHelper",
|
||||
"ESCT_EscapistsGameMode"
|
||||
],
|
||||
"escapists-ai/Scripts/Game/EscapistsAI/EAI_StartSelection.c": [
|
||||
"ESCT_EStartType",
|
||||
"ESCT_EscapistsConfigComponent",
|
||||
"ESCT_FactionManager",
|
||||
"ESCT_HelicrashLocationHolder",
|
||||
"ESCT_PrisonComponent",
|
||||
"ESCT_SetupConfig"
|
||||
],
|
||||
"escapists-ai/Scripts/Game/EscapistsAI/EAI_AIConfig.c": [
|
||||
"SCRTC_BaseGameMode"
|
||||
],
|
||||
"escapists-ai/Scripts/Game/EscapistsAI/EAI_ImprovisedPrisons.c": [
|
||||
"ESCT_CharacterSpawnPoint",
|
||||
"ESCT_Constants",
|
||||
"ESCT_EStartType",
|
||||
"ESCT_EntityHelper",
|
||||
"ESCT_EntitySearch",
|
||||
"ESCT_EscapistsConfigComponent",
|
||||
"ESCT_EscapistsGameMode",
|
||||
"ESCT_LocationSystem",
|
||||
"ESCT_Misc",
|
||||
"ESCT_PrisonComponent",
|
||||
"ESCT_PrisonDoorComponent",
|
||||
"ESCT_SpawnHelpers",
|
||||
"ESCT_SpawnPoint",
|
||||
"ESCT_SpawnPositionComponent",
|
||||
"ESCT_StartAreaComponent",
|
||||
"SCRTC_BaseGameMode"
|
||||
],
|
||||
"escapists-ai/Scripts/Game/EscapistsAI/EAI_MortarFiring.c": [
|
||||
"ESCT_CharacterHelper"
|
||||
],
|
||||
"escapists-ai/Scripts/Game/EscapistsAI/EAI_MortarSystem.c": [
|
||||
"ESCT_CharacterHelper",
|
||||
"ESCT_Faction",
|
||||
"ESCT_FactionManager",
|
||||
"ESCT_Misc",
|
||||
"ESCT_SpawnHelpers",
|
||||
"SCRTC_BaseGameMode"
|
||||
],
|
||||
"escapists-ai/Scripts/Game/EscapistsAI/EAI_AmmoSupply.c": [
|
||||
"ESCT_CharacterHelper"
|
||||
],
|
||||
"escapists-ai/Scripts/Game/EscapistsAI/EAI_DepotLoading.c": [
|
||||
"ESCT_CharacterHelper",
|
||||
"ESCT_EMilitaryBranchType",
|
||||
"ESCT_Faction",
|
||||
"ESCT_FactionManager",
|
||||
"ESCT_Misc",
|
||||
"ESCT_SpawnHelpers",
|
||||
"ESCT_WaypointManagerComponent"
|
||||
],
|
||||
"escapists-ai/Scripts/Game/EscapistsAI/EAI_AirRecon.c": [
|
||||
"ESCT_CharacterHelper",
|
||||
"ESCT_EGameState",
|
||||
"ESCT_EMilitaryBranchType",
|
||||
"ESCT_EUnitRole",
|
||||
"ESCT_Faction",
|
||||
"ESCT_FactionManager",
|
||||
"ESCT_GameStateManagerComponent",
|
||||
"ESCT_GroupHelper",
|
||||
"ESCT_HeliBehaviourBaseComponent",
|
||||
"ESCT_HeliBehaviourBaseComponentClass",
|
||||
"ESCT_Misc",
|
||||
"ESCT_Player",
|
||||
"ESCT_SpawnHelpers",
|
||||
"ESCT_WaypointManagerComponent"
|
||||
],
|
||||
"escapists-ai/Scripts/Game/EscapistsAI/EAI_HelicopterRecovery.c": [
|
||||
"ESCT_CharacterHelper",
|
||||
"ESCT_EMilitaryBranchType",
|
||||
"ESCT_EUnitRole",
|
||||
"ESCT_Faction",
|
||||
"ESCT_FactionManager",
|
||||
"ESCT_GroupHelper",
|
||||
"ESCT_HeliBehaviourBaseComponent",
|
||||
"ESCT_Misc",
|
||||
"ESCT_SpawnHelpers",
|
||||
"ESCT_WaypointManagerComponent",
|
||||
"SCRTC_BaseGameMode"
|
||||
],
|
||||
"escapists-ai/Scripts/Game/EscapistsAI/EAI_LogisticsVehicle.c": [
|
||||
"ESCT_CharacterHelper",
|
||||
"ESCT_EMilitaryBranchType",
|
||||
"ESCT_EUnitRole",
|
||||
"ESCT_Faction",
|
||||
"ESCT_FactionManager",
|
||||
"ESCT_GroupHelper",
|
||||
"ESCT_HeliBehaviourBaseComponent",
|
||||
"ESCT_HeliBehaviourBaseComponentClass"
|
||||
],
|
||||
"escapists-ai/Scripts/Game/EscapistsAI/EAI_Resupply.c": [
|
||||
"ESCT_FactionManager",
|
||||
"ESCT_Misc",
|
||||
"ESCT_SpawnHelpers",
|
||||
"ESCT_WaypointManagerComponent",
|
||||
"SCRTC_BaseGameMode"
|
||||
],
|
||||
"escapists-ai/Scripts/Game/EscapistsAI/EAI_SupplyConvoys.c": [
|
||||
"ESCT_CharacterHelper",
|
||||
"ESCT_CharacterInitComponent",
|
||||
"ESCT_EGameState",
|
||||
"ESCT_ELocationType",
|
||||
"ESCT_EMilitaryBranchType",
|
||||
"ESCT_EscapistsGameMode",
|
||||
"ESCT_Faction",
|
||||
"ESCT_FactionManager",
|
||||
"ESCT_GameStateManagerComponent",
|
||||
"ESCT_GroupHelper",
|
||||
"ESCT_Location",
|
||||
"ESCT_LocationSystem",
|
||||
"ESCT_Misc",
|
||||
"ESCT_SpawnHelpers",
|
||||
"ESCT_WaypointManagerComponent",
|
||||
"SCRTC_BaseGameMode"
|
||||
],
|
||||
"escapists-ai/Scripts/Game/EscapistsAI/Simulation/EAI_Simulation.c": [
|
||||
"ESCT_CharacterHelper",
|
||||
"ESCT_EEscapistsRadioMessage",
|
||||
"ESCT_EGameState",
|
||||
"ESCT_ELocationSpawnReason",
|
||||
"ESCT_ELocationType",
|
||||
"ESCT_ESpawnState",
|
||||
"ESCT_EntityHelper",
|
||||
"ESCT_EscapeHelicopterComponent",
|
||||
"ESCT_EscapistsConfigComponent",
|
||||
"ESCT_EscapistsNetworkComponent",
|
||||
"ESCT_Faction",
|
||||
"ESCT_FactionManager",
|
||||
"ESCT_GameStateManagerComponent",
|
||||
"ESCT_Location",
|
||||
"ESCT_LocationMapUIComponent",
|
||||
"ESCT_LocationSystem",
|
||||
"ESCT_LockedDoorComponent",
|
||||
"ESCT_LockpickTask",
|
||||
"ESCT_PlayerCharacter",
|
||||
"ESCT_PlayerFactionInfo",
|
||||
"ESCT_PrisonComponent",
|
||||
"ESCT_PrisonDoorComponent",
|
||||
"ESCT_Radio",
|
||||
"ESCT_RadioState",
|
||||
"ESCT_RadioStation",
|
||||
"ESCT_SpawnPositionComponent",
|
||||
"ESCT_TaskFuncs",
|
||||
"ESCT_WinLoseHandlerComponent",
|
||||
"SCRTC_BaseGameMode"
|
||||
],
|
||||
"escapists-ai/Scripts/Game/EscapistsAI/Simulation/EAI_SimulationLifecycle.c": [
|
||||
"ESCT_ELocationSpawnReason",
|
||||
"ESCT_EStartType",
|
||||
"ESCT_EscapistsConfigComponent",
|
||||
"ESCT_EscapistsGameMode",
|
||||
"ESCT_FactionManager",
|
||||
"ESCT_SetupConfig",
|
||||
"SCRTC_BaseGameMode"
|
||||
],
|
||||
"escapists-ai/Scripts/Game/EscapistsAI/Simulation/EAI_SimulationBot.c": [
|
||||
"ESCT_CharacterHelper",
|
||||
"ESCT_WaypointManagerComponent"
|
||||
],
|
||||
"escapists-ai/Scripts/Game/EscapistsAI/Simulation/EAI_SimulationSpectators.c": [
|
||||
"ESCT_AssignTargetManualCameraComponent",
|
||||
"ESCT_EscapistsGameMode",
|
||||
"ESCT_EscapistsNetworkComponent",
|
||||
"ESCT_LookAtTargetManualCameraComponent",
|
||||
"ESCT_SpectatorComponent",
|
||||
"ESCT_SpectatorMenuLayoutEditorComponent",
|
||||
"SCRTC_BaseGameMode"
|
||||
],
|
||||
"escapists-ai-norhs/Scripts/Game/EscapistsAI/EAI_AircraftAmmo.c": [
|
||||
"ESCT_SpawnHelpers"
|
||||
],
|
||||
"escapists-ai-norhs/Scripts/Game/EscapistsAI/EAI_AssaultParachute.c": [
|
||||
"ESCT_CharacterHelper"
|
||||
],
|
||||
"escapists-ai-norhs/Scripts/Game/EscapistsAI/EAI_DependencyGuards.c": [
|
||||
"ESCT_City",
|
||||
"ESCT_CivilianPresenceComponent",
|
||||
"ESCT_EscapistsConfigComponent",
|
||||
"ESCT_EscapistsGameMode",
|
||||
"ESCT_PlayerDamageManagerComponent",
|
||||
"ESCT_StorageArsenalComponent"
|
||||
],
|
||||
"escapists-ai-norhs/Scripts/Game/EscapistsAI/EAI_DisableAmbientEvents.c": [
|
||||
"ESCT_AmbientEventBase",
|
||||
"ESCT_AmbientEventInfo",
|
||||
"ESCT_AmbientEventSystem",
|
||||
"ESCT_ESupportType",
|
||||
"ESCT_MortarBarrageBase",
|
||||
"ESCT_SupportBase",
|
||||
"ESCT_SupportInfo",
|
||||
"ESCT_SupportPicker"
|
||||
],
|
||||
"escapists-ai-norhs/Scripts/Game/EscapistsAI/EAI_FactionRelations.c": [
|
||||
"ESCT_CharacterHelper",
|
||||
"ESCT_Faction",
|
||||
"ESCT_FactionManager"
|
||||
],
|
||||
"escapists-ai-norhs/Scripts/Game/EscapistsAI/EAI_GroupLookup.c": [
|
||||
"ESCT_EGroupLookupExclusionType",
|
||||
"ESCT_EGroupSize",
|
||||
"ESCT_EMilitaryBranchType",
|
||||
"ESCT_EntityCatalogHelper",
|
||||
"ESCT_FactionLookupValue",
|
||||
"ESCT_GroupLookup",
|
||||
"ESCT_GroupLookupData",
|
||||
"ESCT_Logger",
|
||||
"ESCT_Misc"
|
||||
],
|
||||
"escapists-ai-norhs/Scripts/Game/EscapistsAI/EAI_GroupTactics.c": [
|
||||
"ESCT_CharacterHelper",
|
||||
"ESCT_FactionManager",
|
||||
"ESCT_Misc",
|
||||
"ESCT_WaypointManagerComponent"
|
||||
],
|
||||
"escapists-ai-norhs/Scripts/Game/EscapistsAI/EAI_HQ.c": [
|
||||
"ESCT_CharacterHelper",
|
||||
"ESCT_EGameState",
|
||||
"ESCT_FactionManager",
|
||||
"ESCT_GameStateManagerComponent",
|
||||
"ESCT_Misc",
|
||||
"SCRTC_BaseGameMode"
|
||||
],
|
||||
"escapists-ai-norhs/Scripts/Game/EscapistsAI/EAI_HQBodySearch.c": [
|
||||
"ESCT_CharacterHelper",
|
||||
"ESCT_EMilitaryBranchType",
|
||||
"ESCT_Faction",
|
||||
"ESCT_FactionManager",
|
||||
"ESCT_Misc",
|
||||
"ESCT_RoadNavigation",
|
||||
"ESCT_WaypointManagerComponent"
|
||||
],
|
||||
"escapists-ai-norhs/Scripts/Game/EscapistsAI/EAI_HQNetwork.c": [
|
||||
"ESCT_CharacterHelper",
|
||||
"ESCT_FactionManager"
|
||||
],
|
||||
"escapists-ai-norhs/Scripts/Game/EscapistsAI/EAI_HQObservation.c": [
|
||||
"ESCT_CharacterHelper"
|
||||
],
|
||||
"escapists-ai-norhs/Scripts/Game/EscapistsAI/EAI_HQRoadblocks.c": [
|
||||
"ESCT_CharacterHelper",
|
||||
"ESCT_EMilitaryBranchType",
|
||||
"ESCT_Faction",
|
||||
"ESCT_FactionManager",
|
||||
"ESCT_GroupHelper",
|
||||
"ESCT_Misc",
|
||||
"ESCT_RoadNavigation",
|
||||
"ESCT_SpawnHelpers",
|
||||
"ESCT_WaypointManagerComponent"
|
||||
],
|
||||
"escapists-ai-norhs/Scripts/Game/EscapistsAI/EAI_MineTask.c": [
|
||||
"ESCT_CharacterHelper",
|
||||
"ESCT_WaypointManagerComponent"
|
||||
],
|
||||
"escapists-ai-norhs/Scripts/Game/EscapistsAI/EAI_Mines.c": [
|
||||
"ESCT_CharacterHelper",
|
||||
"ESCT_FactionManager"
|
||||
],
|
||||
"escapists-ai-norhs/Scripts/Game/EscapistsAI/EAI_NativeRadioCall.c": [
|
||||
"ESCT_AICallSupportTo",
|
||||
"ESCT_CharacterHelper",
|
||||
"ESCT_ESupportCallState",
|
||||
"ESCT_SupportCallerComponent"
|
||||
],
|
||||
"escapists-ai-norhs/Scripts/Game/EscapistsAI/EAI_Performance.c": [
|
||||
"ESCT_Player"
|
||||
],
|
||||
"escapists-ai-norhs/Scripts/Game/EscapistsAI/EAI_RuntimeGuards.c": [
|
||||
"ESCT_EscapistsGameMode",
|
||||
"ESCT_SpawnLogic"
|
||||
],
|
||||
"escapists-ai-norhs/Scripts/Game/EscapistsAI/EAI_SettlementSafety.c": [
|
||||
"ESCT_ELocationType",
|
||||
"ESCT_Location",
|
||||
"ESCT_LocationSystem"
|
||||
],
|
||||
"escapists-ai-norhs/Scripts/Game/EscapistsAI/EAI_StartingOutfit.c": [
|
||||
"ESCT_EscapistsGameMode",
|
||||
"SCRTC_BaseGameMode"
|
||||
],
|
||||
"escapists-ai-norhs/Scripts/Game/EscapistsAI/EAI_AIResponseSystem.c": [
|
||||
"ESCT_CharacterHelper",
|
||||
"ESCT_CharacterLookupData",
|
||||
"ESCT_EMilitaryBranchType",
|
||||
"ESCT_EntityCatalogHelper",
|
||||
"ESCT_Faction",
|
||||
"ESCT_FactionManager",
|
||||
"ESCT_GroupHelper",
|
||||
"ESCT_Misc",
|
||||
"ESCT_RoadNavigation",
|
||||
"ESCT_SpawnHelpers",
|
||||
"ESCT_WaypointManagerComponent"
|
||||
],
|
||||
"escapists-ai-norhs/Scripts/Game/EscapistsAI/EAI_StingerEquipment.c": [
|
||||
"ESCT_CharacterHelper",
|
||||
"ESCT_EscapistsGameMode",
|
||||
"ESCT_FactionManager"
|
||||
],
|
||||
"escapists-ai-norhs/Scripts/Game/EscapistsAI/EAI_AirAssault.c": [
|
||||
"ESCT_CharacterHelper",
|
||||
"ESCT_EGameState",
|
||||
"ESCT_EMilitaryBranchType",
|
||||
"ESCT_Faction",
|
||||
"ESCT_GameStateManagerComponent",
|
||||
"ESCT_Misc",
|
||||
"ESCT_SpawnHelpers",
|
||||
"ESCT_WaypointManagerComponent"
|
||||
],
|
||||
"escapists-ai-norhs/Scripts/Game/EscapistsAI/EAI_HQStatus.c": [
|
||||
"ESCT_CharacterHelper"
|
||||
],
|
||||
"escapists-ai-norhs/Scripts/Game/EscapistsAI/EAI_SniperOptics.c": [
|
||||
"ESCT_CharacterHelper",
|
||||
"ESCT_EscapistsGameMode"
|
||||
],
|
||||
"escapists-ai-norhs/Scripts/Game/EscapistsAI/EAI_StartSelection.c": [
|
||||
"ESCT_EStartType",
|
||||
"ESCT_EscapistsConfigComponent",
|
||||
"ESCT_FactionManager",
|
||||
"ESCT_HelicrashLocationHolder",
|
||||
"ESCT_PrisonComponent",
|
||||
"ESCT_SetupConfig"
|
||||
],
|
||||
"escapists-ai-norhs/Scripts/Game/EscapistsAI/EAI_AIConfig.c": [
|
||||
"SCRTC_BaseGameMode"
|
||||
],
|
||||
"escapists-ai-norhs/Scripts/Game/EscapistsAI/EAI_ImprovisedPrisons.c": [
|
||||
"ESCT_CharacterSpawnPoint",
|
||||
"ESCT_Constants",
|
||||
"ESCT_EStartType",
|
||||
"ESCT_EntityHelper",
|
||||
"ESCT_EntitySearch",
|
||||
"ESCT_EscapistsConfigComponent",
|
||||
"ESCT_EscapistsGameMode",
|
||||
"ESCT_LocationSystem",
|
||||
"ESCT_Misc",
|
||||
"ESCT_PrisonComponent",
|
||||
"ESCT_PrisonDoorComponent",
|
||||
"ESCT_SpawnHelpers",
|
||||
"ESCT_SpawnPoint",
|
||||
"ESCT_SpawnPositionComponent",
|
||||
"ESCT_StartAreaComponent",
|
||||
"SCRTC_BaseGameMode"
|
||||
],
|
||||
"escapists-ai-norhs/Scripts/Game/EscapistsAI/EAI_MortarFiring.c": [
|
||||
"ESCT_CharacterHelper"
|
||||
],
|
||||
"escapists-ai-norhs/Scripts/Game/EscapistsAI/EAI_MortarSystem.c": [
|
||||
"ESCT_CharacterHelper",
|
||||
"ESCT_Faction",
|
||||
"ESCT_FactionManager",
|
||||
"ESCT_Misc",
|
||||
"ESCT_SpawnHelpers",
|
||||
"SCRTC_BaseGameMode"
|
||||
],
|
||||
"escapists-ai-norhs/Scripts/Game/EscapistsAI/EAI_AmmoSupply.c": [
|
||||
"ESCT_CharacterHelper"
|
||||
],
|
||||
"escapists-ai-norhs/Scripts/Game/EscapistsAI/EAI_DepotLoading.c": [
|
||||
"ESCT_CharacterHelper",
|
||||
"ESCT_EMilitaryBranchType",
|
||||
"ESCT_Faction",
|
||||
"ESCT_FactionManager",
|
||||
"ESCT_Misc",
|
||||
"ESCT_SpawnHelpers",
|
||||
"ESCT_WaypointManagerComponent"
|
||||
],
|
||||
"escapists-ai-norhs/Scripts/Game/EscapistsAI/EAI_AirRecon.c": [
|
||||
"ESCT_CharacterHelper",
|
||||
"ESCT_EGameState",
|
||||
"ESCT_EMilitaryBranchType",
|
||||
"ESCT_EUnitRole",
|
||||
"ESCT_Faction",
|
||||
"ESCT_FactionManager",
|
||||
"ESCT_GameStateManagerComponent",
|
||||
"ESCT_GroupHelper",
|
||||
"ESCT_HeliBehaviourBaseComponent",
|
||||
"ESCT_HeliBehaviourBaseComponentClass",
|
||||
"ESCT_Misc",
|
||||
"ESCT_Player",
|
||||
"ESCT_SpawnHelpers",
|
||||
"ESCT_WaypointManagerComponent"
|
||||
],
|
||||
"escapists-ai-norhs/Scripts/Game/EscapistsAI/EAI_HelicopterRecovery.c": [
|
||||
"ESCT_CharacterHelper",
|
||||
"ESCT_EMilitaryBranchType",
|
||||
"ESCT_EUnitRole",
|
||||
"ESCT_Faction",
|
||||
"ESCT_FactionManager",
|
||||
"ESCT_GroupHelper",
|
||||
"ESCT_HeliBehaviourBaseComponent",
|
||||
"ESCT_Misc",
|
||||
"ESCT_SpawnHelpers",
|
||||
"ESCT_WaypointManagerComponent",
|
||||
"SCRTC_BaseGameMode"
|
||||
],
|
||||
"escapists-ai-norhs/Scripts/Game/EscapistsAI/EAI_LogisticsVehicle.c": [
|
||||
"ESCT_CharacterHelper",
|
||||
"ESCT_EMilitaryBranchType",
|
||||
"ESCT_EUnitRole",
|
||||
"ESCT_Faction",
|
||||
"ESCT_FactionManager",
|
||||
"ESCT_GroupHelper",
|
||||
"ESCT_HeliBehaviourBaseComponent",
|
||||
"ESCT_HeliBehaviourBaseComponentClass"
|
||||
],
|
||||
"escapists-ai-norhs/Scripts/Game/EscapistsAI/EAI_Resupply.c": [
|
||||
"ESCT_FactionManager",
|
||||
"ESCT_Misc",
|
||||
"ESCT_SpawnHelpers",
|
||||
"ESCT_WaypointManagerComponent",
|
||||
"SCRTC_BaseGameMode"
|
||||
],
|
||||
"escapists-ai-norhs/Scripts/Game/EscapistsAI/EAI_SupplyConvoys.c": [
|
||||
"ESCT_CharacterHelper",
|
||||
"ESCT_CharacterInitComponent",
|
||||
"ESCT_EGameState",
|
||||
"ESCT_ELocationType",
|
||||
"ESCT_EMilitaryBranchType",
|
||||
"ESCT_EscapistsGameMode",
|
||||
"ESCT_Faction",
|
||||
"ESCT_FactionManager",
|
||||
"ESCT_GameStateManagerComponent",
|
||||
"ESCT_GroupHelper",
|
||||
"ESCT_Location",
|
||||
"ESCT_LocationSystem",
|
||||
"ESCT_Misc",
|
||||
"ESCT_SpawnHelpers",
|
||||
"ESCT_WaypointManagerComponent",
|
||||
"SCRTC_BaseGameMode"
|
||||
],
|
||||
"escapists-ai-norhs/Scripts/Game/EscapistsAI/Simulation/EAI_Simulation.c": [
|
||||
"ESCT_CharacterHelper",
|
||||
"ESCT_EEscapistsRadioMessage",
|
||||
"ESCT_EGameState",
|
||||
"ESCT_ELocationSpawnReason",
|
||||
"ESCT_ELocationType",
|
||||
"ESCT_ESpawnState",
|
||||
"ESCT_EntityHelper",
|
||||
"ESCT_EscapeHelicopterComponent",
|
||||
"ESCT_EscapistsConfigComponent",
|
||||
"ESCT_EscapistsNetworkComponent",
|
||||
"ESCT_Faction",
|
||||
"ESCT_FactionManager",
|
||||
"ESCT_GameStateManagerComponent",
|
||||
"ESCT_Location",
|
||||
"ESCT_LocationMapUIComponent",
|
||||
"ESCT_LocationSystem",
|
||||
"ESCT_LockedDoorComponent",
|
||||
"ESCT_LockpickTask",
|
||||
"ESCT_PlayerCharacter",
|
||||
"ESCT_PlayerFactionInfo",
|
||||
"ESCT_PrisonComponent",
|
||||
"ESCT_PrisonDoorComponent",
|
||||
"ESCT_Radio",
|
||||
"ESCT_RadioState",
|
||||
"ESCT_RadioStation",
|
||||
"ESCT_SpawnPositionComponent",
|
||||
"ESCT_TaskFuncs",
|
||||
"ESCT_WinLoseHandlerComponent",
|
||||
"SCRTC_BaseGameMode"
|
||||
],
|
||||
"escapists-ai-norhs/Scripts/Game/EscapistsAI/Simulation/EAI_SimulationBot.c": [
|
||||
"ESCT_CharacterHelper",
|
||||
"ESCT_WaypointManagerComponent"
|
||||
],
|
||||
"escapists-ai-norhs/Scripts/Game/EscapistsAI/Simulation/EAI_SimulationSpectators.c": [
|
||||
"ESCT_AssignTargetManualCameraComponent",
|
||||
"ESCT_EscapistsGameMode",
|
||||
"ESCT_EscapistsNetworkComponent",
|
||||
"ESCT_LookAtTargetManualCameraComponent",
|
||||
"ESCT_SpectatorComponent",
|
||||
"ESCT_SpectatorMenuLayoutEditorComponent",
|
||||
"SCRTC_BaseGameMode"
|
||||
],
|
||||
"escapists-ai-norhs/Scripts/Game/EscapistsAI/Simulation/EAI_SimulationLifecycle.c": [
|
||||
"ESCT_ELocationSpawnReason",
|
||||
"ESCT_EStartType",
|
||||
"ESCT_EscapistsConfigComponent",
|
||||
"ESCT_EscapistsGameMode",
|
||||
"ESCT_FactionManager",
|
||||
"ESCT_SetupConfig",
|
||||
"SCRTC_BaseGameMode"
|
||||
],
|
||||
"escapists-intel/Scripts/Game/EscapistsIntel/EI_IntelLifecycle.c": [
|
||||
"ESCT_EscapistsGameMode",
|
||||
"SCRTC_BaseGameMode"
|
||||
],
|
||||
"escapists-intel/Scripts/Game/EscapistsIntel/EI_IntelService.c": [
|
||||
"ESCT_ELocationType",
|
||||
"ESCT_KnownLocationsSystem",
|
||||
"ESCT_Location",
|
||||
"ESCT_LocationMapUIComponent",
|
||||
"SCRTC_BaseGameMode"
|
||||
],
|
||||
"escapists-intel/Scripts/Game/EscapistsIntel/EI_MapDiscoveryUI.c": [
|
||||
"ESCT_ELocationType",
|
||||
"ESCT_EscapistsMapUIBase",
|
||||
"ESCT_KnownLocationsSystem",
|
||||
"ESCT_Location",
|
||||
"ESCT_LocationMapUIComponent",
|
||||
"ESCT_MapEscapistsUI"
|
||||
],
|
||||
"escapists-intel/Scripts/Game/EscapistsIntel/EI_PlayerBriefing.c": [
|
||||
"ESCT_EscapistsGameMode"
|
||||
],
|
||||
"escapists-chat/Scripts/Game/EscapistsChat/ECHAT_HeliSnapshot.c": [
|
||||
"SCRTC_BaseGameMode"
|
||||
],
|
||||
"escapists-chat/Scripts/Game/EscapistsChat/ECHAT_SimulationCommands.c": [
|
||||
"ESCT_EscapistsGameMode",
|
||||
"SCRTC_BaseGameMode"
|
||||
],
|
||||
"escapists-chat/Scripts/Game/EscapistsChat/ECHAT_AdminCommands.c": [
|
||||
"ESCT_EscapistsGameMode",
|
||||
"SCRTC_BaseGameMode"
|
||||
],
|
||||
"escapists-chat/Scripts/Game/EscapistsChat/ECHAT_HeliTest.c": [
|
||||
"ESCT_CharacterHelper",
|
||||
"ESCT_EGameState",
|
||||
"ESCT_GameStateManagerComponent",
|
||||
"ESCT_Misc",
|
||||
"ESCT_SpawnHelpers",
|
||||
"SCRTC_BaseGameMode"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
# Native next-round environment fixture
|
||||
|
||||
`--project core --smoke environment-restart --rounds 2` is a bounded, opt-in check of two actual `ERR_GameMode` initializations. Use the existing private Workbench profile and headless runner. This is a native script fixture, not manual or multiplayer acceptance.
|
||||
|
||||
Production adds only `protected string SettingsPath()` with the unchanged `ERR_Settings.PATH` default; the constructor uses that path. A WORKBENCH-only override selects `$profile:erri-environment-restart.json` only when both `errBaseSmoke=1` and `errSmokeOutcome=environment-restart` are present. All other runs retain the production path. The probe records the authored environment before normal service startup; it never substitutes a sample environment service or edits normal `rereintroduced.json`.
|
||||
|
||||
The runner refuses any existing fixture settings, `.bak`, `.tmp`, or `erri-environment-restart-round.json` marker, including broken symlinks. It requires exactly two Core rounds. Round one checks authored defaults and original 14:00 / 1x clock defaults, saves 2000-02-29 and overcast through the real mode settings owner and production environment command helper, reloads the private file to verify persistence, and waits 2.5 seconds. The active environment must remain authored while the native clock advances at its original rate. Only after these assertions does it write a round-one completion marker and request the ordinary test defeat/reset.
|
||||
|
||||
The next real mode initialization opens the same file through the production settings constructor. Its ordinary environment service must record the saved date/profile and apply the exact leap date plus native `Overcast` family. Another 2.5 seconds proves continuing clock progression. Successful round two deletes only the fixture settings/backup/temp/marker and verifies their absence. Failures leave fixture evidence untouched for diagnosis; preserve or move that evidence before rerunning. The persistent marker is for this explicit runner workflow; it does not authenticate arbitrary files supplied outside it. No general settings-path CLI has been introduced.
|
||||
|
||||
The assertion compares authored weather across a short first-round interval; an authored weather transition coinciding with that interval could require investigation rather than indicating a settings mutation. Second-round weather uses the production forced family and loops normally. Clock rate checks do not benchmark simulation performance or prove remote replication.
|
||||
|
||||
## Integration
|
||||
|
||||
Copy the new `ERR_NativeEnvironmentRestartProbe.c`, this document, and `tests/test_environment_restart_runner.py`. Apply `environment-restart-integration.patch` to `ERR_GameMode.c`, `ERR_NativeBaseSmoke.c`, `tools/headless_workbench.py`, and `tools/check.py`. The patch is based on current central sources containing `casualty-bench` and `environment`; other outcomes remain unchanged.
|
||||
|
||||
The smoke uses steps 1200/1202. Its probe is created before settings loading by the WORKBENCH path override, then polled by the ordinary Core smoke loop after the real prisoner exists. Both rounds use existing explicit defeat/reset behavior. `OnStop` stops the probe without deleting failure evidence. No normal player health or lifecycle is changed by this fixture.
|
||||
|
||||
Run `python3 tools/check.py` for repository policy checks and runner refusal tests. Native compile, two-round execution, and archive provenance are still required before claiming this fixture passed.
|
||||
|
||||
Native evidence `native-2026-09-19-065351` passes both real rounds, 107 combined assertions, with zero engine or script errors. The private fixture files were removed by successful round two. This proves the described local persistence path and retains the limits above.
|
||||
@@ -0,0 +1,28 @@
|
||||
# Round date and weather
|
||||
|
||||
Core's `ERR_EnvironmentService` applies optional date and weather selections once during server-side round preparation, immediately before the existing clock service. The native time/weather manager owns simulation and replication. There is no environment tick, local preview, player-health modification or periodic reset. Repeated starts retain the initial selection; a stopped service cannot restart.
|
||||
|
||||
Defaults preserve the authored world. Old valid settings files without `startDateCode` and `weatherProfile` acquire zero values in memory, are not rewritten during loading, and retain every existing supported value. An explicit successful save writes the expanded schema using the existing validated temporary-file/backup flow. Present invalid environment values reject the file rather than silently defaulting.
|
||||
|
||||
Administrators use:
|
||||
|
||||
- `/esc mission date show` and `/esc mission date set YYYY-MM-DD` (1900–2050 inclusive), or `set authored`.
|
||||
- `/esc mission weather show` and `/esc mission weather set authored|clear|overcast|rain` (`rainy` is accepted as an alias).
|
||||
|
||||
These commands save next-round choices. They report the current native environment separately and do not apply saved changes to the running world. Date validation covers month lengths and Gregorian leap years, including non-leap 1900 and leap 2000. The native manager also validates an explicit date before applying it.
|
||||
|
||||
`weatherProfile` values are 0 authored, 1 Clear, 2 Overcast and 3 Rainy. An explicit profile uses the native replicated `ForceWeatherTo` route and loops that weather family. The service validates that the named vanilla state and transition manager exist before changing the date or issuing a request. It verifies the requested current/next state and looping flag. On rejection it attempts to restore the previous date and weather family/looping before startup reports failure. This is not a snapshot of every native transition queue or variant parameter. No UI preview API is used.
|
||||
|
||||
A fixed profile selects a family deterministically; cloud variants, wind and other native weather behavior still follow vanilla rules. Existing authored wind/fog overrides are retained. The `authored` setting makes no weather request and preserves the scenario's original weather evolution. Visual intensity, remote replication, manual visibility and long-running transitions still require runtime acceptance.
|
||||
|
||||
`startDateCode` is an internal compact integer: `(year - 1900) * 10000 + month * 100 + day`, with 0 meaning authored. For example, 1989-06-01 is 890601. It intentionally stays below 1,501,232, exactly representable by the existing settings reader's floating-point JSON path. A full `YYYYMMDD` number can exceed single-precision exact integer range and corrupt odd dates. Use the natural date command rather than constructing codes by hand.
|
||||
|
||||
## Validation
|
||||
|
||||
`tests/test_environment_policy.py` executes the actual settings validator and production parsing/formatting functions through the existing C++ policy harness. It compares calendar boundary cases across every supported year against Python's independent `datetime` calendar, tests malformed dates and names, and checks defaults and native family names. Existing migration tests cover the added defaults and bounds. These checks pass; they are not Enforce compilation.
|
||||
|
||||
The opt-in WORKBENCH `ERR_NativeEnvironmentProbe` uses a dedicated test settings file, preserving the actual mission settings. It tests legacy loading without rewrite, exact odd date-code serialization, save rejection, unauthorized commands, next-round command behavior and no world mutation from saves. It then temporarily uses fresh service instances to select Clear, Overcast and Rainy with explicit/leap/authored dates, waiting at least one 500ms smoke tick per state. It verifies start idempotency, stopped-service rejection and unchanged clock/progression settings. Before completing it restores the original date, weather family and looping mode. Native transition-queue timing and cloud-variant history are not restored exactly; this is an isolated case that ends with a test-requested round reset. Native compilation and execution remain pending centralized hidden and muted testing.
|
||||
|
||||
## Native evidence
|
||||
|
||||
[063559](evidence/native-2026-09-19-063559/report.json) completed 67 combined environment/catalog assertions with no script/VM failures and no engine errors. Exact native catalogs retained medical and radio entries; all three weather families and a leap date applied without resetting the clock. Defaults and next-round settings behavior were exercised. This one-round development result does not establish multiplayer replication or repeated-restart reliability.
|
||||
@@ -0,0 +1,21 @@
|
||||
# Extraction ownership and results
|
||||
|
||||
Core owns `ERR_ExtractionService` independently of mission progression and HQ. The scenario registers one physical extraction vehicle during preparation. The service refuses subsequent assignment, including after loss. It never spawns a replacement. Once sites are prepared, starting the service validates the escape boundary and checks for a helicopter controller, pilot position and at least twelve pilot/passenger compartments. An unsuitable transport or invalid boundary prevents player spawning and rolls back authored site content.
|
||||
|
||||
`ERR_GameMode` ticks extraction before the empty-server pause, so a lost helicopter or a reserved disconnected occupant reaching the boundary can still resolve. Radio progress and normal mission work retain their empty-server behavior. Loss is terminal throughout the active mission, including prison and radio phases. Waiting until extraction to discover that its only helicopter is gone is no longer necessary. The mode publishes a specific replicated status/debriefing reason for helicopter loss or no remaining survivors.
|
||||
|
||||
During extraction, the service checks the registered vehicle's position against the boundary and each registered participant's actual compartment occupancy. Boarding alone, crossing before the extraction phase, a dead occupant, a survivor left behind, or an unregistered NPC cannot produce a winning identity. Living unconscious occupants and reserved disconnected occupants can escape. The first qualifying boundary crossing freezes the identity snapshot and emits one `OnResolved` event; subsequent ticks do not award additional escapees.
|
||||
|
||||
Results belong to backend account identities. `ConnectedWinners` maps those identities to their current authenticated connection records and rejects recycled IDs. It is an adapter for the native game-end API, whose transient ID array is not a durable result store. Successor UI delivery uses a replicated controller result derived from the server identity snapshot and tagged with the current mission replication ID. Audit/binding resets and republishes it; the end screen ignores stale native winner IDs and refreshes after delayed result updates. The actual local-controller/native-widget fixture passes; real reconnect/replication acceptance remains separate.
|
||||
|
||||
## Native development checks
|
||||
|
||||
`--project core --smoke extraction-capacity --rounds 1` uses real vanilla character entities and the authored Mi-8, with an isolated synthetic identity roster. The transport exposes 17 pilot/passenger positions; twelve characters successfully occupy separate native seats. A second case kills one occupant, disembarks another, makes a passenger unconscious, and reuses a disconnected account's connection ID for a different character. The expected partial result distinguishes ten living aboard escapees from three non-escapees; reconnect mapping follows identity rather than the recycled ID.
|
||||
|
||||
This fixture requests its own end-of-test reset. Its use of native compartments, scripted consciousness and synthetic records does not establish manual boarding, piloting, medical treatment, twelve network clients, actual reconnects or UI replication.
|
||||
|
||||
`--project core --smoke early-helicopter-loss` destroys the registered helicopter during prison while the actual local prisoner is alive. It expects the normal mission tick to reach defeat with the specific loss reason.
|
||||
|
||||
`--project core --smoke extraction-startup-failure --rounds 1` substitutes a real vanilla vehicle with insufficient seating only in the fixture's in-memory catalog. `extraction-boundary-failure` uses the proper helicopter with an invalid radius. Both are negative startup tests: they must retain PREPARING, withhold players and clear authored population/stock/scenery. Their expected startup ERROR is retained in the archived native report.
|
||||
|
||||
The integrated [040928 native run](evidence/native-2026-09-19-040928/report.json) has 100 passing assertions across capacity, partial results, result widgets and time settings/progression, with no script/VM exceptions. Seven inherited vehicle resource errors remain.
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"Configs/Factions/US.conf": "d8d16abbecadc6987ca7eed3b114446d0af5753535c891fcefc20d5b2d7db583",
|
||||
"Configs/Factions/USSR.conf": "2d3d3af74d0da33017ae3132c613fc9c19c0d20cd850a9830bb208db59e4bf25",
|
||||
"Configs/Factions/BLUFOR.conf": "8a0a23245f82a23131c7a425bc20089064c6f57102557c9dda4570b9bfaebe41",
|
||||
"Configs/Factions/OPFOR.conf": "8401e84d2bccec38c9fa6f06bfc74d7d90aace037712885abb179869e5bc4012",
|
||||
"Configs/EntityCatalog/USSR/Vehicles_EntityCatalog_USSR.conf": "d4283eedd65dc7a5d65fb701a7fc1d63073f5a51a5c28a801fa5102b151a468f",
|
||||
"Prefabs/MP/Managers/Factions/FactionManager_Base.et": "9c4fb0cc52c173f94a54126aa4b0e9b6f441851c631503dc6e8fb3703ce50492",
|
||||
"Prefabs/MP/Managers/Factions/FactionManager_USxUSSR.et": "547cf8057b65e278429ed2aef7b96745bd7053765158e1d98034dab16333cbe6"
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
# Finite mortar readiness and ammunition operations
|
||||
|
||||
This patch completes missing lifecycle behavior in the existing HQ-owned mortar path. It adds no gun/crew response spawn, depot, convoy or aircraft. Existing physical projectiles, firing safety and stock behavior outside the successor's registered battery remain native. Local tests pass; native compilation and new runtime behavior still require verification.
|
||||
|
||||
## Startup
|
||||
|
||||
The authored one-gun/four-member battery is still created once by `ERR_MortarSystem.Prepare`. A new battery-owned readiness object polls before runtime Operational checks, so an initially empty group remains pending until its bounded deadline rather than bypassing initialization forever. Within 90 seconds it requires native `IsExpandComplete`, exactly three distinct configured mortar crew and one configured manpack operator, live correct-faction actors, initialized inventories and a valid native gun registration. The existing minimum ten-second startup delay remains, but no longer means readiness.
|
||||
|
||||
The original nine-shell budget per gunner is allocated once after the complete original population is present. Initial shell counts outside 0..9 fail. Each missing shell request receives a distinct retained completion callback; the allocation latch is set before the first native request. A rejection/partial failure permanently closes allocation, without a new budget or retry. All callbacks must finish successfully and each original gunner must actually carry nine unique HE entities, with zero on the RTO and 27 unique group shells, before `StartupActivated` becomes true. Stolen/consumed/missing initialization items are observed until the same deadline and never replenished. Optional short-range crew handsets retain their existing one-time attempt; the actual RTO manpack is mandatory.
|
||||
|
||||
The support owner does not replace injured, lost or substituted crew. Stop or failed pending initialization disables only its owned group's `SetSpawnImmediately` intent, empties only that group's initial prefab list, and purges its queued native requests. Existing physical actors, gun and items remain owned by the existing mission cleanup; the helper neither deletes them nor changes their health. Successfully initialized Stop retains asset references and readable inventory diagnostics.
|
||||
|
||||
## Exact shell transfers
|
||||
|
||||
`SupplyState(now)` explicitly returns FAILED/PENDING/READY. `SupplyGunner()` remains a compatibility wrapper and only returns true for READY. The old request-accepted-as-supplied behavior is removed.
|
||||
|
||||
A transaction captures the exact shell, donor, gunner, source/destination managers, destination storage, gun, group and HQ order number. Native `TryMoveItemToStorage` is issued once; callback methods only record completion/failure and never launch an activity. Authorization is checked on the server against the still-active HQ battery/order, original delivered report timestamp, original gun/group, conscious current crew, factions, distance and turret occupant. Supply READY requires a successful callback **and** the exact shell absent from the donor inventory, present in the gunner inventory and attached to the requested storage. Callback `GetItem()` is deliberately not used because its installed contract excludes Move operations.
|
||||
|
||||
Each shell identity is attempted at most once for this battery during the round, including rejected/ambiguous attempts. A canceled operation cannot authorize fire. An accepted unresolved operation stays reserved and blocks another battery transfer even after its order is canceled. A late successful callback can resolve physical ownership, but cannot make the canceled/expired current order ready. No native retry, shell clone, replacement or health change is used to resolve uncertainty. A successful callback without physical ownership proof remains ambiguous; at the eight-second deadline that order fails, and further supply remains blocked until there is a definite outcome. This is deliberately conservative and can leave a battery unavailable rather than risk overlapping inventory mutations.
|
||||
|
||||
Once a transfer has genuinely completed for its current order, its transaction is released so later rounds can request a different existing shell. The attempted shell identity remains excluded from another move request. Ammo already physically in the current gunner remains usable; no new supply entity is spawned during firing.
|
||||
|
||||
## Order and native shot counter integration
|
||||
|
||||
The system retains the radio-delivered snapshot in `PendingSupplyReport` while supply is pending, checks its unchanged observation age and eligibility every tick, and creates the stock artillery activity only once when READY. The scheduler excludes a pending supply report/unresolved transfer from new assignments.
|
||||
|
||||
The native ShootingLogic superclass increments its behavior shot counter. The successor hook therefore waits **before** calling super: first for a confirmed physical projectile, then for actual next-round supply. Pending ticks return RUNNING without incrementing; supply failure returns FAIL and closes authorization through the existing HQ rejection path. Once READY, super runs once and the next aim is requested. The final confirmed salvo round does not require an extra shell. Real `OnWeaponFired` remains the independent authoritative projectile count; no node success is relabeled as a shot.
|
||||
|
||||
## Files and validation
|
||||
|
||||
New production helpers:
|
||||
|
||||
- `addons/ai/Scripts/Game/ERR/ERR_MortarReadiness.c`
|
||||
- `addons/ai/Scripts/Game/ERR/ERR_MortarSupplyTransfer.c`
|
||||
|
||||
`mortar-finite-operations.patch` contains only Battery/System/Firing edits. No native probe, shared staging, Core source, resources or `check.py` was edited. New `tests/test_mortar_transactions.py` executes actual extracted population/allocation/order/ownership/cycle policies and the actual transfer Poll/Acknowledge control flow against narrow API fakes. Cases include zero/late/duplicate population, callback without inventory, wrong destination storage, simultaneous source/destination claims, stale order, cancellation, exact timeout, late completion, missing shell and repeated pending ticks without duplicate shot-counter increment. Source contracts additionally constrain allocation latching, single native move, cleanup and Firing's pre-super wait. Native inventory/expansion/firing remain separate qualification tasks.
|
||||
|
||||
Primary installed API references and hashes are in `vanilla-reference-sha256.json`. The native first-projectile fixture prepared separately by the other agent continues using existing public Gun, Group, StartupActivated, SpawnFailure, CountShells, OrderShots and TotalShots. Its first shot alone does not exercise donor transfer; a separate exact-item transfer/interruption test is still needed before claiming resupply acceptance.
|
||||
@@ -0,0 +1,23 @@
|
||||
# Finite ground transport
|
||||
|
||||
The western supply site's optional `Transport` definition owns one vanilla UAZ. It is created once by `ERR_SiteService.Begin`, tracked alongside the site's crates and scenery, and transferred to the existing mission owner when preparation succeeds. Destruction, fuel depletion, repeated `Prepare`, and later service ticks do not spawn a replacement or refill it. Terminal stop prevents reinitialization; preparation failure rolls the vehicle back with the other authored contents.
|
||||
|
||||
The vehicle is optional ground transport for the route, not a guarantee that all twelve prisoners can travel simultaneously. Losing it does not defeat the mission or remove the walking route. It is not registered as an HQ response asset.
|
||||
|
||||
## Authoring
|
||||
|
||||
Only depot and outpost sites accept a `Transport ERR_SiteTransport` block. One vehicle is permitted per site and at most four per scenario. `Prefab`, ground-relative `Offset`, `Heading`, `ClearanceRadius`, and `MaximumTerrainRange` are authored in `EveronSites.conf`. Offset magnitude is capped at 60 m and vertical offsets are forbidden. Parking clearance radius must be 2–8 m and the allowed terrain elevation range 0–1.5 m.
|
||||
|
||||
Before spawning, the service samples a 3×3 terrain grid across the parking square, rejects water, steep ground and objects with native geometry, and logs the result. It never removes terrain scenery or searches for another spawn point. Preparation additionally requires a live wheeled vehicle, fuel, native driver and passenger positions, and a vehicle bounding box fitting inside the surveyed footprint with a 0.5 m margin. The persistent handbrake is set at creation.
|
||||
|
||||
The initial 5960/7232 candidate was rejected by native geometry checks. A bounded [parking survey](evidence/native-2026-09-19-043631-parking-survey/report.json) found 43 clear candidates. The selected parking position is **5960/7212**, offset 0/0/-8 from the western cache, heading 180°, final clearance radius 4 m and maximum terrain range 1 m. The initial six-metre-square survey sampled a 0.625 m range; the final native run rechecks the larger eight-metre square. The readiness check compares actual vehicle bounds to this surveyed center, rather than a possibly displaced current origin. Manual route navigation remains unverified.
|
||||
|
||||
## Asset audit
|
||||
|
||||
The vehicle reference is `{259EE7B78C51B624}Prefabs/Vehicles/Wheeled/UAZ469/UAZ469.et`, independently checked against the installed vanilla `resourceDatabase.rdb`. This is already in `docs/vanilla-resources.json`. Its vanilla base config defines two 39 L tanks initially containing 29.25 L each, hence 58.5 L total initial fuel. The successor does not set or regenerate that fuel. The [044205 native run](evidence/native-2026-09-19-044205/report.json) observes 58.5 L initially, 78 L total capacity and five usable driver/passenger seats. No original Escapists code, composition or asset is used.
|
||||
|
||||
## Native fixture
|
||||
|
||||
`ERR_NativeTransportProbe` is WORKBENCH-only and opt-in. Its `Tick(now)` helper uses the actual authored UAZ and two isolated scripted prisoner characters. It checks ownership, native pilot/passenger compartments, physical occupancy and ordinary native engine startup. It then deliberately drains fuel, waits, queries preparation, deletes the vehicle and queries preparation again, verifies initialization cannot repeat, and stops the site service. This destructive fixture therefore belongs in its own smoke branch followed by a round reset.
|
||||
|
||||
The linked native run passes all 23 checks with no script/VM exceptions; seven inherited vehicle schema errors remain. The fixture is not manual driving, normal boarding-action validation, road navigation, fuel-range balancing, remote-client replication, or multiplayer proof. Neither it nor repository validation should be reported as those checks.
|
||||
@@ -0,0 +1,20 @@
|
||||
# Retire initial population intent before purging
|
||||
|
||||
The first native `guard-cancel` test failed in `logs_2026-09-19_07-27-00`: at 07:27:50.658 it proved the empty automatic six-slot group had entered native initialization without dispatching a member, then stopped its pending owner twice. At 07:27:51.671 the group had received a later dispatch or member. The old purge-only implementation therefore did not establish cancellation for an incomplete group kept alive. The first log does not distinguish a later native expansion pass from an unobserved later request; the new fixture records owner cancellation calls, tagged `EOnInit`, `RequestSpawn` and `ExpandOneMember` calls while delegating every native method unchanged.
|
||||
|
||||
Installed `SCR_AIGroup` explains why a queued request is not the complete population contract:
|
||||
|
||||
- `EOnInit` at line 2578 checks `m_bSpawnImmediately`, then requests the slot-array count.
|
||||
- `RequestSpawn` at 2684 enqueues into `ChimeraAIWorld`; its documentation describes later expansion to full size.
|
||||
- `ExpandOneMember` at 2725 returns without spawning when `m_aUnitPrefabSlots` is null/empty, and otherwise computes capacity from its count.
|
||||
- `IsExpandComplete` at 2771 treats null/empty configured slots as complete; this is native production behavior, not a fixture override.
|
||||
- `SetSpawnImmediately` at 2643 changes the per-instance automatic-initialization flag.
|
||||
- `DespawnMembers` at 2872 returns before its queue purge when no physical members exist.
|
||||
|
||||
For successor-owned PENDING initial preparation only, cancellation now disables automatic spawning, assigns a **new empty prefab-slot array to that group instance**, then purges its native queue requests. It never clears a possibly shared array, changes installed resources, invents dead counts, calls a spawn function, or suppresses `ExpandOneMember`. Existing partial members remain physical and owned until normal `Rollback` deletes them. READY gameplay groups remain excluded by the existing `Stop` state gate, so losses during ordinary play cannot cause this startup path to refill or rewrite their profile.
|
||||
|
||||
The unchanged core cancellation assertions still require zero further dispatches and stable cancelled members while an uncancelled control physically reaches six. Additional assertions verify that cancellation runs once, cancelled instance arrays become empty, and the control retains its six-slot profile and automatic-spawn setting. The test still deletes all disposable groups and actual characters through owner rollback and observes late activity.
|
||||
|
||||
`test_guard_cancellation_policy.py` executes the actual cancellation and Stop bodies with two cancelled groups sharing an authored six-slot array with an uncancelled control. It proves replacement does not mutate that shared array, existing physical actor counts stay unchanged, unrequested groups are skipped, READY owners do not retire profiles, and repeated Stop is idempotent. This is source-policy evidence only. The fix and diagnostics still require native compilation and another engine run; the failed first run remains a failure.
|
||||
|
||||
Native cancellation now passes in [073601](evidence/native-2026-09-19-073601/report.json): 68 assertions, no engine/script errors. Empty and partial groups remain stable through a fifteen-second observation while the uncancelled control fills. Owned rollback deletes all captured actors/groups, and the original mission groups remain unchanged.
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"/tmp/erri-vanilla/scripts/Game/Entities/SCR_AIGroup.c": "afb923ea5c78a56d4111d7261fa16fa6da5323ce43d865f7bf5534304e9ff54f",
|
||||
"/tmp/erri-vanilla/scripts/Game/generated/AI/ChimeraAIWorld.c": "0a4a45677fdd0bc534480b506218cbea6cd8bced017fac76d5c991d3edcb3e8b",
|
||||
"/tmp/erri-workbench-profile/logs/logs_2026-09-19_07-27-00/console.log": "d05cdacd5b73fbb1a0b7de76d9bcda06174ba6a728dd75baa3143ca3a420196b"
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"/tmp/erri-vanilla/scripts/Game/Entities/SCR_AIGroup.c": "afb923ea5c78a56d4111d7261fa16fa6da5323ce43d865f7bf5534304e9ff54f",
|
||||
"/tmp/erri-vanilla/scripts/Game/generated/AI/ChimeraAIWorld.c": "0a4a45677fdd0bc534480b506218cbea6cd8bced017fac76d5c991d3edcb3e8b",
|
||||
"/tmp/erri-vanilla/scripts/Game/generated/AI/ChimeraAIGroup.c": "3dd2aac7f6ec98a079dfc5dbe0feafd6c9bf942a30a2a01a50e61bc09e60a062",
|
||||
"/tmp/erri-vanilla/scripts/Game/AI/SCR_AIWorld.c": "71dfa397b1d641ef41ce023b2c33adba68a0b9b55bb0fd8050f8a78bd1fbf10c",
|
||||
"/tmp/erri-workbench-profile/logs/logs_2026-09-19_06-59-35/console.log": "c885b5042491c1eba5cfaafc77b6ac9504930a09946aadd63bb5140e22d6f64f"
|
||||
}
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"scripts/Game/UserActions/SCR_ToggleHandbrakeAction.c": "adefcd64f24b3bf449b945fb87bfe1efe34c29a0648d1fc8c8c254a658ee7138",
|
||||
"scripts/Game/HitZone/SCR_WheelHitZone.c": "c35dfdd63a30e7a793e57911d306e90f3f23fe4862909332a297fd833e17a2e0",
|
||||
"scripts/Game/generated/Vehicle/VehicleBaseSimulation.c": "8ceb71cff6cbe30484aa4cd67e27fa722508e82641415cdb2f9b3dda8ae1ab01",
|
||||
"scripts/Game/Components/SCR_VehicleSpawner.c": "b83f714d46f5acdf86a839cffa2aedf9b8914bac83d151cc9573b69273338e0c"
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
# Initial extraction placement
|
||||
|
||||
This change addresses an observed initial-placement failure, not an unloading or extraction-boundary change. In the 2026-09-19 07:34:23 native attempt, the newly spawned Mi8 was sleeping, engine off, without native landing contact. Three short wheel casts all missed the terrain. A zero velocity reading alone therefore could not establish support.
|
||||
|
||||
`ERR_ExtractionPlacement` belongs to `ERR_SiteService` during PREPARING. It accepts only that mode's registered, living Mi8. Once native dynamic physics and a valid helicopter simulation exist, it performs exactly one `Physics.SetActive(ActiveState.ACTIVE)`. The native simulation then owns settling. There is no transform, velocity, impulse, engine, fuel, health or collision mutation. No readiness is accepted in the wake frame.
|
||||
|
||||
Preparation requires the existing strict `AircraftReady` predicate, actual fuel and one second of successive observations, with gaps no greater than 1.5 seconds. A failed observation restarts that interval. The first stable qualification must complete strictly before the 30-second deadline; an already READY aircraft can continue to be monitored while guards finish after that deadline. A broken observation after the deadline fails instead of opening a new settling period. Failure to establish readiness within 30 seconds uses the existing site failure/rollback path. Even after readiness first succeeds, subsequent preparation polls still check the aircraft while other initial content finishes. Stop prevents further wake/poll work. No gameplay extraction Begin condition changes; players may later fly, expend fuel, damage or lose the aircraft normally.
|
||||
|
||||
Diagnostic readings include all landing pivots and tire-bottom terrain gaps, short-cast support results, native-vs-entity vehicle transforms, physics activation/motion, contact and fuel. The sleeping-wheel fallback thresholds remain unchanged.
|
||||
|
||||
The opt-in existing `casualty-service` ground probe now verifies the production placement's readiness and exactly one initial wake, then reads the real mission aircraft's contact/support. Its separate airborne/tilted/moving negative aircraft remains disposable. The fixture does not wake or reposition the mission aircraft. It is neither a manual player-action test nor remote multiplayer proof.
|
||||
|
||||
Primary installed-source references inspected read-only:
|
||||
|
||||
- `scripts/Game/UserActions/SCR_ToggleHandbrakeAction.c:97`: vehicle physics wake uses `SetActive(ActiveState.ACTIVE)`.
|
||||
- `scripts/Game/HitZone/SCR_WheelHitZone.c:223`: stock component explicitly wakes sleeping dynamic vehicle physics after changes (using balanced impulses there, which this successor does not copy).
|
||||
- `scripts/Game/generated/Vehicle/VehicleBaseSimulation.c`: public `IsValid`, `GetWorldTransform`, and landing-gear/wheel `HasAnyGroundContact` contract.
|
||||
- `scripts/Game/Components/SCR_VehicleSpawner.c`: bare prefab spawning does not itself perform an explicit support readiness check.
|
||||
|
||||
Local validation: `python3 tests/test_extraction_placement_policy.py` passes actual extracted production timing policies and focused integration/source contracts. Enforce compilation and actual settling remain unverified until the parent runs the native scenario. No prior failed evidence is relabeled as passing.
|
||||
|
||||
SiteService owns `ERR_ExtractionPlacement.c`; the ground probe inspects its actual one-shot wake and readiness state. `tools/check.py` includes `tests/test_extraction_placement_policy.py`. Initial guard cancellation remains separately owned and verified.
|
||||
|
||||
Native observations in [074655](evidence/native-2026-09-19-074655/report.json) confirm one initial wake, actual dynamic settling, all three wheel support traces within millimetres of terrain, native contact, fuel and one-second readiness before spawning. The raised/tilted/moving negatives also pass. The full casualty case fails later on a separate fixture health setup, so this is scoped placement evidence rather than a passing complete run. The diagnostic simulation-transform query returned identity despite the correctly moving entity; it is not used for readiness or support decisions.
|
||||
@@ -0,0 +1,17 @@
|
||||
# Initial guard population readiness
|
||||
|
||||
In native log `logs_2026-09-19_06-59-35`, the last site group was authored at 07:00:21.170, the mission entered prison at 07:00:21.266, and the patrol fixture required a living outpost actor at 07:00:22.216. The old preparation checked the group entity's faction but never its members.
|
||||
|
||||
Installed vanilla `SCR_AIGroup.EOnInit` (line 2578) requests the configured slot count through `RequestSpawn` (2684), which delegates to native `ChimeraAIWorld.EnqueueSpawnRequest`. Installed source describes capped, frame-time-aware dispatch at 2 Hz. `ExpandOneMember` (2725) creates one soldier per successful dispatch; `SpawnGroupMember` may also wait for streamed navigation tiles, with a 30-attempt fallback. Therefore a valid group entity/faction does not establish physical squad readiness. The source does not establish the exact native queue throughput in this run; native diagnostics must measure it. The successor AI addon contains no site-population call in HQ registration; Core does not depend on it to spawn guards.
|
||||
|
||||
The successor now records each chosen group's public `m_aUnitPrefabSlots.Count()` once during initial creation. Empty/manual-only profiles fail clearly. Preparation waits up to 90 seconds for exactly that many distinct physical controlled entities, all conscious with the configured enemy faction, and native `IsExpandComplete()`. Stock insertion proceeds while guards are pending and retains its separate 15-second deadline. Count changes are logged, and a timeout reports the requested/physical/conscious counts, native completion state, navigation-tile status and dormant counts before ordinary rollback. A missing group, invalid count or foreign faction fails without waiting indefinitely.
|
||||
|
||||
The successor never calls `SpawnUnits`, `SpawnMembers`, `ExpandOneMember` or `RequestSpawn` to retry this population. Once the site service is READY, the existing early return prevents this check from running again. Casualties and depleted groups are not restored. A stopped or failed PENDING preparation explicitly purges only its owned groups' initial native requests before rollback; vanilla `DespawnMembers` otherwise returns early when a group is empty, before its own queue purge.
|
||||
|
||||
The patrol fixture performs its authoring/route checks once, then allows up to 15 seconds for the existing group actors to be observable. It asserts six distinct physical conscious guards for each current Everon patrol profile before observing movement. It creates no replacement soldiers. Its outer Core fixture budget must include the initial 90-second preparation plus this wait and the existing 180-second route deadline; integration uses 330 seconds for `patrols` only.
|
||||
|
||||
Source hashes are in `guard-source-hashes.json`. The source-policy regression covers incomplete groups, missing consciousness/native completion, excess members, invalid profiles and strict timeout failure. Native queue timing, full group arrival, navigation traversal, startup-failure cleanup and no refill after casualties still require engine runs.
|
||||
|
||||
Native run `native-2026-09-19-070919` observes all six original squads completing six distinct conscious actors before PRISON. The full patrol fixture passes 295 combined assertions with zero engine or script errors. Count-change logs establish asynchronous initial population without another spawn request. Timeout/cancellation logic is source-checked; this successful run does not exercise engine cancellation of a queued failed preparation.
|
||||
|
||||
Native cancellation now passes in [073601](evidence/native-2026-09-19-073601/report.json): 68 assertions, no engine/script errors. Empty and partial groups remain stable through a fifteen-second observation while the uncancelled control fills. Owned rollback deletes all captured actors/groups, and the original mission groups remain unchanged.
|
||||
@@ -0,0 +1,9 @@
|
||||
# Physical inventory identity
|
||||
|
||||
Native run `logs_2026-09-19_06-39-49` returned repeated `IEntity` references for watches and the player's personal belongings. The repeated records had the same native entity address/ID; this was enumeration duplication, not extra physical stock. Installed `InventoryStorageManagerComponent.GetItems` documents returning items from all managed storages and does not promise unique references.
|
||||
|
||||
`ERR_Inventory.Items` now collects live unique entity references in first-seen order. `AppendUnique` also merges several inventories into an initially unique destination. Mortar battery totals count each physical shell once across crew inventories; initial equipment uses that same count; donor selection attempts each physical shell at most once per supply call. Distinct entities with the same prefab remain separate ammunition. The existing one-time nine-shell equipment target, real native moves, and finite-stock/depletion policy remain unchanged. Presence-only HQ radio checks remain unchanged.
|
||||
|
||||
Discovery folder searches also deduplicate their initial Intel result before merging objective documents. Duplicate `FindItems` results have not been demonstrated in the native run; this preserves the collector's physical-identity contract and prevents repeated processing if that API returns them.
|
||||
|
||||
`tests/test_inventory_enumeration_policy.py` executes the actual helper and mortar inventory-count bodies after mechanical translation with synthetic C++ entities. It covers repeated references, distinct shells sharing a prefab, null references, missing prefab data, cross-inventory overlap, ordering, and unchanged native input. This is a source-policy regression, not an Enforce compiler or inventory engine test. Native validation should rerun the existing companion mortar case: exactly 27 physical shells at startup, then physical deletion and sustained zero shells with zero fabricated shots. Core/Chat full-loop fixtures should count unique cache stock and distinct objective documents.
|
||||
@@ -0,0 +1,28 @@
|
||||
# Ordinary offline single-player admission
|
||||
|
||||
The ordinary native diagnostic `logs_2026-09-19_08-13-59/console.log:295–296` reports authority, RplMode.None, one local controller, and a 36-character all-zero UUID sentinel. The value is syntactically valid but null. Installed `SCR_PlayerIdentityUtils.GetPlayerIdentityId` tests raw `IsEmpty()`, so this initialized null string bypasses its PeerTool empty-string fallback and previously made successor roster binding fail.
|
||||
|
||||
`ERR_LocalAdmission` supplies a successor-owned round key only inside a mode created as RplMode.None. It is selected from the existing real native `OnPlayerAuditSuccess_S` callback. The context must be authoritative, retain the current successor mode, have exactly one connected player, and match that player's positive ID and current manager controller to the actual local controller. If the native helper returns a non-null identity, that value is retained. Otherwise native `UUID.GenV4()` supplies one local-round key. This is life/result bookkeeping, not a Bohemia/platform identity or authentication assertion. No identifier/name bytes are logged. In the explicit ordinary diagnostic only (`-errOrdinaryScenario core` or `chat`), the first context refusal records boolean authority/controller checks, session mode and player count so native standalone API timing can be distinguished from an invalid context without relaxing admission.
|
||||
|
||||
The helper pins mode, controller, connection and selected key. Repeated callbacks do not reset spawn attempts, replace the body or bind another life. A backend identity appearing later does not replace the pinned key. The existing roster's used-life and extraction result rules continue to operate on that same value. A disconnect, replaced controller, extra connection or changed session context latches failure. Pending assignment checks reject immediately; the existing mode tick also detects context changes after spawning. The mode reports an explicit preparation failure or normal defeat, rather than adopting another controller into that local identity. Returning the context to its previous values cannot reopen the old helper. A new mode owns a fresh helper/key; terminal cleanup clears the old key/controller while retaining its closed state.
|
||||
|
||||
A helper constructed in Listen/Dedicated is inert: it always returns the native identity unchanged, including null, and its validation cannot block that mode. The existing native reconnect path is unchanged for those modes. A generated offline key skips native reconnect restoration; it is never written into the native reconnect map, global identity utility, backend, persistence IDs or role state. Controller replacement within the offline round requires a new scenario rather than claiming account continuity. Existing WORKBENCH-only fixture identity handling remains unchanged.
|
||||
|
||||
No new audit callback, login request, permission grant, persistent setting, command or repeating timer is introduced. Admin authorization still uses the existing native player-role check. The native base spawn callback remains called unchanged, including its own persistence behavior. This change does not fix or suppress unrelated ordinary-game GUI errors.
|
||||
|
||||
## Source/API evidence
|
||||
|
||||
Read-only installed sources:
|
||||
|
||||
- `scripts/Game/Utilities/SCR_PlayerIdentityUtils.c:20–45`: cached native identity read and empty-string-only PeerTool fallback.
|
||||
- `scripts/Core/generated/Types/UUID.c:12–27,67,106–131`: null includes empty/all-zero/invalid strings; `IsNull()` is the prescribed check; `GenV4()` is the native random UUID API.
|
||||
- `scripts/Game/generated/Network/PlayerManager.c`: connected count, current controller, connection state and player-role APIs are separate.
|
||||
- `scripts/Game/Respawn/Logic/SCR_AutoSpawnLogic.c:15–18` and `SCR_SpawnLogic.c:294–300`: native audit callback starts load/spawn; unavailable persistence can proceed to ordinary spawning.
|
||||
|
||||
The detailed design audit and inspected-source hashes were prepared under `/tmp/erri-offline-identity-design`; no original Escapists implementation or platform account data was used.
|
||||
|
||||
## Validation and remaining limits
|
||||
|
||||
`python3 tests/test_local_admission.py` executes the actual context/resolver/failure/cleanup method bodies with substituted opaque native handles and UUID generation. It covers strict None-only context, missing/mismatched/replaced controllers, counts/IDs, one-time generation, repeated callbacks, late backend values, sticky failure, fresh mode and unchanged network pass-through even after Stop. It does not prove native UUID entropy/format or network authentication. Existing admission rules still check phase, used life, reserved position, exact request/controller and owned preload cleanup; the new context check runs at request and finalization boundaries.
|
||||
|
||||
Native compilation and the corrected ordinary player spawn are pending for this patch. Required next checks: actual generated non-null key and controlled prisoner in the ordinary header scenario, death without another local life, terminal result attribution, fresh-round reset, and unchanged Core/companion/lifecycle fixtures. Context-change and replacement-controller fault tests must use disposable local state without altering a real network session or fabricating backend/audit success. Manual input, clean ordinary runtime and real multi-client reconnect/permissions remain separate acceptance requirements.
|
||||
+36
@@ -0,0 +1,36 @@
|
||||
# Medical-kit teardown ownership audit
|
||||
|
||||
No production cleanup is proposed yet: the two identified medical-kit instances have not been established as successor-owned scene stock. Deleting tracked stock to remove these errors would therefore be an unproven change with a risk of removing carried inventory.
|
||||
|
||||
## Established evidence
|
||||
|
||||
- `docs/evidence/native-2026-09-19-050515/console.log.txt:620-621` identifies `{AE578EEA4244D41F}Prefabs/Items/Equipment/Kits/MedicalKit_01/MedicalKit_01_US.et` and `{21EF98BFC1EB3793}Prefabs/Items/Equipment/Kits/MedicalKit_01/MedicalKit_01_USSR.et`. Both have unnamed owners, valid cached/global catalog references, and no current GameMode at that teardown point. This session did not reproduce a missing-manager error.
|
||||
- Current `addons/core/Configs/ERR/EveronSites.conf` stocks field dressings, saline and morphine; neither diagnostic medical-kit resource appears in any successor addon source/resource. The prisoner loadout also does not explicitly add these kits.
|
||||
- Both kit prefabs remain in the installed vanilla US/USSR inventory catalogs (`InventoryItems_EntityCatalog_US.conf:1290`, USSR `:1002`). Preserving complete medical/inventory support is intentional. Catalog membership is **not proof that the deleting entity is a world instance owned by the successor**.
|
||||
- Installed `SCR_EntityCatalogEntry.ClassSpecificInit` and `SCR_EntityCatalogInventoryItem.ClassSpecificInit` call `Resource.Load` and inspect entity/component sources. These inspected methods do not call `SpawnEntityPrefab` or register entities with successor ownership. Resource/template cleanup or another native subsystem is a possibility, not a proven cause.
|
||||
- Installed `SCR_BaseItemSupportStationComponent.DelayedInit` caches the global catalog manager and calls super. Its `InitValidSetup` prints the stale-named resupply error if that reference is absent.
|
||||
- Installed `SCR_BaseSupportStationComponent.OnDelete` invokes virtual `InitValidSetup` before unsubscribing damage/support dependencies. Its `EOnInit` queues `DelayedInit` and `OnDelete` does not explicitly remove that callback. Both dependency teardown order and initialization/delete ordering remain relevant hypotheses.
|
||||
|
||||
## Why blanket successor cleanup is unsafe
|
||||
|
||||
`ERR_SiteService.m_Entities` contains sites, containers, stock, transport and extraction aircraft. Successful preparation also registers all those objects in GameMode ownership. The collection records creation ownership, not current inventory custody. A stock item remains listed after a player picks it up. `ERR_Actors.DeleteSpawned(item)` only refuses a directly controlled player entity; it does not protect an item merely because it is now in that player's inventory. `Rollback()` deletes this entire list in reverse order and would also remove the extraction aircraft. It must not be repurposed as normal endscreen cleanup.
|
||||
|
||||
The current `Stop()` intentionally stops updates without removing those physical objects. Ordinary victory preserves passengers, aircraft and result while the native endscreen exists. This is appropriate and should remain unchanged.
|
||||
|
||||
## Exact possible pre-restart boundary
|
||||
|
||||
Installed `SCR_BaseGameMode` invokes `RestartSession` after `GetAutoReloadDelay` (lines 715-717), after its game-mode-end notification. `protected void RestartSession()` (line 781) checks authority, invokes `TryShutdownServer`, then calls `GameStateTransitions.RequestScenarioRestart()` (line 789). A successor-only override could perform bounded owned-item disposal immediately before calling unchanged super, while the old world's manager still exists. This would happen after the endscreen delay, not on victory.
|
||||
|
||||
That hook is only justified as the error fix if the deleting station is proven to be one of the owned objects, and every relevant restart route uses this method. Direct scenario-restart requests or shutdown/Workbench play termination are separate lifecycle paths. A generic component destructor is already too late to guarantee catalog manager lifetime.
|
||||
|
||||
If ownership is established, the narrow implementation should track spawned **stock items separately** from sites/vehicles, establish current custody before deletion, and remove only items still in their owned site storage or unclaimed world stock. Never traverse/delete a player body, reconnection-reserved body, aircraft/passenger hierarchy or other subsystem's catalog prototype. Only release bookkeeping for taken or already-deleted stock. Call item deletion while the required manager exists; retain vanilla OnDelete and its errors. Verify idempotence and delete ordering with actual named instances. Do not claim kit errors fixed until the exact observed owners are handled and raw two-round logs demonstrate it.
|
||||
|
||||
## Isolated diagnostic extension
|
||||
|
||||
The only code change in this handoff is `addons/core/Scripts/Game/ERR/ERR_NativeStationTeardownDiagnostic.c`, extending the existing WORKBENCH-only opt-in diagnostic. Use existing `--station-teardown-diagnostics` / `-errStationTeardownDiag 1` activation. It still invokes unchanged super in DelayedInit, OnDelete and InitValidSetup, and leaves all native errors visible.
|
||||
|
||||
At native DelayedInit it captures scalar/string evidence: whether initialization was observed, successor mode present, owner world equals the current game world, whether the site service knows that exact owner, inventory-slot presence, and parent prefab. It prints at most 64 initialization records. Teardown's existing maximum 64 records gain those initial facts plus current world/site/inventory/parent observations. It stores no new entity/manager references and schedules no work. `initSiteOwned=false` alone does not prove permanent nonownership; an item could be adopted later. Likewise absence of GameMode at delete makes current ownership unavailable, so the initialization and world evidence must be interpreted together.
|
||||
|
||||
Suggested run: ordinary two-round Core scenario with retained vanilla inventory catalogs and the existing diagnostic flag. Correlate kit resource names and init/delete records, then repeat with physical medical treatment and representative looting. Determine whether the kit owner is in the main world and ever successor-owned before proposing its removal. Also retain the raw catalog-manager error count. No completed-smoke marker is added and no runner qualification is changed.
|
||||
|
||||
No engine run, original workspace edit, installed resource change or production deletion was performed for this audit. The diagnostic extension is source-reviewed and awaiting native compilation. Existing source-hash evidence for the base lifecycle remains in `docs/evidence/native-error-audit-2026-09-19/source-hashes.json`.
|
||||
@@ -0,0 +1,104 @@
|
||||
[
|
||||
{
|
||||
"source": "escapists-ai/Scripts/Game/EscapistsAI/EAI_HQNetwork.c",
|
||||
"sha256": "1a7e279b050514bad86f18fdd233b7eb5728e99bab3daae3aedb31ceb571c271",
|
||||
"destination": "addons/ai/Scripts/Game/ERR/ERR_HQNetwork.c",
|
||||
"changes": "New namespace; HQ network uses successor actor/faction interfaces; separate log file."
|
||||
},
|
||||
{
|
||||
"source": "escapists-ai/Scripts/Game/EscapistsAI/EAI_HQJournal.c",
|
||||
"sha256": "0d714bc60940898dac560ee0902997ca82e324395dc2696c6424909a0a587c81",
|
||||
"destination": "addons/ai/Scripts/Game/ERR/ERR_HQJournal.c",
|
||||
"changes": "New namespace; HQ network uses successor actor/faction interfaces; separate log file."
|
||||
},
|
||||
{
|
||||
"source": "escapists-ai/Scripts/Game/EscapistsAI/EAI_HelicopterAvailability.c",
|
||||
"sha256": "bb565c5c5f7d4e671a295ae7e951f9ebdde626ffdecc4ae7d92e0e776e1730e0",
|
||||
"destination": "addons/ai/Scripts/Game/ERR/ERR_HelicopterAvailability.c",
|
||||
"changes": "New namespace; HQ network uses successor actor/faction interfaces; separate log file."
|
||||
},
|
||||
{
|
||||
"source": "escapists-ai/Scripts/Game/EscapistsAI/EAI_MortarPrediction.c",
|
||||
"sha256": "b58d9ea6e211fc479a1674c380be4979ebacf46d14facae74257aa0937b6cd49",
|
||||
"destination": "addons/ai/Scripts/Game/ERR/ERR_MortarPrediction.c",
|
||||
"changes": "New namespace; HQ network uses successor actor/faction interfaces; separate log file."
|
||||
},
|
||||
{
|
||||
"source": "escapists-ai/Scripts/Game/EscapistsAI/EAI_MortarSalvo.c",
|
||||
"sha256": "f0235c4516eebd03e5721d259dabcb516a4e457e9909a1b8bb08553a0f7bc652",
|
||||
"destination": "addons/ai/Scripts/Game/ERR/ERR_MortarSalvo.c",
|
||||
"changes": "New namespace; HQ network uses successor actor/faction interfaces; separate log file."
|
||||
},
|
||||
{
|
||||
"source": "escapists-ai/Scripts/Game/EscapistsAI/EAI_HQObservation.c",
|
||||
"sha256": "735611603dbfa80218a42c6722dda09a3de8c7369aa5689cb8cb711851ede6dd",
|
||||
"destination": "addons/ai/Scripts/Game/ERR/ERR_HQObservation.c",
|
||||
"changes": "New namespace; HQ network uses successor actor/faction interfaces; separate log file."
|
||||
},
|
||||
{
|
||||
"source": "escapists-ai/Scripts/Game/EscapistsAI/EAI_HQ.c",
|
||||
"sha256": "4898ac471fb16433fc5d98244a8cec89c5e8e006af2c94bbcd89113a2b7107c8",
|
||||
"destination": "addons/ai/Scripts/Game/ERR/ERR_HQReport.c",
|
||||
"changes": "Only radio inventory capability and report snapshot classes migrated."
|
||||
},
|
||||
{
|
||||
"source": "escapists-map/Scripts/Game/EscapistsMap/ESM_SharedMapComponent.c",
|
||||
"sha256": "26201b9d2b04986b9684be81dff47200a631d8cd01b57e96788a153fb56e6b4d",
|
||||
"destination": "addons/map/Scripts/Game/ERRMap/ERRM_SharedMapComponent.c",
|
||||
"changes": "Namespaced types, paths and resource identities; explicit shared map item only."
|
||||
},
|
||||
{
|
||||
"source": "escapists-map/Materials/ESM_MapRenderTarget.emat",
|
||||
"sha256": "9877c5b175c5f30dd80bea36c711b21ab38219aa7075adf9ae79932e1d4c76bc",
|
||||
"destination": "addons/map/Materials/ERRM_MapRenderTarget.emat",
|
||||
"changes": "Namespaced types, paths and resource identities; explicit shared map item only."
|
||||
},
|
||||
{
|
||||
"source": "escapists-map/Materials/ESM_MapRenderTarget.emat.meta",
|
||||
"sha256": "f46a7255d51af1b43d9f9fd8e884640fed9e87a610a8eac1778e27cc2c262e5a",
|
||||
"destination": "addons/map/Materials/ERRM_MapRenderTarget.emat.meta",
|
||||
"changes": "Namespaced types, paths and resource identities; explicit shared map item only."
|
||||
},
|
||||
{
|
||||
"source": "escapists-map/UI/layouts/EscapistsMap/SharedMapRenderTarget.layout",
|
||||
"sha256": "49a2da4181b94d42174f58c7f9b6bf2207116c99427d61ff1c212092ac7db4d2",
|
||||
"destination": "addons/map/UI/layouts/ERRMap/SharedMapRenderTarget.layout",
|
||||
"changes": "Namespaced types, paths and resource identities; explicit shared map item only."
|
||||
},
|
||||
{
|
||||
"source": "escapists-map/UI/layouts/EscapistsMap/SharedMapRenderTarget.layout.meta",
|
||||
"sha256": "3311c3d2163fa0a59eb98ca07cdf79814f1d5131e95231a0a49783e8dc455cf7",
|
||||
"destination": "addons/map/UI/layouts/ERRMap/SharedMapRenderTarget.layout.meta",
|
||||
"changes": "Namespaced types, paths and resource identities; explicit shared map item only."
|
||||
},
|
||||
{
|
||||
"source": "escapists-map/Prefabs/Items/Equipment/ESM_SharedFieldMap.et",
|
||||
"sha256": "8c0cdcf3e3af96eac710c75ccc54a7bbcb6713caf76a63a58f5519c009e747f7",
|
||||
"destination": "addons/map/Prefabs/Items/Equipment/ERRM_SharedFieldMap.et",
|
||||
"changes": "Namespaced types, paths and resource identities; explicit shared map item only."
|
||||
},
|
||||
{
|
||||
"source": "escapists-map/Prefabs/Items/Equipment/ESM_SharedFieldMap.et.meta",
|
||||
"sha256": "33457ec2ead243640e57dc12c969be0d59923455f89669024e50998f63cca690",
|
||||
"destination": "addons/map/Prefabs/Items/Equipment/ERRM_SharedFieldMap.et.meta",
|
||||
"changes": "Namespaced types, paths and resource identities; explicit shared map item only."
|
||||
},
|
||||
{
|
||||
"source": "escapists-ai/Scripts/Game/EscapistsAI/EAI_MortarSystem.c",
|
||||
"sha256": "b355227b2b221147d35e1dacbc07cf650838229b9a6d22cd30cc1e304112b33f",
|
||||
"destination": "addons/ai/Scripts/Game/ERR/ERR_MortarBattery.c",
|
||||
"changes": "Only physical battery lifecycle, finite inventory, native activity and projectile accounting; successor creates authored group and gun. Original deployment and scheduler replaced."
|
||||
},
|
||||
{
|
||||
"source": "escapists-ai/Scripts/Game/EscapistsAI/EAI_MortarFiring.c",
|
||||
"sha256": "aadd057a1f3f4326bd41500be7a12051a16de9d5925fca2452a46cdfbf0d6d12",
|
||||
"destination": "addons/ai/Scripts/Game/ERR/ERR_MortarFiring.c",
|
||||
"changes": "Native ballistic and final loading hooks migrated; successor HQ-delivered snapshots gate firing."
|
||||
},
|
||||
{
|
||||
"source": "escapists-ai/Scripts/Game/EscapistsAI/EAI_SettlementSafety.c",
|
||||
"sha256": "6961ad593d20f86c30b557542b4f67fd44d9579037776b07cd95616927eda83d",
|
||||
"destination": "addons/ai/Scripts/Game/ERR/ERR_SettlementSafety.c",
|
||||
"changes": "Use vanilla named settlements; original mission location dependency removed."
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,33 @@
|
||||
# Migration status
|
||||
|
||||
The old workspace is a read-only migration reference. `dependency-audit.json` records legacy symbol references discovered during the audit. `migration-provenance.json` records the selected independently authored helper sources and their original hashes. `vanilla-resources.json` records exact GUID/path pairs resolved against the installed vanilla resource database. None of these records proves complete behavioural parity.
|
||||
|
||||
The base replacement has priority over extension feature migration. [Base responsibilities and implementation order](base-replacement.md) distinguish prototype coverage from remaining gameplay work.
|
||||
|
||||
## Implemented foundation
|
||||
|
||||
- Five projects, dependency isolation, new source resource identities and a new scenario identity.
|
||||
- New mission state rules, scenario assembly, location/discovery state, vanilla faction catalog, native spawning, settings owner and once-per-round world-clock configuration.
|
||||
- Independent extraction ownership, physical capacity checks, partial identity results, controller-based result presentation, early vehicle-loss handling and preparation rollback.
|
||||
- Physical radio network, visual observation intake, report snapshots, bounded HQ journal and an initial infantry response coordinator.
|
||||
- Core-owned document recovery and objective map markers, optional enemy-carried intel and shared field map, replicated discovery markers and a limited administration command surface.
|
||||
- New Everon child world, definition-driven prison, two independent clue caches, medical stash, guarded outpost, radio and extraction sites using referenced vanilla resources.
|
||||
|
||||
## Incomplete milestones
|
||||
|
||||
| Milestone | Current evidence | Remaining work |
|
||||
| --- | --- | --- |
|
||||
| Dependency audit/setup/interfaces | Projects and automated isolation checks exist | Complete provenance review; mature player/objective service interfaces |
|
||||
| Playable Everon loop | Core-only escape/restart and native objective state checks pass; full companion regression also passes | Manual route/stock balance, gameplay presentation, multiplayer lifecycle and clean runtime |
|
||||
| HQ/support/companion integration | Physical infantry coordination and selected helpers ported | Migrate full HQ scheduling, aircraft, mortars, ammunition, convoy/depot logistics, existing applicable commands and settings |
|
||||
| Multiplayer/performance/release | Test ledger and regression tooling exist | Dedicated server and 12-player sessions, failures/restarts/cleanup, equivalent-workload FPS evidence, native builds, packaging and publication |
|
||||
|
||||
The prison/site layout is a prototype. Terrain heights were checked, but collision, slope, navmesh accessibility, vehicle seating and extraction takeoff have not passed gameplay acceptance. Two separate marked supply caches each hold two guaranteed radio documents. The western cache provides another route if the southern cache is lost; optional medical and guarded outpost stock add detours. Progression does not require random enemy intel. Geometry diagnostics replaced the sloping footprint with an open surveyed site and resized the gate to its opening. Native gate passage and two scripted victory rounds pass; manual gameplay acceptance remains outstanding.
|
||||
|
||||
## Commands presently implemented
|
||||
|
||||
Core alone provides `/esc status`, `/esc settings`, `/esc mission radio show` and `/esc mission radio set N` for administrators, plus `/esc spectate next|previous` for spectators. With companions loaded, administrators also retain `/esc hq show`, `/esc hq log`, `/esc hq interval|squads|radius show`, `/esc hq interval|squads|radius set N`, `/esc intel carrying|reveal show` and `/esc intel carrying|reveal set N`.
|
||||
|
||||
Settings live in `$profile:rereintroduced.json`, with checked temporary writes and a backup. Names and defaults are explicit in `ERR_Settings.c`. `tools/import_settings.py` previews conversion of supported legacy AI/intel settings and explicitly reports deferred fields. Writing requires `--out` and refuses to overwrite an existing file. Old settings files are not silently imported. Existing tools, admin menus and other commands are not yet fully migrated; this subset is not a claim of preserved compatibility.
|
||||
|
||||
RHS, additional terrains, complete feature parity and virtual distant units remain deferred as agreed. The project's initial estimate of 160–280 hours described the entire successor; this foundation does not constitute all of that work.
|
||||
@@ -0,0 +1,23 @@
|
||||
# Mission-scoped faction catalogs
|
||||
|
||||
The successor's initial Everon vehicle scope is the finite depot UAZ469 (`{259EE7B78C51B624}`) and the extraction Mi8MT unarmed transport (`{DF5CCB7C0FF049F4}`). These are the only two vehicle prefabs authored in the current scene definitions. Both US and USSR receive the same two-entry vehicle catalog so a captured mission vehicle can still be looked up through either faction. This does not change the default affiliation, physical prefab, seats, damage, fuel, weapons or handling of either asset. It does not add vehicles or spawning orders.
|
||||
|
||||
The manager is the successor resource `Prefabs/ERR/FactionManager.et` (`5414041A15DC4B54`), inheriting only vanilla `FactionManager_Base.et`. It uses successor US (`5C67A1DDE0044806`) and USSR (`D7A5CFA62A36480D`) profiles and the successor `MissionVehicles.conf` (`E4785D3AF1D043C2`). No resource inherits vanilla `US.conf`, `USSR.conf`, `FactionManager_USxUSSR.et` or their full vehicle catalogs. This avoids initializing unneeded M151A2, BRDM2 and BTR70 catalog entries. It does not fix those installed vehicle schemas or establish those vehicles as compatible.
|
||||
|
||||
The faction profiles preserve all properties of installed vanilla US/USSR profiles except the vehicle-catalog reference. They derive directly from vanilla BLUFOR/OPFOR as the installed originals do. This preserves faction keys, enmity rules, soldier identities, voice settings, flags, ranks, callsigns, encryption keys, frequencies and home territories. The full CHARACTER, GROUP, WEAPONS_TRIPOD, ITEM and SUPPLY_CONTAINER_ITEM catalogs retain their original references. In particular no medical consumable, radio, weapon, ammunition, uniform, group or medical support item is removed by this change. Installed US/USSR supply-container catalogs are empty; their type remains available with that same empty content.
|
||||
|
||||
These are new successor resource identities authored using vanilla profiles and documented native catalog containers. No original Escapists code or resources are reused. Source extraction SHA-256 values are recorded in [faction-catalog-source-hashes.json](faction-catalog-source-hashes.json); extraction came from the locally installed stable Reforger PAKs. Tests also pin normalized profile contents to catch unintended changes outside the deliberate vehicle reference.
|
||||
|
||||
## Validation and limitations
|
||||
|
||||
The candidate passed the full existing offline checker in `/tmp/erri-faction-check`, including three new catalog-scope tests. It has 27 unique addon resources and valid declared vanilla references. This does not compile Enforce, load configs natively, exercise vehicle physics or prove improved FPS. No engine was launched by the author of this candidate.
|
||||
|
||||
`ERR_NativeFactionCatalogProbe.Run(mode)` is a WORKBENCH-only, read-only assertion entry point. Invoke once after faction initialization and successful scene preparation, before the transport or extraction destructive tests. It verifies both factions' exact two-vehicle catalog contents and prefab lookups, all six catalog types, nonempty native content where appropriate, dressing/saline/backpack radio entries, global catalog-manager access, US/USSR identities and mutual enmity, radio encryption/frequencies, callsign data, physical UAZ/Mi8 and the helicopter's required seat capacity. It does not load old full faction resources as a comparison, because that would reintroduce their unwanted catalogs.
|
||||
|
||||
Parent integration should compile and run the complete Core/companion scenario for two rounds, with this probe before destructive tests and the unchanged raw-log parser afterward. The expected seven schema messages must actually disappear from raw startup logs for this scope change to help the clean-runtime gate. Any remaining errors, including intermittent support-station/catalog-manager teardown errors, continue to fail that gate. No log message or validation rule is suppressed or reclassified here.
|
||||
|
||||
Future vehicle support must add an intentional catalog entry and validate that asset's own native schema/handling, inventories and support behavior. Retaining complete inventory and group catalogs does not justify a claim that every original gameplay feature or remote multiplayer path is covered.
|
||||
|
||||
## Native evidence
|
||||
|
||||
[063559](evidence/native-2026-09-19-063559/report.json) completed 67 combined environment/catalog assertions with no script/VM failures and no engine errors. Exact native catalogs retained medical and radio entries; all three weather families and a leap date applied without resetting the clock. Defaults and next-round settings behavior were exercised. This one-round development result does not establish multiplayer replication or repeated-restart reliability.
|
||||
@@ -0,0 +1,31 @@
|
||||
# Mission clock
|
||||
|
||||
Core owns the mission clock through `ERR_TimeService`; no companion addon is required. At successful scenario preparation, the server applies the saved start time once, enables automatic advancement, and sets the engine day duration to `86400 / timeMultiplier` seconds. The native time-and-weather manager advances and replicates the clock. The service does not set time on ticks or change the date, weather, wind or visibility.
|
||||
|
||||
The defaults are **14:00 and 1×** progression. An integer multiplier from **1 to 24** means one real second advances the game clock by that many seconds. Pausing the clock and separate day/night speeds are outside this implementation.
|
||||
|
||||
Administrators use the existing authenticated Core `/esc` command transport:
|
||||
|
||||
| Command | Result |
|
||||
| --- | --- |
|
||||
| `/esc mission time show` | Current round clock and speed, followed by the saved next-round configuration. |
|
||||
| `/esc mission time set 06:15` | Save a start time for the next round. Requires exactly `HH:MM`, from `00:00` to `23:59`. |
|
||||
| `/esc mission speed show` | The same current/saved clock information. |
|
||||
| `/esc mission speed set 4` | Save 4× progression for the next round. Accepts integers 1–24. |
|
||||
| `/esc settings` | Includes `startTimeMinutes` (0–1439) and `timeMultiplier` (1–24), along with existing settings. |
|
||||
|
||||
Changing either setting leaves the running round's clock and speed intact. A new mission instance uses the new values. Repeated startup calls on the same time service cannot reset the clock. A missing native manager or failed native clock configuration prevents the mission from entering the prison phase, with a preparation error; the service attempts to restore native duration/advancement if initialization fails midway.
|
||||
|
||||
Existing valid six-key `rereintroduced.json` files remain valid. Loading supplies 14:00/1× in memory when either newly introduced key is absent and does not rewrite the file. The next explicit successful setting save includes both new keys and preserves all six supported existing values, using the existing verified temporary-file/backup path. Present invalid new values (including fractions and out-of-range numbers) cannot silently default. Missing old required keys still invalidate the file; a valid backup is tried before preserving invalid files and using read-only defaults. Unknown JSON members continue to follow the previous loader behavior and are not retained on save.
|
||||
|
||||
`tools/import_settings.py` supplies clock defaults when importing the supported legacy AI/Intel settings. It does not interpret unrelated original clock settings or modify the source files.
|
||||
|
||||
## Validation
|
||||
|
||||
`python3 tests/test_time_policy.py` runs the actual Enforce parsing/formatting and duration policy bodies through the existing C++ policy harness: every minute round-trips, malformed times are rejected, clock defaults are limited to the two new keys, and multiplier boundaries produce the correct day duration. `python3 tools/check.py` covers existing policies and the expanded runtime/importer schema bounds. These policy checks do not themselves compile Enforce or validate engine behavior. The integrated native run in [040928](evidence/native-2026-09-19-040928/report.json) also passes migration, administration, no-mid-round-change and actual clock progression checks.
|
||||
|
||||
`ERR_NativeTimeProbe` is an authored WORKBENCH-only fixture for centralized native testing. `Run` checks isolated legacy JSON loading without a rewrite, explicit upgrade/reload, invalid or missing values, backup fallback, clock parsing, admin authorization, persistence and restoration of the test settings, native manager configuration, and unchanged current clock/speed after saved changes or repeated startup. `VerifyProgression`, called at least ten engine seconds later, compares elapsed native engine time with actual clock advancement. Neither probe opens a window. Native compilation and these scoped local checks pass in the linked run. Remote replication, multiplayer clock agreement and long-running day/night transitions remain unverified. Seven inherited vehicle resource errors still fail the overall native report.
|
||||
|
||||
Native API references: `ChimeraWorld.GetTimeAndWeatherManager`, and `BaseWeatherManagerEntity.SetTimeOfTheDay`, `SetDayDuration`, `SetIsDayAutoAdvanced`, their getters, and `GetEngineTime`. Signatures were checked through the read-only Enfusion API index and the installed vanilla time-and-weather handler. No original Escapists time implementation was reused.
|
||||
|
||||
The subsequent [041445 Core run](evidence/native-2026-09-19-041445/report.json) completes two escape/restart rounds with the archived 06:15 / 4x input and verifies native advancement in both rounds. The private profile's original primary, backup and temporary settings files were restored exactly afterward. This proves the tested nondefault round initialization, not long-running or network agreement.
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"scripts/Game/generated/InventorySystem/InventoryStorageManagerComponent.c": "7cc07d44ee75e10434e844f5c81044042255f2188963991b134a12a772feabbc",
|
||||
"scripts/Game/generated/InventorySystem/InventoryTask/ScriptedInventoryOperationCallback.c": "d5de8fba8a6a3a3a3d3eb55b7b69f3835e845763b45f6131b248b6895454a9c1",
|
||||
"scripts/Game/AI/Behavior/SCR_AIStaticArtilleryBehavior.c": "ce0875438ac419f352e28e8c9ae6d1f0eed6a124d93ca98bd5a8d5be18409866",
|
||||
"scripts/Game/AI/Group/SCR_AIGroupVehicleManager.c": "f12f465fa5445aac737f1597b514fe0440bc36e6617eb948d4cff717a702506f",
|
||||
"scripts/Game/Entities/SCR_AIGroup.c": "afb923ea5c78a56d4111d7261fa16fa6da5323ce43d865f7bf5534304e9ff54f"
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
# Native casualty removal fixture
|
||||
|
||||
`--project core --smoke casualty-remove` is an opt-in WORKBENCH completion-boundary experiment using the helicopter's existing stock `SCR_RemoveCasualtyUserAction`. It adds no production unload action or resource and makes no manual held-input, remote ownership, multiplayer, or casualty recovery claim.
|
||||
|
||||
The fixture shares the existing test-owned wounded actor, actual five-second unconscious settling interval, real child Mi8 cargo bench entry, physical occupancy and isolated extraction-boundary groundwork. It additionally requires the production mission helicopter to be physically supported and stable before it starts. Only the test-owned casualty is protected against nearby guard gunfire; the original native health-driven unconscious transition remains. The real caller's existing fixture invulnerability is configured by the Core smoke runner, and the fixture restores only the same caller's position.
|
||||
|
||||
After actual boarding it finds the stock remove action whose native compartment equals the occupied bench and whose exterior context is `door_l01_door`. It verifies the one-second duration, nonlocal effect and actual context membership. It selects the door using the same native `PickDoorIndexForPoint(context.GetOrigin())` mechanism as the stock action wrapper. The action's cached door index is set explicitly because this fixture does not select an interaction UI context; its old value is restored on success, failure or cleanup.
|
||||
|
||||
The expected exit is read from that door's native `GetExitTeleportPointInfo()` world transform. The fixture first uses the bench manager's resolved door info. If it exposes a reference instead, the diagnostic records the referenced manager and animation door index before attempting its door info. Missing or unresolved native points fail; no hardcoded door zero or arbitrary exit position is substituted. Native run 080058 verifies this selected door and point on the installed version; other doors and reference-resolution paths remain separate cases.
|
||||
|
||||
The real caller is placed just outside the actual exterior context and allowed one second to settle. Native `CanBeShown` and `CanBePerformed` must accept the actual caller and still-occupied bench before the fixture invokes the real stock `PerformAction` exactly once. That implementation uses native `KickFromVehicle(relevantDoorIndex)`, whose installed API describes use of the teleport exit point. Calling action completion does not exercise holding or canceling user input, network action dispatch, or UI selection.
|
||||
|
||||
An eight-second observation window requires actual vehicle/seat vacancy, an accessible bench, a living still-incapacitated body, no ongoing get-out transition/falling, root horizontal error at most 1.25 metres from the authored exit, and root clearance from terrain between -0.25 and 1.5 metres. Diagnostics include root and aiming positions, pre-exit seated position, authored exit, terrain clearance, ragdoll/link/falling state and native compartment events. These are explicit bounded acceptance measurements, not a full collision-shape safety or clearance survey. No target transform, health recovery, wake or retry is applied after boarding. The entire fixture is bounded to 45 seconds and success uses the existing explicit Core test reset at step 802.
|
||||
|
||||
The previous `casualty-bench` experiment retains its original arbitrary-ground `GetOutVehicle_NoDoor` target and original distance assertion unchanged, now behind default fixture hooks. Its historical failed target-position evidence remains failed and distinct from this stock door-action experiment.
|
||||
|
||||
Local verification: `python3 tests/test_casualty_remove_probe.py` passes extracted production fixture boundary policy and focused action/cleanup/old-mechanism/runner contracts. [080058](evidence/native-2026-09-19-080058/report.json) now passes 66 native assertions with zero engine or script/VM errors. The inherited removal action resolves the occupied bench's `door_l01_door` context and native authored exit. The real conscious caller passes visibility/permission checks; one direct action-completion invocation produces an actual native exit event and clears vehicle/seat occupancy. The test-owned casualty remains living and incapacitated, with no getting-out/falling state and an accessible empty bench. It first exceeds the terrain-clearance bound, then settles within the original eight-second observation window: horizontal exit error is 0.710329m and root terrain clearance is 0.862961m. No post-boarding target teleport, recovery or retry is used.
|
||||
|
||||
The pre-removal isolated extraction check counts the seated casualty. Post-removal checks establish physical helicopter/bench vacancy; they do not recalculate the already-frozen extraction snapshot. This is local stock-action completion evidence, not held input, interaction-context selection, remote action delivery, all-door clearance or multiplayer acceptance. The fixture requests its own reset; no acceptance ledger is changed.
|
||||
|
||||
Merge:
|
||||
|
||||
- New `addons/core/Scripts/Game/ERR/ERR_NativeCasualtyRemoveProbe.c`.
|
||||
- New `tests/test_casualty_remove_probe.py`.
|
||||
- Core smoke and the hidden runner expose `casualty-remove`; base-probe exit hooks preserve the earlier independent `casualty-bench` mechanism case.
|
||||
- This note may become `docs/native-casualty-remove.md`.
|
||||
|
||||
Installed primary source hashes are recorded in `vanilla-reference-sha256.json`. Source inspection was read-only and no original Escapists content was reused.
|
||||
@@ -0,0 +1,45 @@
|
||||
# Native error investigation, 2026-09-19
|
||||
|
||||
Read-only investigation of installed vanilla assets, their actual script implementations, and successor archived runtime logs. No engine launched, installed resource altered, existing mission edited, or logs suppressed.
|
||||
|
||||
## Seven vehicle schema errors: actual source identified
|
||||
|
||||
The 04:12:33 two-round early-helicopter-loss archive traces all seven errors to faction resource initialization, before GameMode initialization. See `docs/evidence/native-2026-09-19-041233/console.log.txt` lines 265–290 in the successor repository.
|
||||
|
||||
| Count | Source asset, extracted line | Invalid property | Logged offset |
|
||||
| --- | --- | --- | --- |
|
||||
| 1 | `Prefabs/Vehicles/Wheeled/M151A2/M151A2.et:548` | `SCR_VehicleDustPerWheel.SlidingTrackMaterial` | 19441 |
|
||||
| 2 | `Prefabs/Vehicles/Wheeled/BRDM2/BRDM2_base.et:1044,1068` | `Wheel.Parent` | 35955, 36915 |
|
||||
| 4 | `Prefabs/Vehicles/Wheeled/BTR70/BTR70_Base.et:1273,1307,1340,1373` | `Wheel.Parent` | 42646, 43645, 44617, 45590 |
|
||||
|
||||
**Correct previous attribution: the SlidingTrackMaterial error is M151A2, not Mi8.** The load chain is FactionManager_USxUSSR → M151A2_M2HB_MERDC → M151A2_M2HB → M151A2. The six wheel errors load through BRDM2_Conflict and BTR70_Conflict variants. Actual extracted property byte positions match the logged parser offsets (the error points just after the keyword).
|
||||
|
||||
Installed `scripts/Game/Vehicle/SCR_VehicleDustPerWheelComponent.c` declares no SlidingTrackMaterial attribute in either its class-data or component class. This is an actual mismatch between installed vanilla resource data and script schema. M151's field concerns wheel dust/track appearance; it is not an extraction seat or flight setting. The BRDM/BTR fields concern wheel differential parent references; do not call them harmless without vehicle-driving validation. Engine internals for the Wheel type are not script source, so the exact replacement field is not established here.
|
||||
|
||||
There is no justified successor code change that repairs these installed base-prefab fields. Adding dummy script attributes, overriding a global vehicle base asset, or excluding errors from the parser would hide the failure rather than validate compatibility. An independently authored narrower faction catalog may eventually avoid loading unneeded vehicles; that would need intentional catalog scope, inherited reference removal, and a real native test. It would not establish those vanilla vehicles as compatible. Keep clean-runtime acceptance failed in the meantime.
|
||||
|
||||
## Intermittent resupply error: teardown validation path exists
|
||||
|
||||
The same archive emits exactly two `SCR_BaseResupplySupportStationComponent needs a entity catalog manager!` errors at 04:13:53.548/.553, immediately before `Starting new playthrough` at .653 and before the new world's entity load. They do not occur during that round's startup/play assertions.
|
||||
|
||||
Actual class name is `SCR_BaseItemSupportStationComponent`; the printed class name is stale in vanilla source. Its `InitValidSetup` at line 30 reads cached `m_EntityCatalogManager` and prints this error if absent. `DelayedInit` at line 17 obtains the manager using `SCR_EntityCatalogManagerComponent.GetInstance()`.
|
||||
|
||||
Crucially, `SCR_BaseSupportStationComponent.OnDelete` at line 1187 also calls virtual `InitValidSetup()` before unsubscribing damage/support events. Thus teardown after the catalog manager has been destroyed can produce the same error as bad initialization. The successor already inherits `SCR_EntityCatalogManagerComponent` through `GameMode_Base.et:58`; adding a second manager is incorrect.
|
||||
|
||||
**Inference requiring a diagnostic runtime test:** dependent support-station deletion occurs after the old round's catalog manager is gone, invalidating the cached reference. The archive timing plus actual OnDelete implementation supports this explanation, but the logs do not name the station owner or call site, so they cannot yet prove it. A delayed-init callback crossing teardown is another possibility: vanilla EOnInit queues DelayedInit, while OnDelete does not explicitly cancel it.
|
||||
|
||||
The opt-in WORKBENCH diagnostic is `ERR_NativeStationTeardownDiagnostic`, enabled by `--station-teardown-diagnostics`. It logs station owner/prefab, `OnDelete` entry and manager availability before calling super unchanged, capped at 64 lines. A two-round restart is required to observe this teardown path. Do not guard-return the error away. If the deletion ordering is confirmed for successor-owned site assets, arrange their disposal in an explicit pre-restart lifecycle step while the game mode manager still exists, and verify site cleanup, extraction result retention, startup rollback, and two restarts. Do not delete extraction occupants or their helicopter on ordinary victory merely to silence teardown.
|
||||
|
||||
Only if source-level teardown correction is necessary should an addon-scoped class fix be considered: initialization must still reject a missing manager during play; OnDelete should cancel its pending DelayedInit and release subscriptions based on what was actually initialized, instead of revalidating destroyed dependencies. This is larger and needs full native lifecycle checks, so no untested override is supplied as a fix.
|
||||
|
||||
## Installed runtime / dedicated server inventory
|
||||
|
||||
The inspected log reports Workbench engine 192142 and game version 1.8.0.13, built 2026-08-21 14:30:18 UTC. Steam manifests currently report game build 24903726 and Tools build 24870687. Those are separate app build IDs and by themselves do not prove a version mismatch.
|
||||
|
||||
The single configured Steam library is `/home/jakub/.local/share/Steam`. Read-only filename inventory of its installed common directory, `/home/jakub/devel`, `/opt`, and `/usr/local/bin` found no ArmaReforgerServer/ReforgerServer/server executable. The installed Reforger runtimes are Windows client and client diagnostic executables, plus Workbench. There are Arma 3 server executables, which are unrelated. Experimental game/tools are installed but were neither opened nor changed. There is no local dedicated-server executable established for the successor's required dedicated/network test.
|
||||
|
||||
Source extraction hashes are in [the audit manifest](evidence/native-error-audit-2026-09-19/source-hashes.json). Extractions in `/tmp/erri-vanilla` came directly from the installed Arma Reforger data PAKs through the existing read-only extractor.
|
||||
|
||||
## Observed diagnostic restart
|
||||
|
||||
[050515](evidence/native-2026-09-19-050515/report.json) completes two Core rounds. At05:08:52 the opt-in diagnostic identifies the US and USSR medical-kit prefabs in the `OnDelete/InitValidSetup` path. Both cached and global catalog references are still valid, while the current game mode is absent. No catalog error occurs. This confirms the relevant teardown call path but does not reproduce the missing-manager condition; the intermittent issue remains open.
|
||||
@@ -0,0 +1,59 @@
|
||||
{
|
||||
"session": "logs_2026-09-18_23-50-58",
|
||||
"game_script_compile": "passed",
|
||||
"prison_phase_start": "passed",
|
||||
"initial_player_spawn": "passed",
|
||||
"full_escape": "not tested",
|
||||
"source_sha256": {
|
||||
"addons/ai/Scripts/Game/ERR/ERR_HQ.c": "953d1a083c2828b11f927e29b6d3c482aaceca228126bc87e4322caa09a28285",
|
||||
"addons/ai/Scripts/Game/ERR/ERR_HQJournal.c": "b3e402cfe92d415f37f666045afb062e6e11670ba03a0ca6f2d9fd4fc3520ac1",
|
||||
"addons/ai/Scripts/Game/ERR/ERR_HQNetwork.c": "92ff2caca52e94c2cc9642dfc8509ce6e9349b257012bade8650bace9231128c",
|
||||
"addons/ai/Scripts/Game/ERR/ERR_HQObservation.c": "36c978ec5f052213ac1236e1398d85063efbfd7ef60fe04f1fc11447fefe1d68",
|
||||
"addons/ai/Scripts/Game/ERR/ERR_HQReport.c": "5371fd6a4d9b0270420c9ad2d56d4623cc5dae834cc1fa9214ceba7fb1ae7129",
|
||||
"addons/ai/Scripts/Game/ERR/ERR_HelicopterAvailability.c": "60eaef2f6d4b2fd44861c5a4434ef97e732e40a5ff7401e2da451ed2dd9c2762",
|
||||
"addons/ai/Scripts/Game/ERR/ERR_MortarPrediction.c": "470dd196ed64800c697d24c09d1344bacd2502587fac76af4ee0edae2563092d",
|
||||
"addons/ai/Scripts/Game/ERR/ERR_MortarSalvo.c": "697c01f479df6c505a41d984a29c02002e3052114dafa2ec6252ae55e2979a2b",
|
||||
"addons/ai/addon.gproj": "5f559db8f526700db11e6ae763f5245f19b7006fc68c56e4c09fb6f940bdf2a1",
|
||||
"addons/chat/Missions/ERR_Everon.conf": "76f3ac0d21b585654beac7ddd68e3c8cbdd66dbfe909b17b04838fa813a7c29b",
|
||||
"addons/chat/Missions/ERR_Everon.conf.meta": "0a23c98bf83873536c65fa17d38dea33a1d7b9e4ab210f90633ff688abcc551f",
|
||||
"addons/chat/Scripts/Game/ERR/ERR_AdminCommands.c": "618f17cbe62d5d68a310876e64920903d5d1a93814c81f7666f3a99fdefae38a",
|
||||
"addons/chat/Scripts/WorkbenchGame/ERR/ERR_ValidateWorldPlugin.c": "1471d018ddc6202175fee1d7fcf6087d9eb605dd9303c94b4cb55a4eff38125b",
|
||||
"addons/chat/addon.gproj": "ea1587e0174cf795334d306c71d99b06797fc891427cd57b6cab6e21cf0e4e0e",
|
||||
"addons/core/Prefabs/ERR/Extraction.et": "d95d311de0231cf669440a10ef3d68014b70067e50b8bdfb05db637cfc7ed628",
|
||||
"addons/core/Prefabs/ERR/Extraction.et.meta": "c2a838633001e2e3a202d39cb33aa744ebcd996017ad032359069641b5d13853",
|
||||
"addons/core/Prefabs/ERR/GameMode.et": "99c23968bca58f38821bd7a686c4cb13cf565a79dc84e7d93c7ee27cdf7a2604",
|
||||
"addons/core/Prefabs/ERR/GameMode.et.meta": "106769cd34525c9d440057072836cb7401a6752148c40edd7fe61c03bd58328c",
|
||||
"addons/core/Prefabs/ERR/Prison.et": "b13200bc4b5179c597e475e542aea9124d410cff2c8942c95fdb0a9a1f20999f",
|
||||
"addons/core/Prefabs/ERR/Prison.et.meta": "2e426ef3de68f4107907854b51e818bc11d84649a01c538e3f18dd9ebec766bb",
|
||||
"addons/core/Prefabs/ERR/PrisonDoor.et": "22d16eaee7fcdf7f54d143bf237484f39b403f2634aa849d0ad8e4ca574475ac",
|
||||
"addons/core/Prefabs/ERR/PrisonDoor.et.meta": "b8f3db52bf186426026668fbb9d633c3cbd4d438ab301fba880398f6a0e781c2",
|
||||
"addons/core/Prefabs/ERR/Radio.et": "5dd128f2bb0161830b201a415a160714871cc80d16029b84df5cecae2d361929",
|
||||
"addons/core/Prefabs/ERR/Radio.et.meta": "bc91137b68ba550217914fb8892bb44d7e1920e4a1086f3e506623832a44212f",
|
||||
"addons/core/Scripts/Game/ERR/ERR_Actions.c": "adf93245e6d78c59b9839599d157a0d2b2b93ea93b3d1ae52e2904dd6c288266",
|
||||
"addons/core/Scripts/Game/ERR/ERR_Actors.c": "17ec4e87858ba87175d890b2a6150f655378afe90e1d7cc3605bb16b5fc3b477",
|
||||
"addons/core/Scripts/Game/ERR/ERR_FactionCatalog.c": "1989948bf7658011e716820da80fbdd53880817a020a3055f4059fb5b233d62f",
|
||||
"addons/core/Scripts/Game/ERR/ERR_GameMode.c": "6f2983cf2c5c411999a61e87be720b43658e79dee59cd1bc165be29dc9374f25",
|
||||
"addons/core/Scripts/Game/ERR/ERR_Location.c": "7e6fa49a458643998ea26b0a9fa499670bbe998fc660301a6186f7dd2977c14a",
|
||||
"addons/core/Scripts/Game/ERR/ERR_MissionRules.c": "f7abc38ad8fdc375ce7fa63a65f0bade027d22b37e09de5e3f94ba8c3c63cc41",
|
||||
"addons/core/Scripts/Game/ERR/ERR_ScenarioComponent.c": "7d4395aed4ef3b565435984d28db62771c0567cb913c13f2e5ec27d07735f008",
|
||||
"addons/core/Scripts/Game/ERR/ERR_Settings.c": "349d0d9c5c13bd4dd528681180c78fa612418de2351030a002bab195ce981b7e",
|
||||
"addons/core/Scripts/Game/ERR/ERR_SpawnLogic.c": "6c3588569c7207930642a69ffc48c5fd0c18236afe0bd3575ffd55627c2d243c",
|
||||
"addons/core/Scripts/Game/ERR/ERR_Supplies.c": "f39e7f534e6f306b3d8991187800f3a9a74b5771c505c05144439ef6f331eefb",
|
||||
"addons/core/Worlds/ERR_Everon.ent": "22324bc7eb0d80dec8a1f3bd61a9df9201b72f749f4e751766b0c9d0b7d46b87",
|
||||
"addons/core/Worlds/ERR_Everon.ent.meta": "19d1903ca72baa326b4724a6791d0da1104a1e53f3f31dc1ca41a856efd68e83",
|
||||
"addons/core/Worlds/ERR_Everon_Layers/default.layer": "f1a058bd315c7d01d464715ac9f4e18ae3d2432551d094a9afbd4c9c5a2a9416",
|
||||
"addons/core/addon.gproj": "231274e6b62302f32c65f9ff31de2ce8a9e51e1c8d12c87deeec82ae1f40de46",
|
||||
"addons/intel/Scripts/Game/ERR/ERR_IntelService.c": "ff8d49d9d662834125f51a55f375918d8c3212e0a1a660234e454bdf7213b7b5",
|
||||
"addons/intel/addon.gproj": "d0ced242cefb220a5cccd6779d61fda9bc55581701b9f78bcf13c09d92ddbcbe",
|
||||
"addons/map/Materials/ERRM_MapRenderTarget.emat": "9877c5b175c5f30dd80bea36c711b21ab38219aa7075adf9ae79932e1d4c76bc",
|
||||
"addons/map/Materials/ERRM_MapRenderTarget.emat.meta": "5ee1a705f8011a44020ca2691f5ccc17d44bf596fef9a36e98d1f267eb58fab0",
|
||||
"addons/map/Prefabs/Items/Equipment/ERRM_SharedFieldMap.et": "30dee8e9eab459ea32a7d835a9fb89d43df47708057cab829f067b25a24cd581",
|
||||
"addons/map/Prefabs/Items/Equipment/ERRM_SharedFieldMap.et.meta": "59093e9072c50d99c86da7609c87541016da5bcf92b98d99db4c524e1c8e0e8d",
|
||||
"addons/map/Scripts/Game/ERR/ERR_DiscoveryMap.c": "ee9be2d313488224b3d52853e3fbe36bb225611d6a69c628b2a6a8efca8fc104",
|
||||
"addons/map/Scripts/Game/ERR/ERR_ScenarioMap.c": "75fa1d742129ef7f33c005cd48f56db7f49ee7bde3c5428532b0b501b032b0a3",
|
||||
"addons/map/Scripts/Game/ERRMap/ERRM_SharedMapComponent.c": "ac7c2b72596bd655a389d4b9fdf7448e94cca137c009388eab0db1a9365ded02",
|
||||
"addons/map/UI/layouts/ERRMap/SharedMapRenderTarget.layout": "49a2da4181b94d42174f58c7f9b6bf2207116c99427d61ff1c212092ac7db4d2",
|
||||
"addons/map/UI/layouts/ERRMap/SharedMapRenderTarget.layout.meta": "5c846445cc089e2e08899ba703059d4adb805ff30ab5a16409a3cd59718cbd54",
|
||||
"addons/map/addon.gproj": "1b371e5e01ea9fa46e76570fecb8aaa3a9298e34cba7ccca8a6bdb5ca86eb46a"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
# Native initial guard cancellation fixture
|
||||
|
||||
`--project core --smoke guard-cancel` runs a bounded WORKBENCH-only test in a disposable world. It does not recreate any mission site, refill stock, register groups with HQ, assign a player, or change normal guard population behavior. Three separate instances of a test subclass of `ERR_SiteService` own one six-slot successor guard group each. The subclass only supplies the owned-group portion of a PENDING preparation; it calls the unchanged production `Stop` and `Rollback` methods.
|
||||
|
||||
The first group is stopped twice in the same script call as creation, after verifying that native `EOnInit` has initialized its cached group utility, its all-members initialization has not completed, and no initial member or native dispatch has occurred. This rejects the native ignore-spawning shortcut and a cancellation made before initialization. It stays alive to expose a late request instead of hiding cancellation behind deletion. The second group is allowed to receive actual native dispatch until it has between one and five physical members. The following fixture tick stops it twice, outside the native dispatch stack, after that dispatch can finish re-enqueuing the partial request. It also remains alive. The third group is an uncancelled control and must finish its six-member native population while both cancelled groups remain unchanged for at least fifteen seconds.
|
||||
|
||||
Installed `SCR_AIGroup.GetSpawnQueueSize()` always returns zero for compatibility, and the generated `ChimeraAIWorld` interface exposes enqueue/purge but no raw queue query. Therefore this test does not claim to measure pending queue length. A WORKBENCH-only `ExpandOneMember` override counts calls only on explicitly tagged fixture groups and always calls unchanged `super.ExpandOneMember()`. Zero new dispatches plus stable physical member identities, observed alongside a successfully populated control, is the evidence for effective cancellation. Normal groups are not tagged.
|
||||
|
||||
After observation, each fixture owner rolls back once. The test retains weak references to every physical partial/control member and verifies that the three groups and all their characters are actually deleted. It then waits six seconds for late dispatches and verifies that the original mission site groups and READY service remain intact. Native errors remain visible to the ordinary raw-log checker. The fixture fails rather than claiming coverage if a partial squad cannot be observed before it fills, if the control cannot complete, or if the overall ninety-second deadline expires.
|
||||
|
||||
This fixture has not yet been run natively. Its evidence will cover the installed engine, tested timing and one disposable server world, not arbitrary multiplayer timing or performance acceptance.
|
||||
|
||||
Primary installed sources: `scripts/Game/Entities/SCR_AIGroup.c` (`EOnInit`, `RequestSpawn`, `ExpandOneMember`, `GetSpawnQueueSize`, `DespawnMembers`) and `scripts/Game/generated/AI/ChimeraAIWorld.c` (`PurgeSpawnRequestsForGroup`). No original Escapists code or assets are reused.
|
||||
|
||||
Native cancellation now passes in [073601](evidence/native-2026-09-19-073601/report.json): 68 assertions, no engine/script errors. Empty and partial groups remain stable through a fifteen-second observation while the uncancelled control fills. Owned rollback deletes all captured actors/groups, and the original mission groups remain unchanged.
|
||||
@@ -0,0 +1,57 @@
|
||||
{
|
||||
"session": "logs_2026-09-18_23-35-08",
|
||||
"game_script_compile": "passed",
|
||||
"prison_phase_start": "passed",
|
||||
"full_escape": "not tested",
|
||||
"source_sha256": {
|
||||
"addons/ai/Scripts/Game/ERR/ERR_HQ.c": "953d1a083c2828b11f927e29b6d3c482aaceca228126bc87e4322caa09a28285",
|
||||
"addons/ai/Scripts/Game/ERR/ERR_HQJournal.c": "b3e402cfe92d415f37f666045afb062e6e11670ba03a0ca6f2d9fd4fc3520ac1",
|
||||
"addons/ai/Scripts/Game/ERR/ERR_HQNetwork.c": "92ff2caca52e94c2cc9642dfc8509ce6e9349b257012bade8650bace9231128c",
|
||||
"addons/ai/Scripts/Game/ERR/ERR_HQObservation.c": "36c978ec5f052213ac1236e1398d85063efbfd7ef60fe04f1fc11447fefe1d68",
|
||||
"addons/ai/Scripts/Game/ERR/ERR_HQReport.c": "5371fd6a4d9b0270420c9ad2d56d4623cc5dae834cc1fa9214ceba7fb1ae7129",
|
||||
"addons/ai/Scripts/Game/ERR/ERR_HelicopterAvailability.c": "60eaef2f6d4b2fd44861c5a4434ef97e732e40a5ff7401e2da451ed2dd9c2762",
|
||||
"addons/ai/Scripts/Game/ERR/ERR_MortarPrediction.c": "470dd196ed64800c697d24c09d1344bacd2502587fac76af4ee0edae2563092d",
|
||||
"addons/ai/Scripts/Game/ERR/ERR_MortarSalvo.c": "697c01f479df6c505a41d984a29c02002e3052114dafa2ec6252ae55e2979a2b",
|
||||
"addons/ai/addon.gproj": "5f559db8f526700db11e6ae763f5245f19b7006fc68c56e4c09fb6f940bdf2a1",
|
||||
"addons/chat/Missions/ERR_Everon.conf": "76f3ac0d21b585654beac7ddd68e3c8cbdd66dbfe909b17b04838fa813a7c29b",
|
||||
"addons/chat/Missions/ERR_Everon.conf.meta": "0a23c98bf83873536c65fa17d38dea33a1d7b9e4ab210f90633ff688abcc551f",
|
||||
"addons/chat/Scripts/Game/ERR/ERR_AdminCommands.c": "618f17cbe62d5d68a310876e64920903d5d1a93814c81f7666f3a99fdefae38a",
|
||||
"addons/chat/Scripts/WorkbenchGame/ERR/ERR_ValidateWorldPlugin.c": "1471d018ddc6202175fee1d7fcf6087d9eb605dd9303c94b4cb55a4eff38125b",
|
||||
"addons/chat/addon.gproj": "ea1587e0174cf795334d306c71d99b06797fc891427cd57b6cab6e21cf0e4e0e",
|
||||
"addons/core/Prefabs/ERR/Extraction.et": "d95d311de0231cf669440a10ef3d68014b70067e50b8bdfb05db637cfc7ed628",
|
||||
"addons/core/Prefabs/ERR/Extraction.et.meta": "c2a838633001e2e3a202d39cb33aa744ebcd996017ad032359069641b5d13853",
|
||||
"addons/core/Prefabs/ERR/GameMode.et": "99c23968bca58f38821bd7a686c4cb13cf565a79dc84e7d93c7ee27cdf7a2604",
|
||||
"addons/core/Prefabs/ERR/GameMode.et.meta": "106769cd34525c9d440057072836cb7401a6752148c40edd7fe61c03bd58328c",
|
||||
"addons/core/Prefabs/ERR/Prison.et": "b13200bc4b5179c597e475e542aea9124d410cff2c8942c95fdb0a9a1f20999f",
|
||||
"addons/core/Prefabs/ERR/Prison.et.meta": "2e426ef3de68f4107907854b51e818bc11d84649a01c538e3f18dd9ebec766bb",
|
||||
"addons/core/Prefabs/ERR/PrisonDoor.et": "22d16eaee7fcdf7f54d143bf237484f39b403f2634aa849d0ad8e4ca574475ac",
|
||||
"addons/core/Prefabs/ERR/PrisonDoor.et.meta": "b8f3db52bf186426026668fbb9d633c3cbd4d438ab301fba880398f6a0e781c2",
|
||||
"addons/core/Prefabs/ERR/Radio.et": "c10a112b7434e8c3e489d9a894460ee915b6b57bec90982e5572b2667c3c890d",
|
||||
"addons/core/Prefabs/ERR/Radio.et.meta": "bc91137b68ba550217914fb8892bb44d7e1920e4a1086f3e506623832a44212f",
|
||||
"addons/core/Scripts/Game/ERR/ERR_Actions.c": "adf93245e6d78c59b9839599d157a0d2b2b93ea93b3d1ae52e2904dd6c288266",
|
||||
"addons/core/Scripts/Game/ERR/ERR_Actors.c": "17ec4e87858ba87175d890b2a6150f655378afe90e1d7cc3605bb16b5fc3b477",
|
||||
"addons/core/Scripts/Game/ERR/ERR_FactionCatalog.c": "1989948bf7658011e716820da80fbdd53880817a020a3055f4059fb5b233d62f",
|
||||
"addons/core/Scripts/Game/ERR/ERR_GameMode.c": "6f2983cf2c5c411999a61e87be720b43658e79dee59cd1bc165be29dc9374f25",
|
||||
"addons/core/Scripts/Game/ERR/ERR_Location.c": "7e6fa49a458643998ea26b0a9fa499670bbe998fc660301a6186f7dd2977c14a",
|
||||
"addons/core/Scripts/Game/ERR/ERR_MissionRules.c": "f7abc38ad8fdc375ce7fa63a65f0bade027d22b37e09de5e3f94ba8c3c63cc41",
|
||||
"addons/core/Scripts/Game/ERR/ERR_ScenarioComponent.c": "04feefdb40f10653d1f8e5b5465018274f38efae25b1bf9b463ba0d6513091e4",
|
||||
"addons/core/Scripts/Game/ERR/ERR_Settings.c": "912150d45833a91d446a10644be8a5758c23f17cebd84031787bc1538222bb0a",
|
||||
"addons/core/Scripts/Game/ERR/ERR_SpawnLogic.c": "db09584d32f6e9902414010f60f5d29af98b8abff04e1d14bcd04b5627f16051",
|
||||
"addons/core/Scripts/Game/ERR/ERR_Supplies.c": "f39e7f534e6f306b3d8991187800f3a9a74b5771c505c05144439ef6f331eefb",
|
||||
"addons/core/Worlds/ERR_Everon.ent": "22324bc7eb0d80dec8a1f3bd61a9df9201b72f749f4e751766b0c9d0b7d46b87",
|
||||
"addons/core/Worlds/ERR_Everon.ent.meta": "19d1903ca72baa326b4724a6791d0da1104a1e53f3f31dc1ca41a856efd68e83",
|
||||
"addons/core/Worlds/ERR_Everon_Layers/default.layer": "2ab127447e793eeea04893f7eb22718b56283fa446926944843c33d4f3de6d86",
|
||||
"addons/core/addon.gproj": "231274e6b62302f32c65f9ff31de2ce8a9e51e1c8d12c87deeec82ae1f40de46",
|
||||
"addons/intel/Scripts/Game/ERR/ERR_IntelService.c": "ff8d49d9d662834125f51a55f375918d8c3212e0a1a660234e454bdf7213b7b5",
|
||||
"addons/intel/addon.gproj": "d0ced242cefb220a5cccd6779d61fda9bc55581701b9f78bcf13c09d92ddbcbe",
|
||||
"addons/map/Materials/ERRM_MapRenderTarget.emat": "9877c5b175c5f30dd80bea36c711b21ab38219aa7075adf9ae79932e1d4c76bc",
|
||||
"addons/map/Materials/ERRM_MapRenderTarget.emat.meta": "5ee1a705f8011a44020ca2691f5ccc17d44bf596fef9a36e98d1f267eb58fab0",
|
||||
"addons/map/Prefabs/Items/Equipment/ERRM_SharedFieldMap.et": "30dee8e9eab459ea32a7d835a9fb89d43df47708057cab829f067b25a24cd581",
|
||||
"addons/map/Prefabs/Items/Equipment/ERRM_SharedFieldMap.et.meta": "59093e9072c50d99c86da7609c87541016da5bcf92b98d99db4c524e1c8e0e8d",
|
||||
"addons/map/Scripts/Game/ERR/ERR_DiscoveryMap.c": "4f59121bb4fed5da244472b30653eafc4b4e9b58807a7f155f47e215e85812f3",
|
||||
"addons/map/Scripts/Game/ERRMap/ERRM_SharedMapComponent.c": "ac7c2b72596bd655a389d4b9fdf7448e94cca137c009388eab0db1a9365ded02",
|
||||
"addons/map/UI/layouts/ERRMap/SharedMapRenderTarget.layout": "49a2da4181b94d42174f58c7f9b6bf2207116c99427d61ff1c212092ac7db4d2",
|
||||
"addons/map/UI/layouts/ERRMap/SharedMapRenderTarget.layout.meta": "5c846445cc089e2e08899ba703059d4adb805ff30ab5a16409a3cd59718cbd54",
|
||||
"addons/map/addon.gproj": "1b371e5e01ea9fa46e76570fecb8aaa3a9298e34cba7ccca8a6bdb5ca86eb46a"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
# Native medical effects fixture
|
||||
|
||||
`ERR_NativeMedicalProbe` is an opt-in WORKBENCH-only Core fixture. It owns two ordinary configured prisoner characters and three real stock-type items: one dressing and two saline bags. It never wounds, transfers inventory from, changes consciousness on, or deletes the actual player. It does not change production health settings, thresholds, regeneration or medicine configuration.
|
||||
|
||||
The fixture waits for character initialization, inserts the items into the healer's inventory, and checks that a healthy casualty rejects both treatment types. It wounds an actual left-arm hit zone and adds vanilla bleeding, then seeds the casualty's blood 100 units below its native unconsciousness threshold. The initial blood reduction is a scripted casualty condition. Subsequent blood changes are left to native bleeding and healing: five seconds later, the fixture requires further actual blood loss and unconsciousness.
|
||||
|
||||
Treatment uses each real `SCR_ConsumableItemComponent.ApplyItemEffect` with the item's configured effect, deletion policy and native animation-parameter data. This is the same completion boundary reached by a successful native item action. It deliberately does not claim that a human-facing action, animation, proximity prompt or inventory menu completed. The dressing must be physically deleted and native bleeding stopped. Saline must move into the casualty's native treatment slot and install exactly one saline damage effect. A second bag must be rejected as already applied and remain a physical inventory item.
|
||||
|
||||
The bag runs its unchanged native 90-second infusion. The fixture samples blood, unconsciousness, attached bags and saline effects, with diagnostics every ten seconds. It requires substantial native blood restoration and actual regained consciousness without calling `SetUnconscious`, restoring hit-zone health, or advancing effect time artificially. It then requires the bag's native deletion and release of its slot and damage effect, preserving the spare bag.
|
||||
|
||||
`Tick(now)` returns `0` while pending, `1` on success and `-1` on failure. It has a 120-second internal deadline, including initialization. `Stop()` is idempotent and deletes only its recorded items and characters, so interrupted runner shutdown cannot leave fixture stock or casualty actors in the mission. The native delayed saline deletion routine is null-safe if its owned item was deleted during fixture cleanup. This cleanup behavior is source-grounded; interruption during a real treatment animation, disconnects, casualty carrying/loading, morphine, tourniquet use and multiplayer recovery remain untested.
|
||||
|
||||
## Integration into the existing Core smoke runner
|
||||
|
||||
No shared `ERR_GameMode`, `ERR_NativeBaseSmoke` or runner tool file is changed by this handoff. Suggested integration:
|
||||
|
||||
1. Add outcome `medical` to the existing runner choices; run the Core smoke world with `-errBaseSmoke 1 -errSmokeOutcome medical`.
|
||||
2. Add `protected ref ERR_NativeMedicalProbe m_ERRBaseMedicalProbe;` to the WORKBENCH smoke mode, plus `protected void ERR_StopMedicalProbe() { if (m_ERRBaseMedicalProbe) m_ERRBaseMedicalProbe.Stop(); }`. Register it on `OnStop()` alongside other probe cleanup; call it from `ERR_BaseCheck` failure cleanup too.
|
||||
3. In step 0 after the real prisoner has spawned, before the ordinary escape actions, branch on outcome `medical`: construct `new ERR_NativeMedicalProbe(this)`, set step `600`, then return. The fixture handles spawning its own actors on its first tick.
|
||||
4. Before the ordinary step dispatch, poll step 600. On `-1`, remove the BaseTick call. On `1`, set step `602` and request `Transition(ERR_Phase.DEFEAT)` solely as an explicit fixture reset.
|
||||
5. In the terminal-result handler, handle outcome `medical` before the ordinary victory assertion. Require `current == ERR_Phase.DEFEAT && m_ERRBaseStep == 602`, then print the dedicated fixture completion. Keep the existing global 210-second deadline.
|
||||
|
||||
The local repository isolation/resource/policy checks pass for this source. Native Enforce compilation and execution are pending the parent's centralized hidden and muted runner. No medical/manual/multiplayer acceptance is marked passed by this addition.
|
||||
|
||||
## Observed native run
|
||||
|
||||
[062406](evidence/native-2026-09-19-062406/report.json) completed all24 assertions with no script/VM failures. Blood fell to1783.02 with active bleeding and unconsciousness. After real dressing and saline application, bleeding stopped; blood rose past2188.59 and native consciousness returned. The unchanged infusion completed, removed its bag/effect and left the rejected spare in inventory. The overall report still fails on seven inherited vehicle catalog schema errors. This evidence is tied to its launch source manifest and does not qualify later edits or manual/multiplayer treatment.
|
||||
@@ -0,0 +1,54 @@
|
||||
# Native mortar first shot and cancellation fixture
|
||||
|
||||
`ERR_NativeMortarFiringProbe` is opt-in WORKBENCH code for `--project chat --smoke mortar-fire --rounds 1`. It observes one real HQ-authorized shot, then explicitly stops support and watches for duplicate orders/shots or replacement ammunition. This is not a full eight-shot salvo, hit-accuracy, real enemy perception, remote-client or FPS test. No engine run was performed while authoring it.
|
||||
|
||||
The probe waits for the existing authored gun/four-person crew, native expansion, operational state and physical manpack route. It snapshots exactly 27 unique inventory shells. A bounded eight-point terrain survey checks no characters/vehicles in a 400m square and applies the production settlement/friendly safety checks to the target and all prospective salvo offsets. An inert fixture-owned vanilla intel folder supplies target identity. The observation describing that identity as a stationary contact is explicitly synthetic; it is queued on the existing battery RTO's actual uplink. There is no direct contact-list insertion or battery Order call. Normal HQ acceptance, mortar scheduling, real downlink, native artillery activity, aim, final shell transfer and native OnWeaponFired remain unchanged. No report is refreshed or retimestamped to make firing pass.
|
||||
|
||||
The independent native-event hook records only a non-null projectile from this gun. It rejects duplicate entity callbacks and requires this report/order, an open committed shot and fresh aim with positive flight time. Later polling requires matching battery projectile counts and exactly one original inventory shell consumed. It stops support only on that later tick, never inside the firing callback, and verifies unchanged order/projectile/ammunition counts for another twelve seconds. Already-fired projectiles remain engine-owned; cleanup does not delete or move them. Inventory loss and actual projectile origin are recorded, but impact/flight accuracy is not measured.
|
||||
|
||||
Cleanup removes only the test report and orders referring to its target, cancels its battery order if still present, deletes the inert target and detaches the static observer. It leaves mission guns/crew, inventory and physics alone. Success intentionally stops the support service, so the parent fixture must end/reset this disposable mission. On failure, stop the probe and end the fixture; do not continue ordinary gameplay with the test report. Existing contacts or an already-tasked battery cause a diagnostic refusal rather than erasing unrelated reports. Begin this case immediately after the real initial player is admitted. If actual perception has already produced competing reports, diagnose and choose a disclosed fixture arrangement; do not suppress production observation or relax report freshness.
|
||||
|
||||
The startup wait is bounded to 180 seconds, report-to-first-shot to 90 seconds, and stopped observation to 12 seconds. Battery status/failure/route/activity/aim diagnostics are emitted every 5 seconds. A native failure is useful evidence; successful node or inventory-request returns never substitute for a projectile.
|
||||
|
||||
## Parent-owned integration
|
||||
|
||||
Copy only `addons/ai/Scripts/Game/ERR/ERR_NativeMortarFiringProbe.c` and `tests/test_native_mortar_probe.py`, plus this document. The new source adds no resource identities and no production behavior outside WORKBENCH. Preserve the separate Battery/System/Firing fixes; the probe relies only on their existing public counters, identity fields, `CountShells`, `SiteStatus`, `Operational`, and normal HQ routes.
|
||||
|
||||
In the existing Chat `ERR_NativeSmoke.c` layer (not another modded mode), add:
|
||||
|
||||
```c
|
||||
protected bool m_ERRTestMortarFire;
|
||||
protected ref ERR_NativeMortarFiringProbe m_ERRMortarFire;
|
||||
```
|
||||
|
||||
After outcome parsing, set `m_ERRTestMortarFire = outcome == "mortar-fire";` and give that case a 330000ms outer smoke deadline. Add `if (m_ERRMortarFire) m_ERRMortarFire.Stop();` to the existing cleanup helper used by error/OnStop. In the step0 branch, after the usual real-player/contracts checks and before existing inventory/death branches:
|
||||
|
||||
```c
|
||||
if (m_ERRTestMortarFire)
|
||||
{
|
||||
DamageManagerComponent.Cast(m_ERRSmokePlayer.FindComponent(DamageManagerComponent)).EnableDamageHandling(false);
|
||||
m_ERRMortarFire = new ERR_NativeMortarFiringProbe(this);
|
||||
m_ERRSmokeStep = 150;
|
||||
return;
|
||||
}
|
||||
```
|
||||
|
||||
Before normal step dispatch:
|
||||
|
||||
```c
|
||||
if (m_ERRSmokeStep == 150)
|
||||
{
|
||||
int result = m_ERRMortarFire.Tick(now);
|
||||
if (result < 0) { ERR_Check(false, "native mortar firing probe failed; see diagnostics"); return; }
|
||||
if (result == 1) { m_ERRSmokeStep = 151; Transition(ERR_Phase.DEFEAT); }
|
||||
return;
|
||||
}
|
||||
```
|
||||
|
||||
In `ERR_SmokePhase`, after the terminal-phase guard but before generic victory/death expectations, handle this case only if `current == ERR_Phase.DEFEAT && m_ERRSmokeStep == 151`. Mark smoke done, remove its polling callback, run existing cleanup and print `ERR SMOKE COMPLETE: native HQ radio to first mortar projectile and explicit stop; fixture reset requested`. A premature natural defeat is a failure. This completion means the targeted mechanism and cancellation observations passed, not a completed escape.
|
||||
|
||||
Add `mortar-fire` to the runner smoke choices; explicitly require Chat and one round for this case. Keep Core unsupported. Run with an outer timeout at least 400 seconds. Add `test_native_mortar_probe.py` to `tools/check.py` if retaining the probe. Its C++ harness executes the real native-event evidence method and checks wrong-gun, null/duplicate, uncommitted, wrong-source, missing/stale aim, stopped-observer and post-stop event refusal. It does not simulate the native firing behavior.
|
||||
|
||||
## Further required cases
|
||||
|
||||
After a real first-shot pass, qualify the complete eight-shot salvo under unchanged 60-second contact freshness, finite donor-to-gunner transfer, receiver-radio loss before delivery, stale report during supply/aim, crew/gun loss, depletion, and Stop during an accepted but unfinished shell transfer. The fixture's first shot may not require resupply because the native gunner already owns shells; do not claim transfer-race coverage from this result. Real visual perception→radio→HQ→fire and multiplayer need separate evidence.
|
||||
@@ -0,0 +1,21 @@
|
||||
# Native objective widget lifecycle
|
||||
|
||||
`ERR_ObjectiveDetails.c` extends vanilla task details only while bound to this scenario's `erri-mission-` tasks. It refreshes open instructions when native display data changes. Before rebinding or detaching it removes that display subscription and cancels pending native `CheckOverflow` callbacks, whose assignee label widgets are about to be deleted. Assignment refreshes cancel earlier overflow work before replacing labels too.
|
||||
|
||||
These native invokers are static on `SCR_Task` and survive entity deletion. Ownership is tracked separately from weak task references. On successor detail-widget detach, the production handler removes the five vanilla global task-event subscriptions (assignee added/removed, UI visibility, visibility and ownership), removes the task-entry visual-change route when present, and releases its task. The installed vanilla detach path handles the remaining widget and manager callbacks. Other task types continue through the native behavior; this is not a global task UI replacement.
|
||||
|
||||
The WORKBENCH-only `ERR_NativeObjectiveProbe` runs with the existing explicit Core smoke opt-in. Its close/reopen check binds and rebinds an actual mission objective using the native layouts, emits unchanged state through the five native task event invokers, and checks one callback per event. It then removes the widget through its normal hierarchy lifecycle with no probe-only unsubscribe helper. A retained test handler records any late native task or overflow calls; such calls fail the fixture before they can dereference deleted widgets. This instrumentation does not repair subscriptions or cancel callbacks.
|
||||
|
||||
After one normal 500ms smoke tick, exceeding the native overflow delay of 100ms, the fixture verifies no delayed callback reached the closed handler. It reopens native details and checks current title, instructions, task assignment and hidden map control. `BeginRound` clears static probe failure state once per smoke round; ordinary cleanup preserves failures. The added check consumes approximately one second including resuming the existing smoke sequence and stays within its unchanged 210-second deadline.
|
||||
|
||||
This is a bounded local lifecycle regression. Rebinding uses the same current task; normal mission progression separately recreates the widget for each new objective. Unchanged-state event emissions are synthetic, and these checks do not establish remote client replication or manual UI acceptance. Native validation is recorded below.
|
||||
|
||||
## Short task-deletion regression
|
||||
|
||||
The explicit Core smoke outcome `objective-ui` runs the normal close/reopen check and then creates its own `erri-mission-probe-teardown` native BaseTask. It assigns the local executor and initializes a hidden native details panel, causing native assignee overflow work to be scheduled. Vanilla allows one assigned task per executor, so this briefly moves the local assignment; the fixture restores the real mission objective immediately after deleting its isolated task and also during failure cleanup. The real task is never deleted.
|
||||
|
||||
The fixture calls native `SCR_TaskSystem.DeleteTask` and asserts that both the fixture's task reference and the details handler's native task reference actually become null. It then closes the panel through production detach and waits 500ms for any leaked overflow callback. No fixture code clears those references before the assertion or cancels the overflow work. It verifies the real objective and its restored assignment again, then requests an explicit test reset at smoke step 902. This case adds two short asynchronous waits and avoids the radio/extraction sequence. The ownership flag in production keeps cancellation active after weak entity references disappear.
|
||||
|
||||
Runner integration: add `objective-ui` to the existing `--smoke-outcome` choices and map it to the Core smoke world with `-errBaseSmoke 1 -errSmokeOutcome objective-ui`. Treat its terminal DEFEAT as a fixture-requested reset only when the dedicated step-902 completion assertion passes. Native compilation and execution of this additional case remain pending.
|
||||
|
||||
The final [053124](evidence/native-2026-09-19-053124/report.json) fixture passes 30 assertions with no script/VM exceptions and verified launch/stopped-source/log hashes. It confirms actual task deletion clears weak references, detaches the panel, restores the real objective assignment and leaves no late callbacks after 500ms. The critical five invokers are static and are removed without requiring a surviving task entity. Seven inherited vanilla resource errors remain; manual and remote-client UI acceptance remain pending. Earlier failed callback and diagnostic iterations remain in the validation archive.
|
||||
@@ -0,0 +1,13 @@
|
||||
# Explicit ordinary diagnostic splash handling
|
||||
|
||||
The installed GameLib `SplashScreen.Load()` creates IntroSplashScreen on initial startup and ScenarioLoadingScreen on addon reload, without consulting `noSplash`. Both installed layouts contain a `SCR_WidgetExportRuleRoot` component. That class is declared in the later Game module, so creating either layout before Game compiles produces the observed unknown-class error. In ordinary run `game-2026-09-19-080004`, this happened at 08:00:05.617 and 08:00:09.371; both completed Game-module compilations followed later. This identifies the resource/module ordering problem independently of mission gameplay.
|
||||
|
||||
Core's independently authored GameLib extension honors the already supplied `-noSplash` only together with the explicit successor `-errOrdinaryScenario core` or `chat` diagnostic argument. It skips these diagnostic splash layouts instead of asking the GUI to instantiate their unavailable Game components. Unflagged or visible startup delegates unchanged to vanilla. It preserves the vanilla splash sequence counter once per instance and logs the selected diagnostic behavior once. It adds no replacement layout, asset, dummy class, identity or error filter.
|
||||
|
||||
The installed base lifecycle supports a deliberately absent root: `BaseLoadingAnim.Show()` requests `Load()` when null, `Unload()` deletes the root, and `SplashScreen.Update()` immediately returns when null. The extension handles repeated Load calls without creating UI or advancing its counter again. Native Show/Hide and script compilation still need a centralized ordinary run. A clean diagnostic run with this option would validate gameplay startup without splash UI, **not** normal visible splash loading. All errors from resources that are actually loaded remain failures.
|
||||
|
||||
The official [startup parameters](https://community.bistudio.com/wiki/Arma_Reforger:Startup_Parameters) describe `-noSplash` as skipping splash screens. This implementation makes the explicit diagnostic honor that requested behavior at its GameLib layout-loading boundary; it does not claim an undocumented engine switch exists.
|
||||
|
||||
The actual Load method is executed in a source-local C++ regression across both valid projects, absent/invalid flags, repeated calls and a recreated instance. No native GUI or engine is launched by that test.
|
||||
|
||||
Offline identity is separate. The ordinary header run created a native local controller and reached successor admission, then withheld spawning because its identity could not bind. A supported local platform/session initialization path would need to supply an acceptable native identity; `-noBackend` is not evidence of such initialization. This change does not initialize accounts, contact the backend, relax admission or invent identities. The installed utility also has a non-dedicated name-derived PeerTool fallback, so its return is not necessarily a verified platform identity.
|
||||
@@ -0,0 +1,95 @@
|
||||
# Ordinary game startup validation
|
||||
|
||||
`tools/headless_game.py` prepares a bounded **ordinary game** run using the installed stable `ArmaReforgerSteam.exe`, rather than Workbench. It loads either Core or the full Chat dependency chain and the authored successor scenario header. It does not activate any WORKBENCH smoke plugin or add a server flag.
|
||||
|
||||
Example, only when other runners have stopped:
|
||||
|
||||
```sh
|
||||
python3 tools/headless_game.py --compat /tmp/erri-headless-compat --profile /tmp/erri-game-profile --project core --timeout 180
|
||||
```
|
||||
|
||||
Use `--project chat` for the companion dependency chain. The program constructs `-addonsDir <successor>/addons -addons <selected addon GUID> -errOrdinaryScenario <core|chat> -profile <private profile> -noBackend -noSound -noSplash -noThrow -disableCrashReporter -logconsole`. Engine arguments follow the official [Arma Reforger startup parameters](https://community.bistudio.com/wiki/Arma_Reforger:Startup_Parameters). `-errOrdinaryScenario` is our explicit diagnostic argument, handled by the successor launcher described below. The server-only `-server` parameter is deliberately absent. The official startup-parameter page was checked again on 2026-09-19: it documents `-noSplash` for skipping splash screens and `-noThrow` for disabling error dialogs. Neither option promises to omit layout resource loading or to ignore logged errors.
|
||||
|
||||
## Isolation
|
||||
|
||||
- Read-only `/proc` enumeration refuses **any** existing ArmaReforgerSteam/SteamDiag game instance before launch, including a Wine/Proton launcher command or truncated process name. Unreadable process state fails closed. It does not stop the existing game.
|
||||
- The disposable cloned prefix must already exist outside Steam. The same `.erri-workbench.lock` used by the Workbench runner prevents concurrent use. Existing Wine, Proton, Gamescope and Windows process candidates carrying that prefix also cause refusal. Readable native process metadata excludes unrelated services; ambiguous candidates fail closed. The read-only `--inspect-processes` mode reports all process blockers without launching, locking, configuring audio or creating profiles. Do not use the actual Steam compatdata prefix or user game profile.
|
||||
- The game profile is separate from source, Steam and the prefix tree. An existing directory must have this runner's exact private-profile marker. Unexpected symlinks/addons are rejected; only the installed vanilla data link is created. This does not import the user's game profile or workshop subscription folder.
|
||||
- Gamescope uses its headless backend; no main/right-monitor window is requested. `-noSound`, a unique muted null sink and routing only the run's identified audio streams prevent test output. No default sink or unrelated application stream is changed.
|
||||
- Cleanup targets only the launched process group and the locked disposable prefix. Only the null sink module created for this run is unloaded. Cleanup errors are retained as failures; source/log sealing requires confirmed prefix cleanup.
|
||||
|
||||
This program never calls Steam account, friend, workshop, login or profile APIs. It does not modify Steam configuration. `-noBackend` disables the game backend; it is not a claim that the proprietary Steam-enabled executable performs no platform initialization internally.
|
||||
|
||||
## What constitutes success
|
||||
|
||||
A successful run requires all of:
|
||||
|
||||
1. A native `Module: Game` log with neither `WORKBENCH` nor `ENF_WB` in its defines.
|
||||
2. The selected native mission header and actual `GetSystemsConfig()` both match `MissionSystems.conf`, followed by the normal successor preparation transition `phase 0 -> 1`, proving the ordinary game loaded and initialized the mission.
|
||||
3. Another 15 seconds (configurable 5–120) without native errors, startup failure or leaked `ERR SMOKE` fixture output.
|
||||
4. The launched processes stopped, with unchanged addon bytes and exact final raw-log provenance.
|
||||
|
||||
Timeout, process exit before readiness, unexpected multiple log sessions, any native engine/script error or unverified module defines fails. It does not infer success from an executable starting or a blank window.
|
||||
|
||||
The ordinary game log may require a disclaimer/menu interaction or may reject offline startup in a particular installed build. This runner does not click past dialogs, change account state, weaken checks, or silently switch to Workbench. Such a run remains incomplete and its captured log should determine the next bounded action.
|
||||
|
||||
The source snapshot is captured before process launch and sealed after cleanup, using the existing provenance helpers. `runner.json`, `game-startup-report.json` and `headless-launch.log` accompany the raw game session. The result is `game-started`, **not** `smoke-completed`; existing release qualification therefore cannot count it as a completed escape/restart fixture. Existing archive tooling can retain it as additional evidence, subject to its ordinary error checks and provenance validation.
|
||||
|
||||
## Current evidence
|
||||
|
||||
Thirty source-local tests exercise process refusal (including inaccessible `/proc` data), prefix/profile separation, exact game arguments and readiness/error gates. They import the runner without launching processes, audio, Steam or the engine. The first host launch is preserved in [game-2026-09-19-072609](evidence/game-2026-09-19-072609/report.json). It failed on a vanilla intro-splash unknown-class error before Game compilation. GameLib defines included ENF_WB, so the executable choice and startup resource path remain under investigation. No ordinary-game startup pass is claimed.
|
||||
|
||||
The intended gate is production script compilation/startup validation with WORKBENCH undefined. It is not ordinary player input, a completed escape, manual vehicle use, multiplayer/dedicated-server behavior, an FPS benchmark.
|
||||
|
||||
## Installed executable selection and first failed attempt
|
||||
|
||||
The first Diag attempt, `logs_2026-09-19_07-26-09`, initialized GameLib with `ENF_WB` and `ENABLE_DIAG`. Its vanilla IntroSplashScreen then reported `Unknown class SCR_WidgetExportRuleRoot` before Game-module compilation completed. The runner retained failure; it did not mask the resource error or count startup.
|
||||
|
||||
Read-only installed binary inspection distinguishes three executables:
|
||||
|
||||
| Executable | Bytes | SHA-256 |
|
||||
|---|---:|---|
|
||||
| ArmaReforgerSteam.exe | 37,272,632 | `1d221a990fa16c78fe02f685a7ba1330be115ca93cd3b641e67e5d3f1b40d9c9` |
|
||||
| ArmaReforgerSteamDiag.exe | 40,060,472 | `51f941dee28bda7865e2428d7fc92fcbe7c5c7ff666caf642c0ff23c2aced457` |
|
||||
| ArmaReforger_BE.exe | 1,489,648 | `f1d9117d6c503857fc28ad8be2c828e1ae6124d3055b1fae13ad7e99e3f01d82` |
|
||||
|
||||
The regular and Diag programs are x86-64 PE executables; the separate BE launcher is a much smaller x86 PE. The runner selects the installed regular game directly. It does not invoke the BE launcher or silently fall back to another program.
|
||||
|
||||
Diag contains `ENF_WB` and `ENABLE_DIAG` strings in the script-initialization constant block; regular contains neither. Both contain the same module/defines log format, so the existing explicit module-evidence gate remains appropriate. Combined with the actual Diag GameLib log, this supports a built-in Diag configuration explanation, not an addon-defined WORKBENCH macro. The regular attempt below confirms its GameLib runtime defines lack WORKBENCH/ENF_WB; a completed Game-module compile is still required. Binary strings alone are not a compilation result.
|
||||
|
||||
The installed splash layout contains SCR_WidgetExportRuleRoot at lines15–18, while that class is authored in `scripts/Game/UI/Components/SCR_WidgetExportRule.c:82`. The log loads the layout after GameLib compilation but before Game completes. This establishes the observed module-order mismatch; it does not prove that regular execution avoids it. No layout override, class stub, error filter, or native acceptance relaxation is included.
|
||||
|
||||
The regular executable was attempted in `logs_2026-09-19_07-32-31`. GameLib compiled without WORKBENCH/ENF_WB. The splash layout still reported the same unknown class at 07:32:32.696 despite `-noSplash` being present in the logged command. `Compiling Game scripts` followed at 07:32:32.770, but no completed `Module: Game` or mission readiness was captured before fail-fast cleanup. This is failed startup evidence, not an ordinary-game compilation pass.
|
||||
|
||||
Installed `scripts/Game/UI/Components/SCR_WidgetExportRule.c:82` declares `SCR_WidgetExportRuleRoot` outside any WORKBENCH guard; only its helper methods are guarded later. Thus ordinary-build exclusion of that class is not supported by the source. The observed layout load precedes Game compilation, which is consistent with a module-order issue but does not establish its engine-internal cause. There is no supported alternative splash-bypass flag established by this audit; the existing documented `-noSplash` remains. No asset stub, installed-resource edit, or log filter is proposed.
|
||||
|
||||
Read-only evidence SHA-256: extracted vanilla `SCR_WidgetExportRule.c` = `3a4b5dc3a8669bf20d903277d249d41ee3ae7e1e74d2c329ed31d435624fa4b5`; raw regular-run `console.log` from `logs_2026-09-19_07-32-31` = `20684f6328c7e955d1f08edf16e470e19efc71284856701b43ed31811693536f`.
|
||||
|
||||
|
||||
## Optional failure diagnostic grace
|
||||
|
||||
`--failure-grace 30` keeps a failed ordinary run alive for at most 30 seconds after the first observed native/startup error so downstream Game compilation or mission-startup diagnostics can reach the raw log. The default is `0`, preserving immediate failure cleanup. Only integer values 0–30 are accepted before any launch or audio mutation.
|
||||
|
||||
The first failure stays latched. Repeated errors never reset its timestamp, and later Game compilation/readiness cannot turn the run into a success. The grace expires at the earlier of first failure plus the configured grace or the original absolute run timeout, measured with a monotonic clock. Process exit ends observation immediately. Cleanup, source snapshots, post-stop sealing and raw-log hashing use the same path as ordinary failure.
|
||||
|
||||
`runner.json` records `failure_grace_seconds`, `failure_observed_during_polling` and `first_failure_elapsed_seconds` (relative to the run's monotonic start, or null). `game-startup-report.json` preserves the final raw error counts and marks an earlier observed failure even if the process later truncated/replaced its log; it never invents error lines. Any later readiness remains failed and does not qualify a release. Safety/preflight failures and cleanup errors do not receive this logging grace.
|
||||
|
||||
The twelve additional source-local tests exercise default fail-fast behavior, repeated-error deadlines, readiness before/after error, absolute-timeout truncation, early process exit, log-replacement failure retention, continuous clean settle behavior, exit at the settle boundary, CLI defaults and bound rejection. They use synthetic observations and launch no native process. The extended capture in [074505](evidence/game-2026-09-19-074505/report.json) confirms completed Game compilation and preserves the subsequent guard-spawn crash.
|
||||
|
||||
|
||||
## External crash reporter
|
||||
|
||||
The runner adds documented `-disableCrashReporter` to disable automatic external crash reporting. `-noBackend` controls backend HTTP communication, and did not prevent the separate reporter in ordinary run `logs_2026-09-19_07-45-05`: its raw log records `Crash reporter started`, `Sending analytical data` and `Crash Analytics: OK`. The official [Crash Report documentation](https://community.bistudio.com/wiki/Arma_Reforger:Crash_Report) names `-disableCrashReporter` for stopping automatic sending; the installed regular executable contains that exact parameter. This changes reporting behavior only: local errors, crash logs and failed results remain available. The runner does not use `-silentCrashReport` or its old name `-noCrashDialog`, which automatically send reports without a dialog according to the official [startup parameters](https://community.bistudio.com/wiki/Arma_Reforger:Startup_Parameters). No test has intentionally induced another crash to validate the option.
|
||||
|
||||
|
||||
## Header-based ordinary launch candidate
|
||||
|
||||
Direct `-world Worlds/ERR_Everon.ent` did compile the ordinary Game module (5,728 files without WORKBENCH/ENF_WB) in `logs_2026-09-19_07-45-05`, created a real local controller and reached the strict identity gate. It then crashed on the first vanilla USSR squad leader spawn. Its world-systems log named no config; the comparable Workbench run explicitly loaded BaseGameModeSystems. `MissionSystems.conf` inherits BaseGameModeSystems, which inherits ChimeraSystemsConfig including PawnEntitySystem, character animation/damage/control systems and others. Missing configured systems is therefore a grounded cause to investigate, not a proven native crash diagnosis. No identity workaround is included.
|
||||
|
||||
The ordinary runner now starts the normal main menu and explicitly requests `-errOrdinaryScenario core` or `chat`. Core owns the opt-in `ERR_OrdinaryScenarioLaunch.c`; Chat adds only its own header/addon selection override, preserving the dependency direction. Both are absent from WORKBENCH compilation and inert without the explicit argument. The launcher queues one attempt per game instance, validates the selected installed successor header/addon pair and only calls the native transition from an idle main menu. Active worlds and pending native transitions are never replaced. World cleanup cancels an outstanding callback. No click, user identity, audit callback or backend state is synthesized.
|
||||
|
||||
The exact installed API is `GameStateTransitions.RequestScenarioChangeTransition(ResourceName missionOrWorld, ResourceName worldSystemsConfig, string addonList)`: its documentation accepts a mission header or world. Vanilla `game.c:1246` uses it in `PlayGameConfig`. Core passes `{AD62322D5213C440}Missions/ERR_Everon_Base.conf`; Chat passes `{C1E20667DCE324ED}Missions/ERR_Everon.conf`; both specify `{C50579A2EC48E8EF}Configs/Systems/MissionSystems.conf`. Once a successor world starts, the diagnostic only inspects its active header and actual `GetSystemsConfig()`; the runner requires that verification plus ordinary module/phase/settle evidence. Existing splash errors still permanently fail the run, even if downstream header verification succeeds.
|
||||
|
||||
This uses the documented [native transition API](https://community.bistudio.com/wikidata/external-data/arma-reforger/ArmaReforgerScriptAPIPublic/interfaceGameStateTransitions.html), not an invented `-scenario` engine parameter. The official `-worldSystemsConfig` startup parameter is marked Diag-only, so it is not assumed to configure the regular executable. Native compilation and actual header transition are pending; failure to reach an idle main menu is retained as a failed diagnostic, without retries that could replace gameplay.
|
||||
|
||||
The runner now additionally requires a matching local-participant marker after normal finalized admission: the actual local controller must own the living body, the canonical roster must accept it, and the mission must be in PRISON. Header/world readiness alone can no longer pass while player admission is absent. This new observation is gated by the ordinary diagnostic flag and never creates a body or identity. Its ordinary native compilation is pending.
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
# Ordinary offline identity diagnosis
|
||||
|
||||
Installed `RplMode` values are None=0, Client=1, Listen=2 and Dedicated=3. The observed regular offline run's mode=0 therefore does not enter the dedicated-server branch of `SCR_PlayerIdentityUtils`. A native local controller exists; the remaining issue is identity conversion/binding, not absence of a player object.
|
||||
|
||||
The installed utility calls `BackendApi.GetPlayerIdentityId` and only attempts its non-dedicated PeerTool name fallback when the returned string is **empty**. A nonempty null UUID sentinel or malformed string bypasses that fallback. This is a possible explanation, not yet the observed raw result. The installed UUID type remains a string: invalid-format strings are considered null, and both empty and all-zero strings are null despite not being string-equal. The installed `int.ToString(8, true)` uses hexadecimal formatting (the boolean means `hex`), so decimal width growth is not a supported explanation for the fallback result.
|
||||
|
||||
The optional admission diagnostic now records raw cached identity string length, emptiness, UUID null/format status, equality to the null UUID sentinel, returned helper length/format status and the actual Dedicated comparison. Raw length=-1 denotes an unavailable backend API object. It is compiled outside WORKBENCH and executes only for the explicit `errOrdinaryScenario core/chat` diagnostic. It logs neither identity contents nor player name contents, does not call authentication/initialization methods, creates no replacement identity and leaves strict `Players().Bind` behavior unchanged.
|
||||
|
||||
Interpretation of the next native sample:
|
||||
|
||||
- rawLength>0, rawNullSentinel=1: native backend supplied the initialized null UUID; vanilla's empty-string test bypasses its fallback.
|
||||
- rawLength>0, rawNull=1, rawNullSentinel=0: a nonempty invalid/native sentinel value bypasses fallback.
|
||||
- rawEmpty=1, dedicated=0, helperLength>0, helperFormatValid=0: vanilla returned its fallback string, but UUID validation rejected its format.
|
||||
- rawEmpty=1, dedicated=0, helperLength=0: the expected fallback did not produce a string; inspect native/local initialization rather than inferring from player-name length.
|
||||
|
||||
None of these observations authorizes using a name-derived or generated ordinary player identity. A valid production fix requires evidence for a supported native local platform/session identity path and its reconnect/account guarantees. Offline diagnostic admission remains failed until that exists; no backend contact or identity policy change is included here.
|
||||
|
||||
Native `game-2026-09-19-081359` confirms the first case: `rawLength=36 rawEmpty=0 rawNull=1 rawFormatValid=1 rawNullSentinel=1 helperLength=36 helperFormatValid=1 dedicated=0`. The normal local audit callback occurred; the helper returned the native null sentinel unchanged. A narrowly scoped standalone round-local roster key is being designed separately; network identity behavior remains unchanged.
|
||||
@@ -0,0 +1,9 @@
|
||||
# Ordinary launcher callback ownership
|
||||
|
||||
The first ordinary compilation of the header launcher rejected callbacks on `ArmaReforgerScripted`: native `Game` is not a `Managed` callback owner. `ERR_OrdinaryScenarioLaunchRequest : Managed` now owns the single queued attempt and captures the already selected project, header and addon. The game retains that helper and cancels it before delegating unchanged world cleanup to `super`.
|
||||
|
||||
The helper refuses duplicate queueing and marks its attempt finished before checking or requesting a native transition. Cancellation both marks it finished and removes the callback, so a retained/stale callback cannot launch another world. The existing explicit CLI gate, main-menu/active-world/transition guards, exact addon/header validation, header/system verification and unchanged native transition call remain. Chat's existing header-selection overrides do not change. No player/audit/authentication state is touched.
|
||||
|
||||
[080004](evidence/game-2026-09-19-080004/report.json) verifies ordinary Game compilation without WORKBENCH/ENF_WB, one Core header request, native MissionSystems initialization, header verification and the normal preparation-to-prison transition. The previous callback-owner compile error is absent and no guard-spawn crash is captured in this bounded run. This verifies the compiled helper and exercised transition; cancellation races and repeated requests were not triggered by the native run.
|
||||
|
||||
The overall run remains failed: two vanilla intro-splash `SCR_WidgetExportRuleRoot` errors are retained, and player identity binding fails so the local spawn is withheld. No identity bypass, manual input, complete escape or multiplayer success is claimed. Source bytes were unchanged, the private runner confirmed cleanup, and the failure remains archived. No engine was launched while authoring the callback fix itself.
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"scripts/GameLib/LoadingScreens/SplashScreen.c": "2df52f7be83c69b056f0022e27b47cb39af5d797577cdd529b99fa07cc385cf5",
|
||||
"scripts/GameLib/gameLib.c": "a7bc8fe46847237d6dbc0a2ca67bcaf8a52933bd0e1672988da6c7a607e52964",
|
||||
"scripts/Game/UI/Components/SCR_WidgetExportRule.c": "3a4b5dc3a8669bf20d903277d249d41ee3ae7e1e74d2c329ed31d435624fa4b5",
|
||||
"UI/layouts/Menus/MainMenu/IntroSplashScreen.layout": "832072a8c803126c9e71d1a78b1442fe9f907e4907848049b84f9cb981c832ea",
|
||||
"UI/layouts/Menus/LoadingScreen/ScenarioLoadingScreen.layout": "c98568661b22fcecc1ef7115c8fce24b989346e50282226a7cd881a10969ac49"
|
||||
}
|
||||
@@ -0,0 +1,539 @@
|
||||
{
|
||||
"basis": "Read-only original package path inventory. Category assignment is an inference from file names and directories, not a code audit or proof of feature equivalence. All original script entries have a tracked responsibility; none is marked complete solely from this mapping.",
|
||||
"acceptance": "docs/acceptance.json",
|
||||
"features": [
|
||||
{
|
||||
"id": "alternate_starts",
|
||||
"title": "Helicopter-crash and hideout starts",
|
||||
"scope": "later",
|
||||
"status": "pending",
|
||||
"original_scripts": [
|
||||
"Scripts/Game/Components/ESCT_HelicrashHelicopterComponent.c",
|
||||
"Scripts/Game/Components/Start/ESCT_HelicrashStartComponent.c",
|
||||
"Scripts/Game/Components/Start/ESCT_HideoutStartComponent.c",
|
||||
"Scripts/Game/Entities/ESCT_HelicrashLocationHolder.c"
|
||||
],
|
||||
"replacement_files": [],
|
||||
"remaining": "Author separate layouts and progression rules after the prison release."
|
||||
},
|
||||
{
|
||||
"id": "spectators",
|
||||
"title": "Spectators and follow cameras",
|
||||
"scope": "first-release",
|
||||
"status": "partial",
|
||||
"original_scripts": [
|
||||
"Scripts/Game/Camera/Components/ESCT_AssignTargetManualCameraComponent.c",
|
||||
"Scripts/Game/Camera/Components/ESCT_AttachToPlayerManualCameraComponent.c",
|
||||
"Scripts/Game/Camera/Components/ESCT_LookAtTargetManualCameraComponent.c",
|
||||
"Scripts/Game/Camera/Components/ESCT_OrbitDistanceManualCameraComponent.c",
|
||||
"Scripts/Game/Camera/Components/ESCT_OrbitPlayerManualCameraComponent.c",
|
||||
"Scripts/Game/Camera/Components/ESCT_SpectatorUIManualCameraComponent.c",
|
||||
"Scripts/Game/Components/Editor/ESCT_SpectatorMenuLayoutEditorComponent.c",
|
||||
"Scripts/Game/Components/PlayerController/ESCT_SpectatorComponent.c",
|
||||
"Scripts/Game/GameMode/Components/ESCT_AmbientCameraDirectorComponent.c",
|
||||
"Scripts/Game/UI/ScreenEffects/ESCT_SpectatorBleedingScreenEffect.c"
|
||||
],
|
||||
"replacement_files": [
|
||||
"addons/core/Scripts/Game/ERR/ERR_Observer.c"
|
||||
],
|
||||
"remaining": "Verify remote streaming, target changes, death/reconnect and camera presentation on real clients."
|
||||
},
|
||||
{
|
||||
"id": "environment",
|
||||
"title": "Time, weather, lights and night options",
|
||||
"scope": "first-release",
|
||||
"status": "partial",
|
||||
"original_scripts": [
|
||||
"Scripts/Game/AI/ScriptedNodes/Conditions/ESCT_AIDecoIsSunset.c",
|
||||
"Scripts/Game/Actions/ESCT_LightUserAction.c",
|
||||
"Scripts/Game/Actions/ESCT_SwitchLightUserAction.c",
|
||||
"Scripts/Game/Components/ESCT_IndoorLampComponent.c",
|
||||
"Scripts/Game/Components/ESCT_IndoorLampSwitchProxyComponent.c",
|
||||
"Scripts/Game/Editor/Containers/Actions/ESCT_ToggleLocalEditorLimitedNightModeToolbarAction.c",
|
||||
"Scripts/Game/GameMode/ESCT_NightModeGameModeComponent.c",
|
||||
"Scripts/Game/GameMode/Misc/ESCT_TimeOfDay.c",
|
||||
"Scripts/Game/Misc/ESCT_Weather.c",
|
||||
"Scripts/Game/UI/Menus/SetupMenuTabs/ESCT_EnvironmentTab.c"
|
||||
],
|
||||
"replacement_files": [
|
||||
"addons/core/Scripts/Game/ERR/ERR_TimeService.c",
|
||||
"docs/mission-time.md",
|
||||
"addons/core/Scripts/Game/ERR/ERR_EnvironmentService.c",
|
||||
"docs/environment.md"
|
||||
],
|
||||
"remaining": "Local native clock, saved date/weather choices and two real restart rounds pass. Remote agreement, lighting and long-running day/night transitions still require validation."
|
||||
},
|
||||
{
|
||||
"id": "presentation_audio",
|
||||
"title": "Voice, music, feedback and effects",
|
||||
"scope": "later",
|
||||
"status": "pending",
|
||||
"original_scripts": [
|
||||
"Scripts/Game/Components/ESCT_BarrelDamageManager.c",
|
||||
"Scripts/Game/Components/ESCT_BarrelSoundEffectComponent.c",
|
||||
"Scripts/Game/Components/FlareMine/ESCT_ProjectileSpawnerComponent.c",
|
||||
"Scripts/Game/Components/PlayerController/ESCT_EscapistsFeedbackComponent.c",
|
||||
"Scripts/Game/Components/Radio/ESCT_RadioSoundComponent.c",
|
||||
"Scripts/Game/EffectModule/ESCT_RocketBarrageEffectsModule.c",
|
||||
"Scripts/Game/GameMode/Components/ESCT_VoiceoverComponent.c",
|
||||
"Scripts/Game/Misc/ESCT_BarrelFlammableHitZone.c",
|
||||
"Scripts/Game/Misc/ESCT_EscapistsHint.c",
|
||||
"Scripts/Game/Music/ESCT_ApproachHelipadMusic.c",
|
||||
"Scripts/Game/Music/ESCT_DefendRadioMusic.c",
|
||||
"Scripts/Game/Music/ESCT_FlyAwayMusic.c",
|
||||
"Scripts/Game/Systems/ESCT_VoiceoverSystem.c",
|
||||
"Scripts/Game/VON/ESCT_VONController.c"
|
||||
],
|
||||
"replacement_files": [],
|
||||
"remaining": "Review which feedback is required for clear play; author replacements without importing original audio or UI assets."
|
||||
},
|
||||
{
|
||||
"id": "medical",
|
||||
"title": "Health, unconsciousness and casualty handling",
|
||||
"scope": "first-release",
|
||||
"status": "partial",
|
||||
"original_scripts": [
|
||||
"Scripts/Game/Actions/ESCT_LoadCasualtyVehicleUserAction.c",
|
||||
"Scripts/Game/Components/Damage/ESCT_HelicopterDamageManagerComponent.c",
|
||||
"Scripts/Game/Components/ESCT_MedicalStorageArsenalComponent.c",
|
||||
"Scripts/Game/Components/ESCT_PlayerDamageManagerComponent.c",
|
||||
"Scripts/Game/Components/ESCT_StaticHospitalComponent.c",
|
||||
"Scripts/Game/Components/PlayerController/ESCT_WithstandComponent.c",
|
||||
"Scripts/Game/Components/SupportStations/ESCT_LoadCasualtyVehicleSupportStationComponent.c",
|
||||
"Scripts/Game/Enums/ESCT_EHealthType.c",
|
||||
"Scripts/Game/Misc/ESCT_Health.c",
|
||||
"Scripts/Game/Misc/ESCT_PlayerHitZone.c",
|
||||
"Scripts/Game/UI/HUD/ESCT_UnconsciousInfoDisplay.c"
|
||||
],
|
||||
"replacement_files": [
|
||||
"addons/core/Scripts/Game/ERR/ERR_Actors.c",
|
||||
"addons/core/Scripts/Game/ERR/ERR_GameMode.c"
|
||||
],
|
||||
"remaining": "Local native blood-loss treatment, consumed supplies, consciousness recovery, ground casualty loading and vanilla door removal pass bounded fixtures. Verify ordinary input/animation, remote ownership, bleedout, interrupted treatment and flight with casualties."
|
||||
},
|
||||
{
|
||||
"id": "enemy_coordination",
|
||||
"title": "Enemy coordination, support and threat assessment",
|
||||
"scope": "first-release",
|
||||
"status": "partial",
|
||||
"original_scripts": [
|
||||
"Scripts/Game/AI/Behavior/ActivityFeatures/ESCT_AIActivityCallForSupportFeature.c",
|
||||
"Scripts/Game/AI/Behavior/ActivityFeatures/ESCT_AIActivityIllumFlareFeature.c",
|
||||
"Scripts/Game/AI/Behavior/ESCT_AICallForSupportActivity.c",
|
||||
"Scripts/Game/AI/Behavior/ESCT_AICallSupportToBehavior.c",
|
||||
"Scripts/Game/AI/Behavior/ESCT_AIVehicleBehavior.c",
|
||||
"Scripts/Game/AI/Components/ESCT_AIGroupInfoComponent.c",
|
||||
"Scripts/Game/AI/Components/ESCT_AIGroupUtilityComponent.c",
|
||||
"Scripts/Game/AI/Reaction/ESCT_AIGoalReaction.c",
|
||||
"Scripts/Game/AI/ScriptedNodes/Generated/EscapistsSendGoalMessage.c",
|
||||
"Scripts/Game/AI/ScriptedNodes/Generated/EscapistsSendInfoMessage.c",
|
||||
"Scripts/Game/AI/ScriptedNodes/Generated/EscapistsSendOrder.c",
|
||||
"Scripts/Game/AI/ScriptedNodes/Groups/ESCT_AICallSupport.c",
|
||||
"Scripts/Game/AI/ScriptedNodes/Groups/ESCT_AICallSupportTo.c",
|
||||
"Scripts/Game/AI/ScriptedNodes/Messages/ESCT_AIMessage.c",
|
||||
"Scripts/Game/Components/ESCT_EditableSupportComponent.c",
|
||||
"Scripts/Game/Components/ESCT_SupportCallerComponent.c",
|
||||
"Scripts/Game/Components/Heli/ESCT_HeliBehaviourBaseComponent.c",
|
||||
"Scripts/Game/Components/Heli/ESCT_HeliFlyByComponent.c",
|
||||
"Scripts/Game/Components/Heli/ESCT_HeliLoiterComponent.c",
|
||||
"Scripts/Game/Components/Heli/ESCT_HeliStrikeFireComponent.c",
|
||||
"Scripts/Game/Components/Heli/ESCT_HeliStrikeMovementComponent.c",
|
||||
"Scripts/Game/Entities/ESCT_AIGroup.c",
|
||||
"Scripts/Game/Enums/ESCT_ESupportStationType.c",
|
||||
"Scripts/Game/Enums/Support/ESCT_ESupportState.c",
|
||||
"Scripts/Game/Enums/Support/ESCT_ESupportType.c",
|
||||
"Scripts/Game/GameMode/Components/ESCT_WaypointManager.c",
|
||||
"Scripts/Game/Misc/ESCT_AirstrikeConfig.c",
|
||||
"Scripts/Game/Support/ESCT_SupportInfo.c",
|
||||
"Scripts/Game/Support/ESCT_SupportPicker.c",
|
||||
"Scripts/Game/Support/ESCT_SupportPresentationConfig.c",
|
||||
"Scripts/Game/Support/ESCT_SupportSystemConfig.c",
|
||||
"Scripts/Game/Support/SupportTypes/ESCT_HeliLoiterSupport.c",
|
||||
"Scripts/Game/Support/SupportTypes/ESCT_HeliStrikeSupport.c",
|
||||
"Scripts/Game/Support/SupportTypes/ESCT_IlluminationMortarBarrageSupport.c",
|
||||
"Scripts/Game/Support/SupportTypes/ESCT_LightVehicleSupport.c",
|
||||
"Scripts/Game/Support/SupportTypes/ESCT_MortarBarrageBase.c",
|
||||
"Scripts/Game/Support/SupportTypes/ESCT_MortarBarrageSupport.c",
|
||||
"Scripts/Game/Support/SupportTypes/ESCT_QRFSupport.c",
|
||||
"Scripts/Game/Support/SupportTypes/ESCT_QRFVehicleSupport.c",
|
||||
"Scripts/Game/Support/SupportTypes/ESCT_RocketArtillerySupport.c",
|
||||
"Scripts/Game/Support/SupportTypes/ESCT_SmokeMortarBarrageSupport.c",
|
||||
"Scripts/Game/Support/SupportTypes/ESCT_SpecOpsSupport.c",
|
||||
"Scripts/Game/Support/SupportTypes/ESCT_SupportBase.c",
|
||||
"Scripts/Game/Systems/ESCT_SupportSystem.c",
|
||||
"Scripts/Game/Tasks/SupportEntities/ESCT_BaseTaskSupportEntity.c",
|
||||
"Scripts/Game/Tasks/SupportEntities/ESCT_DefendRadioTaskSupportEntity.c",
|
||||
"Scripts/Game/ThreatAssessment/ESCT_ThreatAssessmentConfig.c",
|
||||
"Scripts/Game/Utility/ESCT_GroupDirector.c"
|
||||
],
|
||||
"replacement_files": [
|
||||
"addons/ai/Scripts/Game/ERR/ERR_HQ.c",
|
||||
"addons/ai/Scripts/Game/ERR/ERR_HQNetwork.c",
|
||||
"addons/ai/Scripts/Game/ERR/ERR_MortarSystem.c"
|
||||
],
|
||||
"remaining": "HQ alone coordinates physical forces. Complete support scheduling, mortar firing, aircraft, transport/rearming and losses without spawning responses."
|
||||
},
|
||||
{
|
||||
"id": "ambient",
|
||||
"title": "Ambient patrols, vehicles and civilians",
|
||||
"scope": "first-release",
|
||||
"status": "partial",
|
||||
"original_scripts": [
|
||||
"Scripts/Game/AmbientEvents/AmbientEventTypes/ESCT_AmbientEventBase.c",
|
||||
"Scripts/Game/AmbientEvents/AmbientEventTypes/ESCT_HeliFlybyEvent.c",
|
||||
"Scripts/Game/AmbientEvents/AmbientEventTypes/ESCT_VehiclePatrolEvent.c",
|
||||
"Scripts/Game/AmbientEvents/ESCT_AmbientEventInfo.c",
|
||||
"Scripts/Game/AmbientEvents/ESCT_AmbientEventPicker.c",
|
||||
"Scripts/Game/AmbientEvents/ESCT_AmbientSystemConfig.c",
|
||||
"Scripts/Game/Components/ESCT_AmbientPatrolSpawnPointComponent.c",
|
||||
"Scripts/Game/Components/ESCT_AmbientVehicleSpawnPointComponent.c",
|
||||
"Scripts/Game/Components/ESCT_EditableAmbientEventComponent.c",
|
||||
"Scripts/Game/Components/Locations/ESCT_CivilianPresenceComponent.c",
|
||||
"Scripts/Game/Enums/AmbientEvent/ESCT_EAmbientEventType.c",
|
||||
"Scripts/Game/GameMode/Components/ESCT_AmbientVehicleComponent.c",
|
||||
"Scripts/Game/GameMode/Components/ESCT_CivilianManagerComponent.c",
|
||||
"Scripts/Game/Systems/ESCT_AmbientEventSystem.c",
|
||||
"Scripts/Game/Systems/ESCT_AmbientPatrolSystem.c",
|
||||
"Scripts/Game/Systems/ESCT_AmbientVehicleSystem.c"
|
||||
],
|
||||
"replacement_files": [],
|
||||
"remaining": "Two bounded physical patrol routes and HQ Search preemption/resumption pass local native checks. Qualify perception/report transit, wider population needs, losses and measured runtime cost without alert-driven population duplication."
|
||||
},
|
||||
{
|
||||
"id": "factions",
|
||||
"title": "Faction, group and asset catalogs",
|
||||
"scope": "first-release",
|
||||
"status": "partial",
|
||||
"original_scripts": [
|
||||
"Scripts/Game/EntityCatalog/ESCT_EntityCatalogManagerComponent.c",
|
||||
"Scripts/Game/EntityCatalog/EntityCatalogEntryData/ESCT_EntityCatalogEntryData.c",
|
||||
"Scripts/Game/Enums/ESCT_EFactionType.c",
|
||||
"Scripts/Game/Enums/ESCT_EInsurgentsOption.c",
|
||||
"Scripts/Game/Enums/ESCT_ELookupExclusionType.c",
|
||||
"Scripts/Game/Enums/ESCT_EMilitaryBranchType.c",
|
||||
"Scripts/Game/Enums/ESCT_EUnitRole.c",
|
||||
"Scripts/Game/Factions/ESCT_Faction.c",
|
||||
"Scripts/Game/Factions/ESCT_FactionLookupValue.c",
|
||||
"Scripts/Game/Factions/ESCT_FactionManager.c",
|
||||
"Scripts/Game/Factions/ESCT_PlayerFactionInfo.c",
|
||||
"Scripts/Game/Factions/FactionLookup/ESCT_CharacterLookup.c",
|
||||
"Scripts/Game/Factions/FactionLookup/ESCT_FactionLookup.c",
|
||||
"Scripts/Game/Factions/FactionLookup/ESCT_GroupLookup.c",
|
||||
"Scripts/Game/GameMode/Misc/ESCT_MilBranchInfo.c",
|
||||
"Scripts/Game/Utility/ESCT_EntityCatalogHelper.c"
|
||||
],
|
||||
"replacement_files": [
|
||||
"addons/core/Scripts/Game/ERR/ERR_FactionCatalog.c",
|
||||
"addons/core/Configs/ERR/VanillaFactions.conf"
|
||||
],
|
||||
"remaining": "Narrow successor vanilla catalogs compile and initialize without earlier vehicle-schema errors; preserve required faction, medical, item and radio behavior. Verify remote affiliation and full mission use. Alternative faction packs remain later scope."
|
||||
},
|
||||
{
|
||||
"id": "prison",
|
||||
"title": "Prison layout, locks and initial equipment",
|
||||
"scope": "first-release",
|
||||
"status": "partial",
|
||||
"original_scripts": [
|
||||
"Scripts/Game/Actions/ESCT_LockedDoorUserAction.c",
|
||||
"Scripts/Game/Actions/ESCT_LockpickDoor.c",
|
||||
"Scripts/Game/Components/ESCT_EquipmentSlotArsenalPrisonComponent.c",
|
||||
"Scripts/Game/Components/ESCT_LockedDoorComponent.c",
|
||||
"Scripts/Game/Components/ESCT_PrisonDoorComponent.c",
|
||||
"Scripts/Game/Components/ESCT_WeaponRackArsenalPrisonComponent.c",
|
||||
"Scripts/Game/Components/Start/ESCT_PrisonComponent.c",
|
||||
"Scripts/Game/Components/Start/ESCT_StartAreaComponent.c",
|
||||
"Scripts/Game/Entities/Locations/ESCT_StartArea.c",
|
||||
"Scripts/Game/Enums/ESCT_EStartType.c",
|
||||
"Scripts/Game/GameMode/Misc/ESCT_StartAreaSelector.c",
|
||||
"Scripts/Game/Tasks/ESCT_LockpickTask.c"
|
||||
],
|
||||
"replacement_files": [
|
||||
"addons/core/Prefabs/ERR/Prison.et",
|
||||
"addons/core/Scripts/Game/ERR/ERR_Actions.c"
|
||||
],
|
||||
"remaining": "Manual access, equipment for twelve players, layouts, threat balance and start placement need validation."
|
||||
},
|
||||
{
|
||||
"id": "extraction",
|
||||
"title": "Extraction vehicle and round results",
|
||||
"scope": "first-release",
|
||||
"status": "partial",
|
||||
"original_scripts": [
|
||||
"Scripts/Game/Components/ESCT_EscapeHelicopterComponent.c",
|
||||
"Scripts/Game/Entities/Locations/ESCT_Helipad.c",
|
||||
"Scripts/Game/GameMode/Components/ESCT_WinLoseHandlerComponent.c",
|
||||
"Scripts/Game/GameOverScreen/ESCT_EGameOverTypes.c",
|
||||
"Scripts/Game/UI/GameOverScreens/ESCT_GameOverScreenEscapistsUIComponent.c"
|
||||
],
|
||||
"replacement_files": [
|
||||
"addons/core/Scripts/Game/ERR/ERR_ExtractionService.c",
|
||||
"addons/core/Scripts/Game/ERR/ERR_PlayerEscapeResult.c",
|
||||
"addons/core/Configs/ERR/GameOverScreens.conf"
|
||||
],
|
||||
"remaining": "Physical twelve-character occupancy, local identity/results, initial aircraft settling, ground loading and vanilla casualty removal have native evidence. Manual piloting/boarding, real reconnect, empty-server flight, remote rescue contention and loss/restart acceptance remain."
|
||||
},
|
||||
{
|
||||
"id": "objectives_intel",
|
||||
"title": "Radio objectives, tasks and discovery",
|
||||
"scope": "first-release",
|
||||
"status": "partial",
|
||||
"original_scripts": [
|
||||
"Scripts/Game/Actions/ESCT_RadioAction.c",
|
||||
"Scripts/Game/Actions/ESCT_ReceiveRadioMessageAction.c",
|
||||
"Scripts/Game/Actions/ESCT_TuneRadioFrequencyAction.c",
|
||||
"Scripts/Game/Components/ESCT_LocationMapUIComponent.c",
|
||||
"Scripts/Game/Components/ESCT_StaticInsurgentRadioStationComponent.c",
|
||||
"Scripts/Game/Components/ESCT_StaticRadioStationComponent.c",
|
||||
"Scripts/Game/Entities/ESCT_DefendRadioTaskPresentation.c",
|
||||
"Scripts/Game/Entities/ESCT_Radio.c",
|
||||
"Scripts/Game/Entities/ESCT_RadioSlotEntity.c",
|
||||
"Scripts/Game/Entities/Locations/ESCT_RadioStation.c",
|
||||
"Scripts/Game/GameMode/Components/ESCT_TaskAssignerComponent.c",
|
||||
"Scripts/Game/Systems/ESCT_KnownLocationsSystem.c",
|
||||
"Scripts/Game/Tasks/ESCT_DefendRadioTask.c",
|
||||
"Scripts/Game/Tasks/ESCT_RadioTask.c",
|
||||
"Scripts/Game/Tasks/ESCT_Task.c",
|
||||
"Scripts/Game/Tasks/ESCT_TaskInfoConfig.c",
|
||||
"Scripts/Game/Tasks/ESCT_TriggerTask.c",
|
||||
"Scripts/Game/UI/Components/ESCT_EscapistsMapUIBase.c",
|
||||
"Scripts/Game/UI/Escapists/ESCT_MapEscapistsUI.c",
|
||||
"Scripts/Game/UI/HUD/ESCT_DefendTaskDisplay.c",
|
||||
"Scripts/Game/Utility/ESCT_TaskFuncs.c"
|
||||
],
|
||||
"replacement_files": [
|
||||
"addons/core/Scripts/Game/ERR/ERR_Objectives.c",
|
||||
"addons/core/Scripts/Game/ERR/ERR_DiscoveryService.c",
|
||||
"addons/core/Scripts/Game/ERR/ERR_DiscoveryMap.c",
|
||||
"addons/core/Scripts/Game/ERR/ERR_RadioDefenceService.c",
|
||||
"addons/core/Scripts/Game/ERR/ERR_ObjectiveDetails.c"
|
||||
],
|
||||
"remaining": "Independent radio defence and native task-detail refresh are implemented. Validate visible task/map usability, simultaneous real clients, discovery replication and complete manual objective route."
|
||||
},
|
||||
{
|
||||
"id": "scavenging",
|
||||
"title": "Physical equipment, storage and scavenging",
|
||||
"scope": "first-release",
|
||||
"status": "partial",
|
||||
"original_scripts": [
|
||||
"Scripts/Game/Actions/ESCT_OpenVehicleStorageAction.c",
|
||||
"Scripts/Game/Actions/ESCT_ResourceContainerVehicleLoadAction.c",
|
||||
"Scripts/Game/Actions/ESCT_ResourceContainerVehicleUnloadAction.c",
|
||||
"Scripts/Game/Actions/ESCT_ResourceEntityRefundAction.c",
|
||||
"Scripts/Game/Components/ESCT_EditableStorageComponent.c",
|
||||
"Scripts/Game/Components/ESCT_EditableVehicleStorageComponent.c",
|
||||
"Scripts/Game/Components/ESCT_EquipmentSlotArsenalComponent.c",
|
||||
"Scripts/Game/Components/ESCT_LocationStorageComponent.c",
|
||||
"Scripts/Game/Components/ESCT_StorageArsenalComponent.c",
|
||||
"Scripts/Game/Components/ESCT_WeaponRackArsenalComponent.c",
|
||||
"Scripts/Game/Components/Locations/ESCT_LocationStorageManagerComponent.c",
|
||||
"Scripts/Game/Components/Locations/ESCT_LocationWeaponRackManagerComponent.c",
|
||||
"Scripts/Game/Entities/ESCT_EquipmentSlotEntity.c",
|
||||
"Scripts/Game/Entities/ESCT_StorageSlotEntity.c",
|
||||
"Scripts/Game/Entities/ESCT_WeaponRack.c",
|
||||
"Scripts/Game/Entities/ESCT_WeaponRackSlotEntity.c",
|
||||
"Scripts/Game/Enums/ESCT_EMilitaryCrateType.c",
|
||||
"Scripts/Game/GameMode/Loadout/ESCT_EArsenalGameModeType.c",
|
||||
"Scripts/Game/GameMode/Misc/ESCT_EquipmentInfo.c",
|
||||
"Scripts/Game/Misc/ESCT_ArsenalItem.c",
|
||||
"Scripts/Game/Misc/ESCT_ArsenalItemDisplayData.c",
|
||||
"Scripts/Game/State/ESCT_EquipmentSlotState.c",
|
||||
"Scripts/Game/State/ESCT_StorageState.c"
|
||||
],
|
||||
"replacement_files": [
|
||||
"addons/core/Scripts/Game/ERR/ERR_SiteService.c",
|
||||
"addons/core/Prefabs/ERR/SupplyCache.et"
|
||||
],
|
||||
"remaining": "Two independent clue caches and optional medical/outpost stock are authored. Manual access, route balance, medical treatment, destruction and network ownership remain unverified; finite stock replaces refill systems."
|
||||
},
|
||||
{
|
||||
"id": "vehicles",
|
||||
"title": "Usable vehicles, locks, alarms and navigation",
|
||||
"scope": "first-release",
|
||||
"status": "partial",
|
||||
"original_scripts": [
|
||||
"Scripts/Game/Actions/ESCT_BreakIntoVehicleAction.c",
|
||||
"Scripts/Game/Actions/ESCT_CompartmentHoldAction.c",
|
||||
"Scripts/Game/Actions/ESCT_GetInUserAction.c",
|
||||
"Scripts/Game/Actions/ESCT_OpenVehicleDoorUserAction.c",
|
||||
"Scripts/Game/Components/ESCT_CarAlarmComponent.c",
|
||||
"Scripts/Game/Components/ESCT_CharacterSpawnVehicleAssistantComponent.c",
|
||||
"Scripts/Game/Components/ESCT_VehicleForceEjectComponent.c",
|
||||
"Scripts/Game/Components/ESCT_VehicleOccupantReactionComponent.c",
|
||||
"Scripts/Game/Components/Locations/ESCT_LocationVehicleManagerComponent.c",
|
||||
"Scripts/Game/Components/Locations/ESCT_LocationVehiclePatrolManagerComponent.c",
|
||||
"Scripts/Game/Entities/ESCT_VehicleSpawnPoint.c",
|
||||
"Scripts/Game/Global/ESCT_VehicleDirector.c",
|
||||
"Scripts/Game/Misc/ESCT_VehicleHitZone.c",
|
||||
"Scripts/Game/State/ESCT_PatrolVehicleState.c",
|
||||
"Scripts/Game/State/ESCT_VehicleSpawnPointState.c",
|
||||
"Scripts/Game/Utility/ESCT_RoadNavigation.c",
|
||||
"Scripts/Game/Vehicle/ESCT_VehicleControllerComponent.c"
|
||||
],
|
||||
"replacement_files": [
|
||||
"addons/core/Scripts/Game/ERR/ERR_SiteService.c",
|
||||
"docs/ground-transport.md"
|
||||
],
|
||||
"remaining": "Finite optional vanilla ground transport passes native parking, seats, engine, fuel depletion and loss checks. Manual driving/access, route navigation, repair, alarms and remote vehicle ownership remain validation/integration work."
|
||||
},
|
||||
{
|
||||
"id": "population",
|
||||
"title": "Locations, compositions and population ownership",
|
||||
"scope": "first-release",
|
||||
"status": "partial",
|
||||
"original_scripts": [
|
||||
"Scripts/Game/Components/ESCT_LocationItemComponent.c",
|
||||
"Scripts/Game/Components/ESCT_LocationPatrollerComponent.c",
|
||||
"Scripts/Game/Components/ESCT_PopulatedBuildingComponent.c",
|
||||
"Scripts/Game/Components/ESCT_StaticLocationComponent.c",
|
||||
"Scripts/Game/Components/ESCT_StaticOutpostComponent.c",
|
||||
"Scripts/Game/Components/Locations/CompositionComponents/ESCT_CheckpointCompositionComponent.c",
|
||||
"Scripts/Game/Components/Locations/CompositionComponents/ESCT_LocationCompositionComponent.c",
|
||||
"Scripts/Game/Components/Locations/ESCT_BaseCharacterManager.c",
|
||||
"Scripts/Game/Components/Locations/ESCT_LocationCharacterManagerComponent.c",
|
||||
"Scripts/Game/Components/Locations/ESCT_LocationComponent.c",
|
||||
"Scripts/Game/Components/Locations/ESCT_LocationItemManagerComponent.c",
|
||||
"Scripts/Game/Components/Locations/ESCT_LocationMilBuildingManager.c",
|
||||
"Scripts/Game/Components/Locations/ESCT_LocationPatrolManagerComponent.c",
|
||||
"Scripts/Game/Components/Locations/ESCT_LocationTurretManagerComponent.c",
|
||||
"Scripts/Game/Entities/ESCT_DisableLocationEntity.c",
|
||||
"Scripts/Game/Entities/ESCT_RandomLocationHolder.c",
|
||||
"Scripts/Game/Entities/Locations/ESCT_Checkpoint.c",
|
||||
"Scripts/Game/Entities/Locations/ESCT_City.c",
|
||||
"Scripts/Game/Entities/Locations/ESCT_Location.c",
|
||||
"Scripts/Game/Entities/Locations/ESCT_LocationBase.c",
|
||||
"Scripts/Game/Enums/ESCT_ELocationSpawnReason.c",
|
||||
"Scripts/Game/Enums/ESCT_ELocationType.c",
|
||||
"Scripts/Game/GameMode/Misc/ESCT_LocationConfig.c",
|
||||
"Scripts/Game/GameMode/Misc/ESCT_LocationPreparer.c",
|
||||
"Scripts/Game/LocationState/ESCT_EntityState.c",
|
||||
"Scripts/Game/LocationState/ESCT_LocationState.c",
|
||||
"Scripts/Game/Misc/ESCT_LocationPatrolPoint.c",
|
||||
"Scripts/Game/State/ESCT_CharacterState.c",
|
||||
"Scripts/Game/Systems/ESCT_LocationStateSystem.c",
|
||||
"Scripts/Game/Systems/ESCT_LocationSystem.c",
|
||||
"Scripts/Game/Utility/ESCT_LocationCatalog.c",
|
||||
"Scripts/Game/Utility/ESCT_LocationFuncs.c"
|
||||
],
|
||||
"replacement_files": [
|
||||
"addons/core/Scripts/Game/ERR/ERR_SiteDefinition.c",
|
||||
"addons/core/Scripts/Game/ERR/ERR_SiteService.c",
|
||||
"addons/core/Prefabs/ERR/FieldCover.et"
|
||||
],
|
||||
"remaining": "Seven sites and bounded proximity/discovery events are implemented. Expand towns/checkpoints and turret population, validate authored static cover, loss retention, manual access and multiplayer cleanup."
|
||||
},
|
||||
{
|
||||
"id": "lifecycle",
|
||||
"title": "Player identity, spawning and reconnect",
|
||||
"scope": "first-release",
|
||||
"status": "partial",
|
||||
"original_scripts": [
|
||||
"Scripts/Game/Character/ESCT_CharacterControllerComponent.c",
|
||||
"Scripts/Game/Character/ESCT_ChimeraCharacter.c",
|
||||
"Scripts/Game/Components/ESCT_CharacterInitComponent.c",
|
||||
"Scripts/Game/Components/ESCT_SpawnPosition.c",
|
||||
"Scripts/Game/Components/PlayerController/ESCT_EscapistsNetworkComponent.c",
|
||||
"Scripts/Game/Entities/ESCT_CharacterSpawnPoint.c",
|
||||
"Scripts/Game/Entities/ESCT_SpawnPoint.c",
|
||||
"Scripts/Game/Enums/ESCT_ESpawnState.c",
|
||||
"Scripts/Game/GameMode/Components/ESCT_OrphanEscapistHandlerComponent.c",
|
||||
"Scripts/Game/GameMode/Components/ESCT_SpawnLogic.c",
|
||||
"Scripts/Game/GameMode/Misc/ESCT_TrackablePlayer.c",
|
||||
"Scripts/Game/Global/ESCT_CharacterHelper.c",
|
||||
"Scripts/Game/Global/ESCT_Player.c",
|
||||
"Scripts/Game/Global/ESCT_SpawnHelpers.c"
|
||||
],
|
||||
"replacement_files": [
|
||||
"addons/core/Scripts/Game/ERR/ERR_PlayerRoster.c",
|
||||
"addons/core/Scripts/Game/ERR/ERR_SpawnLogic.c",
|
||||
"addons/core/Scripts/Game/ERR/ERR_SpawnPlacement.c",
|
||||
"addons/core/Scripts/Game/ERR/ERR_SpawnFinalization.c"
|
||||
],
|
||||
"remaining": "Native local slot reservations, final-assignment guards and owned pending cleanup pass. Real dedicated-server concurrent joins, preload races, reconnects, connection-ID reuse, spent lives, late arrivals and spectator streaming remain."
|
||||
},
|
||||
{
|
||||
"id": "setup",
|
||||
"title": "Mission setup, configuration and administration",
|
||||
"scope": "first-release",
|
||||
"status": "partial",
|
||||
"original_scripts": [
|
||||
"Scripts/Game/Enums/ESCT_EEditableEntityLabel.c",
|
||||
"Scripts/Game/GameMode/Components/ESCT_EscapistsConfigComponent.c",
|
||||
"Scripts/Game/GameMode/Misc/ESCT_GeneralConfig.c",
|
||||
"Scripts/Game/Misc/ESCT_EditableLabelConfig.c",
|
||||
"Scripts/Game/Misc/ESCT_MissionHeader.c",
|
||||
"Scripts/Game/Misc/ESCT_SetupConfig.c",
|
||||
"Scripts/Game/Misc/ESCT_Skill.c",
|
||||
"Scripts/Game/UI/Components/ESCT_SliderComponent.c",
|
||||
"Scripts/Game/UI/Components/ESCT_SpinboxComponent.c",
|
||||
"Scripts/Game/UI/Components/ESCT_ToolboxComponent.c",
|
||||
"Scripts/Game/UI/Menus/ESCT_ClientWaitScreen.c",
|
||||
"Scripts/Game/UI/Menus/ESCT_SetupMenu.c",
|
||||
"Scripts/Game/UI/Menus/SetupMenuTabs/ESCT_DifficultyTab.c",
|
||||
"Scripts/Game/UI/Menus/SetupMenuTabs/ESCT_MainTab.c",
|
||||
"Scripts/Game/UI/Menus/SetupMenuTabs/ESCT_MenuTabBase.c",
|
||||
"Scripts/Game/UI/Menus/SetupMenuTabs/ESCT_MiscTab.c"
|
||||
],
|
||||
"replacement_files": [
|
||||
"addons/core/Scripts/Game/ERR/ERR_AdminService.c",
|
||||
"addons/core/Scripts/Game/ERR/ERR_Settings.c"
|
||||
],
|
||||
"remaining": "Core administration/settings and saved environment changes pass local native checks, including two restart rounds. Complete ordinary startup/admission, remote authorization, player-facing pre-round setup and difficulty choices."
|
||||
},
|
||||
{
|
||||
"id": "mission",
|
||||
"title": "Mission state, restart and base framework",
|
||||
"scope": "first-release",
|
||||
"status": "partial",
|
||||
"original_scripts": [
|
||||
"Scripts/Game/Enums/ESCT_EGameState.c",
|
||||
"Scripts/Game/GameMode/Components/ESCT_GameModeBaseComponent.c",
|
||||
"Scripts/Game/GameMode/Components/ESCT_GameStartComponent.c",
|
||||
"Scripts/Game/GameMode/Components/ESCT_GameStateManagerComponent.c",
|
||||
"Scripts/Game/GameMode/Components/ESCT_RestartTimeoutComponent.c",
|
||||
"Scripts/Game/GameMode/ESCT_EscapistsGameMode.c",
|
||||
"Scripts/Game/GameMode/ESCT_EscapistsManager.c"
|
||||
],
|
||||
"replacement_files": [
|
||||
"addons/core/Scripts/Game/ERR/ERR_GameMode.c",
|
||||
"addons/core/Scripts/Game/ERR/ERR_MissionRules.c"
|
||||
],
|
||||
"remaining": "Separate remaining objective/lifecycle policies, test mission failure reporting and multiplayer restart/cleanup."
|
||||
},
|
||||
{
|
||||
"id": "utilities",
|
||||
"title": "General helpers, editor labels and shared types",
|
||||
"scope": "review",
|
||||
"status": "partial",
|
||||
"original_scripts": [
|
||||
"Scripts/Game/Actions/ESCT_DisableAudioWarningAction.c",
|
||||
"Scripts/Game/Actions/ESCT_HoldAction.c",
|
||||
"Scripts/Game/ESCT_Constants.c",
|
||||
"Scripts/Game/Enums/ESCT_EEditorMode.c",
|
||||
"Scripts/Game/Enums/ESCT_EGroupSize.c",
|
||||
"Scripts/Game/Global/ESCT_ActionHelper.c",
|
||||
"Scripts/Game/Global/ESCT_ComponentHelper.c",
|
||||
"Scripts/Game/Global/ESCT_EntityHelper.c",
|
||||
"Scripts/Game/Global/ESCT_GroupHelper.c",
|
||||
"Scripts/Game/Global/ESCT_Identifier.c",
|
||||
"Scripts/Game/Global/ESCT_Logger.c",
|
||||
"Scripts/Game/Global/ESCT_Misc.c",
|
||||
"Scripts/Game/Misc/ESCT_BoolValue.c",
|
||||
"Scripts/Game/Misc/ESCT_CameraPosition.c",
|
||||
"Scripts/Game/Misc/ESCT_EntitySearch.c",
|
||||
"Scripts/Game/Misc/ESCT_FloatVal.c",
|
||||
"Scripts/Game/Misc/ESCT_IntVal.c",
|
||||
"Scripts/Game/Misc/ESCT_MilBuildingSearch.c",
|
||||
"Scripts/Game/Misc/ESCT_TargetSearch.c",
|
||||
"Scripts/Game/Utility/ESCT_CumulativeWeightPicker.c",
|
||||
"Scripts/Game/Utility/ESCT_DisplayFuncs.c",
|
||||
"Scripts/Game/Utility/ESCT_Math.c",
|
||||
"Scripts/Game/Utility/ESCT_UI.c"
|
||||
],
|
||||
"replacement_files": [
|
||||
"addons/core/Scripts/Game/ERR/ERR_Actors.c"
|
||||
],
|
||||
"remaining": "Use vanilla utilities or small independent helpers as each consumer is replaced. A filename match does not establish equivalent behavior."
|
||||
}
|
||||
],
|
||||
"resource_work": "The 474 original prefabs, 31 layers, 24 layouts, six worlds and other original resources are not included. Author required replacements using vanilla assets; resource counts do not imply one-for-one replacements."
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
# Original feature coverage
|
||||
|
||||
This tracks responsibilities suggested by the installed original’s 299 script paths. It is a filename-based inventory, not an audit of original implementation behavior. Each entry is assigned once in `original-feature-coverage.json`. No category is considered complete merely because some successor code exists. Runtime acceptance remains in `acceptance.json`.
|
||||
|
||||
The first release remains vanilla Everon, prison start and twelve players. Alternate starts and cosmetic parity are tracked as later work rather than silently omitted. First-release categories still contain unfinished work.
|
||||
|
||||
| Responsibility | State | Original scripts | Remaining work |
|
||||
| --- | --- | ---: | --- |
|
||||
| Helicopter-crash and hideout starts | pending (later) | 4 | Author separate layouts and progression rules after the prison release. |
|
||||
| Spectators and follow cameras | partial (first-release) | 10 | Verify remote streaming, target changes, death/reconnect and camera presentation on real clients. |
|
||||
| Time, weather, lights and night options | partial (first-release) | 10 | Local native clock, saved date/weather choices and two real restart rounds pass. Remote agreement, lighting and long-running day/night transitions still require validation. |
|
||||
| Voice, music, feedback and effects | pending (later) | 14 | Review which feedback is required for clear play; author replacements without importing original audio or UI assets. |
|
||||
| Health, unconsciousness and casualty handling | partial (first-release) | 11 | Local native blood-loss treatment, consumed supplies, consciousness recovery, ground casualty loading and vanilla door removal pass bounded fixtures. Verify ordinary input/animation, remote ownership, bleedout, interrupted treatment and flight with casualties. |
|
||||
| Enemy coordination, support and threat assessment | partial (first-release) | 48 | HQ alone coordinates physical forces. Complete support scheduling, mortar firing, aircraft, transport/rearming and losses without spawning responses. |
|
||||
| Ambient patrols, vehicles and civilians | partial (first-release) | 16 | Two bounded physical patrol routes and HQ Search preemption/resumption pass local native checks. Qualify perception/report transit, wider population needs, losses and measured runtime cost without alert-driven population duplication. |
|
||||
| Faction, group and asset catalogs | partial (first-release) | 16 | Narrow successor vanilla catalogs compile and initialize without earlier vehicle-schema errors; preserve required faction, medical, item and radio behavior. Verify remote affiliation and full mission use. Alternative faction packs remain later scope. |
|
||||
| Prison layout, locks and initial equipment | partial (first-release) | 12 | Manual access, equipment for twelve players, layouts, threat balance and start placement need validation. |
|
||||
| Extraction vehicle and round results | partial (first-release) | 5 | Physical twelve-character occupancy, local identity/results, initial aircraft settling, ground loading and vanilla casualty removal have native evidence. Manual piloting/boarding, real reconnect, empty-server flight, remote rescue contention and loss/restart acceptance remain. |
|
||||
| Radio objectives, tasks and discovery | partial (first-release) | 21 | Independent radio defence and native task-detail refresh are implemented. Validate visible task/map usability, simultaneous real clients, discovery replication and complete manual objective route. |
|
||||
| Physical equipment, storage and scavenging | partial (first-release) | 23 | Two independent clue caches and optional medical/outpost stock are authored. Manual access, route balance, medical treatment, destruction and network ownership remain unverified; finite stock replaces refill systems. |
|
||||
| Usable vehicles, locks, alarms and navigation | partial (first-release) | 17 | Finite optional vanilla ground transport passes native parking, seats, engine, fuel depletion and loss checks. Manual driving/access, route navigation, repair, alarms and remote vehicle ownership remain validation/integration work. |
|
||||
| Locations, compositions and population ownership | partial (first-release) | 32 | Seven sites and bounded proximity/discovery events are implemented. Expand towns/checkpoints and turret population, validate authored static cover, loss retention, manual access and multiplayer cleanup. |
|
||||
| Player identity, spawning and reconnect | partial (first-release) | 14 | Native local slot reservations, final-assignment guards and owned pending cleanup pass. Real dedicated-server concurrent joins, preload races, reconnects, connection-ID reuse, spent lives, late arrivals and spectator streaming remain. |
|
||||
| Mission setup, configuration and administration | partial (first-release) | 16 | Core administration/settings and saved environment changes pass local native checks, including two restart rounds. Complete ordinary startup/admission, remote authorization, player-facing pre-round setup and difficulty choices. |
|
||||
| Mission state, restart and base framework | partial (first-release) | 7 | Separate remaining objective/lifecycle policies, test mission failure reporting and multiplayer restart/cleanup. |
|
||||
| General helpers, editor labels and shared types | partial (review) | 23 | Use vanilla utilities or small independent helpers as each consumer is replaced. A filename match does not establish equivalent behavior. |
|
||||
|
||||
The original’s world compositions, UI resources and audio are not migration inputs. The successor requires newly authored replacements or vanilla systems. The inventory does not grant permission to reuse them.
|
||||
+335
@@ -0,0 +1,335 @@
|
||||
{
|
||||
"scope": "Read-only installed original package path inventory; no original source or resource contents copied. Names identify replacement responsibilities, not licensed migration inputs.",
|
||||
"addon_guid": "5F16D7E4A1CBE075",
|
||||
"total_paths": 35699,
|
||||
"resource_counts_by_extension": {
|
||||
".acp": 16,
|
||||
".bt": 2,
|
||||
".c": 299,
|
||||
".conf": 89,
|
||||
".edds": 45,
|
||||
".emat": 12,
|
||||
".ent": 6,
|
||||
".et": 474,
|
||||
".imageset": 1,
|
||||
".layer": 31,
|
||||
".layout": 24,
|
||||
".nmn": 18,
|
||||
".ntile": 34672,
|
||||
".ptc": 2,
|
||||
".sig": 2,
|
||||
".wav": 6
|
||||
},
|
||||
"script_paths": [
|
||||
"Scripts/Game/AI/Behavior/ActivityFeatures/ESCT_AIActivityCallForSupportFeature.c",
|
||||
"Scripts/Game/AI/Behavior/ActivityFeatures/ESCT_AIActivityIllumFlareFeature.c",
|
||||
"Scripts/Game/AI/Behavior/ESCT_AICallForSupportActivity.c",
|
||||
"Scripts/Game/AI/Behavior/ESCT_AICallSupportToBehavior.c",
|
||||
"Scripts/Game/AI/Behavior/ESCT_AIVehicleBehavior.c",
|
||||
"Scripts/Game/AI/Components/ESCT_AIGroupInfoComponent.c",
|
||||
"Scripts/Game/AI/Components/ESCT_AIGroupUtilityComponent.c",
|
||||
"Scripts/Game/AI/Reaction/ESCT_AIGoalReaction.c",
|
||||
"Scripts/Game/AI/ScriptedNodes/Conditions/ESCT_AIDecoIsSunset.c",
|
||||
"Scripts/Game/AI/ScriptedNodes/Generated/EscapistsSendGoalMessage.c",
|
||||
"Scripts/Game/AI/ScriptedNodes/Generated/EscapistsSendInfoMessage.c",
|
||||
"Scripts/Game/AI/ScriptedNodes/Generated/EscapistsSendOrder.c",
|
||||
"Scripts/Game/AI/ScriptedNodes/Groups/ESCT_AICallSupport.c",
|
||||
"Scripts/Game/AI/ScriptedNodes/Groups/ESCT_AICallSupportTo.c",
|
||||
"Scripts/Game/AI/ScriptedNodes/Messages/ESCT_AIMessage.c",
|
||||
"Scripts/Game/Actions/ESCT_BreakIntoVehicleAction.c",
|
||||
"Scripts/Game/Actions/ESCT_CompartmentHoldAction.c",
|
||||
"Scripts/Game/Actions/ESCT_DisableAudioWarningAction.c",
|
||||
"Scripts/Game/Actions/ESCT_GetInUserAction.c",
|
||||
"Scripts/Game/Actions/ESCT_HoldAction.c",
|
||||
"Scripts/Game/Actions/ESCT_LightUserAction.c",
|
||||
"Scripts/Game/Actions/ESCT_LoadCasualtyVehicleUserAction.c",
|
||||
"Scripts/Game/Actions/ESCT_LockedDoorUserAction.c",
|
||||
"Scripts/Game/Actions/ESCT_LockpickDoor.c",
|
||||
"Scripts/Game/Actions/ESCT_OpenVehicleDoorUserAction.c",
|
||||
"Scripts/Game/Actions/ESCT_OpenVehicleStorageAction.c",
|
||||
"Scripts/Game/Actions/ESCT_RadioAction.c",
|
||||
"Scripts/Game/Actions/ESCT_ReceiveRadioMessageAction.c",
|
||||
"Scripts/Game/Actions/ESCT_ResourceContainerVehicleLoadAction.c",
|
||||
"Scripts/Game/Actions/ESCT_ResourceContainerVehicleUnloadAction.c",
|
||||
"Scripts/Game/Actions/ESCT_ResourceEntityRefundAction.c",
|
||||
"Scripts/Game/Actions/ESCT_SwitchLightUserAction.c",
|
||||
"Scripts/Game/Actions/ESCT_TuneRadioFrequencyAction.c",
|
||||
"Scripts/Game/AmbientEvents/AmbientEventTypes/ESCT_AmbientEventBase.c",
|
||||
"Scripts/Game/AmbientEvents/AmbientEventTypes/ESCT_HeliFlybyEvent.c",
|
||||
"Scripts/Game/AmbientEvents/AmbientEventTypes/ESCT_VehiclePatrolEvent.c",
|
||||
"Scripts/Game/AmbientEvents/ESCT_AmbientEventInfo.c",
|
||||
"Scripts/Game/AmbientEvents/ESCT_AmbientEventPicker.c",
|
||||
"Scripts/Game/AmbientEvents/ESCT_AmbientSystemConfig.c",
|
||||
"Scripts/Game/Camera/Components/ESCT_AssignTargetManualCameraComponent.c",
|
||||
"Scripts/Game/Camera/Components/ESCT_AttachToPlayerManualCameraComponent.c",
|
||||
"Scripts/Game/Camera/Components/ESCT_LookAtTargetManualCameraComponent.c",
|
||||
"Scripts/Game/Camera/Components/ESCT_OrbitDistanceManualCameraComponent.c",
|
||||
"Scripts/Game/Camera/Components/ESCT_OrbitPlayerManualCameraComponent.c",
|
||||
"Scripts/Game/Camera/Components/ESCT_SpectatorUIManualCameraComponent.c",
|
||||
"Scripts/Game/Character/ESCT_CharacterControllerComponent.c",
|
||||
"Scripts/Game/Character/ESCT_ChimeraCharacter.c",
|
||||
"Scripts/Game/Components/Damage/ESCT_HelicopterDamageManagerComponent.c",
|
||||
"Scripts/Game/Components/ESCT_AmbientPatrolSpawnPointComponent.c",
|
||||
"Scripts/Game/Components/ESCT_AmbientVehicleSpawnPointComponent.c",
|
||||
"Scripts/Game/Components/ESCT_BarrelDamageManager.c",
|
||||
"Scripts/Game/Components/ESCT_BarrelSoundEffectComponent.c",
|
||||
"Scripts/Game/Components/ESCT_CarAlarmComponent.c",
|
||||
"Scripts/Game/Components/ESCT_CharacterInitComponent.c",
|
||||
"Scripts/Game/Components/ESCT_CharacterSpawnVehicleAssistantComponent.c",
|
||||
"Scripts/Game/Components/ESCT_EditableAmbientEventComponent.c",
|
||||
"Scripts/Game/Components/ESCT_EditableStorageComponent.c",
|
||||
"Scripts/Game/Components/ESCT_EditableSupportComponent.c",
|
||||
"Scripts/Game/Components/ESCT_EditableVehicleStorageComponent.c",
|
||||
"Scripts/Game/Components/ESCT_EquipmentSlotArsenalComponent.c",
|
||||
"Scripts/Game/Components/ESCT_EquipmentSlotArsenalPrisonComponent.c",
|
||||
"Scripts/Game/Components/ESCT_EscapeHelicopterComponent.c",
|
||||
"Scripts/Game/Components/ESCT_HelicrashHelicopterComponent.c",
|
||||
"Scripts/Game/Components/ESCT_IndoorLampComponent.c",
|
||||
"Scripts/Game/Components/ESCT_IndoorLampSwitchProxyComponent.c",
|
||||
"Scripts/Game/Components/ESCT_LocationItemComponent.c",
|
||||
"Scripts/Game/Components/ESCT_LocationMapUIComponent.c",
|
||||
"Scripts/Game/Components/ESCT_LocationPatrollerComponent.c",
|
||||
"Scripts/Game/Components/ESCT_LocationStorageComponent.c",
|
||||
"Scripts/Game/Components/ESCT_LockedDoorComponent.c",
|
||||
"Scripts/Game/Components/ESCT_MedicalStorageArsenalComponent.c",
|
||||
"Scripts/Game/Components/ESCT_PlayerDamageManagerComponent.c",
|
||||
"Scripts/Game/Components/ESCT_PopulatedBuildingComponent.c",
|
||||
"Scripts/Game/Components/ESCT_PrisonDoorComponent.c",
|
||||
"Scripts/Game/Components/ESCT_SpawnPosition.c",
|
||||
"Scripts/Game/Components/ESCT_StaticHospitalComponent.c",
|
||||
"Scripts/Game/Components/ESCT_StaticInsurgentRadioStationComponent.c",
|
||||
"Scripts/Game/Components/ESCT_StaticLocationComponent.c",
|
||||
"Scripts/Game/Components/ESCT_StaticOutpostComponent.c",
|
||||
"Scripts/Game/Components/ESCT_StaticRadioStationComponent.c",
|
||||
"Scripts/Game/Components/ESCT_StorageArsenalComponent.c",
|
||||
"Scripts/Game/Components/ESCT_SupportCallerComponent.c",
|
||||
"Scripts/Game/Components/ESCT_VehicleForceEjectComponent.c",
|
||||
"Scripts/Game/Components/ESCT_VehicleOccupantReactionComponent.c",
|
||||
"Scripts/Game/Components/ESCT_WeaponRackArsenalComponent.c",
|
||||
"Scripts/Game/Components/ESCT_WeaponRackArsenalPrisonComponent.c",
|
||||
"Scripts/Game/Components/Editor/ESCT_SpectatorMenuLayoutEditorComponent.c",
|
||||
"Scripts/Game/Components/FlareMine/ESCT_ProjectileSpawnerComponent.c",
|
||||
"Scripts/Game/Components/Heli/ESCT_HeliBehaviourBaseComponent.c",
|
||||
"Scripts/Game/Components/Heli/ESCT_HeliFlyByComponent.c",
|
||||
"Scripts/Game/Components/Heli/ESCT_HeliLoiterComponent.c",
|
||||
"Scripts/Game/Components/Heli/ESCT_HeliStrikeFireComponent.c",
|
||||
"Scripts/Game/Components/Heli/ESCT_HeliStrikeMovementComponent.c",
|
||||
"Scripts/Game/Components/Locations/CompositionComponents/ESCT_CheckpointCompositionComponent.c",
|
||||
"Scripts/Game/Components/Locations/CompositionComponents/ESCT_LocationCompositionComponent.c",
|
||||
"Scripts/Game/Components/Locations/ESCT_BaseCharacterManager.c",
|
||||
"Scripts/Game/Components/Locations/ESCT_CivilianPresenceComponent.c",
|
||||
"Scripts/Game/Components/Locations/ESCT_LocationCharacterManagerComponent.c",
|
||||
"Scripts/Game/Components/Locations/ESCT_LocationComponent.c",
|
||||
"Scripts/Game/Components/Locations/ESCT_LocationItemManagerComponent.c",
|
||||
"Scripts/Game/Components/Locations/ESCT_LocationMilBuildingManager.c",
|
||||
"Scripts/Game/Components/Locations/ESCT_LocationPatrolManagerComponent.c",
|
||||
"Scripts/Game/Components/Locations/ESCT_LocationStorageManagerComponent.c",
|
||||
"Scripts/Game/Components/Locations/ESCT_LocationTurretManagerComponent.c",
|
||||
"Scripts/Game/Components/Locations/ESCT_LocationVehicleManagerComponent.c",
|
||||
"Scripts/Game/Components/Locations/ESCT_LocationVehiclePatrolManagerComponent.c",
|
||||
"Scripts/Game/Components/Locations/ESCT_LocationWeaponRackManagerComponent.c",
|
||||
"Scripts/Game/Components/PlayerController/ESCT_EscapistsFeedbackComponent.c",
|
||||
"Scripts/Game/Components/PlayerController/ESCT_EscapistsNetworkComponent.c",
|
||||
"Scripts/Game/Components/PlayerController/ESCT_SpectatorComponent.c",
|
||||
"Scripts/Game/Components/PlayerController/ESCT_WithstandComponent.c",
|
||||
"Scripts/Game/Components/Radio/ESCT_RadioSoundComponent.c",
|
||||
"Scripts/Game/Components/Start/ESCT_HelicrashStartComponent.c",
|
||||
"Scripts/Game/Components/Start/ESCT_HideoutStartComponent.c",
|
||||
"Scripts/Game/Components/Start/ESCT_PrisonComponent.c",
|
||||
"Scripts/Game/Components/Start/ESCT_StartAreaComponent.c",
|
||||
"Scripts/Game/Components/SupportStations/ESCT_LoadCasualtyVehicleSupportStationComponent.c",
|
||||
"Scripts/Game/ESCT_Constants.c",
|
||||
"Scripts/Game/Editor/Containers/Actions/ESCT_ToggleLocalEditorLimitedNightModeToolbarAction.c",
|
||||
"Scripts/Game/EffectModule/ESCT_RocketBarrageEffectsModule.c",
|
||||
"Scripts/Game/Entities/ESCT_AIGroup.c",
|
||||
"Scripts/Game/Entities/ESCT_CharacterSpawnPoint.c",
|
||||
"Scripts/Game/Entities/ESCT_DefendRadioTaskPresentation.c",
|
||||
"Scripts/Game/Entities/ESCT_DisableLocationEntity.c",
|
||||
"Scripts/Game/Entities/ESCT_EquipmentSlotEntity.c",
|
||||
"Scripts/Game/Entities/ESCT_HelicrashLocationHolder.c",
|
||||
"Scripts/Game/Entities/ESCT_Radio.c",
|
||||
"Scripts/Game/Entities/ESCT_RadioSlotEntity.c",
|
||||
"Scripts/Game/Entities/ESCT_RandomLocationHolder.c",
|
||||
"Scripts/Game/Entities/ESCT_SpawnPoint.c",
|
||||
"Scripts/Game/Entities/ESCT_StorageSlotEntity.c",
|
||||
"Scripts/Game/Entities/ESCT_VehicleSpawnPoint.c",
|
||||
"Scripts/Game/Entities/ESCT_WeaponRack.c",
|
||||
"Scripts/Game/Entities/ESCT_WeaponRackSlotEntity.c",
|
||||
"Scripts/Game/Entities/Locations/ESCT_Checkpoint.c",
|
||||
"Scripts/Game/Entities/Locations/ESCT_City.c",
|
||||
"Scripts/Game/Entities/Locations/ESCT_Helipad.c",
|
||||
"Scripts/Game/Entities/Locations/ESCT_Location.c",
|
||||
"Scripts/Game/Entities/Locations/ESCT_LocationBase.c",
|
||||
"Scripts/Game/Entities/Locations/ESCT_RadioStation.c",
|
||||
"Scripts/Game/Entities/Locations/ESCT_StartArea.c",
|
||||
"Scripts/Game/EntityCatalog/ESCT_EntityCatalogManagerComponent.c",
|
||||
"Scripts/Game/EntityCatalog/EntityCatalogEntryData/ESCT_EntityCatalogEntryData.c",
|
||||
"Scripts/Game/Enums/AmbientEvent/ESCT_EAmbientEventType.c",
|
||||
"Scripts/Game/Enums/ESCT_EEditableEntityLabel.c",
|
||||
"Scripts/Game/Enums/ESCT_EEditorMode.c",
|
||||
"Scripts/Game/Enums/ESCT_EFactionType.c",
|
||||
"Scripts/Game/Enums/ESCT_EGameState.c",
|
||||
"Scripts/Game/Enums/ESCT_EGroupSize.c",
|
||||
"Scripts/Game/Enums/ESCT_EHealthType.c",
|
||||
"Scripts/Game/Enums/ESCT_EInsurgentsOption.c",
|
||||
"Scripts/Game/Enums/ESCT_ELocationSpawnReason.c",
|
||||
"Scripts/Game/Enums/ESCT_ELocationType.c",
|
||||
"Scripts/Game/Enums/ESCT_ELookupExclusionType.c",
|
||||
"Scripts/Game/Enums/ESCT_EMilitaryBranchType.c",
|
||||
"Scripts/Game/Enums/ESCT_EMilitaryCrateType.c",
|
||||
"Scripts/Game/Enums/ESCT_ESpawnState.c",
|
||||
"Scripts/Game/Enums/ESCT_EStartType.c",
|
||||
"Scripts/Game/Enums/ESCT_ESupportStationType.c",
|
||||
"Scripts/Game/Enums/ESCT_EUnitRole.c",
|
||||
"Scripts/Game/Enums/Support/ESCT_ESupportState.c",
|
||||
"Scripts/Game/Enums/Support/ESCT_ESupportType.c",
|
||||
"Scripts/Game/Factions/ESCT_Faction.c",
|
||||
"Scripts/Game/Factions/ESCT_FactionLookupValue.c",
|
||||
"Scripts/Game/Factions/ESCT_FactionManager.c",
|
||||
"Scripts/Game/Factions/ESCT_PlayerFactionInfo.c",
|
||||
"Scripts/Game/Factions/FactionLookup/ESCT_CharacterLookup.c",
|
||||
"Scripts/Game/Factions/FactionLookup/ESCT_FactionLookup.c",
|
||||
"Scripts/Game/Factions/FactionLookup/ESCT_GroupLookup.c",
|
||||
"Scripts/Game/GameMode/Components/ESCT_AmbientCameraDirectorComponent.c",
|
||||
"Scripts/Game/GameMode/Components/ESCT_AmbientVehicleComponent.c",
|
||||
"Scripts/Game/GameMode/Components/ESCT_CivilianManagerComponent.c",
|
||||
"Scripts/Game/GameMode/Components/ESCT_EscapistsConfigComponent.c",
|
||||
"Scripts/Game/GameMode/Components/ESCT_GameModeBaseComponent.c",
|
||||
"Scripts/Game/GameMode/Components/ESCT_GameStartComponent.c",
|
||||
"Scripts/Game/GameMode/Components/ESCT_GameStateManagerComponent.c",
|
||||
"Scripts/Game/GameMode/Components/ESCT_OrphanEscapistHandlerComponent.c",
|
||||
"Scripts/Game/GameMode/Components/ESCT_RestartTimeoutComponent.c",
|
||||
"Scripts/Game/GameMode/Components/ESCT_SpawnLogic.c",
|
||||
"Scripts/Game/GameMode/Components/ESCT_TaskAssignerComponent.c",
|
||||
"Scripts/Game/GameMode/Components/ESCT_VoiceoverComponent.c",
|
||||
"Scripts/Game/GameMode/Components/ESCT_WaypointManager.c",
|
||||
"Scripts/Game/GameMode/Components/ESCT_WinLoseHandlerComponent.c",
|
||||
"Scripts/Game/GameMode/ESCT_EscapistsGameMode.c",
|
||||
"Scripts/Game/GameMode/ESCT_EscapistsManager.c",
|
||||
"Scripts/Game/GameMode/ESCT_NightModeGameModeComponent.c",
|
||||
"Scripts/Game/GameMode/Loadout/ESCT_EArsenalGameModeType.c",
|
||||
"Scripts/Game/GameMode/Misc/ESCT_EquipmentInfo.c",
|
||||
"Scripts/Game/GameMode/Misc/ESCT_GeneralConfig.c",
|
||||
"Scripts/Game/GameMode/Misc/ESCT_LocationConfig.c",
|
||||
"Scripts/Game/GameMode/Misc/ESCT_LocationPreparer.c",
|
||||
"Scripts/Game/GameMode/Misc/ESCT_MilBranchInfo.c",
|
||||
"Scripts/Game/GameMode/Misc/ESCT_StartAreaSelector.c",
|
||||
"Scripts/Game/GameMode/Misc/ESCT_TimeOfDay.c",
|
||||
"Scripts/Game/GameMode/Misc/ESCT_TrackablePlayer.c",
|
||||
"Scripts/Game/GameOverScreen/ESCT_EGameOverTypes.c",
|
||||
"Scripts/Game/Global/ESCT_ActionHelper.c",
|
||||
"Scripts/Game/Global/ESCT_CharacterHelper.c",
|
||||
"Scripts/Game/Global/ESCT_ComponentHelper.c",
|
||||
"Scripts/Game/Global/ESCT_EntityHelper.c",
|
||||
"Scripts/Game/Global/ESCT_GroupHelper.c",
|
||||
"Scripts/Game/Global/ESCT_Identifier.c",
|
||||
"Scripts/Game/Global/ESCT_Logger.c",
|
||||
"Scripts/Game/Global/ESCT_Misc.c",
|
||||
"Scripts/Game/Global/ESCT_Player.c",
|
||||
"Scripts/Game/Global/ESCT_SpawnHelpers.c",
|
||||
"Scripts/Game/Global/ESCT_VehicleDirector.c",
|
||||
"Scripts/Game/LocationState/ESCT_EntityState.c",
|
||||
"Scripts/Game/LocationState/ESCT_LocationState.c",
|
||||
"Scripts/Game/Misc/ESCT_AirstrikeConfig.c",
|
||||
"Scripts/Game/Misc/ESCT_ArsenalItem.c",
|
||||
"Scripts/Game/Misc/ESCT_ArsenalItemDisplayData.c",
|
||||
"Scripts/Game/Misc/ESCT_BarrelFlammableHitZone.c",
|
||||
"Scripts/Game/Misc/ESCT_BoolValue.c",
|
||||
"Scripts/Game/Misc/ESCT_CameraPosition.c",
|
||||
"Scripts/Game/Misc/ESCT_EditableLabelConfig.c",
|
||||
"Scripts/Game/Misc/ESCT_EntitySearch.c",
|
||||
"Scripts/Game/Misc/ESCT_EscapistsHint.c",
|
||||
"Scripts/Game/Misc/ESCT_FloatVal.c",
|
||||
"Scripts/Game/Misc/ESCT_Health.c",
|
||||
"Scripts/Game/Misc/ESCT_IntVal.c",
|
||||
"Scripts/Game/Misc/ESCT_LocationPatrolPoint.c",
|
||||
"Scripts/Game/Misc/ESCT_MilBuildingSearch.c",
|
||||
"Scripts/Game/Misc/ESCT_MissionHeader.c",
|
||||
"Scripts/Game/Misc/ESCT_PlayerHitZone.c",
|
||||
"Scripts/Game/Misc/ESCT_SetupConfig.c",
|
||||
"Scripts/Game/Misc/ESCT_Skill.c",
|
||||
"Scripts/Game/Misc/ESCT_TargetSearch.c",
|
||||
"Scripts/Game/Misc/ESCT_VehicleHitZone.c",
|
||||
"Scripts/Game/Misc/ESCT_Weather.c",
|
||||
"Scripts/Game/Music/ESCT_ApproachHelipadMusic.c",
|
||||
"Scripts/Game/Music/ESCT_DefendRadioMusic.c",
|
||||
"Scripts/Game/Music/ESCT_FlyAwayMusic.c",
|
||||
"Scripts/Game/State/ESCT_CharacterState.c",
|
||||
"Scripts/Game/State/ESCT_EquipmentSlotState.c",
|
||||
"Scripts/Game/State/ESCT_PatrolVehicleState.c",
|
||||
"Scripts/Game/State/ESCT_StorageState.c",
|
||||
"Scripts/Game/State/ESCT_VehicleSpawnPointState.c",
|
||||
"Scripts/Game/Support/ESCT_SupportInfo.c",
|
||||
"Scripts/Game/Support/ESCT_SupportPicker.c",
|
||||
"Scripts/Game/Support/ESCT_SupportPresentationConfig.c",
|
||||
"Scripts/Game/Support/ESCT_SupportSystemConfig.c",
|
||||
"Scripts/Game/Support/SupportTypes/ESCT_HeliLoiterSupport.c",
|
||||
"Scripts/Game/Support/SupportTypes/ESCT_HeliStrikeSupport.c",
|
||||
"Scripts/Game/Support/SupportTypes/ESCT_IlluminationMortarBarrageSupport.c",
|
||||
"Scripts/Game/Support/SupportTypes/ESCT_LightVehicleSupport.c",
|
||||
"Scripts/Game/Support/SupportTypes/ESCT_MortarBarrageBase.c",
|
||||
"Scripts/Game/Support/SupportTypes/ESCT_MortarBarrageSupport.c",
|
||||
"Scripts/Game/Support/SupportTypes/ESCT_QRFSupport.c",
|
||||
"Scripts/Game/Support/SupportTypes/ESCT_QRFVehicleSupport.c",
|
||||
"Scripts/Game/Support/SupportTypes/ESCT_RocketArtillerySupport.c",
|
||||
"Scripts/Game/Support/SupportTypes/ESCT_SmokeMortarBarrageSupport.c",
|
||||
"Scripts/Game/Support/SupportTypes/ESCT_SpecOpsSupport.c",
|
||||
"Scripts/Game/Support/SupportTypes/ESCT_SupportBase.c",
|
||||
"Scripts/Game/Systems/ESCT_AmbientEventSystem.c",
|
||||
"Scripts/Game/Systems/ESCT_AmbientPatrolSystem.c",
|
||||
"Scripts/Game/Systems/ESCT_AmbientVehicleSystem.c",
|
||||
"Scripts/Game/Systems/ESCT_KnownLocationsSystem.c",
|
||||
"Scripts/Game/Systems/ESCT_LocationStateSystem.c",
|
||||
"Scripts/Game/Systems/ESCT_LocationSystem.c",
|
||||
"Scripts/Game/Systems/ESCT_SupportSystem.c",
|
||||
"Scripts/Game/Systems/ESCT_VoiceoverSystem.c",
|
||||
"Scripts/Game/Tasks/ESCT_DefendRadioTask.c",
|
||||
"Scripts/Game/Tasks/ESCT_LockpickTask.c",
|
||||
"Scripts/Game/Tasks/ESCT_RadioTask.c",
|
||||
"Scripts/Game/Tasks/ESCT_Task.c",
|
||||
"Scripts/Game/Tasks/ESCT_TaskInfoConfig.c",
|
||||
"Scripts/Game/Tasks/ESCT_TriggerTask.c",
|
||||
"Scripts/Game/Tasks/SupportEntities/ESCT_BaseTaskSupportEntity.c",
|
||||
"Scripts/Game/Tasks/SupportEntities/ESCT_DefendRadioTaskSupportEntity.c",
|
||||
"Scripts/Game/ThreatAssessment/ESCT_ThreatAssessmentConfig.c",
|
||||
"Scripts/Game/UI/Components/ESCT_EscapistsMapUIBase.c",
|
||||
"Scripts/Game/UI/Components/ESCT_SliderComponent.c",
|
||||
"Scripts/Game/UI/Components/ESCT_SpinboxComponent.c",
|
||||
"Scripts/Game/UI/Components/ESCT_ToolboxComponent.c",
|
||||
"Scripts/Game/UI/Escapists/ESCT_MapEscapistsUI.c",
|
||||
"Scripts/Game/UI/GameOverScreens/ESCT_GameOverScreenEscapistsUIComponent.c",
|
||||
"Scripts/Game/UI/HUD/ESCT_DefendTaskDisplay.c",
|
||||
"Scripts/Game/UI/HUD/ESCT_UnconsciousInfoDisplay.c",
|
||||
"Scripts/Game/UI/Menus/ESCT_ClientWaitScreen.c",
|
||||
"Scripts/Game/UI/Menus/ESCT_SetupMenu.c",
|
||||
"Scripts/Game/UI/Menus/SetupMenuTabs/ESCT_DifficultyTab.c",
|
||||
"Scripts/Game/UI/Menus/SetupMenuTabs/ESCT_EnvironmentTab.c",
|
||||
"Scripts/Game/UI/Menus/SetupMenuTabs/ESCT_MainTab.c",
|
||||
"Scripts/Game/UI/Menus/SetupMenuTabs/ESCT_MenuTabBase.c",
|
||||
"Scripts/Game/UI/Menus/SetupMenuTabs/ESCT_MiscTab.c",
|
||||
"Scripts/Game/UI/ScreenEffects/ESCT_SpectatorBleedingScreenEffect.c",
|
||||
"Scripts/Game/Utility/ESCT_CumulativeWeightPicker.c",
|
||||
"Scripts/Game/Utility/ESCT_DisplayFuncs.c",
|
||||
"Scripts/Game/Utility/ESCT_EntityCatalogHelper.c",
|
||||
"Scripts/Game/Utility/ESCT_GroupDirector.c",
|
||||
"Scripts/Game/Utility/ESCT_LocationCatalog.c",
|
||||
"Scripts/Game/Utility/ESCT_LocationFuncs.c",
|
||||
"Scripts/Game/Utility/ESCT_Math.c",
|
||||
"Scripts/Game/Utility/ESCT_RoadNavigation.c",
|
||||
"Scripts/Game/Utility/ESCT_TaskFuncs.c",
|
||||
"Scripts/Game/Utility/ESCT_UI.c",
|
||||
"Scripts/Game/VON/ESCT_VONController.c",
|
||||
"Scripts/Game/Vehicle/ESCT_VehicleControllerComponent.c"
|
||||
],
|
||||
"installed_package_metadata": {
|
||||
"id": "5F16D7E4A1CBE075",
|
||||
"name": "Escapists",
|
||||
"version": "1.6.30",
|
||||
"game_version": "1.8.0.10",
|
||||
"dependency_ids": [
|
||||
"66AAB0873717CEF0",
|
||||
"66AD0B6D6E7A6A97"
|
||||
]
|
||||
},
|
||||
"package_index_source": "Escapists_5F16D7E4A1CBE075/data.pak"
|
||||
}
|
||||
@@ -0,0 +1,91 @@
|
||||
# Equivalent-workload performance comparison
|
||||
|
||||
`tools/compare_performance.py` validates and summarizes supplied CSV recordings. It does not collect frames, run an engine, authenticate measurements, demonstrate a faster successor, or grant acceptance. No real measurements accompany this tool. Its regression inputs are explicitly synthetic and exist only in temporary test directories.
|
||||
|
||||
Run:
|
||||
|
||||
```sh
|
||||
python3 tools/compare_performance.py path/to/comparison.json > path/to/comparison-report.json
|
||||
python3 tests/test_performance_comparison.py
|
||||
```
|
||||
|
||||
Invalid or incomplete input exits with status 2 and a reason on stderr. A valid arithmetic report exits 0, with `acceptance: "not_evaluated"` regardless of measured/synthetic origin or positive/negative differences. Do not overwrite your manifest or CSV inputs by redirecting output to them.
|
||||
|
||||
## Collect real recordings later
|
||||
|
||||
Use the same hardware, engine version, capture tool/version, renderer/display mode, settings, map, timed route, player count, physical AI count, vehicle count and total entity count for both variants. Record the original scenario and successor's addon IDs and exact revision/build identity separately. Keep other workloads stable and document relevant drivers, CPU/power settings, resolution, graphics quality, VSync, frame cap, simulation settings, network topology and server settings in the settings object. Version the route specification, camera path and timing; use that stable route ID in metadata. A shared route name without a reproducible route is insufficient evidence.
|
||||
|
||||
Collect at least three independently executed paired repeats, alternating which variant runs first. Each capture must include at least 30 seconds of warm-up and 60 seconds of measurement, with identical declared durations across all runs. Hold declared populations constant during warm-up and measurement. Record every frame/tick, elapsed interval, current populations and AI simulation duration using the same profiler/instrumentation. Preserve raw capture files, full logs and collection notes next to the normalized CSVs. If the available profiler cannot export AI load and populations with each interval, add or choose suitable instrumentation before using this schema; do not fill the columns with guesses, interpolate missing frames, or manufacture stable counts.
|
||||
|
||||
Client frame-time comparisons and dedicated server tick comparisons are separate datasets. Their interval rates are both expressed per second in the report, but server tick rate is not rendered client FPS. Headless Workbench may only be compared against identically configured headless Workbench; such results cannot establish ordinary-client performance. The current scripted hidden fixtures teleport actors and use a capped renderer, so their existing logs are not suitable benchmark inputs.
|
||||
|
||||
An offline metadata check cannot prove that two captures are authentic or that all meaningful conditions were held constant. Review raw captures, population traces, route adherence, variance and repeatability before any performance acceptance decision. Positive deltas alone do not establish statistical significance. Keep the performance acceptance gate pending until real equivalent workloads have been measured and reviewed.
|
||||
|
||||
## Manifest schema, version 1
|
||||
|
||||
The top-level JSON object has exactly `schema_version` (integer 1), `sample_origin` (`"synthetic"` or `"measured"`) and `runs` (array). Each repeat ID must appear exactly twice: once as `baseline`, once as `successor`; at least three paired IDs are required. Use `"measured"` only for actual captured intervals. Duplicate JSON keys, non-finite values, missing/extra schema fields, reused CSV paths, changing build/addon identities within a variant and unequal conditions are rejected.
|
||||
|
||||
Each entry in `runs` has this shape. This is an illustrative record, **not a measurement or a complete accepted manifest**; replace placeholders with collection records and supply all six or more independent run entries:
|
||||
|
||||
```json
|
||||
{
|
||||
"variant": "baseline",
|
||||
"repeat_id": "pair-01",
|
||||
"artifact_id": "RECORD_EXACT_BUILD_OR_REVISION",
|
||||
"addon_ids": ["RECORD_LOADED_ADDON_IDS"],
|
||||
"engine_version": "RECORD_ENGINE_VERSION",
|
||||
"hardware": {
|
||||
"cpu": "RECORD_CPU",
|
||||
"gpu": "RECORD_GPU_OR_NO_GPU_FOR_SERVER",
|
||||
"ram_gib": 32,
|
||||
"os": "RECORD_OS_BUILD",
|
||||
"driver": "RECORD_DRIVER_OR_SERVER_NOT_APPLICABLE"
|
||||
},
|
||||
"workload": {
|
||||
"map": "RECORD_MAP_RESOURCE_ID",
|
||||
"route": "RECORD_VERSIONED_ROUTE_SPECIFICATION",
|
||||
"players": 12,
|
||||
"ai": 36,
|
||||
"vehicles": 4,
|
||||
"entities": 1000,
|
||||
"settings": {
|
||||
"RECORD_ALL_RELEVANT_SETTINGS": "replace this placeholder"
|
||||
},
|
||||
"warmup_seconds": 30,
|
||||
"duration_seconds": 60
|
||||
},
|
||||
"capture": {
|
||||
"kind": "client_frame",
|
||||
"environment": "client",
|
||||
"tool": "RECORD_PROFILER_OR_INSTRUMENTATION",
|
||||
"version": "RECORD_CAPTURE_TOOL_VERSION"
|
||||
},
|
||||
"sample_file": "baseline-pair-01.csv"
|
||||
}
|
||||
```
|
||||
|
||||
Paths resolve relative to the manifest (absolute paths also work). `artifact_id` and `addon_ids` identify the intentional difference between baseline and successor; each variant keeps its own identity fixed through all repeats. `engine_version`, `hardware`, `workload` and `capture` must match exactly across every recording, including warm-up/duration. `settings` is a nonempty JSON object whose internal field names are collector-defined; document all relevant settings rather than relying on this nonempty-object check for completeness. `players` is a positive integer, the other populations are nonnegative integers, and total entities must cover at least declared players + AI + vehicles. Use a consistent entity-count definition excluding no populations silently.
|
||||
|
||||
Capture kinds are `client_frame` and `server_tick`. Environments are `client`, `dedicated_server` and `workbench_headless`. A dedicated server cannot provide client frames. Hardware fields must be recorded even if one is explicitly not applicable. JSON whitespace and object-key order do not affect equality.
|
||||
|
||||
## CSV schema
|
||||
|
||||
The exact header and column order are:
|
||||
|
||||
```text
|
||||
frame_index,elapsed_ms,frame_time_ms,players,ai,vehicles,entities,ai_simulation_ms
|
||||
```
|
||||
|
||||
- `frame_index` starts at 1 and increases by one without gaps or duplicates.
|
||||
- `elapsed_ms` is the cumulative endpoint of the frame/tick, relative to the start of capture at 0; it must strictly increase.
|
||||
- `frame_time_ms` is that entire interval's duration, finite and at least 0.001 ms. Its difference from adjacent elapsed endpoints, and cumulative total versus elapsed, must agree within 0.1 ms. Preserve sufficient precision when normalizing raw exports.
|
||||
- Population columns are integer observations and must match declared counts in every row, including warm-up. Entity count includes the actors/vehicles.
|
||||
- `ai_simulation_ms` is finite nonnegative AI profiling time for that interval. It may exceed wall interval time if the documented profiler sums concurrent worker durations. Baseline and successor must use the same definition/instrumentation.
|
||||
|
||||
Record through the first frame endpoint at or beyond `warmup_seconds + duration_seconds`; include that final boundary-crossing frame and stop there. Ending early or adding rows after that endpoint is rejected. Only whole frames starting at/after warm-up and ending at/before the measurement boundary contribute metrics. Boundary-crossing intervals remain in the raw capture but are excluded symmetrically from metrics. At least 120 complete measured intervals must cover **at least 99% of the declared measurement duration**. A stall crossing either warm-up or the final boundary that leaves lower coverage rejects the entire comparison; a short fragment cannot stand in for the declared workload. The report exposes `measurement_coverage_fraction` and each excluded boundary interval's full duration and overlap with the measurement window, alongside included sample counts and seconds. Preserve rejected captures as evidence of the stall; do not trim or move boundaries after seeing results merely to make a recording qualify.
|
||||
|
||||
## Report interpretation
|
||||
|
||||
Each repeated run reports median, p95 and p99 frame/tick duration in milliseconds; median, p05 and p01 interval FPS/rate; throughput (`included interval count / included interval seconds`); and median/p95 AI profiling milliseconds. FPS/rate percentiles are computed directly from `1000 / frame_time_ms`, not the reciprocal of mean duration. Percentiles use nearest rank (`ceil(percentile × sample count)`); medians use the conventional midpoint average for even counts. Thus reciprocal upper duration and lower FPS ranks may differ by one observation. Throughput is a different statistic from median instantaneous rate.
|
||||
|
||||
Variant aggregates are the **median of each per-run metric**, giving repeats equal weight; they are not pooled-frame percentiles. Paired repeat deltas report median-frame reduction, p99-frame reduction, and throughput-rate increase as percentages of baseline. Positive values indicate the named numerical reduction/increase within those supplied samples, negative values indicate regression. The final delta summary is the median of paired deltas. No confidence interval, significance test or automatic performance pass is produced. Input manifest and CSV SHA-256 hashes retain provenance for review, but hashes do not authenticate the origin of recordings.
|
||||
@@ -0,0 +1,29 @@
|
||||
# Player lifecycle and pending admission
|
||||
|
||||
The successor keeps one round-owned life record per authenticated account. A connection number is only the current binding to that record. A new life can enter during prison, radio search or radio defence; extraction and terminal phases refuse new admission. Successful initial assignment spends the life. Cancelling an unassigned preload never restores or spends a life.
|
||||
|
||||
Native reconnect reservation and handoff remain separate from new-character admission. A returning account may reclaim its surviving reserved actor through Reforger's reconnect system. A dead actor remains a spent life; unconsciousness is not death. Reserved living actors remain participants while their connections are absent. These policies are implemented, but real remote reconnect and reservation-expiry acceptance remains unfinished.
|
||||
|
||||
## Placement
|
||||
|
||||
Prison placement searches a 4×4 lattice with axis coordinates -4.5, -1.5, 1.5 and 4.5m relative to the authored center. The four inner positions are checked first, then eight edge positions, then four corners. Neighboring centers are 3m apart and remain 1.5m inside walls positioned at ±6m. The inner and edge positions are within 5m of the prison center. Terrain height and slope, physical scene/character occupancy, and pending reservations can reject a slot. Connection IDs 1 and 13 receive no special or shared position. Disconnected physical bodies still obstruct the native query.
|
||||
|
||||
If every candidate is occupied or pending, admission waits and retries. Lack of a clear slot does not consume the native spawn-failure budget. Later arrivals first search bounded clear ground near a conscious friendly survivor outside a vehicle, with terrain-height and line-of-sight checks, then try the same prison grid. Placement does not imply a navigable route or safe proximity to enemies.
|
||||
|
||||
The previous 25-point grid passed reservation enumeration but exhausted at eight actual actors (archive `native-2026-09-19-062251`). Adding a ring to 49 candidates while keeping the central positions first still exhausted at nine (`native-2026-09-19-062847`). Diagnostics showed character world bounds about 4×4m; the old 1.5m lattice left adjacent candidates inside those conservative query bounds. The replacement 3m lattice changes packing rather than weakening the query or lowering the required population. All sixteen candidates still pass through the unchanged clearance predicate. The prisoner fixture must populate one real player plus eleven additional physical actors before capacity is accepted; this new packing awaits that native result. Manual crowding, movement, collision and spawn usability remain required.
|
||||
|
||||
## Finalization and cleanup
|
||||
|
||||
The server records each initial free-spawn admission in a ticket bound to the mission instance, account, connection, controller, native request, exact request data object and created actor. Immediately before native assignment it rechecks current phase, account binding, connection, spent life, controller and request ownership, absence of another controlled entity, actor health and placement. Horizontal drift is limited to 0.6m and vertical drift to 1m, allowing ordinary settling while refusing displaced or fallen preloads. The reserved location is checked against current terrain and physical occupancy again.
|
||||
|
||||
A refused ticket permits cleanup only of its owned unpossessed actor. An unknown or repeated request cannot claim an arbitrary actor for deletion. Stop, disconnect and closed-admission phases remove reservations, cancel the native repeated finalization callback and remove their pending actors. Pending/retry metadata is cleared before cancellation emits a response, so the response's failure callback cannot schedule a fresh admission. Cleanup rechecks actual player control: `ERR_Actors.DeleteSpawned` refuses any entity currently controlled by a player, regardless of its original ownership.
|
||||
|
||||
The native handler interception applies only to successor game modes or an existing handler whose owning respawn system still carries successor spawn logic during teardown. Other scenarios retain vanilla behavior. Delayed entity-loss observation also checks the captured controller and ignores a living actor that was reacquired before the callback runs.
|
||||
|
||||
## Validation status
|
||||
|
||||
`python3 tools/check.py` includes `tests/test_player_admission_policy.py`. It executes the actual source-local finalization and life-policy bodies plus the actual reservation rejection predicate through the existing C++ policy harness. Coverage includes every phase/life/connectivity/controller/request/identity combination, missing identities, displacement boundaries, radial distance, vertical reservation separation and own-reservation exclusion. The harness substitutes vector arithmetic and opaque identity equality; it does not emulate Enfusion collision, replication, native spawning or reconnect behavior.
|
||||
|
||||
`ERR_NativeLifecycleProbe` is an opt-in WORKBENCH fixture integrated by the central runner as `-errBaseSmoke 1 -errSmokeOutcome lifecycle`. It checks native prison capacity, physical character occupancy, actual local-controller handler rejection, exact request ownership, deferred deletion, cancellation without another life, delayed observer metadata protection and a native displaced actor. Movement checks wait 750ms and deletion checks wait 1000ms rather than assuming immediate native updates. Synthetic ticket creation is confined to WORKBENCH and never changes the real prisoner's life record or possession.
|
||||
|
||||
The native lifecycle fixture in [050403](evidence/native-2026-09-19-050403/report.json) completes 54 assertions, including an ordinary initial prisoner spawn. It finds 20 remaining clear positions around that prisoner. No script/VM exception occurs; seven inherited vanilla resource errors remain. Earlier reserved member-name and reflected-container failures are preserved in the validation archive. Normal Core/companion escape and restart regression remains a separate check. Remote 12-player concurrent join, slow client preload, disconnect during preload, recycled connection IDs, reconnect reservation handoff/expiry and spectator streaming cleanup remain separate multiplayer acceptance work.
|
||||
@@ -0,0 +1,36 @@
|
||||
# Successor prisoner starting kit
|
||||
|
||||
Core uses `{3FF693715C9F8928}Prefabs/ERR/Prisoner.et` as its player character. This is a new successor resource with its own metadata and catalog reference. It derives directly from vanilla `{836E7E39AAC5888B}Prefabs/Characters/Factions/BLUFOR/US_Army/Character_US_Base.et`, whose parent is `{37578B1666981FCE}Prefabs/Characters/Core/Character_Base.et`.
|
||||
|
||||
The previous `Character_US_Unarmed.et` derived from `Character_US_BaseLoadout.et`, which authored radio, map, compass, binoculars, watch, E-tool, flares, flashlight and medical inventory. The successor avoids that equipped parent and explicitly authors:
|
||||
|
||||
| Starting item | Count per prisoner |
|
||||
| --- | ---: |
|
||||
| Patrol cap | 1 |
|
||||
| Rolled-up BDU jacket | 1 |
|
||||
| BDU trousers | 1 |
|
||||
| US combat boots | 1 |
|
||||
| Watch | 1 |
|
||||
| US field dressing | 2 |
|
||||
| Tourniquet | 1 |
|
||||
| Morphine | 1 |
|
||||
|
||||
The jacket itself includes a non-equipment dummy belt. There is no starting weapon, ammunition, map, compass, radio, binoculars, E-tool, flare, flashlight, backpack or vest. Prison and route stock are unchanged: the prison still contains five pistols, eight magazines and one shared map. Equipment scarcity now comes from that authored stock and scavenging. This change does not assert that five starting weapons are sufficient for every play style.
|
||||
|
||||
The prefab preserves inherited vanilla damage, consciousness, inventory, saline/tourniquet treatment slots, character actions and vehicle access. It does not change game-mode health settings or the all-incapacitated outcome policy. Inspected vanilla core treatment slots are inactive until used; they are not a source of extra carried medicine. Runtime inventory assertions must confirm this on the installed version.
|
||||
|
||||
All explicitly referenced vanilla resources were verified against the installed `addons/data/resourceDatabase.rdb`. The audit used the installed US character inheritance and clothing prefabs; no original Escapists implementation was copied. The equipped BaseLoadout parent has been removed from the successor character's inheritance, while normal vanilla character systems remain.
|
||||
|
||||
## Validation
|
||||
|
||||
`python3 tools/check.py` passes resource isolation and reference checks with 23 successor resources. Native compilation and the new `ERR_NativePrisonerProbe` are pending until the central runner archives a result.
|
||||
|
||||
The opt-in probe uses one actual local player's prisoner and eleven disposable physical characters at reserved clear prison positions. After native initialization it checks each inventory against the explicit kit, rejects any unexpected carried resource, and checks that health, treatment and vehicle-access components remain. It then moves the actual player near an authored supply cache, transfers one existing radio document into the reduced clothing inventory, verifies physical ownership changed without duplication, and returns the same document. The eleven temporary actors are deleted and the actual player's body and spent life are preserved.
|
||||
|
||||
This validates native storage compatibility; it does not simulate twelve network clients or prove manual inventory UI interaction. Picking up the borrowed document can trigger ordinary discovery knowledge in the disposable fixture, so the runner must finish with an explicit test reset instead of continuing a normal escape round. No replacement document is spawned.
|
||||
|
||||
Native inventory initialization, resource inheritance, actual medicine effects, manual clue pickup, 12-player balance and multiplayer remain separate acceptance gates. Run ordinary Core and companion escape/restart regressions after the native kit fixture, because changing the player prefab affects every player spawn and test character.
|
||||
|
||||
Native validation also observes the vanilla identification record (`PersonalBelongings_US.et`) on the possessed player. The installed identity manager generates this on possession, death or unconsciousness; it is deliberately retained and verified once. The eleven unpossessed, healthy fixture actors have no such generated item. This does not add a map, radio, weapon or mission clue.
|
||||
|
||||
Native run `native-2026-09-19-063949` passed all 155 combined assertions with zero engine errors. All twelve physical characters fit inside the prison and passed kit and clue-transfer checks. Native `GetItems` can return the same item reference more than once; the probe counts unique live entities, retains distinct items of the same prefab, and verified exactly one generated identity item on the controlled player. This does not establish twelve-client networking or player balance.
|
||||
@@ -0,0 +1,33 @@
|
||||
# Radio defence objective
|
||||
|
||||
Core's `ERR_RadioDefenceService` owns radio authorization, physical defender selection, continuous transmission time and completion. `ERR_GameMode` wires its events into mission progression; companion addons do not advance the objective. The service runs only on the server. Native tasks remain the replicated presentation of its progress.
|
||||
|
||||
A radio can be tuned once during `RADIO_SEARCH`, only if it is registered with the mission, is a radio site, has been identified, and a conscious prisoner is within five metres. The prisoner must be the current body of a connected, already-spawned round participant and belong to the configured player faction. An AI character, reserved disconnected body, spectator, hostile controlled character or replacement body outside the roster cannot authorize a transmission.
|
||||
|
||||
Once tuned, at least one eligible conscious prisoner must remain strictly inside the 60-metre radius. The service samples native player/character state on the existing one-second server tick. Multiple defenders share one timer: losing one defender does not reset progress while another remains. Losing the last eligible defender resets all accumulated time. Death, unconsciousness, distance, faction, current connection/roster identity and an empty server are checked on each sample. Backward or invalid sample times cannot manufacture completion.
|
||||
|
||||
The existing `/esc mission radio show|set N` command and 30–1800 second bounds are unchanged. Unlike the next-round mission clock settings, this duration remains live: increasing it preserves elapsed continuous occupancy and lengthens the remaining time; lowering it can complete a sufficiently long current transmission at the next server sample. A settings-save failure keeps the old value.
|
||||
|
||||
## Interface and events
|
||||
|
||||
The service exposes `State`, `Location`, `Occupied`, `DefenderCount`, `Since`, `DurationSeconds`, `SecondsRemaining(now)`, `DefenceRadius()` and `TuneRadius()`. GameMode retains its `TuneRadio`, `DefenceOccupied` and `DefenceSecondsRemaining` forwarding methods. These service/progress methods are server-side; clients consume the native replicated task description rather than reading the service.
|
||||
|
||||
- `OnStarted(location)` fires once when a validated radio begins. GameMode changes the phase to `RADIO_DEFENCE`; if that transition fails it stops the service.
|
||||
- `OnProgressChanged(service)` fires when state, defender count, start timestamp or configured duration changes. Ordinary elapsed ticks do not emit redundant events. Consumers read the snapshot through the service getters.
|
||||
- `OnCompleted(location)` fires once after the service latches completion. GameMode verifies the completed service and current phase, reveals the extraction site and changes to `EXTRACTION`.
|
||||
|
||||
The completion latch is set before either observer event runs. Nested ticks, repeated ticks or repeated tuning therefore cannot emit another completion. Mission stop and phase changes beyond radio defence cancel an incomplete service; a stopped service cannot restart. Completed state remains latched through cleanup.
|
||||
|
||||
## Validation scope
|
||||
|
||||
`tests/test_radio_defence_policy.py` runs the actual Enforce policy bodies in the existing C++ harness. It covers the phase/discovery/authorization matrix, exact five- and 60-metre boundaries, defender handover, interruption, zero eligible defenders, backward time and exact duration completion. These local checks and the existing repository checks pass; they are not Enforce compilation.
|
||||
|
||||
`ERR_NativeRadioDefenceProbe` is a WORKBENCH-only asynchronous fixture run before normal Core smoke tuning. Construct it with the current mode, real controlled prisoner and identified radio. `Tick(now)` returns `0` while pending, `1` only after all assertions and physical restoration pass, or `-1` on failure. The caller must invoke `Stop()` on cancellation, timeout and mission stop. Stop is idempotent: it detaches the fixture's event listeners, stops its isolated services, restores the saved radio duration and the real player's original transform/consciousness, and deletes its own second character. No fixture-owned recurring callqueue survives cancellation.
|
||||
|
||||
The fixture keeps native world advancement separate from its deterministic service samples. Teleports, consciousness changes, faction changes and death are followed by a minimum 750 ms wait before querying physical state. Recovery additionally polls the actual living/conscious controller state for at most twelve seconds per recovery step, without repeating the state-change command or changing health to force success. Those deadlines do not move when another poll is scheduled. Normal success waits for deferred player restoration to settle and verifies the restored setting, controller state and position.
|
||||
|
||||
One character is the actual local player's body. The second is a newly spawned physical character whose connection membership is simulated by a WORKBENCH-only defender source. Its sampled connection count is also simulated for the empty-server case. Both actors use native faction, controller, damage and position queries. They occupy separate positions to avoid overlapping bodies during knockdown and recovery. Diagnostics record actual radio/player positions and measured distance, controller life state and unconsciousness, plus the current phase, registered radio, roster binding, faction and authorization result. The five-metre tuning limit is checked against observed positions. Physical defence exclusion requests 60.5 metres and verifies at least 60 metres; the exact 60-metre policy boundary remains covered by the policy regression.
|
||||
|
||||
The isolated service tests ordinary AI and unregistered/hostile rejection, multiple defenders sharing one interval, unconscious/dead defender loss, empty-server reset, live duration changes, stop/terminal cancellation and duplicate or re-entrant completion. Its explicit timestamps test exact timer boundaries; they are not evidence of elapsed multiplayer or real-time transmission duration. The production service and the live mission phase are unchanged by the isolated probes. After successful cleanup, normal Core smoke tunes the live radio and performs the existing real delayed transmission, interruption and recovery sequence.
|
||||
|
||||
Recent native runs exposed fixture timing failures after physical mutation and during recovery. Those failures remain archived. The archived [050515](evidence/native-2026-09-19-050515/report.json) run completes the asynchronous radio fixture and ordinary escape twice, with 340 total assertions and no script/VM exceptions. Seven inherited resource errors still prevent a clean runtime pass. Scripted controller changes are not medical-treatment or revive validation. The fixture does not demonstrate two remote clients, real disconnection/reconnect timing, remote task synchronization or long-duration multiplayer behavior.
|
||||
@@ -0,0 +1,19 @@
|
||||
# Complete radio-document loss
|
||||
|
||||
Everon keeps two independent caches with two targeted radio documents each. The clue route remains unchanged: recovered documents advance the existing replicated location knowledge and update objectives and map markers. Finite stock is never replenished.
|
||||
|
||||
A conscious participant can also identify the actual radio station from within eight horizontal metres, with at most eight metres of height difference and an unobstructed native visibility trace. The ordinary five-second site tick performs discovery through `ERR_LocationComponent.Discover(0, 100)`, so both unknown (0) and partial (1) knowledge become identified (2) through existing events. No hidden station coordinates are published before the player discovers it. Approaching the real station remains a playable route after all four documents are destroyed, even if neither cache can provide clues.
|
||||
|
||||
The server validates the currently controlled player entity, connected account and roster life, player faction, active mission phase, registered site, distance and visibility. AI, detached bodies and spectators cannot identify a site. Radio authoring accepts at most eight metres; optional sites retain their sixty-metre maximum; prison and extraction proximity discovery remain disabled. Escape cannot directly reveal the radio.
|
||||
|
||||
The extraction map marker and objective copy now explicitly describe the initial helicopter pickup site. It is a location marker, not live helicopter tracking.
|
||||
|
||||
## Native fixture, not yet run
|
||||
|
||||
Run the Core fixture with `--smoke radio-document-loss` or `--smoke radio-document-loss-partial` after applying the integration snippets. The partial variant first transfers one real document into the real player's inventory with the isolated reveal chance set to zero, waits for ordinary discovery to produce knowledge 1, then destroys all four original document entities. The unknown variant destroys all four before any recovery. Both verify native weak references clear, cache/player inventories contain no target documents, and querying preparation does not replenish stock. A nearby unpossessed actor and a distant real player must not reveal the station. A wall inserted before a close approach must prevent discovery; removing it lets the normal site tick identify the station exactly once. The real participant must then pass ordinary tuning authorization and enter radio defence. The fixture ends with an explicit test defeat/reset; it does not claim a completed escape, manual play or multiplayer validation.
|
||||
|
||||
Only disposable fixture stock and test entities are deleted. The production path neither spawns replacement documents nor changes inventories. No original assets or mission files were changed. Source-policy tests execute actual discovery-bound methods after mechanical translation; native participant/trace behavior still requires the fixture run.
|
||||
|
||||
Native run `native-2026-09-19-070733` passes 58 combined assertions with zero engine or script errors for initially unknown radio knowledge. The previous failed trace diagnostic `070446` had clear sight but inconsistent offline identity lookup. Discovery now uses the audited roster’s canonical current-actor validation, shared with radio authorization. The partial-knowledge run remains separate.
|
||||
|
||||
The partial-knowledge fixture now also passes in [071654](evidence/native-2026-09-19-071654/report.json): 60 assertions and no native errors. It obtains one real document's knowledge before all four documents are destroyed, then verifies the same finite, close-discovery recovery path.
|
||||
@@ -0,0 +1,11 @@
|
||||
# Radio interruption feedback
|
||||
|
||||
The game mode replicates one presentation state: inactive, waiting, transmitting, or interrupted. Its existing server phase transitions and radio tick derive this from the authoritative defence service. The presentation state never advances or resets defence progress and adds no timer. A state change causes replication; unchanged ticks do not.
|
||||
|
||||
Entering radio defence publishes waiting before the first occupancy sample. A valid conscious defender changes it to transmitting. Losing all valid defenders after transmission began changes it to interrupted and keeps that message until transmission resumes. Leaving the defence phase clears the state, including completion and defeat. An initial empty radio area stays waiting rather than claiming a previous transmission failed.
|
||||
|
||||
The existing player guide polls the replicated mode once per second and compares its previous message before showing a hint. Its radio instruction now includes the state, so interruption and resumption produce fresh guidance without countdown chatter. Clients do not read the server-owned radio service. The task's existing detailed countdown remains unchanged.
|
||||
|
||||
`tests/test_radio_feedback_policy.py` executes the production state policy with exhaustive valid previous states and occupancy/phase combinations, plus repeated empty samples, recovery and round reset. The existing opt-in Core native fixture adds seven checks across tuning, real defender occupancy, unconsciousness, recovery, leaving the area and completion. Native assertions are prepared but not run in this isolated change. They verify authority state and instruction copy, not delivery to a remote client or rendered hints. Remote reception, late joining during interruption and round restart remain multiplayer acceptance checks.
|
||||
|
||||
Native integration passes in [073806](evidence/native-2026-09-19-073806/report.json): two complete Core escape/restart rounds, 564 total assertions and zero native errors. Both rounds verify each feedback state and the exact player-guide copy through interruption, recovery, leaving and completion. Actual remote replication/presentation remains pending.
|
||||
@@ -0,0 +1,11 @@
|
||||
# Incapacitated survivors and administrator abandonment
|
||||
|
||||
Core observes the controlled, living bodies of participants who have already used their life. A conscious participant can help; an incapacitated participant remains a survivor. A disconnected or temporarily unpossessed living body remains reserved and is not counted as an available rescuer. Dead bodies and spectators do not count. This observation does not change health, consume another life, advance a phase or end a round.
|
||||
|
||||
When no controlled survivor is conscious and at least one is incapacitated, the replicated mission status and native objective description explain that recovery remains possible and an administrator may abandon the round. Reconnection is mentioned when a living reserved body exists. The message clears when the condition changes; identical samples do not emit duplicate events. No additional death timer is imposed. Blood loss may still require treatment: the message is not a promise that every casualty will wake unaided.
|
||||
|
||||
`/esc mission abandon` is restricted to the existing server-validated administrator command channel. It accepts only the exact command during an active mission, records a specific result reason and enters the ordinary defeat/cleanup/restart path. Unauthorized, malformed, preparation and repeated terminal requests do not change the round. This gives administrators an explicit way to end a hopeless round while preserving recoverable and reconnecting survivors.
|
||||
|
||||
The `recovery` WORKBENCH fixture exercises actual controller incapacitation, the shared status, observer event deduplication, survival beyond the ordinary 30-second all-dead grace, restoration without replacing the actor, unauthorized/malformed requests and authorized abandonment. Controller state changes in that fixture establish mission policy only. The separate `medical` fixture tests actual blood loss and native treatment recovery without directly restoring consciousness. Neither fixture establishes remote-client replication, manual treatment actions or multiplayer acceptance.
|
||||
|
||||
Native run `native-2026-09-19-064406` passed all 54 combined assertions with zero engine errors. The fixture restored consciousness once, then tested authorized abandonment during a second active all-incapacitated warning. Terminal cleanup removed the status and counts. This is local policy evidence; multiplayer replication and manual treatment remain unqualified.
|
||||
@@ -0,0 +1,57 @@
|
||||
# Release qualification audit
|
||||
|
||||
Run `python3 tools/release_check.py`. The command is read-only and returns **1** when any release gate is missing, malformed, failed, pending or lacks valid evidence. A passing audit returns **0**. It does not change acceptance status, create a package, publish an addon or prove the contents of a human-written test report.
|
||||
|
||||
The current repository is intentionally refused: all seventeen first-release acceptance cases remain pending. Clean environment/restart development evidence exists after narrowing the faction catalogs, but further production changes require a current-source full-loop qualification. Scripted development successes cannot override missing release evidence; historical native failures remain archived.
|
||||
|
||||
## Required ledger entries
|
||||
|
||||
The checker requires every existing first-release case by its stable name, from `independent_native_build` through `own_identity_release_package`. Removing a difficult case cannot qualify a release. Unknown case names are rejected rather than accepted as replacements. Valid statuses are exactly `pending`, `passed` and `failed`; missing statuses and malformed entries are errors throughout both `cases` and `development_checks`.
|
||||
|
||||
Every required first-release case and the `clean_native_runtime` development gate must be `passed` with a nonempty evidence list. Evidence paths must identify nonempty regular files inside this repository using canonical relative POSIX paths. Absolute paths, traversal, symlinks, directories, missing files, duplicate paths and whitespace-only evidence are refused. Duplicate JSON keys and nonstandard JSON numbers are refused too.
|
||||
|
||||
Other development checks may remain pending or failed, including intentionally failed historical fixtures. Historical passed checks still need safe nonempty evidence, but their source manifests are not required to match today's sources. Older failures and older passing evidence should remain archived rather than being rewritten to satisfy the gate.
|
||||
|
||||
## Explicit native qualification
|
||||
|
||||
Both `cases.independent_native_build` and `development_checks.clean_native_runtime` require two additional explicit fields when passed:
|
||||
|
||||
```json
|
||||
{
|
||||
"status": "pending",
|
||||
"evidence": [
|
||||
"docs/evidence/QUALIFYING-RUN/report.json",
|
||||
"docs/evidence/QUALIFYING-RUN/source-sha256.json"
|
||||
],
|
||||
"native_report": "docs/evidence/QUALIFYING-RUN/report.json",
|
||||
"source_manifest": "docs/evidence/QUALIFYING-RUN/source-sha256.json"
|
||||
}
|
||||
```
|
||||
|
||||
This is an illustrative shape, not an acceptance update; the placeholder files do not exist. Only record passed status after the corresponding acceptance work has actually passed.
|
||||
|
||||
The report and manifest must belong to the same evidence archive. Future native qualification also requires the fixed `source-provenance.json`, `launch-source-sha256.json`, `launch-source.json`, `runner.json.txt` and `console.log.txt` files beside them. The explicit paths must also appear in that entry's evidence list. The report must name a nonempty raw native log in the same archive. The checker independently analyzes that log with the shared native report parser and rejects missing metrics, type changes, fabricated counters or error lists that disagree with the raw log. Qualification requires every round requested by the successfully completed runner and at least one passing assertion, with no captured script/runtime, engine-severity `(E)` or `(F)` or missing end-screen errors. These are local native prerequisites; the separate multiplayer, gameplay, workload and packaging cases remain mandatory.
|
||||
|
||||
The source manifest must match the complete current authored addon file set and each SHA-256 hash. Changed files, added files, missing files and extra stale manifest entries all invalidate qualification. The shared `tools/source_manifest.py` helper is also used by `tools/archive_native.py`, so archival and qualification use the same inventory. Unknown resource file formats are included automatically. Generated addon-root resource databases, `.pak`/`.log` files, and `.build`, `.local`, `__pycache__`, `profiles` directories are excluded; these locations are build/runtime state and must not contain authored source resources. Source symlinks are refused.
|
||||
|
||||
## Launch and stopped-run provenance
|
||||
|
||||
The hidden runner captures the complete addon manifest **before starting the engine process**. When its new native session directory appears, it writes the already captured bytes as `launch-source-sha256.json` plus `launch-source.json` metadata. The metadata records a unique launch ID, source root, command, capture timestamp and SHA-256 of the exact manifest bytes. It never reconstructs launch source state from files encountered later.
|
||||
|
||||
After terminating its owned processes, the runner hashes the final addon tree and exact raw `console.log` bytes. Its `runner.json` binds the launch ID/manifest hash, process start and stop timestamps, final source digest, raw log digest and completion result. A changed final source tree makes the runner fail as `source-changed`; captured engine failures remain preserved separately.
|
||||
|
||||
Archive only a stopped run. `archive_native.py` validates launch metadata against runner metadata, rejects source changes between launch and stop or between launch and archival, verifies the stopped raw log digest, and copies the original launch manifest bytes into `source-sha256.json`. It also retains the launch files and writes `source-provenance.json` with `kind: "launch_snapshot"`. Qualification verifies all those relationships again, requires the report to analyze that exact sealed `console.log.txt`, and rejects a recomputed clean report attached to a different raw log.
|
||||
|
||||
For a session created by an older runner without launch metadata, an explicit historical import is available:
|
||||
|
||||
```sh
|
||||
python3 tools/archive_native.py /path/to/stopped-old-session historical-name --allow-legacy-archive-time-source
|
||||
```
|
||||
|
||||
That import writes `kind: "archive_time_only"` and `qualification: "historical_only"`; its manifest describes the files at archive time, without asserting they were loaded by the old session. Such evidence cannot satisfy future native qualification, even if its current-source hashes and smoke counters happen to match. Missing/partial/corrupt launch evidence cannot be downgraded to legacy by this flag. Already existing historical archives and their native reports remain unchanged and readable; historical development entries still do not require current launch provenance.
|
||||
|
||||
These checks prevent accidental stale-source and old-log mixing. They are not cryptographic authentication or continuous filesystem surveillance: edits made and reverted entirely between the start/stop snapshots cannot be detected, and a person can still alter all evidence consistently. Do not edit tested sources while the process runs; preserve collection records and review semantic acceptance. The checker makes no release-readiness claim merely from an existing screenshot, report filename or old source manifest.
|
||||
|
||||
## Regression checks
|
||||
|
||||
`python3 tests/test_release_check.py` exercises forty-six focused cases in temporary directories, including a fully qualifying synthetic ledger, omitted requirements, a failed clean-runtime gate despite all cases being passed, malformed structures/statuses, empty files, unsafe paths and symlinks, changed/added/deleted addon files, stale manifests, falsified report metrics, retained native errors, truncated logs, historical evidence, launch/stop/raw-log binding, source mutation, explicit legacy import and read-only behavior. Synthetic test fixtures are never copied into the real acceptance ledger.
|
||||
@@ -0,0 +1,101 @@
|
||||
# Runtime testing
|
||||
|
||||
## Keep the desktop unobstructed
|
||||
|
||||
Use terminal/file checks by default. Do not repeatedly launch Workbench or game windows on the main monitor. A visible editor should use the user's selected spare output. The user authorized the right-hand display (HDMI-A-1, 1920×1080 on this machine). Keep primary DP-3 free of test windows. A KDE rule matching `steam_app_1874910` places both editor and in-editor game windows on screen 2 before mapping and disables fullscreen. The previous configuration was backed up to `~/.config/kwinrulesrc.erri-backup`. The rule is named `erri-workbench-right-monitor` and can be removed independently in KDE Window Rules.
|
||||
|
||||
A later test found that Workbench can restore geometry after placement and still extend onto the main display. Automated local tests therefore now use a dedicated headless Gamescope display and a cloned disposable Wine prefix. The graphical application remains native Workbench; this is not a dedicated-server test. No performance comparison may use these headless results as equivalent to an ordinary client workload.
|
||||
|
||||
The additional session guard is `tools/desktop/kwin-right-monitor.js`; it minimizes matching test windows if HDMI-A-1 is unavailable. The original title-only guard missed the separate game window, so use the application-class match and initial-placement rule together. Do not claim placement is verified merely because the editor window moved. Verify every new game/dialog window. The API is documented by [KDE](https://develop.kde.org/docs/plasma/kwin/api/).
|
||||
|
||||
Existing missions and the original workspace are read-only references. Never save their open editor documents during successor validation. All authored successor content and fixes belong in this repository.
|
||||
|
||||
## Native setup
|
||||
|
||||
Use matching stable Arma Reforger and Arma Reforger Tools installations. Keep original Escapists and its extensions unloaded. Register `addons` as an addon search directory, and open `addons/chat/addon.gproj`. Open `Worlds/ERR_Everon.ent` in the World Editor. `ERR_ValidateWorldPlugin` logs the authored locations' terrain heights; `-errPlay 1` allows that diagnostic plugin to enter play mode when deliberately invoked.
|
||||
|
||||
The command-line conventions follow the [official startup parameter documentation](https://community.bistudio.com/wiki/Arma_Reforger:Startup_Parameters): Workbench uses `-gproj`, `-addonsDir`, `-load` and `-plugin`. Workbench's `-load` is distinct from the game's `-world`. Launching a visible editor is an explicit test step, not part of `tools/check.py`.
|
||||
|
||||
## Acceptance sessions
|
||||
|
||||
Record the game/Tools versions, repository tree hash, addon list, player count, AI/vehicle counts, settings, map positions and complete logs for every run. Start from an isolated profile.
|
||||
|
||||
1. Join with 1, 2 and 12 players; verify one controlled prisoner each. Join late during every phase. Reconnect with the same identity both within and after native reconnect reservation expiry. Voluntary departure must not create a free extra life. Test reused transient player IDs.
|
||||
2. Test conscious, unconscious, revived and dead players; forbidden respawn requests; spectators; nobody connected; all survivors dead; partial extraction; defeat; restart. Voluntary reconnect reservation and spectator following are implemented; actual remote-client verification remains required.
|
||||
3. Pick the prison lock, leave the enclosure, scavenge physical folders, reveal/identify the radio, hold its area for the full continuous defence period, locate the helicopter and cross the escape boundary aboard it. Test every interrupted stage and a destroyed extraction vehicle. Check that moving or collecting objective objects cannot move the objective.
|
||||
4. Observe a player, interrupt a radio hop, remove/capture a relay, let a contact expire, lose a support group and deplete support ammunition. Verify orders reach only existing forces, are not duplicated and do not use undelivered knowledge. Aircraft/mortar/logistics cases remain blocked until their controllers are migrated.
|
||||
5. Repeat restarts and long empty/occupied server periods. Compare entity, AI group, callback, waypoint, inventory and journal counts. Check JIP marker state and shared-map ownership/visibility.
|
||||
|
||||
## Performance
|
||||
|
||||
Use equivalent player/AI/vehicle workloads, settings, routes and hardware for old and successor runs. Include warm-up, repeat runs and collect frame times/server FPS with populations held constant. Record median and lower-percentile FPS plus AI simulation load and entity counts. Reducing AI population is not evidence of a faster equivalent system. No FPS improvement is claimed before those measurements exist.
|
||||
|
||||
Do not publish while an acceptance entry is pending or failed. Source-policy regression passes are not multiplayer or performance evidence.
|
||||
|
||||
## Opt-in scripted integration smoke
|
||||
|
||||
In local Workbench only, `-errSmoke 1` enables `ERR_NativeSmoke` alongside the validation plugin and `-errPlay 1`. Use a disposable profile: the test changes its intel and defence settings, makes the test player invulnerable, takes a scene screenshot and teleports the player and helicopter. It never runs in a release game build or dedicated server. It exercises real spawn, prison action, guaranteed physical cache documents, inventory-driven discovery, radio range, continuous occupancy, interrupted defence and physical helicopter seating. Automatic round restart reruns it.
|
||||
|
||||
Run `python3 tools/native_report.py <console.log> --require-completions 2` to summarize assertions and retain script errors as failures. Stop the isolated test process after the required cycles. Do not interpret completion as manual piloting, multiplayer or performance acceptance.
|
||||
|
||||
`tools/reference_guard.py snapshot` and `verify` can compare the original workspace's source/resource contents around a validation session. Keep the baseline outside the original workspace.
|
||||
|
||||
Use `tools/native_command.py workbench --exe <Workbench> --profile <disposable-profile> --smoke victory` to print the test command, or `--smoke lost-helicopter` for extraction-vehicle loss. `--smoke player-death` kills the real prisoner, checks one-life identity rules and camera activation, then waits for all-dead defeat and restart. The helicopter-loss case deletes the empty test helicopter during extraction and expects native mission defeat. `tools/archive_native.py <session-directory> <new-evidence-name>` retains raw logs, screenshots and current source hashes without overwriting earlier evidence. Stop the test before archiving and archive before changing the tested addon sources. Its nonzero exit preserves native failures.
|
||||
|
||||
## Windowless local runner on Linux
|
||||
|
||||
Clone a working Tools compatdata directory into a disposable path outside Steam, preserving symlinks (`cp -a --reflink=auto`). Never point the runner at the user's live Wine prefix. With Gamescope and Proton Experimental installed:
|
||||
|
||||
```sh
|
||||
python3 tools/headless_workbench.py --compat /tmp/erri-headless-compat --profile /tmp/erri-workbench-profile --smoke radio-network --rounds 2
|
||||
```
|
||||
|
||||
The runner uses Gamescope's headless backend, retains full GPU rendering on a private display, and terminates only its new process group. It rejects a concurrent editor using the same test profile, stops after failure/timeout/completion, and returns a nonzero status for any recorded native errors. `radio-network` exercises real radio equipment and interrupted delivery before the normal death/spectator test.
|
||||
|
||||
The user requested muted test audio. The runner creates/reuses only `erri_tests_silent`, a muted null output, sets a separate PulseAudio application ID, and verifies/reroutes/mutes test-owned streams during execution. It does not change the system default sink or other application streams.
|
||||
|
||||
## Core isolation
|
||||
|
||||
Pass `--project core --smoke victory` to `headless_workbench.py` to compile only Core and vanilla and run the separate base fixture. The full integration fixture still defaults to `--project chat`. Core now owns document recovery and objective markers; optional Intel distribution and the shared field map must not be required to advance the mission. Inspect the **Loaded addons** log section, not **Available addons**, when checking actual isolation.
|
||||
|
||||
## Deliberate startup failure
|
||||
|
||||
Use `--project core --smoke startup-failure --rounds 1` only for the negative-path fixture. It changes the test's in-memory faction catalog to an invalid combination, verifies that services stop and no players/sites/stock spawn, checks the administrator-visible reason and rejects further progression. The normal startup ERROR is expected in this test and is preserved in the native report. No source configuration or external mission is modified. This fixture does not restart, so exactly one round is required.
|
||||
|
||||
The Core victory fixture also holds its actual player character unconscious for 35 seconds at the radio, longer than the all-dead grace period. It checks that the physical survivor still prevents defeat, cannot advance radio progress, retains control/camera, and resumes defence after consciousness is restored without receiving another life. This uses the native controller's consciousness transition; it does not validate treatment animations, medical item consumption, bleeding or a remote revive action.
|
||||
|
||||
## Alternate scavenging route and visual discovery
|
||||
|
||||
Use `--project core --smoke cache-loss --rounds 2 --timeout 480` with the hidden runner. The fixture deletes the southern supply crate before taking any documents, then completes escape using the western cache. It verifies that neither deleted nor depleted stock is recreated, including across the usual preparation query. Both repeated rounds must independently start with fresh configured sites.
|
||||
|
||||
Core victory and cache-loss fixtures also inspect the three outpost barriers for upright placement and actual collision. At the medical stash they test unconsciousness, distance, a temporary physical wall, clear visibility and one discovery event. Only the fixture adds/removes that isolated wall; production discovery changes knowledge without changing scenery. The cache-loss variant uses the alternate documents, while the normal victory variant uses the original southern cache.
|
||||
|
||||
`--project core --smoke site-survey --rounds 1` prints a bounded terrain and obstacle survey for three areas without changing existing scenery. Candidate grid checks are placement diagnostics, not navigability or encounter-balance acceptance. Existing authored successor objects can now appear as obstacles in a repeated survey.
|
||||
|
||||
## Extraction capacity, results and startup rollback
|
||||
|
||||
Use `--project core --smoke extraction-capacity --rounds 1` for twelve physical native occupants and isolated partial-result identities. It also checks hidden native result widgets and clock settings/progression. Synthetic roster bindings do not simulate a network connection. The fixture explicitly ends its own test round; it is not evidence of natural all-dead defeat.
|
||||
|
||||
Use `--project core --smoke early-helicopter-loss --rounds 2` for helicopter loss during prison while a living player remains, then automatic restart. `extraction-startup-failure` substitutes an unsuitable vanilla transport in memory; `extraction-boundary-failure` uses a zero boundary radius with the real helicopter. Both startup cases require `--rounds 1`, withhold players, and verify authored population/stock/scenery rollback. Their deliberate startup errors remain in the report.
|
||||
|
||||
The ordinary Core victory fixture also validates the mission clock. To test nondefault startup values, first stop the private runner, snapshot all three private-profile settings files (`profile/rereintroduced.json`, `.bak`, `.tmp`) byte-for-byte, then seed a valid primary settings file with `startTimeMinutes: 375` and `timeMultiplier: 4`. Complete two rounds, archive the input and results, and restore all three files exactly after the runner stops. Never modify a live or user profile. The default run separately checks that saving different next-round values does not alter the running clock. Remote clock agreement and long day/night transitions remain acceptance work.
|
||||
|
||||
## Radio service, task details and finite ground transport
|
||||
|
||||
The normal Core victory/cache-loss flow includes an isolated radio-service probe before actual tuning. It creates one additional physical character but simulates its connection membership and advances explicit service timestamps to exercise handover, unconsciousness/death, hostile affiliation, empty-server reset, live duration changes and duplicate completion. It restores the live character/configuration before the ordinary real-tick defence sequence. This is not two connected clients.
|
||||
|
||||
The Core fixture also opens hidden native task list/detail widgets and checks their text through prison, discovery, transmission/interruption and extraction. An existing details panel must refresh as the underlying task description changes. Local widget text is not remote replication or manual UI usability acceptance.
|
||||
|
||||
Use `--project core --smoke transport-loss --rounds 1` for physical UAZ driver/passenger occupancy, engine start, fuel depletion and permanent loss. The fixture then stops the site service and explicitly requests its own test reset. `--smoke transport-survey --rounds 1` temporarily omits vehicles only in its in-memory fixture definition, then surveys nearby terrain/geometry without removing scenery; it is authoring diagnostics, not a playable mission configuration.
|
||||
|
||||
Add `--station-teardown-diagnostics` to the hidden runner for bounded Workbench-only logging of support-station deletion validation. It forwards `-errStationTeardownDiag 1`, preserves all vanilla validation/errors, and neither repairs nor suppresses the catalog issue. [Native error investigation](native-errors.md) records the established resource mismatch and unconfirmed teardown hypothesis.
|
||||
|
||||
The offline [performance comparison tool](performance-comparison.md) checks paired captures and equivalent workloads before computing frame-time/FPS differences. It has only synthetic regression coverage so far; no real benchmark results have been collected. [Release qualification](release-qualification.md) now checks current native source hashes and raw logs as well as the acceptance ledger. Both tools leave current release/performance acceptance pending.
|
||||
|
||||
## Pending player admission
|
||||
|
||||
Use `--project core --smoke lifecycle --rounds 1` for the bounded physical slot, delayed finalization and cleanup probe. The fixture uses the real local controller plus explicitly owned synthetic pending actors; it does not create remote connections or grant/reset lives. See [player lifecycle](player-lifecycle.md).
|
||||
|
||||
## Objective panel destruction
|
||||
|
||||
Use `--project core --smoke objective-ui --rounds 1` for the short native close/rebind/reopen and isolated task-deletion check. It restores the actual mission task assignment and requests its own terminal test reset. See [objective widget lifecycle](objective-widget-lifecycle.md). Every new headless session captures pre-launch addon hashes and a stopped log seal; archive it before changing addon sources.
|
||||
@@ -0,0 +1,41 @@
|
||||
# Authoring base mission sites
|
||||
|
||||
Core loads `Configs/ERR/EveronSites.conf` through the scenario component on its game mode prefab. Definitions describe initial content; `ERR_SiteService` owns physical entities; `ERR_GameMode` alone advances the escape.
|
||||
|
||||
## Current Everon route
|
||||
|
||||
| Site | Position (X/Z) | Initial content |
|
||||
| --- | --- | --- |
|
||||
| Prison | 6090 / 7160 | New prison composition; 5 PM pistols, 8 magazines and a field map; guard squad |
|
||||
| Southern supply cache | 6150 / 7050 | 8 AK-74 rifles, 16 loose magazines, 12 dressings, 2 radio documents; guard squad |
|
||||
| Western supply cache | 5960 / 7220 | 4 AK-74 rifles, 8 loose magazines, 6 dressings, 2 radio documents; guard squad |
|
||||
| Medical stash | 6340 / 7400 | 12 dressings, 6 saline bags, 6 morphine injectors, 3 maps; unguarded |
|
||||
| Radio station | 6500 / 7200 | Radio objective and guard squad |
|
||||
| Eastern guard outpost | 6740 / 7300 | 2 AK-74 rifles, 10 loose magazines, 2 binoculars, 4 dressings, 3 static sandbag barriers; guard squad |
|
||||
| Extraction | 7000 / 7500 | Extraction marker, vanilla helicopter and guard squad |
|
||||
|
||||
Escape reveals both supply caches by name. Each independently contains enough physical documents to identify the radio; losing one before recovering any clues leaves the other route available. Caches are about 238 metres apart, roughly 125 and 143 metres from the prison. The medical stash and outpost are optional detours. Once the escape has begun, conscious players within 25 metres of the medical stash or 35 metres of the outpost can discover it through a clear native line-of-sight trace. Unknown objective sites cannot be revealed by proximity.
|
||||
|
||||
The seven sites have 117 explicitly authored stock entities and six six-person guard squads. Vanilla weapons may contain their own magazines or attachments, so recursive inventory totals are larger. The optional AI addon adds its existing finite mortar crew separately. All enemies are initial physical forces; alerts do not spawn reinforcements.
|
||||
|
||||
All content is newly authored composition data or references to installed vanilla resources. Five finite crates use a vanilla weapon-crate model with 120 litres of storage, an 80 kg limit and 120/40/40 cm maximum item dimensions. They have a generic inventory manager and no arsenal or restocking controller. The Map companion may substitute its shared map for authored vanilla maps; essential progression stays in Core. The new sandbag resource has static collision and no destruction controller; destruction behavior is not implemented.
|
||||
|
||||
## Definition fields and limits
|
||||
|
||||
Each `ERR_SiteDefinition` has a unique `Id`, a nonempty `Label` of at most 64 characters, `Kind`, composition `Prefab`, world `Position`, optional guard group and offset, and optional container and offset. `Stock` entries specify a prefab and finite count. Objective-document entries require `TargetId` naming a radio site. `RevealOnEscape` exposes a supply location after prison escape. `DiscoverRadius` defaults to zero. Optional DEPOT/OUTPOST sites permit up to 60 metres; a RADIO site permits up to eight metres for close physical identification if documents were lost. Everon authors an eight-metre radio radius. A current conscious participant with the matching account, roster actor and player faction must approach within the radius, stay within eight metres vertically, and have an unobstructed trace to the station. Identification uses the existing discovery event and works from knowledge 0 or 1 without creating documents. Prison and extraction proximity discovery remain disabled; `RevealOnEscape` remains restricted to optional sites. The extraction marker labels the initial pickup site, not the current moving helicopter.
|
||||
|
||||
`Props` places finite scenery with a prefab, ground-relative offset and angles. There may be at most 12 props per site and 64 overall, with offsets at most 40 metres long. Runtime footprint checks reject obstructed placement rather than clearing existing scenery. Height offsets are applied after terrain sampling. Prop templates must supply appropriate static collision and replication; the service does not construct destruction controllers.
|
||||
|
||||
The first release requires exactly one prison, radio and extraction site. Definitions are bounded to 32 sites, eight guard groups and 256 authored stock entities, with at most 64 of any stock entry. A starting map is required. `MinimumRadioSources` is two in Everon (authoring range 1–8); each qualifying prison or escape-revealed site must contain at least two radio documents, and qualifying sites must be at least 100 metres apart. Duplicate IDs, dangling/wrong-kind document targets, missing containers and insufficient independent clue routes fail validation before spawning.
|
||||
|
||||
## Ownership, discovery and failures
|
||||
|
||||
Preparation has pending, ready and failed results. Each item is spawned once; rejected inventory insertion retries use that same physical entity. Accepted requests are not resubmitted while awaiting confirmation. The mission stays in preparation until every authored item is present in its destination inventory. A bounded timeout rolls back the authored entities and keeps player spawning disabled instead of starting with incomplete objectives.
|
||||
|
||||
Once ready, checking preparation again returns the existing result. It does not recreate stock, destroyed containers or guards. Guards register once with the mission so the optional HQ coordinates existing forces. Discovery scans run at most every five seconds and skip known sites; they check conscious player state, horizontal distance, an eight-metre vertical bound and native world/entity visibility. Knowledge changes publish the server-side `OnLocationDiscovered(location, previous, current)` event once per transition. Replicated knowledge and names drive local map labels; the event itself is not a client RPC.
|
||||
|
||||
End-of-round world teardown disposes of mission entities; mission stop cancels activation and strategic services. Full entity-count and multiplayer ownership soak tests remain necessary.
|
||||
|
||||
The new sites were chosen with a read-only native terrain/obstruction survey. Across four-metre terrain samples, elevation ranges are 0.375 metres (western cache), 0.15625 metres (medical) and 0.6875 metres (outpost). Runtime checks also reject obstructed crate and prop footprints. This does not establish navmesh access, rendered presentation, fair encounters or manual playability. See the native regression results in [validation](validation.md); medical treatment and multi-client inventory contention remain unverified.
|
||||
|
||||
Guard population can use `Guarded 1` to select the injected faction catalog's group prefab. An explicit `Guards` resource remains available for specialized compositions, but its runtime faction must match the catalog's enemy faction. Changing faction keys does not retag incompatible assets.
|
||||
@@ -0,0 +1,35 @@
|
||||
# Finite site patrols
|
||||
|
||||
Two existing six-member site squads receive native repeating ground routes: the western supply cache and eastern outpost. Four other guarded sites retain their initial Defend orders, including the prison gate guards. No group, member, ammunition or route replacement occurs on an alert, casualty or later tick.
|
||||
|
||||
`ERR_SiteDefinition.Patrol` is optional. A route requires an existing guarded depot/outpost, 2–6 non-null points, ground offsets within 60 metres of its guard anchor, and at least 12 metres between every pair of points. The Move prefab's native completion radius is 5 metres. Ground height is sampled at each point. These authoring bounds do not prove navmesh connectivity or obstacle clearance.
|
||||
|
||||
The authored loops are offsets `(18,0,0), (18,0,24), (-6,0,24), (-6,0,0)` from their guard anchors. Western anchor: X5976/Z7220; eastern anchor: X6756/Z7300. They avoid the authored western crate/parked UAZ and eastern cover footprint on paper. Native traversal and visual/manual route suitability remain pending; terrain coordinates alone are insufficient evidence.
|
||||
|
||||
SiteService creates and owns four Move waypoints and one Cycle per route during its one permitted preparation. The native cycle inserts its own children and itself; only the Cycle is initially enqueued. Partial resource failure rolls back the site population and all route entities. Stop clears the cycle's children, removes only owned patrol waypoints from the group queue, and deletes those entities. Stop is idempotent. A foreign Search waypoint is preserved by route cleanup; mission shutdown separately stops HQ and the groups.
|
||||
|
||||
Existing HQ behavior remains authoritative. Its delivered order inserts Search at queue index zero. Its release removes only that Search, so the pre-existing native cycle can resume. No production HQ code changes are needed.
|
||||
|
||||
## Resource provenance
|
||||
|
||||
The identities were read from the installed vanilla `addons/data/resourceDatabase.rdb`:
|
||||
|
||||
- `{750A8D1695BD6998}Prefabs/AI/Waypoints/AIWaypoint_Move.et`
|
||||
- `{35BD6541CBB8AC08}Prefabs/AI/Waypoints/AIWaypoint_Cycle.et`
|
||||
|
||||
Installed vanilla `scripts/Game/Commanding/Commands/SCR_PatrolGroupCommand.c`, `scripts/Game/Components/Locations/SCR_AmbientPatrolSpawnPointComponent.c` and generated `AIWaypointCycle` API establish the SetWaypoints + enqueue-Cycle pattern. Cycle prefab sets RerunCounter -1. This is vanilla resource/API use; no original Escapists implementation was copied.
|
||||
|
||||
## Native fixture integration and limits
|
||||
|
||||
Compile Core and AI first. No engine run was performed by this implementation agent.
|
||||
|
||||
1. Core: construct `new ERR_NativePatrolProbe(mode, "everon-outpost-1")` after site activation, then call `Tick(now)` with real world milliseconds. Return -1 means failure, 0 pending, 1 success. It subscribes to actual completion events, requires five ordered Move completions (crossing a cycle boundary) and >=8m displacement of an existing physical actor, with a 180s deadline. It does not teleport actors, complete waypoints artificially or spawn soldiers. It also validates both authored routes, queue uniqueness, bounded definitions and stationary prison orders. Run the same probe for `"everon-supply-2"` to validate both traversals. Call `Stop()` on abort; destructor also removes its listener.
|
||||
2. AI: `new ERR_NativePatrolHQProbe(mode)`, same Tick convention, after an outpost route has been observed. Its WORKBENCH-only HQ adapter invokes the actual DeliverOrder and Release on an eligible, idle, registered outpost unit. It verifies Search becomes current, the baseline queue survives, then a patrol waypoint becomes current again after release. This is an intentionally simulated delivered-order trigger, not proof of radio transit or multiplayer timing. Existing perception/combat or a live HQ assignment causes failure rather than being erased. Call `Stop()` on abort.
|
||||
3. After the HQ probe, run the outpost movement probe again to demonstrate physical traversal after release. The queue check alone is not physical-resumption proof.
|
||||
4. Last, in a disposable mission, `ERR_NativePatrolProbe.StopChecks(mode)` verifies route cleanup preserves a separately owned Search and repeated Stop remains stopped. This intentionally stops site services; finish/reset the fixture immediately afterwards.
|
||||
|
||||
The probes are opt-in under WORKBENCH. They do not change normal startup or force responses. Full AI fights, patrol losses, multiple remote players, long-session performance and manual stealth gameplay remain separate acceptance work.
|
||||
|
||||
Native run `native-2026-09-19-070919` passes 295 combined assertions with zero engine or script errors. Both routes physically move existing guards and complete five native Move events in cyclic order, then retain unique queues and preserve a foreign Search through repeated route cleanup. Initial GetWaypoints snapshots contain repeated Move references; these disappear as native completions occur. The fixture retains bounded queue-growth and completion-order checks, deferring strict uniqueness until the first cycle has advanced. This observed startup behavior does not justify manually deduplicating the native queue. HQ preemption/resumption, manual route suitability and multiplayer remain separate.
|
||||
|
||||
HQ integration now passes in [072838](evidence/native-2026-09-19-072838/report.json), 272 assertions and zero errors with all companions loaded. Actual delivered-order assignment preempts the existing outpost patrol; actual release preserves the route, and five subsequent ordered native completions and physical displacement demonstrate resumed movement. Radio delivery and remote clients remain separate acceptance gates.
|
||||
@@ -0,0 +1,248 @@
|
||||
# Validation evidence
|
||||
|
||||
2026-09-19, local development environment. This remains a development prototype, not a release-qualified successor.
|
||||
|
||||
## Repository checks
|
||||
|
||||
`python3 tools/check.py` passes: five-addon isolation, acyclic dependencies, twenty-two source resource identities, exact successor/vanilla GUID references, production mission-rule boundaries, physical radio paths and failure handling, settings conversion, helicopter availability policy and mortar salvo policy. The latter two are helper tests, not operational support-controller evidence.
|
||||
|
||||
The reference guard verified all 533 original workspace source/resource files against the pre-test snapshot. Existing missions were not edited or saved. Native tests use a separate profile and only the successor projects plus vanilla dependencies. Earlier successful visible runs were measured on the right display. A later launch restored an oversized main Workbench window despite placement rules; those tests were stopped. Automated tests now run on an isolated headless display and create no physical-desktop windows.
|
||||
|
||||
## Native development sessions
|
||||
|
||||
Workbench version: 1.8.0.13. The initial September 18 source snapshots remain in `native-initial-snapshot.json` and `native-followup-snapshot.json`. They established script compilation, native world loading and initial spawning only.
|
||||
|
||||
Durable logs, screenshot captures, source hashes and a machine-readable report for `logs_2026-09-19_00-28-24` are in [native-2026-09-19-002824](evidence/native-2026-09-19-002824/report.json). That run completed two scripted rounds across an automatic restart, with 38 passing assertions. It exercised native prisoner spawn, the authored lock action, two real cache documents recovered into inventory, intel-driven identification, radio range rejection, interrupted and continuous defence, physical helicopter seating and the victory boundary.
|
||||
|
||||
The diagnostic deliberately teleports the player and helicopter and makes the test player invulnerable. It does not establish manual escape/piloting, combat balance, multiplayer lifecycle or FPS improvement. Engine screenshots capture the rendered scene and do not prove the HUD/end-screen presentation.
|
||||
|
||||
The original prison prototype had an unsuitable slope and a gate-opening mismatch. Read-only terrain and model-clearance scans selected an open site at 6090/7160. The gate now spans the three-metre opening. Walls have explicit hierarchy ownership, and equipment is placed on tables above vegetation. Final physical gate-passage and defeat checks are recorded separately below.
|
||||
|
||||
## Remaining native issues
|
||||
|
||||
The run is not a clean runtime pass. The report preserves errors rather than suppressing them:
|
||||
|
||||
- Some restarts emit two catalog-manager errors associated with vanilla US and USSR medical-kit catalog objects. Read-only source inspection identified an inherited `SCR_BaseItemSupportStationComponent.OnDelete` validation path; the opt-in diagnostic now records the actual owner and manager state. The missing-manager teardown cause remains an inference until reproduced with that diagnostic.
|
||||
- Vanilla vehicle resources emit unsupported fields: M151A2 `SlidingTrackMaterial`, and catalog-loaded BRDM2/BTR70 `Parent` entries. Validate the installed game/Tools resource compatibility before release.
|
||||
- Vanilla UI slot/button warnings occur during end-screen setup, and inherited Everon initialization reports a radio-manager ordering warning. The successor creates its radio manager, but these warnings still need evaluation.
|
||||
|
||||
The shared-map destruction exception and unsupported runtime destructible-wall errors from earlier prototypes no longer occur in the archived repeated-round run.
|
||||
|
||||
No dedicated multiplayer, reconnect, spectator, twelve-player, operational support-controller, equivalent-workload performance or release-packaging acceptance has passed. The full acceptance ledger remains pending.
|
||||
|
||||
## Final gate and victory regression
|
||||
|
||||
[native-2026-09-19-003520](evidence/native-2026-09-19-003520/report.json) contains two completed rounds and 40 assertions, including `BaseDoorComponent.CanCharacterPass(0.6)` after unlocking. The actual result configuration returned "You escaped Everon" for the extracted player. The run had no script errors or virtual-machine exceptions. Seven inherited vehicle schema errors remain in the report, so its overall runtime result is deliberately nonzero. The source manifest matches the tested repository.
|
||||
|
||||
A Workbench-only diagnostic briefly replaced the reflected end-screen class and caused an unknown-class resource error in an intermediate run. That diagnostic override was removed; the archived final run resolves the class and the victory title successfully.
|
||||
|
||||
## Extraction loss and defeat restart
|
||||
|
||||
[native-2026-09-19-003902](evidence/native-2026-09-19-003902/report.json) completed two helicopter-loss rounds and recorded 45 passing assertions, including startup of a third round before the test process stopped. Removing the empty extraction helicopter during extraction caused DEFEAT through the normal server tick, then the mission restarted and completed the same test again. The defeat end-screen configuration resolved without missing-screen errors. This is not an all-players-dead, unconsciousness, reconnect or multiplayer test.
|
||||
|
||||
Four catalog-manager errors were recorded across the two restarts, alongside the inherited vehicle schema errors. The archive deliberately retains the failing overall native report. Both test processes were stopped; the user's pre-existing editor was left open.
|
||||
|
||||
## Player death, identity roster and spectator restart
|
||||
|
||||
[native-2026-09-19-011025](evidence/native-2026-09-19-011025/report.json) contains two completed death rounds with 20 passing assertions and no script/runtime exceptions. The fixture exercises native character death, transition into the local spectator camera, the all-dead grace interval, defeat and automatic restart. An isolated roster with a real living actor checks spent-life retention, disconnected survivor retention, duplicate identity rejection and reused connection IDs. It does not simulate an actual remote disconnect/reconnect. Seven inherited vehicle schema errors still fail the overall native report.
|
||||
|
||||
This test ran on headless Gamescope at 1280×720/30Hz using a cloned disposable Proton prefix. The physical desktop contained only the user's pre-existing editor. `tools/headless_workbench.py` provides a bounded version of this runner, stopping on failure, timeout or the requested number of completions and preserving engine errors in its exit status.
|
||||
|
||||
## Physical radio equipment and routing
|
||||
|
||||
[native-2026-09-19-011738](evidence/native-2026-09-19-011738/report.json) completed two bounded headless rounds with 30 assertions and no script/runtime exceptions. Each authored six-person patrol now includes one vanilla RTO with a physical manpack. The test runs production uplink and downlink routes, then removes a receiving carrier's actual radio during transmission and verifies delivery fails. It does not insert a synthetic contact into HQ. Strategic response to native visual perception remains a separate test. Seven inherited vehicle schema errors remain.
|
||||
|
||||
Both installed executable version resources report 1.8.0.13 (game Steam build 24903726; Tools build 24870687). The remaining schema errors are therefore not explained merely by different displayed version numbers.
|
||||
|
||||
## Native sighting to HQ response
|
||||
|
||||
[native-2026-09-19-012234](evidence/native-2026-09-19-012234/report.json) completed two headless rounds with 24 assertions. The real player was moved in front of a guard squad. Native perception generated a sighting; the production radio route delivered it to HQ; two different existing squads received downlinked orders and distinct search waypoints. The fixture did not inject HQ contacts or create response forces. Both rounds subsequently passed death, spectator and defeat. Two inherited catalog cleanup errors reappeared during restart; seven vehicle schema errors also remain. This is a scoped coordinator integration pass, not a clean native runtime pass.
|
||||
|
||||
## Silent complete-loop regression
|
||||
|
||||
[native-2026-09-19-013224](evidence/native-2026-09-19-013224/report.json) completed two headless escape rounds with 52 assertions and no script/runtime exceptions after the roster, spectator and radio-composition changes. Test audio was independently verified muted on the dedicated silent sink; other audio outputs were unchanged. Seven inherited vehicle schema errors remain. A preceding launch exited before gameplay with a host `double free or corruption` error; its raw diagnostics are retained in `native-2026-09-19-012838-host-crash` and are not counted as a successful run.
|
||||
|
||||
## Physical mortar inventory checkpoint
|
||||
|
||||
[native-2026-09-19-014052](evidence/native-2026-09-19-014052/report.json) completed two muted headless rounds with 30 assertions and no script/VM exceptions. Native inventories held exactly 27 HE shells across three crew plus a separate manpack operator. Deleting the shells did not replenish ammunition; deleting the gun and crew did not spawn replacements. Seven inherited vehicle schema errors remain. Firing, convoy rearming and multiplayer support acceptance are unverified. Further support migration is deferred while completing the base replacement.
|
||||
|
||||
## Independent base escape
|
||||
|
||||
[native-2026-09-19-015043](evidence/native-2026-09-19-015043/report.json) records two Core-only rounds and 26 assertions. The loaded-addon section contains engine core, vanilla Reforger and ERR_Core. Essential inventory-document recovery and discovered objective markers now belong to Core, with a separate base scenario identity. The scripted escape succeeds without AI, Intel, Chat or Map. Two catalog teardown errors and seven vehicle schema errors remain. This proves dependency separation and the exercised progression paths, not manual playability or multiplayer acceptance.
|
||||
|
||||
[native-2026-09-19-015605](evidence/native-2026-09-19-015605/report.json) adds the native objective service: two Core-only rounds, 38 assertions, no script or VM exceptions. Tests verify prison task creation, previous-task completion, list-only search disclosure, changed instructions after radio discovery, countdown and reset after interrupted defence, physical extraction and restart. Seven inherited vehicle schema errors remain. These assertions inspect native task state; they do not establish the rendered UI quality or remote-client behavior.
|
||||
|
||||
[native-2026-09-19-015947](evidence/native-2026-09-19-015947/report.json) checks the same Core changes with all companions loaded: one escape round, 26 assertions, no script/VM exceptions. Seven vehicle schema errors remain. The test retains physical document recovery, interrupted radio defence and actual helicopter occupancy while the core services own progression.
|
||||
|
||||
[native-2026-09-19-020149](evidence/native-2026-09-19-020149/report.json) checks death/spectator/defeat with the new Core task lifecycle and companions loaded: one round, 10 assertions, no script/VM exceptions. Seven inherited vehicle schema errors remain.
|
||||
|
||||
## Authored sites and finite scavenging
|
||||
|
||||
[native-2026-09-19-022704](evidence/native-2026-09-19-022704/report.json) records two Core-only rounds with 62 assertions and no script/VM exceptions. The four configured sites prepare 52 physical stock entities; recursive inventory totals include native weapon attachments. The player transfers both targeted radio documents from the supply crate. Empty stock stays empty when preparation is queried again, and a destroyed crate remains absent. Radio progress, extraction and restart complete afterward. Both crate footprints pass bounded native model-clearance checks; the supply terrain sample spans 0.625 metres over six metres. Seven inherited vehicle schema errors remain.
|
||||
|
||||
Earlier failed iterations are retained with their source hashes: attribute/callback compilation errors, unregistered storage, insufficient crate capacity, and use of a character-only inventory manager on a world container. The final controller uses the generic manager with explicit storage registration and an appropriately bounded weapon crate. These failures were corrected before the successful run; they are not hidden from the evidence archive.
|
||||
|
||||
[native-2026-09-19-023120](evidence/native-2026-09-19-023120/report.json) repeats the new site flow with all companions loaded: two complete rounds and 52 assertions, including physical inventory transfers, interrupted radio defence and extraction. Templates now obtain location IDs entirely from definitions. The inherited catalog teardown pair and seven vehicle schema errors remain in the report, so this is not a clean runtime acceptance.
|
||||
|
||||
[native-2026-09-19-023514](evidence/native-2026-09-19-023514/report.json) verifies radio integration after site ownership moved into Core: one muted headless round and 15 assertions, with no script/VM exceptions. All four authored six-person squads carry physical manpacks. Uplink and downlink work, and removing a receiving radio interrupts delivery. Native death, local spectator and all-dead defeat also pass. Seven inherited vehicle schema errors remain.
|
||||
|
||||
## Injected base catalog and administration
|
||||
|
||||
[native-2026-09-19-025539](evidence/native-2026-09-19-025539/report.json) completed two Core-only muted headless rounds and 92 assertions without script/VM exceptions. The physical prisoner and guard group match the injected catalog. Separate catalog mutations reject identical and unknown faction keys and a missing prisoner entry. Core's command service rejects unauthorized, malformed and out-of-range setting changes; valid commands save/read/restore the test duration. Escape, stock losses, objectives and restart still pass. Seven inherited vehicle schema errors remain.
|
||||
|
||||
The command tests call the native server service directly. They do not prove remote RPC identity enforcement, command-panel usability or pre-spawn presentation. Earlier command extension ordering and compact conditional-return compilation failures are retained in `native-2026-09-19-025246-compile-failure` and `native-2026-09-19-025341-compile-failure`; both were corrected before this successful run.
|
||||
|
||||
[native-2026-09-19-030156-expected-startup-failure](evidence/native-2026-09-19-030156-expected-startup-failure/report.json) contains four passing assertions for deliberately invalid faction setup. No players, sites or stock spawn; services stop; administrators can retrieve the cause; even an otherwise legal transition from preparation into prison is rejected. The fixture modifies only its in-memory catalog. The expected startup ERROR and seven inherited vehicle schema errors remain in the report. The preceding scoped run is retained in `native-2026-09-19-025951-expected-startup-failure`. This is failure-handling evidence, not clean runtime or remote UI acceptance.
|
||||
|
||||
[native-2026-09-19-030347](evidence/native-2026-09-19-030347/report.json) completed two Core-only escape rounds and 102 assertions without script/VM exceptions. A native controller transition keeps the actual player unconscious at the radio for 35 seconds. The player still prevents all-dead defeat, cannot progress transmission, retains the same body and camera, and resumes defence from zero after consciousness is restored. The one-life rule remains spent. These checks repeat after restart alongside the catalog/administration checks. Seven inherited vehicle schema errors remain. This does not validate medical item use, treatment animation, bleeding or remote revive actions.
|
||||
|
||||
[native-2026-09-19-030903](evidence/native-2026-09-19-030903/report.json) completed two companion-loaded rounds with 96 assertions and no script/VM exceptions. Existing HQ interval/squad/radius and Intel carrying/reveal aliases resolve through the Core command service; unauthorized journal access is rejected; HQ status is preserved. Both rounds also pass the catalog, base administration, physical intel, radio defence, helicopter escape and restart checks. Seven inherited vehicle schema errors remain.
|
||||
|
||||
[native-2026-09-19-031256](evidence/native-2026-09-19-031256/report.json) records one companion-loaded death round and 32 assertions without script/VM exceptions. Native death retains the spent life, activates the local spectator camera and reaches all-dead defeat after the Core command initialization changes. Catalog and companion command checks also pass. Seven inherited vehicle schema errors remain; remote spectators and reconnects are still unverified.
|
||||
|
||||
## Expanded scavenging route and spatial survey
|
||||
|
||||
The read-only surveys in [031928](evidence/native-2026-09-19-031928-survey/report.json) and [032144](evidence/native-2026-09-19-032144-survey/report.json) inspected candidate terrain and obstacles. The initial 12-by-12-metre clearance requirement found no suitable candidates; using the actual 2.6-metre cache footprint found 19 western, 23 medical and 23 outpost candidates. Three low-slope sites were selected. No existing vanilla scenery or original missions were modified.
|
||||
|
||||
The first expanded-route native compile failed on Enforce's unsupported compound assignment to an indexed vector value. [033036-failed](evidence/native-2026-09-19-033036-failed/report.json) retains that failure and its cascading compiler diagnostics. An explicit assignment fixed it.
|
||||
|
||||
[033110](evidence/native-2026-09-19-033110/report.json) completed one Core-only cache-loss escape with 65 assertions and no script/VM exceptions. All seven sites and 117 authored stock items prepared successfully; deleting the southern crate before recovery left the western documents able to identify the radio and complete extraction. Named optional medical discovery rejected unconscious and distant players, then emitted one event after a conscious player approached. Both stock depletion and deleted containers stayed lost. Seven inherited vehicle schema errors remained. A later API check found two sandbag rotations used pitch instead of yaw; subsequent validation uses corrected upright barriers and actual collision traces.
|
||||
|
||||
[033500-failed](evidence/native-2026-09-19-033500-failed/report.json) confirmed all three upright barriers had native collision, then failed the new blocked-discovery assertion. The fixture had placed the test wall by its end pivot, leaving the sight line at its edge. Existing native bounds showed the wall extends three metres from its origin; centering it across the sight line corrected the fixture. The failure is preserved rather than discarded.
|
||||
|
||||
|
||||
[033719](evidence/native-2026-09-19-033719/report.json) completed two Core-only cache-loss escape/restart rounds with 148 passing assertions. All 117 stock items prepared each round. The three corrected outpost barriers were upright and native traces hit their collision. A centered physical wall prevented medical-site discovery; removing it allowed the conscious nearby player to reveal the named stash and emit one event. The alternate radio documents completed both rounds after the primary cache had been removed. There were no VM exceptions or failed smoke assertions. Two inherited catalog-manager script errors occurred during restart, alongside seven inherited vehicle schema errors, so the overall native report remains failed. These scoped checks do not establish manual navigation, medical treatment or multiplayer behavior.
|
||||
|
||||
|
||||
[034344](evidence/native-2026-09-19-034344/report.json) completed one full-companion escape with 48 passing assertions and no script/VM exceptions. The expanded seven-site configuration prepares under HQ/Intel/Chat/Map; the southern cache's documents still complete the primary route with the existing command aliases, interrupted radio defence and physical extraction. Seven inherited vehicle schema errors remain.
|
||||
|
||||
|
||||
[034556](evidence/native-2026-09-19-034556/report.json) completed the expanded guard-radio regression and death/defeat sequence with 37 passing assertions and no script/VM exceptions. All six physical six-person squads had manpacks; the selected production uplink/downlink delivered and deleting the receiver's actual radio interrupted an in-flight HQ order. The fixture also checked native death, local spectator activation and all-dead defeat. This does not prove every multi-hop route. Seven inherited vehicle schema errors remain.
|
||||
|
||||
The three archives (033719, 034344 and 034556) match the 99 addon source/resource files at that historical checkpoint. All test processes were stopped. Source/resource checks pass for five isolated addons and 22 unique resources; the 533-file original-workspace reference guard remains unchanged. Manual gameplay, medical treatment, multiplayer, performance and clean-runtime release gates remain open.
|
||||
|
||||
## Independent extraction and mission clock
|
||||
|
||||
[040125](evidence/native-2026-09-19-040125/report.json) passed 60 capacity/partial-result assertions with twelve actual vanilla characters seated in separate positions in the authored Mi-8. The helicopter exposes seventeen pilot/passenger positions. The isolated roster distinguishes a dead occupant, a disembarked survivor, unconscious and reserved disconnected passengers, and a different identity reusing a connection ID. It freezes one outcome and does not replace lost transport. This fixture uses synthetic identities and explicitly requests its own test reset.
|
||||
|
||||
[040443](evidence/native-2026-09-19-040443-expected-startup-failure/report.json) and [040657](evidence/native-2026-09-19-040657-expected-boundary-failure/report.json) each passed three negative-startup assertions. An unsuitable vanilla transport and an invalid extraction boundary respectively prevent gameplay, retain an admin-readable reason, withhold player spawns and remove the already-authored content. Both expected startup errors are preserved alongside inherited vehicle errors.
|
||||
|
||||
[040928](evidence/native-2026-09-19-040928/report.json) passed 100 assertions with the integrated extraction, controller result and mission clock implementations. Real hidden vanilla result widgets update from the server-derived identity result and ignore stale winner IDs through isolated rebinding. The clock probe checks legacy settings migration without rewriting on load, explicit save/reload, invalid-value rejection, authorization, next-round-only changes and actual native clock advancement. No script/VM exceptions occurred; seven inherited vehicle schema errors remain.
|
||||
|
||||
[041233](evidence/native-2026-09-19-041233/report.json) passed six assertions across two natural defeat/restart rounds. Removing the extraction helicopter during prison ends the mission while the actual prisoner remains alive and presents the specific loss reason. Two inherited catalog cleanup script errors and seven vehicle schema errors remain.
|
||||
|
||||
These hidden, muted local tests establish the exercised service and native-object paths only. Remote delayed result replication, actual reconnects, twelve network clients, manual casualty loading/piloting, dedicated-server behavior and equivalent-workload performance remain unverified.
|
||||
|
||||
[041445](evidence/native-2026-09-19-041445/report.json) completed two Core-only escape/restart rounds with 194 assertions and no script/VM exceptions. Both rounds applied the seeded **06:15 / 4x** settings and verified actual native clock advancement. Existing catalog/admin, stock, discovery, unconsciousness, radio and extraction checks still pass. The seeded input is archived as `test-settings.json`; all three private-profile settings files were restored byte-for-byte after the stopped run. Seven inherited vehicle schema errors remain.
|
||||
|
||||
[042046](evidence/native-2026-09-19-042046/report.json) completed one companion-loaded escape with 48 assertions and no script/VM exceptions. Core, HQ, Intel, Chat and Map compile together; existing command aliases, physical documents, interrupted defence, extraction and the personal winner title still work. Seven inherited vehicle schema errors remain.
|
||||
|
||||
Archives 040928, 041233, 041445 and 042046 match all 105 addon source/resource files at this checkpoint. Tests ran on the private hidden display with muted test audio and were stopped afterward. The original workspace's 533 tracked reference source/resource files remain unchanged. Repository policy/resource checks pass; clean-runtime, manual-play, multiplayer and performance release requirements remain open.
|
||||
|
||||
## Base radio separation, native objective details and ground transport
|
||||
|
||||
[042945](evidence/native-2026-09-19-042945-ui-refresh-failure/report.json) retained a real presentation failure: the native task description changed after radio discovery, while its already-open details widget remained stale. The list/details initialized correctly and showed no hidden task position. The successor now subscribes only its own open objective details to native display-data changes, with removal on task switch/detach. The later 044330 and 044608 runs pass the already-open detail update after discovery; their separate new radio fixture fails before completing the round, so whole-loop validation remains separate.
|
||||
|
||||
[043410](evidence/native-2026-09-19-043410-parking-failure/report.json) rejected the first ground-transport parking position at 5960/7232 due to a native geometry obstruction. Preparation rolled back; the error was not suppressed. [043631](evidence/native-2026-09-19-043631-parking-survey/report.json) then surveyed 120 nearby positions with the transport temporarily omitted only in its fixture definition, finding 43 clear candidates without removing scenery. The selected southern position, 5960/7212, has a 0.625 m sampled terrain range over its six-metre square. This is placement evidence, not driving or navigation acceptance.
|
||||
|
||||
[043806](evidence/native-2026-09-19-043806-transport-readiness-failure/report.json) retained a subsequent readiness failure after the parking point itself passed. The bounded diagnostic in [044028](evidence/native-2026-09-19-044028-transport-bounds-failure/report.json) showed native vehicle bounds extending 3.25 m from the surveyed center, exceeding the original 2.5 m allowance; actual origin displacement was only about 0.06 m. The configuration now requires an eight-metre cleared square and retains a 0.5 m margin around full native bounds.
|
||||
|
||||
[044205](evidence/native-2026-09-19-044205/report.json) passes 23 native transport checks with no script/VM exceptions. Parking, five native driver/passenger positions, actual two-character occupancy, ordinary engine startup and finite fuel work. Native fuel starts at 58.5 L with 78 L capacity. Depleting fuel and deleting transport do not refill or recreate it, including repeated preparation/initialization queries. The fixture stops its site service and explicitly requests test reset. Seven inherited vehicle schema errors remain; this is not manual driving, road access or multiplayer acceptance.
|
||||
|
||||
[044330](evidence/native-2026-09-19-044330-radio-fixture-failure/report.json) and [044608](evidence/native-2026-09-19-044608-radio-position-fixture-failure/report.json) preserve failures in a new radio-service fixture that immediately checked distance after moving its character. Switching to the native character teleport API alone did not resolve the check; the fixture is being made asynchronous so it observes applied native state before asserting it. These runs do not count as completed Core regressions.
|
||||
|
||||
[044924](evidence/native-2026-09-19-044924/report.json) independently completes the established companion-loaded escape with 48 passing assertions and no script/VM exceptions. The production radio service accepts the identified nearby player, resets on departure, completes real-time continuous occupancy and advances to physical helicopter extraction. Existing command aliases, document recovery and personal results still work. Seven inherited vehicle schema errors remain.
|
||||
|
||||
The offline performance comparator passes fifteen synthetic regressions and does not produce real benchmark evidence. Release qualification passes 46 validation regressions and correctly refuses the current ledger: all first-release cases remain pending and clean native runtime remains failed. Neither tool changes acceptance or publishes a package.
|
||||
|
||||
[045450](evidence/native-2026-09-19-045450-radio-recovery-fixture-failure/report.json) confirms that deferred native movement resolves the distance assertions: the measured out-of-range position is 6.005 m from the radio and unconscious tuning is rejected. The next assertion fails during recovery. The test is being corrected to separate its overlapping characters and await native consciousness; no production authorization rule was weakened.
|
||||
|
||||
[050158](evidence/native-2026-09-19-050158-lifecycle-compile-failure/report.json) preserves a compiler rejection of two ticket member names that collide with native type names. The members were renamed before further testing.
|
||||
|
||||
[050240](evidence/native-2026-09-19-050240-lifecycle-reflection-failure/report.json) preserves the next integration failure: the WORKBENCH-only spawn-logic override needed to repeat its native container metadata. The corrected reflected class loads and starts an ordinary prisoner in [050403](evidence/native-2026-09-19-050403/report.json), which completes 54 lifecycle assertions without script/VM exceptions. Native geometry leaves 20 clear prison positions around the real prisoner; reserved slots remain distinct and inside the enclosure. A physical unowned body blocks its slot. Native finalization rejects spent-life and wrong-data requests, deletes only the owned unpossessed actor, preserves the actual prisoner, and rejects vertical displacement. The fixture explicitly ends its test; real remote preload, disconnect/reconnect and 12-client acceptance remain pending. Seven inherited vehicle schema errors remain.
|
||||
|
||||
[050515](evidence/native-2026-09-19-050515/report.json) completes two Core escape/restart rounds with 340 assertions, no script/VM exceptions and seven inherited vehicle schema errors. The independent radio edge fixture now waits for real native recovery and passes physical defender handover, empty samples, hostile/unknown/dead actors, interrupted occupancy, live duration changes, cancellation and one-time completion. The ordinary real-time escape then succeeds twice through the new player-admission gate. Native task details update after discovery, advancing progress and interruption. Separate objective-close cleanup review follows; remote UI remains unverified.
|
||||
|
||||
The opt-in station diagnostic identifies US/USSR medical-kit prefabs during `OnDelete/InitValidSetup` at restart. Both cached and global catalog references remain available in this run despite no current game mode, so the intermittent missing-manager error is not reproduced or declared fixed.
|
||||
|
||||
Future native runs now snapshot addon files before process launch, compare sources after shutdown and seal the raw console log. Archival and release checks reject source/log mismatches. Older archives retain their original historical evidence; they cannot satisfy the new launch-provenance release requirement.
|
||||
|
||||
[051249](evidence/native-2026-09-19-051249-companion-fixture-name-failure/report.json) preserves a companion compile failure from two WORKBENCH test helpers sharing a member name on the same extended game mode. The Core helper was renamed to avoid the pre-existing Chat radio-network probe. This is the first archive with mechanically verified pre-launch source, stopped source and raw-log hashes; the failed result remains failed.
|
||||
|
||||
[051452](evidence/native-2026-09-19-051452/report.json) completes two Core escape/restart rounds with 374 assertions, no script/VM errors and seven inherited resource errors. Native objective close/rebind/reopen checks pass, including no retained task events or delayed overflow calls to the closed panel. The runner verifies identical pre-launch and stopped addon sources and seals the raw log. A subsequent ownership-flag change covers task deletion before panel closure and is checked separately by the short `objective-ui` fixture.
|
||||
|
||||
[052140](evidence/native-2026-09-19-052140-deleted-task-callback-failure/report.json) preserves a remaining teardown failure: deleting an isolated native task clears its weak references and the panel detaches, but a delayed callback still reaches the retained test handler. The assertion remains failed while callback identity and queue state are investigated.
|
||||
|
||||
[052352](evidence/native-2026-09-19-052352/report.json) completes the full companion escape with 48 assertions, no script/VM errors and verified launch/stopped-source/log hashes. The helper-name collision is fixed. Core admission, radio, physical intel, preserved admin aliases and extraction work with all companions. Seven inherited resource errors remain; the isolated task-deletion UI failure is separate and still open at this snapshot.
|
||||
|
||||
[052621](evidence/native-2026-09-19-052621-deleted-task-callback-diagnostic/report.json) identifies the surviving callback as `UpdateAssignees`, invoked immediately when the real objective assignment is restored. Installed vanilla source declares all five task-event getters static; guarding their removal by a live task left the closed panel subscribed after task deletion. Cleanup now removes the static invoker subscriptions using retained successor-binding ownership. The unchanged delayed callback assertion is rerun rather than weakened.
|
||||
|
||||
[052811](evidence/native-2026-09-19-052811/report.json) reaches all 30 UI assertions and completion after the static-event fix, but remains a failed runtime result: the added name-based queue diagnostic tries to inspect protected `CheckOverflow` and emits three VM exceptions. The normal function-based cancellation does not emit them. The invalid diagnostic is removed before final UI validation; its exceptions are retained in this archive and the preceding diagnostic run.
|
||||
|
||||
[052932](evidence/native-2026-09-19-052932/report.json) completes the companion-loaded death/spectator/defeat fixture with 32 assertions, no script/VM exceptions and verified source/log provenance. Native damage kills the actual prisoner, activates the spectator camera and retains the spent life through the revised delayed observer callback. Seven inherited resource errors remain; remote reconnect and spectator streaming are still unverified.
|
||||
|
||||
[053124](evidence/native-2026-09-19-053124/report.json) completes all 30 isolated UI assertions with no script/VM exceptions after removing the temporary name-based diagnostic. Real close/rebind/reopen, native weak-reference clearing after isolated task deletion, global event unsubscribe, delayed callback cancellation and restoration of the actual objective assignment all pass. Seven inherited resource errors remain. Its pre-launch/stopped source manifests match all 116 final addon files, and the stopped raw-log hash verifies.
|
||||
|
||||
At this checkpoint, repository policy/resource checks, 15 synthetic performance-tool regressions and 46 release/provenance regressions pass. The actual release checker still refuses all 17 pending first-release cases plus failed clean native runtime. All private test runners are stopped. Manual equipment/medical/casualty gameplay, real multiplayer/preload/reconnect testing, operational support/logistics, equivalent-workload FPS measurements and release packaging remain unfinished. Historical archives describe their own source snapshots; they are not relabelled as final-source tests.
|
||||
|
||||
## Native medicine and environment checkpoint
|
||||
|
||||
[062406](evidence/native-2026-09-19-062406/report.json) passes 24 actual blood-loss and treatment assertions, including consumed dressing, one attached saline bag, duplicate rejection, native consciousness recovery and finite infusion completion. It retains the seven earlier inherited catalog errors.
|
||||
|
||||
[063559](evidence/native-2026-09-19-063559/report.json) passes 67 environment and deliberately narrowed faction-catalog assertions, with **zero script/VM or engine errors**. The successor profiles preserve vanilla faction, item, medical and radio behavior but catalog only its UAZ and Mi8 vehicles. Clear/overcast/rain, leap dates and unchanged clock progression pass. Repeated-round teardown, current complete-loop regression, manual play and multiplayer remain separate checks.
|
||||
|
||||
[063949](evidence/native-2026-09-19-063949/report.json) passes 155 combined assertions with zero engine errors. The revised 3m-spaced interior prison search accommodates one real controlled prisoner and eleven physical test characters. Each has the exact unique starting kit and can receive and return a real clue. Repeated inventory references are counted once by entity identity; distinct same-prefab objects remain distinct. This is physical placement and inventory evidence, not twelve-client multiplayer.
|
||||
|
||||
[064406](evidence/native-2026-09-19-064406/report.json) passes 54 combined assertions with zero engine errors. Recovery status, stable event counts, survival beyond the all-dead grace, identity preservation and administrator authorization pass. Explicit abandonment while the all-incapacitated warning is active enters normal defeat and clears the warning during cleanup.
|
||||
|
||||
[064716](evidence/native-2026-09-19-064716/report.json) retains an integration compile failure: a separate WORKBENCH modded layer could not expose its restart-probe field to the main fixture, and the patrol check passed an entity where a boolean was required. Both were corrected; [065233](evidence/native-2026-09-19-065233/report.json) compiles and reaches the patrol fixture, which stops on an unexpected repeated native queue reference. Its route interpretation remains under investigation rather than declaring traversal passed.
|
||||
|
||||
[065351](evidence/native-2026-09-19-065351/report.json) passes two real environment/restart rounds, 107 assertions and **zero engine or script/VM errors**. Real mode settings save 2000-02-29 and Overcast, leave the current round untouched, and load/apply them in the next mode instance. Native clock progression remains unchanged; successful round two removes the private fixture files. Bounded station diagnostics show medical kits in backpack inventories outside the main world, consistent with catalog preview content; neither successor site ownership nor a teardown failure was observed in this run. Complete-loop regression and remote testing remain separate.
|
||||
|
||||
[070733](evidence/native-2026-09-19-070733/report.json) passes 58 assertions with zero native errors after canonical participant validation is shared by discovery and radio authorization. The lost-document path deletes all four original clues, rejects distant/NPC/obstructed observers, and identifies the station once by actual close approach before authorized tuning. No replacement documents are created.
|
||||
|
||||
[070919](evidence/native-2026-09-19-070919/report.json) passes 295 assertions with zero native errors. Preparation observes complete six-person membership of every original guard squad. Both existing patrol groups move and complete five ordered native Move events, crossing a cycle boundary, before route-only cleanup preserves a foreign Search. Startup queue enumeration repeats references that clear as waypoints complete; no production queue normalization was introduced. HQ preemption, manual gameplay and remote clients remain separate checks.
|
||||
|
||||
[071654](evidence/native-2026-09-19-071654/report.json) passes 60 assertions with zero native errors. The partial-knowledge case transfers one real clue before losing all four documents, then verifies that close physical discovery still identifies the radio station and permits tuning. It does not duplicate documents or require zero prior knowledge.
|
||||
|
||||
[072014](evidence/native-2026-09-19-072014/report.json) retains a casualty-loading readiness failure. Over ten seconds, the untouched parked Mi8 remains alive, upright and motionless, but its native helicopter simulation reports no ground contact. The real participant, helper, distance and visibility checks pass. Casualty loading is not yet qualified; physical landing-gear support is being investigated without accepting a stationary hover.
|
||||
|
||||
[072609 ordinary game](evidence/game-2026-09-19-072609/report.json) preserves a failed private `ArmaReforgerSteamDiag.exe` launch. Its vanilla intro splash reports unknown `SCR_WidgetExportRuleRoot` before Game module compilation completes. GameLib reports `ENF_WB`; this run does not establish ordinary production compilation or mission startup. The runner stops only its own process group/prefix and confirms cleanup and unchanged addon bytes.
|
||||
|
||||
[072700](evidence/native-2026-09-19-072700/report.json) retains an actual guard-cancellation failure: an initially empty fixture-owned automatic squad receives a late native dispatch after repeated preparation Stop. The ordinary six mission groups remain separate. This identifies an incomplete cancellation path; a one-time purge alone has not proved sufficient while the incomplete group remains alive.
|
||||
|
||||
[072838](evidence/native-2026-09-19-072838/report.json) passes the companion HQ/patrol fixture: 272 assertions and zero native errors. The original outpost squad physically completes a route cycle, receives a real HQ Search through the delivered-order method, retains its patrol queue, and resumes physical cyclic movement after actual HQ release. No additional response force is created. This deliberately bypasses report radio transit and is not multiplayer proof.
|
||||
|
||||
[073231 ordinary game](evidence/game-2026-09-19-073231/report.json) confirms that the regular executable omits editor/diagnostic GameLib defines, but reproduces the same vanilla intro-splash unknown-class error before Game compilation finishes. The failure remains fatal; further diagnostic collection must not turn it into a clean startup pass.
|
||||
|
||||
[073313](evidence/native-2026-09-19-073313/report.json) preserves a compile failure in the new wheel-support helper: the native method is `Math3D.MatrixIdentity4`, not `MatrixIdentity`. After correction, [073423](evidence/native-2026-09-19-073423/report.json) compiles and proves that the sleeping, engine-off helicopter fails all three short wheel-support traces. Its wheel pivots resolve distinctly, but no supporting collision is found within the tight tolerance. This may be an initially unsettled vehicle on sloping ground; neither a stale contact flag nor a safely parked aircraft is assumed. Native placement/settling is being investigated.
|
||||
|
||||
[073601](evidence/native-2026-09-19-073601/report.json) passes 68 native assertions with zero errors after retiring each cancelled instance's spawn intent before purging. The empty squad receives no dispatch/member; the partial squad keeps its one existing member and two prior dispatches unchanged for fifteen seconds while the independent control reaches six. Normal rollback deletes the seven captured actors and all three groups; another six seconds shows no delayed dispatch. Actual mission groups remain intact.
|
||||
|
||||
[073806](evidence/native-2026-09-19-073806/report.json) passes two complete Core escape/restart rounds with 564 assertions and zero engine or script/VM errors. Both rounds exercise Core administration, canonical player admission, independent clue routes, real radio service boundaries, repeated unconsciousness/recovery, replicated-feedback source values and player-guide copy, native objective widgets, helicopter extraction and restart. New radio feedback moves through inactive/waiting/transmitting/interrupted/resumed/cleared states. Station teardown diagnostics remain enabled and no catalog error occurs. These are source-bound local scripted rounds; subsequent initial-helicopter placement changes, ordinary game, real clients and FPS remain separate.
|
||||
|
||||
[074505 ordinary game](evidence/game-2026-09-19-074505/report.json) captures completed production Game compilation with no WORKBENCH/ENF_WB defines and no successor script compilation error. It remains a failed startup: the vanilla splash error persists, and the native executable crashes in `SpawnEntityPrefabEx` while expanding its first guard squad. The raw log reports no configuration for world-system initialization; the authored scenario header specifies vanilla MissionSystems. Launch/system configuration is therefore being investigated before another ordinary-game attempt. The private processes were stopped and source/log provenance verified; this is not a playable-startup pass.
|
||||
|
||||
[074655](evidence/native-2026-09-19-074655/report.json) confirms the production one-shot placement wake: the original helicopter settles naturally, all three tire bottoms meet terrain within millimetres, native contact becomes true, fuel remains present, and only one wake occurs before prisoner spawning. Separate raised, tilted and moving aircraft are rejected. The complete run remains failed: its later casualty step stays conscious because the fixture disabled damage handling before its own resilience-damage request. The fixture is corrected to admit only that synchronous native request while retaining surrounding protection; no production health changes are made.
|
||||
|
||||
[075014](evidence/native-2026-09-19-075014/report.json) preserves a native-removal fixture parse failure at a local variable named `reference`; it was renamed before further compilation. [075324 ordinary game](evidence/game-2026-09-19-075324/report.json) preserves a separate launcher compile failure: native `ArmaReforgerScripted` cannot own queued callbacks because it is not Managed. The queued transition is being moved into a managed helper; identity and mission admission are unchanged.
|
||||
|
||||
|
||||
[075514](evidence/native-2026-09-19-075514/report.json) passes 87 casualty-service assertions with zero engine or script/VM errors. The original helicopter naturally settles after its one-shot initial wake, and separate unsafe-aircraft checks pass. The fixture's single admitted native damage operation incapacitates the actual controlled player; strict membership rejects the separate helper until the explicit helper-only adapter is enabled. External bench reservations and a physical wall prevent loading. Invoking the real action completion boundary then runs the local owner handshake, seats the living incapacitated player exactly once, releases the selected reservation and preserves identity. Duplicate completion and repeated Stop do not load or resolve again. The real controller takes the local fast path; helper identity is synthetic, action input is not held, legal phases are deliberately advanced, and the fixture requests reset. Remote RPC transit, pending-load deletion, manual play and multiplayer remain unverified.
|
||||
|
||||
[080004 ordinary game](evidence/game-2026-09-19-080004/report.json) compiles production Game with neither WORKBENCH nor ENF_WB, requests the Core scenario header once, initializes vanilla MissionSystems, verifies the selected header and reaches `phase 0 -> 1`. No repeat of the earlier guard-spawn crash is captured. The run is still failed: two vanilla splash unknown-class errors remain and the local player cannot bind an identity, so spawn admission correctly stays closed. Header transition and mission preparation are observed, not clean startup, a controllable player or a completed escape. The runner confirms private-process cleanup and identical launch/stopped addon bytes; raw errors remain in the source-bound archive. This does not establish ordinary input, remote authentication, multiplayer or performance.
|
||||
|
||||
|
||||
[080058](evidence/native-2026-09-19-080058/report.json) passes 66 native casualty-removal assertions with zero engine or script/VM errors. The existing `SCR_RemoveCasualtyUserAction` resolves the occupied Mi8 child bench, exterior `door_l01_door` context and native authored exit. The actual conscious caller passes action visibility/permission, then one direct completion call uses the stock `KickFromVehicle` path. A native exit event clears vehicle and seat occupancy; the still-living incapacitated test body settles within the unchanged observation bounds beside the exit, and the bench is accessible. Root horizontal error is 0.710329m and terrain clearance is 0.862961m after an earlier observation correctly fails the clearance bound. No post-boarding teleport, recovery or retry is introduced. Pre-removal isolated extraction occupancy passes; post-removal evidence concerns physical vacancy, not recalculating a frozen outcome. This fixture ends through its own reset and does not exercise held input, remote action transit or multiplayer.
|
||||
|
||||
[080226](evidence/native-2026-09-19-080226/report.json) passes 37 companion-loaded native assertions with zero engine or script/VM errors. The actual mortar initializes four physical crew, a manpack operator and exactly 27 unique HE shells. Deleting that stock leaves it empty with zero confirmed shots; deleting the gun and crew leaves support permanently unavailable. This qualifies inventory identity deduplication and loss retention at the recorded source, not firing or later readiness/transfer changes.
|
||||
|
||||
[game080528](evidence/game-2026-09-19-080528/report.json) verifies the narrowly gated diagnostic no-splash path, ordinary Game compilation, matching Core mission header/MissionSystems and preparation reaching PRISON without the earlier GUI errors or a captured crash. It remains failed on native offline identity binding: server, mode and local controller exist, but the returned identity is null. No identity bypass is applied. Normal visible splash UI and player input are not exercised.
|
||||
|
||||
[080656](evidence/native-2026-09-19-080656/report.json) passes two complete Core escape/restart rounds, 564 assertions and zero engine or script/VM errors. This source includes the one-shot physical extraction-aircraft settling and the casualty service; normal base progression, inventory/discovery, radio interruption/recovery feedback, objective UI, boarding and result cleanup pass. It does not exercise held-input rescue, later ordinary admission diagnostics, later mortar changes or remote clients.
|
||||
|
||||
[game081359](evidence/game-2026-09-19-081359/report.json) confirms the ordinary admission blocker precisely: native backend data is the well-formed 36-character all-zero UUID sentinel, which vanilla returns unchanged because it checks only string emptiness before its fallback. Mode is standalone None, a real local controller exists, and the unchanged strict roster rejects the null identity. The strengthened local-participant observer compiles without Workbench but correctly produces no pass marker. No authentication, identifier contents or name contents are logged.
|
||||
|
||||
[081601](evidence/native-2026-09-19-081601/report.json) passes 89 native Core lifecycle assertions with zero engine or script/VM errors against revised prison placement and canonical participant checks. It remains a local fixture, not real remote preload/reconnect evidence.
|
||||
|
||||
[081837](evidence/native-2026-09-19-081837/report.json) compiles the revised finite mortar readiness/transaction/firing code and new native firing probe with all companions. All 37 inventory/loss assertions pass with zero engine or script/VM errors. The journal confirms four original physical members and 27 completed shell requests before readiness; depletion and permanent loss remain correct. Actual transfer and projectile tests remain separate.
|
||||
@@ -0,0 +1,105 @@
|
||||
{
|
||||
"Prefabs/Structures/Walls/Concrete/ConcreteWall_01/ConcreteWall_01_3m.et": "60E5729BEA18F875",
|
||||
"Prefabs/Structures/BuildingParts/Doors/Door_Metal_A_RIGHT_EXT_COV_B.et": "67F17696FF278AE0",
|
||||
"Prefabs/Items/Equipment/Radios/Radio_R107M.et": "54C68E438DD34265",
|
||||
"Prefabs/MP/Modes/GameMode_Base.et": "0F307326459A1395",
|
||||
"worlds/Eden/Eden.ent": "853E92315D1D9EFE",
|
||||
"Prefabs/AI/SCR_AIWorld.et": "E0A05C76552E7F58",
|
||||
"Prefabs/World/Game/PerceptionManager.et": "028DAEAD63E056BE",
|
||||
"Prefabs/MP/Managers/Factions/FactionManager_USxUSSR.et": "589540B35EBA8CDC",
|
||||
"Prefabs/MP/Managers/Loadouts/LoadoutManager_USxUSSR.et": "97EF4C1A41F63DDB",
|
||||
"Configs/Systems/MissionSystems.conf": "C50579A2EC48E8EF",
|
||||
"Prefabs/Characters/Factions/BLUFOR/US_Army/Character_US_Unarmed.et": "2F912ED6E399FF47",
|
||||
"Prefabs/Groups/OPFOR/Group_USSR_RifleSquad.et": "E552DABF3636C2AD",
|
||||
"Prefabs/Vehicles/Helicopters/Mi8MT/Mi8MT_unarmed_transport.et": "DF5CCB7C0FF049F4",
|
||||
"Prefabs/AI/Waypoints/AIWaypoint_SearchAndDestroy.et": "B3E7B8DC2BAB8ACC",
|
||||
"Prefabs/AI/Waypoints/AIWaypoint_Defend.et": "93291E72AC23930F",
|
||||
"Prefabs/Items/Misc/IntelligenceFolder_E_01/IntelligenceFolder_E_01.et": "6D56FED1E55A8F84",
|
||||
"Configs/Map/MapPlain.conf": "A786DD4868598F15",
|
||||
"Prefabs/Items/Core/Item_Base.et": "C95E11C60810F432",
|
||||
"Assets/Items/Equipment/workspaces/paper_map.agr": "83675D0B0AB1B2C3",
|
||||
"Assets/Items/Equipment/workspaces/player_map.asi": "56794534F6B8C3D7",
|
||||
"Assets/Items/Equipment/Maps/Map_Paper_01/Map_Paper_01_folded.xob": "E443663E5241622A",
|
||||
"Sounds/Items/_SharedData/PickUp/Items_PickUp_Map.acp": "13F8D0DE67678118",
|
||||
"Prefabs/Weapons/Handguns/PM/Handgun_PM.et": "C0F7DD85A86B2900",
|
||||
"Prefabs/Weapons/Magazines/Magazine_9x18_PM_8rnd_Ball.et": "8B853CDD11BA916E",
|
||||
"Prefabs/Items/Equipment/Maps/Map_Paper_01/PaperMap_01_folded.et": "13772C903CB5E4F7",
|
||||
"system/textures/defWhite.edds": "A64A8C63E0FBAE87",
|
||||
"Configs/Navmesh/Navmesh_GM_Eden_Soldier.conf": "8BBC73472092902E",
|
||||
"Configs/Navmesh/Navmesh_GM_Eden_Vehicle.conf": "0228A79846FD8A97",
|
||||
"worlds/MP/Navmeshes/LowResEden.nmn": "5E19E60F26327356",
|
||||
"Assets/Items/Equipment/Radios/Radio_R107M/Radio_R107M_01_item.xob": "77C9FCF3FB1246E9",
|
||||
"Prefabs/Systems/Radio/RadioManager.et": "B8E09FAB91C4ECCD",
|
||||
"Prefabs/MP/ScriptedChatEntity.et": "F69BC912AC8236F9",
|
||||
"Prefabs/Structures/BuildingParts/Doors/Door_MetalGate_01_Short_LEFT_EXT_ST_B.et": "34B08027DBDE322A",
|
||||
"Prefabs/Props/Furniture/Table_01.et": "53506DCB398C7EBE",
|
||||
"Assets/Structures/Walls/Concrete/ConcreteWall_01_3m.xob": "0B96D139FEBCA006",
|
||||
"Configs/GameOverScreen/BaseGameOverScreensConfig.conf": "651583FFFB7FC765",
|
||||
"UI/layouts/HUD/GameOver/EndScreen/EndScreenContent_NoImage.layout": "C4507D07F3C54831",
|
||||
"Prefabs/Characters/Factions/OPFOR/USSR_Army/Character_USSR_SL.et": "5436629450D8387A",
|
||||
"Prefabs/Characters/Factions/OPFOR/USSR_Army/Character_USSR_RTO.et": "612F43A4D5AE765F",
|
||||
"Prefabs/Characters/Factions/OPFOR/USSR_Army/Character_USSR_AR.et": "23ADBBC31B6A3DC6",
|
||||
"Prefabs/Characters/Factions/OPFOR/USSR_Army/Character_USSR_AT.et": "1C78331E156A3D65",
|
||||
"Prefabs/Characters/Factions/OPFOR/USSR_Army/Character_USSR_SR.et": "333DA6244C7DA34C",
|
||||
"Prefabs/Characters/Factions/OPFOR/USSR_Army/Character_USSR_LAT.et": "BF643BE4ADBDFDD3",
|
||||
"Prefabs/Weapons/Mortars/2B14/Mortar_2B14.et": "D1FFE458E8AC4BDB",
|
||||
"Prefabs/Weapons/Ammo/Ammo_Shell_82mm_HE_O832DU.et": "98EC9C526AFBA282",
|
||||
"Prefabs/Characters/Campaign/Final/OPFOR/USSR_Army/Regular/Campaign_USSR_Player_MortarCrew.et": "86E565387A634103",
|
||||
"Prefabs/Items/Equipment/Radios/Radio_R148.et": "E1A5D4B878AA8980",
|
||||
"Prefabs/Groups/OPFOR/Group_USSR_Base.et": "8DE0C0830FE0C33D",
|
||||
"Prefabs/Tasks/BaseTask.et": "1D0F815858EE24AD",
|
||||
"Prefabs/Props/EmptyStorages/USSR_AmmoBox_empty.et": "EBBC859CCD94D96D",
|
||||
"Prefabs/Weapons/Rifles/AK74/Rifle_AK74.et": "FA5C25BF66A53DCF",
|
||||
"Prefabs/Weapons/Magazines/Magazine_545x39_AK_30rnd_Ball.et": "BBB50A815A2F916B",
|
||||
"Prefabs/Items/Medicine/FieldDressing_01/FieldDressing_USSR_01.et": "C3F1FA1E2EC2B345",
|
||||
"Assets/Props/Military/AmmoBox/EquipmentBoxWooden_01/EquipmentBoxWooden_Weapon_01.xob": "819ED3266EE5113B",
|
||||
"Assets/Props/Military/AmmoBox/EquipmentBoxWooden_01/Data/EquipmentBoxWooden_Weapon_01_USSR.emat": "7D2E831AFA5CF50D",
|
||||
"Assets/Props/Military/Sandbags/Data/Sandbags_01_Burlap_MLOD.emat": "2169E8EB73E1C127",
|
||||
"Assets/Props/Military/Sandbags/Data/Sandbags_01_short_Burlap.emat": "31529E064AA7C917",
|
||||
"Assets/Props/Military/Sandbags/Sandbag_01_short.xob": "268DBDABB3C94AD7",
|
||||
"Prefabs/Items/Equipment/Binoculars/Binoculars_B8/Binoculars_B8.et": "243948B23D90BECB",
|
||||
"Prefabs/Items/Medicine/MorphineInjection_01/MorphineInjection_01.et": "0D9A5DCF89AE7AA9",
|
||||
"Prefabs/Items/Medicine/SalineBag_01/SalineBag_USSR_01.et": "527D7C5D2E476BDC",
|
||||
"Prefabs/Vehicles/Wheeled/UAZ469/UAZ469.et": "259EE7B78C51B624",
|
||||
"UI/layouts/Task/TaskListEntry.layout": "B71975032150BAFB",
|
||||
"UI/layouts/Task/TaskListEntryDescription.layout": "552EB1921B5C548C",
|
||||
"Prefabs/Characters/Factions/BLUFOR/US_Army/Character_US_Base.et": "836E7E39AAC5888B",
|
||||
"Prefabs/Items/Equipment/Watches/Watch_SandY184A.et": "78ED4FEF62BBA728",
|
||||
"Prefabs/Characters/HeadGear/Hat_Patrol_US_01/Hat_Patrol_US_01.et": "F545C1BE7C99954A",
|
||||
"Prefabs/Characters/Uniforms/Jacket_US_BDU_rolledup.et": "3CCA7A9BB4FD3197",
|
||||
"Prefabs/Characters/Uniforms/Pants_US_BDU.et": "604BB72BE8E023C2",
|
||||
"Prefabs/Characters/Footwear/CombatBoots_US_01.et": "DAAFD15478BDE1C3",
|
||||
"Prefabs/Items/Medicine/FieldDressing_01/FieldDressing_US_01.et": "A81F501D3EF6F38E",
|
||||
"Prefabs/Items/Medicine/Tourniquet_01/Tourniquet_US_01.et": "D70216B1B2889129",
|
||||
"Configs/Factions/BLUFOR.conf": "E7B7EA4823DD81F0",
|
||||
"UI/Textures/Editor/EditableEntities/Factions/EditableEntity_Faction_USA.edds": "EB7F65DBC9392557",
|
||||
"Configs/Identities/FactionIdentity_US.conf": "B600946E9ACC17C2",
|
||||
"UI/Textures/Flags/US-flag-base-3it.edds": "46FB2FB2C2125A3C",
|
||||
"Assets/Props/Fabric/Flags/Data/Flag_1_2_USA.emat": "610803CC3F3D6649",
|
||||
"Configs/Callsigns/Callsigns_US.conf": "CB7824D572DD0D5C",
|
||||
"Configs/EntityCatalog/US/Characters_EntityCatalog_US.conf": "B56E8B4D4B195559",
|
||||
"Configs/EntityCatalog/US/Groups_EntityCatalog_US.conf": "4E70E7C4C2C17D4A",
|
||||
"Configs/EntityCatalog/US/WeaponTripod_EntityCatalog_US.conf": "0E4B62F186F97C43",
|
||||
"Configs/EntityCatalog/US/InventoryItems_EntityCatalog_US.conf": "5F7EC52FC40A03E2",
|
||||
"Configs/EntityCatalog/US/SupplyContainerItems_EntityCatalog_US.conf": "0BF36EFF9FFAF92B",
|
||||
"Configs/Identities/Territories/FactionHomeTerritory_US.conf": "B548A5B264939A98",
|
||||
"Configs/Factions/OPFOR.conf": "B122E3B10BB3404B",
|
||||
"UI/Textures/Editor/EditableEntities/Factions/EditableEntity_Faction_USSR.edds": "40B12B0DF911B856",
|
||||
"Configs/Identities/FactionIdentity_USSR.conf": "FBBCD73926989580",
|
||||
"UI/Textures/Flags/USSR-flag-base-3it.edds": "50824EB9F2C215AB",
|
||||
"Assets/Props/Fabric/Flags/Data/Flag_1_2_SovietArmy.emat": "B47B52D9DA68905D",
|
||||
"Configs/Callsigns/Callsigns_USSR.conf": "958043CE1648EC43",
|
||||
"Configs/EntityCatalog/USSR/Characters_EntityCatalog_USSR.conf": "3B679F1799D55F6F",
|
||||
"Configs/EntityCatalog/USSR/Groups_EntityCatalog_USSR.conf": "37D5B75AAC3E72EA",
|
||||
"Configs/EntityCatalog/USSR/WeaponTripod_EntityCatalog_USSR.conf": "DDF17C8C140BD1F2",
|
||||
"Configs/EntityCatalog/USSR/InventoryItems_EntityCatalog_USSR.conf": "C53421647C3D0D2E",
|
||||
"Configs/EntityCatalog/USSR/SupplyContainerItems_EntityCatalog_USSR.conf": "B4CA6761AC935808",
|
||||
"Configs/Identities/Territories/FactionHomeTerritory_USSR.conf": "31FC78AF00523A99",
|
||||
"Prefabs/MP/Managers/Factions/FactionManager_Base.et": "A242612865F2A48E",
|
||||
"UI/Textures/DeployMenu/Loadout-BG/Loadout_US_BG.imageset": "F8AC305446D5D480",
|
||||
"UI/Textures/DeployMenu/Loadout-BG/Loadout_BG_USSR.imageset": "21533F2089005056",
|
||||
"Prefabs/Items/Medicine/SalineBag_01/SalineBag_US_01.et": "00E36F41CA310E2A",
|
||||
"Prefabs/Items/Equipment/Radios/Radio_ANPRC77.et": "9B6B61BB3FE3DFB0",
|
||||
"Prefabs/AI/Waypoints/AIWaypoint_Move.et": "750A8D1695BD6998",
|
||||
"Prefabs/AI/Waypoints/AIWaypoint_Cycle.et": "35BD6541CBB8AC08"
|
||||
}
|
||||
Reference in New Issue
Block a user