From 9889bd64046d92b5897a4c8e9a59217312dfc649 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20=C5=BD=C3=A1=C4=8Dek?= Date: Tue, 10 Nov 2026 13:33:00 +0100 Subject: [PATCH] Split checkpoint guards between VirtualHQ and local defence; record Workshop 0.0.151 --- CHANGELOG.md | 7 +- .../Game/ERR/00_Core/ERR_AdminService.c | 4 +- .../ERR/00_Core/ERR_NativeRoadblocksProbe.c | 61 +- addons/core/Scripts/Game/ERR/10_AI/ERR_HQ.c | 7 + .../Scripts/Game/ERR/10_AI/ERR_Roadblocks.c | 60 +- addons/core/UI/layouts/ERR/AdminMenu.layout | 4 +- docs/configuration.md | 6 +- .../native-compile/cleanup-followup.json | 8 + .../native-compile/cleanup.json | 11 + .../native-compile/command.json | 29 + .../native-compile/console.log | 242 ++++++ .../native-compile/index.py | 25 + .../native-compile/launch.log | 118 +++ .../native-compile/result.json | 76 ++ .../sandbox-attempt/cleanup.json | 9 + .../sandbox-attempt/command.json | 29 + .../native-compile/sandbox-attempt/launch.log | 26 + .../sandbox-attempt/result.json | 13 + .../native-compile/source-manifest.json | 749 ++++++++++++++++++ tests/test_intel_registration.py | 16 +- tests/test_roadblock_background.py | 114 ++- tests/test_roadblock_layout.py | 17 +- ui/admin_menu/pages/CheckpointsPage.layout.in | 4 +- 23 files changed, 1557 insertions(+), 78 deletions(-) create mode 100644 docs/evidence/checkpoint-squads-2026-11-10/native-compile/cleanup-followup.json create mode 100644 docs/evidence/checkpoint-squads-2026-11-10/native-compile/cleanup.json create mode 100644 docs/evidence/checkpoint-squads-2026-11-10/native-compile/command.json create mode 100644 docs/evidence/checkpoint-squads-2026-11-10/native-compile/console.log create mode 100644 docs/evidence/checkpoint-squads-2026-11-10/native-compile/index.py create mode 100644 docs/evidence/checkpoint-squads-2026-11-10/native-compile/launch.log create mode 100644 docs/evidence/checkpoint-squads-2026-11-10/native-compile/result.json create mode 100644 docs/evidence/checkpoint-squads-2026-11-10/native-compile/sandbox-attempt/cleanup.json create mode 100644 docs/evidence/checkpoint-squads-2026-11-10/native-compile/sandbox-attempt/command.json create mode 100644 docs/evidence/checkpoint-squads-2026-11-10/native-compile/sandbox-attempt/launch.log create mode 100644 docs/evidence/checkpoint-squads-2026-11-10/native-compile/sandbox-attempt/result.json create mode 100644 docs/evidence/checkpoint-squads-2026-11-10/native-compile/source-manifest.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 5cc44f86..0350dd1c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,11 @@ # Changelog -Latest published Workshop version: **0.0.150** +Latest published Workshop version: **0.0.151** + +## 2026-11-10 — Checkpoint squads + +- Both checkpoint sizes now have four guards: two HQ responders and two local sentries who hold the post outside HQ control. +- Large checkpoints retain their extended cover and approach barriers. ## 2026-11-09 — AI processing diff --git a/addons/core/Scripts/Game/ERR/00_Core/ERR_AdminService.c b/addons/core/Scripts/Game/ERR/00_Core/ERR_AdminService.c index 40946b77..a6e68cfb 100644 --- a/addons/core/Scripts/Game/ERR/00_Core/ERR_AdminService.c +++ b/addons/core/Scripts/Game/ERR/00_Core/ERR_AdminService.c @@ -218,9 +218,9 @@ class ERR_AdminService if (key == "objectGuardHQMode") return "0: all hold their posts; 1: half hold, half respond to HQ; 2: all may respond to HQ. All report contacts. Next round."; if (key == "objectGuardCount") return "0..16 soldiers per factory/industrial, military or infrastructure site; default 8, zero off. Next round. HQ participation is configured separately; all report. Towers and chimneys use suitable platforms. Lost guards are not replaced."; if (key == "hunterSpawnDistanceMetres") return "Opening UAZ and troop-truck patrol placement. Applies next round."; - if (key == "largeRoadblockCount") return "Set 0..30 main-road checkpoints (default 4; 0 disables large posts). Eight guards per post. Applies next round; unsuitable sites are skipped."; + if (key == "largeRoadblockCount") return "Set 0..30 main-road checkpoints (default 4; 0 disables large posts). Four guards: two HQ responders, two local sentries outside HQ. Extended cover. Applies next round; unsuitable sites are skipped."; if (key == "mainRoadWidthMetres") return "Set main-road minimum width to 5..12 metres (default 6). Wider roads use large checkpoints; narrower roads use small ones. Applies next round."; - if (key == "roadblockCount") return "Set 0..30 small-road checkpoints (default 4; 0 disables small posts). Four guards per post. Applies next round; unsuitable sites are skipped."; + if (key == "roadblockCount") return "Set 0..30 small-road checkpoints (default 4; 0 disables small posts). Four guards: two HQ responders, two local sentries outside HQ. Compact cover. Applies next round; unsuitable sites are skipped."; if (key == "telemetryEnabled") return "Default on. Sends mission results and player identities to the configured statistics service. Disabling clears unsent events immediately."; if (key == "restartOnEmpty") return "On (1) restarts after the last disconnect; Off (0) preserves the round for reconnects. Default On. Applies immediately; normal round endings still apply."; if (key == "emptyRestartHours") return "0 disables idle restarts; 1..168 real hours continuously empty. Default 5. Applies immediately, measured from mission start or the last disconnect. Connected players, including spectators, prevent idle restarts."; diff --git a/addons/core/Scripts/Game/ERR/00_Core/ERR_NativeRoadblocksProbe.c b/addons/core/Scripts/Game/ERR/00_Core/ERR_NativeRoadblocksProbe.c index 2204c322..b59b5609 100644 --- a/addons/core/Scripts/Game/ERR/00_Core/ERR_NativeRoadblocksProbe.c +++ b/addons/core/Scripts/Game/ERR/00_Core/ERR_NativeRoadblocksProbe.c @@ -14,12 +14,18 @@ class ERR_RoadblockProbeRules return 0; } static int Target() { return SmallTarget() + LargeTarget(); } - static int Guards() { return SmallTarget() * 4 + LargeTarget() * 8; } + static int Guards() { return Target() * 4; } static int Props() { return SmallTarget() * 8 + LargeTarget() * 14; } } modded class ERR_HQ { + bool ERR_ProbeRoadblockRegistered(SCR_AIGroup group) + { + foreach (ERR_HQUnit unit : m_Units) + if (unit.Group == group) return true; + return false; + } bool ERR_ProbeRoadblockGroup(SCR_AIGroup group) { foreach (ERR_HQUnit unit : m_Units) @@ -48,7 +54,7 @@ modded class ERR_Roadblocks string outcome; if (!System.GetCLIParam("errSmokeOutcome", outcome) || outcome != "roadblocks") { super.BuildPost(); return; } // Inspect the actual spawned models before the transaction clears its refs. - if (m_BuildHold) + if (m_BuildHold && m_BuildLocalHold) { bool valid = ShareProps(); for (int i = 0; i < m_BuildCovers.Count() && valid; i++) @@ -110,15 +116,39 @@ modded class ERR_Roadblocks } int ERR_ProbePostCount() { return m_Positions.Count(); } bool ERR_ProbeBackgroundPending() { return m_Background; } + bool ERR_ProbePostPair(int index) + { + if (index < 0 || index >= m_Groups.Count() || index >= m_LocalGroups.Count()) return false; + SCR_AIGroup group = m_Groups[index]; + SCR_AIGroup localGroup = m_LocalGroups[index]; + ERR_HQ hq = ERR_HQ.Get(); + if (!group || !localGroup || group == localGroup || !hq || !Contains(group) || LocalOnly(group) || Contains(localGroup) || !LocalOnly(localGroup)) return false; + if (!hq.ERR_ProbeRoadblockGroup(group) || hq.ERR_ProbeRoadblockRegistered(localGroup)) return false; + ERR_ForceRecord record = m_Mode.Forces().FindGroup(group); + ERR_ForceRecord localRecord = m_Mode.Forces().FindGroup(localGroup); + if (!record || !localRecord || record == localRecord || record.SourceId == localRecord.SourceId) return false; + array pair = {group, localGroup}; + array bodies = {}; + foreach (SCR_AIGroup memberGroup : pair) + { + ERR_ForceRecord memberRecord = m_Mode.Forces().FindGroup(memberGroup); + if (!memberRecord || !memberRecord.Physical || memberRecord.Eliminated || memberRecord.Kind != ERR_ForceKind.CHECKPOINT || memberRecord.InitialStrength != 2 || m_Mode.ForceLiving(memberGroup) != 2) return false; + if (memberGroup.GetFaction() != m_Mode.EnemyFaction()) return false; + array agents = {}; memberGroup.GetAgents(agents); + if (agents.Count() != 2) return false; + foreach (AIAgent agent : agents) + { + if (!agent || !agent.GetControlledEntity() || bodies.Contains(agent.GetControlledEntity())) return false; + bodies.Insert(agent.GetControlledEntity()); + } + } + return bodies.Count() == 4; + } bool ERR_ProbeCompleteRoadblocks() { if (m_ERRLayoutFailed || m_ERRLayoutPosts < ERR_RoadblockProbeRules.Target() || m_Target != ERR_RoadblockProbeRules.Target() || m_Positions.Count() != m_Target || m_Background || !m_Ready) return false; - foreach (SCR_AIGroup group : m_Groups) - { - ERR_ForceRecord record = m_Mode.Forces().FindGroup(group); - if (!group || !record || record.Kind != ERR_ForceKind.CHECKPOINT || (record.InitialStrength != 4 && record.InitialStrength != 8) || m_Mode.ForceLiving(group) != record.InitialStrength) return false; - if (group.GetFaction() != m_Mode.EnemyFaction() || !ERR_HQ.Get().ERR_ProbeRoadblockGroup(group)) return false; - } + if (m_Groups.Count() != m_Target || m_LocalGroups.Count() != m_Target) return false; + for (int index = 0; index < m_Groups.Count(); index++) if (!ERR_ProbePostPair(index)) return false; if (m_SmallPlaced != ERR_RoadblockProbeRules.SmallTarget() || m_LargePlaced != ERR_RoadblockProbeRules.LargeTarget()) return false; int count = m_Positions.Count(); BackgroundStep(); @@ -129,16 +159,13 @@ modded class ERR_Roadblocks { if (!m_Ready || m_Target != m_SmallTarget + m_LargeTarget || m_Groups.IsEmpty() || m_Groups.Count() > m_Target || m_Groups.Count() != m_Positions.Count()) return false; int count = m_Groups.Count(); - foreach (SCR_AIGroup group : m_Groups) - { - ERR_ForceRecord record = m_Mode.Forces().FindGroup(group); - if (!record || record.Kind != ERR_ForceKind.CHECKPOINT || (record.InitialStrength != 4 && record.InitialStrength != 8) || m_Mode.ForceLiving(group) != record.InitialStrength - || group.GetFaction() != m_Mode.EnemyFaction() || !ERR_HQ.Get().ERR_ProbeRoadblockGroup(group)) return false; - } + if (m_LocalGroups.Count() != count) return false; + for (int index = 0; index < count; index++) if (!ERR_ProbePostPair(index)) return false; ERR_ScenarioDefinition definition = ERR_ScenarioDefinition.Cast(SCR_BaseContainerTools.CreateInstanceFromPrefab("{ACA98B44E2173605}Configs/ERR/Tests/LegacySites.conf")); // Repeated preparation cannot replenish or create another squad. - if (Prepare(definition) != ERR_PrepareResult.READY || m_Groups.Count() != count) return false; - PrintFormat("ERR ROADBLOCK NATIVE: posts=%1 soldiers=%2 ledger=checkpoint HQ=available repeatedPrepare=unchanged", count, m_SmallPlaced * 4 + m_LargePlaced * 8); + if (Prepare(definition) != ERR_PrepareResult.READY || m_Groups.Count() != count || m_LocalGroups.Count() != count) return false; + for (int after = 0; after < count; after++) if (!ERR_ProbePostPair(after)) return false; + PrintFormat("ERR ROADBLOCK NATIVE: posts=%1 soldiers=%2 ledger=two-pairs HQ=two local=two repeatedPrepare=unchanged", count, count * 4); return true; } } @@ -176,7 +203,7 @@ modded class ERR_GameMode PrintFormat("ERR SMOKE PASS: roadblocks prison unlocked with %1/%2 posts; placement observation started", m_ERRRoadblockInitial, ERR_RoadblockProbeRules.Target()); } if (posts.ERR_ProbeBackgroundPending()) return; - if (!posts.ERR_ProbeCompleteRoadblocks() || (ERR_RoadblockProbeRules.Target() > 4 && posts.ERR_ProbePostCount() <= m_ERRRoadblockInitial)) { ERR_RoadblockProbeFail("physical small/large posts, independent quotas, replicated props, ledger and HQ admission"); return; } + if (!posts.ERR_ProbeCompleteRoadblocks() || (ERR_RoadblockProbeRules.Target() > 4 && posts.ERR_ProbePostCount() <= m_ERRRoadblockInitial)) { ERR_RoadblockProbeFail("physical small/large posts, independent quotas, replicated props, separate pair ledgers and two-only HQ admission"); return; } PrintFormat("ERR SMOKE PASS: roadblocks %1 physical posts / %2 guards / %3 replicated checkpoint props with distance streaming disabled; verified model footprints and centre lane; placement complete after prison unlock, no extra posts on repeat tick", posts.ERR_ProbePostCount(), ERR_RoadblockProbeRules.Guards(), ERR_RoadblockProbeRules.Props()); ERR_StopRoadblockProbe(); Transition(ERR_Phase.DEFEAT); diff --git a/addons/core/Scripts/Game/ERR/10_AI/ERR_HQ.c b/addons/core/Scripts/Game/ERR/10_AI/ERR_HQ.c index 3dfc57ea..5c38e202 100644 --- a/addons/core/Scripts/Game/ERR/10_AI/ERR_HQ.c +++ b/addons/core/Scripts/Game/ERR/10_AI/ERR_HQ.c @@ -631,6 +631,13 @@ class ERR_HQ : ERR_CommandService override void RegisterGroup(SCR_AIGroup group) { if (!Replication.IsServer() || !group) return; + // Local checkpoint guards retain normal equipment and native defence AI, + // without HQ reporting, status sampling or remote tasking. + if (m_Roadblocks && m_Roadblocks.LocalOnly(group)) + { + m_Equipment.RegisterGroup(group, 0, false); + return; + } // Other hostile factions retain their own intelligence, but receive the same // scoped skill/aim profile. Do not share enemy HQ knowledge across hostile sides. if (m_Mode.IsMissionEnemy(group.GetFaction()) && group.GetFaction() != m_Mode.EnemyFaction()) m_Equipment.RegisterGroup(group, 0, false); diff --git a/addons/core/Scripts/Game/ERR/10_AI/ERR_Roadblocks.c b/addons/core/Scripts/Game/ERR/10_AI/ERR_Roadblocks.c index ef9f29bf..c97179a6 100644 --- a/addons/core/Scripts/Game/ERR/10_AI/ERR_Roadblocks.c +++ b/addons/core/Scripts/Game/ERR/10_AI/ERR_Roadblocks.c @@ -11,7 +11,6 @@ class ERR_RoadblockRules } static int GuardCount(bool large) { - if (large) return 8; return 4; } static bool LargeRoad(float width, float threshold) { return width >= threshold; } @@ -58,6 +57,7 @@ class ERR_Roadblocks protected ref ERR_RoadblockMining m_Mining; protected ref array m_Positions = {}; protected ref array m_Groups = {}; + protected ref array m_LocalGroups = {}; protected ref ERR_SpawnPlacement m_Placement = new ERR_SpawnPlacement(); protected ref ERR_SettlementSafety m_Settlements = new ERR_SettlementSafety(); protected bool m_Begun, m_Ready, m_Stopped, m_HaveCandidate, m_Background; @@ -68,8 +68,9 @@ class ERR_Roadblocks protected float m_Shoulder; protected bool m_Large; protected int m_SmallTarget, m_LargeTarget, m_SmallPlaced, m_LargePlaced, m_MainRoadWidth; - protected SCR_AIGroup m_BuildGroup; - protected AIWaypoint m_BuildHold; + protected SCR_AIGroup m_BuildGroup, m_BuildLocalGroup; + protected int m_PostSerial; + protected AIWaypoint m_BuildHold, m_BuildLocalHold; protected ref array m_BuildSpawned = {}; protected ref array m_BuildPositions = {}; protected ref array m_BuildCovers = {}; @@ -82,6 +83,7 @@ class ERR_Roadblocks void ERR_Roadblocks(ERR_GameMode mode) { m_Mode = mode; m_Mining = new ERR_RoadblockMining(mode); } void MineTick(array units, array attempted, float now) { if (!m_Stopped) m_Mining.Tick(units, attempted, now); } bool Contains(SCR_AIGroup group) { return group && m_Groups.Contains(group); } + bool LocalOnly(SCR_AIGroup group) { return group && m_LocalGroups.Contains(group); } string Status() { if (!m_Begun) return "Roadblocks: awaiting terrain preparation."; @@ -89,7 +91,7 @@ class ERR_Roadblocks if (m_Ready && m_Positions.Count() < m_Target) progress = "placement stopped; see server log"; if (m_Background) progress = "background placement pending"; else if (!m_Ready) progress = "initial placement in progress"; - return string.Format("Checkpoints: small %1/%2 (4 guards), large %3/%4 (8 guards). Main-road cutoff %5 m. No replacements. %6.", m_SmallPlaced, m_SmallTarget, m_LargePlaced, m_LargeTarget, m_MainRoadWidth, progress); + return string.Format("Checkpoints: small %1/%2 (4 guards), large %3/%4 (4 guards). Each post: 2 HQ responders, 2 local guards. Main-road cutoff %5 m. No replacements. %6.", m_SmallPlaced, m_SmallTarget, m_LargePlaced, m_LargeTarget, m_MainRoadWidth, progress); } protected ERR_PrepareResult Finish(string reason) { @@ -256,7 +258,8 @@ class ERR_Roadblocks protected void CancelPost() { Rollback(m_BuildSpawned, m_BuildGroup); - m_BuildSpawned.Clear(); m_BuildGroup = null; m_BuildHold = null; + ERR_Actors.DeleteSpawned(m_BuildLocalGroup); + m_BuildSpawned.Clear(); m_BuildGroup = null; m_BuildHold = null; m_BuildLocalGroup = null; m_BuildLocalHold = null; m_BuildPositions.Clear(); m_BuildCovers.Clear(); } // A free Game Master camera does not force-stream bare, non-editable props @@ -265,7 +268,7 @@ class ERR_Roadblocks // Do not report a completed post if any physical prop lacks a network node. protected bool ShareProps() { - if (m_BuildCovers.Count() != ERR_RoadblockRules.PropCount(m_Large) || m_BuildSpawned.Count() != m_BuildPositions.Count() + m_BuildCovers.Count() + 1) return false; + if (m_BuildCovers.Count() != ERR_RoadblockRules.PropCount(m_Large) || m_BuildSpawned.Count() != m_BuildPositions.Count() + m_BuildCovers.Count() + 2) return false; for (int i = m_BuildPositions.Count(); i < m_BuildPositions.Count() + m_BuildCovers.Count(); i++) { IEntity entity = m_BuildSpawned[i]; @@ -283,6 +286,15 @@ class ERR_Roadblocks protected void BuildPost() { if (!PlayersClear() || m_Mode.Forces().Count() >= 250) { CancelPost(); return; } + // Separate native groups prevent HQ orders from pulling the local pair away. + // Create the second group on its own callback, within the same transaction. + if (!m_BuildLocalGroup) + { + m_BuildLocalGroup = SCR_AIGroup.Cast(ERR_Actors.Spawn("{EC9F1AA42D0B7863}Prefabs/ERR/PrisonPatrol.et", m_Centre)); + if (!m_BuildLocalGroup) { CancelPost(); return; } + m_BuildLocalGroup.SetFaction(m_Mode.EnemyFaction()); m_BuildLocalGroup.SetSpawnImmediately(false); m_BuildLocalGroup.SetDeleteWhenEmpty(false); m_BuildLocalGroup.SetPermanentLOD(0); + return; + } // One actor/prop/waypoint per callback. Recheck moving obstructions and // player distance while the transaction is in progress; roll back on failure. if (m_BuildActors < m_BuildPositions.Count()) @@ -292,7 +304,10 @@ class ERR_Roadblocks IEntity actor = ERR_Actors.Spawn(m_Roster[m_BuildActors % m_Roster.Count()], point); if (!actor) { CancelPost(); return; } m_BuildSpawned.Insert(actor); - if (!ERR_Actors.SetFaction(actor, m_Mode.EnemyFaction()) || !m_BuildGroup.AddAIEntityToGroup(actor)) { CancelPost(); return; } + // Alternate the roster and shoulders: each pair gets a guard on each side. + SCR_AIGroup guardGroup = m_BuildGroup; + if (m_BuildActors % 2 == 1) guardGroup = m_BuildLocalGroup; + if (!ERR_Actors.SetFaction(actor, m_Mode.EnemyFaction()) || !guardGroup.AddAIEntityToGroup(actor)) { CancelPost(); return; } m_BuildActors++; return; } @@ -312,29 +327,48 @@ class ERR_Roadblocks m_BuildSpawned.Insert(m_BuildHold); m_BuildHold.SetCompletionRadius(25); return; } + if (!m_BuildLocalHold) + { + m_BuildLocalHold = AIWaypoint.Cast(ERR_Actors.Spawn(ERR_Resources.DefendWaypoint(), m_BuildPositions[1])); + if (!m_BuildLocalHold) { CancelPost(); return; } + m_BuildSpawned.Insert(m_BuildLocalHold); m_BuildLocalHold.SetCompletionRadius(25); + return; + } if (!ShareProps()) { PrintFormat("Reintroduced [roadblocks]: rejected post at %1; checkpoint props missing replication nodes", m_Centre); CancelPost(); return; } - string id = "roadblock-" + m_Positions.Count().ToString(); - if (!m_Mode.Forces().Register(id, ERR_ForceKind.CHECKPOINT, m_Centre, m_BuildPositions.Count(), null, m_BuildGroup, GetGame().GetWorld().GetWorldTime())) - { CancelPost(); return; } + // Both pairs stay in the finite force ledger, but only one joins HQ. A failed + // second admission retires the first ID; a later attempt uses a fresh serial. + m_PostSerial++; + string id = "roadblock-" + m_PostSerial.ToString(); + int strength = m_BuildPositions.Count() / 2; + ERR_ForceRecord responders = m_Mode.Forces().Register(id, ERR_ForceKind.CHECKPOINT, m_Centre, strength, null, m_BuildGroup, GetGame().GetWorld().GetWorldTime()); + if (!responders) { CancelPost(); return; } + if (!m_Mode.Forces().Register(id + "-local", ERR_ForceKind.CHECKPOINT, m_Centre, strength, null, m_BuildLocalGroup, GetGame().GetWorld().GetWorldTime())) + { + m_Mode.Forces().Unregister(responders.Id); + CancelPost(); return; + } foreach (IEntity ownedEntity : m_BuildSpawned) m_Mode.Own(ownedEntity); m_Mode.Own(m_BuildGroup); m_Groups.Insert(m_BuildGroup); m_Positions.Insert(m_Centre); + m_Mode.Own(m_BuildLocalGroup); m_LocalGroups.Insert(m_BuildLocalGroup); if (m_Large) m_LargePlaced++; else m_SmallPlaced++; + m_BuildLocalGroup.AddWaypoint(m_BuildLocalHold); m_BuildGroup.AddWaypoint(m_BuildHold); m_Mode.RegisterGroup(m_BuildGroup); m_BuildGroup.ActivateAI(); + m_Mode.RegisterGroup(m_BuildLocalGroup); m_BuildLocalGroup.ActivateAI(); m_Mining.Register(m_BuildGroup, m_BuildHold, m_Right); - PrintFormat("Reintroduced [roadblocks]: %1 at %2 large=%3 guards=%4 props=%5 networkedProps=%5 propStreaming=always roadPassage=open HQ=registered", id, m_Centre, m_Large, m_BuildPositions.Count(), m_BuildCovers.Count()); - m_BuildSpawned.Clear(); m_BuildGroup = null; m_BuildHold = null; + PrintFormat("Reintroduced [roadblocks]: %1 at %2 large=%3 guards=%4 props=%5 networkedProps=%5 propStreaming=always roadPassage=open HQ=2 local=2", id, m_Centre, m_Large, m_BuildPositions.Count(), m_BuildCovers.Count()); + m_BuildSpawned.Clear(); m_BuildGroup = null; m_BuildHold = null; m_BuildLocalGroup = null; m_BuildLocalHold = null; m_BuildPositions.Clear(); m_BuildCovers.Clear(); m_NextSearch = System.GetTickCount() + 2000; } protected vector GuardPosition(int side, int row) { float along = side * (row * 2 - 2.5); - if (m_Large) along = row * 6 - 9; + if (m_Large) along = row * 18 - 9; return ERR_Actors.Ground(m_Centre + m_Right * (side * (m_Shoulder + 1.5)) + m_Forward * along); } // 0: reject, 1: awaiting native tile, 2: ready. diff --git a/addons/core/UI/layouts/ERR/AdminMenu.layout b/addons/core/UI/layouts/ERR/AdminMenu.layout index d059aa9b..8c7d608a 100644 --- a/addons/core/UI/layouts/ERR/AdminMenu.layout +++ b/addons/core/UI/layouts/ERR/AdminMenu.layout @@ -1076,7 +1076,7 @@ TextWidgetClass { } } FrameWidgetClass { "Is Visible" 0 Name "CheckpointsPage" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 220 OffsetLeft 220 PositionY 160 OffsetTop 160 SizeX 1000 OffsetRight -1220 SizeY 532 OffsetBottom -692 } { -TextWidgetClass { Name "CheckpointsHelp" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 6 OffsetTop 6 SizeX 936 OffsetRight -964 SizeY 50 OffsetBottom -56 } Color 0.9 0.92 0.94 1 Text "Set counts separately for small and main-road checkpoints. Changes apply next round. Road width determines the type; unsuitable locations are skipped." "Font Size" 19 "Min Font Size" 19 Wrap 1 FontProperties FontProperties { Font "{3E7733BAC8C831F6}UI/Fonts/RobotoCondensed/RobotoCondensed_Regular.fnt" } } +TextWidgetClass { Name "CheckpointsHelp" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 6 OffsetTop 6 SizeX 936 OffsetRight -964 SizeY 50 OffsetBottom -56 } Color 0.9 0.92 0.94 1 Text "Both sizes have four guards: two HQ responders and two local sentries outside HQ. Counts apply next round; road width selects the type." "Font Size" 19 "Min Font Size" 19 Wrap 1 FontProperties FontProperties { Font "{3E7733BAC8C831F6}UI/Fonts/RobotoCondensed/RobotoCondensed_Regular.fnt" } } TextWidgetClass { Name "Label_roadblockCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 66 OffsetTop 66 SizeX 456 OffsetRight -484 SizeY 26 OffsetBottom -92 } Color 0.9 0.92 0.94 1 Text "Small checkpoints (0-30; 0 off)" "Font Size" 20 "Min Font Size" 20 Wrap 1 FontProperties FontProperties { Font "{3E7733BAC8C831F6}UI/Fonts/RobotoCondensed/RobotoCondensed_Regular.fnt" } } ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" { Name "roadblockCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 96 OffsetTop 96 SizeX 130 OffsetRight -158 SizeY 38 OffsetBottom -134 } components { SCR_EditBoxComponent "{547290FFBD5B33E9}" { m_sLabel "" } } } ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "Apply_roadblockCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 170 OffsetLeft 170 PositionY 96 OffsetTop 96 SizeX 110 OffsetRight -280 SizeY 38 OffsetBottom -134 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Apply" } } } @@ -1086,7 +1086,7 @@ TextWidgetClass { Name "Label_largeRoadblockCount" Slot FrameWidgetSlot { Anchor ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" { Name "largeRoadblockCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 96 OffsetTop 96 SizeX 130 OffsetRight -638 SizeY 38 OffsetBottom -134 } components { SCR_EditBoxComponent "{547290FFBD5B33E9}" { m_sLabel "" } } } ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "Apply_largeRoadblockCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 650 OffsetLeft 650 PositionY 96 OffsetTop 96 SizeX 110 OffsetRight -760 SizeY 38 OffsetBottom -134 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Apply" } } } TextWidgetClass { Name "Saved_largeRoadblockCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 136 OffsetTop 136 SizeX 456 OffsetRight -964 SizeY 22 OffsetBottom -158 } Color 0.9 0.92 0.94 1 Text "Waiting for saved value" "Font Size" 16 "Min Font Size" 16 FontProperties FontProperties { Font "{3E7733BAC8C831F6}UI/Fonts/RobotoCondensed/RobotoCondensed_Regular.fnt" } } -TextWidgetClass { Name "Help_largeRoadblockCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 160 OffsetTop 160 SizeX 456 OffsetRight -964 SizeY 32 OffsetBottom -192 } Color 0.9 0.92 0.94 1 Text "Eight guards, extended cover and approach barriers." "Font Size" 14 "Min Font Size" 14 Wrap 1 FontProperties FontProperties { Font "{3E7733BAC8C831F6}UI/Fonts/RobotoCondensed/RobotoCondensed_Regular.fnt" } } +TextWidgetClass { Name "Help_largeRoadblockCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 160 OffsetTop 160 SizeX 456 OffsetRight -964 SizeY 32 OffsetBottom -192 } Color 0.9 0.92 0.94 1 Text "Four guards, extended cover and approach barriers." "Font Size" 14 "Min Font Size" 14 Wrap 1 FontProperties FontProperties { Font "{3E7733BAC8C831F6}UI/Fonts/RobotoCondensed/RobotoCondensed_Regular.fnt" } } TextWidgetClass { Name "Label_mainRoadWidthMetres" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 202 OffsetTop 202 SizeX 456 OffsetRight -484 SizeY 26 OffsetBottom -228 } Color 0.9 0.92 0.94 1 Text "Main-road minimum width (5-12 m)" "Font Size" 20 "Min Font Size" 20 Wrap 1 FontProperties FontProperties { Font "{3E7733BAC8C831F6}UI/Fonts/RobotoCondensed/RobotoCondensed_Regular.fnt" } } ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" { Name "mainRoadWidthMetres" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 232 OffsetTop 232 SizeX 130 OffsetRight -158 SizeY 38 OffsetBottom -270 } components { SCR_EditBoxComponent "{547290FFBD5B33E9}" { m_sLabel "" } } } ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "Apply_mainRoadWidthMetres" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 170 OffsetLeft 170 PositionY 232 OffsetTop 232 SizeX 110 OffsetRight -280 SizeY 38 OffsetBottom -270 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Apply" } } } diff --git a/docs/configuration.md b/docs/configuration.md index b0904a1b..737969d5 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -51,9 +51,9 @@ Both counts can be disabled separately with zero; set both to zero to disable al Roads at or above the width cutoff get large checkpoints; roads below it get compact posts. This is a width classification from the terrain's road network, not a guaranteed asphalt/dirt or forest distinction. An exhausted or disabled quota cannot consume the other type's allowance. Both types share the existing minimum spacing, so they cannot overlap each other. -Small checkpoints retain four guards, four sandbag walls, two approach barriers and two signs (about 17.8 m long). Large checkpoints have eight guards, eight sandbag walls, four approach barriers and two signs (about 42.8 m long), with four protected guard bays on each shoulder. Large candidates require at least 60 m of road and a straight clear approach. Both preserve a straight vehicle passage at least four metres wide. +Both checkpoint sizes have four guards: two HQ responders and two local sentries who hold the post outside HQ control. Small checkpoints retain four sandbag walls, two approach barriers and two signs (eight props, about 17.8 m long). Large checkpoints retain eight sandbag walls, four approach barriers and two signs (14 props, about 42.8 m long), with four protected bays on each shoulder. Large candidates require at least 60 m of road and a straight clear approach. Both preserve a straight vehicle passage at least four metres wide. -Soldiers come from the selected enemy faction, use normal equipment and physical radio reporting, and register with VirtualHQ at their actual four- or eight-soldier strength. They do not reveal player locations simply by spawning. Guards are not replaced after death. Every post is constructed one actor, prop or waypoint per callback; a failed or interrupted build rolls back without consuming either quota. At maximum settings the two types can create up to 360 guards and 660 replicated props; their default combined count is eight posts and 48 guards. The Status page reports placed/requested counts separately. +Soldiers come from the selected enemy faction and use normal equipment. Each post registers only its two responders with VirtualHQ; the two local sentries remain outside HQ control. Responders use physical radio reporting and do not reveal player locations simply by spawning. Guards are not replaced after death. Every post is constructed one actor, prop or waypoint per callback; a failed or interrupted build rolls back without consuming either quota. At maximum settings the two types can create up to 240 guards (120 HQ responders and 120 local sentries) and 660 replicated props; their default combined count is eight posts and 32 guards (16 HQ responders and 16 local sentries). The Status page reports placed/requested counts separately. Placement uses the loaded terrain's road network and Soldiers navmesh after terrain/site preparation. The initial search yields after 12 seconds; unfinished @@ -67,7 +67,7 @@ requested totals instead of preventing mission startup. The admin Status page also shows these totals. This is an interim checkpoint system, independent of the existing HQ-directed road interceptions. -The [1 November native checkpoint test](evidence/large-checkpoints-2026-11-01/native-checks.log) placed one small and one large post on Everon: 12 living guards, 22 replicated props, correct HQ strength, model footprints outside the centre passage, and separate completed quotas. The [menu/settings fixture](evidence/large-checkpoints-2026-11-01/menu/native-checks.log) saved and reloaded distinct counts and width, and measured the new controls’ native text bounds. It instantiates the generated layout directly; it does not claim human input, remote RPC delivery or screenshot acceptance. Both completed with unchanged inputs and cleanup; strict runners retain 13 existing resource/world errors and no script errors. Earlier failed iterations are recorded alongside the evidence. Full-load performance and multiplayer acceptance remain unmeasured. +The historical [1 November native checkpoint test](evidence/large-checkpoints-2026-11-01/native-checks.log) used the former four-guard small and eight-guard large layout, before the HQ/local split. It placed one of each on Everon: 12 living guards, 22 replicated props, correct HQ strength for that version, model footprints outside the centre passage, and separate completed quotas. It does not validate the current four-guard split. The historical [menu/settings fixture](evidence/large-checkpoints-2026-11-01/menu/native-checks.log) saved and reloaded distinct counts and width, and measured the controls’ native text bounds. It instantiates the generated layout directly; it does not claim human input, remote RPC delivery or screenshot acceptance. Both completed with unchanged inputs and cleanup; strict runners retain 13 existing resource/world errors and no script errors. Earlier failed iterations are recorded alongside the evidence. Full-load performance and multiplayer acceptance remain unmeasured. Fresh settings now initialize both drone keys, including the valid 300-second cooldown; the missing cooldown previously prevented a fresh settings document from passing save/readback validation. diff --git a/docs/evidence/checkpoint-squads-2026-11-10/native-compile/cleanup-followup.json b/docs/evidence/checkpoint-squads-2026-11-10/native-compile/cleanup-followup.json new file mode 100644 index 00000000..dd13d7d2 --- /dev/null +++ b/docs/evidence/checkpoint-squads-2026-11-10/native-compile/cleanup-followup.json @@ -0,0 +1,8 @@ +{ + "checked_utc": "2026-11-10T12:29:39.993627+00:00", + "private_prefix_idle": true, + "game_process_absent": true, + "initial_cleanup_had_transient_helper": 514577, + "helper_now_absent": true, + "note": "The initial cleanup check raced an exiting Wine helper; no additional process was signalled." +} diff --git a/docs/evidence/checkpoint-squads-2026-11-10/native-compile/cleanup.json b/docs/evidence/checkpoint-squads-2026-11-10/native-compile/cleanup.json new file mode 100644 index 00000000..a9bf36b3 --- /dev/null +++ b/docs/evidence/checkpoint-squads-2026-11-10/native-compile/cleanup.json @@ -0,0 +1,11 @@ +{ + "cleanup_confirmed": false, + "idle_verified": false, + "errors": [ + "idle verification: Disposable prefix already has a process (PID 514577); leave it untouched" + ], + "orphan_cleanup": { + "attempted": false, + "reason": "noncanonical-private-prefix" + } +} \ No newline at end of file diff --git a/docs/evidence/checkpoint-squads-2026-11-10/native-compile/command.json b/docs/evidence/checkpoint-squads-2026-11-10/native-compile/command.json new file mode 100644 index 00000000..416f4c76 --- /dev/null +++ b/docs/evidence/checkpoint-squads-2026-11-10/native-compile/command.json @@ -0,0 +1,29 @@ +[ + "gamescope", + "--backend", + "headless", + "-W", + "1280", + "-H", + "720", + "-w", + "1280", + "-h", + "720", + "-r", + "30", + "--", + "/home/jakub/.local/share/Steam/steamapps/common/Proton - Experimental/proton", + "run", + "/home/jakub/.local/share/Steam/steamapps/common/Arma Reforger Tools/Workbench/ArmaReforgerWorkbenchSteamDiag.exe", + "-gproj", + "Z:/tmp/erri-ai-19/checkpoint_split_20261110/addon.gproj", + "-profile", + "Z:/tmp/erri-ai-19/checkpoint_split_20261110-profile", + "-logconsole", + "-noBackend", + "-noSound", + "-disableCrashReporter", + "-wbModule=ResourceManager", + "-exitAfterInit" +] \ No newline at end of file diff --git a/docs/evidence/checkpoint-squads-2026-11-10/native-compile/console.log b/docs/evidence/checkpoint-squads-2026-11-10/native-compile/console.log new file mode 100644 index 00000000..925d64f8 --- /dev/null +++ b/docs/evidence/checkpoint-squads-2026-11-10/native-compile/console.log @@ -0,0 +1,242 @@ +--------------------------------------------- +Log Z:\tmp\erri-ai-19\checkpoint_split_20261110-profile\logs\logs_2026-11-10_13-28-42\console.log started at 2026-11-10 13:28:42 (2026-11-10 12:28:42 UTC) + +13:28:42.716 ENGINE : FileSystem: Adding relative directory 'Z:\tmp\erri-ai-19\checkpoint_split_20261110-profile\logs\logs_2026-11-10_13-28-42' to filesystem under name logs +13:28:42.716 ENGINE : FileSystem: Adding relative directory 'Z:\tmp\erri-ai-19\checkpoint_split_20261110-profile\profile' to filesystem under name profile +13:28:42.716 ENGINE : FileSystem: Current working directory: 'Z:\home\jakub\.local\share\Steam\steamapps\common\Arma Reforger Tools\Workbench\' +13:28:42.718 PROFILING : Workbench Create Engine took: 8.075500 ms +13:28:43.748 INIT : INIT : Workbench Init Engine +13:28:43.748 ENGINE : Initializing engine, version 193322 +13:28:43.748 ENGINE : CLI Params: -gproj Z:/tmp/erri-ai-19/checkpoint_split_20261110/addon.gproj -profile Z:/tmp/erri-ai-19/checkpoint_split_20261110-profile -logconsole -noBackend -noSound -disableCrashReporter -wbModule ResourceManager -exitAfterInit +13:28:43.760 ENGINE : Addon dirs: +13:28:43.760 ENGINE : dir: 'Z:/tmp/erri-ai-19/checkpoint_split_20261110/' +13:28:43.760 ENGINE : dir: './addons' +13:28:43.760 ENGINE : dir: 'Z:/tmp/erri-ai-19/checkpoint_split_20261110-profile/addons' +13:28:43.760 ENGINE : Available addons: +13:28:43.760 ENGINE : gproj: 'Z:/tmp/erri-ai-19/checkpoint_split_20261110/addon.gproj' guid: '2528466DE220D91C' +13:28:43.760 ENGINE : gproj: './addons/core/core.gproj' guid: '5614BBCCBB55ED1C' (packed) +13:28:43.760 ENGINE : gproj: 'Z:/tmp/erri-ai-19/checkpoint_split_20261110-profile/addons/ArmaReforger/ArmaReforger.gproj' guid: '58D0FB3206B6F859' (packed) +13:28:43.760 ENGINE : gproj: 'Z:/tmp/erri-ai-19/checkpoint_split_20261110-profile/addons/ERRI_1337C0DE5DABBEEF/addon.gproj' guid: '1337C0DE5DABBEEF' (packed) +13:28:43.760 ENGINE : gproj: 'Z:/tmp/erri-ai-19/checkpoint_split_20261110-profile/addons/ERRI_595F2BF2F44836FB/addon.gproj' guid: '595F2BF2F44836FB' (packed) +13:28:43.760 ENGINE : gproj: 'Z:/tmp/erri-ai-19/checkpoint_split_20261110-profile/addons/ERRI_5E389BB9F58B79A6/addon.gproj' guid: '5E389BB9F58B79A6' (packed) +13:28:43.760 ENGINE : gproj: 'Z:/tmp/erri-ai-19/checkpoint_split_20261110-profile/addons/ERRI_5E524E4FEECCA92B/addon.gproj' guid: '5E524E4FEECCA92B' (packed) +13:28:43.760 ENGINE : gproj: 'Z:/tmp/erri-ai-19/checkpoint_split_20261110-profile/addons/ERRI_629B2BA37EFFD577/addon.gproj' guid: '629B2BA37EFFD577' (packed) +13:28:43.760 ENGINE : gproj: 'Z:/tmp/erri-ai-19/checkpoint_split_20261110-profile/addons/ERRI_65930CB4CD0237B2/addon.gproj' guid: '65930CB4CD0237B2' (packed) +13:28:43.760 ENGINE : gproj: 'Z:/tmp/erri-ai-19/checkpoint_split_20261110-profile/addons/ERRI_BADC0DEDABBEDA5E/addon.gproj' guid: 'BADC0DEDABBEDA5E' (packed) +13:28:43.762 ENGINE : FileSystem: Adding relative directory 'Z:\tmp\erri-ai-19\checkpoint_split_20261110' to filesystem under name ERR_Core +13:28:43.762 ENGINE : FileSystem: Adding package 'Z:/tmp/erri-ai-19/checkpoint_split_20261110-profile/addons/ERRI_65930CB4CD0237B2/' (pak count: 1) to filesystem under name Parachutes +13:28:43.763 ENGINE : FileSystem: Adding package 'Z:/tmp/erri-ai-19/checkpoint_split_20261110-profile/addons/ERRI_5E524E4FEECCA92B/' (pak count: 1) to filesystem under name WCS_BMP-1 +13:28:43.764 ENGINE : FileSystem: Adding package 'Z:/tmp/erri-ai-19/checkpoint_split_20261110-profile/addons/ERRI_5E389BB9F58B79A6/' (pak count: 1) to filesystem under name WCS_SpaceCore +13:28:43.767 ENGINE : FileSystem: Adding package 'Z:/tmp/erri-ai-19/checkpoint_split_20261110-profile/addons/ERRI_629B2BA37EFFD577/' (pak count: 1) to filesystem under name WCS_Armaments +13:28:43.772 ENGINE : FileSystem: Adding package 'Z:/tmp/erri-ai-19/checkpoint_split_20261110-profile/addons/ERRI_595F2BF2F44836FB/' (pak count: 1) to filesystem under name RHS_Core +13:28:43.774 ENGINE : FileSystem: Adding package 'Z:/tmp/erri-ai-19/checkpoint_split_20261110-profile/addons/ERRI_BADC0DEDABBEDA5E/' (pak count: 2) to filesystem under name RHS_Content_02 +13:28:43.781 ENGINE : FileSystem: Adding package 'Z:/tmp/erri-ai-19/checkpoint_split_20261110-profile/addons/ERRI_1337C0DE5DABBEEF/' (pak count: 4) to filesystem under name RHS_Content_01 +13:28:43.902 ENGINE : FileSystem: Adding package 'Z:/tmp/erri-ai-19/checkpoint_split_20261110-profile/addons/ArmaReforger/' (pak count: 15) to filesystem under name ArmaReforger +13:28:43.907 ENGINE : FileSystem: Adding package './addons/core/' (pak count: 2) to filesystem under name core +13:28:43.907 ENGINE : CPU vendor : AuthenticAMD +13:28:43.907 ENGINE : CPU type : 2 +13:28:43.907 ENGINE : CPU name : AMD Ryzen 7 3800XT 8-Core Processor +13:28:43.907 ENGINE : CPU cache info : L1 [Inst 32KB, Data 32KB], L2 [Unif 512KB], L3 [Unif 16384KB] +13:28:43.907 ENGINE : CPU count logical : 16 +13:28:43.907 ENGINE : CPU count physical : 8 +13:28:43.907 ENGINE : CPU features : mmx sse sse2 sse3 ssse3 sse4_1 sse4_2 popcnt aesni pclmulqdq osxsave avx sha avx2 +13:28:43.907 RESOURCES : ResourceDB: loading cache (id=0 name=ERR_Core path=Z:\tmp\erri-ai-19\checkpoint_split_20261110/resourceDatabase.rdb) +13:28:43.907 RESOURCES : ResourceDB: loading cache (id=1 name=Parachutes path=Z:/tmp/erri-ai-19/checkpoint_split_20261110-profile/addons/ERRI_65930CB4CD0237B2/resourceDatabase.rdb) +13:28:43.908 RESOURCES : ResourceDB: loading cache (id=2 name=WCS_BMP-1 path=Z:/tmp/erri-ai-19/checkpoint_split_20261110-profile/addons/ERRI_5E524E4FEECCA92B/resourceDatabase.rdb) +13:28:43.908 RESOURCES : ResourceDB: loading cache (id=3 name=WCS_SpaceCore path=Z:/tmp/erri-ai-19/checkpoint_split_20261110-profile/addons/ERRI_5E389BB9F58B79A6/resourceDatabase.rdb) +13:28:43.909 RESOURCES : ResourceDB: loading cache (id=4 name=WCS_Armaments path=Z:/tmp/erri-ai-19/checkpoint_split_20261110-profile/addons/ERRI_629B2BA37EFFD577/resourceDatabase.rdb) +13:28:43.911 RESOURCES : ResourceDB: loading cache (id=5 name=RHS_Core path=Z:/tmp/erri-ai-19/checkpoint_split_20261110-profile/addons/ERRI_595F2BF2F44836FB/resourceDatabase.rdb) +13:28:43.922 RESOURCES : ResourceDB: loading cache (id=6 name=RHS_Content_02 path=Z:/tmp/erri-ai-19/checkpoint_split_20261110-profile/addons/ERRI_BADC0DEDABBEDA5E/resourceDatabase.rdb) +13:28:43.925 RESOURCES : ResourceDB: loading cache (id=7 name=RHS_Content_01 path=Z:/tmp/erri-ai-19/checkpoint_split_20261110-profile/addons/ERRI_1337C0DE5DABBEEF/resourceDatabase.rdb) +13:28:43.931 RESOURCES : ResourceDB: loading cache (id=8 name=ArmaReforger path=Z:/tmp/erri-ai-19/checkpoint_split_20261110-profile/addons/ArmaReforger/resourceDatabase.rdb) +13:28:44.066 RESOURCES : ResourceDB: loading cache (id=9 name=core path=./addons/core/resourceDatabase.rdb) +13:28:44.068 RESOURCES : ResourceDB: loading cache (id=10 name=profile path=Z:\tmp\erri-ai-19\checkpoint_split_20261110-profile\profile/resourceDatabase.rdb) +13:28:44.068 RESOURCES : ResourceDB: loading cache (id=11 name=logs path=Z:\tmp\erri-ai-19\checkpoint_split_20261110-profile\logs\logs_2026-11-10_13-28-42/resourceDatabase.rdb) +13:28:44.221 RESOURCES : RESOURCES : ResourceDB: full scan +13:28:44.227 RESOURCES : RESOURCES : scanning... +13:28:44.227 RESOURCES : RESOURCES : scanning @"ERR_Core" +13:28:44.239 RESOURCES : RESOURCES : scanning @"Parachutes" +13:28:44.242 RESOURCES : RESOURCES : scanning @"WCS_BMP-1" +13:28:44.244 RESOURCES : RESOURCES : scanning @"WCS_SpaceCore" +13:28:44.247 RESOURCES : RESOURCES : scanning @"WCS_Armaments" +13:28:44.252 RESOURCES : RESOURCES : scanning @"RHS_Core" +13:28:44.263 RESOURCES : RESOURCES : scanning @"RHS_Content_02" +13:28:44.266 RESOURCES : RESOURCES : scanning @"RHS_Content_01" +13:28:44.274 RESOURCES : RESOURCES : scanning @"ArmaReforger" +13:28:44.497 RESOURCES : RESOURCES : scanning @"core" +13:28:44.501 RESOURCES : RESOURCES : scanning @"profile" +13:28:44.501 RESOURCES : RESOURCES : scanning @"logs" +13:28:44.501 RESOURCES : RESOURCES : processing meta-files... +13:28:44.613 RESOURCES : 116151 meta-files cached, 161 loaded again +13:28:44.613 RESOURCES : RESOURCES : processing files... +13:28:44.613 INIT : Workbench startup +13:28:44.613 INIT : Workbench Init Engine +13:28:44.613 RESOURCES : ResourceDB: full scan +13:28:44.613 RESOURCES : processing files... +13:28:44.613 RESOURCES (W): resource not registered: @"$WCS_Armaments:Tools/VehicleMarkings/wear.json". Setting null GUID +13:28:44.613 RESOURCES (W): resource not registered: @"$RHS_Core:system/thermal/thermalProfileTreeCrownDefault.conf". Setting null GUID +13:28:44.627 RESOURCES : RESOURCES : processing folders... +13:28:44.635 RESOURCES : RESOURCES : creating GUID-item mapping... +13:28:44.651 RESOURCES : RESOURCES : building tree... +13:28:44.707 PROFILING : ResourceDB: full scan took: 486.184600 ms +13:28:44.708 RESOURCES : ResourceDB: saving cache (id=0 name=ERR_Core path=Z:\tmp\erri-ai-19\checkpoint_split_20261110/resourceDatabase.rdb) +13:28:44.710 RESOURCES : ResourceDB: written 38446/38446 bytes +13:28:44.710 RESOURCES : ResourceDB: cache successfully saved +13:28:44.710 RESOURCES : ResourceDB: saving cache (id=10 name=profile path=Z:\tmp\erri-ai-19\checkpoint_split_20261110-profile\profile/resourceDatabase.rdb) +13:28:44.712 RESOURCES : ResourceDB: written 51/51 bytes +13:28:44.712 RESOURCES : ResourceDB: cache successfully saved +13:28:44.712 RESOURCES : ResourceDB: saving cache (id=11 name=logs path=Z:\tmp\erri-ai-19\checkpoint_split_20261110-profile\logs\logs_2026-11-10_13-28-42/resourceDatabase.rdb) +13:28:44.713 RESOURCES : ResourceDB: written 81/81 bytes +13:28:44.713 RESOURCES : ResourceDB: cache successfully saved +13:28:44.713 ENGINE : GameProject load +13:28:44.713 ENGINE : Loaded addons: +13:28:44.713 ENGINE : gproj: './addons/core/core.gproj' guid: '5614BBCCBB55ED1C' +13:28:44.713 ENGINE : gproj: 'Z:/tmp/erri-ai-19/checkpoint_split_20261110-profile/addons/ArmaReforger/ArmaReforger.gproj' guid: '58D0FB3206B6F859' +13:28:44.713 ENGINE : gproj: 'Z:/tmp/erri-ai-19/checkpoint_split_20261110-profile/addons/ERRI_1337C0DE5DABBEEF/addon.gproj' guid: '1337C0DE5DABBEEF' +13:28:44.713 ENGINE : gproj: 'Z:/tmp/erri-ai-19/checkpoint_split_20261110-profile/addons/ERRI_BADC0DEDABBEDA5E/addon.gproj' guid: 'BADC0DEDABBEDA5E' +13:28:44.713 ENGINE : gproj: 'Z:/tmp/erri-ai-19/checkpoint_split_20261110-profile/addons/ERRI_595F2BF2F44836FB/addon.gproj' guid: '595F2BF2F44836FB' +13:28:44.713 ENGINE : gproj: 'Z:/tmp/erri-ai-19/checkpoint_split_20261110-profile/addons/ERRI_629B2BA37EFFD577/addon.gproj' guid: '629B2BA37EFFD577' +13:28:44.713 ENGINE : gproj: 'Z:/tmp/erri-ai-19/checkpoint_split_20261110-profile/addons/ERRI_5E389BB9F58B79A6/addon.gproj' guid: '5E389BB9F58B79A6' +13:28:44.713 ENGINE : gproj: 'Z:/tmp/erri-ai-19/checkpoint_split_20261110-profile/addons/ERRI_5E524E4FEECCA92B/addon.gproj' guid: '5E524E4FEECCA92B' +13:28:44.713 ENGINE : gproj: 'Z:/tmp/erri-ai-19/checkpoint_split_20261110-profile/addons/ERRI_65930CB4CD0237B2/addon.gproj' guid: '65930CB4CD0237B2' +13:28:44.713 ENGINE : gproj: 'Z:/tmp/erri-ai-19/checkpoint_split_20261110/addon.gproj' guid: '2528466DE220D91C' +13:28:44.715 ENGINE : GameProject load +13:28:44.715 INIT : GameProject load project data @"Z:/tmp/erri-ai-19/checkpoint_split_20261110-profile/addons/ERRI_595F2BF2F44836FB/addon.gproj" +13:28:44.715 RESOURCES (E): Wrong GUID/name for resource @"{0AFDD005CD669892}Language/rhs_localization.st" in property "StringTableSource" +13:28:44.715 INIT : GameProject load project data @"Z:/tmp/erri-ai-19/checkpoint_split_20261110-profile/addons/ERRI_629B2BA37EFFD577/addon.gproj" +13:28:44.715 RESOURCES (E): Wrong GUID/name for resource @"{41FA2A08B6971D4C}Language/wcs_armament_localization.st" in property "StringTableSource" +13:28:44.716 INIT : GameProject load project data @"Z:/tmp/erri-ai-19/checkpoint_split_20261110-profile/addons/ERRI_5E389BB9F58B79A6/addon.gproj" +13:28:44.716 RESOURCES (E): Wrong GUID/name for resource @"{84270E09F7A4A7A0}Language/wcs_spacecore_localization.st" in property "StringTableSource" +13:28:44.716 INIT : GameProject load project data @"Z:/tmp/erri-ai-19/checkpoint_split_20261110-profile/addons/ERRI_5E524E4FEECCA92B/addon.gproj" +13:28:44.716 RESOURCES (E): Wrong GUID/name for resource @"{E50E557B468C7073}Language/wcs_bmp1_localization.st" in property "StringTableSource" +13:28:44.717 ENGINE : Loading custom engine user config '$profile:.save/app1874910_user76561198020202999/settings/ReforgerEngineSettings.conf' +13:28:44.717 ENGINE : No Enfusion settings file loaded. Continuing with defaults +13:28:44.809 RENDER : (OK) Adapter 'AMD Radeon RX 6950 XT (RADV NAVI21)' supports feature level 12_0 +13:28:44.810 RENDER : Basic screen setup: +13:28:44.810 RENDER : Back buffer format : TEXFMT_R8G8B8A8_SRGB (29) +13:28:44.810 RENDER : MSAA : none +13:28:44.822 RENDER : AMD AGS library initialized, version 6.1.0 x DLL 6.1.0 +13:28:44.823 RENDER : Extendeded AMD info for AMD Radeon RX 6950 XT (RADV NAVI21) (primary device) +13:28:44.823 RENDER : * architecture RDNA2, 80 CUs, 40 WGPs (for RDNA), 64 ROPs +13:28:44.823 RENDER : * core clocks 2000 MHz, memory 1124 MHz +13:28:44.823 RENDER : * TFlops 20.5, memory bandwidth (562.0 GB/s) +13:28:44.823 RENDER : AMD AGS correctly initialized +13:28:44.823 RENDER : GPU_ATI (0x1002) (AMD Radeon RX 6950 XT (RADV NAVI21)) with 1 GPU detected, VRAM 16128MB (fast 0MB), shared 64362MB, driver version 99.19.02-230831a-396538C-AMD-Software-Adrenalin-Edition +13:28:44.823 RENDER : Detected output devices: +13:28:44.823 RENDER : * 1 device/s connected to AMD Radeon RX 6950 XT (RADV NAVI21): +13:28:44.823 RENDER : Generic Non-PnP Monitor (\\.\DISPLAY1), 1280x720 (offset 0x0), 30Hz +13:28:44.823 RENDER : Concurrent frames limit 2 +13:28:44.896 RENDER : DX12 device successfully created by AMD AGS library +13:28:44.896 RENDER : * user markers not supported in this version AMD SW +13:28:44.896 RENDER : Graphics device features +13:28:44.896 RENDER : Needed: +13:28:44.896 RENDER : * Highest supported shader model: 6.8 (6.0 needed) +13:28:44.896 RENDER : Optional: +13:28:44.896 RENDER : * Allow tearing (VSYNC) : 1 +13:28:44.896 RENDER : * 16 bits : 1 +13:28:44.896 RENDER : * Resource heap tier : 3 +13:28:44.896 RENDER : * Persistent heaps (DRED) : 1 +13:28:44.896 RENDER : * DRED 1.2 is supported by compiler +13:28:44.916 RENDER : Main RT format setup. +13:28:44.916 RENDER : Main RT format for quality 0 : TEXFMT_R11G11B10_FLOAT (26) +13:28:44.916 RENDER : Main RT format for quality 1 : TEXFMT_R16G16B16A16_FLOAT (10) +13:28:44.918 ENGINE : Job system settings: coreCount=16, shortJobContextCount=16, shortJobThreadCount=15, longJobThreadCount=16 +13:28:44.945 PROFILING : Settings changed took: 0.021800 ms +13:28:44.954 RENDER : RENDER : Reload shaders +13:28:44.954 RENDER : Enfusion shader version 37 +13:28:44.954 INIT : INIT : ShaderListReload +13:28:44.954 PROFILING : ShaderListReload took: 0.000400 ms +13:28:45.248 RENDER : Loaded 4592 newer shader binaries +13:28:45.248 PROFILING : Reload shaders took: 294.118300 ms +13:28:45.248 ENGINE : Initializing inputs. +13:28:45.261 RENDER : Super resolution method available: AMD FSR 1 +13:28:45.261 NETWORK : Initializing networking. +13:28:45.261 NETWORK : Using new GameRplScheduler. +13:28:45.262 SCRIPT : SCRIPT : Initializing scripts +13:28:45.262 SCRIPT : SCRIPT : ScriptProjectManager init +13:28:46.642 PROFILING : ScriptProjectManager init took: 1379.525200 ms +13:28:46.669 PROFILING : Initializing scripts took: 1407.415400 ms +13:28:46.685 BACKEND : Backend Services are disabled. +13:28:46.685 ENGINE : Enfusion engine successfully created. +13:28:46.685 PROFILING : Workbench Init Engine took: 2937.795700 ms +13:28:46.685 INIT : INIT : Workbench Create Game +13:28:46.721 GUI : Using default language (en_us) +13:28:46.721 GUI : Loading 'en_us' localization file. +13:28:46.721 INIT : INIT : Loading StringTable +13:28:46.753 PROFILING : Loading StringTable took: 31.534900 ms +13:28:46.753 SCRIPT : SCRIPT : Compiling GameLib scripts +13:28:46.806 SCRIPT : Module: Workbench; loaded 18x files; 36x classes; used 125K of static memory; defines: "ENF_WB,WORKBENCH,PLATFORM_WINDOWS,ENABLE_DIAG,ENF_ENABLE_RPLCOMPONENT_IN_GAMECODE"; CRC32: 90ce0460 +13:28:46.806 SCRIPT : Module: GameLib; loaded 513x files; 704x classes; used 887K of static memory; defines: "ENF_WB,WORKBENCH,PLATFORM_WINDOWS,ENABLE_DIAG,ENF_ENABLE_RPLCOMPONENT_IN_GAMECODE"; CRC32: 35487d81 +13:28:46.807 PROFILING : Compiling GameLib scripts took: 54.217200 ms +13:28:46.807 SCRIPT : SCRIPT : Compiling Game scripts +13:28:47.570 INIT : Workbench Create Game +13:28:47.570 SCRIPT : Compiling Game scripts +13:28:47.570 SCRIPT (W): @"Scripts/Game/Parachutes/ParachuteDeployed.c,7": Pointer type 'Physics' can only be used with local variables +13:28:47.746 SCRIPT (W): @"Scripts/Game/Components/Vehicles/RHS_VehicleAntennaComponent.c,82": Pointer type 'Animation' can only be used with local variables +13:28:48.078 SCRIPT (W): @"Scripts/Game/Editor/Components/EditableEntity/SCR_EditableEntityComponent.c,787": 'GetPlayerPlatformKind' is obsolete +13:28:48.078 SCRIPT (W): @"Scripts/Game/Editor/Components/EditableEntity/SCR_EditableEntityComponent.c,788": 'GetPlayerPlatformId' is obsolete +13:28:48.445 SCRIPT (W): @"Scripts/Game/ERR/00_Core/ERR_SiteService.c,363": 'GetCompartmentType' is obsolete: Use GetType() on the compartment instance directly. +13:28:48.460 SCRIPT (W): @"Scripts/Game/Workshop/SCR_AddonManager.c,876": 'GetRefCount' is obsolete: Will be removed +13:28:48.501 SCRIPT (W): @"Scripts/Game/Campaign/SCR_PlayerProfileManagerComponent.c,142": 'PlayerData' is obsolete +13:28:48.612 SCRIPT (W): @"Scripts/Game/Components/Magazines/SCR_MagazineComponent.c,134": Variable 'prefabPath' is not used +13:28:48.628 SCRIPT (W): @"Scripts/Game/UI/Backend/CareerBackend.c,159": 'GetDSSession' is obsolete +13:28:48.628 SCRIPT (W): @"Scripts/Game/UI/Backend/CareerBackend.c,162": 'RoomID' is obsolete +13:28:48.628 SCRIPT (W): @"Scripts/Game/UI/Backend/CareerBackend.c,197": 'GetDSSession' is obsolete +13:28:48.628 SCRIPT (W): @"Scripts/Game/UI/Backend/CareerBackend.c,201": 'RoomID' is obsolete +13:28:48.653 SCRIPT (W): @"Scripts/Game/ERR/00_Core/ERR_NativeVehicleSecurityProbe.c,77": 'GetCompartmentType' is obsolete: Use GetType() on the compartment instance directly. +13:28:48.662 SCRIPT (W): @"Scripts/Game/ERR/00_Core/ERR_CasualtyGroundSupport.c,21": 'GetBoneIndex' is obsolete: Use GetAnimation().GetBoneIndex() instead +13:28:48.730 SCRIPT (W): @"Scripts/Game/DataCollection/SCR_DataCollectorComponent.c,481": 'GetStorage' is obsolete +13:28:48.730 SCRIPT (W): @"Scripts/Game/DataCollection/SCR_DataCollectorComponent.c,483": 'GetOnlineWritePrivilege' is obsolete +13:28:48.732 SCRIPT (W): @"Scripts/Game/Utilities/SCR_PlayerIdentityUtils.c,20": 'GetPlayerIdentityId' is obsolete +13:28:48.762 SCRIPT (W): @"Scripts/Game/ERR/00_Core/ERR_NativeVehicleSecurityProbe.c,186": 'GetCompartmentType' is obsolete: Use GetType() on the compartment instance directly. +13:28:48.784 SCRIPT (W): @"Scripts/Game/ERR/00_Core/ERR_ExtractionService.c,311": 'GetCompartmentType' is obsolete: Use GetType() on the compartment instance directly. +13:28:48.784 SCRIPT (W): @"Scripts/Game/ERR/00_Core/ERR_ExtractionService.c,323": 'GetCompartmentType' is obsolete: Use GetType() on the compartment instance directly. +13:28:48.785 SCRIPT (W): @"Scripts/Game/UI/Menu/MainMenuUI.c,643": 'GetNotifyCount' is obsolete: Will be substitued by Notification Api. +13:28:48.785 SCRIPT (W): @"Scripts/Game/UI/Menu/MainMenuUI.c,645": 'GetNotifyItem' is obsolete: Will be substitued by Notification Api. +13:28:48.813 SCRIPT (W): @"Scripts/Game/ERR/00_Core/ERR_NativeTransportProbe.c,138": 'GetCompartmentType' is obsolete: Use GetType() on the compartment instance directly. +13:28:48.848 SCRIPT (W): @"Scripts/Game/DataCollection/PlayerData/SCR_PlayerData.c,210": 'PlayerData' is obsolete +13:28:49.207 SCRIPT : Module: WorkbenchGame; loaded 187x files; 692x classes; used 2796K of static memory; defines: "ENF_WB,WORKBENCH,PLATFORM_WINDOWS,ENABLE_DIAG,ENF_ENABLE_RPLCOMPONENT_IN_GAMECODE"; CRC32: 53d2bfa5 +13:28:49.214 SCRIPT : Module: Game; loaded 6917x files; 14355x classes; used 44987K of static memory; defines: "ENF_WB,WORKBENCH,PLATFORM_WINDOWS,ENABLE_DIAG,ENF_ENABLE_RPLCOMPONENT_IN_GAMECODE,ENABLE_BASE_DESTRUCTION,BUDGET_OPTIMIZATION_CHECKS,SHOW_DISCLAIMER,DEBUG,RESPAWN_TIMER_COMPONENT_DEBUG,GAME_MODE_DEBUG,DEBUG_CONFIGURABLE_DIALOGS,DISABLE_WEAPON_SWITCHING,SCRIPTED_AIM_MODIFIER_DEBUG,WCS_DEFINES_ARMAMENTS,WCS_DEFINES_SPACECORE"; CRC32: aa7d2b68 +13:28:49.265 PROFILING : Compiling Game scripts took: 2457.328100 ms +13:28:49.270 INIT : Creating game instance(ArmaReforgerScripted), version 1.9.0.37 built 2026-10-27 15:39:59 UTC. +13:28:49.333 ENGINE : Game successfully created. +13:28:49.334 PROFILING : Workbench Create Game took: 2648.889400 ms +13:28:49.341 DEFAULT : Using thumbnail cache directory: C:/users/steamuser/AppData/Local/Temp/Arma Reforger Workbench/Projects/ERR_Core/thumbnails +13:28:50.366 DEFAULT : Using autosave directory: C:/users/steamuser/AppData/Local/Temp/Arma Reforger Workbench/Projects/ERR_Core/autosaves +13:28:50.368 PROFILING : Workbench startup took: 7707.199000 ms +13:28:50.392 RESOURCES : ResourceDB: saving cache (id=0 name=ERR_Core path=Z:\tmp\erri-ai-19\checkpoint_split_20261110/resourceDatabase.rdb) +13:28:50.394 RESOURCES : ResourceDB: written 38446/38446 bytes +13:28:50.394 RESOURCES : ResourceDB: cache successfully saved +13:28:50.394 RESOURCES : ResourceDB: saving cache (id=10 name=profile path=Z:\tmp\erri-ai-19\checkpoint_split_20261110-profile\profile/resourceDatabase.rdb) +13:28:50.396 RESOURCES : ResourceDB: written 51/51 bytes +13:28:50.396 RESOURCES : ResourceDB: cache successfully saved +13:28:50.396 RESOURCES : ResourceDB: saving cache (id=11 name=logs path=Z:\tmp\erri-ai-19\checkpoint_split_20261110-profile\logs\logs_2026-11-10_13-28-42/resourceDatabase.rdb) +13:28:50.398 RESOURCES : ResourceDB: written 81/81 bytes +13:28:50.398 RESOURCES : ResourceDB: cache successfully saved +13:28:50.432 ENGINE : Game destroyed. +13:28:50.432 ENGINE : Game destroyed. +13:28:50.461 RESOURCES (E): ==== Resource leaks ==== +13:28:50.461 RESOURCES (E): UI/Fonts/RobotoCondensed/RobotoCondensed_Regular.edds 1 +13:28:50.461 RESOURCES (E): UI/Textures/Cursor/arrow_place_geometry_uiuc.edds 1 +13:28:50.461 RESOURCES (E): UI/Textures/Cursor/arrow_transform_geometry_uiuc.edds 1 +13:28:50.461 RESOURCES (E): UI/Textures/Cursor/cursors_atlas.edds 1 +13:28:50.461 RESOURCES (E): UI/Textures/Cursor/arrow_objective_uiuc.edds 1 +13:28:50.461 RESOURCES (E): UI/Textures/Cursor/arrow_waypoint_uiuc.edds 1 +13:28:50.461 RESOURCES (E): UI/Textures/Cursor/arrow_rotate_uiuc.edds 1 +13:28:50.461 RESOURCES (E): UI/Textures/Cursor/arrow_transform_snap_disabled_uiuc.edds 1 +13:28:50.461 RESOURCES (E): UI/Textures/Cursor/arrow_transform_snap_uiuc.edds 1 +13:28:50.461 RESOURCES (E): UI/Textures/Cursor/arrow_move_camera_uiuc.edds 1 +13:28:50.461 RESOURCES (E): UI/Textures/Cursor/arrow_wait_uiuc.edds 1 +13:28:50.461 RESOURCES (E): UI/Textures/Cursor/arrow_transform_disabled_uiuc.edds 1 +13:28:50.461 RESOURCES (E): UI/Textures/Cursor/arrow_transform_uiuc.edds 1 +13:28:50.461 RESOURCES (E): UI/Textures/Cursor/arrow_place_uiuc.edds 1 +13:28:50.461 RESOURCES (E): UI/Textures/Cursor/arrow_select_uiuc.edds 1 +13:28:50.461 RESOURCES (E): UI/Textures/Cursor/arrow_raw_uiuc.edds 1 +13:28:50.461 RESOURCES (E): UI/Imagesets/Panels/Shadow/panels_fadedBackground-16-100_atlas.edds 1 +13:28:50.461 RESOURCES (E): UI/Imagesets/Panels/Outline/panels_roundedOutline_atlas.edds 1 +13:28:50.461 RESOURCES (E): UI/Imagesets/Panels/panels_roundedCorners_atlas.edds 1 +13:28:50.461 RESOURCES (E): UI/Imagesets/WeaponInfo/panel_style_magazines.edds 1 +13:28:50.462 RESOURCES (E): UI/Imagesets/debugUI.edds 1 +13:28:50.462 RESOURCES (E): UI/Textures/WidgetLibrary/ScrollBarRectangles.edds 1 +13:28:50.462 RESOURCES (E): UI/Imagesets/default.edds 1 +13:28:50.462 RESOURCES (E): ui/fonts/robotomono_msdf_28.edds 1 diff --git a/docs/evidence/checkpoint-squads-2026-11-10/native-compile/index.py b/docs/evidence/checkpoint-squads-2026-11-10/native-compile/index.py new file mode 100644 index 00000000..380b05bd --- /dev/null +++ b/docs/evidence/checkpoint-squads-2026-11-10/native-compile/index.py @@ -0,0 +1,25 @@ +from pathlib import Path +import sys,os,subprocess,json,fcntl,time +sys.path.insert(0,'/home/jakub/devel/escapistsrereintroduced/tools') +from headless_game import assert_no_game,assert_prefix_idle,cleanup_owned_run +base=Path('/tmp/erri-ai-19'); target=sys.argv[1] if len(sys.argv)>1 else 'indexed'; compat=base/'compat'; steam=Path.home()/'.local/share/Steam'; proton=steam/'steamapps/common/Proton - Experimental/proton' +lock=(compat/'.erri-workbench.lock').open('a');fcntl.flock(lock,fcntl.LOCK_EX|fcntl.LOCK_NB); assert_no_game(); assert_prefix_idle(compat) +cmd=['gamescope','--backend','headless','-W','1280','-H','720','-w','1280','-h','720','-r','30','--',str(proton),'run',str(steam/'steamapps/common/Arma Reforger Tools/Workbench/ArmaReforgerWorkbenchSteamDiag.exe'),'-gproj','Z:'+str(base/target/'addon.gproj'),'-profile','Z:'+str(base/(target+'-profile')),'-logconsole','-noBackend','-noSound','-disableCrashReporter','-wbModule=ResourceManager','-exitAfterInit'] +env=os.environ.copy();env.update(STEAM_COMPAT_DATA_PATH=str(compat),STEAM_COMPAT_CLIENT_INSTALL_PATH=str(steam),WINEPREFIX=str(compat/'pfx')) +profile=base/(target+'-profile'); (profile/'addons').mkdir(parents=True,exist_ok=True) +if not (profile/'addons/ArmaReforger').exists():(profile/'addons/ArmaReforger').symlink_to(steam/'steamapps/common/Arma Reforger/addons/data',target_is_directory=True) +(base/(target+'-command.json')).write_text(json.dumps(cmd,indent=2)) +with (base/(target+'-launch.log')).open('w') as log: + started=time.time(); p=subprocess.Popen(cmd,stdout=log,stderr=subprocess.STDOUT,env=env,cwd=steam/'steamapps/common/Arma Reforger Tools/Workbench',start_new_session=True) + try: + deadline=time.monotonic()+90 + while p.poll() is None and time.monotonic()= started) + content=logs[-1].read_text(errors="replace") if logs else "" + if "Cannot initialize game project settings" in content or "Can't compile" in content: break + if (base/target/"resourceDatabase.rdb").is_file() and "Creating game instance(ArmaReforgerScripted)" in content: + time.sleep(3); break + time.sleep(1) + except subprocess.TimeoutExpired:pass + finally:(base/(target+'-cleanup.json')).write_text(json.dumps(cleanup_owned_run(p,proton,env,compat),indent=2)) +print((base/(target+'-cleanup.json')).read_text());print('index exists:',(base/target/'resourceDatabase.rdb').is_file()) diff --git a/docs/evidence/checkpoint-squads-2026-11-10/native-compile/launch.log b/docs/evidence/checkpoint-squads-2026-11-10/native-compile/launch.log new file mode 100644 index 00000000..2bd4770c --- /dev/null +++ b/docs/evidence/checkpoint-squads-2026-11-10/native-compile/launch.log @@ -0,0 +1,118 @@ +[gamescope] [Info] console: gamescope version 3.17.0 (gcc 16.2.1) +No CAP_SYS_NICE, falling back to regular-priority compute and threads. +Performance will be affected. +[gamescope] [Info] scriptmgr: Loading scripts from: '/usr/share/gamescope/scripts' +[gamescope] [Info] scriptmgr: Loading scripts from: '/usr/share/gamescope/scripts/00-gamescope' +[gamescope] [Info] scriptmgr: Loading scripts from: '/usr/share/gamescope/scripts/00-gamescope/common' +[gamescope] [Info] scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/common/inspect.lua' (id: 0) +[gamescope] [Info] scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/common/modegen.lua' (id: 1) +[gamescope] [Info] scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/common/util.lua' (id: 2) +[gamescope] [Info] scriptmgr: Loading scripts from: '/usr/share/gamescope/scripts/00-gamescope/displays' +[gamescope] [Info] scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/displays/asus.rogally.lcd.lua' (id: 3) +[gamescope] [Info] scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/displays/asus.rogallyx20.oled.lua' (id: 4) +[gamescope] [Info] scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/displays/deckhd.steamdeck.deckhd-lcd.lua' (id: 5) +[gamescope] [Info] scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/displays/gpd.win4.lcd.lua' (id: 6) +[gamescope] [Info] scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/displays/lenovo.legiongo.lcd.lua' (id: 7) +[gamescope] [Info] scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/displays/lenovo.legiongo2.oled.lua' (id: 8) +[gamescope] [Info] scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/displays/lenovo.legiongos.lcd.lua' (id: 9) +[gamescope] [Info] scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/displays/onexplayer.f1.oled.lua' (id: 10) +[gamescope] [Info] scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/displays/valve.steamdeck.lcd.lua' (id: 11) +[gamescope] [Info] scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/displays/valve.steamdeck.oled.lua' (id: 12) +[gamescope] [Info] scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/displays/zotac.zone.oled.lua' (id: 13) +[gamescope] [Info] scriptmgr: Loading scripts from: '/etc/gamescope/scripts' +[gamescope] [Warn] scriptmgr: Directory '/etc/gamescope/scripts' does not exist +[gamescope] [Info] scriptmgr: Loading scripts from: '/home/jakub/.config/gamescope/scripts' +[gamescope] [Warn] scriptmgr: Directory '/home/jakub/.config/gamescope/scripts' does not exist +[gamescope] [Info] vulkan: selecting physical device 'AMD Radeon RX 6950 XT (RADV NAVI21)': queue family 1 (general queue family 0) +[gamescope] [Info] vulkan: physical device supports DRM format modifiers +[gamescope] [Info] wlserver: [backend/headless/backend.c:60] Creating headless backend +[gamescope] [Info] vulkan: supported DRM formats for sampling usage: +[gamescope] [Info] vulkan: AR24 (0x34325241) +[gamescope] [Info] vulkan: XR24 (0x34325258) +[gamescope] [Info] vulkan: AB24 (0x34324241) +[gamescope] [Info] vulkan: XB24 (0x34324258) +[gamescope] [Info] vulkan: RG16 (0x36314752) +[gamescope] [Info] vulkan: NV12 (0x3231564E) +[gamescope] [Info] vulkan: AB4H (0x48344241) +[gamescope] [Info] vulkan: XB4H (0x48344258) +[gamescope] [Info] vulkan: AB48 (0x38344241) +[gamescope] [Info] vulkan: XB48 (0x38344258) +[gamescope] [Info] vulkan: AB30 (0x30334241) +[gamescope] [Info] vulkan: XB30 (0x30334258) +[gamescope] [Info] vulkan: AR30 (0x30335241) +[gamescope] [Info] vulkan: XR30 (0x30335258) +[gamescope] [Info] wlserver: Using explicit sync when available +[gamescope] [Info] wlserver: Running compositor on wayland display 'gamescope-0' +[gamescope] [Info] wlserver: [backend/headless/backend.c:17] Starting headless backend +[gamescope] [Info] wlserver: Successfully initialized libei for input emulation! +[gamescope] [Error] wlserver: [xwayland/sockets.c:47] Failed to bind socket @/tmp/.X11-unix/X0: Address already in use +[gamescope] [Info] wlserver: [xwayland/server.c:108] Starting Xwayland on :3 +[gamescope] [Info] pipewire: stream state changed: connecting +[gamescope] [Info] pipewire: stream state changed: paused +[gamescope] [Info] pipewire: stream available on node ID: 150 +[gamescope] [Info] vblank: Using timerfd. +fsync: up and running. +[Gamescope WSI] No application info given. +[Gamescope WSI] Executable name: explorer.exe +The XKEYBOARD keymap compiler (xkbcomp) reports: +> Warning: Unsupported maximum keycode 709, clipping. +> X11 cannot support keycodes above 255. +> Warning: Virtual modifier Hyper multiply defined +> Using 0, ignoring 0 +> Warning: Virtual modifier ScrollLock multiply defined +> Using 0, ignoring 0 +Errors from xkbcomp are not fatal to the X server +ATTENTION: default value of option vk_wsi_force_swapchain_to_current_extent overridden by environment. +[Gamescope WSI] Application info: + pApplicationName: xalia.exe + applicationVersion: 0 + pEngineName: DXVK + engineVersion: 12587009 + apiVersion: 4206592 +[Gamescope WSI] Executable name: xalia.exe +ATTENTION: default value of option vk_wsi_force_swapchain_to_current_extent overridden by environment. +[Gamescope WSI] No application info given. +[Gamescope WSI] Application info: + pApplicationName: ArmaReforgerWorkbenchSteamDiag.exe + applicationVersion: 1 + pEngineName: DXVK + engineVersion: 12587009 + apiVersion: 4206592 +[Gamescope WSI] Executable name: ArmaReforgerWorkbenchSteamDiag.exe +ATTENTION: default value of option vk_wsi_force_swapchain_to_current_extent overridden by environment. +[Gamescope WSI] No application info given. +ATTENTION: default value of option vk_wsi_force_swapchain_to_current_extent overridden by environment. +[Gamescope WSI] Application info: + pApplicationName: ArmaReforgerWorkbenchSteamDiag.exe + applicationVersion: 0 + pEngineName: DXVK + engineVersion: 12587009 + apiVersion: 4206592 +ATTENTION: default value of option vk_wsi_force_swapchain_to_current_extent overridden by environment. +[Gamescope WSI] Application info: + pApplicationName: ArmaReforgerWorkbenchSteamDiag.exe + applicationVersion: 0 + pEngineName: vkd3d + engineVersion: 12587008 + apiVersion: 4206592 +[Gamescope WSI] Forcing on VK_EXT_swapchain_maintenance1. +ATTENTION: default value of option vk_wsi_force_swapchain_to_current_extent overridden by environment. +[Gamescope WSI] No application info given. +ATTENTION: default value of option vk_wsi_force_swapchain_to_current_extent overridden by environment. +[Gamescope WSI] Application info: + pApplicationName: ArmaReforgerWorkbenchSteamDiag.exe + applicationVersion: 0 + pEngineName: vkd3d + engineVersion: 12587008 + apiVersion: 4206592 +[Gamescope WSI] Forcing on VK_EXT_swapchain_maintenance1. +[Gamescope WSI] Creating Gamescope surface: xid: 0x1a001a4 +[Gamescope WSI] Atom of T was wrong type. Expected XCB_ATOM_CARDINAL. +[Gamescope WSI] Made gamescope surface for xid: 0x1a001a4 +[Gamescope WSI] Surface state: + steam app id: 1874910 + window xid: 0x1a001a4 + wayland surface res id: 8 + layer client flags: 0x4 + server hdr output enabled: false + hdr formats exposed to client: false diff --git a/docs/evidence/checkpoint-squads-2026-11-10/native-compile/result.json b/docs/evidence/checkpoint-squads-2026-11-10/native-compile/result.json new file mode 100644 index 00000000..e3b3fc06 --- /dev/null +++ b/docs/evidence/checkpoint-squads-2026-11-10/native-compile/result.json @@ -0,0 +1,76 @@ +{ + "full_game_module_compiled": true, + "engine_version": "1.9.0.37", + "game_instance_created": true, + "script_errors": [], + "script_warnings": [ + "13:28:47.570 SCRIPT (W): @\"Scripts/Game/Parachutes/ParachuteDeployed.c,7\": Pointer type 'Physics' can only be used with local variables", + "13:28:47.746 SCRIPT (W): @\"Scripts/Game/Components/Vehicles/RHS_VehicleAntennaComponent.c,82\": Pointer type 'Animation' can only be used with local variables", + "13:28:48.078 SCRIPT (W): @\"Scripts/Game/Editor/Components/EditableEntity/SCR_EditableEntityComponent.c,787\": 'GetPlayerPlatformKind' is obsolete", + "13:28:48.078 SCRIPT (W): @\"Scripts/Game/Editor/Components/EditableEntity/SCR_EditableEntityComponent.c,788\": 'GetPlayerPlatformId' is obsolete", + "13:28:48.445 SCRIPT (W): @\"Scripts/Game/ERR/00_Core/ERR_SiteService.c,363\": 'GetCompartmentType' is obsolete: Use GetType() on the compartment instance directly.", + "13:28:48.460 SCRIPT (W): @\"Scripts/Game/Workshop/SCR_AddonManager.c,876\": 'GetRefCount' is obsolete: Will be removed", + "13:28:48.501 SCRIPT (W): @\"Scripts/Game/Campaign/SCR_PlayerProfileManagerComponent.c,142\": 'PlayerData' is obsolete", + "13:28:48.612 SCRIPT (W): @\"Scripts/Game/Components/Magazines/SCR_MagazineComponent.c,134\": Variable 'prefabPath' is not used", + "13:28:48.628 SCRIPT (W): @\"Scripts/Game/UI/Backend/CareerBackend.c,159\": 'GetDSSession' is obsolete", + "13:28:48.628 SCRIPT (W): @\"Scripts/Game/UI/Backend/CareerBackend.c,162\": 'RoomID' is obsolete", + "13:28:48.628 SCRIPT (W): @\"Scripts/Game/UI/Backend/CareerBackend.c,197\": 'GetDSSession' is obsolete", + "13:28:48.628 SCRIPT (W): @\"Scripts/Game/UI/Backend/CareerBackend.c,201\": 'RoomID' is obsolete", + "13:28:48.653 SCRIPT (W): @\"Scripts/Game/ERR/00_Core/ERR_NativeVehicleSecurityProbe.c,77\": 'GetCompartmentType' is obsolete: Use GetType() on the compartment instance directly.", + "13:28:48.662 SCRIPT (W): @\"Scripts/Game/ERR/00_Core/ERR_CasualtyGroundSupport.c,21\": 'GetBoneIndex' is obsolete: Use GetAnimation().GetBoneIndex() instead", + "13:28:48.730 SCRIPT (W): @\"Scripts/Game/DataCollection/SCR_DataCollectorComponent.c,481\": 'GetStorage' is obsolete", + "13:28:48.730 SCRIPT (W): @\"Scripts/Game/DataCollection/SCR_DataCollectorComponent.c,483\": 'GetOnlineWritePrivilege' is obsolete", + "13:28:48.732 SCRIPT (W): @\"Scripts/Game/Utilities/SCR_PlayerIdentityUtils.c,20\": 'GetPlayerIdentityId' is obsolete", + "13:28:48.762 SCRIPT (W): @\"Scripts/Game/ERR/00_Core/ERR_NativeVehicleSecurityProbe.c,186\": 'GetCompartmentType' is obsolete: Use GetType() on the compartment instance directly.", + "13:28:48.784 SCRIPT (W): @\"Scripts/Game/ERR/00_Core/ERR_ExtractionService.c,311\": 'GetCompartmentType' is obsolete: Use GetType() on the compartment instance directly.", + "13:28:48.784 SCRIPT (W): @\"Scripts/Game/ERR/00_Core/ERR_ExtractionService.c,323\": 'GetCompartmentType' is obsolete: Use GetType() on the compartment instance directly.", + "13:28:48.785 SCRIPT (W): @\"Scripts/Game/UI/Menu/MainMenuUI.c,643\": 'GetNotifyCount' is obsolete: Will be substitued by Notification Api.", + "13:28:48.785 SCRIPT (W): @\"Scripts/Game/UI/Menu/MainMenuUI.c,645\": 'GetNotifyItem' is obsolete: Will be substitued by Notification Api.", + "13:28:48.813 SCRIPT (W): @\"Scripts/Game/ERR/00_Core/ERR_NativeTransportProbe.c,138\": 'GetCompartmentType' is obsolete: Use GetType() on the compartment instance directly.", + "13:28:48.848 SCRIPT (W): @\"Scripts/Game/DataCollection/PlayerData/SCR_PlayerData.c,210\": 'PlayerData' is obsolete" + ], + "resource_errors": [ + "13:28:44.715 RESOURCES (E): Wrong GUID/name for resource @\"{0AFDD005CD669892}Language/rhs_localization.st\" in property \"StringTableSource\"", + "13:28:44.715 RESOURCES (E): Wrong GUID/name for resource @\"{41FA2A08B6971D4C}Language/wcs_armament_localization.st\" in property \"StringTableSource\"", + "13:28:44.716 RESOURCES (E): Wrong GUID/name for resource @\"{84270E09F7A4A7A0}Language/wcs_spacecore_localization.st\" in property \"StringTableSource\"", + "13:28:44.716 RESOURCES (E): Wrong GUID/name for resource @\"{E50E557B468C7073}Language/wcs_bmp1_localization.st\" in property \"StringTableSource\"", + "13:28:50.461 RESOURCES (E): ==== Resource leaks ====", + "13:28:50.461 RESOURCES (E): UI/Fonts/RobotoCondensed/RobotoCondensed_Regular.edds 1", + "13:28:50.461 RESOURCES (E): UI/Textures/Cursor/arrow_place_geometry_uiuc.edds 1", + "13:28:50.461 RESOURCES (E): UI/Textures/Cursor/arrow_transform_geometry_uiuc.edds 1", + "13:28:50.461 RESOURCES (E): UI/Textures/Cursor/cursors_atlas.edds 1", + "13:28:50.461 RESOURCES (E): UI/Textures/Cursor/arrow_objective_uiuc.edds 1", + "13:28:50.461 RESOURCES (E): UI/Textures/Cursor/arrow_waypoint_uiuc.edds 1", + "13:28:50.461 RESOURCES (E): UI/Textures/Cursor/arrow_rotate_uiuc.edds 1", + "13:28:50.461 RESOURCES (E): UI/Textures/Cursor/arrow_transform_snap_disabled_uiuc.edds 1", + "13:28:50.461 RESOURCES (E): UI/Textures/Cursor/arrow_transform_snap_uiuc.edds 1", + "13:28:50.461 RESOURCES (E): UI/Textures/Cursor/arrow_move_camera_uiuc.edds 1", + "13:28:50.461 RESOURCES (E): UI/Textures/Cursor/arrow_wait_uiuc.edds 1", + "13:28:50.461 RESOURCES (E): UI/Textures/Cursor/arrow_transform_disabled_uiuc.edds 1", + "13:28:50.461 RESOURCES (E): UI/Textures/Cursor/arrow_transform_uiuc.edds 1", + "13:28:50.461 RESOURCES (E): UI/Textures/Cursor/arrow_place_uiuc.edds 1", + "13:28:50.461 RESOURCES (E): UI/Textures/Cursor/arrow_select_uiuc.edds 1", + "13:28:50.461 RESOURCES (E): UI/Textures/Cursor/arrow_raw_uiuc.edds 1", + "13:28:50.461 RESOURCES (E): UI/Imagesets/Panels/Shadow/panels_fadedBackground-16-100_atlas.edds 1", + "13:28:50.461 RESOURCES (E): UI/Imagesets/Panels/Outline/panels_roundedOutline_atlas.edds 1", + "13:28:50.461 RESOURCES (E): UI/Imagesets/Panels/panels_roundedCorners_atlas.edds 1", + "13:28:50.461 RESOURCES (E): UI/Imagesets/WeaponInfo/panel_style_magazines.edds 1", + "13:28:50.462 RESOURCES (E): UI/Imagesets/debugUI.edds 1", + "13:28:50.462 RESOURCES (E): UI/Textures/WidgetLibrary/ScrollBarRectangles.edds 1", + "13:28:50.462 RESOURCES (E): UI/Imagesets/default.edds 1", + "13:28:50.462 RESOURCES (E): ui/fonts/robotomono_msdf_28.edds 1" + ], + "warning_count": 26, + "snapshot_source_changed": [], + "checkout_source_changed": [], + "cleanup_followup": { + "checked_utc": "2026-11-10T12:29:39.993627+00:00", + "private_prefix_idle": true, + "game_process_absent": true, + "initial_cleanup_had_transient_helper": 514577, + "helper_now_absent": true, + "note": "The initial cleanup check raced an exiting Wine helper; no additional process was signalled." + }, + "console_sha256": "7a7838a9100d0f10a54194a8c24684d6f5c56dc95d5728e2cdc3c53e68452b45", + "scope": "Full core Workbench script compilation/indexing with declared installed dependencies; no native checkpoint gameplay/performance smoke, no publishing or deployment." +} diff --git a/docs/evidence/checkpoint-squads-2026-11-10/native-compile/sandbox-attempt/cleanup.json b/docs/evidence/checkpoint-squads-2026-11-10/native-compile/sandbox-attempt/cleanup.json new file mode 100644 index 00000000..8e692524 --- /dev/null +++ b/docs/evidence/checkpoint-squads-2026-11-10/native-compile/sandbox-attempt/cleanup.json @@ -0,0 +1,9 @@ +{ + "cleanup_confirmed": true, + "idle_verified": true, + "errors": [], + "orphan_cleanup": { + "attempted": false, + "reason": "noncanonical-private-prefix" + } +} \ No newline at end of file diff --git a/docs/evidence/checkpoint-squads-2026-11-10/native-compile/sandbox-attempt/command.json b/docs/evidence/checkpoint-squads-2026-11-10/native-compile/sandbox-attempt/command.json new file mode 100644 index 00000000..416f4c76 --- /dev/null +++ b/docs/evidence/checkpoint-squads-2026-11-10/native-compile/sandbox-attempt/command.json @@ -0,0 +1,29 @@ +[ + "gamescope", + "--backend", + "headless", + "-W", + "1280", + "-H", + "720", + "-w", + "1280", + "-h", + "720", + "-r", + "30", + "--", + "/home/jakub/.local/share/Steam/steamapps/common/Proton - Experimental/proton", + "run", + "/home/jakub/.local/share/Steam/steamapps/common/Arma Reforger Tools/Workbench/ArmaReforgerWorkbenchSteamDiag.exe", + "-gproj", + "Z:/tmp/erri-ai-19/checkpoint_split_20261110/addon.gproj", + "-profile", + "Z:/tmp/erri-ai-19/checkpoint_split_20261110-profile", + "-logconsole", + "-noBackend", + "-noSound", + "-disableCrashReporter", + "-wbModule=ResourceManager", + "-exitAfterInit" +] \ No newline at end of file diff --git a/docs/evidence/checkpoint-squads-2026-11-10/native-compile/sandbox-attempt/launch.log b/docs/evidence/checkpoint-squads-2026-11-10/native-compile/sandbox-attempt/launch.log new file mode 100644 index 00000000..29d36014 --- /dev/null +++ b/docs/evidence/checkpoint-squads-2026-11-10/native-compile/sandbox-attempt/launch.log @@ -0,0 +1,26 @@ +[gamescope] [Info] console: gamescope version 3.17.0 (gcc 16.2.1) +No CAP_SYS_NICE, falling back to regular-priority compute and threads. +Performance will be affected. +[gamescope] [Info] scriptmgr: Loading scripts from: '/usr/share/gamescope/scripts' +[gamescope] [Info] scriptmgr: Loading scripts from: '/usr/share/gamescope/scripts/00-gamescope' +[gamescope] [Info] scriptmgr: Loading scripts from: '/usr/share/gamescope/scripts/00-gamescope/common' +[gamescope] [Info] scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/common/inspect.lua' (id: 0) +[gamescope] [Info] scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/common/modegen.lua' (id: 1) +[gamescope] [Info] scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/common/util.lua' (id: 2) +[gamescope] [Info] scriptmgr: Loading scripts from: '/usr/share/gamescope/scripts/00-gamescope/displays' +[gamescope] [Info] scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/displays/asus.rogally.lcd.lua' (id: 3) +[gamescope] [Info] scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/displays/asus.rogallyx20.oled.lua' (id: 4) +[gamescope] [Info] scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/displays/deckhd.steamdeck.deckhd-lcd.lua' (id: 5) +[gamescope] [Info] scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/displays/gpd.win4.lcd.lua' (id: 6) +[gamescope] [Info] scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/displays/lenovo.legiongo.lcd.lua' (id: 7) +[gamescope] [Info] scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/displays/lenovo.legiongo2.oled.lua' (id: 8) +[gamescope] [Info] scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/displays/lenovo.legiongos.lcd.lua' (id: 9) +[gamescope] [Info] scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/displays/onexplayer.f1.oled.lua' (id: 10) +[gamescope] [Info] scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/displays/valve.steamdeck.lcd.lua' (id: 11) +[gamescope] [Info] scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/displays/valve.steamdeck.oled.lua' (id: 12) +[gamescope] [Info] scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/displays/zotac.zone.oled.lua' (id: 13) +[gamescope] [Info] scriptmgr: Loading scripts from: '/etc/gamescope/scripts' +[gamescope] [Warn] scriptmgr: Directory '/etc/gamescope/scripts' does not exist +[gamescope] [Info] scriptmgr: Loading scripts from: '/home/jakub/.config/gamescope/scripts' +[gamescope] [Warn] scriptmgr: Directory '/home/jakub/.config/gamescope/scripts' does not exist +Failed to connect to wayland socket: wayland-1. diff --git a/docs/evidence/checkpoint-squads-2026-11-10/native-compile/sandbox-attempt/result.json b/docs/evidence/checkpoint-squads-2026-11-10/native-compile/sandbox-attempt/result.json new file mode 100644 index 00000000..eb122a74 --- /dev/null +++ b/docs/evidence/checkpoint-squads-2026-11-10/native-compile/sandbox-attempt/result.json @@ -0,0 +1,13 @@ +{ + "compiled": false, + "reason": "Gamescope failed to connect to wayland-1 before Workbench started", + "cleanup": { + "cleanup_confirmed": true, + "idle_verified": true, + "errors": [], + "orphan_cleanup": { + "attempted": false, + "reason": "noncanonical-private-prefix" + } + } +} diff --git a/docs/evidence/checkpoint-squads-2026-11-10/native-compile/source-manifest.json b/docs/evidence/checkpoint-squads-2026-11-10/native-compile/source-manifest.json new file mode 100644 index 00000000..b8f82886 --- /dev/null +++ b/docs/evidence/checkpoint-squads-2026-11-10/native-compile/source-manifest.json @@ -0,0 +1,749 @@ +{ + "created_utc": "2026-11-10T12:28:03.849290+00:00", + "snapshot": "/tmp/erri-ai-19/checkpoint_split_20261110", + "source": "addons/core", + "files": { + "AI/BehaviorTrees/ERR/MortarRapidFire.bt": "16b263bcb2fb3ae361367a600753a829425620d2e6b350a891c51fba47437ab6", + "AI/BehaviorTrees/ERR/MortarRapidFire.bt.meta": "f2a44ece28891240e6bfa1d01af29428adcadbe82c80e287eb33cd5e58f1f90a", + "Assets/Items/ERR_Atlas/AtlasCover.emat": "0a536cd31d1917965ab36d33e273a881be384eb8b863eb5da03d1666e141d45a", + "Assets/Items/ERR_Atlas/AtlasCover.emat.meta": "9f4d59cd6d103547e3e494baf7cc8fce70f31f87c66fe6d26b70011bbd27e38b", + "Assets/Items/ERR_Atlas/AtlasPaper.emat": "88a2c1061c01eb96ce8a0f753bd3e89e1d7af01471ccc4abb4774a7aa9a532fb", + "Assets/Items/ERR_Atlas/AtlasPaper.emat.meta": "e0093b7df155499444f93a1148a07f66cc755489192db17c81f4035d17378efb", + "Assets/Items/ERR_Atlas/AtlasPrint.emat": "9877c5b175c5f30dd80bea36c711b21ab38219aa7075adf9ae79932e1d4c76bc", + "Assets/Items/ERR_Atlas/AtlasPrint.emat.meta": "33a9eaa49871813f2e8537f071ea0f5a4422eb08d536355a47314b6b6d845b19", + "Assets/Items/ERR_Atlas/AtlasTurn.agf": "48dc42771b7e44994839dfabe9b007c23e37bd9be900196c757f42351e5c6b04", + "Assets/Items/ERR_Atlas/AtlasTurn.agf.meta": "c081aec31c927c0c374dcc0f8eb3eaec498f71cb0e2ac746879b926f8dc7d00e", + "Assets/Items/ERR_Atlas/AtlasTurn.agr": "8ec57b278c9d63324d00f7af62abf75230c5ef631d1cc070661585ee235c8a1f", + "Assets/Items/ERR_Atlas/AtlasTurn.agr.meta": "b045e26f86116703d1b3599fdf747b413cc0064d8101eff659ded0355eff31fe", + "Assets/Items/ERR_Atlas/AtlasWire.emat": "372247aac7b84ddf6c66e276d03321d22496e65726f55e490ee7287a90151318", + "Assets/Items/ERR_Atlas/AtlasWire.emat.meta": "ea10c7bd630b31febf511fb28a42cc73597fcc1e3010597dc074c651813ede94", + "Assets/Items/ERR_Atlas/ERR_Atlas.fbx": "03a654900103878223ab5c4a42e71d17022ca4885ced71b99c67d8c91652b5fc", + "Assets/Items/ERR_Atlas/ERR_Atlas.txo": "9838bcb2e4ff1cd649586535ca7d5ad2497e6118cdfb76b8aadabded9cafb938", + "Assets/Items/ERR_Atlas/ERR_Atlas.xob": "a4602d65e84cec1b23b6b09b5bc5847cbd52efe82925986c6eaf1c43bec1ac78", + "Assets/Items/ERR_Atlas/ERR_Atlas.xob.meta": "04f4039be7950ca393ea74469898dabcfec4dc8b8f9e08068898c00333445878", + "Assets/Items/ERR_Atlas/ERR_AtlasLeaf.fbx": "4ca13bbeafaa0dc0bf007ae9024b8d6c2a5279afc62e0ebc227e2bec2ad67a30", + "Assets/Items/ERR_Atlas/ERR_AtlasLeaf.txo": "8ed37705192d3d9b18f26b5deb51af6f2a6d694e7e2dcdbd04b317497610b50d", + "Assets/Items/ERR_Atlas/ERR_AtlasLeaf.xob": "fe6ea401412fdbb3bb46367cf7dc9215f7d01c6373c8ac954cbf23f2a6927bf7", + "Assets/Items/ERR_Atlas/ERR_AtlasLeaf.xob.meta": "492a44fc323d3df469753d4bbbc35ceb3d362e734f48083ba633b3de5dd42d8b", + "Configs/ERR/AdminMenus.conf": "5a4b405060135efd0f7faf913c7f061f6250a1e6e9d27f2bb394281d784b20e6", + "Configs/ERR/AdminMenus.conf.meta": "5faf5ddc0a51c1d0f82d60af00d91edc22fe9c39aac50d8d04b772a2c9271be1", + "Configs/ERR/Content/Registry.conf": "546a5a407c9e6c25c9157ae4392898fa3f40c04c7956649e62201f9ac0ba187c", + "Configs/ERR/Content/Registry.conf.meta": "046aa988bf8e972afcf7a60b6f2312f605f016f98625dbbd9cd75ebf9ea88800", + "Configs/ERR/EveronSites.conf": "781a9a3f4d2d4ea5b913fbfd15c2f1a991efdee7e033b7ba4241ad632609f52f", + "Configs/ERR/EveronSites.conf.meta": "d5fe68025ef4e7c1e16082cf5873b7c7172eacbfaef4ab29b7e0e3c98f8dca56", + "Configs/ERR/Factions/MissionVehicles.conf": "5f74f4a7089c7e7b54ad62463159ce8f0bab25a6b85268dc3872ea6001e048fb", + "Configs/ERR/Factions/MissionVehicles.conf.meta": "00c368b6271d3440cc8bf627b03a384d247635723923fc5ad2104b8b4007b035", + "Configs/ERR/Factions/US.conf": "4c3da063abb6e3ee39a6e4e0c5a9ffd5eae9d209d58470ea18b45dba5528db1b", + "Configs/ERR/Factions/US.conf.meta": "a05469aef028e9e17eba545e81e2af2887b59f0fef17dac51a23c7b8155e381b", + "Configs/ERR/Factions/USSR.conf": "407ea27f80a64c5184c089d43cdd0bdabfc5974c84f1d2a245081fdf2afa3f30", + "Configs/ERR/Factions/USSR.conf.meta": "057397d97096346791b51b7b13fbe18af218bcf78e9984d9c01b49a2403de611", + "Configs/ERR/GameOverScreens.conf": "1bb83c26a57d64595e91c3ba7926987e22b33dce2c6c876016e3ec2d04f9eb2a", + "Configs/ERR/GameOverScreens.conf.meta": "eb654b745c0b97b41c991694569ef4877a3c2315e0826f9556337cd68690843e", + "Configs/ERR/ObserverInput.conf": "1efd2e1823f80e6b8a3e4a697cdeb72dd87888ec5a2d16ae289937575b880072", + "Configs/ERR/ObserverInput.conf.meta": "9714dce6c38ee81bcc513c8ebef51d7af63fd15bcdda2e40946937c625dc3ba4", + "Configs/ERR/Telemetry.conf": "12d895ba4fcd159e23c2f3e94dc59e6f1e54702470cf0b1dad7d04f15572cf7a", + "Configs/ERR/Telemetry.conf.meta": "afd52b410ce1a1026f4b0900b10aae2ee50c30764a212a59668233f4f8b8c5a1", + "Configs/ERR/Tests/LegacySites.conf": "3864eb638d0ed4dd313013d2d787f975ae6ce4bbe238569919f76b73d5f7ca42", + "Configs/ERR/Tests/LegacySites.conf.meta": "097ac7daef4fc18344699a8471fdd77f9d158f8c70bab394068d7a08e4777ac0", + "Configs/ERR/VanillaFactions.conf": "db890b61b48ee15484041fd2245a862d9fa9e7ba21b1229c281ff37c448a35b1", + "Configs/ERR/VanillaFactions.conf.meta": "ac77725c0c21974991ef47a466b88122e939de8b46fd23e68889e7674cbb2bfd", + "Materials/ERRM_MapRenderTarget.emat": "4ab251037d40a850e3767c0de85136842bcd4fd130eda47bf8e19352b0d030e3", + "Materials/ERRM_MapRenderTarget.emat.meta": "5ee1a705f8011a44020ca2691f5ccc17d44bf596fef9a36e98d1f267eb58fab0", + "Missions/ERR_Everon.conf": "c6cce48484301a76b81f3a0cd76a4012f5808b901754d4114034e92beeefcff3", + "Missions/ERR_Everon.conf.meta": "0a23c98bf83873536c65fa17d38dea33a1d7b9e4ab210f90633ff688abcc551f", + "Prefabs/Characters/Core/Character_Base.et": "74a6f03a1e76173a0cfa20b23c711d02e70bac810d6743e16c60476bfe5be457", + "Prefabs/Characters/Core/Character_Base.et.meta": "c6b142d1985719236268cdf12ac522fee4b1206871a6f22b568d9198d1fcc077", + "Prefabs/ERR/AssaultParachute.et": "b556997989605e2a05982418b7e9f26d12d427eb3ea6e3bc50e85c67ea7aa4b8", + "Prefabs/ERR/AssaultParachute.et.meta": "e9dea2d533ad1ce6ce689e0e2815c97a6382e1b90c35ce1efa88a885527e8e18", + "Prefabs/ERR/CombatEpinephrine.et": "aa57d78bae861dc4a0fc509f7916190d2f2f0b36a1c3867f9bf9a071717cd7f5", + "Prefabs/ERR/CombatEpinephrine.et.meta": "0e19ebd1dd4d81f739125a4dcbff898424ffe39572c2668bd56455d939b3f604", + "Prefabs/ERR/ConvoyCrew.et": "29a525a29605386dfcf292dc2316e9fc7650ce39db9fbaa4ce4372ad0de66db4", + "Prefabs/ERR/ConvoyCrew.et.meta": "0a909a15b7dcca34202ded136b3bdbbe8898153c9589e1cce1388433d362da02", + "Prefabs/ERR/CrashArmorWreck.et": "322827292593b6e590ae3bb39aaf18f26feff40251e2399c20d47486b66cff06", + "Prefabs/ERR/CrashArmorWreck.et.meta": "684aa32a6a60fced3d92ef5836a7934159ae140e2763c75b6e5615043a68c5d1", + "Prefabs/ERR/CrashLootCrate.et": "580faa33a30dd072aa09f0f7d348940297207bff9d763609fc35665cd9327c66", + "Prefabs/ERR/CrashLootCrate.et.meta": "0830626127410849e113c9b57aae2a77b9dcfcaf88adc54154a70ccbb2340dc8", + "Prefabs/ERR/CrashLootSmoke.et": "bdb02288c808351c4624f371dc9c8d5dc254d00bd22f704eed0cce2aa7d693c2", + "Prefabs/ERR/CrashLootSmoke.et.meta": "0b964ff8460331ac3177cd4b4672a1b8b80f74cf8f66deb6ac29c70830e74e95", + "Prefabs/ERR/CrashSite.et": "8d06afe6e2db8986f06a7c5d6649e52df009f9eead7345bf2b477f50a0725b3c", + "Prefabs/ERR/CrashSite.et.meta": "0f54fe80ed96394374c1922e1d0b05f7e0200ce5b979ff58325b033f51641f69", + "Prefabs/ERR/CrashWreck.et": "f5de4785c0e3cdf02f1d5372e9b01171bd5a37acb9c36aa2a94bae3f429b2272", + "Prefabs/ERR/CrashWreck.et.meta": "bde3299bdbbddb91d2ef471b61035b6cced29899cff4cd90c080fe584ce63f26", + "Prefabs/ERR/Epinephrine.et": "e09c70b3d47a4dc5b92fd332c8222b99554b28a8a0c93cb5caac18eec4501571", + "Prefabs/ERR/Epinephrine.et.meta": "f1861f0b0ccace1b7b3d9c29768e37a83bf0c6fae5a411b1bd61d6b2eec7ed89", + "Prefabs/ERR/Extraction.et": "4d24c7811415c06386205e5bf5c132a23fcf21e96c75c7657ccd5f3ac914ac50", + "Prefabs/ERR/Extraction.et.meta": "c2a838633001e2e3a202d39cb33aa744ebcd996017ad032359069641b5d13853", + "Prefabs/ERR/FactionManager.et": "d34a8bbc5dce259c4a467c7bfa2ba746683bbeb9448de8c226856e65319f4911", + "Prefabs/ERR/FactionManager.et.meta": "9bf53d5e4bcbe60dd1a4ece1409fc23c349055c860708620f5f6e9716290a97d", + "Prefabs/ERR/FieldCover.et": "e403d5cb3a5966f0cea81f15e0e825d482ba1a7a27b12498319ba45a414963b0", + "Prefabs/ERR/FieldCover.et.meta": "83461ffa76244e1d69f20b053a9741ccdf7d127009182bd540a7e5ba6150c3d9", + "Prefabs/ERR/GameMode.et": "a2b7e632714e646a7010592cc7ac75f0afff7da6c995bf91aaf65d9473a6af3f", + "Prefabs/ERR/GameMode.et.meta": "106769cd34525c9d440057072836cb7401a6752148c40edd7fe61c03bd58328c", + "Prefabs/ERR/Items/EmergencyRepairKit.et": "0157bc235eeb78a0e1373b561fd22a1dcb225c833ff7c2d4abae688bca0ec92a", + "Prefabs/ERR/Items/EmergencyRepairKit.et.meta": "da6f065cb2414b5a4cbe9ef0f0b1295b2466f26ad406c0bddb83845d4598efb3", + "Prefabs/ERR/MortarCrew.et": "21086e886fe3199624208c9a866f883ec109f7d08746c2b56b497e59857fb656", + "Prefabs/ERR/MortarCrew.et.meta": "fdfd4fcd21a67c3d698fa4aadc4e5c76e665cebf4be86013bc389e493fab63cc", + "Prefabs/ERR/ObjectiveDocument.et": "5118ecaf9d2038eea44a4b785f05d2e78781dc1387249aa58a6782c7e6752e14", + "Prefabs/ERR/ObjectiveDocument.et.meta": "eaba9903be147b98a1106e2273e2270773df73b9b22f2cd4e20136a8e281382e", + "Prefabs/ERR/Patrol.et": "d3eca8fe9197c57a27a285cdb3baf168b037b198d92b39df28a338ae2cfd0c74", + "Prefabs/ERR/Patrol.et.meta": "7c5da568fa2fcf0709ee2959253cb068d7c7ed7c2467af3b247a7e70efd96b69", + "Prefabs/ERR/Prison.et": "c0ca5219aa2d6322ba7d094b92000640b259112ff6611a745c0713c8875d09d4", + "Prefabs/ERR/Prison.et.meta": "2e426ef3de68f4107907854b51e818bc11d84649a01c538e3f18dd9ebec766bb", + "Prefabs/ERR/PrisonBackpack.et": "ae750f08fc9af645561f59d7e5809bd22f4cec26ca8fa6409d09730765958c91", + "Prefabs/ERR/PrisonBackpack.et.meta": "7da6aa45467250edc910ad7230dc244d1b041e8a6f55881eb3747ce51f9212ba", + "Prefabs/ERR/PrisonDoor.et": "b0ff94443fe334032113a663917de23f920a8b73ffadc9c8e9f11b545022b3d2", + "Prefabs/ERR/PrisonDoor.et.meta": "b8f3db52bf186426026668fbb9d633c3cbd4d438ab301fba880398f6a0e781c2", + "Prefabs/ERR/PrisonPatrol.et": "dc88c31cf5c415573a874f74e13572f0add9e6122c8fcad507fe82860d789c47", + "Prefabs/ERR/PrisonPatrol.et.meta": "5528e0d778dce5ed39c3e504c6427625527127b23269d20fbf12ca2bffe52ffe", + "Prefabs/ERR/PrisonWall.et": "9b410b7c85bb001be4601ad93f750e17b8318b850306d84f29c4dc1b02723d7c", + "Prefabs/ERR/PrisonWall.et.meta": "0294bc5dbb56f90f8153d62459bb0a6ad91d76a479812bbec9c7db182fdb58d6", + "Prefabs/ERR/Prisoner.et": "e6d345ac98ad9ec742bf6c3b8686839c3256df9833d31bb4bdf605cd41d0ba5c", + "Prefabs/ERR/Prisoner.et.meta": "974278ba49fafeed70b619a0067bbc70ae4d534be441c812ce2bef4a5fb3c022", + "Prefabs/ERR/Radio.et": "99b1d80b49d1e7f9d30aa4283772a36fd66e962369f288f5fe329c7fc911bb1b", + "Prefabs/ERR/Radio.et.meta": "bc91137b68ba550217914fb8892bb44d7e1920e4a1086f3e506623832a44212f", + "Prefabs/ERR/RadioCamp.et": "5e6216bf8e6e160da5d9f966c8f7c2081bf6dd16dfac1b89d682a14b3b8a6716", + "Prefabs/ERR/RadioCamp.et.meta": "3cb8d3d553ab6d8d111a74f721cf4e69ee1011cbb90248b83cdc7275697276bd", + "Prefabs/ERR/ReconCrew.et": "33953379ceb725bcd0cbe505cd643c94adaed17dbbfa95dadd404d6b8e345715", + "Prefabs/ERR/ReconCrew.et.meta": "2653e8c5b1cdb857de5badd5959ddd9826a6a298ab3c166628dbb835d7104d90", + "Prefabs/ERR/ReconHelicopter.et": "c609ee59ab145e0a1936f95726b86df643f5cc425c43924029e9c1abc69ebbd0", + "Prefabs/ERR/ReconHelicopter.et.meta": "d80f1c3d6a6f9104562b89729996c1c92ad240f08cdcf48d4c390a09d2047c08", + "Prefabs/ERR/ReconPilotEast.et": "d961f329823b991eafed80d085de1bd89b44a4575be98d8dac385d6b77741ba2", + "Prefabs/ERR/ReconPilotEast.et.meta": "d73df3c896359a54514d2efcd851f579feca7a2619b76c2a38f607649a31a4f1", + "Prefabs/ERR/ReconPilotWest.et": "8f8221927269352e55c8026ee5b00e026c281c79af6684b386f24e7dc4675fb8", + "Prefabs/ERR/ReconPilotWest.et.meta": "4785f23bb492c6af420ee7896ddbfc9767e0db1e06de95207df2dc949a1b1814", + "Prefabs/ERR/RescueEscortION.et": "aa5cae65250936da239c865fe1070c68a1d20b49bcef37f6bd29021f22c274a9", + "Prefabs/ERR/RescueEscortION.et.meta": "34eef8053198a49df774792322c6d3cba81f689e56b6a418aed5a14de0913537", + "Prefabs/ERR/RescueEscortWest.et": "6f9671fb68e2716479d96be74b80ffb29fec535f1333c5e4dc4d7b684dca1ccb", + "Prefabs/ERR/RescueEscortWest.et.meta": "45a87304712d6a18afb0ddc5b3ccbb70da395541e21aafe9d6d3641c392eaab3", + "Prefabs/ERR/RescueHelicopter.et": "d9b3b01a0cdb6ed779f40f14f03dfd8fe732382931cdee02ea643f260783313c", + "Prefabs/ERR/RescueHelicopter.et.meta": "f47b4a9a72faddcb5817e396dab7c115ac05a5455e5dc8ca4c6a3e9d5fc4093c", + "Prefabs/ERR/RescueHelicopterAFRF.et": "cbd9c88b0a0c798096c78770cdef834cebfbdfd62fa12d96b56e74c5ac60dcb3", + "Prefabs/ERR/RescueHelicopterAFRF.et.meta": "5cf8cdd7f34e2bffccedfab0cc0cf266d3c8a6856215e797874c531eb2a3ebf2", + "Prefabs/ERR/RescueHelicopterFIA.et": "6aa11ddd56ebc9d0aefd06e1f55c7c61136d5c703b6eddc9cc84f3bcd8c8c26b", + "Prefabs/ERR/RescueHelicopterFIA.et.meta": "ac0b32de9818aab77ff42d244cd5165112a7764eb6d289dcfe12ec77ea0c9b3b", + "Prefabs/ERR/RescueHelicopterION.et": "a910548e7346439af90bb87e445f056aa1799572a69f87f45addbc17dc01fd85", + "Prefabs/ERR/RescueHelicopterION.et.meta": "426a478d15718c0193490d5381f732e4c559348f2e5e9c7eb9473a4ca3017add", + "Prefabs/ERR/RescueHelicopterWest.et": "dbf3827f58c27d957aac23f505a24c0af2a8f6c6555a82d0962a0ee5d47efb42", + "Prefabs/ERR/RescueHelicopterWest.et.meta": "963b5b22139a2f3496e937855854c3ffe01604b86a93f1fb63b547bc1ba29068", + "Prefabs/ERR/ScoutEast.et": "b4593aab494c4f21637757b3daff4f349da77b4c48ec5e8a4a2917a6a12cf811", + "Prefabs/ERR/ScoutEast.et.meta": "7c72af632537f687e92f30b52d97fc7d70dadd39d33f37e0b1004f9596f55012", + "Prefabs/ERR/ScoutGroup.et": "8dc0fce8ee3decc1c367411b00b6d8518df9d8458281cec0881464a2ce906af0", + "Prefabs/ERR/ScoutGroup.et.meta": "62e43fd152ce57aa4ceb2187a49e4aecdeb9f428b3a1e8318f86bb83dbf8a259", + "Prefabs/ERR/ScoutRadioPack.et": "f1c4911e2556c0e0caa8b896982190c5e7d0433e850b4610e19442caf9117607", + "Prefabs/ERR/ScoutRadioPack.et.meta": "825506e3d814d30a52d5dbf64124470641c07a0453543ba71426841e6c783635", + "Prefabs/ERR/ScoutWest.et": "2681b5a3f8621adb44195f0dbca6f3e79ef7decad8f9d0dd0e1a801ec2549627", + "Prefabs/ERR/ScoutWest.et.meta": "22a6607b4b8fe606ca75a634a0b2ac3178e7bedae7f9ff01e7a4989f3b39a3da", + "Prefabs/ERR/SpectatorCamera.et": "761d845fc1c086da58fd87c8933bf58d46d1ff5e17cca5950141743d07c8ce16", + "Prefabs/ERR/SpectatorCamera.et.meta": "2a16558f93915e31908a674509e9c89976470f78a84a1174a64b94b68b8f77ad", + "Prefabs/ERR/SupplyCache.et": "4c97b0514fe7e723046f40f0b396f6573b12eb9981ca5df70b9e8aa3cf29323e", + "Prefabs/ERR/SupplyCache.et.meta": "2f5de3a4aab1e9d0e35521f48dc57b95bd6e449c383dec4f1c258e10295904cb", + "Prefabs/ERR/SupplySite.et": "f33681281d26676fac88736091834d5a7b87fe0fa01883582542df964dcfc694", + "Prefabs/ERR/SupplySite.et.meta": "b41944b12eb3528ff7a3ac94258b18c66ef161aa6a38894aee300a1ac4798630", + "Prefabs/ERR/TerrainConnector.et": "cf9cb28f5a3f41931380864a29ac979aa1d5e843456f564ac7a7de78f88e1aa8", + "Prefabs/ERR/TerrainConnector.et.meta": "9f37c979ae282aabca29ce84beb0db851ee8b9a19f7f3a64d387c175616127f3", + "Prefabs/ERR/TerrainTakeover.et": "63e26db48c624056350f9ee123ae5b815bc2fad392060a9c26cfcd86c0af872a", + "Prefabs/ERR/TerrainTakeover.et.meta": "64e953e378ab1d2a75ee7246f876f4ef93ae8a4e3fddb5002d7ba37268cb959d", + "Prefabs/ERR/TerrainTakeoverWithChat.et": "aa857f7e8e0585839c7e9b2e3616702180779e68c6fb149d94a83c05bd52449b", + "Prefabs/ERR/TerrainTakeoverWithChat.et.meta": "a213272011050a881c87fdd94b229e002ece24f26f25db5fe53824f8a5b147a8", + "Prefabs/ERR/Vehicles/SupplyUAZ.et": "29f157849f413261494a63d4d5b0a97e8bbe61cb076efcd59d6c940653f23352", + "Prefabs/ERR/Vehicles/SupplyUAZ.et.meta": "544c94cf1c26757a10654de7856cd6cc48b821ce3bdc02add13cfe6514269915", + "Prefabs/ERR/Vehicles/SupplyUAZRearSeats.et": "cd4acdcecad299445952aea0adefc85f2b9e9b43f8186f100e0505c5621b3656", + "Prefabs/ERR/Vehicles/SupplyUAZRearSeats.et.meta": "123955da03462befb90e293b3bb856d49cc761166611b38ff47cb48ec2fbe95c", + "Prefabs/Items/Equipment/ERRM_AtlasLeaf.et": "11185bc813c00c5bda09c0afaad78849a1c81d89843e8f7f3a14c0776b8296a9", + "Prefabs/Items/Equipment/ERRM_AtlasLeaf.et.meta": "8cdfeb51c3774ed790a223ce74872cfbc4588fb6812a0e98136eb607dcc17d9d", + "Prefabs/Items/Equipment/ERRM_SharedFieldMap.et": "57dfbd215f28478a791b2e029832ddf3c363658d5dd5590cee4db9ec6a8b690a", + "Prefabs/Items/Equipment/ERRM_SharedFieldMap.et.meta": "59093e9072c50d99c86da7609c87541016da5bcf92b98d99db4c524e1c8e0e8d", + "Scripts/Game/ERR/00_Core/ERR_Actions.c": "cabb21413c90b252d29708b62228d0679c51c76e39ee0e483953ad7061b2b9d6", + "Scripts/Game/ERR/00_Core/ERR_Actors.c": "7258b838f8365e4fa575c4f2ccc8532e22a33946405ebb490120534d5ca65607", + "Scripts/Game/ERR/00_Core/ERR_AdminMenu.c": "c03797486f5b514987837393ce8559fb2da4cd9d53948a6c2dbb281c0d8c249b", + "Scripts/Game/ERR/00_Core/ERR_AdminMenuFields.c": "59c8ce209f0318b840bee648d572ff217d82eb8a9c1cdf66b00d23ad51788a88", + "Scripts/Game/ERR/00_Core/ERR_AdminMenuPages.c": "85f655f16e9a452577684fafe27487e8ad2c0d00e92ec39601a8137ee8f683d3", + "Scripts/Game/ERR/00_Core/ERR_AdminMenuView.c": "6c34557350659782bc1a098169dbbabf1f71502c35cdf711b83ce0efad907142", + "Scripts/Game/ERR/00_Core/ERR_AdminPlayerTools.c": "56780d78bf423f54f482d8620f821b8d3eb0199194482b4f12e37f5ec3f55ef5", + "Scripts/Game/ERR/00_Core/ERR_AdminProvider.c": "62e05aceb49da07fed7aa89fb6b2f8eb3efc373ac09eff286fba983c3ad570eb", + "Scripts/Game/ERR/00_Core/ERR_AdminService.c": "2e91c4bce43998be55c306d5a2571851122d07f8cedd56de2d0541936024a4f9", + "Scripts/Game/ERR/00_Core/ERR_AdminSession.c": "baf4bf029a00d5196e33577357ab7a5b831d85ea72256d1916884e8a155316cd", + "Scripts/Game/ERR/00_Core/ERR_AirfieldPlacement.c": "0601d8da570e1f63e43ea7df451d0e997872e4e163669fd8ad37bedd59de7b9b", + "Scripts/Game/ERR/00_Core/ERR_BakedSpeech.c": "d11fff16f86fd3447126701af84c3800860d721263b3c2c16d3b91d686d8b2fc", + "Scripts/Game/ERR/00_Core/ERR_BuryBodyAction.c": "adbf4cee5b5f5317b185f17738205f28b701a15364e643cc9fb443866a121109", + "Scripts/Game/ERR/00_Core/ERR_CasualtyGroundSupport.c": "8010394e7731d3bc2ce436cf795a37819e16d4d605e8d152027cf391e811d37c", + "Scripts/Game/ERR/00_Core/ERR_CasualtyLoadingFeedback.c": "ac554a946cd14f73a5bf79005b8a3f770c9caaf0a6ea409134077b8d96f9433f", + "Scripts/Game/ERR/00_Core/ERR_CasualtyLoadingGameMode.c": "1e670937736330716a467157d0f45bace512047d7e87d8678f4ae0ee123969c3", + "Scripts/Game/ERR/00_Core/ERR_CasualtyLoadingOwner.c": "3f430930c2598951b75cba157a57967189686ca7a86aff8ecedd20f181262bbb", + "Scripts/Game/ERR/00_Core/ERR_CasualtyLoadingService.c": "6efcfb4bb1bdf0da84400eef28a24f6c61e7f446073af2c9667b6f26f0bc47b5", + "Scripts/Game/ERR/00_Core/ERR_ChatClient.c": "4bf937ff74e0483c17fa0103f73bfee3afd8f67a37c0c248b08772a17bfcc349", + "Scripts/Game/ERR/00_Core/ERR_CommunityStatistics.c": "84f2615fac1375bbe3738edd13a413ef1d524dea5ce0195b05b3a957aae84435", + "Scripts/Game/ERR/00_Core/ERR_ContentDefinition.c": "bc1dd4ed27ec894cf4bd617fb226cb8140b544aaa9ef6d8654e815d81e7f6fd0", + "Scripts/Game/ERR/00_Core/ERR_ContentMenu.c": "d9df3b2dd8fca119ecee466dc71d336b5a70ee7d5fced368cf34e250d22075de", + "Scripts/Game/ERR/00_Core/ERR_ContentPolicy.c": "3a4987345d5a7159234a7e1a08bf5ac40dd5a23031e9b1953fc43a0501d9924b", + "Scripts/Game/ERR/00_Core/ERR_ContentSettings.c": "3e2734dfb935a4e93d79b66ca4a7c883723a1fc348e3595432dbf2bfca643923", + "Scripts/Game/ERR/00_Core/ERR_CrashLoot.c": "c9fe89d9ba9fdba4c99a2fa238b2c0b1195b42caba439c4bff3ee1d7b2edf1b2", + "Scripts/Game/ERR/00_Core/ERR_CrashSiteResources.c": "832aebf6e754dba54ba28b8f480180d32ced968a2d2f192424c4007a862c2b43", + "Scripts/Game/ERR/00_Core/ERR_CrashSites.c": "5496a4ce8cc67bb05c8615b16fc426828ef8144b099f531bee5e97940d2f2547", + "Scripts/Game/ERR/00_Core/ERR_DebugAI.c": "bc5529c60591a6c36c39cdb753b1af948690fc3c3c725f38a8d595b41a499235", + "Scripts/Game/ERR/00_Core/ERR_DebugIntel.c": "a9f6e7e42a3214879a21052e897f9afc0653c12ff15d5bee7766e26a1af6ab17", + "Scripts/Game/ERR/00_Core/ERR_DiscoveryMap.c": "8a8653b322c948c462002077272dae79e2f45a24e883767b3ad9c1f24caad237", + "Scripts/Game/ERR/00_Core/ERR_DiscoveryService.c": "552d9e40f72a135f19d25a17fbecf475b8bba8d8b62ec6b6d055c65499a0b637", + "Scripts/Game/ERR/00_Core/ERR_DocumentComponent.c": "885c8ab4fc9e64c3f8b40056536096c8c32b011cb340b25ca00353a96da15c69", + "Scripts/Game/ERR/00_Core/ERR_EnvironmentService.c": "c0fae5bf51ccf507bc84d44adc2d1dff021cd83653c0468b7645a4f343e3fc8d", + "Scripts/Game/ERR/00_Core/ERR_Epinephrine.c": "14a75e040f510773313c7e70b57f338821bc1ded650bc65133968dcad6e49c7c", + "Scripts/Game/ERR/00_Core/ERR_EscapeGameOverScreenInfo.c": "4746b0715c6e9a527038b47d54d2ff305becea219da6b736f6998d81901143c9", + "Scripts/Game/ERR/00_Core/ERR_ExtractionPlacement.c": "6d388fe21f08b25cbdb5dfa4e198d94a4c80c5092f8d17630a4654e18bf8b3f5", + "Scripts/Game/ERR/00_Core/ERR_ExtractionRadio.c": "ad7fd91d8bb96f05f3be04a03fd00c20ab9413adb12d649d3020c6f7994319e1", + "Scripts/Game/ERR/00_Core/ERR_ExtractionService.c": "c48e79a117990f83839704ae221af05fc7995b956af2d4b4f9ed2a6b91ec335a", + "Scripts/Game/ERR/00_Core/ERR_FactionCatalog.c": "a5a8c53acf21259e14f59cb919535910f30dabff5a9179c664bc6a7a4d744d6e", + "Scripts/Game/ERR/00_Core/ERR_FactionMenu.c": "1deab4c396c307fc17dbaa8731b2943ffb73c37dc0121a5cba5c239c34901ba3", + "Scripts/Game/ERR/00_Core/ERR_FactionSelection.c": "04b8bd8a042cf743ab8a87ec3711f9758e7b0112995a9d363e81a63df4eabe5e", + "Scripts/Game/ERR/00_Core/ERR_ForceLedger.c": "0ecaf1c5a52568e751678b0b1236e91e6adb538f8fbf010d38b61a312d1bf253", + "Scripts/Game/ERR/00_Core/ERR_ForceSimulation.c": "2bbb8888c752a3ffc042f3059937526d25ae288af5b4db024cc683025a2605ce", + "Scripts/Game/ERR/00_Core/ERR_GameMode.c": "76e013c51ac1d808816ff9ab64159c15d16459771027584a67bb45c93bd67fa2", + "Scripts/Game/ERR/00_Core/ERR_GeneratedSites.c": "4943f761d0274e163a1da325ac4f750de9180947b05b79ee173e12141bfd6661", + "Scripts/Game/ERR/00_Core/ERR_InitialGuardRules.c": "8c9d6b1dc4c2af96284e34f487eebb5a221091016ef108006dec60b4e3836558", + "Scripts/Game/ERR/00_Core/ERR_Inventory.c": "b63e679d5b650b63a7a91dfc3f42a62f4be58b0338f6df3313e66d29a93bebf6", + "Scripts/Game/ERR/00_Core/ERR_InventoryHitZoneCompat.c": "23c34f901311dce63a79aafe83c11e2fc25bd3fddb0cde38bd313eb90878ca90", + "Scripts/Game/ERR/00_Core/ERR_InventoryLayout.c": "1af5df45a0f06d19a017954e9bf4b2d722e2d2389f8ffdeb1d024435b9a08be8", + "Scripts/Game/ERR/00_Core/ERR_ItemPreferences.c": "c85abae8d27379928b22f24415263b7f21ec7647f96944159baf98018137b3ed", + "Scripts/Game/ERR/00_Core/ERR_ItemStationLifecycle.c": "0feee55cc5ddf13e00fe73ae3926ec2cadd5ba861d793a939164287ccbe1861d", + "Scripts/Game/ERR/00_Core/ERR_ItemStationTeardown.c": "102e61216e86e47ad243cc19f6f66da1fcd8cc77f8799354ceaeb4a6dc74622e", + "Scripts/Game/ERR/00_Core/ERR_JournalText.c": "1ad00a77cb0be741c7b6ef5dad2d8a8c1ff1fcca3b093df2e132ead0b69f74e1", + "Scripts/Game/ERR/00_Core/ERR_LoadCasualtyAction.c": "1521af55a34110ce1c971b5226a618a9c6d931622abaae4946d9c0d27c05a273", + "Scripts/Game/ERR/00_Core/ERR_LocalAdmission.c": "a076922d1ae966cf5cc67b198166ca6b1288358fb7f641207a4681e6a610a2ae", + "Scripts/Game/ERR/00_Core/ERR_Location.c": "6323facd2d5b32382b466a2aa0140064632a8c1de0597e0738cb09a3fcfd7abb", + "Scripts/Game/ERR/00_Core/ERR_MenuTheme.c": "90d9babfec7978b3d7f5baffedbbe5c1b54a9742f576f51e6232043e32d1cc9a", + "Scripts/Game/ERR/00_Core/ERR_MissionRules.c": "17d1f48878b02a457eebbe5ff87c4267488d68d2a9b3121dda77a8bc8e69c8c6", + "Scripts/Game/ERR/00_Core/ERR_NativeAdminMenuProbe.c": "2deded62be82adcf9866dacf8065f0c6a9a643bdd60a1c3e87990e1c70254c48", + "Scripts/Game/ERR/00_Core/ERR_NativeAdminSettingsProbe.c": "73e58561e08e50008d33f81eed606dd4e8109fb69a627e892d28ca468d641f7d", + "Scripts/Game/ERR/00_Core/ERR_NativeAggressionProbe.c": "dcda8528a64d35e6aa2f030b59503a49ea8a85ffcc33beaecdf8da00c003b50e", + "Scripts/Game/ERR/00_Core/ERR_NativeAirfieldMarkersProbe.c": "980025c07d042c2f109e2c99ccee0316b596806ba2c4fcd9446b6ad7580d1d1f", + "Scripts/Game/ERR/00_Core/ERR_NativeBaseSmoke.c": "f7697361c6a056a62aff86de7f7d69e9ccf47b92121dcb96ed012ad136e47e30", + "Scripts/Game/ERR/00_Core/ERR_NativeCasualtyGroundProbe.c": "41f40db3735f8aa535c0061458d9892dcfe972222b8a17238e67b65633c46bc3", + "Scripts/Game/ERR/00_Core/ERR_NativeCasualtyLoadProbe.c": "94c533deea654ec546df3f1ebb7cd213e6cd79b1125d99bab5303ef8e87b018b", + "Scripts/Game/ERR/00_Core/ERR_NativeCasualtyRemoveProbe.c": "4cfc06f6d43b709b63caae714155ffc562502e884f49a9825623c6f46972ad36", + "Scripts/Game/ERR/00_Core/ERR_NativeCasualtyServiceProbe.c": "02a9d70d1f4ba20326df199ba41489cfbae12b7bb0aab441361421cee38ad9ea", + "Scripts/Game/ERR/00_Core/ERR_NativeContentProbe.c": "cb0ccfe1e1575f9ed80a8054058b471f3543378db059e6af2fed8eb42a262638", + "Scripts/Game/ERR/00_Core/ERR_NativeContractsProbe.c": "60aa767d9455f2f4958a6a47bd68bbd8ab0466adc8f1dd9ae433c40ae96c68ff", + "Scripts/Game/ERR/00_Core/ERR_NativeCoordinatedAIProbe.c": "9104a7a5154bf34906f135f00c5793229e343da6a1ed19dd572e3c1d9821d393", + "Scripts/Game/ERR/00_Core/ERR_NativeDefinitionProbe.c": "904d8d4c3e7b91d49dadfe495fc7b4f02f300e4aaf7efa348df5ca17ec4a6e8a", + "Scripts/Game/ERR/00_Core/ERR_NativeDiscoveryMapProbe.c": "9ed32d391d08d937ff4f9f33bd11c3a204ce9a2230c2d72b6761e0320b31f24f", + "Scripts/Game/ERR/00_Core/ERR_NativeEndProbe.c": "2dec80c7e247ec5c257407f95d9d5edd42fe0cc44d6af9f724f6ebd10d8a355f", + "Scripts/Game/ERR/00_Core/ERR_NativeEnemyLoadoutProbe.c": "0885ca69f6fa7f53414ce1792cfc3c49916886b8173783c634135c13c5d37429", + "Scripts/Game/ERR/00_Core/ERR_NativeEnvironmentProbe.c": "9e2e66ac5d9778a1c65445348e3300cbb90b68b3f669f3ddf1d2b78a858430eb", + "Scripts/Game/ERR/00_Core/ERR_NativeEnvironmentRestartProbe.c": "7a836a206381b8e8de24c92baf141beb30575723675dd6948d738169ed26b507", + "Scripts/Game/ERR/00_Core/ERR_NativeExtractionProbe.c": "4b09385f73206de004f4f3c38a6192fd658a0d2012482dc5a84dff1599ceb972", + "Scripts/Game/ERR/00_Core/ERR_NativeFactionCatalogProbe.c": "e3011fa47b67122d7b2c23af8f91b7a217599d6cc114c4f9de628744b9c948d3", + "Scripts/Game/ERR/00_Core/ERR_NativeFactionSelectionProbe.c": "946879d822e7be2d48e03a3140aa1aad3e3d44dd18507fa3cdedb4c6d7dd81b9", + "Scripts/Game/ERR/00_Core/ERR_NativeFlightFootprint.c": "a8862a04ac784426f431e2e9cd3f1f19f820b38a081674d29549b8b00277c72d", + "Scripts/Game/ERR/00_Core/ERR_NativeFlightInputDiagnostics.c": "e231dcbdaefe81beb3bd587cb73be8fb3d3184bc86d18dbaa30a43ca4ba5dcc4", + "Scripts/Game/ERR/00_Core/ERR_NativeGeneratedSitesProbe.c": "a3202ee4658e98539122926755caf689a693a79642e8c88d3146c247dd961138", + "Scripts/Game/ERR/00_Core/ERR_NativeGuardCancelProbe.c": "bfa1c65cb039e19c3d1891e4a3fd33469e974c97cc7f42128efc31a8f587d514", + "Scripts/Game/ERR/00_Core/ERR_NativeInfantryCombatProbe.c": "3e4c4382ab91f470357268927b954fd101685df6b2244df483f0422d6c0d7da2", + "Scripts/Game/ERR/00_Core/ERR_NativeInventoryHitZoneProbe.c": "604eacdc66cd52bc8a0115862ee7884a8b0f83bdb50609397de671eacd476543", + "Scripts/Game/ERR/00_Core/ERR_NativeItemStationTeardownProbe.c": "028588a49fa9207087cd27ec9396979cd932daa071e2490bd0262cd71dae30d9", + "Scripts/Game/ERR/00_Core/ERR_NativeLifecycleProbe.c": "b613a5dbe81c2032fd02d31070ae5631166d14d0b02cdbec3b63b782f0bbc115", + "Scripts/Game/ERR/00_Core/ERR_NativeLocalAdmissionProbe.c": "29c860ca3e51cdaa463f3c23a98ff45ee0499ce9bbc322046e0efbed587f1e09", + "Scripts/Game/ERR/00_Core/ERR_NativeMedicalCombatProbe.c": "59c5b04dd32370f8cf5c62fe6931d64209825522127a068b1957e9d1556274e1", + "Scripts/Game/ERR/00_Core/ERR_NativeMedicalProbe.c": "4b73e7cf35e9c8fddb089678a320ea58272e1b6611318d0a762754c171eff785", + "Scripts/Game/ERR/00_Core/ERR_NativeObjectiveLossProbe.c": "6b80fd317a8c6e8583bd4337870838a86251e3b8a681d0aa07e8b52e22abfc48", + "Scripts/Game/ERR/00_Core/ERR_NativeObjectiveMapProbe.c": "37e66177ee0f16fc33d3d18321211206bc4f095fccbd17b177d4b8cc1ba4e057", + "Scripts/Game/ERR/00_Core/ERR_NativeObjectiveProbe.c": "71fbd2479a70048f83d8b262ad1452f427be2c0afc8b071ef13bff477b9dc29b", + "Scripts/Game/ERR/00_Core/ERR_NativeOpeningToolsProbe.c": "0c5d6b96ed5a7cb1cf0d098d534dc7190449ed09339062e6b584729d53a61b4c", + "Scripts/Game/ERR/00_Core/ERR_NativeOptionalSiteProbe.c": "59d86432c19fd85da30a63087cf1f15375c8ee30178ed7e2765c1bda4cc4d035", + "Scripts/Game/ERR/00_Core/ERR_NativePatrolProbe.c": "5a2af71cc4cfccc7dd7c23584398a38290eba1a8894cd46f6967252ff3a7087c", + "Scripts/Game/ERR/00_Core/ERR_NativePoweredFlightProbe.c": "7ae5d6f85bbbebec214c66bfdf6f53b93c802f109fcd5bcfbad82c5d61d6cb9f", + "Scripts/Game/ERR/00_Core/ERR_NativePreparationStatusProbe.c": "456f4d7c3272b89d5f4c6713617baa5596d846994152356fee9a659839bcd8b5", + "Scripts/Game/ERR/00_Core/ERR_NativePrisonBreachProbe.c": "4889e0d3799a6a21b9f84bcb2f2ae78dce16269cccd1329f8d1fcc1a23e7c22c", + "Scripts/Game/ERR/00_Core/ERR_NativePrisonerProbe.c": "e2d1ffe5d269add55124601ff0d1dc032a398c7d51010736e6f0e4cbeb38ae86", + "Scripts/Game/ERR/00_Core/ERR_NativeProgressionIdentityProbe.c": "1d3fe20bce761a1082964bca9bad9ce79d1fa8b04db9b5053bae98da380ae560", + "Scripts/Game/ERR/00_Core/ERR_NativeRadioCampProbe.c": "67f1a088f9b20e5f0f11ed3aa083ffa772bffd7c74d85b7a307344ac3d47e09a", + "Scripts/Game/ERR/00_Core/ERR_NativeRadioDefenceProbe.c": "ff1e27a0ce75b123a86e7df31354831880ca62ea90b6c5d7c60d3ba168e1fff0", + "Scripts/Game/ERR/00_Core/ERR_NativeRadioInteractionProbe.c": "7b27552d233813894f65c08eb9f04b547c4ca9ff96a2370a763cb94bd4a555c3", + "Scripts/Game/ERR/00_Core/ERR_NativeRecoveryProbe.c": "d6691f22432b3ce37d07d448aeb3ce7feb5cd09e852e0167b5e4676afd24bb21", + "Scripts/Game/ERR/00_Core/ERR_NativeRescueProbe.c": "78f4dc11a179a5b924c0ec1939f0fc1e61d4e6f6647729c48a9f126ee32d1714", + "Scripts/Game/ERR/00_Core/ERR_NativeResultProbe.c": "c9a89cae067f221b9f33965b4d3ab311b78ba79ea383ca65032c4001df44b472", + "Scripts/Game/ERR/00_Core/ERR_NativeRoadblocksProbe.c": "c67d8992e9fa6bb986c4ea0fef2e30e9a532b497d737f7d94e2465ef86e905e4", + "Scripts/Game/ERR/00_Core/ERR_NativeSarkaProbe.c": "511816c4b86c9f1392bc4a1d83ad11e082280bec16356d8ab24ac1f2094bba93", + "Scripts/Game/ERR/00_Core/ERR_NativeSiteGarrisonsProbe.c": "1a5ff8747d7501862085b5e9162043fee3b05e82c73c516ad8093aaada53dc60", + "Scripts/Game/ERR/00_Core/ERR_NativeSiteSurvey.c": "ac0203753ade0cdff6d483132797a80e4520f14546c3f9dea288281cd4cd9c4f", + "Scripts/Game/ERR/00_Core/ERR_NativeSpeechDownloadProbe.c": "5377da12cabd58b9105851a2348d7496316db371bfc4346a5fb3f84f245ec013", + "Scripts/Game/ERR/00_Core/ERR_NativeStationTeardownDiagnostic.c": "172248540932174341882861bb78a9720a6cf89981fcdf9dffe63f7fd4023f2c", + "Scripts/Game/ERR/00_Core/ERR_NativeTimeProbe.c": "4a2c6ffd947334a0a71eac083d10c853c524b00042e9ea0987497c4cee60c3d5", + "Scripts/Game/ERR/00_Core/ERR_NativeTransportProbe.c": "7a3fe04aa1c5ed1061ff63d9d5180e8b925932b62d76c1ffb49bd3dc23530993", + "Scripts/Game/ERR/00_Core/ERR_NativeTransportSurvey.c": "e5abdb69c0675a20f4287afb24b9e3c877e91b162c77c32d81ef61e2a8b72577", + "Scripts/Game/ERR/00_Core/ERR_NativeVehicleSecurityProbe.c": "59bce863142e4fba4b6fb2f544bb8a58061f0e99b1a38e5ac291cea919563763", + "Scripts/Game/ERR/00_Core/ERR_ObjectiveDetails.c": "628ebd166dcb5544c2d18dce489619984887ee18296cf2446fc6d894f89dd5bf", + "Scripts/Game/ERR/00_Core/ERR_ObjectiveMapPresentation.c": "70339c05c550b72a4fd5890a871c5d8e6a9e574813d61696194c5fbb1475ac8f", + "Scripts/Game/ERR/00_Core/ERR_ObjectiveText.c": "d2fd3670c89d679fcb1359ebccf67b58734fe5168e31fc239bdeffa7f8ff0607", + "Scripts/Game/ERR/00_Core/ERR_Objectives.c": "b9cd5bb3b193c20401175c4328405be1b121e8a60b7b5999910b6a71f834af8a", + "Scripts/Game/ERR/00_Core/ERR_Observer.c": "7c478eff3575eb1bd8a85c08955d4ca7f63b57969cd7b2b76dfd6c42136de1af", + "Scripts/Game/ERR/00_Core/ERR_ObserverPlayerView.c": "c287a1891451dce0836c6e859eb962c154aad9621a46e50400f44fb83f97d95e", + "Scripts/Game/ERR/00_Core/ERR_ObserverScope.c": "97d29535a0ca1571ceb86996f58b68e5ba0944edfe30370455c52a321772f85e", + "Scripts/Game/ERR/00_Core/ERR_ObserverTargets.c": "1dfd50307b5d74075b90b5f2f70bae2c9488fc12df03d82eb19350a724f910f6", + "Scripts/Game/ERR/00_Core/ERR_OrdinaryGateObserver.c": "1e376ca83c0005cf532539e14d7f47363c47b7c5b03fe3d55405a59208705fd7", + "Scripts/Game/ERR/00_Core/ERR_OrdinaryInputObserver.c": "808a46cc1e4b31b65dbbbcdd55493f594ebb3974bbec38b4a2402334c653c0ef", + "Scripts/Game/ERR/00_Core/ERR_OrdinaryLookObserver.c": "d5a1b636938d65e9d11c78b31487f2924400c34d98e2ec812954a2a224da7dc0", + "Scripts/Game/ERR/00_Core/ERR_OrdinaryScenarioLaunch.c": "8d8da4c1222dcc6adfee350490f4399b4129cfce7a42b45fd7fba52febfd3eda", + "Scripts/Game/ERR/00_Core/ERR_PassengerHandbrake.c": "3078487e077aaed1567894f6df12386aae440b790b6c134118d3afc2c4da156d", + "Scripts/Game/ERR/00_Core/ERR_Performance.c": "037ffa482e3765bb537629e34f10919d85d4b6bfb0abf56ccc7c0d44fce8872f", + "Scripts/Game/ERR/00_Core/ERR_PlayerAdminCommands.c": "eca9baa3b07da48a740851583540840f8bf5f65f7be854902a3778f76967faad", + "Scripts/Game/ERR/00_Core/ERR_PlayerEscapeResult.c": "3124ab4d2d6d471409a47aba0af528790734df53243c03fe0cdac3e407047c14", + "Scripts/Game/ERR/00_Core/ERR_PlayerGuide.c": "dc52f551a1d3705fceb64ea18d882009d9e9548c01f08ae1c7ef3083b19ab2d3", + "Scripts/Game/ERR/00_Core/ERR_PlayerMedical.c": "270454d50235bc28df9bba4fde2689934578874c4eca9560afb9f0f6324d7215", + "Scripts/Game/ERR/00_Core/ERR_PlayerReconnect.c": "478fd041e8a13132df25202088f42d0810d36680060dd7a0424d8f40a5b1ca44", + "Scripts/Game/ERR/00_Core/ERR_PlayerRoster.c": "dc785a8a1d78a285fe55ce76f87b78a9f522eeb9f7d9655dfe9b5c4348a26a18", + "Scripts/Game/ERR/00_Core/ERR_PreparationFailureMenu.c": "5c31219740bbc26cb903a91f4fe22866c465b38220391093c72a3b094ca30f34", + "Scripts/Game/ERR/00_Core/ERR_PreparationStatus.c": "c5cc9125986e2285282f3f7fa9068ca72f00d7e26465d00213e734039c0e34e4", + "Scripts/Game/ERR/00_Core/ERR_PrisonAI.c": "67f8b444824634fc37fc253c60fd24b56d06d971f48e56a8d53095c97aaf0070", + "Scripts/Game/ERR/00_Core/ERR_PrisonEscapeService.c": "ed180448cb516bc4ec521aedd366810a47787628c7f5ee9c9afdbd185d980751", + "Scripts/Game/ERR/00_Core/ERR_PrisonPatrol.c": "284618391ee2da84dbcda4a99ca3c072eae3d67b8a9ef40a86827b9ea00810f9", + "Scripts/Game/ERR/00_Core/ERR_ProfileConfig.c": "b5aca526a860ed9ed609dc3fad99ebb34d2f6fbd537575a167390472efd4ba89", + "Scripts/Game/ERR/00_Core/ERR_RadioDefenceService.c": "f5f0bf1352141f933d0edb5630e30541e001dc07e1d2c8529b29cc159c126b13", + "Scripts/Game/ERR/00_Core/ERR_RadioFeedback.c": "545262e65e9b3645d9e514a0521e442fe08f0c2e4e7c83ba638c5105d09818db", + "Scripts/Game/ERR/00_Core/ERR_ReaperRHSCompat.c": "bcdf98c05ac6cdf0c7eaa854531b02e9ee4f53fbb346ae01d58114e572e7dd4f", + "Scripts/Game/ERR/00_Core/ERR_RecoveryForecast.c": "0eda507fb58860c0eac1d957319d1e80e9576a870d22931c86081db748df44b6", + "Scripts/Game/ERR/00_Core/ERR_RecoveryService.c": "182037828b74938746022ebe03bbd9cf849d52e31067c0b33f392f03969d6162", + "Scripts/Game/ERR/00_Core/ERR_RescueLanding.c": "e6f63ee8860335de1125e0a62eae3b8406faf5a5ad2c8d9c6f9a6da077986e56", + "Scripts/Game/ERR/00_Core/ERR_Resources.c": "d0169aac6fd0c38928c47a9002ded0fd8ba558ea3314a600e792d307ac1ca3ee", + "Scripts/Game/ERR/00_Core/ERR_RoundStatistics.c": "60e6839cc50fa02df1795a00b93fd431160f9201bdbb6f1e3b9b50271306e9fb", + "Scripts/Game/ERR/00_Core/ERR_RoundStatisticsLifecycle.c": "b813a9ccea9a61c9c6d7d4806cf18adfb323d483622ca1225930207ca2436d12", + "Scripts/Game/ERR/00_Core/ERR_ScenarioComponent.c": "ca6b20d5c4599e31957e5cb464d21bb3a4bac517dd539711f9d4f380e48a0e15", + "Scripts/Game/ERR/00_Core/ERR_SelectionStyle.c": "b9ea5158e51559dc13812cdfa8939ac36b58c79b9e4115c72465d869fdf264a8", + "Scripts/Game/ERR/00_Core/ERR_SelfEpinephrine.c": "da5850374b51e89016c4557d06f3c7c087b6e6e36fa9734b22c7c6c50d757914", + "Scripts/Game/ERR/00_Core/ERR_ServerItemCatalog.c": "047d8c4c36bfa32e1afed13f8199f01681ebd362c72d87da8868cb6959661973", + "Scripts/Game/ERR/00_Core/ERR_ServerItemsMenu.c": "b81283ec17fdd9f72096901f8bc2a3c87fb8fa4c8fd488579ba0817328b9dafd", + "Scripts/Game/ERR/00_Core/ERR_ServerItemsWeightsMenu.c": "f0900e42100c9a58402cfdd48b7f27689144f53e03d3ae3dcd4bbebc13a5f61f", + "Scripts/Game/ERR/00_Core/ERR_ServerVehicleCatalog.c": "de2774b1b0ce6cd8673bb07e9bd5ee49514a6cd7a232e229e70fe490ae842b69", + "Scripts/Game/ERR/00_Core/ERR_ServerVehiclesMenu.c": "d50e18353ac91f2b100d2be7cc05edf0ab6cd75a0a01d921dfc294fce057278a", + "Scripts/Game/ERR/00_Core/ERR_Settings.c": "47148bd41bd7bce7a55d8d5e0fae2a4a0f4c04c2d8dcff68103bc9eb4f1c2b3e", + "Scripts/Game/ERR/00_Core/ERR_SiteDefinition.c": "d421d70b32bd2b55cd8e4966c04af3d5bc381ac811d3b4b2efa4bc0a8af8bd2c", + "Scripts/Game/ERR/00_Core/ERR_SiteDiscoveryRules.c": "dcbce3b7aee89bfc47a50e9de89209758af1f1bb462b99af67a8ad7a26e9f229", + "Scripts/Game/ERR/00_Core/ERR_SiteService.c": "2b283ad19b046fd6b33245d466b197bd05b4c472e128a747e6b1e725f4a34c2a", + "Scripts/Game/ERR/00_Core/ERR_SiteSquads.c": "183883783a4e8399cf62851a4cc65a5d091d25131bc53b4323cf17286315b2e0", + "Scripts/Game/ERR/00_Core/ERR_SpawnClientScene.c": "b56f99a91cdc53bdb93d320d10839339022d7e61e6b101eee8296271abd7d3cb", + "Scripts/Game/ERR/00_Core/ERR_SpawnFinalization.c": "6ec741f8d19ee316d3c67b0dd2216698584bf2cde3634a3d6a7c3cdc3a3935b8", + "Scripts/Game/ERR/00_Core/ERR_SpawnLogic.c": "6d9243f66b4ca8c53d53fedff9dea8986c815e90c1f97de58200cd759aa8b49f", + "Scripts/Game/ERR/00_Core/ERR_SpawnPlacement.c": "fc5b61f1877aeaee75fbfd6aed3cd0b4c5277ae8543bc38a0c09836353d54b27", + "Scripts/Game/ERR/00_Core/ERR_SpawnSceneInventory.c": "76b79d5bd9d1f367e1ed19724302b7d49f8b0ede85cf19e89c452582ef651f8f", + "Scripts/Game/ERR/00_Core/ERR_SpawnSceneLease.c": "20de7f96bacc9037580d88d4424664b4554b2c082d82e7d29913e9dfe390b594", + "Scripts/Game/ERR/00_Core/ERR_SpeechMenu.c": "33f9ef80b4d6cdbf3646eab602d15ae0d05884bb20b3a7222b0648752339cda5", + "Scripts/Game/ERR/00_Core/ERR_SpeechService.c": "74ea305ac0c9a9d145646a5c73cba58e4920ab472943ae73b3dbd71d8216f752", + "Scripts/Game/ERR/00_Core/ERR_StartBackpack.c": "4a36799d3a3defd674822974cd96647c0accb2a854631dd5488c35e2ef697f7c", + "Scripts/Game/ERR/00_Core/ERR_StartBackpackMenu.c": "07c90db1a84893759dae71f40b7ae3109827646e48fade542190d21598ac271e", + "Scripts/Game/ERR/00_Core/ERR_StartRules.c": "ab7c21ef700343cbe769d8d51d91f167db37285b466d6af9873e121b3adf4ade", + "Scripts/Game/ERR/00_Core/ERR_StartSetup.c": "58a6b617b22910d0ce9255f82091dc11cd1284417a66adf1cdaa7b661c1ed01c", + "Scripts/Game/ERR/00_Core/ERR_Supplies.c": "752e8a56b0b8cde33cf532032cb0a203553017b686faac2e19bee06f7a9c0713", + "Scripts/Game/ERR/00_Core/ERR_Telemetry.c": "4cac5cf48957399bc0564692bb89e7fb9fb1f9641824088d61f6e87a67947a7d", + "Scripts/Game/ERR/00_Core/ERR_TelemetryCredentials.c": "9835caf69d4615d6a3fc840d9dc3cb0f507a0c5a2a6490893c21761f9cb4a216", + "Scripts/Game/ERR/00_Core/ERR_TelemetryLifecycle.c": "15d2d90d4457339dacd61c1bb23b619243b8af10731687c35ecc300125a642f5", + "Scripts/Game/ERR/00_Core/ERR_TelemetryServerName.c": "7744762c4586e2543601fb0899847bed311c439cfda3dcaba825adf870628693", + "Scripts/Game/ERR/00_Core/ERR_TerrainCatalog.c": "ba2e68543a8c929492d06f8725a743d26849a630d6f8c09be0f23894f92d0990", + "Scripts/Game/ERR/00_Core/ERR_TerrainControllerInit.c": "8071e38812ac61f9b480d9e91f9ebc7712b360d431f5555da83027db6cdf2471", + "Scripts/Game/ERR/00_Core/ERR_TerrainMenu.c": "1da542ef60ff7c1897b1f12432c636ef6a08cc710bac520ef186589d506e9a54", + "Scripts/Game/ERR/00_Core/ERR_TerrainPreference.c": "93fc55f2c33e95adbcf2bead3430aa14bdb55154315760bcc9647f89dc8286ff", + "Scripts/Game/ERR/00_Core/ERR_TerrainSelection.c": "ee75cac068b99e7403f5eaabe556152513cf5d973602cc6e6b8967d25402f6ad", + "Scripts/Game/ERR/00_Core/ERR_TerrainSites.c": "4ac347d4d91951bcc7175a965ccea25f3782edb6e352354cce506d6b626e5ac0", + "Scripts/Game/ERR/00_Core/ERR_TerrainSupportStations.c": "c4fe4265963ec88e24379c143edae251452c84e43a3102f5da120205f9a39c9d", + "Scripts/Game/ERR/00_Core/ERR_TerrainTakeover.c": "ac31af5ff2937f8a1fd89ac03732a8a473b27b09c83a07923f17986b0f9db841", + "Scripts/Game/ERR/00_Core/ERR_TerrainTakeoverClient.c": "70f192d5d749b4211c5604575d2b9d7e39deca589b5841ffdd03f99baeca1280", + "Scripts/Game/ERR/00_Core/ERR_TerrainTakeoverManagers.c": "ab1d64c8073e4daebf14f4ad2c745d874032675ebcac3fdb0fdae4626acb8dbf", + "Scripts/Game/ERR/00_Core/ERR_TerrainTakeoverPresentation.c": "91d450215eb6ed2da74446b5fbb805356e3881e3cb43e37fe45308e30b22be9c", + "Scripts/Game/ERR/00_Core/ERR_TerrainTakeoverSettings.c": "da22775930b13e41d4a71409e37af3bb99e4cc1d94bdea0e3b59fbdcd4d40132", + "Scripts/Game/ERR/00_Core/ERR_TimeService.c": "63867760876d523a1794f619118a52c5cd387d5d92756cd286b2c16a348a6c7b", + "Scripts/Game/ERR/00_Core/ERR_UnconsciousCameraProbe.c": "cfc63058a20fad99e76c59b64d0d288cc3441fd3486ff63a6dde9998b4ab103d", + "Scripts/Game/ERR/00_Core/ERR_UnconsciousWeapon.c": "24d31bc857486638e55c605283c17cde0cdbd3c5c6021eac1ec93611387b10d1", + "Scripts/Game/ERR/00_Core/ERR_VehicleSecurityActions.c": "bd7d0aeb4abcc9d8044e4888f9a92f9e5fc97c098bdfa3bbad57e1a29697a779", + "Scripts/Game/ERR/00_Core/ERR_VehicleSecurityComponent.c": "2ffec4e646584ec546147fc4b08249825cb32b531aba26467b586d760485adc3", + "Scripts/Game/ERR/00_Core/ERR_ViewDistance.c": "8514f72f8207f12570d2317e64094a45507a1647dfd45a1501499ef81e90189f", + "Scripts/Game/ERR/00_Core/ERR_WelcomeIdentity.c": "8624bac67c1990f87b3fb799361e5facd31c2e03cb621563b9c73c4fe9d7f87b", + "Scripts/Game/ERR/00_Core/ERR_WelcomeVoice.c": "a6a9a816dee1c766675990c158a757cf9ea8628a7b2b0de991af67ff4cd23e47", + "Scripts/Game/ERR/00_Core/ERR_ZBakedSpeechProbe.c": "533c89b6a258dccb61d7ff6abe0a43da58d52ffae60735a38c2545fbb4480afb", + "Scripts/Game/ERR/00_Core/ERR_ZSelfEpinephrineProbe.c": "a13e14d1ef525209d4609a2532c6d72135377ce058298937b632a91eeb6392fe", + "Scripts/Game/ERR/00_Core/ERR_ZStartBackpackProbe.c": "6778cd98392f4e73dfe974782e626d98472251c1266698020d63edf8fe735bcf", + "Scripts/Game/ERR/10_AI/ERR_AIDriverHorn.c": "db9f100c6cc10efc6f5b86e8fe9adb75657ebabee6f8bf0c89b997c2e947750a", + "Scripts/Game/ERR/10_AI/ERR_AirAmmoMission.c": "0a471a40c8f7dfb797d8d35e41c5b1ff91e8d2ab13b43cf866e46c0e4ab4ed9d", + "Scripts/Game/ERR/10_AI/ERR_AirAssaultLoad.c": "de7b6c485167ab68ab0b37b96fe161ee821c2efd41362172b810448a02110e68", + "Scripts/Game/ERR/10_AI/ERR_AirAssaultSystem.c": "2eaf9816eee3e1cd2ac70744a6ef7ea5a90d0a3eebdf925e384028a7edde6a42", + "Scripts/Game/ERR/10_AI/ERR_AirReconSystem.c": "f8a0e3cf4552d8133efd33c2126ea15a7694676773a7047c15e00021c1d9721e", + "Scripts/Game/ERR/10_AI/ERR_AirSupportPolicy.c": "c1a7ac8759ca8ec8b43cbccf303255a2f0b69de447d0d991e44b6bd3db415d51", + "Scripts/Game/ERR/10_AI/ERR_AircraftAmmo.c": "2be282406d0c45ab2e35b0ced791b5e494c662588f536701a4e82e6f5fb7c913", + "Scripts/Game/ERR/10_AI/ERR_AircraftControlBridge.c": "b8f0141644d8f043c6db4c2d4bb93215c548e5c27ab5468c66e996d62bdf905a", + "Scripts/Game/ERR/10_AI/ERR_AircraftFieldEnvelope.c": "0f53c7d9ab167a804eb904d63725decebb53fd5796fdf27864a75abed5679838", + "Scripts/Game/ERR/10_AI/ERR_AircraftFieldFlight.c": "c04e264cff9963821852094c451502d31bf9c96d4deae2e8ff8a2373b53b5665", + "Scripts/Game/ERR/10_AI/ERR_AircraftFieldRules.c": "30be68f4ca2db7e169f6f0432815821179cddf9159f7b150341dc8eb479bbd17", + "Scripts/Game/ERR/10_AI/ERR_AircraftFlight.c": "aa25a8e67a30c48677bf528236402b7f8e5d815dc18df93b878520ad3d1fe8a7", + "Scripts/Game/ERR/10_AI/ERR_AircraftFlightEnvelope.c": "8125cef61fb283d0d7c4dd2df3c04b062b448f1101fd48dd53f4f4097df5fef3", + "Scripts/Game/ERR/10_AI/ERR_AircraftRouteEnvelope.c": "e8fcef844239c47a1f2f36be420afe943bc450091b05859435406b46c87fa511", + "Scripts/Game/ERR/10_AI/ERR_AircraftRouteFlight.c": "1d8d92bf6d97429d68a9f62018232e90cc124cc8d7445efeabe863706a31e2b9", + "Scripts/Game/ERR/10_AI/ERR_AircraftService.c": "3f05209227986b5c6bfb193f8f53783cfd4ef083bce898e22257c3e63daed913", + "Scripts/Game/ERR/10_AI/ERR_AirfieldSupport.c": "c6d88ede0b1b6bac5a7075b6e2e783ccfa8850210aabd28bfa4bcdb698cc5f87", + "Scripts/Game/ERR/10_AI/ERR_AssaultParachute.c": "a93c996059e7166988e9d1b0b498cbfd36f19a1cf8520cb4e9215a8884752e18", + "Scripts/Game/ERR/10_AI/ERR_AttackSpace.c": "e7be303231b5946d78c61480a5de3f5b37a63d0d2281a9a30a21e59f072904d0", + "Scripts/Game/ERR/10_AI/ERR_AutomaticEquipment.c": "8658421f846fcd3402289103762edaccbe3ca26280d7d72df2846c32ae8a4cdc", + "Scripts/Game/ERR/10_AI/ERR_BodyRecovery.c": "f5fc311ecac4533c2d053a686c51e71216e69130a34483f27146627172914c99", + "Scripts/Game/ERR/10_AI/ERR_CessnaBridge.c": "f1adb0f9b92f6ed94a8e9897b64e2fccba0f28552525a93f1ab893faa4fc5da2", + "Scripts/Game/ERR/10_AI/ERR_CivilianTraffic.c": "b6509be9cc891ba4c1fc0f3fed8b09ebb31ca69bf2e5b28b50a6060706baed73", + "Scripts/Game/ERR/10_AI/ERR_ConvoyBoardingProgress.c": "328f8a5eabb8174b7727eee1d675db83a2eb0be7b8e834db4e950a645ca5d7a3", + "Scripts/Game/ERR/10_AI/ERR_ConvoyBudget.c": "fc7e254056c1da4aadd26d4f56d51ee375d5d3331f5f7e5183581108c7474a10", + "Scripts/Game/ERR/10_AI/ERR_ConvoyCombat.c": "5c4b7576b28d51edea868cbb91a0ab31a40e6ddb558f1b8a38e07e20fdb2969d", + "Scripts/Game/ERR/10_AI/ERR_ConvoyMineStock.c": "4497d6b790a45df2b76d18541ddaf299b406def88b868caa29f096849026a42c", + "Scripts/Game/ERR/10_AI/ERR_ConvoyPlacement.c": "af4799e3028448e1a73f944989313e5d10c6262521bd29a8cdd5236842717963", + "Scripts/Game/ERR/10_AI/ERR_ConvoyRoadPlan.c": "fae404f85cae63e63976938a5fdb73efc988ba25c5846564f12edca04fb88551", + "Scripts/Game/ERR/10_AI/ERR_ConvoyService.c": "5abc35861aebf2e4ad00de11f040d01f784c6f2184de2e10beaf46a74ec8758c", + "Scripts/Game/ERR/10_AI/ERR_ConvoyStartup.c": "360228fd45aa6ecd9426e36120b5e637d2feee1e3a4a89aac8207526b871c87e", + "Scripts/Game/ERR/10_AI/ERR_DroneBridge.c": "9ad23a763c5995b2ac6f68ed02def487b0ba887e8ca68f0e546d1b6812504cc9", + "Scripts/Game/ERR/10_AI/ERR_DroneRecon.c": "dc685b57c884d733e0ff90cf7937f5664ec08545f4cbf59d63bc8a84383dc442", + "Scripts/Game/ERR/10_AI/ERR_EnemyEquipment.c": "547965c1435de35e438546eec177e5f58814488fd1cbc591d8200328b4d8cfce", + "Scripts/Game/ERR/10_AI/ERR_EnemyGunnerSkill.c": "adf8bac5a6f7e40b2f9caff5fe9be590c4e4ce2b2b387ba39e741a3c4f4cc564", + "Scripts/Game/ERR/10_AI/ERR_EnemyLoadout.c": "a48f32dbd7f209bf08fce2840aaffc1781c571fc679763be58987f6b082e776c", + "Scripts/Game/ERR/10_AI/ERR_EnemyMapMarking.c": "0f161fd3e08a54e3e1063679127549e482c40253a022e9d06cd9ee4d740b8625", + "Scripts/Game/ERR/10_AI/ERR_EnemyMedicine.c": "68b65c98214e1a27383e155727901a4f70e9c065bb0cf133bdcf7fe6d5a57a40", + "Scripts/Game/ERR/10_AI/ERR_EnemyOptics.c": "215e8a05594c541861b48e093520c00091708eb0f3635dcee5d0b5e1160230eb", + "Scripts/Game/ERR/10_AI/ERR_EnemyRadio.c": "3a97e5c3de9ff33873d97c6b2d84ae505cfc4f3146e047b928e76ec3b22c8789", + "Scripts/Game/ERR/10_AI/ERR_EnemySkillAwareness.c": "00c450d033e43fc45c9e2cb64a1d81161d123cc594a4292cfc5f68eb6c17ee60", + "Scripts/Game/ERR/10_AI/ERR_EngineerMine.c": "067bed625a3f4d0fa189f46476988e90528c59b2351ec0ea71916317b06efabb", + "Scripts/Game/ERR/10_AI/ERR_EngineerMinePosts.c": "bcddb72845189b52e5ed71c687d7dd4b0b40b91b7306c3f6edf84a631002fc5b", + "Scripts/Game/ERR/10_AI/ERR_EngineerMineSite.c": "d838f5693d4fa5d252d529e59777f560674c02532f1041a5598e938b3a850839", + "Scripts/Game/ERR/10_AI/ERR_EquipmentLog.c": "df9eec7f94e4bf1b30b9463604e9b97ba3cbff36028a80b81327b0b021cbb2a9", + "Scripts/Game/ERR/10_AI/ERR_FiniteMagazineReservation.c": "8278590ced1936d618905b0cbd0b5aebddda238d426a6a2a52e455fc36bbb502", + "Scripts/Game/ERR/10_AI/ERR_GarageVehicles.c": "673661374e0854fd896d3d51aba84c07088057c941751b311daa4a97b899633e", + "Scripts/Game/ERR/10_AI/ERR_GroundDepotHQ.c": "c51fccd0ecdb0a1d6ba99ae965e2e572fc1ea65a5d8dc2e1e2a058698dae45c3", + "Scripts/Game/ERR/10_AI/ERR_GroundDepotLoading.c": "6abb278409527bb67db084138a773de240d99ba7f63f9ac740f8167615d53f1d", + "Scripts/Game/ERR/10_AI/ERR_GroundDepotTransfer.c": "21daa9ed8cb5f2dc08a0fa85e305fa4b4f3e7b01e16c71fd1ca98d66a4e8b652", + "Scripts/Game/ERR/10_AI/ERR_HQ.c": "64df9de7b62b65988e3bec1c8959d5094bd62d21b14803afa6b473d7b2974aea", + "Scripts/Game/ERR/10_AI/ERR_HQAdminProvider.c": "8879febe59fd99584add06690b29853f7cf14b580bb15c9a955cf1a2ce033908", + "Scripts/Game/ERR/10_AI/ERR_HQAmmoReporting.c": "95c024cbdd35c02d9b0c3d389d29bb042e5dda6ffd2f5f0d896078274b3adb35", + "Scripts/Game/ERR/10_AI/ERR_HQAmmoSampler.c": "8bb0ec1422887feaa340307d3c60bae50fc82d424fce6390876e580ff8b75e8b", + "Scripts/Game/ERR/10_AI/ERR_HQBodyObserver.c": "131e94ceb1e8ce339619a86fe695009b409ae7c0f47575a6e914bc7f37511377", + "Scripts/Game/ERR/10_AI/ERR_HQCoordinated.c": "5b67ad624c4a6b0bbb715314ab9cf14e527018fccb7d38af479184b4952b8c49", + "Scripts/Game/ERR/10_AI/ERR_HQCoverage.c": "0ef1ed718797114d95c636c8fa5a9e46a5f2a7ccbe3f432049b0c7d37f1eebd0", + "Scripts/Game/ERR/10_AI/ERR_HQDeliveredCasualties.c": "1f738127e55e843ee2705007cedb5c08741f52f63c75eca7c80242177af82273", + "Scripts/Game/ERR/10_AI/ERR_HQDoctrine.c": "6335728e89ed40ce11b811f00b61bfea76e94dd3379e4357cbfc438b05522bb0", + "Scripts/Game/ERR/10_AI/ERR_HQExecution.c": "d286b8273faec0acf87366bf53ad2517d5b7d909741e981cdf283cd1f4f50314", + "Scripts/Game/ERR/10_AI/ERR_HQHunterOperations.c": "b9200b6de3a3a61de94ad720aca94aca64db542acc64ba65e7b8061a5e4884e7", + "Scripts/Game/ERR/10_AI/ERR_HQHypotheses.c": "060796bbbed604f9733d23e131c9836702870c6e25c81cc0b396c885eb06ade2", + "Scripts/Game/ERR/10_AI/ERR_HQJournal.c": "53563ff54fc4e0656713d6eaec5e88ddf69fd4bfa8ef6a67cfa13380d24031e1", + "Scripts/Game/ERR/10_AI/ERR_HQLocalAwareness.c": "124260280ac8eda0e920bfcfc86932c9b21df6b1f7a6aa8acfc43feea3da149f", + "Scripts/Game/ERR/10_AI/ERR_HQLocalHandoff.c": "2dd700dae9d9b232d22ca63ff01af75a3f5cc213ac24b7c0a43ffa38bc0b9ffa", + "Scripts/Game/ERR/10_AI/ERR_HQMemory.c": "ec2047a477fb4273e22ae6bb68e7365f321f55c583b5d2c48c4abf2ac38e3b7d", + "Scripts/Game/ERR/10_AI/ERR_HQMineSampler.c": "2a0fdc4d27e947a1d77b02ae23f757c7fa074eb456f817b7df0766583d757f55", + "Scripts/Game/ERR/10_AI/ERR_HQMountedAmmoSampler.c": "97dfab7381385959b0906be13fa2575253ac43be91a271a5d41edaf4106366ac", + "Scripts/Game/ERR/10_AI/ERR_HQMountedDispatch.c": "12769b56019e9fa5b8141498a1c33814ba5262253193495e72f85972365961a7", + "Scripts/Game/ERR/10_AI/ERR_HQMountedIntercept.c": "5f45545c11de5e183969203cdf07e29089697ddc89752a9c5aea0fa2a1a33a97", + "Scripts/Game/ERR/10_AI/ERR_HQNetwork.c": "0b73be993628a55e3b21c8670d540e39c938093dd5cb4d586e800ac530509b25", + "Scripts/Game/ERR/10_AI/ERR_HQObservation.c": "57ad3f0b68d150791e30a7e4bd7dfedfb1ddd78a1c76f228e67b33ea9cb7144e", + "Scripts/Game/ERR/10_AI/ERR_HQOperationSpeech.c": "6f133c104223ce23262c2927db9e16df0f76f1ee647085114baef1d51417f4f3", + "Scripts/Game/ERR/10_AI/ERR_HQOperations.c": "b83b805c61c3960801d24ae54854ba7aa4dc914ea89e61db365b5ec99f305ae5", + "Scripts/Game/ERR/10_AI/ERR_HQPursuit.c": "280e91feecc4e5b6d0886fc4201b12117b58c56857d4386b6c4cb963557274bf", + "Scripts/Game/ERR/10_AI/ERR_HQReport.c": "d6e79ce7035dadd64debeb8405041b3efb0c57e29ddec48d3112a1731738d999", + "Scripts/Game/ERR/10_AI/ERR_HQRoadIntercept.c": "f87727aa1c722a180c7b71fa2d896601b6250978a21bd2d1e973501fee81373b", + "Scripts/Game/ERR/10_AI/ERR_HQSquadJudgment.c": "12e9ccc9d42a858a998bd46708fbb04d05d48dcf460303a5ecc1629021051bb4", + "Scripts/Game/ERR/10_AI/ERR_HQStatusSampler.c": "b937eaed913a5095afa8e678dc1c36b5c805541bf8cd5be927069533d6baed1c", + "Scripts/Game/ERR/10_AI/ERR_HQTacticalGround.c": "eba9a9cabdaa80b936aa5e7025544e8b011fb597b96cbdb8d781583c025afbe8", + "Scripts/Game/ERR/10_AI/ERR_HQTask.c": "29359f52734cbf3400e12696057bbb7aa54466a018fc88c42015b6eb9bb9990c", + "Scripts/Game/ERR/10_AI/ERR_HQWatch.c": "abe634cf6003ae920ec1ed18e305ed462920204960894520d3dd11f7e5ef1c33", + "Scripts/Game/ERR/10_AI/ERR_HelicopterAvailability.c": "60eaef2f6d4b2fd44861c5a4434ef97e732e40a5ff7401e2da451ed2dd9c2762", + "Scripts/Game/ERR/10_AI/ERR_HunterCloseContact.c": "56f22051566354ccdc61531af4869b62458a30d945e4d21de5aadf7079d2245b", + "Scripts/Game/ERR/10_AI/ERR_HunterCombat.c": "df1c319d10efd07ed6f971cf0e41d8d7e377b04ea7f0fe143bf94df733fd1d9c", + "Scripts/Game/ERR/10_AI/ERR_HunterCrewRecovery.c": "22e192ca222017d4d7a27210c6e42cf0f128827bca00b37924c9c8d6866b62a4", + "Scripts/Game/ERR/10_AI/ERR_HunterGunTeam.c": "0e66d82964ef8eeba29de11d5bb2af954ad72a8090855ac4c1b28fe1e66c0d69", + "Scripts/Game/ERR/10_AI/ERR_HunterOpeningPlan.c": "7791513b8b41f4d2ba1b593b5219d7f6e2bf036e352f8e4eb1a8029fc97ab7c8", + "Scripts/Game/ERR/10_AI/ERR_HunterSarkaRules.c": "8c8c96e2f985f553e303f7e459b73a2a5cd0051951b22aa0ed364bc2ae19e194", + "Scripts/Game/ERR/10_AI/ERR_HunterService.c": "c938b8beb3f72ca1b2a76b48052dee70fe52651593dcdc16b7993a9398bc92e8", + "Scripts/Game/ERR/10_AI/ERR_HunterTactics.c": "274ae619589b85cf64df1510631ab914aa9fe8c50fc2a76e6e8c5aa5a2c8d9ba", + "Scripts/Game/ERR/10_AI/ERR_InfantryAmmoAccess.c": "ab4262f78d54782c5ecbf5fff4ebe3da16d72329658d7e18c0c35387dc8b3c7d", + "Scripts/Game/ERR/10_AI/ERR_InfantryAmmoTransfer.c": "99fa26beb0c0869d0cd694500f3bfc0705c2c1cf674dea90d98fb93a59570ef7", + "Scripts/Game/ERR/10_AI/ERR_InfantryCombat.c": "5d7a8e579edf95003133ddb6e509202dba56ac9e68385247e1ac0256c1b319ec", + "Scripts/Game/ERR/10_AI/ERR_InfantryMineTransfer.c": "02c399413f80879c22b4891e8ec807c67a6235677095fc4b98bafdc360d6944c", + "Scripts/Game/ERR/10_AI/ERR_InfantryResupply.c": "ca8eee2704e7758172e33014404bb1307c683f19b561b840d4592f6312051e62", + "Scripts/Game/ERR/10_AI/ERR_InfantrySupplyPool.c": "c8e454573cf064ff392291d6feebf1f23be64390b5b8e944c03dd065f9f46b42", + "Scripts/Game/ERR/10_AI/ERR_InterceptVehicleFootprint.c": "5dea67d14ebab67231c485e14bc92f34c005a5f1bf6d9c0943db28e9857e958a", + "Scripts/Game/ERR/10_AI/ERR_KnownMines.c": "5772711f3389d43418b93011ce4416b73d0498a8c7518a49dae8dad9a988c0c6", + "Scripts/Game/ERR/10_AI/ERR_MortarAimSolution.c": "59e8343d09f7a44871d8d3335d6ad1d02216abb5deed30d38b5ec9ba3f2c0649", + "Scripts/Game/ERR/10_AI/ERR_MortarBattery.c": "157024afc8fd3c1ffeea6ae923ff091e5773b9ffcf5f5864f8040d001e689110", + "Scripts/Game/ERR/10_AI/ERR_MortarCourierTransfer.c": "968e58ca700b4a11e5e04a5c159696f514a0b1bce531210172b913e495f7e2b7", + "Scripts/Game/ERR/10_AI/ERR_MortarFiring.c": "2606ed8c19d5569815dacd3248f012072bb76834f429ce7557d24d884724f733", + "Scripts/Game/ERR/10_AI/ERR_MortarLogistics.c": "b3624e4a00a2bdef16f6c100bbd79910e3bb8c2ae8ec5fe2ad5aa70bffecd303", + "Scripts/Game/ERR/10_AI/ERR_MortarPrediction.c": "05863b2b4f9f70cdb288f91c722cbea163c13f2a2927dc485482e5bd4fa7d57f", + "Scripts/Game/ERR/10_AI/ERR_MortarReadiness.c": "4c3799b3f2681e977669de0cbfaeb307d9a682b04365bfc9f59079e762965758", + "Scripts/Game/ERR/10_AI/ERR_MortarRefresh.c": "52ae8d9d6cad92f42d68c634091b80a474d2666b6c06d63a8c30a3fab71494c4", + "Scripts/Game/ERR/10_AI/ERR_MortarReportLedger.c": "42a96040b63e56677353e55164ae23031c90f70b4d6673a9f412ad7b19e636ae", + "Scripts/Game/ERR/10_AI/ERR_MortarSalvo.c": "c128850c7a78a4d8fee00ad38f48b265f1fbd1d9b24b092ddc5c205b0f0ad6da", + "Scripts/Game/ERR/10_AI/ERR_MortarSpotting.c": "39b3c223ade610ed9f1d73040423339ac65c90b153f30c6f5c42290978c57427", + "Scripts/Game/ERR/10_AI/ERR_MortarStation.c": "cbbd7c86f722b664c85ab7c070ae1131d2ce5c41d1dacb4381bff9c1720a1866", + "Scripts/Game/ERR/10_AI/ERR_MortarSupplyTransfer.c": "ad71084f507ad9c32d3055e7ec6844a1ec5ddf568c0216ab8391e902b56e417c", + "Scripts/Game/ERR/10_AI/ERR_MortarSystem.c": "01bae0bab685e9f0c86c3a8939d18ce6f20dc0b8c1a389d179d91e93008c6957", + "Scripts/Game/ERR/10_AI/ERR_MountedAmmoPickup.c": "5f7ca5b31f3b405c2a6ca32ff91042f5b4dac6ab9640ce67fb10d7a74236ba69", + "Scripts/Game/ERR/10_AI/ERR_MountedAmmoTransfer.c": "0b195784497672fdaf651f336c14f7be98c257f98c85cfbeb4f96fe1a401999b", + "Scripts/Game/ERR/10_AI/ERR_MountedMagazineSeed.c": "b42d0aac142907433df8bedc40de24c94813544016cf5f451846f1980250f995", + "Scripts/Game/ERR/10_AI/ERR_MountedResupply.c": "c26ad43705765be1c20eca37fbe2978b8c647151f6620ed37141657a4b7dc312", + "Scripts/Game/ERR/10_AI/ERR_NativeAirAssaultProbe.c": "c1d55b338b157b758e6ffb993d5f689029b28b13929797c91e5dcb15b5e561ea", + "Scripts/Game/ERR/10_AI/ERR_NativeAirLogisticsProbe.c": "58fe863775d0ad575cb566c78cef696c9826691cf49ef9adde76376be7316db1", + "Scripts/Game/ERR/10_AI/ERR_NativeAirReconProbe.c": "c1216e0512a0268e4dbb82429e228334401c0c3cac52ba4486ae6dc91e41576d", + "Scripts/Game/ERR/10_AI/ERR_NativeAircraftControlProbe.c": "0cf3e72ccdc42e6ef20fb71d743f0e037a9e69b2e082c720fa705628cf790205", + "Scripts/Game/ERR/10_AI/ERR_NativeAircraftFieldProbe.c": "b64907c7566a894ca2f3c49ede5d972d4087a938da1a0ca87bcbd7c2203b2c52", + "Scripts/Game/ERR/10_AI/ERR_NativeAircraftRouteProbe.c": "8d0dca97e5106d1c84b64992c789e1af0689514beefc027e713ca6ab901fc470", + "Scripts/Game/ERR/10_AI/ERR_NativeMortarCourierProbe.c": "740c8bebbd4128a9311b1167d1058549475d6b46f81c9b6c0d19650f4b50616f", + "Scripts/Game/ERR/10_AI/ERR_NativeMortarFiringProbe.c": "ee570d21bede8baebefc799399712d9582b3e30ebda7299f6c941777f02ad2a2", + "Scripts/Game/ERR/10_AI/ERR_NativeMortarSalvoProbe.c": "fb9ccc6b36247ab3ad828ffbb2556abf5c2838d93ea6cd1ad259c0a015142f5e", + "Scripts/Game/ERR/10_AI/ERR_NativeMortarStationProbe.c": "a110f0abc753cb1d2f781e457e637dd5346ecd2e924eb5eb3a5c7dca3d1e2340", + "Scripts/Game/ERR/10_AI/ERR_NativeMortarTransferProbe.c": "399c21940ef10777b46fdb3e905430ce43404ce1de2f4a6bb62f9c61c1a0689c", + "Scripts/Game/ERR/10_AI/ERR_NativePatrolHQProbe.c": "9784b551cbb91f017004fb728ce08b5c36bead0ffc83aa7149c2c46a7c4dc495", + "Scripts/Game/ERR/10_AI/ERR_NativeScoutProbe.c": "41b39b1abe5e51a5b8a428d533cccbfb0dda9d7a570228dc3489408c60543f17", + "Scripts/Game/ERR/10_AI/ERR_NativeTownProbe.c": "28876e65f9f8a7d96d8056f446b61e12e97d9bbf1a5ac0d4c40edee44e6c4a21", + "Scripts/Game/ERR/10_AI/ERR_ObjectiveDefence.c": "83ef91c2118521aedb4c1838b2e47909c80e0950086449b98ced168f1fd87080", + "Scripts/Game/ERR/10_AI/ERR_OptionalMotorbikes.c": "a99dd598fea505005610810fb408a959e981775abe6113b6a964e08a57b6006a", + "Scripts/Game/ERR/10_AI/ERR_ParkedCarCatalog.c": "1d865c263e910071b127ccd1bdc8b58dd45768c4629194da49705f76995ff0e7", + "Scripts/Game/ERR/10_AI/ERR_PlaneFlight.c": "14fa2328e1d31cf59fb89cbb53ba33224be6cfcdd2813525fa9585f8b2e237c7", + "Scripts/Game/ERR/10_AI/ERR_PlaneRecon.c": "fe94c29fd9befd3c1bf3ab97b9b27458a8563697d4d46f72df43c6e642f3664e", + "Scripts/Game/ERR/10_AI/ERR_ReconAirports.c": "7551347d776d6e0eec818d6468cacbca7ac53daee7317e0a1618ca3d39ebc762", + "Scripts/Game/ERR/10_AI/ERR_ReconCrewLocks.c": "83b63c21574140208792aaf3d24e3d22b255a078871382122110bb48520d4541", + "Scripts/Game/ERR/10_AI/ERR_ReconFlightComponent.c": "1386e2a2d2a635417ca517aa1d8ddd4f657dd415ff59be2465543cd8f601e7a9", + "Scripts/Game/ERR/10_AI/ERR_RescueAssets.c": "fca1a4518baf09f0b2c97f3a51995001d9674849417fea9ca1233e8d1f578495", + "Scripts/Game/ERR/10_AI/ERR_RescueFlightComponent.c": "60db8029bbfbbb362b5bce61f509740eabea5925b93bc975e7c2b44addcf03f3", + "Scripts/Game/ERR/10_AI/ERR_RoadblockMining.c": "47d0212cd20c0b320a47123d17f2b89f7d60b44072a00c69944ada7bb83c4e5a", + "Scripts/Game/ERR/10_AI/ERR_Roadblocks.c": "ba7e064550463da098fe01c27d456c7509a12928fee4aee335f61d047472770c", + "Scripts/Game/ERR/10_AI/ERR_ScoutSystem.c": "63287a252e4e7d5aefce840279f26ce3e1f286cb79cadb32596c37897cec7119", + "Scripts/Game/ERR/10_AI/ERR_SettlementSafety.c": "e5c0ebc95521a9a33a3f7d9cca6c551dda862a08b7af20b017877aba9584795b", + "Scripts/Game/ERR/10_AI/ERR_ShoreBoats.c": "e8205562bb5e98a73ef958485470f53bb1f71113457b8717c123df79db8937f4", + "Scripts/Game/ERR/10_AI/ERR_ShoreMap.c": "ad7126e5efae6951ee689d38954a69ed25388e2075e0e090a2e78b4626ca5dfd", + "Scripts/Game/ERR/10_AI/ERR_SoldierSpeech.c": "ca87494ecd355052b46b72e2faf13660e458f3d376285bb0e4c20fd0112ef2e2", + "Scripts/Game/ERR/10_AI/ERR_SoldierSpeechAudio.c": "4734d614c5366ae3ff57717f514664c9dfdbe4408e16ba36f6b10d807361e313", + "Scripts/Game/ERR/10_AI/ERR_SoldierSpeechContext.c": "d2baa94f036f7dde5cf24e004ad1fb9416f249cbf7d0c6c07c5898f7d21751be", + "Scripts/Game/ERR/10_AI/ERR_SupplyConvoyColumn.c": "bd898aabcac5724d60dbecc4ff5ab6f062c66cf7c735ff59127c588ff94f898e", + "Scripts/Game/ERR/10_AI/ERR_SupplyConvoyService.c": "5393efab9d663382e67b9b27a388063986a4f99c2607328c998f007588074ca4", + "Scripts/Game/ERR/10_AI/ERR_SupplyConvoySystem.c": "f09aa817c27d6af0ccfb544f4ab1ae2afafb63d626641e03d87cfe159475d821", + "Scripts/Game/ERR/10_AI/ERR_SupplyConvoyTactics.c": "d2fe073b0c23c877afaa65e246544751eecabce4febd72412fc9a4ec18eb1c8c", + "Scripts/Game/ERR/10_AI/ERR_SupportScenario.c": "151eb6189701e559bd4f1359c91187f5a64deab1f2bacbd521c4f4cf3de6d878", + "Scripts/Game/ERR/10_AI/ERR_TownGarrisons.c": "9b48331ff8bf7e5a111b498c59a57a5d0210125af983424535286a4aeda9a18d", + "Scripts/Game/ERR/10_AI/ERR_VehicleAlarmPerception.c": "45ac71d25e10a057a26a5b0fc7128935baaf47f4c0f87208a4420fa52086fd98", + "Scripts/Game/ERR/20_Intel/ERR_IntelAdminProvider.c": "40adf8497b64cc74b1390149fe5ba789ee2f14e6fb3c325af8f5ffa8c806878e", + "Scripts/Game/ERR/20_Intel/ERR_IntelDiscoveryFeedback.c": "741de1dbadfd46c154905a0918aad41386ddc139d843553db55d20d60700c020", + "Scripts/Game/ERR/20_Intel/ERR_IntelEvidence.c": "ff436bd3c7aa0fcd5c24e940430c1ffdda934889953f63e877ae418bc9557d26", + "Scripts/Game/ERR/20_Intel/ERR_IntelReroll.c": "d8b04de9ea789732cc78ebce9aa60786c86fe46d05f671cf251eefa68a214b59", + "Scripts/Game/ERR/20_Intel/ERR_IntelService.c": "2911325c79a7a372628b18ffa0e110d11919ce2c2cd7b19277bfd608fdb03dfc", + "Scripts/Game/ERR/20_Intel/ERR_MineIntel.c": "3ce16cebaa9703b2f9803df7c11614f94de6460a9136dab8f80dcad41ae2b1c2", + "Scripts/Game/ERR/30_Map/ERRM_AtlasPresentation.c": "f0b36472b16477b8c3b5b62f55cfb2a3b3a08304b0779bc39244359af1abe203", + "Scripts/Game/ERR/30_Map/ERRM_NativeAtlasAnimationProbe.c": "845b39276bfdbadd6bfd9b41f445fce1a9d40231d38ef32adc7a6654868e17f2", + "Scripts/Game/ERR/30_Map/ERRM_NativeHeldMapProbe.c": "46c0210a3aef40fc34e4c9682d9364b1cc1e15d4373d8aabfeac7d9b8e55c351", + "Scripts/Game/ERR/30_Map/ERRM_NativeMapOwnershipProbe.c": "32418602f085e3edba7343f42a6a691630b533be262002f29248e8ae87a38254", + "Scripts/Game/ERR/30_Map/ERRM_SharedMapComponent.c": "73298c94ecc8d227452b0eddfcaec7fe9df4748875fa7fafcc52544a43658f36", + "Scripts/Game/ERR/30_Map/ERRM_SharedMapPages.c": "2286d327b87f127f052e06c22f553b30ea31d25127b860fc02a220aeb4ce3ea2", + "Scripts/Game/ERR/30_Map/ERR_ScenarioMap.c": "75fa1d742129ef7f33c005cd48f56db7f49ee7bde3c5428532b0b501b032b0a3", + "Scripts/Game/ERR/40_Chat/ERR_AdminCommands.c": "282fe1463add7af8771aa58507b254e69d2d06f50274d4c77321db073f8394f0", + "Scripts/Game/ERR/40_Chat/ERR_NativeAlarmHearingProbe.c": "5dbb6a48909b76cd141e3a79ef01d2e68cafee55153821c4471f85c761fff94f", + "Scripts/Game/ERR/40_Chat/ERR_NativeConvoyCoverProbe.c": "d2450140cf9bdf09210473234605b4c0d818ea5b91f9532209166a35c5d13701", + "Scripts/Game/ERR/40_Chat/ERR_NativeConvoyProbe.c": "87df652b339df4fe4239617752ac5fd9f47aa4396ba94742a0af39a32b54e784", + "Scripts/Game/ERR/40_Chat/ERR_NativeCrashGeometryProbe.c": "7867ce1794aa0d1bbab72c32f60f5bd0c2bad4f5ff6224978c215e7828840178", + "Scripts/Game/ERR/40_Chat/ERR_NativeCrashStartProbe.c": "957f40e36bfc025b8bc752b1f41dc177c8d0844c69ee5994321a47cf3ddea1ad", + "Scripts/Game/ERR/40_Chat/ERR_NativeHQBodyProbe.c": "811244cc8297817efbfc3ee4edf01c868eae23c88127ba0c72e98ee7422da72f", + "Scripts/Game/ERR/40_Chat/ERR_NativeHQMemoryProbe.c": "9bcd0b2e1007d40cb794aabe80368a2584ae58aad6a3ebbee070efc7b21a8147", + "Scripts/Game/ERR/40_Chat/ERR_NativeHQResponseProof.c": "0f8b09fd8753234c91fd6baaca0e2f812e409ae1c4be8f340b648ae59b69c2f3", + "Scripts/Game/ERR/40_Chat/ERR_NativeInfantryTransferProbe.c": "9b2de4dc22bdadd51b0271219a971dc8dc07f70ed3534f306acf03ed81b29424", + "Scripts/Game/ERR/40_Chat/ERR_NativeLocalHandoffProbe.c": "0d4d61c424a16008595f86fa61f3b848caf9bd6e9ebbacea9c10254d88ba378e", + "Scripts/Game/ERR/40_Chat/ERR_NativeMaintenanceProbe.c": "852b9b397efc3f919c97fec63bc3df1a850cd7833421af8441994afd191951d4", + "Scripts/Game/ERR/40_Chat/ERR_NativeMortarProbe.c": "ddb892141500c192c0787b011d57dd8c07dd8c9a3ca5fdc407f6c271897bde0a", + "Scripts/Game/ERR/40_Chat/ERR_NativeMountedAmmoProbe.c": "7ddb634444c79ad9291d53a754dc0ed383342e36720ddaa4b7aa4bd4e7ee656d", + "Scripts/Game/ERR/40_Chat/ERR_NativeMountedCourierProbe.c": "12710e9e5548fe8856f7a52f3566338369a8a1eedf0bd92af16229271872ada5", + "Scripts/Game/ERR/40_Chat/ERR_NativeMountedInterceptProbe.c": "34b0b1e38a59f14c4e83d93ec412779945388e6f4d697bda2f6cb90f519a6372", + "Scripts/Game/ERR/40_Chat/ERR_NativeMountedSwapProbe.c": "a6721fcaaccadf8eddb06687c7d587d0a3e377d5d1bb0b8e72e630fede8690ac", + "Scripts/Game/ERR/40_Chat/ERR_NativeRadioProbe.c": "a4bd5cd9fe0594e05238b2d6dcd80466773f8fa160dc60bbe1eda70e3acdbe79", + "Scripts/Game/ERR/40_Chat/ERR_NativeRandomRadiusTrace.c": "7e946406067092e30b6b75cc6ef0c56db7f866249e02bd13648156933ee578d9", + "Scripts/Game/ERR/40_Chat/ERR_NativeSmoke.c": "4dfb218419db4cd7a46d25cb1f2e578e75ad89efc43f99c6ca8ab8e591e139d7", + "Scripts/Game/ERR/40_Chat/ERR_NativeSupplyConvoyProbe.c": "89c2696071912500840f4bb91d754f695bf674335b51a7ee1d03727084fd4869", + "Scripts/Game/ERR/40_Chat/ERR_NativeSupplyTravelProbe.c": "32e6074e912491f2643a24cb44311b9fe5b069c76e4e94a45e7409ac82d36507", + "Scripts/Game/ERR/40_Chat/ERR_OrdinaryScenarioLaunchChat.c": "a747af09599ce4d0c52051f18f00c4624d24d137e328341b580b82e896c6bf65", + "Scripts/GameLib/ERR/00_Core/ERR_DiagnosticNoSplash.c": "0ea1b402f8927b6d68bf6f7e5caa2967f7e3a39147634faab147796b791933b5", + "Scripts/WorkbenchGame/ERR/00_Core/ERR_BuildAtlasModel.c": "f6cb5e6f5afc9bb60a8a46d96b52c7506882faf0a880e0b20a01a2603b336d2c", + "Scripts/WorkbenchGame/ERR/00_Core/ERR_ValidateBaseWorldPlugin.c": "49a38c37b51e5318c7dcbcb01543dd9a6300d053f0d39808b3974f4edc45b871", + "Scripts/WorkbenchGame/ERR/40_Chat/ERR_ValidateWorldPlugin.c": "d1f3fc372d0d16062a5983f2a6cffb6e72f202cb93fea5b33b4d77e0c852ecc7", + "Sounds/ERR/Speech/radio_01.acp": "cf63378bf3950f5e6c1c1f46c057ad38a371b14b945b1201777820384805c3af", + "Sounds/ERR/Speech/radio_01.acp.meta": "d5966526f35aa64dc980238f72f4f93f9d0e6a360f10e3f6538e97b7d086aa47", + "Sounds/ERR/Speech/radio_01.wav": "cfe4a00000bc9b629a9e8e282ed64e7177673f829c5657b1ae2b2cb9e661d2ae", + "Sounds/ERR/Speech/radio_01.wav.meta": "eaf33fa344fccf9aacab626117d03b96b135fa819d3e63ae300fac544291b571", + "Sounds/ERR/Speech/radio_02.acp": "9111d118594094a8e09acdf80d8b107cc7d5d890b6ab086274e0e1004039e345", + "Sounds/ERR/Speech/radio_02.acp.meta": "76b55d9abf7f599c5db3269a5829546a6d5f92e6350b2fe987245f9cd6b599fb", + "Sounds/ERR/Speech/radio_02.wav": "6f0c94ae0e501afe6cc1aba804ba6a0403ba4de931debc28bf22970f591d0798", + "Sounds/ERR/Speech/radio_02.wav.meta": "06ec85166aa4c54a6fafa1fa2eb2cc32f4a36dc8eecde8f9ba9912229e5e00e0", + "Sounds/ERR/Speech/radio_03.acp": "019f939d65396f4a334a024bbf53c41479a9f8ce806610945af2be13e7352c70", + "Sounds/ERR/Speech/radio_03.acp.meta": "8aa2f4f26f04bc3085ae046f543c047cdadf9af9e06a38920f1e1fd8a3aa02fe", + "Sounds/ERR/Speech/radio_03.wav": "415a206bd1de167342cf1b82d59c708441b8d802395f941d15097c064133802a", + "Sounds/ERR/Speech/radio_03.wav.meta": "de1d81fb653146404de5b6a6018c1cd73e902571b82d544de5b6cfccf21f5410", + "Sounds/ERR/Speech/radio_04.acp": "77bcff7cc7ce49036a440e829fb4eab1dbe5252b0fc9ea24c42e6f6b68e2698e", + "Sounds/ERR/Speech/radio_04.acp.meta": "dd61ee2545776cf23403240424470661c737048d01432d90b24f2c9e75f45d82", + "Sounds/ERR/Speech/radio_04.wav": "a225810c7fba048517248fd9f7e9f7ab8aad5bac35e59f22e11e69166551f7f3", + "Sounds/ERR/Speech/radio_04.wav.meta": "0ae046e2ac7f9653661ba99646d40dd78d52f113ea6554e1dbfd6e578572a4f4", + "Sounds/ERR/Speech/radio_05.acp": "7dbc2b3b3d251eb8d3e749b0a7f32186b0421a95fa5585be493cf04b45510e3d", + "Sounds/ERR/Speech/radio_05.acp.meta": "cbf3b48ed3865e30ba5d838d96ec4f1ee950cdcd51368f7a9259460e4b78cc1b", + "Sounds/ERR/Speech/radio_05.wav": "90f5abe221165ac5cd7d88c9b3e01cf6fd4d00b594c84d09c6baf101fdb776ad", + "Sounds/ERR/Speech/radio_05.wav.meta": "d8e3de0e1ae8670a01bcc272a1adf4199ffcea514ce024ee3286820dedab4d83", + "Sounds/ERR/Speech/radio_06.acp": "e14da41c1cd186f35a4f385fab71ad85ad6fe718e67299a65466339ae23a2922", + "Sounds/ERR/Speech/radio_06.acp.meta": "efc810a60e93453942adba476b423121f2a7dc1133b25d8764c1bec546a3949b", + "Sounds/ERR/Speech/radio_06.wav": "b3f86b8dde535bc1a63301376c8d42775446d1b6117168557841565391fe0a14", + "Sounds/ERR/Speech/radio_06.wav.meta": "07f53131f4ad153cc09051ba1de07f7b43d38f69781aad24371c4eeb331b280b", + "Sounds/ERR/Speech/radio_07.acp": "bf3a48af07ad6e5da2ca6ed6c581fc6232e1bd62ebb905b934188366f2bc3d77", + "Sounds/ERR/Speech/radio_07.acp.meta": "60aab59223c0ea734f7c1e88f803de30164ccef1a909730abed3eb76b3378ca2", + "Sounds/ERR/Speech/radio_07.wav": "f3fd18ddaebe9eb3d0db9ac73c89a7b7a7f18b76e4b66d404d544be660a6825e", + "Sounds/ERR/Speech/radio_07.wav.meta": "ef6c72aa32c1c46f7133782536744bdaf4eee03bcdb75aecb87accef6d1c4f2d", + "Sounds/ERR/Speech/radio_08.acp": "a82c5dbcd7094085324d93d539c6f829c53dcf3781f40b8d65a10b7cb4125bae", + "Sounds/ERR/Speech/radio_08.acp.meta": "69fb3400109e19d4f4d0fb371d056edbecc0a96a0a923174d1aba95dfeac1014", + "Sounds/ERR/Speech/radio_08.wav": "ce3c2aff20dbea83aa6545a383c454969c5caeb53d5a88155ec182f789047d4a", + "Sounds/ERR/Speech/radio_08.wav.meta": "72c5e117ab7b605b8370fe90923edee73593df6071c39b86556731387814a014", + "Sounds/ERR/Speech/radio_09.acp": "73725377def1832742c7620fec46dc0100400d92b9cb79add8b4d44e94c46c0a", + "Sounds/ERR/Speech/radio_09.acp.meta": "95456fe20def274a1972867024e9d0eb572f3878eae19c63522fcefe401dcb07", + "Sounds/ERR/Speech/radio_09.wav": "3eb0be6393c431b526dbddc723cb608a7681a2dcd8af6910d9f2234aa98c923c", + "Sounds/ERR/Speech/radio_09.wav.meta": "724dd301d1b25e41318503a815e87b54e7283735c51fd122af55c070f26adb37", + "Sounds/ERR/Speech/radio_10.acp": "f976a0fecf73b3379ffb9728e96c68ca79800712919320e7ff7f3484cd2c9724", + "Sounds/ERR/Speech/radio_10.acp.meta": "5411a9ffa23e42c8a2e8d4eba75d6e87631bcf542128327dfefd603a64d5b6ec", + "Sounds/ERR/Speech/radio_10.wav": "2b2dac499a45a7779e79465d628a67b87078c0951db7db3e051feeb4342f2816", + "Sounds/ERR/Speech/radio_10.wav.meta": "c3ac10a092dcb26ec637be6c9264a85eae1b6da55b9d8b44a14766a70ddf2933", + "Sounds/ERR/Speech/soldier_1001.acp": "1af0d303063f37811a9b1a25424d887fe5eed4b5c57da71cf36ba6985f8cf002", + "Sounds/ERR/Speech/soldier_1001.acp.meta": "2fbdda4d9fa83c6945985bd2f2215aa9f745b3a18adb0e7edafac1b01c161ba5", + "Sounds/ERR/Speech/soldier_1001.wav": "a8935a5aded028f2fb03734f4423e731ea4f5b17394526df47c0407a3deddfe7", + "Sounds/ERR/Speech/soldier_1001.wav.meta": "aff7a92a727d8bd4df033be2961fb85cafdc5c45fd272c5ea718bc07fb8e5cce", + "Sounds/ERR/Speech/soldier_1002.acp": "1444636949683a430efe20a7f296e85e669cb8e26799c326f73a00c4f8d32fa5", + "Sounds/ERR/Speech/soldier_1002.acp.meta": "d8eb34135a3b76f0a4f889f9662d954b3b0b3638c10c0732e25ca29d7b2ef412", + "Sounds/ERR/Speech/soldier_1002.wav": "8535643e93757dd916f4158b5b03671cefc599489dbccf6bb0f7abf294fbae88", + "Sounds/ERR/Speech/soldier_1002.wav.meta": "e8c8813e5a1989a0d7e4d2a5c90622c4b0f909aafb929f4737c82e5710220d1f", + "Sounds/ERR/Speech/soldier_1003.acp": "5ab123f150debd6fda0b822fee7ffca5a0bdc168f4d8d2e28b3982972db05613", + "Sounds/ERR/Speech/soldier_1003.acp.meta": "f89fa8e7ac42e7f675d29f0b241d181df572413c6c41bf31cfb98fa205baa87e", + "Sounds/ERR/Speech/soldier_1003.wav": "5910896661ad67333d2374a16ca44ce831a5820feb337655df99c02df2915d5a", + "Sounds/ERR/Speech/soldier_1003.wav.meta": "5281a71be599a70aeb9972ea85364e5ef32f824db94c71953d8a1912fb2a27c2", + "Sounds/ERR/Speech/soldier_1004.acp": "10ac847b206834168e63d8d0f7ad25d7542a58a49d331af50aecf13e7e070ac9", + "Sounds/ERR/Speech/soldier_1004.acp.meta": "8c073328d3f5f06ca583d97e9ce2453d8167ec7bc5643ab90783748a4cd9b6bf", + "Sounds/ERR/Speech/soldier_1004.wav": "76375e462ba518c76f752d4b194c9370dffcebd8ce0037865133b37af3ff9a9e", + "Sounds/ERR/Speech/soldier_1004.wav.meta": "563aae8d93efeaa7ca098c12bf0004da279321607793bb32a93b2530d6832d06", + "Sounds/ERR/Speech/soldier_1005.acp": "ea3d874f84dd85f09871444c348b1c7f4948fc043c59cba4d3aea8b8eaa8b86e", + "Sounds/ERR/Speech/soldier_1005.acp.meta": "40cbfddfa9937e319d412f3ecb66b75e2c1c88f2823a64e43a81a2939fb9021a", + "Sounds/ERR/Speech/soldier_1005.wav": "3e20728fb61863278738f5366343cddd6fac1b8b114a14867f91ebb5cac547d8", + "Sounds/ERR/Speech/soldier_1005.wav.meta": "e330fc819872b0a97a280a42d936ff75e30d21ea3ac96891988b48ded36af7b0", + "Sounds/ERR/Speech/soldier_1100.acp": "86dc8e90d826947672342f44a6ff8d2fd4a8f014db0b215c0865b3728b14ea88", + "Sounds/ERR/Speech/soldier_1100.acp.meta": "1a41730365335ebfabf6c75ab1c67ecb1d0d6c85db56d1d85f688a780a3ecf15", + "Sounds/ERR/Speech/soldier_1100.wav": "eaf1deb5381f6bac165e364a652920fcf78438c351c564ebe50a216f3f3ba5a0", + "Sounds/ERR/Speech/soldier_1100.wav.meta": "dcd087d3e0bec53abdd4e42218a3bbb234b7ae3cd2da05dcee71a298632a8da9", + "Sounds/ERR/Speech/soldier_1101.acp": "2680131b5364efe39f3dee44ce1605dbc9e064cea9baf8247a8c5b55dcfa8d99", + "Sounds/ERR/Speech/soldier_1101.acp.meta": "4feaa2b8e069ee2e9576d4009329f585b1b5ade9e47816882b78075f4897646f", + "Sounds/ERR/Speech/soldier_1101.wav": "4bca012ec25d8456cd38d26606312f54b480b674365b76a9c9f54e408314570b", + "Sounds/ERR/Speech/soldier_1101.wav.meta": "6ac6bd7a06be3fa35c513137b4584e405c0cd7e32d0c6912f2d7f9b5a3087d36", + "Sounds/ERR/Speech/soldier_1102.acp": "08002dc26a4c07d6bf488d5f7c8c6587787c1755ce374b4053dad582eb2d77cb", + "Sounds/ERR/Speech/soldier_1102.acp.meta": "2133e516f162d6aaa7f0d3a191421964ca6df7b00d0a50fa42ffaba70864bef4", + "Sounds/ERR/Speech/soldier_1102.wav": "1432bb3c9d99910314a84d9773d2afafe4f5fbb143afb291b0deed55d25ee6d0", + "Sounds/ERR/Speech/soldier_1102.wav.meta": "a6ca33938733e22789434db35ca2cdfb0fc4c51716feadf4a28a60ee9d1044b2", + "Sounds/ERR/Speech/soldier_1103.acp": "c93e1e75c272d31107fde86205b859cf505e2acf7d8776fbd81357bc8b3625b9", + "Sounds/ERR/Speech/soldier_1103.acp.meta": "f3d41ab27e932b10d46c3a2aa63f826825403a70640381a089db608c1c00a257", + "Sounds/ERR/Speech/soldier_1103.wav": "c294454907a229d521c2285eec26dbb82f9782f2a7eca764e11713ff63f0e004", + "Sounds/ERR/Speech/soldier_1103.wav.meta": "968d93e9dee2104aee94407604d021d8849a83dc3d115484088e81289654c246", + "Sounds/ERR/Speech/soldier_1104.acp": "cb94ed3c95670f11f78f6470f1f50492fff6d2f0ac94602d054d474d52400cec", + "Sounds/ERR/Speech/soldier_1104.acp.meta": "92d43bf610784953d8d94322b73ae235f7a8aeb83ece72733d795c8034275052", + "Sounds/ERR/Speech/soldier_1104.wav": "952b3d71366c26fc12bdbb9014665bfc0402f30944c22b1b2369d26a93db7104", + "Sounds/ERR/Speech/soldier_1104.wav.meta": "939562214b39250feaa8f6f6c6bd10c3d4e0b4c529f338490a2dc234919c0d31", + "Sounds/ERR/Speech/soldier_1105.acp": "62c5d3d230a8a15cf2a4de193620ccdf83ca9973b550ace4e8edf7cc49f52851", + "Sounds/ERR/Speech/soldier_1105.acp.meta": "6774063562b9c83975bc394dd3c72aa2a0d8001d0990ab8ff870ae2876889f93", + "Sounds/ERR/Speech/soldier_1105.wav": "20e9e82d9897b598497da4722432f83ae03a5e6bf9a1f7a77caab712e3fc3130", + "Sounds/ERR/Speech/soldier_1105.wav.meta": "6f21652352edbd59d1244ce9c2dcd1ad4ab65f022222381d9709c28148121c42", + "Sounds/ERR/Speech/soldier_1200.acp": "c27db60629a41145697e041224cc2dde21c72d6a883fa305c71ec9c5b86bd84e", + "Sounds/ERR/Speech/soldier_1200.acp.meta": "ea228ec869a7a0266f5604266f68c4166abc6cfeaa29180cb3b4351464b71079", + "Sounds/ERR/Speech/soldier_1200.wav": "5a1561e821ef33a574c1f9ef95ccf76e69b832bf0a20bcbbf914760345921859", + "Sounds/ERR/Speech/soldier_1200.wav.meta": "ccf3b62fd2eea460d576fa68863a901eb0025f47b1b76729a4289162d0dfa0c8", + "Sounds/ERR/Speech/soldier_1201.acp": "45f220c5b6bac64db61eebcf54bb52da572f9f8f1ea0872c5af9fd3238c25a4e", + "Sounds/ERR/Speech/soldier_1201.acp.meta": "3be417d66b05e11e0b520af136dfc45c86c17d5e35b56a611efbcf38e0d35003", + "Sounds/ERR/Speech/soldier_1201.wav": "f058f0482cfe4034fdf37d9b596f7ba8172fae1c57aeb387ce153f8041895e45", + "Sounds/ERR/Speech/soldier_1201.wav.meta": "abaebe719eff7e009eb4d0222060280877451126c02154706df6d13e4c5d3e11", + "Sounds/ERR/Speech/soldier_1202.acp": "c08625886d8c6dc405cf96c640c9dafd4510ba5cef2c22b037c8c7b3eb5bea39", + "Sounds/ERR/Speech/soldier_1202.acp.meta": "cf345e968edad1b825dd33b87267b63f770c169250f8c51195bffc3161d396bd", + "Sounds/ERR/Speech/soldier_1202.wav": "c875f4e798ff5e24c3eb3b48bdfa1b8af03de9326a19c671eca86660297ad737", + "Sounds/ERR/Speech/soldier_1202.wav.meta": "dd2d6411abe914bce71c6688a1647c2699303ca248191ec01c6325b366e5d7fb", + "Sounds/ERR/Speech/soldier_1203.acp": "f0237a51ffe0e7d463154d321117a9b19c6914f6ee680ebf07a0ff9ab51fc340", + "Sounds/ERR/Speech/soldier_1203.acp.meta": "0e93332191ac74be950ce8139b96ed6fdfe3ddbe68de8949826dc801d12c97f2", + "Sounds/ERR/Speech/soldier_1203.wav": "6e7857dc96dfb556f011ba89f2f4ea659cfd7b605b88790c69e754d5cc51398a", + "Sounds/ERR/Speech/soldier_1203.wav.meta": "0f564169dc05a95f7b01f64f72bdabf6de9ed3f37a2f44b4751f89b38eb18cd8", + "Sounds/ERR/Speech/soldier_1204.acp": "94dbf98b5e05f1ebf6960495032c46203caaa4440dfb1ffd3beda2679fe6bec5", + "Sounds/ERR/Speech/soldier_1204.acp.meta": "7cc8c61f4bb210c0576fac350d170f8f54a6e55531db6102c1a0fa7cb7a8a809", + "Sounds/ERR/Speech/soldier_1204.wav": "bd170ca015b017114e42078dcc5c49d5626aef17d22e4a12b8282e9ee4908ae6", + "Sounds/ERR/Speech/soldier_1204.wav.meta": "1c6ddb11c22a14d9d498074e2fb2864783f91afc552c4cd671452fa8df483de0", + "Sounds/ERR/Speech/soldier_1205.acp": "47180a3445a265335d682eac6fa51fedca51d76f329adc39b1802092b311118b", + "Sounds/ERR/Speech/soldier_1205.acp.meta": "c34346f4b10149b426ebb4e94db8c29883c9d0e36f2b42d07d41570eb8932554", + "Sounds/ERR/Speech/soldier_1205.wav": "769c457805376e9c0172ddb525ead5f1d8774e15bd1f3f3b218a19f9d77b6883", + "Sounds/ERR/Speech/soldier_1205.wav.meta": "31a2a7314b44afb3f0031376b2ad6df22649e8089bf1a3bbeb64cdc41156cff7", + "Sounds/ERR/Speech/soldier_clear.acp": "f33f03f3d24182a95db7d02058f2dd6ae52098e3b5142a33ede833ee881d54ed", + "Sounds/ERR/Speech/soldier_clear.acp.meta": "7d3643c9de2d81ab0f1b4898e781341c1962bd8505c20882233ef7c40159b23b", + "Sounds/ERR/Speech/soldier_clear.wav": "d6527b8136aa720b721463210420f47de0dbc45acc4e4c390b6a44968c5f0acd", + "Sounds/ERR/Speech/soldier_clear.wav.meta": "d9f9a921a85fe275c6cce649421a19946ff6aec49559796725c3858d9fe9b261", + "Sounds/ERR/Speech/soldier_covering.acp": "7d4109edbd6c20f9e2af0b394fa12e8b3b40fc18bf2b5ac118beebb1fa4a79b1", + "Sounds/ERR/Speech/soldier_covering.acp.meta": "320908bf7decea55b8d8b4a89b30e84e7d96a033d4a9cd1bd84912dce013f0d8", + "Sounds/ERR/Speech/soldier_covering.wav": "f51e0086eaf0eece8b4061711088a413a2dbeae263deab7ea30fb1852dafda69", + "Sounds/ERR/Speech/soldier_covering.wav.meta": "7bdf2d2c5f9cf741bae523e1ab0b9acc99b38ccd1228ebfbcba92f2b9a5cba9d", + "Sounds/ERR/Speech/soldier_engaging.acp": "9f052e87edaf182030edb656821621cdeabbf13d65bc181308357530c9d93a74", + "Sounds/ERR/Speech/soldier_engaging.acp.meta": "9e487fa3746c46b2993f1dfd1f0513f375571728704533674bee62586e25b72b", + "Sounds/ERR/Speech/soldier_engaging.wav": "ac0f2d7d698732e3d7c270186e7aa2ab7e6bd4c908f36b07fb6f66a3cbe75ccf", + "Sounds/ERR/Speech/soldier_engaging.wav.meta": "d571b9ebce196cc209078a83e4bde8f6a5f4b6d28c2945e2b47953ccb6889e97", + "Sounds/ERR/Speech/soldier_moving.acp": "05503ca7af13a7ad03ed2a3aa562cc58504fdfff3148477f8d81b5a01abdf37c", + "Sounds/ERR/Speech/soldier_moving.acp.meta": "a2474c87e4e1587226919dfdbd03739d938803d34f4a4f441889b0d8015513bd", + "Sounds/ERR/Speech/soldier_moving.wav": "a61dda64e6fc2a11eac3e6008ee14b89f360bd67e258dce1191a71d9e2e26fad", + "Sounds/ERR/Speech/soldier_moving.wav.meta": "bd87cd72ccb819584f9da09fb0d6973ffd6eb0bb5572c562978500e2af467217", + "Sounds/ERR/Speech/soldier_no_ammo.acp": "c821c61afb2ddc12d3ecdb552a66d2a9ff89a5258a567ff2a99fed4f45a33520", + "Sounds/ERR/Speech/soldier_no_ammo.acp.meta": "65a27b81a5b437163befd4dc566785a9dda4def1798495ca53c8f768a5d7a73f", + "Sounds/ERR/Speech/soldier_no_ammo.wav": "ffe6ef5fdf30411749e0cb73186e3005b1ce6a52fcb7c836caeb1bca422ed3ed", + "Sounds/ERR/Speech/soldier_no_ammo.wav.meta": "25b5680fd2a313c18e15ce6e0d3f709d78352b93206c22c7881be19b81faddd5", + "Sounds/ERR/Speech/soldier_reloading.acp": "51c5cb464bab6637cf9e3b1880a010e05774d76a92298daf40b1d84970845be7", + "Sounds/ERR/Speech/soldier_reloading.acp.meta": "ca351e809b1ba7c69b066d2c1d0a5d2afdcaa833c1163e6d13a0396437e98cf6", + "Sounds/ERR/Speech/soldier_reloading.wav": "15b2749f79bc73fd0784bcd6e6076e1bc50da835e0c434cd43bd185d0735c732", + "Sounds/ERR/Speech/soldier_reloading.wav.meta": "161c9ebee1d0496c7aa9501d00eba646094bf1ce89cda4efde6e3a0229a49e4f", + "Sounds/ERR/Speech/soldier_target_down.acp": "77acc89c4ef0b912b969a2e5f6c41e071e04d10cfe89666fbc1296878dab62bf", + "Sounds/ERR/Speech/soldier_target_down.acp.meta": "fe456d354ace93b0f2261de483e86ccc92991011b1738c5703d6d7bc0daa49a6", + "Sounds/ERR/Speech/soldier_target_down.wav": "e2e60e8b83a24a548c90b84c5e1137adb7e792cf1d4ba6232ddfb1012fa78892", + "Sounds/ERR/Speech/soldier_target_down.wav.meta": "064588b86589ac9437fbccafedeefae04bec3331dd8a229d1c6d27b5e524a9e9", + "Sounds/ERR/Speech/soldier_target_lost.acp": "5ffd3ff57550296274e9e93fb64efdf2fb06a51161d6deb221c1f3eb408d1459", + "Sounds/ERR/Speech/soldier_target_lost.acp.meta": "366a3c9e20f27c0f73bdff5827576df8924e99241061f933e72bd342e5bc7119", + "Sounds/ERR/Speech/soldier_target_lost.wav": "bbcf454d48adea47478d410b1baf14df3a5d018237272e70ae33ee62823f822f", + "Sounds/ERR/Speech/soldier_target_lost.wav.meta": "d1ac64242280521a7e40de51ae32a007878d7801401020e7a074a48e0f8ce62e", + "Sounds/ERR/Speech/soldier_under_fire.acp": "5af1c949d4662c2f33320165d2efdbd69cb183af1101aa246fe538bf0d91a33e", + "Sounds/ERR/Speech/soldier_under_fire.acp.meta": "aa7799e8a790539166a1d3a9c691416e7b2f6589d1674f5cf4b3e47523f15259", + "Sounds/ERR/Speech/soldier_under_fire.wav": "e4bd5e69fda289593fc6e6b8c2fae9a271a10d0a9bae877f18ba02dbbf75d1fc", + "Sounds/ERR/Speech/soldier_under_fire.wav.meta": "25a988c31e4fc3ae6540920df3d4548307a4a1e3b96b1303e9b7bdb4ac5eea27", + "Sounds/ERR/Speech/welcome.acp": "f8a7b6cdd08b57b4b227a2d5b480a6c76857d7fc8ace3434478aec01c0de5a83", + "Sounds/ERR/Speech/welcome.acp.meta": "d3ac98b02c0725d347b30d0ac7586cb22904d46b65a145e4a1131222484a6929", + "Sounds/ERR/Speech/welcome.wav": "01de068469bd6746dba7634fb6b5b85b150621d3359c17fd01bcb916b34b1720", + "Sounds/ERR/Speech/welcome.wav.meta": "bf33edad44bbb04df852501154f08a9a9900ce503248abc698127a51e9eec934", + "UI/Textures/ERR/SiteMarkers.edds": "611ec6c68c2456c2af017c47135134d73122461017b315f64ed7ca9891f20c21", + "UI/Textures/ERR/SiteMarkers.edds.meta": "90f40b38e52a79951b72da2960e30887d5ee8bbcefbada0c0ac950c1bfcf847f", + "UI/Textures/ERR/SiteMarkers.imageset": "3f947d03b3492ada541032539cdb3f34a03d68ae83c0ef8796dc7fd091b5911d", + "UI/Textures/ERR/SiteMarkers.imageset.meta": "1dc5285abd0062af288fb40b2f22b5b7c3925cf7270a096862335db250ac1453", + "UI/Textures/ERR/SiteMarkers.png": "76b472982234bd27050a9430e6a53f4c14fa38f7388db3706ebef506eab4e660", + "UI/layouts/ERR/AdminMenu.layout": "30393ca0dca95fd81f578e805dd035ded2a5ce07df932e5ba6e29e07a82f1474", + "UI/layouts/ERR/AdminMenu.layout.meta": "9deeece996f43b1f1fed6b5ec89279645c7b6424250200a42580cc088142e9bf", + "UI/layouts/ERR/AdminValue.layout": "cd811af6d2fb187f01c74e20ea07ad85669546b0ad70efae2ce52921ce26cbca", + "UI/layouts/ERR/AdminValue.layout.meta": "56b3d2335db400c1308e07c4a35d278b23ef32013dfd6dc82951866327428d08", + "UI/layouts/ERR/ContentRow.layout": "7bf19d12b1b5e2c165f8671e92ae9227b54b4d1e551de94fa67bd54d3a66fddb", + "UI/layouts/ERR/ContentRow.layout.meta": "8c4bc13b41e7aee38e0ca640a97813ed1a6964a00e2cff9e1fe4ebd71fc2fdc6", + "UI/layouts/ERR/ItemRow.layout": "3c7ae3acdf2fad0ba661a1152ea319392668d774adc09a2a8b61e9a0319db312", + "UI/layouts/ERR/ItemRow.layout.meta": "33eaef9c403ea3a030e58ec17f78e46af457048243571ad5856fff04101fb60b", + "UI/layouts/ERR/ItemWeightRow.layout": "f71a5a0bd8d28191eca69154d05191179cab5187d573f0f72a8bbf11f06f4f8d", + "UI/layouts/ERR/ItemWeightRow.layout.meta": "eb4b28587abdf6100092fd6eee1695663fa6e1548d5e53017173c4a5f7320240", + "UI/layouts/ERR/PauseModsButton.layout": "d21d436291e2c1b262e33dc228b0d60a1d188dc9e85cfda6d2373f8281431b79", + "UI/layouts/ERR/PauseModsButton.layout.meta": "9ed6adabd8f53eb9a562d7186789876bba5c4202155ca894c1af866ca47354f3", + "UI/layouts/ERR/PreparationFailure.layout": "b7c4a2e6aa2be0992b478bb4f969f80355753573fffbc15be44670f3b136ea2e", + "UI/layouts/ERR/PreparationFailure.layout.meta": "17ca2c9a12f691680883cec368ff06f511c996e5da5c25498f5f0955887867b0", + "UI/layouts/ERR/PreparationStatus.layout": "ec3369f4030e593d34043e70a311b0963606cf024cb452648671556f25f5b52a", + "UI/layouts/ERR/PreparationStatus.layout.meta": "75b12176a443bb911fc4ad446982d762201fda42ed38736b79bc5439fca31ccc", + "UI/layouts/ERR/RoundResults.layout": "8550ebc009024f619827a43fd766aff8b7fbf8bc87ef7593db0fd7f4d778c615", + "UI/layouts/ERR/RoundResults.layout.meta": "7509e050b3910ee5730dd25c60aacf405110e943f4ab46e3fc2186b3b15a3cf9", + "UI/layouts/ERRMap/ObjectiveMapElement.layout": "82d9ae77f076f945583791dfa0b01f1c925e6ff8aaebcf382fd56089fe61a115", + "UI/layouts/ERRMap/ObjectiveMapElement.layout.meta": "8691fe2eaf46568bca4a9f8128b247a8da810bb87a5546aa7ca3334e740270d6", + "UI/layouts/ERRMap/SharedMapRenderTarget.layout": "aef5d565301046ae902033ec4eb4799ff1bdd9a37bc507898781d8790f04fc2a", + "UI/layouts/ERRMap/SharedMapRenderTarget.layout.meta": "5c846445cc089e2e08899ba703059d4adb805ff30ab5a16409a3cd59718cbd54", + "Worlds/ERR_Everon.ent": "22324bc7eb0d80dec8a1f3bd61a9df9201b72f749f4e751766b0c9d0b7d46b87", + "Worlds/ERR_Everon.ent.meta": "19d1903ca72baa326b4724a6791d0da1104a1e53f3f31dc1ca41a856efd68e83", + "Worlds/ERR_Everon_Layers/default.layer": "6bcb7fbb27b6282719dae8a37486e518d4cbaea385f2ea9af1918b36bb28b175", + "addon.gproj": "73e973a1f1c5910393e16f86a3a40d792031bb2fa3fc7f4dd87a06a16c3e34a4" + }, + "addon_links": { + "ArmaReforger": "/home/jakub/.local/share/Steam/steamapps/common/Arma Reforger/addons/data", + "ERRI_1337C0DE5DABBEEF": "/home/jakub/.local/share/Steam/steamapps/compatdata/1874880/pfx/drive_c/users/steamuser/Documents/My Games/ArmaReforger/addons/RHS-ContentPack01_1337C0DE5DABBEEF", + "ERRI_595F2BF2F44836FB": "/home/jakub/.local/share/Steam/steamapps/compatdata/1874880/pfx/drive_c/users/steamuser/Documents/My Games/ArmaReforger/addons/RHS-StatusQuo_595F2BF2F44836FB", + "ERRI_5E389BB9F58B79A6": "/home/jakub/.local/share/Steam/steamapps/compatdata/1874880/pfx/drive_c/users/steamuser/Documents/My Games/ArmaReforger/addons/SpaceCore_5E389BB9F58B79A6", + "ERRI_5E524E4FEECCA92B": "/home/jakub/.local/share/Steam/steamapps/compatdata/1874880/pfx/drive_c/users/steamuser/Documents/My Games/ArmaReforger/addons/BMP-1IFV_5E524E4FEECCA92B", + "ERRI_629B2BA37EFFD577": "/home/jakub/.local/share/Steam/steamapps/compatdata/1874880/pfx/drive_c/users/steamuser/Documents/My Games/ArmaReforger/addons/WCS_Armaments_629B2BA37EFFD577", + "ERRI_65930CB4CD0237B2": "/home/jakub/.local/share/Steam/steamapps/compatdata/1874880/pfx/drive_c/users/steamuser/Documents/My Games/ArmaReforger/addons/ParachuteFramework_65930CB4CD0237B2", + "ERRI_BADC0DEDABBEDA5E": "/home/jakub/.local/share/Steam/steamapps/compatdata/1874880/pfx/drive_c/users/steamuser/Documents/My Games/ArmaReforger/addons/RHS-ContentPack02_BADC0DEDABBEDA5E" + }, + "helper_sha256": "17058ceb089fa58176e853a2c83c5c081ce6c61df368cdb1a845cfc2054971eb" +} diff --git a/tests/test_intel_registration.py b/tests/test_intel_registration.py index 6c91d9c4..e16e68f9 100644 --- a/tests/test_intel_registration.py +++ b/tests/test_intel_registration.py @@ -91,7 +91,7 @@ struct Recon{SCR_AIGroup owned=nullptr;bool Owns(SCR_AIGroup group){return group struct BodyService:GroupService{void RegisterGroup(SCR_AIGroup g,Sampler& s){assert(s.Bound()&&s.group==g);GroupService::RegisterGroup(g);}}; struct Reporting{int initializations=0;void Initialize(int id,float now){assert(id>0&&now==10);initializations++;}}; struct Unit{Reporting AmmoReporting;string HomeId,ForceSourceId;bool ReservedForSupport=false;bool HomeGuard=false;float NextStatus=0;Sampler StatusSampler;int Id=0;SCR_AIGroup Group=nullptr;struct Utility* Utility=nullptr;float NextReport=0;};using ERR_HQUnit=Unit*; -struct Roadblocks{SCR_AIGroup owned=nullptr;bool Contains(SCR_AIGroup g){return g&&g==owned;}}; +struct Roadblocks{SCR_AIGroup owned=nullptr,local=nullptr;bool Contains(SCR_AIGroup g){return g&&g==owned;}bool LocalOnly(SCR_AIGroup g){return g&&g==local;}}; struct HQ{void BindSpecialSkills(SCR_AIGroup){}void AuditGroup(ERR_HQUnit){}Mode* m_Mode;GroupService m_Equipment;BodyService m_Bodies;int m_NextId=0;Array m_Units;Mortars* m_Mortars=nullptr;Scouts* m_Scouts=nullptr;Recon* m_Recon=nullptr;Recon* m_PlaneRecon=nullptr;Airfield* m_Airfield=nullptr;Scouts* m_Hunters=nullptr;Scouts* m_Towns=nullptr;Roadblocks* m_Roadblocks=nullptr; '''+hqbind+hqregister+r''' }; @@ -153,6 +153,20 @@ int main(){ assert(hq.m_Equipment.ids.back()==1&&hq.m_Equipment.fits.back()); int checkpointUnits=hq.m_Units.Count(),checkpointFits=hq.m_Equipment.ids.Count(); hq.RegisterGroup(&checkpoint);assert(hq.m_Units.Count()==checkpointUnits&&hq.m_Equipment.ids.Count()==checkpointFits); + // The parallel local pair keeps equipment/skills but never enters HQ, + // receives a radio allocation, reserves an HQ ID, or binds an HQ body roster. + Group localCheckpoint;posts.local=&localCheckpoint; + int beforeLocalUnits=hq.m_Units.Count(),beforeLocalId=hq.m_NextId,beforeLocalBodies=hq.m_Bodies.registrations; + int beforeLocalEquipment=hq.m_Equipment.registrations; + for(int repeat=0;repeat<5;repeat++){ + hq.RegisterGroup(&localCheckpoint); + assert(hq.m_Units.Count()==beforeLocalUnits&&hq.m_NextId==beforeLocalId); + assert(hq.m_Bodies.registrations==beforeLocalBodies); + assert(hq.m_Equipment.ids.back()==0&&!hq.m_Equipment.fits.back()); + } + assert(hq.m_Equipment.registrations==beforeLocalEquipment+1); + assert(!posts.Contains(&localCheckpoint)&&posts.LocalOnly(&localCheckpoint)); + assert(posts.Contains(&checkpoint)&&!posts.LocalOnly(&checkpoint)); Group ordinaryAgain;hq.RegisterGroup(&ordinaryAgain);assert(hq.m_Equipment.ids.back()==8); // ordinary fitting remains distributed Group town;Scouts towns;towns.owned=&town;hq.m_Towns=&towns;hq.RegisterGroup(&town); assert(hq.m_Equipment.ids.back()==1&&hq.m_Equipment.fits.back()&&!hq.m_Units.back()->ReservedForSupport&&!hq.m_Units.back()->HomeGuard); diff --git a/tests/test_roadblock_background.py b/tests/test_roadblock_background.py index ec8cbfaf..9f3ce639 100644 --- a/tests/test_roadblock_background.py +++ b/tests/test_roadblock_background.py @@ -98,15 +98,17 @@ assert 'if (!PlayersClear() || m_Mode.Forces().Count() >= 250 ||' in body(p,'pro assert 'if (!PlayersClear() || m_Mode.Forces().Count() >= 250) { CancelPost(); return; }' in body(p,'protected void BuildPost(') print('PASS: actual roadblock scheduler yields initial deadline/attempt cap to background, budgets samples, pauses empty/full worlds, completes 30 after unlock, preserves safety and never replenishes losses; teardown cancels work') -# Run actual staged physical creation and rollback, with native entities doubled. -s='\n'.join(body(p,sig) for sig in ('protected bool SpawnPost(', 'protected void CancelPost()', 'protected bool ShareProps()', 'protected void BuildPost()')) +# Run actual staged physical creation/rollback. Opaque native boundaries are doubled. +s='\n'.join(body(p,sig) for sig in ('bool LocalOnly(', 'protected void Rollback(', 'protected bool SpawnPost(', 'protected void CancelPost()', 'protected bool ShareProps()', 'protected void BuildPost()')) s=s.replace('protected ', '').replace('array positions','Array& positions').replace('array covers','Array& covers').replace('ERR_RoadblockProp prop', 'Prop prop') +s=s.replace('array spawned', 'Array& spawned').replace('SCR_AIGroup group', 'Node* group').replace('SCR_AIGroup guardGroup', 'Node* guardGroup') s=s.replace('SCR_AIGroup.Cast','Node::Cast').replace('AIWaypoint.Cast','Node::Cast').replace('IEntity actor','Node* actor').replace('IEntity cover','Node* cover') -s=s.replace('foreach (IEntity ownedEntity : m_BuildSpawned)','for (Node* ownedEntity : m_BuildSpawned)').replace('vector point','int point').replace('vector coverPosition','int coverPosition') +s=s.replace('foreach (IEntity ownedEntity : m_BuildSpawned)','for (Node* ownedEntity : m_BuildSpawned)').replace('foreach (IEntity entity : spawned)', 'for (Node* entity : spawned)').replace('vector point','int point').replace('vector coverPosition','int coverPosition') s=s.replace('foreach (ERR_RoadblockProp plannedProp : covers)', 'for (Prop plannedProp : covers)') -s=s.replace('m_Forward.VectorToAngles()', '0').replace('m_Positions.Count().ToString()', 'std::to_string(m_Positions.Count())') +s=s.replace('m_Forward.VectorToAngles()', '0').replace('m_PostSerial.ToString()', 'std::to_string(m_PostSerial)') +s=s.replace('ERR_ForceRecord responders', 'Record* responders').replace('responders.Id', 'responders->Id') s=s.replace('GetGame().GetWorld().GetWorldTime()', 'Now()').replace('System.GetTickCount()', 'Now()').replace('null','nullptr') -s=s.replace('m_BuildGroup.', 'm_BuildGroup->').replace('m_BuildHold.', 'm_BuildHold->') +for name in ('m_BuildGroup','m_BuildHold','m_BuildLocalGroup','m_BuildLocalHold','guardGroup'):s=s.replace(name+'.',name+'->') s=s.replace('IEntity entity', 'Node* entity').replace('RplComponent component;', 'Replica* component=nullptr;').replace('RplComponent component =', 'Replica* component =') s=s.replace('RplComponent.Cast', 'Replica::Cast').replace('FindComponent(RplComponent)', 'FindComponent()').replace('RplId.Invalid()', '-1') s=s.replace('entity.FindComponent', 'entity->FindComponent').replace('m_BuildSpawned[i].FindComponent', 'm_BuildSpawned[i]->FindComponent').replace('component.', 'component->') @@ -116,58 +118,100 @@ run(r''' #include #include #include +#include +#include +#include +#include using string=std::string; int Now(){return 100;} templatevoid PrintFormat(T...){} -templatestruct Array:std::vector{using std::vector::vector;using std::vector::operator=;int Count(){return this->size();}void Clear(){this->clear();}void Copy(Array&other){*this=other;}void Insert(T value){this->push_back(value);}}; +templatestruct Array:std::vector{using std::vector::vector;using std::vector::operator=;int Count(){return this->size();}void Clear(){this->clear();}void Copy(Array&other){*this=other;}void Insert(T value){this->push_back(value);}bool Contains(T value){return std::find(this->begin(),this->end(),value)!=this->end();}}; struct Replica{int id=1;bool streaming=true;static Replica* Cast(Replica*r){return r;}int Id(){return id;}void EnableStreaming(bool value){streaming=value;}}; -struct Node{Replica replica;bool missing=false;Replica* FindComponent(){return missing?nullptr:&replica;}static Node* Cast(Node*n){return n;}void SetFaction(int){}void SetSpawnImmediately(bool){}void SetDeleteWhenEmpty(bool){}void SetPermanentLOD(int){}bool AddAIEntityToGroup(Node*){return true;}void SetCompletionRadius(int r){assert(r==25);}void AddWaypoint(Node*){}void ActivateAI(){}}; -namespace ERR_Actors{int calls=0,failAt=0;Array all;Node* Spawn(string,int,int=0){calls++;if(calls==failAt)return nullptr;auto*n=new Node;all.Insert(n);return n;}bool SetFaction(Node*,int){return true;}} +struct Node{Replica replica;int position=0,deleted=0,activated=0;bool missing=false,acceptMember=true;Arraymembers,holds; + Replica* FindComponent(){return missing?nullptr:&replica;}static Node* Cast(Node*n){return n;}void SetFaction(int){}void SetSpawnImmediately(bool){}void SetDeleteWhenEmpty(bool){}void SetPermanentLOD(int){} + bool AddAIEntityToGroup(Node*n){if(!acceptMember)return false;members.Insert(n);return true;}void SetCompletionRadius(int r){assert(r==25);}void AddWaypoint(Node*n){holds.Insert(n);}void ActivateAI(){activated++;}}; +namespace ERR_Actors{int calls=0,failAt=0,deletes=0;bool faction=true;Arrayall; + Node* Spawn(string,int position,int=0){calls++;if(calls==failAt)return nullptr;auto*n=new Node;n->position=position;all.Insert(n);return n;} + bool SetFaction(Node*,int){return faction;}void DeleteSpawned(Node*n){if(!n)return;assert(!n->deleted);n->deleted++;deletes++;}} namespace ERR_Resources{string DefendWaypoint(){return "hold";}} namespace ERR_ForceKind{int CHECKPOINT=1;} -struct Ledger{int count=0,registered=0;bool accept=true;int Count(){return count;}bool Register(string,int,int,int strength,void*,Node*,int){assert(strength==4||strength==8);if(!accept)return false;registered++;return true;}}; -struct Mode{Ledger ledger;int owned=0,groups=0;Ledger& Forces(){return ledger;}int EnemyFaction(){return 1;}void Own(Node*n){assert(n);owned++;}void RegisterGroup(Node*){groups++;}}; +struct Record{int Id=0,strength=0;Node*group=nullptr;}; +struct Ledger{int count=0,attempts=0,failAt=0,unregistered=0,next=0;std::maplive;std::setsources; + int Count(){return count+live.size();} + Record* Register(string id,int,int,int strength,void*,Node*group,int){assert(strength==2&&group&&group->members.Count()==2);attempts++;if(attempts==failAt)return nullptr;assert(sources.insert(id).second);int n=++next;live[n]={n,strength,group};return &live[n];} + void Unregister(int id){assert(live.erase(id)==1);unregistered++;}}; +struct Mode{Ledger ledger;int owned=0,groups=0,hqGroups=0,localGroups=0;ArrayownedNodes,published;std::functionlocal; + Ledger& Forces(){return ledger;}int EnemyFaction(){return 1;}void Own(Node*n){assert(n&&!n->deleted&&!ownedNodes.Contains(n));owned++;ownedNodes.Insert(n);} + void RegisterGroup(Node*n){assert(n&&ownedNodes.Contains(n)&&n->members.Count()==2&&n->holds.Count()==1);groups++;published.Insert(n);if(local(n))localGroups++;else hqGroups++;}}; struct Placement{bool clear=true;bool Clear(int,void*){return clear;}}; -struct Mining{int registered=0;void Register(Node*,Node*,int){registered++;}}; +struct Mining{int registered=0;Node*group=nullptr;Node*hold=nullptr;void Register(Node*g,Node*h,int){registered++;group=g;hold=h;}}; struct Prop{string Prefab="cover";int Position=5,Angles=0;}; namespace ERR_RoadblockRules{'''+rule+r'''} struct Build{ - bool m_Large=false;int m_SmallPlaced=0,m_LargePlaced=0; - Mode m_Mode;Placement m_Placement;Mining m_Mining;Node* m_BuildGroup=nullptr;Node* m_BuildHold=nullptr; - Array m_BuildPositions,m_Positions;Arraym_BuildCovers;Arraym_BuildSpawned,m_Groups;Arraym_Roster={"one","two"}; - int m_BuildActors=0,m_BuildCoverCount=0,m_Centre=10,m_Right=0,m_NextSearch=0,rolledBack=0;string COVER="cover";bool playersClear=true,coversClear=true; + bool m_Large=false;int m_SmallPlaced=0,m_LargePlaced=0,m_PostSerial=0; + Mode m_Mode;Placement m_Placement;Mining m_Mining;Node* m_BuildGroup=nullptr;Node* m_BuildHold=nullptr;Node* m_BuildLocalGroup=nullptr;Node* m_BuildLocalHold=nullptr; + Arraym_BuildPositions,m_Positions;Arraym_BuildCovers;Arraym_BuildSpawned,m_Groups,m_LocalGroups;Arraym_Roster={"one","two"}; + int m_BuildActors=0,m_BuildCoverCount=0,m_Centre=10,m_Right=0,m_NextSearch=0;string COVER="cover";bool playersClear=true,coversClear=true; + Build(){m_Mode.local=[this](Node*g){return LocalOnly(g);};} bool PlayersClear(){return playersClear;}bool CoverClear(Prop){return coversClear;} - void Rollback(Array&entities,Node*group){rolledBack+=entities.Count()+(group?1:0);} '''+s+r''' }; int main(){for(bool large:{false,true}){ - const int guards=ERR_RoadblockRules::GuardCount(large);Array positions(guards,1);Arraycovers(ERR_RoadblockRules::PropCount(large));const int pieces=guards+covers.Count()+1; + const int guards=ERR_RoadblockRules::GuardCount(large);assert(guards==4); + Arraypositions={10,20,30,40};Arraycovers(ERR_RoadblockRules::PropCount(large)); + const int pieces=guards+covers.Count()+2; // actors, props and two holds; neither group is in this array + const int callbacks=pieces+1; // local group has its own callback; HQ group is created by SpawnPost + auto empty=[&](Build&b){assert(!b.m_BuildGroup&&!b.m_BuildLocalGroup&&!b.m_BuildHold&&!b.m_BuildLocalHold&&b.m_BuildSpawned.Count()==0&&b.m_Positions.Count()==0&&b.m_Groups.Count()==0&&b.m_LocalGroups.Count()==0&&b.m_Mode.owned==0&&b.m_Mode.groups==0&&b.m_Mode.ledger.live.empty());}; + auto finish=[&](Build&b){for(int i=0;ireplica.streaming); - b.BuildPost();for(int i=guards;ireplica.streaming);assert(!b.m_BuildGroup&&b.m_Positions.Count()==1&&b.m_Groups.Count()==1&&b.m_Mode.owned==pieces+1&&b.m_Mode.groups==1&&b.m_Mining.registered==1&&b.m_NextSearch==2100); + Node*hq=b.m_BuildGroup;for(int piece=0;piecemembers.Count()==2&&local->members.Count()==2);assert(hq->members[0]==shared[0]&&hq->members[1]==shared[2]);assert(local->members[0]==shared[1]&&local->members[1]==shared[3]); + assert(hold!=localHold&&hold->position==positions[0]&&localHold->position==positions[1]); + for(int i=guards;ireplica.streaming); + int commitCalls=ERR_Actors::calls;b.BuildPost();assert(ERR_Actors::calls==commitCalls); + for(int i=guards;ireplica.streaming); + assert(!b.m_BuildGroup&&!b.m_BuildLocalGroup&&b.m_Positions.Count()==1&&b.m_Groups.Count()==1&&b.m_LocalGroups.Count()==1&&b.m_Mode.owned==pieces+2&&b.m_Mode.groups==2&&b.m_Mode.hqGroups==1&&b.m_Mode.localGroups==1); + assert(b.m_Mode.published[0]==hq&&b.m_Mode.published[1]==local&&b.LocalOnly(local)&&!b.LocalOnly(hq)&&!b.LocalOnly(nullptr)); + assert(hq->holds[0]==hold&&local->holds[0]==localHold&&hq->activated==1&&local->activated==1); + assert(b.m_Mining.registered==1&&b.m_Mining.group==hq&&b.m_Mining.hold==hold&&b.m_NextSearch==2100); + assert(b.m_Mode.ledger.live.size()==2&&b.m_Mode.ledger.sources.count("roadblock-1")&&b.m_Mode.ledger.sources.count("roadblock-1-local")); assert(b.m_SmallPlaced==(large?0:1)&&b.m_LargePlaced==(large?1:0)); } - // A server-only or unregistered prop must never count as a complete roadblock. + // Unreplicated props cannot consume a quota or publish either guard pair. for(int bad=guards;badmissing=missing;spawned[bad]->replica.id=-1; - b.BuildPost();assert(b.m_Positions.Count()==0&&!b.m_BuildGroup&&b.m_Mode.owned==0&&b.rolledBack==pieces+1); - for(int i=guards;ireplica.streaming); // reject before changing any streaming rule + b.BuildPost();empty(b);assert(ERR_Actors::deletes-deleted==pieces+2); + for(int i=guards;ireplica.streaming); } - // Player approaches at any stage: no registered post and every owned piece removed. - for(int stage=0;stage<=pieces;stage++){Build b;b.m_Large=large;assert(b.SpawnPost(positions,covers));for(int i=0;iacceptMember=false; + b.BuildPost();empty(b);ERR_Actors::faction=true; + } + for(int stage=0;stage<=callbacks;stage++){Build b;b.m_Large=large;b.SpawnPost(positions,covers);for(int i=0;i covers', 'Array& covers') s=s.replace('ResourceName ', 'string ').replace('vector ', 'Vec ').replace('ERR_Actors.Ground','Ground').replace('new ERR_RoadblockProp','new Prop') shoulder = re.search(r'm_Shoulder = ([^;]+);', body(p, 'protected bool Candidate('))[1] @@ -44,12 +44,25 @@ int main(){ if(p->Prefab=="barrier")barriers.push_back(along); if(p->Prefab=="sign")assert(dot(p->Forward,l.m_Forward)*along>0); // both approaches face outward // Guard starting volumes cannot intersect any prop in the planned post. - for(int side:{-1,1})for(int row=0;row<(large?4:2);row++){ + for(int side:{-1,1})for(int row=0;row<2;row++){ Vec guard=l.GuardPosition(side,row); Vec rel=guard-p->Position; assert(std::abs(dot(rel,p->Right))>p->HalfWidth+.6 || std::abs(dot(rel,p->Forward))>p->HalfDepth+.6); } } + // Four distinct slots for both sizes: two on each shoulder. Large posts + // retain their wider approach footprint with guards at -9m and +9m. + assert(l.GuardCount(large)==4); + std::vector guards; + for(int side:{-1,1})for(int row=0;row<2;row++){ + Vec guard=l.GuardPosition(side,row);Vec rel=guard-l.m_Centre; + assert(std::abs(dot(rel,l.m_Right)-side*(l.m_Shoulder+1.5))<1e-6); + double expectedAlong=large?(row*18-9):side*(row*2-2.5); + assert(std::abs(dot(rel,l.m_Forward)-expectedAlong)<1e-6); + for(Vec other:guards)assert(dot(guard-other,guard-other)>1.); + guards.push_back(guard); + } + assert(guards.size()==4); assert(counts["cover"]==(large?8:4)&&counts["barrier"]==(large?4:2)&&counts["sign"]==2&&counts.size()==3); assert(barriers.size()==(large?4:2)); if(!large)assert(std::abs(barriers[0]-barriers[1])>11.9); diff --git a/ui/admin_menu/pages/CheckpointsPage.layout.in b/ui/admin_menu/pages/CheckpointsPage.layout.in index 982b76b0..f36f3262 100644 --- a/ui/admin_menu/pages/CheckpointsPage.layout.in +++ b/ui/admin_menu/pages/CheckpointsPage.layout.in @@ -1,5 +1,5 @@ FrameWidgetClass { "Is Visible" {{VISIBLE_CheckpointsPage}} Name "CheckpointsPage" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 220 OffsetLeft 220 PositionY 160 OffsetTop 160 SizeX 1000 OffsetRight -1220 SizeY 532 OffsetBottom -692 } { -TextWidgetClass { Name "CheckpointsHelp" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 6 OffsetTop 6 SizeX 936 OffsetRight -964 SizeY 50 OffsetBottom -56 } Color {{COLOR_TEXT}} Text "Set counts separately for small and main-road checkpoints. Changes apply next round. Road width determines the type; unsuitable locations are skipped." "Font Size" {{SIZE_INTRO}} "Min Font Size" {{SIZE_INTRO}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } } +TextWidgetClass { Name "CheckpointsHelp" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 6 OffsetTop 6 SizeX 936 OffsetRight -964 SizeY 50 OffsetBottom -56 } Color {{COLOR_TEXT}} Text "Both sizes have four guards: two HQ responders and two local sentries outside HQ. Counts apply next round; road width selects the type." "Font Size" {{SIZE_INTRO}} "Min Font Size" {{SIZE_INTRO}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } } TextWidgetClass { Name "Label_roadblockCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 66 OffsetTop 66 SizeX 456 OffsetRight -484 SizeY 26 OffsetBottom -92 } Color {{COLOR_TEXT}} Text "Small checkpoints (0-30; 0 off)" "Font Size" {{SIZE_LABEL}} "Min Font Size" {{SIZE_LABEL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } } ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" { Name "roadblockCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 96 OffsetTop 96 SizeX 130 OffsetRight -158 SizeY 38 OffsetBottom -134 } components { SCR_EditBoxComponent "{547290FFBD5B33E9}" { m_sLabel "" } } } ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "Apply_roadblockCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 170 OffsetLeft 170 PositionY 96 OffsetTop 96 SizeX 110 OffsetRight -280 SizeY 38 OffsetBottom -134 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Apply" } } } @@ -9,7 +9,7 @@ TextWidgetClass { Name "Label_largeRoadblockCount" Slot FrameWidgetSlot { Anchor ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" { Name "largeRoadblockCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 96 OffsetTop 96 SizeX 130 OffsetRight -638 SizeY 38 OffsetBottom -134 } components { SCR_EditBoxComponent "{547290FFBD5B33E9}" { m_sLabel "" } } } ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "Apply_largeRoadblockCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 650 OffsetLeft 650 PositionY 96 OffsetTop 96 SizeX 110 OffsetRight -760 SizeY 38 OffsetBottom -134 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Apply" } } } TextWidgetClass { Name "Saved_largeRoadblockCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 136 OffsetTop 136 SizeX 456 OffsetRight -964 SizeY 22 OffsetBottom -158 } Color {{COLOR_TEXT}} Text "Waiting for saved value" "Font Size" {{SIZE_CAPTION}} "Min Font Size" {{SIZE_CAPTION}} FontProperties FontProperties { Font "{{FONT}}" } } -TextWidgetClass { Name "Help_largeRoadblockCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 160 OffsetTop 160 SizeX 456 OffsetRight -964 SizeY 32 OffsetBottom -192 } Color {{COLOR_TEXT}} Text "Eight guards, extended cover and approach barriers." "Font Size" {{SIZE_CAPTION_SMALL}} "Min Font Size" {{SIZE_CAPTION_SMALL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } } +TextWidgetClass { Name "Help_largeRoadblockCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 160 OffsetTop 160 SizeX 456 OffsetRight -964 SizeY 32 OffsetBottom -192 } Color {{COLOR_TEXT}} Text "Four guards, extended cover and approach barriers." "Font Size" {{SIZE_CAPTION_SMALL}} "Min Font Size" {{SIZE_CAPTION_SMALL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } } TextWidgetClass { Name "Label_mainRoadWidthMetres" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 202 OffsetTop 202 SizeX 456 OffsetRight -484 SizeY 26 OffsetBottom -228 } Color {{COLOR_TEXT}} Text "Main-road minimum width (5-12 m)" "Font Size" {{SIZE_LABEL}} "Min Font Size" {{SIZE_LABEL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } } ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" { Name "mainRoadWidthMetres" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 232 OffsetTop 232 SizeX 130 OffsetRight -158 SizeY 38 OffsetBottom -270 } components { SCR_EditBoxComponent "{547290FFBD5B33E9}" { m_sLabel "" } } } ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "Apply_mainRoadWidthMetres" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 170 OffsetLeft 170 PositionY 232 OffsetTop 232 SizeX 110 OffsetRight -280 SizeY 38 OffsetBottom -270 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Apply" } } }