Capture current mission, AI, map and administration development

Include the current addon, terrain integrations, tools, regression tests and recorded development evidence.
This commit is contained in:
2026-10-13 22:52:53 +02:00
parent a951a96edc
commit 6a667d8deb
8104 changed files with 2124945 additions and 2061 deletions
@@ -0,0 +1,19 @@
check: /tmp/err-policy-s_z0seyy/check.cpp:77: int main(): Assertion `pending.CloseStandard()&&pending.m_Menu==&menu&&pending.m_CloseRequested&&map.open' failed.
Traceback (most recent call last):
File "/tmp/erri-objective-map-native-proposal/tests/test_native_objective_map_probe.py", line 14, in <module>
run('''#include <cassert>
~~~^^^^^^^^^^^^^^^^^^^^^^
#include <set>
^^^^^^^^^^^^^^
...<36 lines>...
}
^
''')
^^^^
File "/home/jakub/devel/escapistsrereintroduced/tests/policy_harness.py", line 14, in run
subprocess.run([str(p/'check')],check=True)
~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.14/subprocess.py", line 578, in run
raise CalledProcessError(retcode, process.args,
output=stdout, stderr=stderr)
subprocess.CalledProcessError: Command '['/tmp/err-policy-s_z0seyy/check']' died with <Signals.SIGABRT: 6>.
@@ -0,0 +1,19 @@
check: /tmp/erri-objective-map-proposal/scratch/err-policy-slc_aepg/check.cpp:121: int main(): Assertion `first&&first->visible&&first->x==300&&first->y==775&&first->parent==&map.frame' failed.
Traceback (most recent call last):
File "/tmp/erri-objective-map-proposal/tests/test_objective_map_presentation.py", line 23, in <module>
run(r'''
~~~^^^^^
#include <cassert>
^^^^^^^^^^^^^^^^^^
...<62 lines>...
}
^
''')
^^^^
File "/home/jakub/devel/escapistsrereintroduced/tests/policy_harness.py", line 14, in run
subprocess.run([str(p/'check')],check=True)
~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.14/subprocess.py", line 578, in run
raise CalledProcessError(retcode, process.args,
output=stdout, stderr=stderr)
subprocess.CalledProcessError: Command '['/tmp/erri-objective-map-proposal/scratch/err-policy-slc_aepg/check']' died with <Signals.SIGABRT: 6>.
@@ -0,0 +1,56 @@
"""Bounded read-only UI capture of one exact private Workbench run; no input API."""
from pathlib import Path
import hashlib,importlib.util,json,os,re,sys,time
sys.path.insert(0,'/home/jakub/devel/escapistsrereintroduced/tools')
from headless_display_probe import process,environment,ancestor,identity,owned_sockets,validate_display,executable_argument,X11
profile=Path('/home/jakub/devel/escapistsrereintroduced/.build/objective-map-profile-0832-final')
out=Path('/home/jakub/devel/escapistsrereintroduced/.build/objective-map-final-ui-0832');out.mkdir(exist_ok=False)
prefix='/tmp/erri-headless-compat/pfx'
executable=Path('/home/jakub/.local/share/Steam/steamapps/common/Arma Reforger Tools/Workbench/ArmaReforgerWorkbenchSteamDiag.exe')
spec=importlib.util.spec_from_file_location('capture','/tmp/erri-private-window-capture.py')
capture=importlib.util.module_from_spec(spec);spec.loader.exec_module(capture)
pending={'standard-long-warning','standard-rough','standard-exact','standard-reopened','shared-root','shared-long-warning','shared-reused-root'}
records=[];deadline=time.monotonic()+240
while pending and time.monotonic()<deadline:
logs=list((profile/'logs').glob('logs_*/script.log'))
text=logs[0].read_text(errors='replace') if len(logs)==1 else ''
checkpoints=re.findall(r'ERR OBJECTIVE CAPTURE READY: ([a-z-]+)',text)
ready=[checkpoints[-1]] if checkpoints and checkpoints[-1] in pending else []
if ready:
for entry in Path('/proc').iterdir():
if not entry.name.isdigit():continue
try:
p=process(int(entry.name))
if p['uid']!=os.getuid() or not executable_argument(p['args'],executable):continue
if p['args'].count('-profile')!=1:continue
if p['args'][p['args'].index('-profile')+1:p['args'].index('-profile')+2]!=['Z:'+str(profile)]:continue
env=environment(p['pid'])
if env.get('WINEPREFIX','').rstrip('/')!=prefix:continue
display=env.get('DISPLAY','');number=validate_display(display,os.environ.get('DISPLAY',''))
scope=ancestor(p['pid']);sockets=owned_sockets(number,scope['pid'])
if environment(scope['pid']).get('WINEPREFIX','').rstrip('/')!=prefix:continue
query=X11(display)
try:
windows=[]
for window in query.windows():
if window['pid']!=p['pid'] or window['server_pid']!=p['pid'] or not window['title'].startswith('World Editor'):continue
attrs=query.attributes(window['window'])
if attrs['map_state']==2 and attrs['window_class']==1:windows.append((attrs['width']*attrs['height'],window))
if not windows:continue
chosen=max(windows,key=lambda item:item[0])[1]
assert chosen['window']>0
assert identity(process(p['pid']))==identity(p) and identity(process(scope['pid']))==identity(scope)
assert owned_sockets(number,scope['pid'])==sockets
for name in ready:
path=out/(name+'.png');capture.capture(display,str(path),chosen['window'])
latest=re.findall(r'ERR OBJECTIVE CAPTURE READY: ([a-z-]+)',logs[0].read_text(errors='replace'))
assert latest and latest[-1]==name, 'Capture crossed native stage boundary'
record={'stage':name,'sha256':hashlib.sha256(path.read_bytes()).hexdigest(),'workbench':identity(p),'gamescope':identity(scope),'display':display,'window':chosen,'sockets':sockets,'profile':str(profile),'read_only':True}
records.append(record);pending.remove(name);print(name,flush=True)
(out/'captures.json').write_text(json.dumps(records,indent=2)+'\n')
finally:query.close()
break
except (FileNotFoundError,ProcessLookupError,PermissionError,ValueError):continue
if 'ERR SMOKE FAIL:' in text or 'ERR SMOKE COMPLETE:' in text:break
time.sleep(.1)
if pending:raise RuntimeError('Missing bounded UI captures: '+str(sorted(pending)))
@@ -0,0 +1,58 @@
from pathlib import Path
import hashlib,json,shutil,subprocess,sys
r=Path('/home/jakub/devel/escapistsrereintroduced');b=Path('/tmp/erri-objective-map-0832');f=r/'.build/objective-map-native-0832-final'
sha=lambda p:hashlib.sha256(p.read_bytes()).hexdigest()
sys.path.insert(0,str(r/'tools'));from source_manifest import addon_manifest
assert addon_manifest(r)==json.loads((f/'frozen-source.json').read_text())
bindings=json.loads((b/'suite-inputs.json').read_text());assert all(sha(r/p)==h for p,h in bindings.items())
assert json.loads((b/'integration-review.json').read_text())['verdict']=='PASS'
assert subprocess.check_output(['git','diff','--cached','--binary'],cwd=r)==(b/'index-before.diff').read_bytes()
copies=[
('objective-map-native-0744','native-2026-10-02-objective-map-compile'),
('objective-map-native-0744-fixed','native-2026-10-02-objective-map-canvas'),
('objective-map-native-0832-container','native-2026-10-02-objective-map-close'),
('objective-map-native-0832-close','native-2026-10-02-objective-map-geometry'),
('objective-map-native-0832-close','native-2026-10-02-objective-map-ui'),
('objective-map-native-0832-readable','native-2026-10-02-objective-map-warning'),
('objective-map-native-0832-final','native-2026-10-02-objective-map-final'),
('objective-map-native-0832-final','native-2026-10-02-objective-map-normal'),
]
reports={}
for folder,name in copies:
src=r/'.build'/folder/'docs/evidence'/name;report=json.loads((src/'report.json').read_text());runner=json.loads((src/'runner.json.txt').read_text())
assert runner['cleanup_confirmed'] and runner['source_unchanged_after_run'] and runner['external_addons_unchanged_after_run']
reports[name]={'assertions':report['assertions_passed'],'completions':report['smoke_completions'],'script_failures':len(report['script_or_runtime_failures']),'engine_errors':len(report['engine_errors']),'runner_result':runner['result'],'native_qualified':False}
assert reports[copies[-2][1]]['assertions']==101 and reports[copies[-2][1]]['script_failures']==0 and reports[copies[-2][1]]['completions']==1
assert reports[copies[-1][1]]['assertions']==63 and reports[copies[-1][1]]['script_failures']==0 and reports[copies[-1][1]]['completions']==1
e=r/'docs/evidence/objective-map-2026-10-02';e.mkdir()
for folder,name in copies:shutil.copytree(r/'.build'/folder/'docs/evidence'/name,r/'docs/evidence'/name)
for name in ['review.json','integration-review.json','suite-result.json','suite-inputs.json','quota-failure.json','capture-final.py','implementation.md']:
shutil.copy2(b/name,e/name)
shutil.copy2(f/'regressions.log',e/'regressions.log')
shutil.copy2('/tmp/erri-private-window-capture.py',e/'private-window-capture.py')
shutil.copytree(r/'.build/objective-map-final-ui-0832',e/'ui')
captures=json.loads((e/'ui/captures.json').read_text());assert len(captures)==7 and all(sha(e/'ui'/(x['stage']+'.png'))==x['sha256'] for x in captures)
for folder,label in [('/tmp/erri-objective-map-proposal','producer'),('/tmp/erri-objective-map-native-proposal','fixture')]:
for name in ['fix.patch','source-manifest.json','HANDOFF.txt']:shutil.copy2(Path(folder)/name,e/(label+'-'+name))
for source,label in [('/tmp/erri-objective-map-proposal/canvas-parent-mutation-red.log','canvas-parent-mutation-red.log'),('/tmp/erri-objective-map-review-0744/parent-offset-mutation/red.log','offset-mutation-red.log'),('/tmp/erri-objective-map-review-0744/async-close-mutation/red.log','async-close-mutation-red.log')]:shutil.copy2(source,e/label)
summary={'implemented':'Authored discovery and recovered mine-warning UI outside native player-annotation lists, supported standard/shared parents, exact surface ownership and pan/zoom/close/reopen cleanup. No UGC override.','authored_files':407,'regression_programs':283,'native_runs':reports,'visual_review':{'standard':'Read-only private-window captures show question glyph, changed radio glyph/text, reopened marker and long-warning ink without obvious widget-edge truncation. Workbench viewport501x225 limits readability; full-resolution accessibility/manual-input review remains.','shared':'Disabled render-target screenshots show world view, not the shared map. Only native widget identity/geometry/lifecycle is verified; no held-texture or500ms capture claim.','engine_screenshots':'System.MakeScreenshot captures world only and is not counted as UI evidence.','private_capture':'Seven raw captures, exact process/display/socket/profile bindings, no input or focus changes. Initial observer failed writing due scratch-copy quota; failure and recovery retained.'},'preservation':'Original533 and existing owner-fixes candidate412 files unchanged. Of61 inherited paths59 byte-identical; two runner/registry overlaps preserve exact baselines with intended additions only. Index unchanged.','packaging':'Existing owner-fixes package unchanged and predates this increment.','remaining':'Human full escape, physical held map, manual map interaction, restricted-platform behavior, remote/JIP/reconnect/twelve-player multiplayer, physical logistics, comparative FPS and clean release.','committed':False,'published':False,'release_qualified':False}
(e/'summary.json').write_text(json.dumps(summary,indent=2)+'\n')
p=r/'docs/objective-map-presentation.md';assert not p.exists();shutil.copy2(b/'implementation.md',p)
with p.open('a') as out:out.write('\n## Validation — 2 October 2026\n\nAll 283 registered regression programs pass. The [final isolated map fixture](evidence/native-2026-10-02-objective-map-final/report.json) completes 101 assertions and one completion with zero script/runtime failures; 16 engine errors remain. The [normal escape route](evidence/native-2026-10-02-objective-map-normal/report.json) completes 63 assertions and one round with zero script/runtime failures; 13 engine errors remain. All sessions were hidden/muted with confirmed cleanup and unchanged inputs. See [raw UI captures, preservation and exact limits](evidence/objective-map-2026-10-02/summary.json).\n')
p=r/'docs/current-status.md';s=p.read_text();head='# Current development status\n\n';assert s.startswith(head)
intro='''**2 October 2026 — independent objective map UI integrated:** discovered sites and recovered mine warnings now use authored UI outside the native player-annotation lists. Stable rough positions, exact identification, pan/zoom culling and close/reopen cleanup remain intact. Supported standard-map and shared-map containers replace the rejected Canvas parent. Player annotations and their restrictions are unchanged. [Implementation and limits](objective-map-presentation.md).
All **283 registered regression programs pass**. The [final hidden/muted map fixture](evidence/native-2026-10-02-objective-map-final/report.json) completes **101 assertions and one completion**, and the [normal escape route](evidence/native-2026-10-02-objective-map-normal/report.json) completes **63 assertions and one round**. Both record zero script/runtime failures; **16/13 engine errors and strict failed verdicts remain**. Earlier compile, Canvas-parent and asynchronous-close fixture failures are retained.
Read-only private-window captures show the standard question/radio glyphs, reopened marker and long-warning text at the small Workbench viewport. Shared-map checks establish widget geometry/lifecycle only: its disabled render target does not appear in screenshots, and physical held-map capture remains unverified. [Review, raw captures and preservation](evidence/objective-map-2026-10-02/summary.json).
Source contains **407 authored files**. The existing owner-fixes playtest is unchanged and predates this increment. Original missions and inherited work are preserved; nothing was committed or published. Human play, manual map interaction, real multiplayer, physical logistics, comparative FPS and clean release remain unfinished.
'''
p.write_text(head+intro+s[len(head):])
shutil.copy2(__file__,e/'finalize.py')
before=json.loads((b/'preservation-before.json').read_text())
for root,key in [(Path('/home/jakub/devel/escapists'),'original'),(r/'.build/playtest-2026-10-02-owner-fixes','latest_candidate')]:assert all(sha(root/n)==h for n,h in before[key].items())
assert subprocess.check_output(['git','diff','--cached','--binary'],cwd=r)==(b/'index-before.diff').read_bytes()
subprocess.run(['git','diff','--check'],cwd=r,check=True)
print(json.dumps(summary,indent=2))
@@ -0,0 +1,120 @@
FROZEN NATIVE QUALIFICATION PROPOSAL — no engine launched by author
Apply /tmp/erri-objective-map-proposal/fix.patch first (updated to width360,
root/text Clipping False, icon-centered vertical anchor, SetObjective caching and
actual element setter test), then this directory's fix.patch. Exact source/baseline
hashes are recorded in both source-manifest.json files. Neither target nor original
workspace was edited. Both patches apply-check against current target.
Invocation on the assembled private frozen source, using root-owned disposable
prefix/profile and the existing hidden/muted runner:
python3 tools/headless_workbench.py --project core --smoke objective-map --rounds 1 --timeout 240 --compat <private-disposable-compat> --profile <new-private-profile>
Optional --steam or external dependency options remain runner policy, unchanged.
Wrong project or rounds now fails immediately after parse_args before any profile
or prefix processing. Actual CLI refusal tested for chat and rounds2, no outputs.
Fixture selector is errBaseSmoke=1 + errSmokeOutcome=objective-map. Ordinary core
NativeBaseSmoke skips this independent fixture; Chat smoke is not enabled. The
fixture has180s total preparation budget and fixed90s budget after construction.
Do not invoke --project chat (prelaunch refused).
Measures actual standard MapMenu FULLSCREEN configuration and actual shared
SharedMapRenderTarget.layout/MapPlain configuration. New overlay root/handler,
native text/image dimensions, disclosed coordinates, pixel placement and icon
screen center, pan/zoom/culling, close/reopen, reusedconfig/differentroot, own stop,
and unchanged annotation count are asserted. No permission flags are altered.
Six bounded native screenshots under profile logs:
err-objective-map-standard-rough
err-objective-map-standard-exact
err-objective-map-standard-reopened
err-objective-map-shared-root
err-objective-map-shared-long-warning
err-objective-map-shared-reused-root
The long-warning stage waits750ms before screenshot. Inspect images manually.
Shared layout RT is disabled and NOT bound to a model. That is intentional: these
screenshots/geometry prove only the shared-root UI layout if it actually renders.
They do NOT qualify physical held texture, actual500ms capture, manual user input,
restricted-platform behavior, multiplayer or remote JIP. A blank shared screenshot
must remain an explicit failed/unproven visual gate; do not count widget identities
as pixel proof. Native icon resource size does not identify the chosen atlas glyph;
rough/exact glyph appearance requires screenshots.
Focus checks:
probe-green.log: actual OwnsMap/Stop methods + native doubles; duplicate and foreign
map cleanup behavior; actual wrong-selector CLI refusal; fixed budget/gating checks.
Producer overlay-green, mine-green and element-green logs are adjacent proposal.
Legacy ERR_NativeDiscoveryMapProbe is unchanged and is not evidence for this path.
Potential native failure boundary deliberately retained: a real foreign map adopted
while the fixture owns an old MapMenu prevents closing that menu, since its native
OnMenuClose would close the foreign map. No such interference is arranged; a failed
run must be reset through private runner cleanup. No broad menu cleanup is used.
SUPPORTED PARENT CORRECTION (after retained native CanvasWidget refusal)
The fixture independently resolves ERR_ObjectiveOverlay for the authored shared
root, otherwise UIIconsContainer.GetParent() for the standard menu. Objectives
are siblings of native icon ownership, not children removed by native faction
refresh. Exact actual widget parent, presentation parent and native canvas are
asserted. FrameSlot coordinates include canvas-screen minus container-screen
origin before DPI conversion; actual icon screen center is independently checked.
probe-parent-green.log executes the entire actual Inspect method, including
nonzero unequal origins, DPI2/1.25, wrong parent/root/canvas, wrong screen box,
rough coordinates, and dedicated-overlay priority. Prior cleanup/selector cases
still pass. Removing the screen-origin adjustment compiled and runtime-failed;
log: /tmp/erri-objective-map-review-0744/parent-offset-mutation/red.log.
No native operations were run for this correction. Existing native compile/GUI
errors remain retained; parent decides separately whether script-specific geometry
assertions succeed. Screenshots must still establish glyph appearance, long-label
fit and clipping. This fixture does not prove manual input or held-map capture.
ASYNCHRONOUS MENU-CLOSE AND EXTERNAL UI CAPTURE CORRECTION
Installed core SDK MenuManager.CloseMenu queues closure for the next manager
update. The fixture now records one accepted request, keeps its original menu
pointer, and waits under the unchanged90s deadline for its exact-config OnMapClose
callback AND closed native map. The overlay-root absence assertion still applies
after these real lifecycle conditions. Foreign open map replacement fails without
closing it; Stop does not queue the same request twice. Actual methods cover
callback-before-IsOpen=false, unrelated callback, no callback, leaked widget,
repeated polling, cancellation and foreign replacement (probe-async-green.log).
Restoring the immediate-close assumption compiles then runtime-fails in
/tmp/erri-objective-map-review-0744/async-close-mutation/red.log.
System.MakeScreenshot(path) has NO include-UI argument in installed core SDK;
attempt3 outputs showed the3D view only, so these world captures are NOT UI proof.
Six exact log checkpoints now hold each inspected state1500ms before mutation:
ERR OBJECTIVE CAPTURE READY: standard-rough
ERR OBJECTIVE CAPTURE READY: standard-exact
ERR OBJECTIVE CAPTURE READY: standard-reopened
ERR OBJECTIVE CAPTURE READY: shared-root
ERR OBJECTIVE CAPTURE READY: shared-long-warning
ERR OBJECTIVE CAPTURE READY: shared-reused-root
Parent's separately authorized private-display capture may read these windows.
After each hold, exact active map ownership is checked again before any following
mutation, pan, close or teardown. No display capture is performed by this fixture.
FINAL STANDARD VISUAL QUALIFICATION CHECKPOINT
Synthetic marker now uses player origin+(1037.25,0,1063.75), without moving any
actor. Existing rough quantization and exact projection assertions remain. This
separates the centered annotation from the nearby native player arrow/coordinates.
The original six checkpoints remain. A seventh checkpoint is now emitted on the
ordinary STANDARD map, after actual Inspect of the long mine-warning label:
ERR OBJECTIVE CAPTURE READY: standard-long-warning
The label is held1500ms, then restored to Radio station before menu close, so
standard reopening/shared stages retain their prior assertions. Actual extracted
phase blocks5/22/23 prove label inspection, bounded delay, single capture, no early
close/reset and final restoration. Existing actual cleanup/async/geometry tests
still pass (probe-final-visual-green.log).
Parent's preceding owned-window run passed91 assertions and displayed standard
overlay text; those earlier markers overlapped native center glyphs. The disabled
shared RT root rendered only the world, so shared-root evidence remains GEOMETRY
ONLY. No physical held texture/input experimentation is added or claimed.
CENTER-CURSOR SEPARATION
Center(zoom) now pans to disclosedX+100.0/zoom, disclosedZ. This places
the annotation100screenpixels left of the centered native cursor at both0.3
and0.6zoom without moving input or changing marker data. Actual Center method
regression verifies both scales, unchanged data and native pan arguments; all
previous checks pass (probe-final-center-green.log). Existing image projection
assertions are unchanged.
@@ -0,0 +1,584 @@
--- a/addons/core/Scripts/Game/ERR/00_Core/ERR_NativeBaseSmoke.c
+++ b/addons/core/Scripts/Game/ERR/00_Core/ERR_NativeBaseSmoke.c
@@ -54,7 +54,7 @@
string enabled;
if (SCR_Global.IsEditMode() || !Replication.IsServer() || !System.GetCLIParam("errBaseSmoke", enabled) || enabled != "1") return;
string nativeEndCase;
- array<string> independentFixtures = {"optional-site-skip", "infantry-combat", "medical-combat", "hunter-faction", "unconscious-camera", "town-garrisons", "site-garrisons", "radio-interaction", "enemy-loadout", "aggression", "native-end-active", "native-end-preparing", "generated-sites", "mortar-station", "opening-tools", "airfield-markers", "air-logistics", "air-assault", "air-recon"};
+ array<string> independentFixtures = {"optional-site-skip", "infantry-combat", "medical-combat", "hunter-faction", "unconscious-camera", "objective-map", "town-garrisons", "site-garrisons", "radio-interaction", "enemy-loadout", "aggression", "native-end-active", "native-end-preparing", "generated-sites", "mortar-station", "opening-tools", "airfield-markers", "air-logistics", "air-assault", "air-recon"};
if (System.GetCLIParam("errSmokeOutcome", nativeEndCase) && independentFixtures.Contains(nativeEndCase)) return;
ERR_NativeObjectiveProbe.BeginRound();
ERR_NativeProgressionIdentityProbe.BeginRound();
--- /dev/null
+++ b/addons/core/Scripts/Game/ERR/00_Core/ERR_NativeObjectiveMapProbe.c
@@ -0,0 +1,361 @@
+#ifdef WORKBENCH
+// Explicit UI mechanism fixture. It creates no intel, tasks, actors or inventory
+// and never changes annotation restrictions. Shared-root evidence is NOT a
+// physical held-texture, manual-input, restricted-platform or multiplayer test.
+modded class ERR_ObjectiveMapPresentation
+{
+ Widget ERR_ProbeRoot() { return m_Root; }
+ ERR_ObjectiveMapElement ERR_ProbeElement() { return m_Element; }
+ Widget ERR_ProbeCanvas() { return m_Canvas; }
+ Widget ERR_ProbeContainer() { return m_Container; }
+ bool ERR_ProbeStopped() { return !m_Started && !m_Root && !m_Element; }
+}
+modded class ERR_DiscoveryMarker
+{
+ ERR_ObjectiveMapPresentation ERR_ProbePresentation() { return m_ERRPresentation; }
+}
+modded class SCR_MapMarkerManagerComponent
+{
+ int ERR_ProbeAnnotationCount() { return m_aStaticMarkers.Count() + m_aDisabledMarkers.Count(); }
+}
+class ERR_NativeObjectiveMapProbe
+{
+ protected ERR_GameMode m_Mode;
+ protected SCR_MapEntity m_Map;
+ protected SCR_MapMarkerManagerComponent m_Annotations;
+ protected ref ERR_DiscoveryMarker m_Marker;
+ protected ref ERR_ObjectiveMapPresentation m_Presentation;
+ protected SCR_MapMenuUI m_Menu;
+ protected Widget m_SharedRoot, m_ReusedRoot, m_ExpectedRoot, m_PreviousWidget;
+ protected ref MapConfiguration m_Config;
+ protected MapConfiguration m_Ready;
+ protected vector m_Point;
+ protected int m_Stage, m_AnnotationCount;
+ protected int m_Deadline;
+ protected float m_Wait;
+ protected bool m_Stopped, m_Done, m_CloseRequested, m_CloseObserved;
+ static bool Enabled()
+ {
+ string enabled, outcome;
+ return System.GetCLIParam("errBaseSmoke", enabled) && enabled == "1" && System.GetCLIParam("errSmokeOutcome", outcome) && outcome == "objective-map";
+ }
+ void ERR_NativeObjectiveMapProbe(ERR_GameMode mode)
+ {
+ m_Mode = mode;
+ m_Deadline = System.GetTickCount() + 90000;
+ SCR_MapEntity.GetOnMapOpenComplete().Insert(Ready);
+ SCR_MapEntity.GetOnMapClose().Insert(Closed);
+ }
+ protected void Ready(MapConfiguration config) { m_Ready = config; }
+ protected void Closed(MapConfiguration config)
+ {
+ if (m_CloseRequested && config == m_Config) m_CloseObserved = true;
+ }
+ protected bool Check(bool condition, string detail)
+ {
+ if (condition) { Print("ERR SMOKE PASS: objective overlay " + detail); return true; }
+ Print("ERR SMOKE FAIL: objective overlay " + detail, LogLevel.ERROR);
+ Stop(); return false;
+ }
+ protected bool OwnsMap()
+ {
+ if (!m_Map || SCR_MapEntity.GetMapInstance() != m_Map || !m_Map.IsOpen()) return false;
+ return m_Config && m_Map.GetMapConfig() == m_Config && m_Config.RootWidgetRef == m_ExpectedRoot && m_Map.GetMapMenuRoot() == m_ExpectedRoot;
+ }
+ protected bool OpenStandard()
+ {
+ if (!Check(m_Map && !m_Map.IsOpen() && !m_Menu, "standard map starts from closed fixture-owned state")) return false;
+ m_Ready = null;
+ m_Menu = SCR_MapMenuUI.Cast(GetGame().GetMenuManager().OpenMenu(ChimeraMenuPreset.MapMenu));
+ if (!Check(m_Menu && m_Map.IsOpen(), "ordinary native MapMenu opens without simulated input")) return false;
+ m_ExpectedRoot = m_Menu.GetRootWidget();
+ m_Config = m_Map.GetMapConfig();
+ return Check(OwnsMap() && m_Config.MapEntityMode == EMapEntityMode.FULLSCREEN, "ordinary full-screen configuration and exact menu root pinned");
+ }
+ protected bool CloseStandard()
+ {
+ if (!Check(m_Menu && OwnsMap() && !m_CloseRequested, "only exact owned standard menu may request close once")) return false;
+ m_CloseRequested = true;
+ m_CloseObserved = false;
+ return Check(GetGame().GetMenuManager().CloseMenu(m_Menu), "native standard menu close request accepted");
+ }
+ protected int StandardClosed()
+ {
+ if (!Check(m_CloseRequested && m_Map && SCR_MapEntity.GetMapInstance() == m_Map, "pending close retains original native map identity")) return -1;
+ if (m_Map.IsOpen())
+ {
+ if (!Check(OwnsMap(), "pending close cannot adopt a foreign open map")) return -1;
+ return 0;
+ }
+ if (!m_CloseObserved) return 0;
+ if (!Check(!m_Presentation.ERR_ProbeRoot(), "native map close callback removes objective widget before reopening")) return -1;
+ m_Menu = null;
+ m_CloseRequested = false;
+ m_CloseObserved = false;
+ return 1;
+ }
+ protected Widget CreateSharedRoot()
+ {
+ Widget root = GetGame().GetWorkspace().CreateWidgets("{255E1265F702B4AE}UI/layouts/ERRMap/SharedMapRenderTarget.layout");
+ if (!root) return null;
+ RTTextureWidget target = RTTextureWidget.Cast(root.FindAnyWidget("RTTexture0"));
+ if (!target) { root.RemoveFromHierarchy(); return null; }
+ // Expose the real root for geometry/screenshot checks. No model render target
+ // is bound, so these observations cannot qualify the physical held texture.
+ target.SetEnabled(false);
+ root.SetVisible(true);
+ return root;
+ }
+ protected bool OpenShared(Widget root)
+ {
+ if (!Check(root && !m_Map.IsOpen(), "separate real shared-map render layout exists before opening")) return false;
+ m_Ready = null; m_ExpectedRoot = root;
+ m_Config = m_Map.SetupMapConfig(EMapEntityMode.PLAIN, "{A786DD4868598F15}Configs/Map/MapPlain.conf", root);
+ if (!Check(m_Config != null, "native shared plain-map configuration prepared")) return false;
+ m_Map.OpenMap(m_Config);
+ return Check(OwnsMap(), "shared map uses exact authored root and configuration");
+ }
+ protected bool ReadyToInspect()
+ {
+ return OwnsMap() && m_Ready == m_Config && !m_Map.IsZooming();
+ }
+ protected void Center(float zoom)
+ {
+ int position[2]; m_Marker.GetWorldPos(position);
+ m_Map.ZoomPanSmooth(zoom, position[0] + 100.0 / zoom, position[1], 0.1);
+ }
+ protected bool Inspect(string label, bool rough)
+ {
+ if (!Check(ReadyToInspect(), "native configuration finished initialization and camera remains fixture-owned")) return false;
+ Widget root = m_Presentation.ERR_ProbeRoot();
+ ERR_ObjectiveMapElement element = m_Presentation.ERR_ProbeElement();
+ Widget container = m_ExpectedRoot.FindAnyWidget("ERR_ObjectiveOverlay");
+ Widget nativeIcons = m_ExpectedRoot.FindAnyWidget("UIIconsContainer");
+ if (!container && nativeIcons) container = nativeIcons.GetParent();
+ if (!Check(root && element && container && container != m_Map.GetMapWidget() && root.GetParent() == container && m_Presentation.ERR_ProbeContainer() == container && m_Presentation.ERR_ProbeCanvas() == m_Map.GetMapWidget(), "actual authored layout handler belongs to the exact supported objective container and native canvas")) return false;
+ TextWidget text = TextWidget.Cast(root.FindAnyWidget("ObjectiveText"));
+ ImageWidget image = ImageWidget.Cast(root.FindAnyWidget("Image"));
+ if (!Check(text && image && text.GetText() == label && root.IsVisible(), "actual visible widget contains the current objective label and icon widget")) return false;
+ int width, height; image.GetImageSize(0, width, height);
+ if (!Check(width > 0 && height > 0, "actual icon image resource has nonzero native dimensions")) return false;
+ int point[2]; m_Marker.GetWorldPos(point);
+ int knowledge = 2; if (rough) knowledge = 1;
+ if (!Check(point[0] == ERR_DiscoveryMapRules.Coordinate(m_Point[0], knowledge) && point[1] == ERR_DiscoveryMapRules.Coordinate(m_Point[2], knowledge), "presentation retains only requested rough or identified map coordinates")) return false;
+ vector model = element.GetPos();
+ if (!Check(model[0] == point[0] && model[2] == point[1], "native handler receives only frozen disclosed coordinates")) return false;
+ int x, y; m_Map.WorldToScreen(point[0], point[1], x, y, true);
+ float cx, cy, ox, oy;
+ m_Map.GetMapWidget().GetScreenPos(cx, cy);
+ container.GetScreenPos(ox, oy);
+ vector placed = FrameSlot.GetPos(root);
+ if (!Check(Math.AbsFloat(placed[0] - GetGame().GetWorkspace().DPIUnscale(cx + x - ox)) < 1 && Math.AbsFloat(placed[1] - GetGame().GetWorkspace().DPIUnscale(cy + y - oy)) < 1, "native frame position matches current pan zoom DPI and canvas-to-container offset")) return false;
+ float ix, iy, iw, ih;
+ image.GetScreenPos(ix, iy); image.GetScreenSize(iw, ih);
+ PrintFormat("ERR OBJECTIVE PIXELS: expected=%1,%2 actual=%3,%4 stage=%5", cx + x, cy + y, ix + iw * 0.5, iy + ih * 0.5, m_Stage);
+ return Check(Math.AbsFloat(ix + iw * 0.5 - cx - x) <= 3 && Math.AbsFloat(iy + ih * 0.5 - cy - y) <= 3, "actual rendered icon box is centered on disclosed native pixel position");
+ }
+ int Tick(float now)
+ {
+ if (m_Done) return 1;
+ if (m_Stopped) return -1;
+ if (!Enabled() || !m_Mode || ERR_GameMode.Get() != m_Mode || !m_Mode.Active() || System.GetTickCount() >= m_Deadline) { Check(false, "fixed ninety-second deadline and original active mission"); return -1; }
+ if (now < m_Wait) return 0;
+ if (m_Stage >= 16 && m_Stage <= 23 && !Check(ReadyToInspect(), "capture hold retains exact active map before any following mutation")) return -1;
+ if (m_Stage == 0)
+ {
+ m_Map = SCR_MapEntity.GetMapInstance();
+ m_Annotations = SCR_MapMarkerManagerComponent.GetInstance();
+ PlayerController controller = GetGame().GetPlayerController();
+ if (!Check(m_Map && !m_Map.IsOpen() && m_Annotations && controller && controller.GetControlledEntity(), "closed native map and actual local participant available")) return -1;
+ m_Point = controller.GetControlledEntity().GetOrigin() + "1037.25 0 1063.75";
+ m_AnnotationCount = m_Annotations.ERR_ProbeAnnotationCount();
+ m_Marker = new ERR_DiscoveryMarker();
+ m_Marker.SetDiscoveryPosition(m_Point, 1); m_Marker.SetLocationIcon(ERR_LocationKind.RADIO, "", 1);
+ m_Marker.SetCustomText("Unknown location (500 m area)");
+ m_Annotations.ERR_InsertDiscoveryMarker(m_Marker);
+ m_Presentation = m_Marker.ERR_ProbePresentation();
+ if (!Check(m_Presentation != null, "real discovery insertion uses separate objective presentation")) return -1;
+ if (!OpenStandard()) return -1;
+ m_Stage = 1; m_Wait = now + 1000; return 0;
+ }
+ if (m_Stage == 1 || m_Stage == 7 || m_Stage == 9 || m_Stage == 11)
+ {
+ if (!ReadyToInspect()) return 0;
+ Center(0.3); m_Stage++; m_Wait = now + 1000; return 0;
+ }
+ if (m_Stage == 2)
+ {
+ if (!Inspect("Unknown location (500 m area)", true)) return -1;
+ System.MakeScreenshot("$logs:err-objective-map-standard-rough");
+ Print("ERR OBJECTIVE CAPTURE READY: standard-rough");
+ m_Stage = 16; m_Wait = now + 1500; return 0;
+ }
+ if (m_Stage == 16)
+ {
+ m_PreviousWidget = m_Presentation.ERR_ProbeRoot();
+ m_Marker.SetDiscoveryPosition(m_Point, 2); m_Marker.SetLocationIcon(ERR_LocationKind.RADIO, "", 2); m_Marker.SetCustomText("Radio station");
+ Center(0.6); m_Stage = 3; m_Wait = now + 1000; return 0;
+ }
+ if (m_Stage == 3)
+ {
+ if (!Inspect("Radio station", false)) return -1;
+ if (!Check(m_PreviousWidget == m_Presentation.ERR_ProbeRoot(), "rough to exact updates one existing widget")) return -1;
+ System.MakeScreenshot("$logs:err-objective-map-standard-exact");
+ Print("ERR OBJECTIVE CAPTURE READY: standard-exact");
+ m_Stage = 17; m_Wait = now + 1500; return 0;
+ }
+ if (m_Stage == 17)
+ {
+ float farX = 500; if (m_Point[0] < m_Map.GetMapSizeX() * 0.5) farX = m_Map.GetMapSizeX() - 500;
+ m_Map.ZoomPanSmooth(0.6, farX, 500, 0.1);
+ m_Stage = 4; m_Wait = now + 1000; return 0;
+ }
+ if (m_Stage == 4)
+ {
+ if (!Check(ReadyToInspect() && m_PreviousWidget == m_Presentation.ERR_ProbeRoot() && !m_PreviousWidget.IsVisible(), "native pan culls original objective without deleting or relocating its data")) return -1;
+ Center(0.3); m_Stage = 5; m_Wait = now + 1000; return 0;
+ }
+ if (m_Stage == 5)
+ {
+ if (!Inspect("Radio station", false)) return -1;
+ m_Marker.SetCustomText("Reported mine area (500 m); may still be active");
+ m_Stage = 22; m_Wait = now + 750; return 0;
+ }
+ if (m_Stage == 22)
+ {
+ if (!Inspect("Reported mine area (500 m); may still be active", false)) return -1;
+ System.MakeScreenshot("$logs:err-objective-map-standard-long-warning");
+ Print("ERR OBJECTIVE CAPTURE READY: standard-long-warning");
+ m_Stage = 23; m_Wait = now + 1500; return 0;
+ }
+ if (m_Stage == 23)
+ {
+ m_Marker.SetCustomText("Radio station");
+ if (!CloseStandard()) return -1;
+ m_Stage = 6; m_Wait = now + 500; return 0;
+ }
+ if (m_Stage == 6)
+ {
+ int closed = StandardClosed();
+ if (closed <= 0) return closed;
+ if (!OpenStandard()) return -1;
+ m_Stage = 7; m_Wait = now + 1000; return 0;
+ }
+ if (m_Stage == 8)
+ {
+ if (!Inspect("Radio station", false)) return -1;
+ System.MakeScreenshot("$logs:err-objective-map-standard-reopened");
+ Print("ERR OBJECTIVE CAPTURE READY: standard-reopened");
+ m_Stage = 18; m_Wait = now + 1500; return 0;
+ }
+ if (m_Stage == 18)
+ {
+ if (!CloseStandard()) return -1;
+ m_Stage = 15; m_Wait = now + 500; return 0;
+ }
+ if (m_Stage == 15)
+ {
+ int closed = StandardClosed();
+ if (closed <= 0) return closed;
+ m_SharedRoot = CreateSharedRoot();
+ if (!OpenShared(m_SharedRoot)) return -1;
+ m_Stage = 9; m_Wait = now + 1000; return 0;
+ }
+ if (m_Stage == 10)
+ {
+ if (!Inspect("Radio station", false)) return -1;
+ System.MakeScreenshot("$logs:err-objective-map-shared-root");
+ Print("ERR OBJECTIVE CAPTURE READY: shared-root");
+ m_Stage = 19; m_Wait = now + 1500; return 0;
+ }
+ if (m_Stage == 19)
+ {
+ m_Marker.SetCustomText("Reported mine area (500 m); may still be active");
+ m_Stage = 14; m_Wait = now + 750; return 0;
+ }
+ if (m_Stage == 14)
+ {
+ if (!Inspect("Reported mine area (500 m); may still be active", false)) return -1;
+ System.MakeScreenshot("$logs:err-objective-map-shared-long-warning");
+ Print("ERR OBJECTIVE CAPTURE READY: shared-long-warning");
+ m_Stage = 20; m_Wait = now + 1500; return 0;
+ }
+ if (m_Stage == 20)
+ {
+ MapConfiguration previousConfig = m_Config;
+ m_Map.CloseMap();
+ if (!Check(!m_Presentation.ERR_ProbeRoot(), "closing shared root clears only owned objective widget")) return -1;
+ m_ReusedRoot = CreateSharedRoot();
+ if (!OpenShared(m_ReusedRoot)) return -1;
+ if (!Check(m_Config == previousConfig && m_ReusedRoot != m_SharedRoot, "native plain config is reused with a distinct root")) return -1;
+ m_Stage = 11; m_Wait = now + 1000; return 0;
+ }
+ if (m_Stage == 12)
+ {
+ if (!Inspect("Reported mine area (500 m); may still be active", false)) return -1;
+ System.MakeScreenshot("$logs:err-objective-map-shared-reused-root");
+ Print("ERR OBJECTIVE CAPTURE READY: shared-reused-root");
+ m_Stage = 21; m_Wait = now + 1500; return 0;
+ }
+ if (!Check(m_Stage == 21, "only final captured stage can complete")) return -1;
+ m_Marker.OnDelete();
+ if (!Check(m_Presentation.ERR_ProbeStopped() && OwnsMap(), "objective teardown releases its widget while leaving native map open")) return -1;
+ m_Stage = 13;
+ Stop(); m_Done = true;
+ if (!Check(m_Annotations && m_Annotations.ERR_ProbeAnnotationCount() == m_AnnotationCount, "existing annotation registry count preserved; no privacy settings changed")) return -1;
+ Print("ERR SMOKE COMPLETE: objective overlay native standard/shared-root geometry, data, pan zoom culling reopen and teardown; not held-texture, manual input, restricted-platform or multiplayer proof");
+ return 1;
+ }
+ void Stop()
+ {
+ if (m_Stopped) return;
+ m_Stopped = true;
+ if (m_Marker) m_Marker.OnDelete();
+ if (m_Presentation) m_Presentation.Stop();
+ SCR_MapEntity.GetOnMapOpenComplete().Remove(Ready);
+ SCR_MapEntity.GetOnMapClose().Remove(Closed);
+ if (OwnsMap())
+ {
+ if (m_Menu)
+ {
+ if (!m_CloseRequested) GetGame().GetMenuManager().CloseMenu(m_Menu);
+ }
+ else m_Map.CloseMap();
+ }
+ if (m_SharedRoot) m_SharedRoot.RemoveFromHierarchy();
+ if (m_ReusedRoot) m_ReusedRoot.RemoveFromHierarchy();
+ m_Menu = null; m_SharedRoot = null; m_ReusedRoot = null; m_ExpectedRoot = null; m_Config = null; m_Ready = null;
+ }
+}
+modded class ERR_GameMode
+{
+ protected ref ERR_NativeObjectiveMapProbe m_ERRObjectiveMapProbe;
+ protected int m_ERRObjectiveMapDeadline;
+ protected override void EOnInit(IEntity owner)
+ {
+ super.EOnInit(owner);
+ if (SCR_Global.IsEditMode() || !Replication.IsServer() || !ERR_NativeObjectiveMapProbe.Enabled()) return;
+ m_ERRObjectiveMapDeadline = System.GetTickCount() + 180000;
+ OnStop().Insert(ERR_StopObjectiveMapProbe);
+ GetGame().GetCallqueue().CallLater(ERR_TickObjectiveMapProbe, 250, true);
+ }
+ protected void ERR_TickObjectiveMapProbe()
+ {
+ if (System.GetTickCount() >= m_ERRObjectiveMapDeadline || !PreparationError().IsEmpty())
+ {
+ Print("ERR SMOKE FAIL: objective overlay preparation/overall deadline", LogLevel.ERROR);
+ ERR_StopObjectiveMapProbe(); return;
+ }
+ if (!Active() || !GetGame().GetPlayerController() || !GetGame().GetPlayerController().GetControlledEntity()) return;
+ if (!m_ERRObjectiveMapProbe) m_ERRObjectiveMapProbe = new ERR_NativeObjectiveMapProbe(this);
+ if (m_ERRObjectiveMapProbe.Tick(GetWorld().GetWorldTime()) != 0) ERR_StopObjectiveMapProbe();
+ }
+ protected void ERR_StopObjectiveMapProbe()
+ {
+ if (GetGame()) GetGame().GetCallqueue().Remove(ERR_TickObjectiveMapProbe);
+ if (m_ERRObjectiveMapProbe) m_ERRObjectiveMapProbe.Stop();
+ OnStop().Remove(ERR_StopObjectiveMapProbe);
+ }
+ void ~ERR_GameMode() { ERR_StopObjectiveMapProbe(); }
+}
+#endif
--- /dev/null
+++ b/tests/test_native_objective_map_probe.py
@@ -0,0 +1,178 @@
+"""Actual fixture ownership/terminal cleanup plus explicit selector contracts."""
+import os,re
+from pathlib import Path
+from policy_harness import ROOT,body,run
+root=Path(os.environ.get('ERR_NATIVE_OBJECTIVE_MAP_ROOT',ROOT));p=root/'addons/core/Scripts/Game/ERR/00_Core/ERR_NativeObjectiveMapProbe.c'
+def adapt(s):
+ s=s.replace('protected ','').replace('null','nullptr').replace('SCR_MapEntity.','SCR_MapEntity::')
+ for name in ['m_Map','m_Config','m_Marker','m_Presentation','m_SharedRoot','m_ReusedRoot']:
+ s=s.replace(name+'.',name+'->')
+ for name in ['GetGame','GetMenuManager','GetOnMapOpenComplete','GetOnMapClose']:
+ s=s.replace(name+'().',name+'()->')
+ return s.replace('Remove(Ready)','Remove(this)').replace('Remove(Closed)','Remove(this)').replace('MapConfiguration config','Config* config')
+methods='\n'.join(adapt(body(p,s)) for s in ['protected bool OwnsMap(', 'protected bool CloseStandard(', 'protected int StandardClosed(', 'protected void Closed(', 'void Stop('])
+run('''#include <cassert>
+#include <set>
+#include <string>
+using string=std::string;
+struct Widget{int deletes=0;void RemoveFromHierarchy(){deletes++;}};
+struct Config{Widget*RootWidgetRef=nullptr;};
+struct Event{std::set<void*>owners;void Remove(void*p){owners.erase(p);}};
+struct SCR_MapEntity{static inline SCR_MapEntity*current=nullptr;static inline Event opened,closed;Config*config=nullptr;Widget*root=nullptr;bool open=true;int closes=0;static SCR_MapEntity*GetMapInstance(){return current;}static Event*GetOnMapOpenComplete(){return &opened;}static Event*GetOnMapClose(){return &closed;}bool IsOpen(){return open;}Config*GetMapConfig(){return config;}Widget*GetMapMenuRoot(){return root;}void CloseMap(){closes++;open=false;}};
+struct Marker{int deletes=0;void OnDelete(){deletes++;}};struct Presentation{int stops=0;Widget*root=nullptr;Widget*ERR_ProbeRoot(){return root;}void Stop(){stops++;root=nullptr;}};struct Menu{};
+struct Manager{int closes=0;bool asynchronous=false;bool CloseMenu(Menu*){closes++;if(!asynchronous&&SCR_MapEntity::current)SCR_MapEntity::current->CloseMap();return true;}};
+struct Game{Manager manager;Manager*GetMenuManager(){return &manager;}}game;Game*GetGame(){return &game;}
+struct Probe{bool m_Stopped=false,m_CloseRequested=false,m_CloseObserved=false;bool Check(bool ok,string){if(!ok)Stop();return ok;}SCR_MapEntity*m_Map=nullptr;Config*m_Config=nullptr,*m_Ready=nullptr;Widget*m_ExpectedRoot=nullptr,*m_SharedRoot=nullptr,*m_ReusedRoot=nullptr;Marker*m_Marker=nullptr;Presentation*m_Presentation=nullptr;Menu*m_Menu=nullptr;
+'''+methods+'''
+};
+int main(){SCR_MapEntity map;SCR_MapEntity::current=&map;Config cfg;Widget root,otherRoot,shared,reused;cfg.RootWidgetRef=&root;map.root=&root;map.config=&cfg;
+ Probe p;p.m_Map=&map;p.m_Config=&cfg;p.m_ExpectedRoot=&root;Marker marker;Presentation presentation;Menu menu;p.m_Marker=&marker;p.m_Presentation=&presentation;p.m_Menu=&menu;p.m_SharedRoot=&shared;p.m_ReusedRoot=&reused;
+ assert(p.OwnsMap());cfg.RootWidgetRef=&otherRoot;assert(!p.OwnsMap());cfg.RootWidgetRef=&root;map.root=&otherRoot;assert(!p.OwnsMap());map.root=&root;
+ SCR_MapEntity replacement;SCR_MapEntity::current=&replacement;assert(!p.OwnsMap());SCR_MapEntity::current=&map;
+ SCR_MapEntity::opened.owners.insert(&p);p.Stop();assert(p.m_Stopped&&marker.deletes==1&&presentation.stops==1&&game.manager.closes==1&&map.closes==1&&shared.deletes==1&&reused.deletes==1&&!SCR_MapEntity::opened.owners.count(&p));
+ p.Stop();assert(marker.deletes==1&&map.closes==1&&shared.deletes==1);
+ Probe interrupted;interrupted.m_Map=&map;interrupted.m_Config=&cfg;interrupted.m_ExpectedRoot=&root;interrupted.m_Menu=&menu;map.open=true;map.root=&otherRoot;interrupted.Stop();assert(map.open&&map.closes==1&&game.manager.closes==1);
+ Probe partial;partial.Stop();assert(partial.m_Stopped&&game.manager.closes==1);
+ // Native CloseMenu can return while MapMenu.OnMenuClose has not happened.
+ map.root=&root;map.open=true;game.manager.asynchronous=true;
+ Probe pending;pending.m_Map=&map;pending.m_Config=&cfg;pending.m_ExpectedRoot=&root;pending.m_Menu=&menu;pending.m_Presentation=&presentation;presentation.root=&shared;
+ assert(pending.CloseStandard()&&pending.m_Menu==&menu&&pending.m_CloseRequested&&map.open);assert(game.manager.closes==2);
+ assert(pending.StandardClosed()==0&&!pending.m_Stopped);assert(pending.StandardClosed()==0&&game.manager.closes==2);
+ Config foreign;pending.Closed(&foreign);assert(!pending.m_CloseObserved);
+ pending.Closed(&cfg);assert(pending.m_CloseObserved&&pending.StandardClosed()==0); // callback occurs before IsOpen clears
+ map.open=false;presentation.root=nullptr;assert(pending.StandardClosed()==1&&!pending.m_Menu&&!pending.m_CloseRequested);assert(game.manager.closes==2);
+ // Closed state alone cannot replace the observed exact native callback.
+ Probe noEvent;noEvent.m_Map=&map;noEvent.m_Config=&cfg;noEvent.m_ExpectedRoot=&root;noEvent.m_Menu=&menu;noEvent.m_Presentation=&presentation;map.open=true;assert(noEvent.CloseStandard());map.open=false;assert(noEvent.StandardClosed()==0&&noEvent.m_Menu==&menu);noEvent.Stop();
+ // A close request is not repeated by Stop or after foreign map adoption.
+ Probe cancel;cancel.m_Map=&map;cancel.m_Config=&cfg;cancel.m_ExpectedRoot=&root;cancel.m_Menu=&menu;map.open=true;assert(cancel.CloseStandard());int requests=game.manager.closes;cancel.Stop();assert(game.manager.closes==requests&&map.open);
+ Probe displaced;displaced.m_Map=&map;displaced.m_Config=&cfg;displaced.m_ExpectedRoot=&root;displaced.m_Menu=&menu;displaced.m_Presentation=&presentation;assert(displaced.CloseStandard());requests=game.manager.closes;map.root=&otherRoot;assert(displaced.StandardClosed()==-1&&displaced.m_Stopped&&map.open&&game.manager.closes==requests);
+ // Exact close callback with a leaked production widget still fails.
+ map.root=&root;Probe leak;leak.m_Map=&map;leak.m_Config=&cfg;leak.m_ExpectedRoot=&root;leak.m_Menu=&menu;leak.m_Presentation=&presentation;assert(leak.CloseStandard());leak.Closed(&cfg);map.open=false;presentation.root=&shared;assert(leak.StandardClosed()==-1&&leak.m_Stopped);
+
+}
+''')
+s=p.read_text();assert s.startswith('#ifdef WORKBENCH')
+assert 'System.GetTickCount() + 90000' in s and 'System.GetTickCount() + 180000' in s
+assert s.count('System.MakeScreenshot(')==7
+assert s.count('ERR OBJECTIVE CAPTURE READY: ')==7
+assert s.count('m_Wait = now + 1500; return 0;')==7
+assert 'm_Stage >= 16 && m_Stage <= 23 && !Check(ReadyToInspect()' in s
+assert 'm_Stage == 6' in s and 'm_Stage == 15' in s and s.count('int closed = StandardClosed();')==2
+assert 'SetBlocked(' not in s and 'SetPrivileged' not in s
+base=(root/'addons/core/Scripts/Game/ERR/00_Core/ERR_NativeBaseSmoke.c').read_text()
+assert '"objective-map"' in base.split('ERR_NativeObjectiveProbe.BeginRound();')[0]
+runner=(root/'tools/headless_workbench.py').read_text()
+assert runner.index("objective-map requires --project core --rounds 1") < runner.index('steam, compat, profile =')
+# Actual invalid CLI must refuse before nonexistent prefix/profile processing.
+import subprocess,sys,tempfile
+with tempfile.TemporaryDirectory(prefix='err-objective-selector-') as temporary:
+ sandbox=Path(temporary); profile=sandbox/'must-not-exist'; prefix=sandbox/'absent-prefix'
+ environment=os.environ.copy(); environment['PYTHONPATH']=str(ROOT/'tools')
+ for project,rounds in [('chat','1'),('core','2')]:
+ result=subprocess.run([sys.executable,str(root/'tools/headless_workbench.py'),'--smoke','objective-map','--project',project,'--rounds',rounds,'--compat',str(prefix),'--profile',str(profile)],capture_output=True,text=True,env=environment)
+ assert result.returncode==2 and 'objective-map requires --project core --rounds 1' in result.stderr,result.stderr
+ assert not profile.exists() and not prefix.exists()
+print('PASS: actual native fixture root/config ownership and idempotent cleanup preserve foreign map, selector excludes ordinary route, fixed budgets/screenshots/UGC boundaries retained; native operations not executed')
+
+# Execute the complete actual Inspect method: parent identity and frame projection
+# are checked independently from native image-box coordinates. These are API
+# doubles, not proof of engine widget parenting, pixels or pointer transparency.
+inspect=body(p,'protected bool Inspect(').replace('protected ','')
+for t in ['Widget','ERR_ObjectiveMapElement','TextWidget','ImageWidget']:
+ inspect=re.sub(r'\b'+t+r' (?=\w)',t+'* ',inspect)
+for name in ['m_Presentation','m_Map','m_ExpectedRoot','m_Marker','root','element','container','nativeIcons','text','image']:
+ inspect=inspect.replace(name+'.',name+'->')
+for name in ['GetGame','GetWorkspace','GetMapWidget']:
+ inspect=inspect.replace(name+'().',name+'()->')
+for name in ['TextWidget','ImageWidget','ERR_DiscoveryMapRules','FrameSlot','Math']:
+ inspect=inspect.replace(name+'.',name+'::')
+run(r'''
+#include <cassert>
+#include <array>
+#include <cmath>
+#include <string>
+using string=std::string;using vector=std::array<float,3>;
+struct Widget{Widget*parent=nullptr,*container=nullptr,*overlay=nullptr,*text=nullptr,*image=nullptr;vector placed={0,0,0};float sx=0,sy=0,width=36,height=36;bool visible=true;virtual ~Widget()=default;Widget*GetParent(){return parent;}Widget*FindAnyWidget(string n){if(n=="UIIconsContainer")return container;if(n=="ERR_ObjectiveOverlay")return overlay;if(n=="ObjectiveText")return text;if(n=="Image")return image;return nullptr;}bool IsVisible(){return visible;}void GetScreenPos(float&x,float&y){x=sx;y=sy;}void GetScreenSize(float&w,float&h){w=width;h=height;}};
+struct TextWidget:Widget{string label;static TextWidget*Cast(Widget*w){return dynamic_cast<TextWidget*>(w);}string GetText(){return label;}};
+struct ImageWidget:Widget{static ImageWidget*Cast(Widget*w){return dynamic_cast<ImageWidget*>(w);}void GetImageSize(int,int&w,int&h){w=64;h=64;}};
+struct ERR_ObjectiveMapElement{vector pos;vector GetPos(){return pos;}};
+struct Presentation{Widget*root=nullptr,*canvas=nullptr,*container=nullptr;ERR_ObjectiveMapElement*element=nullptr;Widget*ERR_ProbeRoot(){return root;}Widget*ERR_ProbeCanvas(){return canvas;}Widget*ERR_ProbeContainer(){return container;}ERR_ObjectiveMapElement*ERR_ProbeElement(){return element;}};
+struct Map{Widget*canvas=nullptr;int x=240,y=180;Widget*GetMapWidget(){return canvas;}void WorldToScreen(int,int,int&ox,int&oy,bool pan){assert(pan);ox=x;oy=y;}};
+struct Marker{int x=6123,y=7027;void GetWorldPos(int p[2]){p[0]=x;p[1]=y;}};
+struct Workspace{float dpi=2;float DPIUnscale(float x){return x/dpi;}};
+struct Game{Workspace workspace;Workspace*GetWorkspace(){return &workspace;}}game;Game*GetGame(){return &game;}
+struct FrameSlot{static vector GetPos(Widget*w){return w->placed;}};
+struct Math{static float AbsFloat(float x){return std::fabs(x);}};
+struct ERR_DiscoveryMapRules{static int Coordinate(float x,int knowledge){return knowledge==1?int(std::floor(x/500))*500+250:int(x);}};
+template<class...T>void PrintFormat(T...){}
+struct Probe{Presentation*m_Presentation;Map*m_Map;Widget*m_ExpectedRoot;Marker*m_Marker;vector m_Point={6123,0,7027};int m_Stage=3;bool ready=true;bool ReadyToInspect(){return ready;}bool Check(bool b,string){return b;}
+'''+inspect+r'''
+};
+int main(){Widget menu,container,nativeIcons,canvas,root,foreign;TextWidget text;ImageWidget image;ERR_ObjectiveMapElement element;Presentation presentation;Map map;Marker marker;
+ menu.container=&nativeIcons;nativeIcons.parent=&container;root.parent=&container;root.text=&text;root.image=&image;text.label="Radio station";element.pos={6123,0,7027};
+ canvas.sx=100;canvas.sy=60;container.sx=24;container.sy=10;
+ presentation.root=&root;presentation.canvas=&canvas;presentation.container=&container;presentation.element=&element;map.canvas=&canvas;
+ // Canvas-relative projection240,180 -> screen340,240; supported parent has
+ // origin24,10, so slot(158,115) at DPI2, not slot(120,90).
+ root.placed={158,115,0};image.sx=322;image.sy=222;
+ Probe probe{&presentation,&map,&menu,&marker};assert(probe.Inspect(text.label,false));
+ root.placed={120,90,0};assert(!probe.Inspect(text.label,false));root.placed={158,115,0};
+ root.parent=&canvas;assert(!probe.Inspect(text.label,false));root.parent=&container;
+ nativeIcons.parent=&foreign;assert(!probe.Inspect(text.label,false));nativeIcons.parent=&container;
+ presentation.container=&foreign;assert(!probe.Inspect(text.label,false));presentation.container=&container;
+ presentation.canvas=&foreign;assert(!probe.Inspect(text.label,false));presentation.canvas=&canvas;
+ image.sx+=4;assert(!probe.Inspect(text.label,false));image.sx-=4;
+ element.pos[0]+=1;assert(!probe.Inspect(text.label,false));element.pos[0]-=1;
+ root.visible=false;assert(!probe.Inspect(text.label,false));root.visible=true;
+ probe.ready=false;assert(!probe.Inspect(text.label,false));probe.ready=true;
+ // Another valid parent origin and non-unit DPI cannot be compensated by
+ // dropping screen-origin offsets from the projection assertion.
+ container.sx=120;container.sy=110;game.workspace.dpi=1.25;root.placed={176,104,0};assert(probe.Inspect(text.label,false));
+ // Shared render roots choose their dedicated overlay instead of native icons.
+ menu.overlay=&container;nativeIcons.parent=&foreign;assert(probe.Inspect(text.label,false));
+ menu.overlay=&foreign;assert(!probe.Inspect(text.label,false));menu.overlay=&container;
+ marker.x=6250;marker.y=7250;element.pos={6250,0,7250};assert(probe.Inspect(text.label,true));
+}
+''')
+print('PASS: actual full Inspect rejects canvas parenting, wrong active container/canvas, omitted origin offset, wrong rendered box and stale coordinates; differing origins and DPI accepted')
+
+# Execute the added actual three phase blocks. Long-label capture must happen
+# before reset/close, and the radio label must be restored for later reopening.
+phases='\n'.join(body(p,'if (m_Stage == '+str(stage)+')') for stage in [5,22,23])
+phases=phases.replace('m_Marker.','m_Marker->').replace('System.','System::')
+run(r'''
+#include <cassert>
+#include <string>
+using string=std::string;
+struct Marker{string label="Radio station";void SetCustomText(string text){label=text;}};
+struct System{static inline int captures=0;static void MakeScreenshot(string path){assert(path=="$logs:err-objective-map-standard-long-warning");captures++;}};
+int checkpoints=0;void Print(string text){assert(text=="ERR OBJECTIVE CAPTURE READY: standard-long-warning");checkpoints++;}
+struct Probe{Marker*m_Marker;int m_Stage=5,closes=0,inspections=0;float m_Wait=0;bool Inspect(string text,bool rough){inspections++;return !rough&&m_Marker->label==text;}bool CloseStandard(){assert(m_Marker->label=="Radio station");closes++;return true;}
+ int Advance(float now){if(now<m_Wait)return 0;
+'''+phases+r'''
+ return 0;}
+};
+int main(){Marker marker;Probe p{&marker};assert(p.Advance(100)==0&&p.m_Stage==22&&p.m_Wait==850&&p.closes==0);assert(marker.label=="Reported mine area (500 m); may still be active");
+ p.Advance(849);assert(System::captures==0&&p.inspections==1);
+ p.Advance(850);assert(p.m_Stage==23&&p.m_Wait==2350&&p.inspections==2&&System::captures==1&&checkpoints==1&&p.closes==0);
+ p.Advance(2349);assert(marker.label=="Reported mine area (500 m); may still be active"&&p.closes==0);
+ p.Advance(2350);assert(p.m_Stage==6&&p.closes==1&&marker.label=="Radio station"&&System::captures==1);
+}
+''')
+assert 'GetOrigin() + "1037.25 0 1063.75"' in s
+print('PASS: actual long-warning phases retain visible label through1500ms checkpoint then restore radio before close; synthetic marker separated from unmoved player')
+
+# Actual Center method offsets the pan target, not the disclosed data or input.
+center=body(p,'protected void Center(').replace('protected ','').replace('m_Marker.','m_Marker->').replace('m_Map.','m_Map->')
+run(r'''
+#include <cassert>
+#include <cmath>
+#include <initializer_list>
+struct Marker{int x=6250,y=7250;void GetWorldPos(int p[2]){p[0]=x;p[1]=y;}};
+struct Map{float zoom=0,x=0,y=0,duration=0;int calls=0;void ZoomPanSmooth(float z,float px,float py,float t){zoom=z;x=px;y=py;duration=t;calls++;}};
+struct Probe{Marker*m_Marker;Map*m_Map;
+'''+center+r'''
+};
+int main(){Marker marker;Map map;Probe p{&marker,&map};for(float zoom:{0.3f,0.6f}){p.Center(zoom);assert(map.zoom==zoom&&map.y==7250&&std::abs(map.duration-0.1f)<0.001f);assert(std::abs((marker.x-map.x)*zoom+100.0f)<0.01f);assert(marker.x==6250&&marker.y==7250);}assert(map.calls==2);}
+''')
+print('PASS: actual Center places marker100screenpx left of pan center at both fixture zooms without altering disclosed coordinates')
--- a/tools/headless_workbench.py
+++ b/tools/headless_workbench.py
@@ -14,7 +14,7 @@
p.add_argument('--external-addons', type=Path, help='Installed RHS/WCS/BMP source root; expose only audited closure in a separate Chat profile')
p.add_argument('--compat', type=Path, required=True, help='Disposable cloned Proton compatdata directory outside Steam')
p.add_argument('--profile', type=Path, required=True, help='Separate disposable successor Workbench profile')
-p.add_argument('--smoke', choices=['normal-escape-route', 'escape-route', 'optional-site-skip', 'infantry-combat', 'medical-combat', 'hunter-faction', 'unconscious-camera', 'town-garrisons', 'site-garrisons', 'radio-interaction', 'enemy-loadout', 'aggression', 'air-logistics', 'air-assault', 'air-recon', 'airfield-markers', 'opening-tools', 'mortar-station', 'generated-sites', 'hq-local-handoff', 'infantry-transfer', 'hq-body', 'convoy', 'supply-convoys', 'mounted-ammo', 'alarm-hearing', 'hq-memory', 'hq-awareness', 'aircraft-field', 'aircraft-route', 'native-end-active', 'native-end-preparing', 'aircraft-control', 'aircraft-cancel', 'aircraft-translate', 'map-ownership', 'mortar-refresh', 'mortar-salvo', 'mortar-courier', 'station-teardown', 'prison-breach', 'powered-flight', 'powered-translate', 'local-admission', 'mortar-expiry', 'mortar-transfer', 'mortar-fire', 'patrol-hq', 'victory', 'lost-helicopter', 'player-death', 'radio-network', 'hq-response', 'mortar-inventory', 'startup-failure', 'site-survey', 'cache-loss', 'extraction-capacity', 'early-helicopter-loss', 'extraction-startup-failure', 'extraction-boundary-failure', 'transport-loss', 'transport-survey', 'lifecycle', 'objective-ui', 'recovery', 'prisoner-kit', 'medical', 'casualty-load', 'casualty-direct', 'casualty-bench', 'casualty-remove', 'environment', 'environment-restart', 'patrols', 'radio-document-loss', 'radio-document-loss-partial', 'guard-cancel', 'casualty-service'], default='victory')
+p.add_argument('--smoke', choices=['normal-escape-route', 'escape-route', 'optional-site-skip', 'infantry-combat', 'medical-combat', 'hunter-faction', 'unconscious-camera', 'objective-map', 'town-garrisons', 'site-garrisons', 'radio-interaction', 'enemy-loadout', 'aggression', 'air-logistics', 'air-assault', 'air-recon', 'airfield-markers', 'opening-tools', 'mortar-station', 'generated-sites', 'hq-local-handoff', 'infantry-transfer', 'hq-body', 'convoy', 'supply-convoys', 'mounted-ammo', 'alarm-hearing', 'hq-memory', 'hq-awareness', 'aircraft-field', 'aircraft-route', 'native-end-active', 'native-end-preparing', 'aircraft-control', 'aircraft-cancel', 'aircraft-translate', 'map-ownership', 'mortar-refresh', 'mortar-salvo', 'mortar-courier', 'station-teardown', 'prison-breach', 'powered-flight', 'powered-translate', 'local-admission', 'mortar-expiry', 'mortar-transfer', 'mortar-fire', 'patrol-hq', 'victory', 'lost-helicopter', 'player-death', 'radio-network', 'hq-response', 'mortar-inventory', 'startup-failure', 'site-survey', 'cache-loss', 'extraction-capacity', 'early-helicopter-loss', 'extraction-startup-failure', 'extraction-boundary-failure', 'transport-loss', 'transport-survey', 'lifecycle', 'objective-ui', 'recovery', 'prisoner-kit', 'medical', 'casualty-load', 'casualty-direct', 'casualty-bench', 'casualty-remove', 'environment', 'environment-restart', 'patrols', 'radio-document-loss', 'radio-document-loss-partial', 'guard-cancel', 'casualty-service'], default='victory')
p.add_argument('--maintenance-refuel', action='store_true', help='Opt-in normal-route check: original held Southern fuel can transfers finite fuel through its native UAZ action; one arranged tank depletion, no stock creation')
p.add_argument('--mounted-swap-eligibility', action='store_true', help='Read-only mounted-ammo variant: one exact finite cargo/mounted magazine CanSwap call; no transfer or radio proof')
p.add_argument('--mine-stock', action='store_true', help='Read-only mounted-ammo check of exact callback-proved finite PMN4 cargo before and after natural radio delivery')
@@ -33,6 +33,7 @@
p.add_argument('--timeout', type=int, default=360)
p.add_argument('--project', choices=['core', 'chat'], default='chat', help='Diagnostic fixture family (both load the combined mod)')
a = p.parse_args()
+if a.smoke == 'objective-map' and (a.project != 'core' or a.rounds != 1): p.error('objective-map requires --project core --rounds 1')
if a.smoke == 'unconscious-camera' and a.project != 'core': p.error('unconscious-camera requires --project core to keep the general smoke fixture inactive')
if a.mine_stock:
if a.smoke != 'mounted-ammo' or a.project != 'chat' or a.rounds != 1 or a.timeout < 360:
@@ -139,7 +140,7 @@
if a.recon_takeover_only: command += ['-errReconTakeoverOnly', '1']
if a.body_recovery_only: command += ['-errBodyRecoveryOnly', '1']
if a.project == 'core':
- if a.smoke not in {'optional-site-skip', 'infantry-combat', 'medical-combat', 'hunter-faction', 'unconscious-camera', 'town-garrisons', 'site-garrisons', 'radio-interaction', 'enemy-loadout', 'aggression', 'air-logistics', 'air-assault', 'air-recon', 'airfield-markers', 'opening-tools', 'mortar-station', 'generated-sites', 'native-end-active', 'native-end-preparing', 'station-teardown', 'prison-breach', 'powered-flight', 'powered-translate', 'local-admission', 'victory', 'startup-failure', 'site-survey', 'cache-loss', 'extraction-capacity', 'early-helicopter-loss', 'extraction-startup-failure', 'extraction-boundary-failure', 'transport-loss', 'transport-survey', 'lifecycle', 'objective-ui', 'recovery', 'prisoner-kit', 'medical', 'casualty-load', 'casualty-direct', 'casualty-bench', 'casualty-remove', 'environment', 'environment-restart', 'patrols', 'radio-document-loss', 'radio-document-loss-partial', 'guard-cancel', 'casualty-service'}: p.error('Unsupported Core-only fixture')
+ if a.smoke not in {'optional-site-skip', 'infantry-combat', 'medical-combat', 'hunter-faction', 'unconscious-camera', 'objective-map', 'town-garrisons', 'site-garrisons', 'radio-interaction', 'enemy-loadout', 'aggression', 'air-logistics', 'air-assault', 'air-recon', 'airfield-markers', 'opening-tools', 'mortar-station', 'generated-sites', 'native-end-active', 'native-end-preparing', 'station-teardown', 'prison-breach', 'powered-flight', 'powered-translate', 'local-admission', 'victory', 'startup-failure', 'site-survey', 'cache-loss', 'extraction-capacity', 'early-helicopter-loss', 'extraction-startup-failure', 'extraction-boundary-failure', 'transport-loss', 'transport-survey', 'lifecycle', 'objective-ui', 'recovery', 'prisoner-kit', 'medical', 'casualty-load', 'casualty-direct', 'casualty-bench', 'casualty-remove', 'environment', 'environment-restart', 'patrols', 'radio-document-loss', 'radio-document-loss-partial', 'guard-cancel', 'casualty-service'}: p.error('Unsupported Core-only fixture')
command[command.index('-plugin=ERR_ValidateWorldPlugin')] = '-plugin=ERR_ValidateBaseWorldPlugin'
command[command.index('-errSmoke')] = '-errBaseSmoke'
if a.smoke in {'station-teardown', 'prison-breach', 'powered-flight', 'powered-translate', 'local-admission', 'cache-loss', 'extraction-capacity', 'early-helicopter-loss', 'extraction-startup-failure', 'extraction-boundary-failure', 'transport-loss', 'transport-survey', 'lifecycle', 'objective-ui', 'recovery', 'prisoner-kit', 'medical', 'casualty-load', 'casualty-direct', 'casualty-bench', 'casualty-remove', 'environment', 'environment-restart', 'patrols', 'radio-document-loss', 'radio-document-loss-partial', 'guard-cancel', 'casualty-service'} and a.project != 'core': p.error('This fixture requires --project core')
@@ -0,0 +1,18 @@
{
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeBaseSmoke.c": {
"proposal_sha256": "e811e985048e07365569acde6b5f045d57e9bbf13927f85b74e6e347fd2ef571",
"baseline_sha256": "ec319b070bd915d0326b9be1fd3fbc7aabc58956982a2ec69eb24d023a651815"
},
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeObjectiveMapProbe.c": {
"proposal_sha256": "2d07b895cb74af58454605fb1c536a566733e3001a9375dd0677d5f274bf2a46",
"baseline_sha256": null
},
"tests/test_native_objective_map_probe.py": {
"proposal_sha256": "ef0663aa7d620e06fda63fef578abb397a9dcd8fe5336af5445056e32e19aa28",
"baseline_sha256": null
},
"tools/headless_workbench.py": {
"proposal_sha256": "02427c82e3d4f4ebbd46fe9a65e2076aa87c70a055ba7c535945abe10b29f514",
"baseline_sha256": "f9025e4b689bec477ab7f18840d024e7107ad7733e0ed8541714f9684d14ed41"
}
}
@@ -0,0 +1,13 @@
# Authored objective map presentation
Discovered sites and recovered mine warnings use their own map UI elements. They no longer enter the native player-annotation registry, whose user-content filtering also applies to static markers. Normal annotations and their restrictions are unchanged.
`ERR_DiscoveryMarker` retains the existing disclosed position/icon/text API. Rough site and mine positions remain stable 500 m grid centers. `ERR_ObjectiveMapPresentation` renders only those disclosed coordinates and owns its widget plus open/close/pan/zoom subscriptions. Stop and location deletion remove that presentation. Updating a clue changes the existing widget; reopening or replacing the map recreates it for the current map/configuration/canvas/container.
The standard map uses a sibling of the native `UIIconsContainer` under its existing `MapFrame`. Native faction/task refresh can clear its own icons without removing objectives. The shared map has an authored `ERR_ObjectiveOverlay` frame inside `RTTexture0`. Canvas-to-parent screen offsets and DPI conversion position the icon; viewport culling uses current projected pixels. Cursor input is ignored by the objective layout.
The opt-in Workbench `objective-map` fixture requires Core and one round. It opens the real native map menu through its API, then the shared-map root, supplies synthetic already-disclosed marker data, and checks rough/exact updates, pan/culling, asynchronous menu close/reopen, reused configuration with a new root, and teardown. It does not discover a mission location, move a player, alter inventory, simulate user input or change annotation restrictions. Its menu-close request waits for the native next-update callback. Six fixed capture holds permit a read-only observer to inspect the exact private test window.
System.MakeScreenshot captures from these runs showed only the world view and are not evidence of map UI rendering. UI qualification must refer to separately retained private-window screenshots and their process/display bindings. The shared fixture disables the render target and binds no physical model, so shared-root UI geometry does not establish visibility of the held texture or the normal 500 ms capture.
See the source-bound evidence and current status for completed checks. Manual map interaction, held-map capture, restricted-platform behavior, remote replication/JIP and multiplayer remain separate validation work. The previous packaged handoff remains unchanged until an explicit refresh.
@@ -0,0 +1,162 @@
{
"scope": "Independent read-only byte/integration review; no tests/native launched or tracked files edited. Only this report is written.",
"frozen_addons": {
"expected_count": 407,
"current_count": 407,
"missing": [],
"extra": [],
"changed": []
},
"erri-objective-map-proposal": {
"addons/core/Scripts/Game/ERR/00_Core/ERR_DiscoveryMap.c": {
"target_sha256": "dd350bdda1bdf427ab8cefab623fe60cce5332b062d1a29686fe52f73e9e83f1",
"proposal_file_sha256": "dd350bdda1bdf427ab8cefab623fe60cce5332b062d1a29686fe52f73e9e83f1",
"manifest_sha256": "dd350bdda1bdf427ab8cefab623fe60cce5332b062d1a29686fe52f73e9e83f1",
"baseline_sha256": "a97e131bcfc578fe57ec2ed075a2619ff5c4c0b4c12d65c2a92e9fb2b83ce958",
"baseline_file_sha256": "a97e131bcfc578fe57ec2ed075a2619ff5c4c0b4c12d65c2a92e9fb2b83ce958"
},
"addons/core/Scripts/Game/ERR/00_Core/ERR_ObjectiveMapPresentation.c": {
"target_sha256": "f189f8987244e10df61ac577bbbc952ed5c4e6c431a8e3cd192a10fe2e8c3bec",
"proposal_file_sha256": "f189f8987244e10df61ac577bbbc952ed5c4e6c431a8e3cd192a10fe2e8c3bec",
"manifest_sha256": "f189f8987244e10df61ac577bbbc952ed5c4e6c431a8e3cd192a10fe2e8c3bec",
"baseline_sha256": null,
"baseline_file_sha256": null
},
"addons/core/Scripts/Game/ERR/20_Intel/ERR_MineIntel.c": {
"target_sha256": "3ce16cebaa9703b2f9803df7c11614f94de6460a9136dab8f80dcad41ae2b1c2",
"proposal_file_sha256": "3ce16cebaa9703b2f9803df7c11614f94de6460a9136dab8f80dcad41ae2b1c2",
"manifest_sha256": "3ce16cebaa9703b2f9803df7c11614f94de6460a9136dab8f80dcad41ae2b1c2",
"baseline_sha256": "822a526af8814264ee45da21b675466abfece86aa573744ee78692bdd1f1bc66",
"baseline_file_sha256": "822a526af8814264ee45da21b675466abfece86aa573744ee78692bdd1f1bc66"
},
"addons/core/UI/layouts/ERRMap/ObjectiveMapElement.layout": {
"target_sha256": "b364752c44896d67dad07e466a04f4504a50813fb36ee7c34c9189ea9677b4e9",
"proposal_file_sha256": "b364752c44896d67dad07e466a04f4504a50813fb36ee7c34c9189ea9677b4e9",
"manifest_sha256": "b364752c44896d67dad07e466a04f4504a50813fb36ee7c34c9189ea9677b4e9",
"baseline_sha256": null,
"baseline_file_sha256": null
},
"addons/core/UI/layouts/ERRMap/ObjectiveMapElement.layout.meta": {
"target_sha256": "8691fe2eaf46568bca4a9f8128b247a8da810bb87a5546aa7ca3334e740270d6",
"proposal_file_sha256": "8691fe2eaf46568bca4a9f8128b247a8da810bb87a5546aa7ca3334e740270d6",
"manifest_sha256": "8691fe2eaf46568bca4a9f8128b247a8da810bb87a5546aa7ca3334e740270d6",
"baseline_sha256": null,
"baseline_file_sha256": null
},
"addons/core/UI/layouts/ERRMap/SharedMapRenderTarget.layout": {
"target_sha256": "6e83a9c70282aff43b23a08b732739e7a241a31e8abf200498c90a745d3d60dd",
"proposal_file_sha256": "6e83a9c70282aff43b23a08b732739e7a241a31e8abf200498c90a745d3d60dd",
"manifest_sha256": "6e83a9c70282aff43b23a08b732739e7a241a31e8abf200498c90a745d3d60dd",
"baseline_sha256": "49a2da4181b94d42174f58c7f9b6bf2207116c99427d61ff1c212092ac7db4d2",
"baseline_file_sha256": "49a2da4181b94d42174f58c7f9b6bf2207116c99427d61ff1c212092ac7db4d2"
},
"tests/test_mine_intel.py": {
"target_sha256": "db64129001c0010ad11389ff764356893ac7c4fbf45e7c82aa56bbe4c75f4929",
"proposal_file_sha256": "db64129001c0010ad11389ff764356893ac7c4fbf45e7c82aa56bbe4c75f4929",
"manifest_sha256": "db64129001c0010ad11389ff764356893ac7c4fbf45e7c82aa56bbe4c75f4929",
"baseline_sha256": "109d5c8532c3725ec3b42f7b0d769dfdf4eda5912a5d2409556c30f203cc6672",
"baseline_file_sha256": "109d5c8532c3725ec3b42f7b0d769dfdf4eda5912a5d2409556c30f203cc6672"
},
"tests/test_objective_map_element.py": {
"target_sha256": "b02e59f977aa81462649282f99e70b0b6320b31ba0ea46f586e9ac0c5d15b884",
"proposal_file_sha256": "b02e59f977aa81462649282f99e70b0b6320b31ba0ea46f586e9ac0c5d15b884",
"manifest_sha256": "b02e59f977aa81462649282f99e70b0b6320b31ba0ea46f586e9ac0c5d15b884",
"baseline_sha256": null,
"baseline_file_sha256": null
},
"tests/test_objective_map_presentation.py": {
"target_sha256": "2418f4c0f370bd436b316e56d5ead97ff4b6aa7cdfb3777c9d2af22486148268",
"proposal_file_sha256": "2418f4c0f370bd436b316e56d5ead97ff4b6aa7cdfb3777c9d2af22486148268",
"manifest_sha256": "2418f4c0f370bd436b316e56d5ead97ff4b6aa7cdfb3777c9d2af22486148268",
"baseline_sha256": null,
"baseline_file_sha256": null
}
},
"erri-objective-map-native-proposal": {
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeBaseSmoke.c": {
"target_sha256": "e811e985048e07365569acde6b5f045d57e9bbf13927f85b74e6e347fd2ef571",
"proposal_file_sha256": "e811e985048e07365569acde6b5f045d57e9bbf13927f85b74e6e347fd2ef571",
"manifest_sha256": "e811e985048e07365569acde6b5f045d57e9bbf13927f85b74e6e347fd2ef571",
"baseline_sha256": "ec319b070bd915d0326b9be1fd3fbc7aabc58956982a2ec69eb24d023a651815",
"baseline_file_sha256": "ec319b070bd915d0326b9be1fd3fbc7aabc58956982a2ec69eb24d023a651815"
},
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeObjectiveMapProbe.c": {
"target_sha256": "2d07b895cb74af58454605fb1c536a566733e3001a9375dd0677d5f274bf2a46",
"proposal_file_sha256": "2d07b895cb74af58454605fb1c536a566733e3001a9375dd0677d5f274bf2a46",
"manifest_sha256": "2d07b895cb74af58454605fb1c536a566733e3001a9375dd0677d5f274bf2a46",
"baseline_sha256": null,
"baseline_file_sha256": null
},
"tests/test_native_objective_map_probe.py": {
"target_sha256": "ef0663aa7d620e06fda63fef578abb397a9dcd8fe5336af5445056e32e19aa28",
"proposal_file_sha256": "ef0663aa7d620e06fda63fef578abb397a9dcd8fe5336af5445056e32e19aa28",
"manifest_sha256": "ef0663aa7d620e06fda63fef578abb397a9dcd8fe5336af5445056e32e19aa28",
"baseline_sha256": null,
"baseline_file_sha256": null
},
"tools/headless_workbench.py": {
"target_sha256": "02427c82e3d4f4ebbd46fe9a65e2076aa87c70a055ba7c535945abe10b29f514",
"proposal_file_sha256": "02427c82e3d4f4ebbd46fe9a65e2076aa87c70a055ba7c535945abe10b29f514",
"manifest_sha256": "02427c82e3d4f4ebbd46fe9a65e2076aa87c70a055ba7c535945abe10b29f514",
"baseline_sha256": "f9025e4b689bec477ab7f18840d024e7107ad7733e0ed8541714f9684d14ed41",
"baseline_file_sha256": "f9025e4b689bec477ab7f18840d024e7107ad7733e0ed8541714f9684d14ed41"
}
},
"preservation": {
"original": {
"root": "/home/jakub/devel/escapists",
"recorded_count": 533,
"changed": []
},
"latest_candidate": {
"root": "/home/jakub/devel/escapistsrereintroduced/.build/playtest-2026-10-02-owner-fixes",
"recorded_count": 412,
"changed": []
},
"inherited": {
"recorded_count": 61,
"unchanged_count": 59,
"changed": {
"tools/check.py": {
"before": "f57065733301100f0bd2c9a6a0ffb523d036dbc16c3d12842333b286c6ce817d",
"current": "0e3f6f2ba5ffd3fdc35fcc3da24aaac9e5074213c39f643fa915c58b3c2fb813",
"intended_registration_overlap": true,
"baseline_matches_inherited": true,
"target_matches_check_after": true
},
"tools/headless_workbench.py": {
"before": "f9025e4b689bec477ab7f18840d024e7107ad7733e0ed8541714f9684d14ed41",
"current": "02427c82e3d4f4ebbd46fe9a65e2076aa87c70a055ba7c535945abe10b29f514",
"intended_proposal_overlap": true,
"baseline_matches_inherited": true,
"target_matches_proposal": true
}
}
}
},
"registrations": {
"delta": [
"--- ",
"+++ ",
"@@ -8,6 +8,9 @@",
" BASE='58D0FB3206B6F859'",
" def check():",
" print(f'PASS: {check_prefabs((ROOT/\"addons\").rglob(\"*.et\"))} prefabs have unique saved root entity IDs')",
"+ subprocess.run([sys.executable,str(ROOT/'tests/test_objective_map_presentation.py')],check=True)",
"+ subprocess.run([sys.executable,str(ROOT/'tests/test_objective_map_element.py')],check=True)",
"+ subprocess.run([sys.executable,str(ROOT/'tests/test_native_objective_map_probe.py')],check=True)",
" subprocess.run([sys.executable,str(ROOT/'tests/test_prefab_identity.py')],check=True)",
" subprocess.run([sys.executable,str(ROOT/'tests/test_spawn_scene.py')],check=True)",
" subprocess.run([sys.executable,str(ROOT/'tests/test_spawn_scene_inventory.py')],check=True)"
],
"only_three_additions": true,
"target_matches_saved_after": true
},
"index": {
"current_diff_sha256": "670073db5d7531aca4466cc9d2827d10a46bfcfbd35f27ac97724de9d2fd3725",
"before_diff_sha256": "670073db5d7531aca4466cc9d2827d10a46bfcfbd35f27ac97724de9d2fd3725",
"byte_identical": true
},
"issues": [],
"verdict": "PASS"
}
@@ -0,0 +1,20 @@
check: /tmp/err-policy-o511s0tj/check.cpp:59: int main(): Assertion `probe.Inspect(text.label,false)' failed.
PASS: actual native fixture root/config ownership and idempotent cleanup preserve foreign map, selector excludes ordinary route, fixed budgets/screenshots/UGC boundaries retained; native operations not executed
Traceback (most recent call last):
File "/tmp/erri-objective-map-native-proposal/tests/test_native_objective_map_probe.py", line 67, in <module>
run(r'''
~~~^^^^^
#include <cassert>
^^^^^^^^^^^^^^^^^^
...<44 lines>...
}
^
''')
^^^^
File "/home/jakub/devel/escapistsrereintroduced/tests/policy_harness.py", line 14, in run
subprocess.run([str(p/'check')],check=True)
~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.14/subprocess.py", line 578, in run
raise CalledProcessError(retcode, process.args,
output=stdout, stderr=stderr)
subprocess.CalledProcessError: Command '['/tmp/err-policy-o511s0tj/check']' died with <Signals.SIGABRT: 6>.
@@ -0,0 +1,22 @@
import ctypes as c
from PIL import Image
def capture(display_name,dest,window=None):
x=c.CDLL('libX11.so.6')
x.XOpenDisplay.argtypes=[c.c_char_p];x.XOpenDisplay.restype=c.c_void_p
x.XDefaultRootWindow.argtypes=[c.c_void_p];x.XDefaultRootWindow.restype=c.c_ulong
x.XGetGeometry.argtypes=[c.c_void_p,c.c_ulong,c.POINTER(c.c_ulong),c.POINTER(c.c_int),c.POINTER(c.c_int),c.POINTER(c.c_uint),c.POINTER(c.c_uint),c.POINTER(c.c_uint),c.POINTER(c.c_uint)]
class XI(c.Structure):
_fields_=[('width',c.c_int),('height',c.c_int),('xoffset',c.c_int),('format',c.c_int),('data',c.c_void_p),('byte_order',c.c_int),('bitmap_unit',c.c_int),('bitmap_bit_order',c.c_int),('bitmap_pad',c.c_int),('depth',c.c_int),('bytes_per_line',c.c_int),('bits_per_pixel',c.c_int),('red_mask',c.c_ulong),('green_mask',c.c_ulong),('blue_mask',c.c_ulong)]
x.XGetImage.argtypes=[c.c_void_p,c.c_ulong,c.c_int,c.c_int,c.c_uint,c.c_uint,c.c_ulong,c.c_int];x.XGetImage.restype=c.POINTER(XI)
x.XDestroyImage.argtypes=[c.POINTER(XI)];x.XCloseDisplay.argtypes=[c.c_void_p]
d=x.XOpenDisplay(display_name.encode())
if not d:raise RuntimeError('Cannot open verified private display')
root=window or x.XDefaultRootWindow(d);r=c.c_ulong();xx=c.c_int();yy=c.c_int();w=c.c_uint();h=c.c_uint();bw=c.c_uint();depth=c.c_uint()
if not x.XGetGeometry(d,root,c.byref(r),c.byref(xx),c.byref(yy),c.byref(w),c.byref(h),c.byref(bw),c.byref(depth)):raise RuntimeError('No root geometry')
im=x.XGetImage(d,root,0,0,w.value,h.value,c.c_ulong(-1).value,2)
if not im:raise RuntimeError('No private screenshot')
v=im.contents
assert v.bits_per_pixel==32 and v.byte_order==0 and (v.red_mask,v.green_mask,v.blue_mask)==(0xff0000,0xff00,0xff)
Image.frombytes('RGB',(w.value,h.value),c.string_at(v.data,v.bytes_per_line*h.value),'raw','BGRX',v.bytes_per_line).save(dest)
x.XDestroyImage(im);x.XCloseDisplay(d)
@@ -0,0 +1,28 @@
UNINTEGRATED PROTOTYPE — native compilation/rendering required before admission
Current target untouched. fix.patch has 3 script files (one new), own layout+meta, existing mine-test adapter, and new actual-method overlay regression. Exact baseline hashes and unchanged-current-target comparison are in source-manifest.json; baseline/ retains original bytes.
Supported presentation approach:
ERR_ObjectiveMapElement derives SCR_MapUIElement, as vanilla task UI does. Quantized authored site/mine data is presented outside SCR_MapMarkerManagerComponent static annotation arrays. No SetBlocked override, no user/platform restriction changes, no task entities and no new position discovery. Existing ERR_DiscoveryMarker remains data/API compatibility. Two producer calls switch to own ERR_InsertDiscoveryMarker adapter. Old static removal remains solely defensive/legacy native-probe compatibility.
Checks:
overlay-green.log: actual Start/SetData/Refresh/Close/Clear/Stop/ownership with native doubles; delayed initial controller/widget, map reopen, rough->exact data, pan/zoom/culling, reused config/new canvas, multiple independent owners, stop and missing handler retry.
mine-green.log: existing actual mine service/marker lifecycle adapted only for new insertion adapter.
canvas-mutation-red.log: removing exact canvas identity compiles then fails actual replacement-cleanup assertion. This is a mutation control, NOT a baseline native rendering reproduction.
Native UGC compatibility finding remains SDK source evidence, not a restricted-platform run.
SDK API checks:
scripts/Game/Map/SCR_MapEntity.c:86-100 declares open/close config, pan(float,float,bool), zoom(float). WorldToScreen904-920 adds DPI-scaled pan but no parent origin. Native MapUIElementContainer.UpdateIcons uses same WorldToScreen+DPIUnscale relative UI positioning. New canvas-child anchoring requires native verification.
CloseMap324-331 calls OnMapClose synchronously before IsOpen=false; OnMapClose377-380 invokes current config, without queued callback. Closed(config) clears only retained same config. An artificial delayed close with reused identical config cannot be distinguished and is NOT proven safe; no native delayed source found.
Native GetMapVisibleFrame207 returns cached state updated after map callbacks/frame. Overlay instead culls against current transformed pixel coordinates and current canvas screen dimensions.
SCR_MapUIElement base has no OnUpdate override; HandlerAttached tolerates absent highlight/gradient; OnClick only calls overridden no-op SelectIcon when visible. Layout ignores cursor on root/image/text. Native hit testing remains unverified.
HARD next gates (one bounded opt-in native fixture before normal rollout):
1. Compile new class/layout/resource; register test/resource manifest separately; root owns check.py.
2. Actually render known rough and exact objective overlay on ordinary M-key map; verify icon centered on coordinate and exact text updates, including long mine warning labels. Root alignment(.5,.28125) centers36px icon within64px overall box.
3. Pan/zoom/cull and close/reopen, with overlay inside correct parent canvas at multiple UI scales. Verify no click/drag/delete/input interception and unchanged normal annotations/privacy behavior.
4. Shared held-map500ms capture: verify overlay participates in RT surface without altering normal map/camera ownership.
5. JIP/missing controller and mission/location deletion cleanup, map replacement. No duplicate widgets/subscriptions or old native static marker entries.
6. Existing ERR_NativeDiscoveryMapProbe checks legacy static-marker API; it does NOT validate the new path and must not be reported as new overlay evidence. Add new fixture rather than silently reinterpret old claims.
Do not apply prototype until review and explicit parent integration. This heartbeat package contains only previously validated owner fixes.
@@ -0,0 +1,502 @@
--- a/addons/core/Scripts/Game/ERR/00_Core/ERR_DiscoveryMap.c
+++ b/addons/core/Scripts/Game/ERR/00_Core/ERR_DiscoveryMap.c
@@ -15,6 +15,7 @@
class ERR_DiscoveryMarker : SCR_MapMarkerBase
{
protected string m_Icon = "supplies";
+ protected ref ERR_ObjectiveMapPresentation m_ERRPresentation;
static string Icon(ERR_LocationKind kind, string id)
{
if (kind == ERR_LocationKind.EXTRACTION) return "helicopters";
@@ -29,6 +30,7 @@
m_Icon = "mark-question";
if (knowledge >= 2) m_Icon = Icon(kind, id);
ApplyIcon();
+ RefreshPresentation();
}
protected void ApplyIcon()
{
@@ -46,10 +48,26 @@
}
widget.SetColor(Color.FromSRGBA(35, 45, 50, 255));
}
+ // Production authored objectives use a separate map UI element. They never
+ // enter the player-annotation registry or change its content restrictions.
+ void StartPresentation()
+ {
+ if (!m_ERRPresentation) m_ERRPresentation = new ERR_ObjectiveMapPresentation();
+ RefreshPresentation();
+ m_ERRPresentation.Start();
+ }
+ void RefreshPresentation()
+ {
+ if (!m_ERRPresentation) return;
+ int point[2];
+ GetWorldPos(point);
+ m_ERRPresentation.SetData(Vector(point[0], 0, point[1]), GetCustomText(), m_Icon);
+ }
void ERR_DiscoveryMarker() { SetCanBeRemovedByOwner(false); }
void SetDiscoveryPosition(vector position, int knowledge)
{
SetWorldPos(ERR_DiscoveryMapRules.Coordinate(position[0], knowledge), ERR_DiscoveryMapRules.Coordinate(position[2], knowledge));
+ RefreshPresentation();
}
override void OnCreateMarker(bool skipProfanityFilter = false)
{
@@ -61,6 +79,8 @@
}
override void OnDelete()
{
+ if (m_ERRPresentation) m_ERRPresentation.Stop();
+ m_ERRPresentation = null;
SCR_MapEntity.GetOnMapClose().Remove(OnMapClosed);
SCR_MapEntity.GetOnLayerChanged().Remove(OnMapLayerChanged);
super.OnDelete();
@@ -70,6 +90,7 @@
override void SetCustomText(string text)
{
super.SetCustomText(text);
+ RefreshPresentation();
// Native SetCustomText updates data only; an already-open map needs its
// existing widget updated too. Closed maps use the saved text on creation.
SCR_MapMarkerWidgetComponent widget = GetMarkerComponent();
@@ -81,6 +102,10 @@
// must also leave the disabled list or map movement can resurrect it later.
modded class SCR_MapMarkerManagerComponent
{
+ void ERR_InsertDiscoveryMarker(ERR_DiscoveryMarker marker)
+ {
+ if (marker) marker.StartPresentation();
+ }
void ERR_RemoveDiscoveryMarker(ERR_DiscoveryMarker marker)
{
if (!marker || marker.GetMarkerID() != -1) return;
@@ -115,6 +140,7 @@
m_ERRMarker = null; m_ERRShown = 0; m_ERRShownLabel = "";
return;
}
+ if (m_ERRMarker) m_ERRMarker.RefreshPresentation();
if (Knowledge() == m_ERRShown && Label() == m_ERRShownLabel) return;
SCR_MapMarkerManagerComponent manager = SCR_MapMarkerManagerComponent.GetInstance();
if (!manager || !manager.GetMarkerConfig()) return;
@@ -136,15 +162,13 @@
m_ERRMarker.SetMarkerConfigID(0);
m_ERRMarker.SetLocationIcon(Kind(), Id(), Knowledge());
m_ERRMarker.SetCustomText(label);
- manager.InsertStaticMarker(m_ERRMarker, true);
+ manager.ERR_InsertDiscoveryMarker(m_ERRMarker);
}
m_ERRMarker.SetDiscoveryPosition(Position(), Knowledge());
m_ERRMarker.SetLocationIcon(Kind(), Id(), Knowledge());
m_ERRMarker.SetCustomText(label);
- // Reactivate a previously culled rough marker if the exact point moves
- // into the open map's view. Native update performs normal visibility checks.
- SCR_MapEntity mapEntity = SCR_MapEntity.GetMapInstance();
- if (mapEntity && mapEntity.IsOpen()) manager.SetStaticMarkerDisabled(m_ERRMarker, false);
+ // The objective presentation performs its own normal viewport culling.
+ m_ERRMarker.RefreshPresentation();
m_ERRShown = Knowledge();
m_ERRShownLabel = Label();
}
--- /dev/null
+++ b/addons/core/Scripts/Game/ERR/00_Core/ERR_ObjectiveMapPresentation.c
@@ -0,0 +1,134 @@
+// Authored objective UI, separate from user-created map annotations. The data
+// owner supplies only its already-discovered, quantized map position.
+class ERR_ObjectiveMapElement : SCR_MapUIElement
+{
+ protected vector m_ERRPosition;
+ protected ImageWidget m_ERRImage;
+ protected TextWidget m_ERRText;
+ protected bool m_ERRTextReady, m_ERRImageReady;
+ protected string m_ERRLastText, m_ERRLastIcon;
+ override void HandlerAttached(Widget w)
+ {
+ super.HandlerAttached(w);
+ m_ERRImage = ImageWidget.Cast(w.FindAnyWidget("Image"));
+ m_ERRText = TextWidget.Cast(w.FindAnyWidget("ObjectiveText"));
+ }
+ override vector GetPos() { return m_ERRPosition; }
+ void SetObjective(vector position, string text, string icon)
+ {
+ m_ERRPosition = position;
+ if (m_ERRText && (!m_ERRTextReady || m_ERRLastText != text))
+ {
+ m_ERRText.SetText(text); m_ERRLastText = text; m_ERRTextReady = true;
+ }
+ if (!m_ERRImage || (m_ERRImageReady && m_ERRLastIcon == icon)) return;
+ ResourceName imageSet = "{3262679C50EF4F01}UI/Textures/Icons/icons_wrapperUI.imageset";
+ if (icon == "mark-question") imageSet = "{E23427CAC80DA8B7}UI/Textures/Icons/icons_mapMarkersUI.imageset";
+ m_ERRImage.LoadImageFromSet(0, imageSet, icon);
+ m_ERRLastIcon = icon; m_ERRImageReady = true;
+ }
+ // The layout ignores pointer input; objectives cannot select, drag or edit.
+ override void SelectIcon(bool invoke = true) {}
+}
+
+class ERR_ObjectiveMapPresentation
+{
+ protected const ResourceName LAYOUT = "{B7DB6D50FA954684}UI/layouts/ERRMap/ObjectiveMapElement.layout";
+ protected bool m_Started;
+ protected vector m_Position;
+ protected string m_Text, m_Icon;
+ protected SCR_MapEntity m_Map;
+ protected MapConfiguration m_Config;
+ protected Widget m_Canvas, m_Container, m_Root;
+ protected ERR_ObjectiveMapElement m_Element;
+ void SetData(vector position, string text, string icon)
+ {
+ m_Position = position; m_Text = text; m_Icon = icon;
+ if (m_Started) Refresh();
+ }
+ void Start()
+ {
+ if (!m_Started)
+ {
+ m_Started = true;
+ SCR_MapEntity.GetOnMapOpenComplete().Insert(Opened);
+ SCR_MapEntity.GetOnMapClose().Insert(Closed);
+ SCR_MapEntity.GetOnMapPan().Insert(Panned);
+ SCR_MapEntity.GetOnMapZoom().Insert(Zoomed);
+ }
+ Refresh();
+ }
+ protected void Opened(MapConfiguration config) { Refresh(); }
+ protected void Panned(float x, float y, bool adjusted) { Refresh(); }
+ protected void Zoomed(float zoom) { Refresh(); }
+ protected void Closed(MapConfiguration config)
+ {
+ if (config == m_Config) ClearWidget();
+ }
+ protected void ClearWidget()
+ {
+ if (m_Root) m_Root.RemoveFromHierarchy();
+ m_Root = null; m_Element = null; m_Map = null; m_Config = null; m_Canvas = null; m_Container = null;
+ }
+ static Widget Container(Widget mapRoot)
+ {
+ if (!mapRoot) return null;
+ Widget authored = mapRoot.FindAnyWidget("ERR_ObjectiveOverlay");
+ if (authored) return authored;
+ Widget icons = mapRoot.FindAnyWidget("UIIconsContainer");
+ // Vanilla deletes every child of its icons container on faction refresh.
+ // Use its supported parent instead, so our widget is an independent sibling.
+ if (icons) return icons.GetParent();
+ return null;
+ }
+ protected bool OwnsSurface(SCR_MapEntity mapEntity, MapConfiguration config, Widget canvas, Widget container)
+ {
+ if (!m_Root || !m_Element) return false;
+ return m_Map == mapEntity && m_Config == config && m_Canvas == canvas && m_Container == container && m_Root.GetParent() == container;
+ }
+ void Refresh()
+ {
+ if (!m_Started || !GetGame()) return;
+ SCR_MapEntity mapEntity = SCR_MapEntity.GetMapInstance();
+ if (!GetGame().GetPlayerController() || !mapEntity || !mapEntity.IsOpen()) { ClearWidget(); return; }
+ MapConfiguration config = mapEntity.GetMapConfig();
+ Widget canvas = mapEntity.GetMapWidget();
+ Widget container = Container(mapEntity.GetMapMenuRoot());
+ if (!config || !canvas || !container || container == canvas || !GetGame().GetWorkspace()) { ClearWidget(); return; }
+ // The same native config object can be reused for another root/canvas.
+ if (!OwnsSurface(mapEntity, config, canvas, container))
+ {
+ ClearWidget();
+ m_Map = mapEntity; m_Config = config; m_Canvas = canvas; m_Container = container;
+ m_Root = GetGame().GetWorkspace().CreateWidgets(LAYOUT, container);
+ if (!m_Root) { ClearWidget(); return; }
+ m_Element = ERR_ObjectiveMapElement.Cast(m_Root.FindHandler(ERR_ObjectiveMapElement));
+ if (!m_Element) { ClearWidget(); return; }
+ }
+ m_Element.SetObjective(m_Position, m_Text, m_Icon);
+ int x, y;
+ mapEntity.WorldToScreen(m_Position[0], m_Position[2], x, y, true);
+ // Use current pixel coordinates: the native cached world viewport is updated
+ // after pan/zoom callbacks and may still describe the preceding frame.
+ float width, height;
+ canvas.GetScreenSize(width, height);
+ bool visible = width > 0 && height > 0;
+ if (x < 0 || y < 0 || x > width || y > height) visible = false;
+ m_Root.SetVisible(visible);
+ if (!visible) return;
+ float canvasX, canvasY, containerX, containerY;
+ canvas.GetScreenPos(canvasX, canvasY);
+ container.GetScreenPos(containerX, containerY);
+ FrameSlot.SetPos(m_Root, GetGame().GetWorkspace().DPIUnscale(canvasX + x - containerX), GetGame().GetWorkspace().DPIUnscale(canvasY + y - containerY));
+ }
+ void Stop()
+ {
+ m_Started = false;
+ SCR_MapEntity.GetOnMapOpenComplete().Remove(Opened);
+ SCR_MapEntity.GetOnMapClose().Remove(Closed);
+ SCR_MapEntity.GetOnMapPan().Remove(Panned);
+ SCR_MapEntity.GetOnMapZoom().Remove(Zoomed);
+ ClearWidget();
+ }
+ void ~ERR_ObjectiveMapPresentation() { Stop(); }
+}
--- a/addons/core/Scripts/Game/ERR/20_Intel/ERR_MineIntel.c
+++ b/addons/core/Scripts/Game/ERR/20_Intel/ERR_MineIntel.c
@@ -144,7 +144,7 @@
marker.SetDiscoveryPosition(m_ERRMineAreas[i], 1);
marker.SetLocationIcon(ERR_LocationKind.OUTPOST, "", 1);
marker.SetCustomText("Reported mine area (500 m); may still be active");
- manager.InsertStaticMarker(marker, true);
+ manager.ERR_InsertDiscoveryMarker(marker);
m_ERRMineMarkers.Insert(marker);
}
}
--- /dev/null
+++ b/addons/core/UI/layouts/ERRMap/ObjectiveMapElement.layout
@@ -0,0 +1,54 @@
+FrameWidgetClass {
+ Name "ObjectiveMapElement"
+ Clipping False
+ Slot FrameWidgetSlot {
+ SizeX 360
+ OffsetRight -360
+ SizeY 64
+ OffsetBottom -64
+ Alignment 0.5 0.28125
+ }
+ "Z Order" 70
+ "Ignore Cursor" 1
+ components {
+ ERR_ObjectiveMapElement {
+ m_bUseBackgroundGradient 0
+ }
+ }
+ {
+ ImageWidgetClass {
+ Name "Image"
+ Slot FrameWidgetSlot {
+ Anchor 0.5 0 0.5 0
+ SizeX 36
+ OffsetRight -36
+ SizeY 36
+ OffsetBottom -36
+ Alignment 0.5 0
+ }
+ "Ignore Cursor" 1
+ Color 0.016 0.026 0.032 1
+ Texture "{E23427CAC80DA8B7}UI/Textures/Icons/icons_mapMarkersUI.imageset"
+ Image "mark-question"
+ }
+ TextWidgetClass {
+ Name "ObjectiveText"
+ Clipping False
+ Slot FrameWidgetSlot {
+ OffsetTop 38
+ SizeX 360
+ OffsetRight -360
+ SizeY 26
+ OffsetBottom -26
+ }
+ "Ignore Cursor" 1
+ Color 0.016 0.026 0.032 1
+ Text ""
+ "Font Size" 14
+ "Horizontal Alignment" Center
+ FontProperties FontProperties {
+ Font "{3E7733BAC8C831F6}UI/Fonts/RobotoCondensed/RobotoCondensed_Regular.fnt"
+ }
+ }
+ }
+}
--- /dev/null
+++ b/addons/core/UI/layouts/ERRMap/ObjectiveMapElement.layout.meta
@@ -0,0 +1,17 @@
+MetaFileClass {
+ Name "{B7DB6D50FA954684}UI/layouts/ERRMap/ObjectiveMapElement.layout"
+ Configurations {
+ LayoutResourceClass PC {
+ }
+ LayoutResourceClass XBOX_ONE : PC {
+ }
+ LayoutResourceClass XBOX_SERIES : PC {
+ }
+ LayoutResourceClass PS4 : PC {
+ }
+ LayoutResourceClass PS5 : PC {
+ }
+ LayoutResourceClass HEADLESS : PC {
+ }
+ }
+}
\ No newline at end of file
--- a/addons/core/UI/layouts/ERRMap/SharedMapRenderTarget.layout
+++ b/addons/core/UI/layouts/ERRMap/SharedMapRenderTarget.layout
@@ -33,6 +33,18 @@
Clear 1
ClearColor 0.78 0.74 0.62 1
}
+ FrameWidgetClass {
+ Name "ERR_ObjectiveOverlay"
+ Slot FrameWidgetSlot {
+ Anchor 0 0 1 1
+ SizeX -1024
+ OffsetRight 0
+ SizeY -1024
+ OffsetBottom 0
+ }
+ Clipping True
+ "Ignore Cursor" 1
+ }
}
}
}
--- a/tests/test_mine_intel.py
+++ b/tests/test_mine_intel.py
@@ -53,7 +53,7 @@
struct Invoker {int removed=0;void Remove(int){removed++;}};
namespace ERR_LocationKind {int OUTPOST=3;}namespace SCR_EMapMarkerType {int PLACED_CUSTOM=1;}
struct ERR_DiscoveryMarker {vector position;std::string label;int deleted=0;void SetType(int){}void SetMarkerConfigID(int){}void SetDiscoveryPosition(vector p,int){position=p;}void SetLocationIcon(int,std::string,int){}void SetCustomText(std::string s){label=s;}void OnDelete(){deleted++;}};
-struct SCR_MapMarkerManagerComponent {static inline SCR_MapMarkerManagerComponent*current=nullptr;bool config=true;Array<ERR_DiscoveryMarker*> inserted,removed;static SCR_MapMarkerManagerComponent*GetInstance(){return current;}bool GetMarkerConfig(){return config;}void InsertStaticMarker(ERR_DiscoveryMarker*m,bool){inserted.Insert(m);}void ERR_RemoveDiscoveryMarker(ERR_DiscoveryMarker*m){removed.Insert(m);m->OnDelete();}};
+struct SCR_MapMarkerManagerComponent {static inline SCR_MapMarkerManagerComponent*current=nullptr;bool config=true;Array<ERR_DiscoveryMarker*> inserted,removed;static SCR_MapMarkerManagerComponent*GetInstance(){return current;}bool GetMarkerConfig(){return config;}void ERR_InsertDiscoveryMarker(ERR_DiscoveryMarker*m){inserted.Insert(m);}void ERR_RemoveDiscoveryMarker(ERR_DiscoveryMarker*m){removed.Insert(m);m->OnDelete();}};
struct ERR_MineIntel;
struct ERR_GameMode {static inline ERR_GameMode*current=nullptr;bool active=true;int enemy=1,player=2;DiscoveryService discovery;PlayersService players;Invoker stop;
ERR_MineIntel*m_ERRMineIntel=nullptr;Array<vector>m_ERRMineAreas;Array<ERR_DiscoveryMarker*>m_ERRMineMarkers;bool m_ERRMineIntelStopped=false;SCR_MapMarkerManagerComponent*m_ERRMineMarkerOwner=nullptr;
--- /dev/null
+++ b/tests/test_objective_map_element.py
@@ -0,0 +1,38 @@
+"""Actual authored map element updates avoid repeated text/texture loads while panning."""
+from pathlib import Path
+import os
+from policy_harness import ROOT, body, run
+root=Path(os.environ.get('ERR_OBJECTIVE_MAP_ROOT',ROOT))
+p=root/'addons/core/Scripts/Game/ERR/00_Core/ERR_ObjectiveMapPresentation.c'
+# Native Enforce requires the inherited override argument name, not only its type.
+assert 'override void HandlerAttached(Widget w)' in p.read_text()
+assert 'super.HandlerAttached(w);' in body(p,'override void HandlerAttached(')
+s=body(p,'void SetObjective(').replace('ResourceName','string')
+for n in ['m_ERRText','m_ERRImage']:s=s.replace(n+'.',n+'->')
+run(r'''
+#include <cassert>
+#include <string>
+using string=std::string;
+struct vector{int x=0,z=0;};
+struct TextWidget{string text;int sets=0;void SetText(string t){text=t;sets++;}};
+struct ImageWidget{string source,icon;int loads=0;void LoadImageFromSet(int,string s,string i){source=s;icon=i;loads++;}};
+struct Element{vector m_ERRPosition;TextWidget*m_ERRText=nullptr;ImageWidget*m_ERRImage=nullptr;bool m_ERRTextReady=false,m_ERRImageReady=false;string m_ERRLastText,m_ERRLastIcon;
+'''+s+r'''
+};
+int main(){
+ TextWidget text;ImageWidget image;Element e;e.m_ERRText=&text;e.m_ERRImage=&image;
+ e.SetObjective({250,750},"Unknown location (500 m area)","mark-question");assert(text.sets==1&&image.loads==1&&image.source.find("icons_mapMarkersUI")!=string::npos);
+ for(int i=0;i<500;i++)e.SetObjective({i,750},"Unknown location (500 m area)","mark-question");
+ assert(text.sets==1&&image.loads==1&&e.m_ERRPosition.x==499);
+ e.SetObjective({612,734},"Radio station","radio");assert(text.sets==2&&image.loads==2&&image.icon=="radio"&&image.source.find("icons_wrapperUI")!=string::npos);
+ e.SetObjective({612,734},"Changed label","radio");assert(text.sets==3&&image.loads==2);
+ e.SetObjective({612,734},"Changed label","supplies");assert(text.sets==3&&image.loads==3);
+ // Each new widget initializes even for the same data; caches are instance-owned.
+ TextWidget nextText;ImageWidget nextImage;Element next;next.m_ERRText=&nextText;next.m_ERRImage=&nextImage;
+ next.SetObjective({612,734},"Changed label","supplies");assert(nextText.sets==1&&nextImage.loads==1&&text.sets==3);
+ Element delayed;delayed.SetObjective({1,2},"", "mark-question");assert(!delayed.m_ERRTextReady&&!delayed.m_ERRImageReady&&delayed.m_ERRPosition.z==2);
+ delayed.m_ERRText=&nextText;delayed.SetObjective({3,4},"", "mark-question");assert(nextText.text.empty()&&delayed.m_ERRTextReady&&!delayed.m_ERRImageReady);
+ int sets=nextText.sets;delayed.m_ERRImage=&nextImage;delayed.SetObjective({5,6},"", "mark-question");assert(nextText.sets==sets&&delayed.m_ERRImageReady&&nextImage.loads==2);
+}
+''')
+print('PASS: actual map element initializes each widget, retries missing widgets, updates position and changes only stale text/icon data; no native image-load claim')
--- /dev/null
+++ b/tests/test_objective_map_presentation.py
@@ -0,0 +1,100 @@
+"""Actual objective overlay lifecycle with explicit native widget/map doubles.
+No claim of native rendering, clipping, layout, remote or platform validation.
+"""
+import os,re
+from pathlib import Path
+from policy_harness import ROOT,body,run
+root=Path(os.environ.get('ERR_OBJECTIVE_MAP_ROOT',ROOT))
+p=root/'addons/core/Scripts/Game/ERR/00_Core/ERR_ObjectiveMapPresentation.c'
+def cpp(s):
+ s=s.replace('protected ','').replace('null','nullptr')
+ s=s.replace('SCR_MapEntity.','SCR_MapEntity::').replace('ERR_ObjectiveMapElement.Cast','ERR_ObjectiveMapElement::Cast').replace('FrameSlot.','FrameSlot::')
+ for t in ['SCR_MapEntity','MapConfiguration','Widget']:
+ s=re.sub(r'\b'+t+r' (\w+)',t+r'* \1',s)
+ for n in ['mapEntity','canvas','container','mapRoot','authored','icons','m_Root','m_Element']:
+ s=re.sub(r'\b'+n+r'\.',n+'->',s)
+ for n in ['GetGame','GetWorkspace','GetOnMapOpenComplete','GetOnMapClose','GetOnMapPan','GetOnMapZoom']:
+ s=s.replace(n+'().',n+'()->')
+ s=s.replace('FindHandler(ERR_ObjectiveMapElement)','FindHandler()')
+ for n in ['Opened','Closed','Panned','Zoomed']:
+ s=s.replace('Insert('+n+')','Insert(this)').replace('Remove('+n+')','Remove(this)')
+ return s
+methods='\n'.join(cpp(body(p,s)) for s in ['void SetData(', 'void Start(', 'protected void Opened(', 'protected void Panned(', 'protected void Zoomed(', 'protected void Closed(', 'protected void ClearWidget(', 'static Widget Container(', 'protected bool OwnsSurface(', 'void Refresh(', 'void Stop('])
+run(r'''
+#include <cassert>
+#include <string>
+#include <set>
+#include <vector>
+using string=std::string;
+struct vector{float v[3]={0,0,0};float&operator[](int i){return v[i];}};
+struct MapConfiguration{};
+struct ERR_ObjectiveMapElement{vector pos;string text,icon;int sets=0;static ERR_ObjectiveMapElement*Cast(ERR_ObjectiveMapElement*p){return p;}void SetObjective(vector p,string t,string i){pos=p;text=t;icon=i;sets++;}};
+struct Widget{bool visible=false,removed=false,handler=true;int removals=0;float x=0,y=0,sx=0,sy=0;bool isCanvas=false;Widget*parent=nullptr,*authored=nullptr,*icons=nullptr;std::vector<Widget*>children;Widget*GetParent(){return parent;}Widget*FindAnyWidget(string n){return n=="ERR_ObjectiveOverlay"?authored:icons;}void GetScreenPos(float&a,float&b){a=sx;b=sy;}void ClearChildren(){for(auto*w:children)w->RemoveFromHierarchy();children.clear();}void GetScreenSize(float&w,float&h){w=4000;h=4000;}ERR_ObjectiveMapElement element;ERR_ObjectiveMapElement*FindHandler(){return handler?&element:nullptr;}void RemoveFromHierarchy(){removed=true;removals++;}void SetVisible(bool v){visible=v;}};
+struct Event{std::set<void*>subscribers;int inserts=0;void Insert(void*p){subscribers.insert(p);inserts++;}void Remove(void*p){subscribers.erase(p);}};
+struct SCR_MapEntity{
+ static inline SCR_MapEntity*current=nullptr;static inline Event opened,closed,panned,zoomed;
+ bool open=true;MapConfiguration config;Widget canvas,mapRoot,icons,frame;Widget*activeCanvas=&canvas;
+ SCR_MapEntity(){canvas.isCanvas=true;mapRoot.icons=&icons;icons.parent=&frame;}Widget*GetMapMenuRoot(){return &mapRoot;}
+ vector minimum{{0,0,0}},maximum{{1000,0,1000}};int transforms=0;float zoom=2,pan=0;
+ static SCR_MapEntity*GetMapInstance(){return current;}static Event*GetOnMapOpenComplete(){return &opened;}static Event*GetOnMapClose(){return &closed;}static Event*GetOnMapPan(){return &panned;}static Event*GetOnMapZoom(){return &zoomed;}
+ bool IsOpen(){return open;}MapConfiguration*GetMapConfig(){return &config;}Widget*GetMapWidget(){return activeCanvas;}
+ void GetMapVisibleFrame(vector&a,vector&b){a=minimum;b=maximum;}
+ void WorldToScreen(float x,float y,int&sx,int&sy,bool){transforms++;sx=x*zoom+pan;sy=y*zoom+pan;}
+};
+struct Workspace{bool fail=false,missingHandler=false;int creates=0;std::vector<Widget*>widgets;Widget*CreateWidgets(const char*,Widget*parent){creates++;if(fail||parent->isCanvas)return nullptr;auto*w=new Widget();w->parent=parent;parent->children.push_back(w);w->handler=!missingHandler;widgets.push_back(w);return w;}float DPIUnscale(float x){return x/2;}~Workspace(){for(auto*w:widgets)delete w;}};
+struct Game{bool controller=true,workspaceReady=true;Workspace workspace;bool GetPlayerController(){return controller;}Workspace*GetWorkspace(){return workspaceReady?&workspace:nullptr;}}game;Game*GetGame(){return &game;}
+namespace FrameSlot{void SetPos(Widget*w,float x,float y){w->x=x;w->y=y;}}
+struct Presentation{
+ static constexpr auto LAYOUT="authored-layout";bool m_Started=false;vector m_Position;string m_Text,m_Icon;SCR_MapEntity*m_Map=nullptr;MapConfiguration*m_Config=nullptr;Widget*m_Canvas=nullptr,*m_Container=nullptr,*m_Root=nullptr;ERR_ObjectiveMapElement*m_Element=nullptr;
+'''+methods+r'''
+};
+int main(){
+ SCR_MapEntity map;SCR_MapEntity::current=&map;map.canvas.sx=120;map.canvas.sy=60;map.frame.sx=20;map.frame.sy=10;
+ Presentation a,b;a.SetData(vector{{250,0,750}},"Unknown location (500 m area)","mark-question");
+ game.controller=false;a.Start();assert(!a.m_Root&&SCR_MapEntity::opened.subscribers.count(&a));
+ game.controller=true;a.Refresh();Widget*first=a.m_Root;assert(first&&first->visible&&first->x==300&&first->y==775&&first->parent==&map.frame);
+ assert(first->element.pos[0]==250&&first->element.text=="Unknown location (500 m area)");
+ int created=game.workspace.creates;a.Start();a.Opened(&map.config);assert(game.workspace.creates==created&&SCR_MapEntity::opened.inserts==1);
+ // Native user-annotation privacy has no state/input in this objective registry.
+ // Ordinary annotations remain outside these methods and are not mutated.
+ bool userAnnotationBlocked=true;
+ a.SetData(vector{{612,0,734}},"Radio station","radio");assert(a.m_Root==first&&first->element.icon=="radio"&&userAnnotationBlocked);
+ map.zoom=4;map.pan=10;a.Zoomed(4);assert(first->x==1279&&first->y==1498);
+ map.pan=-3000;a.Panned(0,0,false);assert(!first->visible);
+ map.pan=10;a.Panned(0,0,false);assert(first->visible);
+ MapConfiguration unrelated;a.Closed(&unrelated);assert(a.m_Root==first);
+ a.Closed(&map.config);assert(first->removed&&!a.m_Root&&SCR_MapEntity::opened.subscribers.count(&a));
+ a.Opened(&map.config);assert(a.m_Root&&a.m_Root!=first&&a.m_Root->element.text=="Radio station");
+ // Same native config but another canvas; only our old widget is removed.
+ Widget otherCanvas;otherCanvas.isCanvas=true;Widget*second=a.m_Root;map.activeCanvas=&otherCanvas;a.Refresh();assert(second->removed&&a.m_Canvas==&otherCanvas&&!otherCanvas.removed);
+ // Native task refresh deletes only its own icon children, not our sibling.
+ Widget nativeTask;map.icons.children.push_back(&nativeTask);map.icons.ClearChildren();assert(nativeTask.removed&&!a.m_Root->removed&&a.m_Root->parent==&map.frame);
+ // Reusing canvas/config but changing the supported parent must rebuild only ours.
+ Widget replacementFrame;Widget*oldParentWidget=a.m_Root;map.icons.parent=&replacementFrame;a.Refresh();assert(oldParentWidget->removed&&a.m_Container==&replacementFrame&&a.m_Root->parent==&replacementFrame);
+ // Dedicated authored shared-map frame has priority over native task layout.
+ Widget sharedFrame;sharedFrame.sx=70;sharedFrame.sy=90;map.mapRoot.authored=&sharedFrame;oldParentWidget=a.m_Root;a.Refresh();assert(oldParentWidget->removed&&a.m_Container==&sharedFrame&&a.m_Root->parent==&sharedFrame);
+ // Parent absence or a malformed canvas parent cannot reach CreateWidgets.
+ map.mapRoot.authored=nullptr;map.icons.parent=map.activeCanvas;int beforeInvalid=game.workspace.creates;a.Refresh();assert(!a.m_Root&&game.workspace.creates==beforeInvalid);
+ map.mapRoot.icons=nullptr;a.Refresh();assert(!a.m_Root&&game.workspace.creates==beforeInvalid);
+ map.mapRoot.authored=&sharedFrame;a.Refresh();assert(a.m_Root&&a.m_Container==&sharedFrame);
+ b.Start();Widget*bRoot=b.m_Root;assert(bRoot&&bRoot!=a.m_Root);a.Stop();assert(!a.m_Root&&!bRoot->removed&&!SCR_MapEntity::opened.subscribers.count(&a)&&SCR_MapEntity::opened.subscribers.count(&b));
+ a.Opened(&map.config);assert(!a.m_Root);a.Stop();assert(!bRoot->removed);
+ // Missing creation/configuration retries without registering duplicate listeners.
+ b.Closed(&map.config);game.workspace.fail=true;b.Refresh();assert(!b.m_Root);game.workspace.fail=false;game.workspace.missingHandler=true;b.Refresh();assert(!b.m_Root);game.workspace.missingHandler=false;b.Refresh();assert(b.m_Root);
+ map.open=false;b.Refresh();assert(!b.m_Root);map.open=true;b.Opened(&map.config);assert(b.m_Root);
+ SCR_MapEntity replacement;SCR_MapEntity::current=&replacement;Widget*old=b.m_Root;b.Refresh();assert(old->removed&&b.m_Map==&replacement);
+ b.Stop();assert(SCR_MapEntity::opened.subscribers.empty()&&SCR_MapEntity::closed.subscribers.empty()&&SCR_MapEntity::panned.subscribers.empty()&&SCR_MapEntity::zoomed.subscribers.empty());
+}
+''')
+# Production callers must never insert authored objective data into the annotation lists.
+discovery=(root/'addons/core/Scripts/Game/ERR/00_Core/ERR_DiscoveryMap.c').read_text()
+mine=(root/'addons/core/Scripts/Game/ERR/20_Intel/ERR_MineIntel.c').read_text()
+assert 'manager.ERR_InsertDiscoveryMarker(m_ERRMarker);' in discovery
+assert 'manager.ERR_InsertDiscoveryMarker(marker);' in mine
+assert 'manager.InsertStaticMarker(m_ERRMarker' not in discovery
+assert 'manager.InsertStaticMarker(marker' not in mine
+assert 'override void SetBlocked' not in discovery
+shared=root/'addons/core/UI/layouts/ERRMap/SharedMapRenderTarget.layout'
+assert 'Name "ERR_ObjectiveOverlay"' in body(shared,'RTTextureWidgetClass')
+assert 'Name "ERR_ObjectiveOverlay"' not in body(shared,'MapWidgetClass')
+print('PASS: actual objective overlay lifecycle preserves separate ownership, late readiness/reopen, data refresh, pan/zoom/culling, supported sibling/shared-frame parents, coordinate offsets, native task-clear isolation and terminal cleanup; native rendering remains unverified')
@@ -0,0 +1,38 @@
{
"addons/core/Scripts/Game/ERR/00_Core/ERR_DiscoveryMap.c": {
"proposal_sha256": "dd350bdda1bdf427ab8cefab623fe60cce5332b062d1a29686fe52f73e9e83f1",
"baseline_sha256": "a97e131bcfc578fe57ec2ed075a2619ff5c4c0b4c12d65c2a92e9fb2b83ce958"
},
"addons/core/Scripts/Game/ERR/00_Core/ERR_ObjectiveMapPresentation.c": {
"proposal_sha256": "f189f8987244e10df61ac577bbbc952ed5c4e6c431a8e3cd192a10fe2e8c3bec",
"baseline_sha256": null
},
"addons/core/Scripts/Game/ERR/20_Intel/ERR_MineIntel.c": {
"proposal_sha256": "3ce16cebaa9703b2f9803df7c11614f94de6460a9136dab8f80dcad41ae2b1c2",
"baseline_sha256": "822a526af8814264ee45da21b675466abfece86aa573744ee78692bdd1f1bc66"
},
"addons/core/UI/layouts/ERRMap/ObjectiveMapElement.layout": {
"proposal_sha256": "b364752c44896d67dad07e466a04f4504a50813fb36ee7c34c9189ea9677b4e9",
"baseline_sha256": null
},
"addons/core/UI/layouts/ERRMap/ObjectiveMapElement.layout.meta": {
"proposal_sha256": "8691fe2eaf46568bca4a9f8128b247a8da810bb87a5546aa7ca3334e740270d6",
"baseline_sha256": null
},
"addons/core/UI/layouts/ERRMap/SharedMapRenderTarget.layout": {
"proposal_sha256": "6e83a9c70282aff43b23a08b732739e7a241a31e8abf200498c90a745d3d60dd",
"baseline_sha256": "49a2da4181b94d42174f58c7f9b6bf2207116c99427d61ff1c212092ac7db4d2"
},
"tests/test_mine_intel.py": {
"proposal_sha256": "db64129001c0010ad11389ff764356893ac7c4fbf45e7c82aa56bbe4c75f4929",
"baseline_sha256": "109d5c8532c3725ec3b42f7b0d769dfdf4eda5912a5d2409556c30f203cc6672"
},
"tests/test_objective_map_element.py": {
"proposal_sha256": "b02e59f977aa81462649282f99e70b0b6320b31ba0ea46f586e9ac0c5d15b884",
"baseline_sha256": null
},
"tests/test_objective_map_presentation.py": {
"proposal_sha256": "2418f4c0f370bd436b316e56d5ead97ff4b6aa7cdfb3777c9d2af22486148268",
"baseline_sha256": null
}
}
@@ -0,0 +1,7 @@
{
"operation": "copy current tree into disposable full-suite scratch",
"failure": "Disk quota exceeded while copying docs evidence; suite not prepared, attempted runner exit120",
"recovery": "Removed only newly created incomplete /tmp/erri-objective-map-full-0832",
"collateral": "Read-only private capture reached owned window but failed writing first PNG (zero bytes), observer exit120. No valid UI capture from geometry run. Native run completed separately.",
"retry": "No large /tmp clone. Separate fresh private profile reuses unchanged407-file source; screenshots to successor .build. Existing failures retained."
}
@@ -0,0 +1,598 @@
PASS: actual objective overlay lifecycle preserves separate ownership, late readiness/reopen, data refresh, pan/zoom/culling, supported sibling/shared-frame parents, coordinate offsets, native task-clear isolation and terminal cleanup; native rendering remains unverified
PASS: actual map element initializes each widget, retries missing widgets, updates position and changes only stale text/icon data; no native image-load claim
PASS: actual native fixture root/config ownership and idempotent cleanup preserve foreign map, selector excludes ordinary route, fixed budgets/screenshots/UGC boundaries retained; native operations not executed
PASS: actual full Inspect rejects canvas parenting, wrong active container/canvas, omitted origin offset, wrong rendered box and stale coordinates; differing origins and DPI accepted
PASS: actual long-warning phases retain visible label through1500ms checkpoint then restore radio before close; synthetic marker separated from unmoved player
PASS: actual Center places marker100screenpx left of pan center at both fixture zooms without altering disclosed coordinates
PASS: missing, child-only, malformed, zero and duplicate prefab root IDs rejected
PASS: delayed scene/inventory arrival, deferred preload, identity checks, stale replies, timeout and observer cleanup
PASS: actual inventory manifest, delayed/missing/wrong-owner item links, finite cap, consumed-stock refresh and preload ordering
PASS: spawn scene remains held through final acknowledgement and nearby use; leaving, reassignment, disconnect and teardown release it
PASS: production prison AI hold/release, repeat activation, authority/faction/player exclusion, dead actor and stop cleanup
PASS: actual protected/capped damage plus exact-actor terminal fixture bypass through delayed native damage, fail-closed ownership and untouched ordinary actor; no native claim
PASS: actual full planner selection/commit body, 360 equivalence scenarios, orders/reservations/cooldowns identical; one128-unit scan vs >10000 repeated unit visits; no FPS claim
PASS: actual observer monitor/recovery/cleanup rejects retained old controller, preserves new camera/editor/hints/timer, restarts once and retains normal recovery; native effects modeled from SDK, no runtime claim
PASS: former chat controller releases only its own callbacks and preserves replacement menu; current-owner stop/scope and repeated teardown remain intact
PASS: wrong observer fixture selector rejected before runtime/profile setup; no engine launched
PASS: actual depot radio/planning/two-leg state transitions, fixed deadline, late proof quarantine, finite import and no adoption after Stop
PASS: actual depot HQ lifecycle, existing planner priority, server/mode/owner gates, idempotent polling and owner replacement
PASS: actual full depot leaf, exact custody, isolated callbacks, finite reservation, false/unknown and Stop quarantine, once-only delivery and caps; native movement unqualified
PASS: actual authored identity capture, READY-only detached provenance, same shared stock admission, completed exact two-leg proof, lifetime caps and Stop no late adoption
PASS: actual Tick clock initialization admits fractional first ticks and expires without extending the original start
PASS: actual finite conservation/deadline/callback policies; read-only selection, bounded once-only inventory submission and no can refill; native transfer not executed
PASS: actual exact-context membership, bounded identity/reach gates, native start/cache/eligibility ordering and no duplicate/foreign action start; fuel manager identity and empty-can headroom guards checked
PASS: actual detached node/value snapshot and conservation refuse mismatched lengths before indexed reads, retain original identities under native out-array aliasing and log bounded counts once; native cause remains unknown
PASS: actual mine evidence sealing/recovery, historical coarse publication, caps, canonical ownership, marker join retry/owner-change/stop; native arming and replicated vector-array transport untested
PASS: actual full document recovery retains authored/sealed targets, one shared spent ledger, retry/exhaustion semantics and canonical multi-player ownership alongside supplemental mine intel
PASS: actual infantry search suspension, quiet grace, finite resume, expiry/replacement and defensive/ownership boundaries
PASS: infantry combat gate precedes radio delivery and preserves non-task transports
PASS: actual HQ contact transition wakes only fit squad members, cancels only task orders and logs changes once
PASS: actual finite medicine grants, authored stock deduction, full-backpack refusal/pouch fallback, no loot replenishment, unresolved-operation quarantine and ownership/stop guards
PASS: only recent native detected/identified threats suspend hunter travel; stale/disarmed/destroyed contacts cannot strand patrols
PASS: actual hunter combat transition cancels only its travel once, holds through renewed contact and resumes after quiet; unregistered startup preserved
PASS: captured sighting retention, immutable details, expiry, replay rejection, bounded sound uncertainty/cooldown, radio loss, priority and overdue-status fairness
PASS: arrow press/release, held keys, opposing keys, disabled/menu input and firearm-only retention
PASS: town trigger and hard 700m exclusion for all observers, empty/invalid positions and final-check crossings
PASS: exact finite site squads, invalid roster/count rejection, committed-site spacing and safe fallback boundary
PASS: mortar couriers use the mobile site team and refuse permanent-only garrisons
PASS: omitted preferred mortar depot selects a surviving owned camp/mobile team; no camp, foreign cache and permanent-only sites are unavailable; historical priority retained
PASS: real-session mortar deadline, failed-support convoy admission and hunter survivor/recovery gates
PASS: native-route retry preserves delivered target, limits attempts and suspends during combat
PASS: stale/deleted AI utility cannot receive Complete; mortar HQ preflight withholds unsafe orders; mounted convoy cover never creates infantry Defend
PASS: flight crew affiliation and group precede native boarding; preparation remains bounded even while passengers wait
PASS: factionless/deleted map targets do not abort perception; faction lookup tolerates teardown; deleting helicopter releases without capture/engine access
PASS: shoot adapter waits for a physical round; bounded same-shell retries, interrupted/never-started loads, committed no-retry, order/owner changes and normal native delegation
PASS: missing/invalid faction crew defers before any native spawn or allowance insertion; all registered RHS factions have explicit soldier and medic profiles
PASS: vehicle radio issued once; pending, refusal and looting cannot duplicate or fabricate a physical radio link
PASS: actual vehicle-radio link requires the original seated crew, physical manpack and live uncaptured mission vehicle; looting, dismount, release and teardown remove it
PASS: actual hunter release preserves survivors/HQ, releases driving ownership once, delegates capture/teardown, and excludes prison/patrol/mortar from generic objective defence
PASS: real opening road geometry enforces wide azimuths; fresh delivered contact preempts patrol cooldown, respects radio failures and does not starve in-flight interception
PASS: actual scoped 10% tighter REGULAR aim error and alert perception; preserves equipment multiplier and restores vanilla behavior when unbound
PASS: physical inspection and parent-wreck retention; server-only searched/report delivery unlocks native cleanup once with a 300-second delay
PASS: bounded same-group empty-spawn retries, no casualty refill, queue retirement, delivery-gated intel, prepared-team reuse, throttled diagnostics and LOD release
PASS: production airborne memory confidence, persistence, ground coverage, confirmed losses, artillery veto, cooldown and invalid-input rules
PASS: production cover retains the carried HQ target until its deadline; airport reload waits until the drop pass and cover have finished
PASS: air logistics reservation preserves delivered search until radio handoff, excludes guards/combat/in-flight orders, and quarantines unresolved native loads/moves
PASS: actual ammunition cargo selector handles empty rifle/machinegun/sniper magazines, preserves loaded variants, excludes auxiliary launchers and tolerates missing native metadata
PASS: original 15-minute launch/loss cadence, active/captured timer disarm, saved delay reset, stop, 300m orbit and bounded close-contact standoff at 30/60/120 Hz
PASS: actual aircraft-removal notification guards owner/server/active/stop and schedules one full delay without replay extension
PASS: hill prominence/elevation, actual road edges/heights/bends and server-only finite scout admission, pending stock, timeout and no replacements/refills
PASS: mortar duty scope excludes players, other crews, stopped/client/inactive states; only destruction releases an active assignment, while the gunner may approach the gun
PASS: random mode restrictions, full numeric ranges, independent calendar dates and strict daylight boundaries
PASS: actual killais eligibility includes the 1000m boundary, excludes players/retained bodies/dead/non-character entities and checks full 3D distance
PASS: actual generation scheduler bounds each tick, enforces deadline/candidate ceiling, validates fallback, commits only accepted positions, skips only dispensable sites, preserves required objectives/intel, and resets the next search budget
PASS: terrain placement samples world bounds, retains streaming candidates, bounds waits/work, rejects foreign fallbacks, preserves objectives/intel and validates completion
PASS: actual navigation readiness supports static meshes, yields only for loadable streaming tiles and refuses unreachable positions
PASS: universal connector, embedded/standalone exports, multiple terrains, stable IDs, native nav configs, missing-nav visibility, path validation and overwrite protection
PASS: airfield detection accepts physical runways/towers and bounded authored markers, rejects unrelated props, water and out-of-world markers, and samples terrain height
PASS: configured airport parsing, bounded readiness, stale admission rejection and cleanup wiring
PASS: explicit CLI opt-in, disabled/editor guards and mission-header airport precedence
PASS: singleton identity guards, paired faction deserialization and client world-cleanup wiring
PASS: task/map/respawn getters survive delayed old destruction and preserve ordinary-mode behavior
PASS: replication hierarchy refuses absent/aliased nodes and establishes delivery dependencies idempotently
PASS: standalone old faction delegates collected once, with null/deleted owners ignored
PASS: actual faction resolution reserves explicit roles, samples without replacement, substitutes disabled selections, and rejects duplicate/unknown/missing choices and insufficient pools
PASS: Random all submits persistent random roles immediately; manual mixed choices, stale/unauthorized UI guards and debounce preserved
PASS: actual content policy gates parent packs, individual factions, faction identity and finite group rotation with vanilla fallback
PASS: actual delivered road eligibility, ahead projection without chords, reservations, stock road query bounds, terrain/water/obstruction refusal and clean outputs
PASS: actual delivered-task lineage, expiry, old-order retention, native commit, release, road precision expiry and duplicate delivery
PASS: actual original-roster local handoff,100m3D bound,busy carrier/budget exclusion,origin interruption including deletedsource,normal radio delivery and per-source replay history
PASS: actual visual intake retains source/time/position/id, rejects replay, prefers usable own route, excludes simultaneous callers and conservatively resets negative-sweep dwell
PASS: actual fixture local/radio gating, immutable source/time/position, interrupted-report exclusion and exact-owner cleanup
PASS: local-handoff runner refuses wrong project/round count/insufficient deadline before runtime work
PASS: actual fixture allocator terminal/unsubmitted guard, original-group lookup and both candidate gates
PASS: actual report-derived waypoint insertion/order and tighter positive radii; no formation navigation claim
PASS: actual Place/Stop waits native pose update, bounds four attempts, preserves original position, restores pending/settled placement and respects ownership/accepted-move quarantine
PASS: actual fixture current/original recipient ownership, unresolved transfer cleanup, exact-token release and idempotent Stop
PASS: actual fixture phased-cargo readiness, bounded callbacks, captured-stock mixed-caliber selection/continuation, reservation cleanup and component magazine counts
PASS: actual inventory-fixture setup uses ordinary prison unlock before constructing its convoy-waiting probe; failed unlock cannot run fixture
PASS: actual authored storage anchors, native trace flags, own-hierarchy exclusion, external wall/vehicle obstruction, range, unknown geometry and bounded context refusal
PASS: actual convoy binding, finite identities, disjoint tokens, shared report replay/cooldown, original recipients and HQ cleanup
PASS: actual finite convoy supply pool; immutable slots, shared demand state, sparse/capped discovery and permanent shutdown
PASS: actual HQ rotates finite donors, skips unavailable/contacted trucks, uses delivered reports and dispatches at most one trip per planning cadence
PASS: actual original turret identity, native/canonical guards, scoped maximum-skill profile, reset, dismount/reboard, requested-skill preservation and restoration
PASS: bounded HQ startup/memory windows and outcome-specific full-route deadlines
PASS: explicit escape-route skips only administrator stress, preserving original full-fixture wait/failure paths
PASS: normal escape route keeps ordinary catalog and generated placement; historical selectors remain unchanged
PASS: actual read migrates old valid settings, preserves explicit disabled state, rejects invalid data; next-round feedback and fixed menu remain honest
PASS: actual automatic convoy timing/authority/admission/one-attempt/manual-task/stop policy; native deployment unproved
PASS: late authoritative failure reason refreshes open result; detach, mode change and success subscriptions preserved
infantry resupply actual rules, radio transitions, owned cleanup and unresolved-operation tests passed
PASS: actual resupply Roster preserves permanent release, original slot mapping and bounded ownership
PASS: actual designated zero/one original carrier selection, settled startup, shared finite claims, no refund after submission
PASS: actual HQ startup grant readiness forwarding is authoritative and fail-closed
PASS: actual finite PMN4 designated-zero/one entitlement, pinned original ownership, shared commit, physical custody, callback quarantine/deletion and no retry
PASS: actual bounded empty-return and finite delivery; phase-isolated callbacks, exact ownership proof, stop quarantine and original actor/vehicle boundaries
PASS: actual shared finite identity reservation; competing consumers, submission permanence, stale cleanup and96-item bound
PASS: actual carried-mounted swap, shared committed claim, physical slot reach, exact two-way proof, uncertainty and terminal cleanup
PASS: actual mounted pickup, exact finite ownership, pre-submission commit, physical custody, bounded callback and quarantine lifecycle; no native coverage claim
PASS: actual mounted courier admission, radio, individual orders, two-stage transfer, reboarding, token cleanup and quarantine lifecycle
PASS: actual scoped crew permit and native board completion/failure preserves foreign seats without teleport fallback
PASS: actual shared mounted stock/history ownership, atomic exact HQ pair claim, and bounded stopped-owner proof polling
PASS: actual carried/mounted early ammunition policy and status-first shared uplink; complete threshold, phases, cooldown, failures requested check-ins and non-urgent detached carried-mine status
PASS: actual group radio startup preservation, finite native grants, callback quarantine, frozen selection/actor ownership and bounded observation
PASS: actual maintenance native-stock check rejects missing/duplicate/wrong-identity/unowned/depleted/malformed stock and is read-only; native runtime not executed
..................
----------------------------------------------------------------------
Ran 18 tests in 0.237s
OK
PASS: actual radio node rejects current incapacitation, death, ownership and faction changes despite cached inventory; one-second capability refresh remains explicit
PASS: Southern finite maintenance stock preserves weapons/clues and optional transport, historical Western fixture stays separate; native capacity/consumption untested
PASS: optional transport deferred behind required readiness, bounded once-only spawn/omission, isolated cleanup, occupied-candidate retention and required-default preservation
PASS: actual diagnostic fallback runs only on failed missing-context call, derives unique native pilot door, preserves stock eligibility and restores prior index on success/failure; diagnostics mutate no game state.
PASS: actual native-prelude cleanup restores only original changed damage, refuses stale/incapacitated/aboard teleport; bounded five-seat/four-door fixture wiring checked. Native execution remains pending.
PASS: actual CreateTransport requires successful scoped Configure after handbrake, preserves ordinary vehicles, tracks spawned entity before failures and never treats failed lock registration as ready.
PASS: actual preparation Configure guards/idempotence/breach preservation, security eligibility/final current-body server mutation and all scoped action guards; all five seat/four door resource overrides. Native hold, prefab merge, replication and boarding remain unverified.
PASS: production vehicle alarm single trigger/replica completion/no replay, fixed deadline/readiness wait, failed audio, dedicated server, moving exact handle, destruction/native end/deletion/clock and mission teardown. Native sound and multiplayer delivery require engine qualification.
PASS: production alarm emitter/receiver original time/location, explicit native queue only, 32-entry cap, 50m local witness eligibility, bound perception, native-super preservation; actual engine broadcast/hearing remains unverified.
PASS: actual optional candidate barrier, exact callback/custody proof and unchanged mine/primary snapshots; no native transfer claim
Native finite mine-stock runner: parser, scope, exclusions and command pass
PASS: actual bounded native mounted proof/detached payload/deadline/cleanup methods, production-only setup and isolated runner selector
PASS: actual one-existing-convoy candidate readiness, sender-root identity, incomplete cargo refusal and fixed three-candidate bound
PASS: actual once-only native dry query, exact before/after slots, native refusal, shutdown; shared bounded discovery and distinct opt-in verdict
PASS: actual completion selector and pre-cleanup variant capture preserve separate radio and eligibility verdicts
PASS: actual cargo diagnostic stages separate absent/foreign magazines, used/empty/invalid rounds, well mismatch and exact truck storage/attachment without mutation
PASS: actual native courier witness rejects missing radio/custody/swap/reboard evidence; CLI opt-in bounded; native success remains unqualified
PASS: actual courier constructor/Tick waits for preparation, returns before physical checks, preserves fixed deadline and sticky stop/failure; Enfusion startup awaits native verification
PASS: actual arranged native alarm fixture deadline, single emit, natural-route observation, original timestamp/area/detail assertions, natural observer proximity/activation wait, failure cleanup and independent canonical-body restoration; native delivery itself remains unqualified.
PASS: actual convoy cover observation/snapshot/uplink/HOLD/RESUME/cleanup transitions; native boundaries mocked, non-convoy runner opt-in refused
Enemy optics actual-service ownership, preservation, callback, deadline and bounded-inspection policies passed
PASS: actual delivered cover freshness/lineage/replay and canonical executor; owned waypoint-only hold, one resume at preserved route index, invalid ownership/crew/ledger refusal and fail-closed native recreation
PASS: actual Stinger show/set/help state precise actor-roll effects; read-only help, bounded values, malformed syntax and failed-save preservation; no rerolls/gameplay edits and no native persistence claim
PASS: new/retasked search and radio delivery ammo gates; active tasks and delivered release preserved
HQ convoy delivered-report planning and downlink regressions passed
PASS: actual own-inventory ammo inspection deduplicates loaded/carried/shared wells, separates chambers/launchers, freezes scalar snapshots and treats unsupported/capped/foreign inventory as unknown
PASS: actual carried PMN4 inventory, original-owner guards, bounded deduplication, independent unknown state and detached counts
PASS: actual mounted hierarchy sampling, ownership exclusion, deduplication, completeness/caps, quarter threshold and detached validation; no runtime policy or ammunition mutation
PASS: WORKBENCH opt-in diagnostics distinguish cycles/cap/storage/manager/mount failures without repeated native traversal
PASS: actual HQ original convoy-root admission rejects wrong force/server/group and never supplies replacement lookup
PASS: production mounted structural seat scan ignores >128 carried/cargo descendants, shares exact native mount/magazine ownership, preserves attachment seats and exact occupants, rejects unknown/cyclic/oversize structures; native binding still requires qualification.
PASS: native body fixture uses existing immutable actors, real production LOS/queued uplink, pre-delivery isolation, actual status overlap, bounded cleanup and no fabricated reports/spawns
PASS: actual native fixture lookup selects exact BODY kind/identity/message from bounded evaluations, never sighting-only Get
PASS: actual ammo snapshot comparison checks every scalar/category flag; native probe requires real roster rescan, loaded-round lower bound and separate immutable pending/Watch objects
PASS: actual delivered slot-union bodies preserve overlap/disjoint evidence, replay idempotence, status subset integrity, full-wipe closure and formation-local bounds
test_review_added_allowed_media_invalidates_snapshot (__main__.ReviewTests.test_review_added_allowed_media_invalidates_snapshot) ... ok
test_review_added_source_directory_rejected (__main__.ReviewTests.test_review_added_source_directory_rejected) ... ok
test_review_loose_root_resource_and_symlink_rejected (__main__.ReviewTests.test_review_loose_root_resource_and_symlink_rejected) ... ok
test_review_metadata_media_and_sidecars_remain_allowed_and_bound (__main__.ReviewTests.test_review_metadata_media_and_sidecars_remain_allowed_and_bound) ... ok
test_review_missing_link_rejected (__main__.ReviewTests.test_review_missing_link_rejected) ... ok
test_review_package_guard_sees_new_scripts (__main__.ReviewTests.test_review_package_guard_sees_new_scripts) ... ok
test_review_retargeted_private_link_rejected (__main__.ReviewTests.test_review_retargeted_private_link_rejected) ... ok
----------------------------------------------------------------------
Ran 7 tests in 0.058s
OK
PASS: actual report methods reproduce old starvation; status-first scheduler delivers check-ins and requires 30s without combat or actual visible contacts before negative reports
PASS: actual actor group lookup retains controlled character membership when seated/inherited vehicle agents differ; missing control or parent refuses
.................
----------------------------------------------------------------------
Ran 17 tests in 3.366s
OK
PASS: actual convoy motion thresholds, native-only proof boundaries, physical cargo/crew ownership and pre-launch runner restrictions
PASS: actual filled rotated-footprint TraceBox and nine terrain/water samples; broad tree/cable bounds alone accepted, actual collision/nonfinite trace refused, nonzero sweep and ENTS/OCEAN flags, bounded diagnostic query and reset
PASS: actual road interpolation/projection/orientation, six35m starts,200m forward tail, preserved bends, short/far/degenerate/nonfinite/overdense/hairpin refusal and deterministic candidate ties
PASS: actual authenticated convoy dispatch, active/ready admission gates, canonical receipt, safe unconsumed preflight retry, pool refusal, retained partial failure and consumed no-retry
PASS: actual native readiness exact membership, one-time per-vehicle ledger admission/reservation, partial readiness retry without duplicate records and one-pass56-item cargo allocation without replenishment
PASS: actual per-vehicle readiness reasons, native agent/activity counts, intended-seat diagnostics, five-second throttle and read-only observation
PASS: actual convoy dispatch validates before receipt consumption, consumes once before native mutation, retains all12 partial-failure paths, accepts the selected non-USSR enemy, and allocates exact19 bodies without capacity shrinking
PASS: own memberless prefab disables automatic spawn before initialization; actual admission rejects populated, immediate or authored-slot templates before finite crew creation
PASS: actual native seated-group arrival outside35m, native waypoint removal, idempotent advance, and convoy waypoint idempotence/arrival/deadline, missing/dead/captured/reparented crew refusal, failed native waypoint release, original vehicle/member preservation and no replacement
PASS: actual convoy receipt identity/one-use, shared60-body and128-formation caps, outstanding/native-ledger accounting, exact19-body composition, source reuse, mode/client guards and no consumed receipt refunds
PASS: actual supply route cycling/arrival/stops, finite startup bounds, contact freshness, dismount hold, quiet interval, interrupted boarding, timeout and lost-truck release
PASS: moving-convoy perception boundaries and scoped individual/group abandonment priorities
PASS: actual supply startup reasons expose unchanged body budget/requirement, journal only failure changes, preserve retry cadence/caps and report the true final refusal
PASS: actual StartOne plus actual pool preserve unconsumed receipt retry, reject consumed replay, skip impossible new-budget surveys, retain equality, retry caps and journal dedup; no FPS claim
PASS: actual admission seeds use exact installed loaded prefab, reject replacement/foreign/projectile paths and preserve bounded immutable identity
PASS: actual primary-before-mounted one-shot batch, shared96/128 caps, physical snapshot headroom, original ownership, callback refusal and admission pinning
PASS: actual bounded HQ query validates only existing original binding without admission or replacement lookup
PASS: exact optional PMN4 startup, primary callback independence, original owner,128 capacity/callback limits, terminal no-retry and callback-proven freeze
PASS: production convoy spacing, physical arrival, stable follower targets, supply ownership, leader promotion and bounded stuck recovery
PASS: convoy combat keeps native manoeuvres for unchanged contacts and refreshes when contact moves
PASS: native convoy proof excludes pre-departure movement and ends via explicit fixture reset, not prohibited player death
PASS: boarding retries only after approach/seat progress stops, capped at three, with delayed native reissue and completed-team preservation
PASS: slow only owned vehicles near fit dismounted infantry; ignore passengers, casualties and released teams/vehicles
PASS: restore missing native driving registration only for healthy owned seated crews; preserve existing association and refuse invalid/released vehicles
PASS: actual body observer enforces owned physical roster, local death-only candidates, native trace gating, budget/cadence/caps, immutable body-only snapshots, radio retries and confirmed suppression
PASS: own initial roster, explicit retained corpse evidence, unconscious/missing/ref transfer guards, fixed strength, no replacement adoption, detached samples, surviving radio sender, immutable convoy root/ledger, mounted capture release and lost-root unknown
PASS: delivered-only status snapshots, two missed check-ins/reply deadline, last reported coordinates, episode/replay guards, confirmed-loss idempotence, detached/validated mounted payload replacement 256-record cap and detached carried-mine radio delivery/chronology
PASS: actual failed-retask deadline rollback plus assignment cancellation/release preserves radio ownership, native waypoint lifecycle and failed-order retry boundaries
PASS: actual force ledger, finite casualties/identity/cap, routes/arrival/elevation/overshoot, server and physical guards, staggered 256-record simulated hour without world queries
PASS: actual equipment coordinator registration dedupe, startup delay, five member scans, finite component retries, unregister/stop terminal behavior and 256-group bound
PASS: actual percentage selection, native/preferred launcher preservation, failure/removal fallback, pending-operation quarantine, capture, finite two-mine grants and no replenishment
PASS: automatic inventory one-shot roll, exact item ownership, finite compatible ammo, rejection, capture/stop, deletion, loot and late callback quarantine
PASS: enabled/valid catalog eligibility, category restrictions, content filtering, GUID deduplication across factions and bounded catalogs
PASS: actual engineer mine preparation/deadline, original custody/identity, once-only callback removal, cancellation quarantine, withdrawal/clearance, native refusal and owned-action cleanup; native execution untested
PASS: actual road mine-site annulus/bend geometry, deterministic bounded candidates, server/query limits, and native ground/water/obstruction rejection; no runtime placement claim
PASS: actual HQ mine admission, one site query per tick, maximum two active/32 retained jobs, delivered-only original post, once-per-unit refusal latch, 256-item ceiling and maintenance/teardown ownership
PASS: actual objective heading/threat/approach rules, persistent doctrine weight, fresh-contact coverage invalidation, stale-sweep rejection and atomic radio retask ownership
PASS: actual bounded delivered-negative coverage, replay/freshness/expiry/invalid guards, oldest eviction, small-circle and nearest-unswept selection, reserved-cell exclusion and cleanup
PASS: actual HQ active/pending reservations, interruption, committed replacement, bounded coverage and unchanged force counts
PASS: actual bounded pursuit roles/objectives/scores, stale search degradation, physical/busy/home guards, finite lifetime and two-bearing escape gap; no hidden player reads or spawning
PASS: actual HQ memory rules/service preserve delivered snapshots, chronology, replay bounds, decay, motion limits, identity and negative-search revisions
.......
----------------------------------------------------------------------
Ran 7 tests in 0.026s
OK
PASS: actual session Tick + journal router delivers each grant completion and new HQ line once, without repeats on empty/unavailable feeds or unauthorized ticks
.....
----------------------------------------------------------------------
Ran 5 tests in 0.433s
OK
PASS: actual current-controller/admin/mode authorization, per-round anti-replay, token-rotation refusal, command/snapshot throttles and client scope; owner-only replies and player-tool cleanup wiring
PASS: mission provider registration is idempotent, optional dispatch is ordered, status aggregates, journals preserve cursors, aliases stay with their addons and topic help is bounded
PASS: actual menu command routing covers all fourteen settings, rejects unsupported keys, gates companions, and matches unique authored widgets
PASS: explicit weapon retention buttons use the same ready/authorized server command path
PASS: actual summaries preserve queued/delivered meaning, clear counts and IDs; raw records, legacy display, cursor gaps and RPC limits remain intact
PASS: actual admin body authorization, god restoration, vanilla item deposit, callback completion/failure, timeout quarantine and stop/revocation paths
PASS: same-body revoke/regrant preserves pending insertions and timeout quarantine; new-body binding isolates late callbacks and never inherits god mode
PASS: actual Intel commands distinguish status/start/failure, preserve authorization gate and reject malformed requests; spent ledger is idempotent, server-only and bounded
PASS: actual reroll snapshot, authority, cancellation, ownership, accepted operations, quarantine, bounded work and stop methods; no native runtime claim
PASS: production Intel feedback coalescing, rough secrecy, rate limit, bounded dedupe, local/remote delivery and round cleanup; native UI/RPC not exercised
PASS: actual per-squad bounded report selector rotates visible targets, survives ordering/turnover, records only queued attempts, and preserves radio intake ordering
PASS: actual action denial/clearing, server request failure, single submitted-result feedback, current rescuer identity and terminal/stop suppression; native UI/RPC pending
PASS: actual physical denial precedence and transport-seat occupancy/reservation/access/lock checks
PASS: actual initial admission exhaustion and ServerTick grace; new/pending/empty/controller/life guards, normal death preserved
......................
----------------------------------------------------------------------
Ran 22 tests in 0.271s
OK
......................
----------------------------------------------------------------------
Ran 22 tests in 23.973s
OK
..................
----------------------------------------------------------------------
Ran 18 tests in 2.743s
OK
.........
----------------------------------------------------------------------
Ran 9 tests in 2.005s
OK
...............
----------------------------------------------------------------------
Ran 15 tests in 1.085s
OK
PASS: actual field result/braking observer and Chat dispatch rules; one finite fixed candidate, deferred callback failure and guarded cleanup; no native measurement
PASS: actual opt-in terrain audit records one fixed1681-point grid, preserves original survey refusal/success and exact no-allocation scope; malformed heights stop without retry; no native data acquired
....
----------------------------------------------------------------------
Ran 4 tests in 0.614s
OK
PASS: actual field PI/ramp/vector caps, antiwindup, braking hypothesis, immutable admission limits and segment bounds; no native physics tested
PASS: actual100m whole-field survey sampling/4096cap, rotated coverage, all-node terrain and native trace refusal; original certificate lineage retained; no native qualification
PASS: actual QualifyField preserves original identity/footprint/time, orders complete surveys before issuance, and refuses failed stages/moved body/expired or changed world; native boundaries faked
PASS: WORKBENCH first-refusal diagnostics preserve ordinary predicates, query order/count/budget and opt-in scope; no native logging run
PASS: actual field startup delegation, immutable lease/target, braking/settling/cancel transitions, early abort, callback scope, physical terminal policy and shared landing demand; native boundaries faked
PASS: actual inherited airborne pre-CLIMB cancellation enables verified native autohover once, refuses failed enable and never writes after capture
PASS: actual Core maintenance/default/tick/stop methods; empty/populated authority, terminal reentry, no tactical resume or new scheduler; native boundaries substituted
PASS: actual finite registration, unique claims/tokens, retention/cancel/stop, readiness gating, capture/expiry retirement and bounded cross-kind order history and typed field/route construction; native boundaries faked
PASS: actual WORKBENCH route observer returns exact retained route subtype and refuses absent/field controllers
.....
----------------------------------------------------------------------
Ran 5 tests in 0.586s
OK
......................
----------------------------------------------------------------------
Ran 22 tests in 0.169s
OK
................
----------------------------------------------------------------------
Ran 16 tests in 9.680s
OK
......
----------------------------------------------------------------------
Ran 6 tests in 0.017s
OK
PASS: actual production bridge lookup, lease/world/mode/seat/capture guards, no allocation, native super ordering and read-only fixture hooks
...............
----------------------------------------------------------------------
Ran 15 tests in 0.048s
OK
.............
----------------------------------------------------------------------
Ran 13 tests in 4.363s
OK
PASS: actual route gain/caps/braking, callback selection, old landing/cancellation control and matching read-only telemetry
..............................
----------------------------------------------------------------------
Ran 30 tests in 0.382s
OK
..............
----------------------------------------------------------------------
Ran 14 tests in 0.214s
OK
.........
----------------------------------------------------------------------
Ran 9 tests in 0.124s
OK
PASS: actual gate observer binds native registered action/context and current life, reads accumulated progress, refuses stale bindings and never revives outside original bounds
PASS: actual read-only look observer methods enforce explicit scope, pinned native camera/body/identity, normalized pose, terminal cancellation and original sample/time bounds
...........
----------------------------------------------------------------------
Ran 11 tests in 0.061s
OK
.......................
----------------------------------------------------------------------
Ran 23 tests in 0.028s
OK
PASS: actual initial WAITING task/guide copy, configured duration, unchanged interruption and rounded progress; native task assertion pending
........
----------------------------------------------------------------------
Ran 8 tests in 0.010s
OK
PASS: actual inventory adapter scope, grid placement, sole compatible host, refresh reuse, rollback, foreign hierarchy refusal and exactly-once native delegation; native compatibility pending
.................................................................................
----------------------------------------------------------------------
Ran 81 tests in 0.496s
OK
......
----------------------------------------------------------------------
Ran 6 tests in 0.063s
OK
.................
----------------------------------------------------------------------
Ran 17 tests in 0.004s
OK
...........
----------------------------------------------------------------------
Ran 11 tests in 0.066s
OK
.........
----------------------------------------------------------------------
Ran 9 tests in 0.365s
OK
PASS: actual observer nonce, admission pins, baseline/menu sequencing, snapshots, bounded clocks/samples, cleanup and one-attempt latch; native untested
PASS: actual corridor caps/height/hold and whole-rectangle survey bounds, terrain refusal, native trace refusal and exact certificate lineage; native route unqualified
PASS: actual route entry, fixed corridor/target, hover hold, cancellation landing freeze, shared lease/capture/deadline gate and unchanged native startup/tick sequence
PASS: finite opt-in route fixture, original native input order, meaningful physical-arrival evidence and guarded cleanup; no native launch
PASS: actual Chat route step result dispatch and scoped completion/cleanup wiring; six real early-parser refusal paths leave no prefix/profile output
PASS: actual retained-service fixture entry, immutable controller/token/deadline/count bindings, observer getter and cleanup ownership ordering; native route validation pending
PASS: actual measured cancellation gate, one-shot retained service Stop, no premature drain, immutable lease, fresh real controller readback and separate physical cancellation result policy
PASS: actual rough-intel objective selection, exact precedence, source grid dimensions and unchanged other-phase dispatch; native UI pending
.................................
----------------------------------------------------------------------
Ran 33 tests in 0.082s
OK
...............
----------------------------------------------------------------------
Ran 15 tests in 0.031s
OK
PASS: actual preparation status scope, persistent updates, spinner restoration, placeholder replacement/deletion/destruction, native observation persistence/timeout; rendering remains native-pending
PASS: actual guide ownership and scoped timer cancellation, current-controller preservation/reacquisition, hint retry/dedup and observer boundaries; native UI not exercised
PASS: actual native-end shutdown, existing terminal snapshots, reentrancy, unchanged native end data and stale preparation guards
....
----------------------------------------------------------------------
Ran 4 tests in 1.302s
OK
PASS: actual three-state result wording and UI refresh; stale winner IDs never manufacture escape
...........
----------------------------------------------------------------------
Ran 11 tests in 0.096s
OK
PASS: actual immutable target, bounded autohover demand, drift refusal, five-second hold and unchanged qualification/deadline
PASS: actual admission attempt budget bounds blocked/missing prerequisites; preparation, spent life and async pending remain protected
PASS: delayed admission retry retains controller ownership across same-account recycled connection IDs
PASS: actual scene deadline overrides delayed native preload only for rejection; late completion cannot assign, ordinary verified admission preserved
PASS: actual action permission matrix unchanged; useful phase/intel/consciousness denials, stale reason cleared, native door denial preserved; no native UI claim
.....
----------------------------------------------------------------------
Ran 5 tests in 0.195s
OK
PASS: actual aircraft cancellation/stage rules, ground-only completion, expiry/capture faults, input ownership and no physical shortcuts
PASS: actual exact-instance single-use qualification, native-clock staleness/movement refusal, footprint bounds and ownership-safe ground/fault cleanup
PASS: actual optional screenshot helper flag/identity/world/life revalidation, one queued attempt, delayed capture and mission/world cleanup; no native image/presentation claim
PASS: actual yard diagnostic exact registered prison ownership, eight native-bound corner projections, no root-sibling escape, bounded duplicate/deep/wide hierarchy traversal; native projection/mask still unmeasured
PASS: actual CurrentActor, SpawnPosition and observer-selection methods reject pending/unregistered/replaced/recycled/foreign/dead bodies; canonical selection/cycling, unconscious following and prison/geometry fallback preserved; native boundaries adapted
PASS: actual native-map fixture ownership, cleanup and callback evidence fail closed; native execution remains separate
PASS: actual shared-map callbacks bind exact map/config/root, preserve replacement UI/camera, defer focus, and remove only owned delayed work
PASS: actual Intel/HQ methods and one-shot qualified readiness handoff deliver late actors once; duplicate readiness, accepted spawn, pickup/drop, death and original negative rolls do not mint assignments
PASS: Workbench-only read accessor rejects unknown/nonserver identities; Chat observes all distinct ready crew before existing shell-depletion mutation
PASS: actual native-event latch survives deselection, requires exact activity/order, detaches before cleanup, preserves failure/timeout and never infers completion from physical shot count
.........
----------------------------------------------------------------------
Ran 9 tests in 0.094s
OK
PASS: actual refresh-fixture gates pin immutable observations/actual downlinks/original activity, reject unaccepted or relabelled commits, stop queueing early and require all queued contacts claimed before replay
..........................
----------------------------------------------------------------------
Ran 26 tests in 0.182s
OK
PASS: actual refresh scheduler/delivery/cancellation/projectile methods reject interrupted or replayed reports, retain committed ownership, preserve immutable snapshots/aim geometry and isolate stopped or replaced orders; native radio/crew behavior remains separate
.....................
----------------------------------------------------------------------
Ran 21 tests in 0.032s
OK
...........
----------------------------------------------------------------------
Ran 11 tests in 0.030s
OK
PASS: actual full-salvo gates require eight fresh committed physical launches, natural closure and exact finite inventory; reject partial/extra/replayed events
PASS: actual reason/availability guidance and refresh matrix; no-target copy omits cycling, hint retry retained, existing command/admin paths unchanged; native UI pending
PASS: actual client camera policy closes immediately on healing or mission end; late unconscious metadata cannot keep the view active
PASS: actual input dispatch, one press per edge, menu-held suppression; actual revival camera handoff with editor close/retry, missing camera, replacement body and stopped round
PASS: first-person pose survives missing samples without drift, follows body motion/rotation, resumes fresh pose and cannot leak between targets
................usage: test_native_package.py [-h] [--project {core}] --session SESSION
--compat COMPAT [--steam STEAM]
[--timeout TIMEOUT]
[--external-addons EXTERNAL_ADDONS]
[--silent-workbench | --exit-after-init]
[--continue-on-failure]
test_native_package.py: error: argument --exit-after-init: not allowed with argument --silent-workbench
................................
----------------------------------------------------------------------
Ran 48 tests in 11.603s
OK
.......
----------------------------------------------------------------------
Ran 7 tests in 0.214s
OK
..............
----------------------------------------------------------------------
Ran 14 tests in 2.121s
OK
....
----------------------------------------------------------------------
Ran 4 tests in 0.266s
OK
....
----------------------------------------------------------------------
Ran 4 tests in 0.051s
OK
PASS: actual finite-courier age, token, exact ownership/callback and delivered-status admission reject stale, replayed, captured, canceled and ambiguous work
PASS: actual native-gun ownership gate rejects player/foreign/replaced/dead occupant, faction change, missing seat and missing registry
PASS: four-battery courier selection preserves pending trip/report/transfer identity, skips unavailable crews, and selects the next depleted battery without new stock
PASS: 64 bounded distinct storage candidates; native gates, five-store barrier and finite-stock ownership retained; native placement pending
PASS: 128 coarse+80 local refinement+169 airport grid candidates retain all native clearance gates; real terrain untested
PASS: actual prison registration/crossing policies reject missing/duplicate/destroyed initial gate, incomplete ownership/scan, outside-only body, jumps and stale samples; physical exit independent of later gate damage
PASS: actual prison door execution blocks direct AI/UI bypass while locked and delegates unchanged native action once after unlock and permission approval
..................
----------------------------------------------------------------------
Ran 18 tests in 1.724s
OK
.....
----------------------------------------------------------------------
Ran 5 tests in 1.047s
OK
PASS: native local-admission snapshot rejects changed life/key/body/participant/pending state; authentication is not simulated
PASS: actual mortar report ledger prevents duplicate response after cancellation, expiry and interleaved reports; native scheduler separate
.........
----------------------------------------------------------------------
Ran 9 tests in 0.016s
OK
....
----------------------------------------------------------------------
Ran 4 tests in 0.181s
OK
PASS: actual aim renewal requires fresh same-report solve and original-command equivalence; native firing untested
........
----------------------------------------------------------------------
Ran 8 tests in 0.011s
OK
PASS: actual startup/generation/ownership/timeout/callback policies and native-counter wait; integration preserves one-shot allocation and pending-crew cancellation
PASS: rapid mortar cycle counts eight physical rounds once and waits for native completion without a ninth aim or shell
PASS: actual probe binds native events to fresh immutable commits, permits delayed emission, rejects unrelated expiry closure and premature stop
PASS: actual noSplash Load body requires both explicit diagnostic and noSplash, preserves vanilla otherwise, and handles repeated Load/reload
PASS: actual fixture method permits one native resilience operation and restores either prior protection state, including failure paths
PASS: actual safe-exit boundary policy, native action/door selection, stop/cache cleanup, separate old mechanism and opt-in runner contracts
PASS: actual one-shot deadline/stability policies and preparation ownership, fuel, cleanup integration contracts
PASS: pending-only cancellation retires copied instance intent, preserves physical/control actors, and stops once
PASS: actual short-cast hit, upward support normal, no self support and no dynamic support
PASS: actual committed-ticket structure preserves reservation after death, rejects missing bodies/seats and ends at observation expiry
PASS: actual pending callback expires an empty-server reservation once, preserves its full lease, and cancels on completion/Stop
PASS: rescue lease expiry/reordering, fresh five-second settling, independent rescue ranges and grounded upright aircraft motion boundaries
PASS: requested guard population requires complete physical conscious membership before deadline
......................................
----------------------------------------------------------------------
Ran 38 tests in 0.020s
OK
..........
----------------------------------------------------------------------
Ran 10 tests in 0.003s
OK
.....
----------------------------------------------------------------------
Ran 5 tests in 0.960s
OK
PASS: authored radio/optional-site bounds and physical horizontal/vertical boundaries
...
----------------------------------------------------------------------
Ran 3 tests in 0.001s
OK
PASS: all phase transitions, terminal states, defence boundaries, stale/future observations, intel discovery
PASS: Core document-discovery alias, companion-only alias exclusion, strict integer parsing and setting boundaries
PASS: player admission phase/life/identity/controller matrix, preload displacement limits, pending reservation overlap and owner exclusion
PASS: actual gate and pre-inventory document guards reject noncanonical/faction/life/disconnect/server mismatches; canonical reconnect and unconscious carried intel preserved
PASS: WB-only native fault injection restores both body mutations before checks/returns and requires eligible held-document negative/positive proof; runtime pending
PASS: actual discovery coordinates disclose stable 500m cell center until identified, then exact point, including negative/boundary coordinates
PASS: actual local admission context/selection/latch, same-round late identity, replacement/mode failure, fresh round and untouched network path
PASS: prison search packs 16 unique 3m-spaced inside-wall centers, prioritizes inner/edge positions and never bypasses clearance
PASS: physical body occupancy rejects overlap, permits diagonal neighboring slots, and excludes own body and unrelated broad-phase bounds
PASS: recovery state excludes dead bodies, preserves reservations, requires controlled rescuers and distinguishes empty/all-dead teams
PASS: authority-scoped slow recovery, bleeding pauses resilience, medicine unaffected, player-only lethal damage cap without healing
PASS: bleeding severity survives low health, retains armour, causes no knockout and restores the actual damage/blood-loss cap
PASS: viable passive recovery survives native delay; bleeding, disabled/full effects and low-blood resilience do not block defeat
PASS: every minute round-trips, malformed clocks rejected, defaults limited to added keys, progression bounds and day duration aligned
PASS: native settings policy matches calendar boundaries 1900-2050, date/profile parsing is strict, authored defaults preserve old worlds
PASS: view-distance bounds, default, save failures, command parsing, temporary ownership, server/platform limits and lifecycle wiring
.....
----------------------------------------------------------------------
Ran 5 tests in 0.580s
OK
.
----------------------------------------------------------------------
Ran 1 test in 0.401s
OK
PASS: radio authorization/discovery/phase matrix, exact distance limits, defender handover, interruption, empty samples, clock regression and duration boundary
PASS: actual radio feedback policy, initial wait, interruption persistence, resumption and terminal/new-round reset
...............
----------------------------------------------------------------------
Ran 15 tests in 2.242s
OK
..............................................
----------------------------------------------------------------------
Ran 46 tests in 0.911s
OK
PASS: legacy values preserved, unsupported fields reported, invalid data rejected, existing files protected, runtime bounds aligned
PASS: failed initial settings promotion leaves defaults writable after restart; prior/fallback saves survive copy, readback and mismatch faults
PASS: real-carrier shortest-hop paths, 500m boundary, three-hop cap, no-manpack failure, three-second originating-call interruption, unchanged downlink hop timing, completed-hop survival, interrupted final uplink, radio loss, capture, motion, timeout, reset and network bounds
PASS: migrated aircraft availability policy (controller migration still pending)
PASS: migrated salvo offsets are deterministic, spread and bounded (native firing and complete salvo qualification are separate)
PASS: 35 prefabs have unique saved root entity IDs
PASS: 299 original script entries tracked across 18 unfinished responsibilities
PASS: 1 isolated addons, acyclic dependencies, 57 unique resources, exact vanilla/authorized external references
All repository checks passed. Native compilation and multiplayer tests are separate requirements.
@@ -0,0 +1,36 @@
{
"decision": "No concrete production source blocker found; approve the supported-parent correction within the stated qualification limits.",
"scope": "Read-only final producer review; no source edits, native launches or UI operations performed by reviewer.",
"producer_root": "/tmp/erri-objective-map-proposal",
"native_frozen_root": "/home/jakub/devel/escapistsrereintroduced/.build/objective-map-native-0832-close",
"producer_sha256": {
"addons/core/Scripts/Game/ERR/00_Core/ERR_DiscoveryMap.c": "dd350bdda1bdf427ab8cefab623fe60cce5332b062d1a29686fe52f73e9e83f1",
"addons/core/Scripts/Game/ERR/00_Core/ERR_ObjectiveMapPresentation.c": "f189f8987244e10df61ac577bbbc952ed5c4e6c431a8e3cd192a10fe2e8c3bec",
"addons/core/Scripts/Game/ERR/20_Intel/ERR_MineIntel.c": "3ce16cebaa9703b2f9803df7c11614f94de6460a9136dab8f80dcad41ae2b1c2",
"addons/core/UI/layouts/ERRMap/ObjectiveMapElement.layout": "b364752c44896d67dad07e466a04f4504a50813fb36ee7c34c9189ea9677b4e9",
"addons/core/UI/layouts/ERRMap/ObjectiveMapElement.layout.meta": "8691fe2eaf46568bca4a9f8128b247a8da810bb87a5546aa7ca3334e740270d6",
"addons/core/UI/layouts/ERRMap/SharedMapRenderTarget.layout": "6e83a9c70282aff43b23a08b732739e7a241a31e8abf200498c90a745d3d60dd"
},
"binding": "All six producer files exactly match both proposal source-manifest.json and the native frozen source.",
"reviewed_invariants": [
"Standard map uses the installed FrameWidget parent of UIIconsContainer; own objective is a sibling, so native clearing of icon children does not delete it. CanvasWidget is never the layout parent.",
"Shared map uses the dedicated authored frame inside RTTexture0; this establishes supported hierarchy, not rendered-texture qualification.",
"OwnsSurface binds map, config, canvas, container and actual root parent. Root changes replace only the owned layout. Stop removes all four owned subscriptions and only the owned root.",
"Coordinates account for canvas/container screen-origin differences and DPI; viewport culling uses current projected canvas-relative coordinates.",
"Only already-discovered quantized position and authored label/icon reach presentation. The producer does not enter or override the native player-annotation restriction path.",
"Text/image caching initializes new widgets and avoids repeated unchanged loads; position continues to update.",
"Native map close is synchronous for its current config; no demonstrated delayed same-config close race was found in installed script source."
],
"evidence": {
"focused_model_tests": "Existing retained overlay-green.log, element-green.log and mine-green.log inspected; actual-method modeled tests pass. These are not native rendering proof.",
"independent_prior_review": "Sibling source/API reviews confirmed installed standard FrameWidget hierarchy and coordinate APIs; native UIIconsContainer clears every child.",
"native_parent_report": "Parent reports corrected frozen source compiled and passed 91 native geometry/lifecycle assertions. Reviewer independently verified producer hashes match that frozen source, but did not run the engine.",
"visual_parent_report": "Parent observed standard map overlay in private window; synthetic point overlaps player arrow. Fixture author is separating it and adding ordinary-map long-warning capture."
},
"remaining_qualification": [
"Clear standard-map glyph/label and long-warning screenshot review remains parent-owned; no assertion that pixel size alone proves intended glyph or unclipped text.",
"Shared disabled-render-target screenshot showed world only. Shared path is geometry/lifecycle-qualified only; no render-texture or physically held map visibility proof is claimed.",
"No multiplayer transport, remote presentation or broad platform/input qualification is inferred from this local fixture.",
"Legacy NativeDiscoveryMapProbe remains evidence of the legacy static-marker API, not the new overlay."
]
}
@@ -0,0 +1,743 @@
{
"addons/core/AI/BehaviorTrees/ERR/MortarRapidFire.bt": "16b263bcb2fb3ae361367a600753a829425620d2e6b350a891c51fba47437ab6",
"addons/core/AI/BehaviorTrees/ERR/MortarRapidFire.bt.meta": "f2a44ece28891240e6bfa1d01af29428adcadbe82c80e287eb33cd5e58f1f90a",
"addons/core/Configs/ERR/AdminMenus.conf": "a7f889f260e43656136fc159342129e5f48748d28c426f65f9faac37b624cf94",
"addons/core/Configs/ERR/AdminMenus.conf.meta": "5faf5ddc0a51c1d0f82d60af00d91edc22fe9c39aac50d8d04b772a2c9271be1",
"addons/core/Configs/ERR/Content/Registry.conf": "546a5a407c9e6c25c9157ae4392898fa3f40c04c7956649e62201f9ac0ba187c",
"addons/core/Configs/ERR/Content/Registry.conf.meta": "046aa988bf8e972afcf7a60b6f2312f605f016f98625dbbd9cd75ebf9ea88800",
"addons/core/Configs/ERR/EveronSites.conf": "b479000b36154a6a3af6b519b086251d981ef63cb86a973d00529499cfd4238c",
"addons/core/Configs/ERR/EveronSites.conf.meta": "d5fe68025ef4e7c1e16082cf5873b7c7172eacbfaef4ab29b7e0e3c98f8dca56",
"addons/core/Configs/ERR/Factions/MissionVehicles.conf": "5f74f4a7089c7e7b54ad62463159ce8f0bab25a6b85268dc3872ea6001e048fb",
"addons/core/Configs/ERR/Factions/MissionVehicles.conf.meta": "00c368b6271d3440cc8bf627b03a384d247635723923fc5ad2104b8b4007b035",
"addons/core/Configs/ERR/Factions/US.conf": "4c3da063abb6e3ee39a6e4e0c5a9ffd5eae9d209d58470ea18b45dba5528db1b",
"addons/core/Configs/ERR/Factions/US.conf.meta": "a05469aef028e9e17eba545e81e2af2887b59f0fef17dac51a23c7b8155e381b",
"addons/core/Configs/ERR/Factions/USSR.conf": "407ea27f80a64c5184c089d43cdd0bdabfc5974c84f1d2a245081fdf2afa3f30",
"addons/core/Configs/ERR/Factions/USSR.conf.meta": "057397d97096346791b51b7b13fbe18af218bcf78e9984d9c01b49a2403de611",
"addons/core/Configs/ERR/GameOverScreens.conf": "45231061911a1462d45fb6db0fecc2b0793f17b5ae71017174954ff4fbd20236",
"addons/core/Configs/ERR/GameOverScreens.conf.meta": "eb654b745c0b97b41c991694569ef4877a3c2315e0826f9556337cd68690843e",
"addons/core/Configs/ERR/ObserverInput.conf": "e898d645911e85b6ba902366cb23890d8bb14bbd2c485102e6d49ea728e9b054",
"addons/core/Configs/ERR/ObserverInput.conf.meta": "9714dce6c38ee81bcc513c8ebef51d7af63fd15bcdda2e40946937c625dc3ba4",
"addons/core/Configs/ERR/Tests/LegacySites.conf": "3864eb638d0ed4dd313013d2d787f975ae6ce4bbe238569919f76b73d5f7ca42",
"addons/core/Configs/ERR/Tests/LegacySites.conf.meta": "097ac7daef4fc18344699a8471fdd77f9d158f8c70bab394068d7a08e4777ac0",
"addons/core/Configs/ERR/VanillaFactions.conf": "db890b61b48ee15484041fd2245a862d9fa9e7ba21b1229c281ff37c448a35b1",
"addons/core/Configs/ERR/VanillaFactions.conf.meta": "ac77725c0c21974991ef47a466b88122e939de8b46fd23e68889e7674cbb2bfd",
"addons/core/Materials/ERRM_MapRenderTarget.emat": "9877c5b175c5f30dd80bea36c711b21ab38219aa7075adf9ae79932e1d4c76bc",
"addons/core/Materials/ERRM_MapRenderTarget.emat.meta": "5ee1a705f8011a44020ca2691f5ccc17d44bf596fef9a36e98d1f267eb58fab0",
"addons/core/Missions/ERR_Everon.conf": "936619df7789a6b4b80bd763f702526e1145ab4d5c300516c07e7e70dfe57d92",
"addons/core/Missions/ERR_Everon.conf.meta": "0a23c98bf83873536c65fa17d38dea33a1d7b9e4ab210f90633ff688abcc551f",
"addons/core/Missions/ERR_Everon_Base.conf": "b46e1f4aeef383a8dbe7ef2b5c12a55a8111856c52ba103a1e508c01b82dfc61",
"addons/core/Missions/ERR_Everon_Base.conf.meta": "9b16267c644d815bcf98a3a3aaff30b93d7224fb24d3a2bac66730a28011f317",
"addons/core/Prefabs/ERR/AssaultParachute.et": "b556997989605e2a05982418b7e9f26d12d427eb3ea6e3bc50e85c67ea7aa4b8",
"addons/core/Prefabs/ERR/AssaultParachute.et.meta": "e9dea2d533ad1ce6ce689e0e2815c97a6382e1b90c35ce1efa88a885527e8e18",
"addons/core/Prefabs/ERR/ConvoyCrew.et": "29a525a29605386dfcf292dc2316e9fc7650ce39db9fbaa4ce4372ad0de66db4",
"addons/core/Prefabs/ERR/ConvoyCrew.et.meta": "0a909a15b7dcca34202ded136b3bdbbe8898153c9589e1cce1388433d362da02",
"addons/core/Prefabs/ERR/Epinephrine.et": "e09c70b3d47a4dc5b92fd332c8222b99554b28a8a0c93cb5caac18eec4501571",
"addons/core/Prefabs/ERR/Epinephrine.et.meta": "f1861f0b0ccace1b7b3d9c29768e37a83bf0c6fae5a411b1bd61d6b2eec7ed89",
"addons/core/Prefabs/ERR/Extraction.et": "4d24c7811415c06386205e5bf5c132a23fcf21e96c75c7657ccd5f3ac914ac50",
"addons/core/Prefabs/ERR/Extraction.et.meta": "c2a838633001e2e3a202d39cb33aa744ebcd996017ad032359069641b5d13853",
"addons/core/Prefabs/ERR/FactionManager.et": "5a7b330f33956cc1781c8dc843e8186f2d37a98653ab36e7c42b9019df3c89f5",
"addons/core/Prefabs/ERR/FactionManager.et.meta": "9bf53d5e4bcbe60dd1a4ece1409fc23c349055c860708620f5f6e9716290a97d",
"addons/core/Prefabs/ERR/FieldCover.et": "e403d5cb3a5966f0cea81f15e0e825d482ba1a7a27b12498319ba45a414963b0",
"addons/core/Prefabs/ERR/FieldCover.et.meta": "83461ffa76244e1d69f20b053a9741ccdf7d127009182bd540a7e5ba6150c3d9",
"addons/core/Prefabs/ERR/GameMode.et": "4d3e5e2df28cbb8292c436ae05d4fc7e5ca789a123450a6968d9a718b6ecef20",
"addons/core/Prefabs/ERR/GameMode.et.meta": "106769cd34525c9d440057072836cb7401a6752148c40edd7fe61c03bd58328c",
"addons/core/Prefabs/ERR/Items/EmergencyRepairKit.et": "0157bc235eeb78a0e1373b561fd22a1dcb225c833ff7c2d4abae688bca0ec92a",
"addons/core/Prefabs/ERR/Items/EmergencyRepairKit.et.meta": "da6f065cb2414b5a4cbe9ef0f0b1295b2466f26ad406c0bddb83845d4598efb3",
"addons/core/Prefabs/ERR/MortarCrew.et": "21086e886fe3199624208c9a866f883ec109f7d08746c2b56b497e59857fb656",
"addons/core/Prefabs/ERR/MortarCrew.et.meta": "fdfd4fcd21a67c3d698fa4aadc4e5c76e665cebf4be86013bc389e493fab63cc",
"addons/core/Prefabs/ERR/ObjectiveDocument.et": "5118ecaf9d2038eea44a4b785f05d2e78781dc1387249aa58a6782c7e6752e14",
"addons/core/Prefabs/ERR/ObjectiveDocument.et.meta": "eaba9903be147b98a1106e2273e2270773df73b9b22f2cd4e20136a8e281382e",
"addons/core/Prefabs/ERR/Patrol.et": "d3eca8fe9197c57a27a285cdb3baf168b037b198d92b39df28a338ae2cfd0c74",
"addons/core/Prefabs/ERR/Patrol.et.meta": "7c5da568fa2fcf0709ee2959253cb068d7c7ed7c2467af3b247a7e70efd96b69",
"addons/core/Prefabs/ERR/Prison.et": "c0ca5219aa2d6322ba7d094b92000640b259112ff6611a745c0713c8875d09d4",
"addons/core/Prefabs/ERR/Prison.et.meta": "2e426ef3de68f4107907854b51e818bc11d84649a01c538e3f18dd9ebec766bb",
"addons/core/Prefabs/ERR/PrisonBackpack.et": "ae750f08fc9af645561f59d7e5809bd22f4cec26ca8fa6409d09730765958c91",
"addons/core/Prefabs/ERR/PrisonBackpack.et.meta": "7da6aa45467250edc910ad7230dc244d1b041e8a6f55881eb3747ce51f9212ba",
"addons/core/Prefabs/ERR/PrisonDoor.et": "b0ff94443fe334032113a663917de23f920a8b73ffadc9c8e9f11b545022b3d2",
"addons/core/Prefabs/ERR/PrisonDoor.et.meta": "b8f3db52bf186426026668fbb9d633c3cbd4d438ab301fba880398f6a0e781c2",
"addons/core/Prefabs/ERR/PrisonPatrol.et": "dc88c31cf5c415573a874f74e13572f0add9e6122c8fcad507fe82860d789c47",
"addons/core/Prefabs/ERR/PrisonPatrol.et.meta": "5528e0d778dce5ed39c3e504c6427625527127b23269d20fbf12ca2bffe52ffe",
"addons/core/Prefabs/ERR/PrisonWall.et": "9b410b7c85bb001be4601ad93f750e17b8318b850306d84f29c4dc1b02723d7c",
"addons/core/Prefabs/ERR/PrisonWall.et.meta": "0294bc5dbb56f90f8153d62459bb0a6ad91d76a479812bbec9c7db182fdb58d6",
"addons/core/Prefabs/ERR/Prisoner.et": "e6d345ac98ad9ec742bf6c3b8686839c3256df9833d31bb4bdf605cd41d0ba5c",
"addons/core/Prefabs/ERR/Prisoner.et.meta": "974278ba49fafeed70b619a0067bbc70ae4d534be441c812ce2bef4a5fb3c022",
"addons/core/Prefabs/ERR/Radio.et": "99b1d80b49d1e7f9d30aa4283772a36fd66e962369f288f5fe329c7fc911bb1b",
"addons/core/Prefabs/ERR/Radio.et.meta": "bc91137b68ba550217914fb8892bb44d7e1920e4a1086f3e506623832a44212f",
"addons/core/Prefabs/ERR/RadioCamp.et": "5e6216bf8e6e160da5d9f966c8f7c2081bf6dd16dfac1b89d682a14b3b8a6716",
"addons/core/Prefabs/ERR/RadioCamp.et.meta": "3cb8d3d553ab6d8d111a74f721cf4e69ee1011cbb90248b83cdc7275697276bd",
"addons/core/Prefabs/ERR/ReconCrew.et": "33953379ceb725bcd0cbe505cd643c94adaed17dbbfa95dadd404d6b8e345715",
"addons/core/Prefabs/ERR/ReconCrew.et.meta": "2653e8c5b1cdb857de5badd5959ddd9826a6a298ab3c166628dbb835d7104d90",
"addons/core/Prefabs/ERR/ReconHelicopter.et": "c609ee59ab145e0a1936f95726b86df643f5cc425c43924029e9c1abc69ebbd0",
"addons/core/Prefabs/ERR/ReconHelicopter.et.meta": "d80f1c3d6a6f9104562b89729996c1c92ad240f08cdcf48d4c390a09d2047c08",
"addons/core/Prefabs/ERR/ReconPilotEast.et": "d961f329823b991eafed80d085de1bd89b44a4575be98d8dac385d6b77741ba2",
"addons/core/Prefabs/ERR/ReconPilotEast.et.meta": "d73df3c896359a54514d2efcd851f579feca7a2619b76c2a38f607649a31a4f1",
"addons/core/Prefabs/ERR/ReconPilotWest.et": "8f8221927269352e55c8026ee5b00e026c281c79af6684b386f24e7dc4675fb8",
"addons/core/Prefabs/ERR/ReconPilotWest.et.meta": "4785f23bb492c6af420ee7896ddbfc9767e0db1e06de95207df2dc949a1b1814",
"addons/core/Prefabs/ERR/ScoutEast.et": "b4593aab494c4f21637757b3daff4f349da77b4c48ec5e8a4a2917a6a12cf811",
"addons/core/Prefabs/ERR/ScoutEast.et.meta": "7c72af632537f687e92f30b52d97fc7d70dadd39d33f37e0b1004f9596f55012",
"addons/core/Prefabs/ERR/ScoutGroup.et": "8dc0fce8ee3decc1c367411b00b6d8518df9d8458281cec0881464a2ce906af0",
"addons/core/Prefabs/ERR/ScoutGroup.et.meta": "62e43fd152ce57aa4ceb2187a49e4aecdeb9f428b3a1e8318f86bb83dbf8a259",
"addons/core/Prefabs/ERR/ScoutRadioPack.et": "f1c4911e2556c0e0caa8b896982190c5e7d0433e850b4610e19442caf9117607",
"addons/core/Prefabs/ERR/ScoutRadioPack.et.meta": "825506e3d814d30a52d5dbf64124470641c07a0453543ba71426841e6c783635",
"addons/core/Prefabs/ERR/ScoutWest.et": "2681b5a3f8621adb44195f0dbca6f3e79ef7decad8f9d0dd0e1a801ec2549627",
"addons/core/Prefabs/ERR/ScoutWest.et.meta": "22a6607b4b8fe606ca75a634a0b2ac3178e7bedae7f9ff01e7a4989f3b39a3da",
"addons/core/Prefabs/ERR/SpectatorCamera.et": "cd2dcaca0df4c39816e582c594591a535525ed77827ffa3de24d27b79996544d",
"addons/core/Prefabs/ERR/SpectatorCamera.et.meta": "2a16558f93915e31908a674509e9c89976470f78a84a1174a64b94b68b8f77ad",
"addons/core/Prefabs/ERR/SupplyCache.et": "4c97b0514fe7e723046f40f0b396f6573b12eb9981ca5df70b9e8aa3cf29323e",
"addons/core/Prefabs/ERR/SupplyCache.et.meta": "2f5de3a4aab1e9d0e35521f48dc57b95bd6e449c383dec4f1c258e10295904cb",
"addons/core/Prefabs/ERR/SupplySite.et": "f33681281d26676fac88736091834d5a7b87fe0fa01883582542df964dcfc694",
"addons/core/Prefabs/ERR/SupplySite.et.meta": "b41944b12eb3528ff7a3ac94258b18c66ef161aa6a38894aee300a1ac4798630",
"addons/core/Prefabs/ERR/TerrainConnector.et": "cf9cb28f5a3f41931380864a29ac979aa1d5e843456f564ac7a7de78f88e1aa8",
"addons/core/Prefabs/ERR/TerrainConnector.et.meta": "9f37c979ae282aabca29ce84beb0db851ee8b9a19f7f3a64d387c175616127f3",
"addons/core/Prefabs/ERR/TerrainTakeover.et": "6206fe2eb4e2c6c1a9e3ddf2898535ae08981c115adc6ddd926017ac20d4b535",
"addons/core/Prefabs/ERR/TerrainTakeover.et.meta": "64e953e378ab1d2a75ee7246f876f4ef93ae8a4e3fddb5002d7ba37268cb959d",
"addons/core/Prefabs/ERR/Vehicles/SupplyUAZ.et": "29f157849f413261494a63d4d5b0a97e8bbe61cb076efcd59d6c940653f23352",
"addons/core/Prefabs/ERR/Vehicles/SupplyUAZ.et.meta": "544c94cf1c26757a10654de7856cd6cc48b821ce3bdc02add13cfe6514269915",
"addons/core/Prefabs/ERR/Vehicles/SupplyUAZRearSeats.et": "cd4acdcecad299445952aea0adefc85f2b9e9b43f8186f100e0505c5621b3656",
"addons/core/Prefabs/ERR/Vehicles/SupplyUAZRearSeats.et.meta": "123955da03462befb90e293b3bb856d49cc761166611b38ff47cb48ec2fbe95c",
"addons/core/Prefabs/Items/Equipment/ERRM_SharedFieldMap.et": "30dee8e9eab459ea32a7d835a9fb89d43df47708057cab829f067b25a24cd581",
"addons/core/Prefabs/Items/Equipment/ERRM_SharedFieldMap.et.meta": "59093e9072c50d99c86da7609c87541016da5bcf92b98d99db4c524e1c8e0e8d",
"addons/core/Scripts/Game/ERR/00_Core/ERR_Actions.c": "cabb21413c90b252d29708b62228d0679c51c76e39ee0e483953ad7061b2b9d6",
"addons/core/Scripts/Game/ERR/00_Core/ERR_Actors.c": "980d30964845600a261693cc5c5553e1472e8e54867bdc06133ff5c7b36c9128",
"addons/core/Scripts/Game/ERR/00_Core/ERR_AdminMenu.c": "d39dc876487b445efc5c3fadc19e1e06c6900c5cd57c93a01f35c32aa27d6039",
"addons/core/Scripts/Game/ERR/00_Core/ERR_AdminPlayerTools.c": "56780d78bf423f54f482d8620f821b8d3eb0199194482b4f12e37f5ec3f55ef5",
"addons/core/Scripts/Game/ERR/00_Core/ERR_AdminProvider.c": "62e05aceb49da07fed7aa89fb6b2f8eb3efc373ac09eff286fba983c3ad570eb",
"addons/core/Scripts/Game/ERR/00_Core/ERR_AdminService.c": "c3e008c8bbf538c5bca3a82a975decc7a283a38543a9d2639d90a81ce592c51e",
"addons/core/Scripts/Game/ERR/00_Core/ERR_AdminSession.c": "af8bb43d207d6360ae4dae06c7283a81f89d57a66b644f3f730496b0d47d4a55",
"addons/core/Scripts/Game/ERR/00_Core/ERR_AirfieldPlacement.c": "0c2f4d31a2abc8f3f90bda20546543f2a1cf9306e9bf93351dda1883b990770e",
"addons/core/Scripts/Game/ERR/00_Core/ERR_CasualtyGroundSupport.c": "26f0c7ebe8563bb022f7c383674e7d8997b0cc35c7ea321d39d74f2493c1ed9d",
"addons/core/Scripts/Game/ERR/00_Core/ERR_CasualtyLoadingFeedback.c": "e46988b92243df19a5400eca7406d6969b8b1174d8e3efad48fa0a936cbfdd07",
"addons/core/Scripts/Game/ERR/00_Core/ERR_CasualtyLoadingGameMode.c": "f4cf19440583ac24346831a2d5f1d7f734c031e46dc266c499972329dd0533cf",
"addons/core/Scripts/Game/ERR/00_Core/ERR_CasualtyLoadingOwner.c": "6346a05ddda030f7d9b6f026f977d5f018ee16002fa519e8c49dcd700c323dc7",
"addons/core/Scripts/Game/ERR/00_Core/ERR_CasualtyLoadingService.c": "e6f22813f7a04e2c0ea000d054407191f2be8badfa6c51e062e9dbf84b95c67b",
"addons/core/Scripts/Game/ERR/00_Core/ERR_ChatClient.c": "4bf937ff74e0483c17fa0103f73bfee3afd8f67a37c0c248b08772a17bfcc349",
"addons/core/Scripts/Game/ERR/00_Core/ERR_ContentDefinition.c": "bc1dd4ed27ec894cf4bd617fb226cb8140b544aaa9ef6d8654e815d81e7f6fd0",
"addons/core/Scripts/Game/ERR/00_Core/ERR_ContentMenu.c": "c82b173496e7524b4570b2afc5493cb970252a19aed740a53011988db7700a01",
"addons/core/Scripts/Game/ERR/00_Core/ERR_ContentPolicy.c": "3a4987345d5a7159234a7e1a08bf5ac40dd5a23031e9b1953fc43a0501d9924b",
"addons/core/Scripts/Game/ERR/00_Core/ERR_ContentSettings.c": "572cc36f88255a37e8f0e9f284fb96e07c6c4032506b34b8c77d688f02785400",
"addons/core/Scripts/Game/ERR/00_Core/ERR_DebugAI.c": "bc5529c60591a6c36c39cdb753b1af948690fc3c3c725f38a8d595b41a499235",
"addons/core/Scripts/Game/ERR/00_Core/ERR_DebugIntel.c": "a9f6e7e42a3214879a21052e897f9afc0653c12ff15d5bee7766e26a1af6ab17",
"addons/core/Scripts/Game/ERR/00_Core/ERR_DiscoveryMap.c": "dd350bdda1bdf427ab8cefab623fe60cce5332b062d1a29686fe52f73e9e83f1",
"addons/core/Scripts/Game/ERR/00_Core/ERR_DiscoveryService.c": "34458b3a4f7062375c9c5b5599308e9cea67fc4a316420836f6694ca2c646ffc",
"addons/core/Scripts/Game/ERR/00_Core/ERR_DocumentComponent.c": "885c8ab4fc9e64c3f8b40056536096c8c32b011cb340b25ca00353a96da15c69",
"addons/core/Scripts/Game/ERR/00_Core/ERR_EnvironmentService.c": "c0fae5bf51ccf507bc84d44adc2d1dff021cd83653c0468b7645a4f343e3fc8d",
"addons/core/Scripts/Game/ERR/00_Core/ERR_Epinephrine.c": "e04c53c2f665997023b2daee744265cd22f4f0101444e4d9b0efbd114f74fa9a",
"addons/core/Scripts/Game/ERR/00_Core/ERR_EscapeGameOverScreenInfo.c": "6e3c65e55b05cf205040c310b9086faa41b88582c7f9faf49c010afd59da5b07",
"addons/core/Scripts/Game/ERR/00_Core/ERR_ExtractionPlacement.c": "6d388fe21f08b25cbdb5dfa4e198d94a4c80c5092f8d17630a4654e18bf8b3f5",
"addons/core/Scripts/Game/ERR/00_Core/ERR_ExtractionService.c": "91357099b4e0401196b67d48963be54be30e56bdba57cdac67dc20b8ebb883e9",
"addons/core/Scripts/Game/ERR/00_Core/ERR_FactionCatalog.c": "a5a8c53acf21259e14f59cb919535910f30dabff5a9179c664bc6a7a4d744d6e",
"addons/core/Scripts/Game/ERR/00_Core/ERR_FactionMenu.c": "3549339d7796e67fc646680493c226e545b6fb95daa0270af9901795bdf8ed50",
"addons/core/Scripts/Game/ERR/00_Core/ERR_FactionSelection.c": "077c09491f4444fc58f093975fe9b3c294ea1fc966abef847ee5f13aa795ee29",
"addons/core/Scripts/Game/ERR/00_Core/ERR_ForceLedger.c": "0ecaf1c5a52568e751678b0b1236e91e6adb538f8fbf010d38b61a312d1bf253",
"addons/core/Scripts/Game/ERR/00_Core/ERR_ForceSimulation.c": "2bbb8888c752a3ffc042f3059937526d25ae288af5b4db024cc683025a2605ce",
"addons/core/Scripts/Game/ERR/00_Core/ERR_GameMode.c": "ea6e80333cc8b6561fc4b76dd7811a7a539007cf60b4d85dfe4943ff7994f317",
"addons/core/Scripts/Game/ERR/00_Core/ERR_GeneratedSites.c": "4a23058f27e3ab074df6f8f7bb6f08a8fd26fbadb8943c6fb8d64dcc9c221751",
"addons/core/Scripts/Game/ERR/00_Core/ERR_InitialGuardRules.c": "8c9d6b1dc4c2af96284e34f487eebb5a221091016ef108006dec60b4e3836558",
"addons/core/Scripts/Game/ERR/00_Core/ERR_Inventory.c": "b63e679d5b650b63a7a91dfc3f42a62f4be58b0338f6df3313e66d29a93bebf6",
"addons/core/Scripts/Game/ERR/00_Core/ERR_InventoryLayout.c": "1af5df45a0f06d19a017954e9bf4b2d722e2d2389f8ffdeb1d024435b9a08be8",
"addons/core/Scripts/Game/ERR/00_Core/ERR_ItemStationTeardown.c": "102e61216e86e47ad243cc19f6f66da1fcd8cc77f8799354ceaeb4a6dc74622e",
"addons/core/Scripts/Game/ERR/00_Core/ERR_JournalText.c": "87a6c19429f12c5630ed73170ca9a8a6d2255d6cd38b130166a78aacd15f2de0",
"addons/core/Scripts/Game/ERR/00_Core/ERR_LoadCasualtyAction.c": "1521af55a34110ce1c971b5226a618a9c6d931622abaae4946d9c0d27c05a273",
"addons/core/Scripts/Game/ERR/00_Core/ERR_LocalAdmission.c": "a076922d1ae966cf5cc67b198166ca6b1288358fb7f641207a4681e6a610a2ae",
"addons/core/Scripts/Game/ERR/00_Core/ERR_Location.c": "5b0b058130ccac02bdc1dcd6474d51a6f45da4dd52ed6c37906692fca3f194b1",
"addons/core/Scripts/Game/ERR/00_Core/ERR_MissionRules.c": "f7abc38ad8fdc375ce7fa63a65f0bade027d22b37e09de5e3f94ba8c3c63cc41",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeAdminMenuProbe.c": "ec8d04b6550b39b9688ef67b40cb2f14a9d98c8fff62b6dfb8d4a43e19b4e4c6",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeAdminSettingsProbe.c": "73e58561e08e50008d33f81eed606dd4e8109fb69a627e892d28ca468d641f7d",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeAggressionProbe.c": "85a34cf60018e90d974cb67ab0f358f3073b6b9f02c563ec200e062f1d249e3b",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeAirfieldMarkersProbe.c": "593e59664dbd7330b52674e5d4cc7b70db588cb75a1259ed808b74602501d541",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeBaseSmoke.c": "e811e985048e07365569acde6b5f045d57e9bbf13927f85b74e6e347fd2ef571",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeCasualtyGroundProbe.c": "41f40db3735f8aa535c0061458d9892dcfe972222b8a17238e67b65633c46bc3",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeCasualtyLoadProbe.c": "94c533deea654ec546df3f1ebb7cd213e6cd79b1125d99bab5303ef8e87b018b",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeCasualtyRemoveProbe.c": "4cfc06f6d43b709b63caae714155ffc562502e884f49a9825623c6f46972ad36",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeCasualtyServiceProbe.c": "02a9d70d1f4ba20326df199ba41489cfbae12b7bb0aab441361421cee38ad9ea",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeContentProbe.c": "cb0ccfe1e1575f9ed80a8054058b471f3543378db059e6af2fed8eb42a262638",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeContractsProbe.c": "421e4b901afe6118b6bf44e8f678db8ccdf1c83b39da0cf816baa36f7275ccdd",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeDefinitionProbe.c": "904d8d4c3e7b91d49dadfe495fc7b4f02f300e4aaf7efa348df5ca17ec4a6e8a",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeDiscoveryMapProbe.c": "9ed32d391d08d937ff4f9f33bd11c3a204ce9a2230c2d72b6761e0320b31f24f",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeEndProbe.c": "2dec80c7e247ec5c257407f95d9d5edd42fe0cc44d6af9f724f6ebd10d8a355f",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeEnemyLoadoutProbe.c": "0885ca69f6fa7f53414ce1792cfc3c49916886b8173783c634135c13c5d37429",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeEnvironmentProbe.c": "9e2e66ac5d9778a1c65445348e3300cbb90b68b3f669f3ddf1d2b78a858430eb",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeEnvironmentRestartProbe.c": "7a836a206381b8e8de24c92baf141beb30575723675dd6948d738169ed26b507",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeExtractionProbe.c": "4b09385f73206de004f4f3c38a6192fd658a0d2012482dc5a84dff1599ceb972",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeFactionCatalogProbe.c": "e3011fa47b67122d7b2c23af8f91b7a217599d6cc114c4f9de628744b9c948d3",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeFactionSelectionProbe.c": "946879d822e7be2d48e03a3140aa1aad3e3d44dd18507fa3cdedb4c6d7dd81b9",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeFlightFootprint.c": "a8862a04ac784426f431e2e9cd3f1f19f820b38a081674d29549b8b00277c72d",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeFlightInputDiagnostics.c": "e231dcbdaefe81beb3bd587cb73be8fb3d3184bc86d18dbaa30a43ca4ba5dcc4",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeGeneratedSitesProbe.c": "83ab84ca4de7b545963896ed9d14e6545c23a2b940515730d74acc2f6b3dd18d",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeGuardCancelProbe.c": "bfa1c65cb039e19c3d1891e4a3fd33469e974c97cc7f42128efc31a8f587d514",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeInfantryCombatProbe.c": "3e4c4382ab91f470357268927b954fd101685df6b2244df483f0422d6c0d7da2",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeItemStationTeardownProbe.c": "028588a49fa9207087cd27ec9396979cd932daa071e2490bd0262cd71dae30d9",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeLifecycleProbe.c": "b613a5dbe81c2032fd02d31070ae5631166d14d0b02cdbec3b63b782f0bbc115",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeLocalAdmissionProbe.c": "29c860ca3e51cdaa463f3c23a98ff45ee0499ce9bbc322046e0efbed587f1e09",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeMedicalCombatProbe.c": "3b9c557b249728c518f9d6b5cb24b725ecc32a69ae12df069cdfb0da70a80b95",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeMedicalProbe.c": "4b73e7cf35e9c8fddb089678a320ea58272e1b6611318d0a762754c171eff785",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeObjectiveLossProbe.c": "6b80fd317a8c6e8583bd4337870838a86251e3b8a681d0aa07e8b52e22abfc48",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeObjectiveMapProbe.c": "2d07b895cb74af58454605fb1c536a566733e3001a9375dd0677d5f274bf2a46",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeObjectiveProbe.c": "71fbd2479a70048f83d8b262ad1452f427be2c0afc8b071ef13bff477b9dc29b",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeOpeningToolsProbe.c": "0c5d6b96ed5a7cb1cf0d098d534dc7190449ed09339062e6b584729d53a61b4c",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeOptionalSiteProbe.c": "19fc19e22348e6213827f620f4fdb5dc26144ea2ce0032de773e79c1fb155a26",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativePatrolProbe.c": "5a2af71cc4cfccc7dd7c23584398a38290eba1a8894cd46f6967252ff3a7087c",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativePoweredFlightProbe.c": "7ae5d6f85bbbebec214c66bfdf6f53b93c802f109fcd5bcfbad82c5d61d6cb9f",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativePreparationStatusProbe.c": "456f4d7c3272b89d5f4c6713617baa5596d846994152356fee9a659839bcd8b5",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativePrisonBreachProbe.c": "4889e0d3799a6a21b9f84bcb2f2ae78dce16269cccd1329f8d1fcc1a23e7c22c",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativePrisonerProbe.c": "e2d1ffe5d269add55124601ff0d1dc032a398c7d51010736e6f0e4cbeb38ae86",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeProgressionIdentityProbe.c": "1d3fe20bce761a1082964bca9bad9ce79d1fa8b04db9b5053bae98da380ae560",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeRadioCampProbe.c": "67f1a088f9b20e5f0f11ed3aa083ffa772bffd7c74d85b7a307344ac3d47e09a",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeRadioDefenceProbe.c": "ff1e27a0ce75b123a86e7df31354831880ca62ea90b6c5d7c60d3ba168e1fff0",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeRadioInteractionProbe.c": "7b27552d233813894f65c08eb9f04b547c4ca9ff96a2370a763cb94bd4a555c3",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeRecoveryProbe.c": "d6691f22432b3ce37d07d448aeb3ce7feb5cd09e852e0167b5e4676afd24bb21",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeResultProbe.c": "c9a89cae067f221b9f33965b4d3ab311b78ba79ea383ca65032c4001df44b472",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeSiteGarrisonsProbe.c": "1a5ff8747d7501862085b5e9162043fee3b05e82c73c516ad8093aaada53dc60",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeSiteSurvey.c": "ac0203753ade0cdff6d483132797a80e4520f14546c3f9dea288281cd4cd9c4f",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeStationTeardownDiagnostic.c": "172248540932174341882861bb78a9720a6cf89981fcdf9dffe63f7fd4023f2c",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeTimeProbe.c": "4a2c6ffd947334a0a71eac083d10c853c524b00042e9ea0987497c4cee60c3d5",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeTransportProbe.c": "7a3fe04aa1c5ed1061ff63d9d5180e8b925932b62d76c1ffb49bd3dc23530993",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeTransportSurvey.c": "816df9a2a9072f9f7db75e56168d8a8fa1e665ee8f7dfa79af011b354254909d",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeVehicleSecurityProbe.c": "59bce863142e4fba4b6fb2f544bb8a58061f0e99b1a38e5ac291cea919563763",
"addons/core/Scripts/Game/ERR/00_Core/ERR_ObjectiveDetails.c": "628ebd166dcb5544c2d18dce489619984887ee18296cf2446fc6d894f89dd5bf",
"addons/core/Scripts/Game/ERR/00_Core/ERR_ObjectiveMapPresentation.c": "f189f8987244e10df61ac577bbbc952ed5c4e6c431a8e3cd192a10fe2e8c3bec",
"addons/core/Scripts/Game/ERR/00_Core/ERR_ObjectiveText.c": "8d75b35ab977be0cb1a2e3d3d1cb8ef875cdbfba69c35784c3d195451ef944c6",
"addons/core/Scripts/Game/ERR/00_Core/ERR_Objectives.c": "b9cd5bb3b193c20401175c4328405be1b121e8a60b7b5999910b6a71f834af8a",
"addons/core/Scripts/Game/ERR/00_Core/ERR_Observer.c": "4acbd2b23803f1fde3701fbddffd56edd83693196f0be2fe99f3be9b79a12b3d",
"addons/core/Scripts/Game/ERR/00_Core/ERR_OrdinaryGateObserver.c": "1e376ca83c0005cf532539e14d7f47363c47b7c5b03fe3d55405a59208705fd7",
"addons/core/Scripts/Game/ERR/00_Core/ERR_OrdinaryInputObserver.c": "808a46cc1e4b31b65dbbbcdd55493f594ebb3974bbec38b4a2402334c653c0ef",
"addons/core/Scripts/Game/ERR/00_Core/ERR_OrdinaryLookObserver.c": "d5a1b636938d65e9d11c78b31487f2924400c34d98e2ec812954a2a224da7dc0",
"addons/core/Scripts/Game/ERR/00_Core/ERR_OrdinaryScenarioLaunch.c": "a4e7e56d174ebd15b4730202dae4c8ed06144f3f27c23ed49c99e2d297dc421a",
"addons/core/Scripts/Game/ERR/00_Core/ERR_PlayerAdminCommands.c": "eca9baa3b07da48a740851583540840f8bf5f65f7be854902a3778f76967faad",
"addons/core/Scripts/Game/ERR/00_Core/ERR_PlayerEscapeResult.c": "3124ab4d2d6d471409a47aba0af528790734df53243c03fe0cdac3e407047c14",
"addons/core/Scripts/Game/ERR/00_Core/ERR_PlayerGuide.c": "e49bab76a015ab545088af7e5eaa3cc45811907db4e5b1c5fa8c18afef34b62f",
"addons/core/Scripts/Game/ERR/00_Core/ERR_PlayerMedical.c": "270454d50235bc28df9bba4fde2689934578874c4eca9560afb9f0f6324d7215",
"addons/core/Scripts/Game/ERR/00_Core/ERR_PlayerRoster.c": "c038dac0f749bd29ebc35a4e952904b41a34417ba738904d5efcd1833a263e0b",
"addons/core/Scripts/Game/ERR/00_Core/ERR_PreparationStatus.c": "43a406822a0361f916abc363f27e0c578ee94855036981d876bf47c68233c71a",
"addons/core/Scripts/Game/ERR/00_Core/ERR_PrisonAI.c": "8709753e86dc2ca777183f08cb8fbb9851e0c0de495ca01520ebcb1b3dfa59b9",
"addons/core/Scripts/Game/ERR/00_Core/ERR_PrisonEscapeService.c": "535cf17e21fc8e62716c7d9da88d976ee2f526501c6a4752b822f1252e742bf4",
"addons/core/Scripts/Game/ERR/00_Core/ERR_PrisonPatrol.c": "284618391ee2da84dbcda4a99ca3c072eae3d67b8a9ef40a86827b9ea00810f9",
"addons/core/Scripts/Game/ERR/00_Core/ERR_RadioDefenceService.c": "f5f0bf1352141f933d0edb5630e30541e001dc07e1d2c8529b29cc159c126b13",
"addons/core/Scripts/Game/ERR/00_Core/ERR_RadioFeedback.c": "545262e65e9b3645d9e514a0521e442fe08f0c2e4e7c83ba638c5105d09818db",
"addons/core/Scripts/Game/ERR/00_Core/ERR_RecoveryService.c": "86f9a7769e3ccb19fc61127fe2fee2ad0dd825487a5cd59f334de8b9741c93cf",
"addons/core/Scripts/Game/ERR/00_Core/ERR_Resources.c": "d0169aac6fd0c38928c47a9002ded0fd8ba558ea3314a600e792d307ac1ca3ee",
"addons/core/Scripts/Game/ERR/00_Core/ERR_ScenarioComponent.c": "81bf30d358c7b100248be17cbc2e6beb2f107300c939aede8a92d273eb7dae1f",
"addons/core/Scripts/Game/ERR/00_Core/ERR_Settings.c": "1b466886e9f5fbde1de0be20395e3887046c6b5a9a239dae92cecbfb721714c2",
"addons/core/Scripts/Game/ERR/00_Core/ERR_SiteDefinition.c": "2088c45798f0eced702e0abd97550b8d1fc97ebcc34c3d497978b7424f6c670d",
"addons/core/Scripts/Game/ERR/00_Core/ERR_SiteDiscoveryRules.c": "dcbce3b7aee89bfc47a50e9de89209758af1f1bb462b99af67a8ad7a26e9f229",
"addons/core/Scripts/Game/ERR/00_Core/ERR_SiteService.c": "9bd0824995d3e08cdb2745f1cb539ddd27e422509814188ea6ab2ba56631e7cd",
"addons/core/Scripts/Game/ERR/00_Core/ERR_SiteSquads.c": "183883783a4e8399cf62851a4cc65a5d091d25131bc53b4323cf17286315b2e0",
"addons/core/Scripts/Game/ERR/00_Core/ERR_SpawnClientScene.c": "b56f99a91cdc53bdb93d320d10839339022d7e61e6b101eee8296271abd7d3cb",
"addons/core/Scripts/Game/ERR/00_Core/ERR_SpawnFinalization.c": "c949642366ad124dd2abc4111cd598eb94aa257fbae01b6fb3a0f1882a23e83e",
"addons/core/Scripts/Game/ERR/00_Core/ERR_SpawnLogic.c": "47a39c951be71bfcf1cc50526d507d0f9d8ef2fc09408697b6fe6b0dc5a529e2",
"addons/core/Scripts/Game/ERR/00_Core/ERR_SpawnPlacement.c": "270bf465808d23627a11e720c6632d4fea35d0c679e63aa64046ef8874d68ceb",
"addons/core/Scripts/Game/ERR/00_Core/ERR_SpawnSceneInventory.c": "76b79d5bd9d1f367e1ed19724302b7d49f8b0ede85cf19e89c452582ef651f8f",
"addons/core/Scripts/Game/ERR/00_Core/ERR_SpawnSceneLease.c": "20de7f96bacc9037580d88d4424664b4554b2c082d82e7d29913e9dfe390b594",
"addons/core/Scripts/Game/ERR/00_Core/ERR_Supplies.c": "752e8a56b0b8cde33cf532032cb0a203553017b686faac2e19bee06f7a9c0713",
"addons/core/Scripts/Game/ERR/00_Core/ERR_TerrainSites.c": "2e1f2102e4f30535178ec3dd168d833a0996de87bc3d3b17e059d44ad3129cbd",
"addons/core/Scripts/Game/ERR/00_Core/ERR_TerrainTakeover.c": "770291e7616daac6dcb0276e234cd1611aa3ecef8d82589c4feb1752fdd2fee4",
"addons/core/Scripts/Game/ERR/00_Core/ERR_TerrainTakeoverClient.c": "694505e69789c7267f70fd0925c5c999f08cf9546e05d5d6ed394cb4eef23964",
"addons/core/Scripts/Game/ERR/00_Core/ERR_TerrainTakeoverManagers.c": "5b7661a5617b7124a10d3c18e087a4e2363a967eecc5c87ecc94573f2abc07f2",
"addons/core/Scripts/Game/ERR/00_Core/ERR_TerrainTakeoverSettings.c": "cc4a68484995ad663b112d92b20dbfcae2f549a586ef713fb3ea13353291d1b7",
"addons/core/Scripts/Game/ERR/00_Core/ERR_TimeService.c": "63867760876d523a1794f619118a52c5cd387d5d92756cd286b2c16a348a6c7b",
"addons/core/Scripts/Game/ERR/00_Core/ERR_UnconsciousCameraProbe.c": "7d5ff3389ee806ac213db5be3a68288b3399142ccc29806df0d65b34a0b2fc3c",
"addons/core/Scripts/Game/ERR/00_Core/ERR_UnconsciousWeapon.c": "24d31bc857486638e55c605283c17cde0cdbd3c5c6021eac1ec93611387b10d1",
"addons/core/Scripts/Game/ERR/00_Core/ERR_VehicleSecurityActions.c": "bd7d0aeb4abcc9d8044e4888f9a92f9e5fc97c098bdfa3bbad57e1a29697a779",
"addons/core/Scripts/Game/ERR/00_Core/ERR_VehicleSecurityComponent.c": "2ffec4e646584ec546147fc4b08249825cb32b531aba26467b586d760485adc3",
"addons/core/Scripts/Game/ERR/00_Core/ERR_ViewDistance.c": "8514f72f8207f12570d2317e64094a45507a1647dfd45a1501499ef81e90189f",
"addons/core/Scripts/Game/ERR/10_AI/ERR_AirAmmoMission.c": "0a471a40c8f7dfb797d8d35e41c5b1ff91e8d2ab13b43cf866e46c0e4ab4ed9d",
"addons/core/Scripts/Game/ERR/10_AI/ERR_AirAssaultLoad.c": "5554994115cd7d56152ac78ba53034bf934b71c5634b17d35e96884dbb3b8a24",
"addons/core/Scripts/Game/ERR/10_AI/ERR_AirAssaultSystem.c": "2eaf9816eee3e1cd2ac70744a6ef7ea5a90d0a3eebdf925e384028a7edde6a42",
"addons/core/Scripts/Game/ERR/10_AI/ERR_AirReconSystem.c": "0b4faaf3d4ee506730de48554100ea3d9443e9cbdfdf354f56dd8b121507b324",
"addons/core/Scripts/Game/ERR/10_AI/ERR_AirSupportPolicy.c": "b5dad011d5a0574a406d6469e0744a9d37700cb41930dada28c5143d556acf53",
"addons/core/Scripts/Game/ERR/10_AI/ERR_AircraftAmmo.c": "2be282406d0c45ab2e35b0ced791b5e494c662588f536701a4e82e6f5fb7c913",
"addons/core/Scripts/Game/ERR/10_AI/ERR_AircraftControlBridge.c": "b8f0141644d8f043c6db4c2d4bb93215c548e5c27ab5468c66e996d62bdf905a",
"addons/core/Scripts/Game/ERR/10_AI/ERR_AircraftFieldEnvelope.c": "0f53c7d9ab167a804eb904d63725decebb53fd5796fdf27864a75abed5679838",
"addons/core/Scripts/Game/ERR/10_AI/ERR_AircraftFieldFlight.c": "c04e264cff9963821852094c451502d31bf9c96d4deae2e8ff8a2373b53b5665",
"addons/core/Scripts/Game/ERR/10_AI/ERR_AircraftFieldRules.c": "30be68f4ca2db7e169f6f0432815821179cddf9159f7b150341dc8eb479bbd17",
"addons/core/Scripts/Game/ERR/10_AI/ERR_AircraftFlight.c": "aa25a8e67a30c48677bf528236402b7f8e5d815dc18df93b878520ad3d1fe8a7",
"addons/core/Scripts/Game/ERR/10_AI/ERR_AircraftFlightEnvelope.c": "8125cef61fb283d0d7c4dd2df3c04b062b448f1101fd48dd53f4f4097df5fef3",
"addons/core/Scripts/Game/ERR/10_AI/ERR_AircraftRouteEnvelope.c": "e8fcef844239c47a1f2f36be420afe943bc450091b05859435406b46c87fa511",
"addons/core/Scripts/Game/ERR/10_AI/ERR_AircraftRouteFlight.c": "1d8d92bf6d97429d68a9f62018232e90cc124cc8d7445efeabe863706a31e2b9",
"addons/core/Scripts/Game/ERR/10_AI/ERR_AircraftService.c": "3f05209227986b5c6bfb193f8f53783cfd4ef083bce898e22257c3e63daed913",
"addons/core/Scripts/Game/ERR/10_AI/ERR_AirfieldSupport.c": "c6d88ede0b1b6bac5a7075b6e2e783ccfa8850210aabd28bfa4bcdb698cc5f87",
"addons/core/Scripts/Game/ERR/10_AI/ERR_AssaultParachute.c": "a93c996059e7166988e9d1b0b498cbfd36f19a1cf8520cb4e9215a8884752e18",
"addons/core/Scripts/Game/ERR/10_AI/ERR_AutomaticEquipment.c": "7ed538302204b54630fd07b91fe8b73fa36c11df3c402b31d23fb570fbe021a9",
"addons/core/Scripts/Game/ERR/10_AI/ERR_BodyRecovery.c": "47d9374095d04f5f1339c220caf518a40938ffc20f891b1b51ae38579e7e1c25",
"addons/core/Scripts/Game/ERR/10_AI/ERR_ConvoyBoardingProgress.c": "328f8a5eabb8174b7727eee1d675db83a2eb0be7b8e834db4e950a645ca5d7a3",
"addons/core/Scripts/Game/ERR/10_AI/ERR_ConvoyBudget.c": "ca49c274146d56e30cc93fa1652cc34c0fe68ea95725b0b3e33ab3673a6463c4",
"addons/core/Scripts/Game/ERR/10_AI/ERR_ConvoyCombat.c": "5c4b7576b28d51edea868cbb91a0ab31a40e6ddb558f1b8a38e07e20fdb2969d",
"addons/core/Scripts/Game/ERR/10_AI/ERR_ConvoyMineStock.c": "4497d6b790a45df2b76d18541ddaf299b406def88b868caa29f096849026a42c",
"addons/core/Scripts/Game/ERR/10_AI/ERR_ConvoyPlacement.c": "4d0e8b6e147486fb65db82a1060f0c5641c1319ba9e418bdec99cb5a422a7fbe",
"addons/core/Scripts/Game/ERR/10_AI/ERR_ConvoyRoadPlan.c": "fae404f85cae63e63976938a5fdb73efc988ba25c5846564f12edca04fb88551",
"addons/core/Scripts/Game/ERR/10_AI/ERR_ConvoyService.c": "e1d5dff5584f1bf12c146df510c860c3e0e046c989ff758def88ecf6b49c6392",
"addons/core/Scripts/Game/ERR/10_AI/ERR_ConvoyStartup.c": "360228fd45aa6ecd9426e36120b5e637d2feee1e3a4a89aac8207526b871c87e",
"addons/core/Scripts/Game/ERR/10_AI/ERR_EnemyEquipment.c": "c52d4a3cc0e71eb136487c42df2fcd5bd6da1c33d31dbd3d6429c237dcf4a8d9",
"addons/core/Scripts/Game/ERR/10_AI/ERR_EnemyGunnerSkill.c": "adf8bac5a6f7e40b2f9caff5fe9be590c4e4ce2b2b387ba39e741a3c4f4cc564",
"addons/core/Scripts/Game/ERR/10_AI/ERR_EnemyLoadout.c": "a48f32dbd7f209bf08fce2840aaffc1781c571fc679763be58987f6b082e776c",
"addons/core/Scripts/Game/ERR/10_AI/ERR_EnemyMapMarking.c": "0f161fd3e08a54e3e1063679127549e482c40253a022e9d06cd9ee4d740b8625",
"addons/core/Scripts/Game/ERR/10_AI/ERR_EnemyMedicine.c": "05d341a9a000bfa2084057bd67d476d6e35adca6c8518d74c27cd31b551bbb95",
"addons/core/Scripts/Game/ERR/10_AI/ERR_EnemyOptics.c": "759e0a88ff30cb781ee69b8a935865d63ede5b1d97f31d344018f650a967c37f",
"addons/core/Scripts/Game/ERR/10_AI/ERR_EnemyRadio.c": "3a97e5c3de9ff33873d97c6b2d84ae505cfc4f3146e047b928e76ec3b22c8789",
"addons/core/Scripts/Game/ERR/10_AI/ERR_EnemySkillAwareness.c": "00c450d033e43fc45c9e2cb64a1d81161d123cc594a4292cfc5f68eb6c17ee60",
"addons/core/Scripts/Game/ERR/10_AI/ERR_EngineerMine.c": "e0098577626e719283cf4b40936e7ec038076c4bab9269fbad0b5ad3292e01e3",
"addons/core/Scripts/Game/ERR/10_AI/ERR_EngineerMineSite.c": "b629fecc29711e57f364f2a9c4c3e884b0978d9674311678f2e78b561683681a",
"addons/core/Scripts/Game/ERR/10_AI/ERR_FiniteMagazineReservation.c": "8278590ced1936d618905b0cbd0b5aebddda238d426a6a2a52e455fc36bbb502",
"addons/core/Scripts/Game/ERR/10_AI/ERR_GroundDepotHQ.c": "8748325b0810ea053b28d0ed4c00a75fceae1c0d1cd3b30efb4dafdc397632ac",
"addons/core/Scripts/Game/ERR/10_AI/ERR_GroundDepotLoading.c": "36da884a833e7a29743308490a3ce5ae299f7a451d87205a227163892aca4ed0",
"addons/core/Scripts/Game/ERR/10_AI/ERR_GroundDepotTransfer.c": "1946db0615130b0039b42ec80db12d9cc89b1b3ca5a7eca7d9112eb69c3bdcea",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQ.c": "1f129b979abcb86ee10622e2866aa987807f070f2ab2d818af015e12a8bcfd8c",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQAdminProvider.c": "c480e3cb22129d46babae961f0e8ac3ac562c3c360b33b3c58a7dfe97f2f07bf",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQAmmoReporting.c": "95c024cbdd35c02d9b0c3d389d29bb042e5dda6ffd2f5f0d896078274b3adb35",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQAmmoSampler.c": "258ad63c9dbf221f2d8402e93feb7b4d51897417954abf477004b5302e819bc3",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQBodyObserver.c": "f59421c1e0c83f0f480d7dd4d048b4b0a41193ed8fe8f2f627d2b6a696420ea1",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQCoverage.c": "8d9668858c47b7e9fee2b12d3ebd4e7cb88146b817cf615c4b0dade26c81b2ec",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQDeliveredCasualties.c": "1f738127e55e843ee2705007cedb5c08741f52f63c75eca7c80242177af82273",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQDoctrine.c": "6335728e89ed40ce11b811f00b61bfea76e94dd3379e4357cbfc438b05522bb0",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQJournal.c": "53563ff54fc4e0656713d6eaec5e88ddf69fd4bfa8ef6a67cfa13380d24031e1",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQLocalAwareness.c": "124260280ac8eda0e920bfcfc86932c9b21df6b1f7a6aa8acfc43feea3da149f",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQLocalHandoff.c": "2dd700dae9d9b232d22ca63ff01af75a3f5cc213ac24b7c0a43ffa38bc0b9ffa",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQMemory.c": "ec2047a477fb4273e22ae6bb68e7365f321f55c583b5d2c48c4abf2ac38e3b7d",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQMineSampler.c": "2a0fdc4d27e947a1d77b02ae23f757c7fa074eb456f817b7df0766583d757f55",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQMountedAmmoSampler.c": "88ea0fc0e13d7e3c22c7ce8b652816d1d137e4e6e37a72f48f0bdf515b936ae7",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQNetwork.c": "85e4d2cb27426c07b8631ca411f4b8f5c821f9f331c8c2719cbfa71b3687f08e",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQObservation.c": "57ad3f0b68d150791e30a7e4bd7dfedfb1ddd78a1c76f228e67b33ea9cb7144e",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQPursuit.c": "ab6ca0e1a7f36c104e664db06a74c80a528cbfd1de599af42e2194ef0a4f4ca3",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQReport.c": "12ea8ba08753d1e6d38b237087c1209cd2f9574b53c3ff0f27c082bed029c9ea",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQRoadIntercept.c": "0897e82d7805ef56f05f2b9c23903280285ea6bfa51796a2df86bb564ece78f7",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQStatusSampler.c": "b937eaed913a5095afa8e678dc1c36b5c805541bf8cd5be927069533d6baed1c",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQTask.c": "1147904bae6d72e9de47ce17bdada3dab489de4ed6e781dbf15bdbb30599ff6e",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQWatch.c": "abe634cf6003ae920ec1ed18e305ed462920204960894520d3dd11f7e5ef1c33",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HelicopterAvailability.c": "60eaef2f6d4b2fd44861c5a4434ef97e732e40a5ff7401e2da451ed2dd9c2762",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HunterCombat.c": "df1c319d10efd07ed6f971cf0e41d8d7e377b04ea7f0fe143bf94df733fd1d9c",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HunterCrewRecovery.c": "e76af0fbf6f436a9c3c9d4c7b779bc08a78f6fe705c08bf6d9757bbeb65ee8eb",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HunterOpeningPlan.c": "0b6275221dab491f148426df05e132579f3acc20de5559226c3b38975618355c",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HunterService.c": "0769d4e7327439ce91b8f9ed0b47c4d92d382e97a1bbf62da8e6002ae4041bf0",
"addons/core/Scripts/Game/ERR/10_AI/ERR_InfantryAmmoAccess.c": "ab4262f78d54782c5ecbf5fff4ebe3da16d72329658d7e18c0c35387dc8b3c7d",
"addons/core/Scripts/Game/ERR/10_AI/ERR_InfantryAmmoTransfer.c": "401a29ec31712d113c203d6975e44aed7bb3166025454f4950a4c7cb6f5ad6eb",
"addons/core/Scripts/Game/ERR/10_AI/ERR_InfantryCombat.c": "5684fcbee128a35107312452297f7ae2bec28aaa1b63f619fa649f36df8ea476",
"addons/core/Scripts/Game/ERR/10_AI/ERR_InfantryMineTransfer.c": "b1648598070def582edb93e8160c3aabc62bd18777551ba34d9dca641c5f485b",
"addons/core/Scripts/Game/ERR/10_AI/ERR_InfantryResupply.c": "966068555a6724e620a2c377b98d8dc02f141466c5cdd44636f86cb1cfe9ac78",
"addons/core/Scripts/Game/ERR/10_AI/ERR_InfantrySupplyPool.c": "c8e454573cf064ff392291d6feebf1f23be64390b5b8e944c03dd065f9f46b42",
"addons/core/Scripts/Game/ERR/10_AI/ERR_MortarAimSolution.c": "59e8343d09f7a44871d8d3335d6ad1d02216abb5deed30d38b5ec9ba3f2c0649",
"addons/core/Scripts/Game/ERR/10_AI/ERR_MortarBattery.c": "157024afc8fd3c1ffeea6ae923ff091e5773b9ffcf5f5864f8040d001e689110",
"addons/core/Scripts/Game/ERR/10_AI/ERR_MortarCourierTransfer.c": "968e58ca700b4a11e5e04a5c159696f514a0b1bce531210172b913e495f7e2b7",
"addons/core/Scripts/Game/ERR/10_AI/ERR_MortarFiring.c": "f2597d44c10d10de2462aa5e5450a22b8a5ad0eb99bd0cc09a8cf1ca2dd4a350",
"addons/core/Scripts/Game/ERR/10_AI/ERR_MortarLogistics.c": "b3624e4a00a2bdef16f6c100bbd79910e3bb8c2ae8ec5fe2ad5aa70bffecd303",
"addons/core/Scripts/Game/ERR/10_AI/ERR_MortarPrediction.c": "05863b2b4f9f70cdb288f91c722cbea163c13f2a2927dc485482e5bd4fa7d57f",
"addons/core/Scripts/Game/ERR/10_AI/ERR_MortarReadiness.c": "4c3799b3f2681e977669de0cbfaeb307d9a682b04365bfc9f59079e762965758",
"addons/core/Scripts/Game/ERR/10_AI/ERR_MortarRefresh.c": "52ae8d9d6cad92f42d68c634091b80a474d2666b6c06d63a8c30a3fab71494c4",
"addons/core/Scripts/Game/ERR/10_AI/ERR_MortarReportLedger.c": "42a96040b63e56677353e55164ae23031c90f70b4d6673a9f412ad7b19e636ae",
"addons/core/Scripts/Game/ERR/10_AI/ERR_MortarSalvo.c": "c128850c7a78a4d8fee00ad38f48b265f1fbd1d9b24b092ddc5c205b0f0ad6da",
"addons/core/Scripts/Game/ERR/10_AI/ERR_MortarStation.c": "cbbd7c86f722b664c85ab7c070ae1131d2ce5c41d1dacb4381bff9c1720a1866",
"addons/core/Scripts/Game/ERR/10_AI/ERR_MortarSupplyTransfer.c": "34f7eaa01dc68e97aae8c1177b7f8fd6c15d5a41c6dc86de377f00b3613a8e77",
"addons/core/Scripts/Game/ERR/10_AI/ERR_MortarSystem.c": "bc290ee8bed299d869598cbf41ec281653e0cc7f3c64c7214613df8a0fc83829",
"addons/core/Scripts/Game/ERR/10_AI/ERR_MountedAmmoPickup.c": "7993e38efb81412d3c8efac28f28c9277e96f2a48ebe6694815834896c482588",
"addons/core/Scripts/Game/ERR/10_AI/ERR_MountedAmmoTransfer.c": "1a764a46bdc0b7e98032b5716a144a1f44343f769be6d2280b0987400227be1e",
"addons/core/Scripts/Game/ERR/10_AI/ERR_MountedMagazineSeed.c": "b42d0aac142907433df8bedc40de24c94813544016cf5f451846f1980250f995",
"addons/core/Scripts/Game/ERR/10_AI/ERR_MountedResupply.c": "c26ad43705765be1c20eca37fbe2978b8c647151f6620ed37141657a4b7dc312",
"addons/core/Scripts/Game/ERR/10_AI/ERR_NativeAirAssaultProbe.c": "c1d55b338b157b758e6ffb993d5f689029b28b13929797c91e5dcb15b5e561ea",
"addons/core/Scripts/Game/ERR/10_AI/ERR_NativeAirLogisticsProbe.c": "58fe863775d0ad575cb566c78cef696c9826691cf49ef9adde76376be7316db1",
"addons/core/Scripts/Game/ERR/10_AI/ERR_NativeAirReconProbe.c": "c1216e0512a0268e4dbb82429e228334401c0c3cac52ba4486ae6dc91e41576d",
"addons/core/Scripts/Game/ERR/10_AI/ERR_NativeAircraftControlProbe.c": "0cf3e72ccdc42e6ef20fb71d743f0e037a9e69b2e082c720fa705628cf790205",
"addons/core/Scripts/Game/ERR/10_AI/ERR_NativeAircraftFieldProbe.c": "b64907c7566a894ca2f3c49ede5d972d4087a938da1a0ca87bcbd7c2203b2c52",
"addons/core/Scripts/Game/ERR/10_AI/ERR_NativeAircraftRouteProbe.c": "8d0dca97e5106d1c84b64992c789e1af0689514beefc027e713ca6ab901fc470",
"addons/core/Scripts/Game/ERR/10_AI/ERR_NativeMortarCourierProbe.c": "740c8bebbd4128a9311b1167d1058549475d6b46f81c9b6c0d19650f4b50616f",
"addons/core/Scripts/Game/ERR/10_AI/ERR_NativeMortarFiringProbe.c": "ee570d21bede8baebefc799399712d9582b3e30ebda7299f6c941777f02ad2a2",
"addons/core/Scripts/Game/ERR/10_AI/ERR_NativeMortarSalvoProbe.c": "fb9ccc6b36247ab3ad828ffbb2556abf5c2838d93ea6cd1ad259c0a015142f5e",
"addons/core/Scripts/Game/ERR/10_AI/ERR_NativeMortarStationProbe.c": "a110f0abc753cb1d2f781e457e637dd5346ecd2e924eb5eb3a5c7dca3d1e2340",
"addons/core/Scripts/Game/ERR/10_AI/ERR_NativeMortarTransferProbe.c": "399c21940ef10777b46fdb3e905430ce43404ce1de2f4a6bb62f9c61c1a0689c",
"addons/core/Scripts/Game/ERR/10_AI/ERR_NativePatrolHQProbe.c": "a58f57530e333976dc96fc5a0f9cb6cf0cb069c55788824950c5fb2f965d8e26",
"addons/core/Scripts/Game/ERR/10_AI/ERR_NativeScoutProbe.c": "41b39b1abe5e51a5b8a428d533cccbfb0dda9d7a570228dc3489408c60543f17",
"addons/core/Scripts/Game/ERR/10_AI/ERR_NativeTownProbe.c": "ade130f49fc9d868281cee7fde383f084f70ed8d4b876dacebbaed8538e84999",
"addons/core/Scripts/Game/ERR/10_AI/ERR_ObjectiveDefence.c": "83ef91c2118521aedb4c1838b2e47909c80e0950086449b98ced168f1fd87080",
"addons/core/Scripts/Game/ERR/10_AI/ERR_ReconAirports.c": "7551347d776d6e0eec818d6468cacbca7ac53daee7317e0a1618ca3d39ebc762",
"addons/core/Scripts/Game/ERR/10_AI/ERR_ReconCrewLocks.c": "684bc5b9858c7ed90ed2ca6d52fc0e731a7e37a116db776090257b72a63621ab",
"addons/core/Scripts/Game/ERR/10_AI/ERR_ReconFlightComponent.c": "4966dad504b3f8f28a9ffc8ac17cc548b00066fe05213c49c662ea56de34c9d4",
"addons/core/Scripts/Game/ERR/10_AI/ERR_ScoutSystem.c": "63287a252e4e7d5aefce840279f26ce3e1f286cb79cadb32596c37897cec7119",
"addons/core/Scripts/Game/ERR/10_AI/ERR_SettlementSafety.c": "e5c0ebc95521a9a33a3f7d9cca6c551dda862a08b7af20b017877aba9584795b",
"addons/core/Scripts/Game/ERR/10_AI/ERR_SupplyConvoyColumn.c": "827550ab1b3fd749414f064d20849e23b4ff0ac2d39585cc8d4388df581ca6f4",
"addons/core/Scripts/Game/ERR/10_AI/ERR_SupplyConvoyService.c": "dca3fc09fc11cbc719eed38edaf9b141ba86f440b4c5c28579699fbb296d0b6c",
"addons/core/Scripts/Game/ERR/10_AI/ERR_SupplyConvoySystem.c": "f09aa817c27d6af0ccfb544f4ab1ae2afafb63d626641e03d87cfe159475d821",
"addons/core/Scripts/Game/ERR/10_AI/ERR_SupplyConvoyTactics.c": "78e6b60596189dfe1ee64c9471c62aae5c494ebd9942cb11520babab7c01873c",
"addons/core/Scripts/Game/ERR/10_AI/ERR_SupportScenario.c": "a7b46253e1bb37cea7c29bb557fbf43ca207022d0f1cc927349441b2d1615279",
"addons/core/Scripts/Game/ERR/10_AI/ERR_TownGarrisons.c": "57f862476751087972fc78d0b27ab44e72361e27d32f15d55f9fe7fd7d6bd0e0",
"addons/core/Scripts/Game/ERR/10_AI/ERR_VehicleAlarmPerception.c": "45ac71d25e10a057a26a5b0fc7128935baaf47f4c0f87208a4420fa52086fd98",
"addons/core/Scripts/Game/ERR/20_Intel/ERR_IntelAdminProvider.c": "d63ab5c547021aeb61d398b8a773afeedee4662d3ce15d9fd9d0e9e37262f8b7",
"addons/core/Scripts/Game/ERR/20_Intel/ERR_IntelDiscoveryFeedback.c": "62f2c408383f410782d9d41fa50acd6bd8cf66eeb80d2b79f91852b9d2cf8d97",
"addons/core/Scripts/Game/ERR/20_Intel/ERR_IntelEvidence.c": "6bbf8d3b83e2c09fd9a23a9a5e5e11d7c29af2e618116bee613562fc45af2b33",
"addons/core/Scripts/Game/ERR/20_Intel/ERR_IntelReroll.c": "d8b04de9ea789732cc78ebce9aa60786c86fe46d05f671cf251eefa68a214b59",
"addons/core/Scripts/Game/ERR/20_Intel/ERR_IntelService.c": "2911325c79a7a372628b18ffa0e110d11919ce2c2cd7b19277bfd608fdb03dfc",
"addons/core/Scripts/Game/ERR/20_Intel/ERR_MineIntel.c": "3ce16cebaa9703b2f9803df7c11614f94de6460a9136dab8f80dcad41ae2b1c2",
"addons/core/Scripts/Game/ERR/30_Map/ERRM_NativeMapOwnershipProbe.c": "32418602f085e3edba7343f42a6a691630b533be262002f29248e8ae87a38254",
"addons/core/Scripts/Game/ERR/30_Map/ERRM_SharedMapComponent.c": "3a10f6ea25bf88a400bc3e6c339823433845c5db4f2f423835ccf99a1b1a843f",
"addons/core/Scripts/Game/ERR/30_Map/ERR_ScenarioMap.c": "75fa1d742129ef7f33c005cd48f56db7f49ee7bde3c5428532b0b501b032b0a3",
"addons/core/Scripts/Game/ERR/40_Chat/ERR_AdminCommands.c": "282fe1463add7af8771aa58507b254e69d2d06f50274d4c77321db073f8394f0",
"addons/core/Scripts/Game/ERR/40_Chat/ERR_NativeAlarmHearingProbe.c": "5dbb6a48909b76cd141e3a79ef01d2e68cafee55153821c4471f85c761fff94f",
"addons/core/Scripts/Game/ERR/40_Chat/ERR_NativeConvoyCoverProbe.c": "d2450140cf9bdf09210473234605b4c0d818ea5b91f9532209166a35c5d13701",
"addons/core/Scripts/Game/ERR/40_Chat/ERR_NativeConvoyProbe.c": "45a40e5cc877c4bbcd23ed3219b24a9a329cfed09688ec39fbe9ccdbed1046a4",
"addons/core/Scripts/Game/ERR/40_Chat/ERR_NativeHQBodyProbe.c": "811244cc8297817efbfc3ee4edf01c868eae23c88127ba0c72e98ee7422da72f",
"addons/core/Scripts/Game/ERR/40_Chat/ERR_NativeHQMemoryProbe.c": "d8fec6c138bb0f5bdbf99ee82ffc3ac9b44d1045d8833da63f8aa5f39beeb7e5",
"addons/core/Scripts/Game/ERR/40_Chat/ERR_NativeHQResponseProof.c": "0f8b09fd8753234c91fd6baaca0e2f812e409ae1c4be8f340b648ae59b69c2f3",
"addons/core/Scripts/Game/ERR/40_Chat/ERR_NativeInfantryTransferProbe.c": "9b2de4dc22bdadd51b0271219a971dc8dc07f70ed3534f306acf03ed81b29424",
"addons/core/Scripts/Game/ERR/40_Chat/ERR_NativeLocalHandoffProbe.c": "0d4d61c424a16008595f86fa61f3b848caf9bd6e9ebbacea9c10254d88ba378e",
"addons/core/Scripts/Game/ERR/40_Chat/ERR_NativeMaintenanceProbe.c": "852b9b397efc3f919c97fec63bc3df1a850cd7833421af8441994afd191951d4",
"addons/core/Scripts/Game/ERR/40_Chat/ERR_NativeMortarProbe.c": "ddb892141500c192c0787b011d57dd8c07dd8c9a3ca5fdc407f6c271897bde0a",
"addons/core/Scripts/Game/ERR/40_Chat/ERR_NativeMountedAmmoProbe.c": "8d197f7a1398625e5a19db3284b0bf72c6ee6e032843a3e4d9a4e58de42b6825",
"addons/core/Scripts/Game/ERR/40_Chat/ERR_NativeMountedCourierProbe.c": "12710e9e5548fe8856f7a52f3566338369a8a1eedf0bd92af16229271872ada5",
"addons/core/Scripts/Game/ERR/40_Chat/ERR_NativeMountedSwapProbe.c": "a6721fcaaccadf8eddb06687c7d587d0a3e377d5d1bb0b8e72e630fede8690ac",
"addons/core/Scripts/Game/ERR/40_Chat/ERR_NativeRadioProbe.c": "84524163c63402755b4f834f74dfe6d8e5c397dc26031f532593c6f79f5a93b1",
"addons/core/Scripts/Game/ERR/40_Chat/ERR_NativeSmoke.c": "ff651e27c4a981df66f4fc5b55aadb262df75820aef707bb68c369e548c0c3be",
"addons/core/Scripts/Game/ERR/40_Chat/ERR_NativeSupplyConvoyProbe.c": "701311de6a2c9fe8f0534a22056323c34072df26595dc70a7d4df45bc06e6c13",
"addons/core/Scripts/Game/ERR/40_Chat/ERR_OrdinaryScenarioLaunchChat.c": "a747af09599ce4d0c52051f18f00c4624d24d137e328341b580b82e896c6bf65",
"addons/core/Scripts/GameLib/ERR/00_Core/ERR_DiagnosticNoSplash.c": "0ea1b402f8927b6d68bf6f7e5caa2967f7e3a39147634faab147796b791933b5",
"addons/core/Scripts/WorkbenchGame/ERR/00_Core/ERR_ValidateBaseWorldPlugin.c": "49a38c37b51e5318c7dcbcb01543dd9a6300d053f0d39808b3974f4edc45b871",
"addons/core/Scripts/WorkbenchGame/ERR/40_Chat/ERR_ValidateWorldPlugin.c": "f567518b54f43b88747df2838cdfd6ebb34605c0919a3e7d271d28dd8b67a9b6",
"addons/core/UI/layouts/ERR/AdminMenu.layout": "997e4f33660de5bb54c2939898cacc8857736a73db2c6919888ae0e762050e5c",
"addons/core/UI/layouts/ERR/AdminMenu.layout.meta": "9deeece996f43b1f1fed6b5ec89279645c7b6424250200a42580cc088142e9bf",
"addons/core/UI/layouts/ERR/AdminValue.layout": "cd811af6d2fb187f01c74e20ea07ad85669546b0ad70efae2ce52921ce26cbca",
"addons/core/UI/layouts/ERR/AdminValue.layout.meta": "56b3d2335db400c1308e07c4a35d278b23ef32013dfd6dc82951866327428d08",
"addons/core/UI/layouts/ERR/ContentRow.layout": "62d2c95814c99d906266fa96c6112e04a7fab1667e1a05e558d1d3974adc2d76",
"addons/core/UI/layouts/ERR/ContentRow.layout.meta": "8c4bc13b41e7aee38e0ca640a97813ed1a6964a00e2cff9e1fe4ebd71fc2fdc6",
"addons/core/UI/layouts/ERR/PauseModsButton.layout": "d21d436291e2c1b262e33dc228b0d60a1d188dc9e85cfda6d2373f8281431b79",
"addons/core/UI/layouts/ERR/PauseModsButton.layout.meta": "9ed6adabd8f53eb9a562d7186789876bba5c4202155ca894c1af866ca47354f3",
"addons/core/UI/layouts/ERR/PreparationStatus.layout": "bd269cf8dc6f27735423743dd5b78242550518414448a0256e5e12fa6b92c459",
"addons/core/UI/layouts/ERR/PreparationStatus.layout.meta": "75b12176a443bb911fc4ad446982d762201fda42ed38736b79bc5439fca31ccc",
"addons/core/UI/layouts/ERRMap/ObjectiveMapElement.layout": "b364752c44896d67dad07e466a04f4504a50813fb36ee7c34c9189ea9677b4e9",
"addons/core/UI/layouts/ERRMap/ObjectiveMapElement.layout.meta": "8691fe2eaf46568bca4a9f8128b247a8da810bb87a5546aa7ca3334e740270d6",
"addons/core/UI/layouts/ERRMap/SharedMapRenderTarget.layout": "6e83a9c70282aff43b23a08b732739e7a241a31e8abf200498c90a745d3d60dd",
"addons/core/UI/layouts/ERRMap/SharedMapRenderTarget.layout.meta": "5c846445cc089e2e08899ba703059d4adb805ff30ab5a16409a3cd59718cbd54",
"addons/core/Worlds/ERR_Everon.ent": "22324bc7eb0d80dec8a1f3bd61a9df9201b72f749f4e751766b0c9d0b7d46b87",
"addons/core/Worlds/ERR_Everon.ent.meta": "19d1903ca72baa326b4724a6791d0da1104a1e53f3f31dc1ca41a856efd68e83",
"addons/core/Worlds/ERR_Everon_Layers/default.layer": "6bcb7fbb27b6282719dae8a37486e518d4cbaea385f2ea9af1918b36bb28b175",
"addons/core/addon.gproj": "73e973a1f1c5910393e16f86a3a40d792031bb2fa3fc7f4dd87a06a16c3e34a4",
"addons/core/resourceDatabase.rdb": "2efdbb0dbb60fdc880dc106631a43816a1c579c86b5c30fa200f85ff89fbc7be",
"tests/helicopter_availability_regression.py": "3f256b7f5db246723b75caa2cc247249881cba95bde71ea1c90733404fe19f35",
"tests/hq_network_regression.py": "f7021b7bbdfdc2eefcdfade2bc4ad2108e1312cd07e8e09025783c626e7c8cae",
"tests/mortar_salvo_regression.py": "0f5d5f5d33f64ff43f5a2b954fe4eec032a00697f51f09efa10284537a3682db",
"tests/native/inventory_control/Prefabs/ERRIC_InventoryMode.et": "98408ab80347058f5b79b1103b849b19beaeb97a9ff81662b59fe6100ddd6bf8",
"tests/native/inventory_control/Prefabs/ERRIC_InventoryMode.et.meta": "6b4f66f296d15e7e5f82928cf1bdfa58f085421ae9b6f24afc5ac922d2a8781e",
"tests/native/inventory_control/README.md": "29f7086ee223b1cfe657932c7f236a1640876503f69f6f401451c72a5452695d",
"tests/native/inventory_control/Scripts/Game/ERRIC/ERRIC_InventoryControl.c": "8707f35ecf48813bc4e72c599fe2527c44807493496218d18e89aa8739eb59f9",
"tests/native/inventory_control/Scripts/WorkbenchGame/ERRIC/ERRIC_InventoryControlPlugin.c": "000d8fa3aa6412a5adb1561333f840f27185dc42fa61569c311b0607df0f2420",
"tests/native/inventory_control/Worlds/ERRIC_Inventory.ent": "22324bc7eb0d80dec8a1f3bd61a9df9201b72f749f4e751766b0c9d0b7d46b87",
"tests/native/inventory_control/Worlds/ERRIC_Inventory.ent.meta": "ca0420504016fa2aa7220712d13b7bf7748832d8d58b085afc4373f4abeb1339",
"tests/native/inventory_control/Worlds/ERRIC_Inventory_Layers/default.layer": "80a5f0b6c1bc8761469ea69978967dffc070ba9f98c5125430a78a506684c39e",
"tests/native/inventory_control/addon.gproj": "18dd7db85574119fac5057091c4d9991b247855f67f06bb86cf440f429b5911f",
"tests/policy_harness.py": "e861c30037b3e456f0c8ef1c02e9fe1417b601ffb15d2037974715008865e4be",
"tests/test_action_feedback.py": "1fec11a218b6da69c8c40ce232523582f0ad390f8357e74f24daccf5d46d3814",
"tests/test_actor_group.py": "0d808be40d13866bf8bd983d62ea3a8e7772e9c49a41109fffb02c5352153a4d",
"tests/test_admin_menu.py": "246ab269aabe8b743beefba8536d5b72a5c49db5ef6254fa7ee6684c6a82ad0a",
"tests/test_admin_player_tools.py": "7520c768b760ef3a03dd2f17376077fc17695360a89f91df88af924899a74517",
"tests/test_admin_providers.py": "4869c86d2cb8c17a383680d594131f4053a051eb4af369657523e20f68311de6",
"tests/test_admin_session.py": "6e1850c625e18460a5d64ccbadac992b663a46bd612fcc16b6006f19b3014896",
"tests/test_admin_setting_policy.py": "69af6f74e262ee4981ac428ac1ab85561f8b365aed5879e20d315ededca9ee22",
"tests/test_admin_tick_delivery.py": "8f61a6aaf07b0c41df2f415a1956d8f09fe61a7d4f256775ca62511030937a5d",
"tests/test_ai_stinger_admin.py": "d645813857f85854aeca60c9010689662d7cc43f298256d73ae37b05d74e94c1",
"tests/test_air_logistics_orders.py": "adf7181998f522f8825b71ef10955c9311aba9086e5bb601cfd47599baa46d8a",
"tests/test_air_recon.py": "3b6ccb7b5bd60fe638f051094b96e2643c997280330ebfde0856f43a2e3ed3a0",
"tests/test_air_support_policy.py": "bedd5437ba0667c371c390cb8c4fb5a3096e8ef6a71c8bac2091264b8d2eebf7",
"tests/test_aircraft_control_bridge.py": "bae6f1711dcc5f55f7a813af251fc210ed017c58a8067c03d91e936824542ef0",
"tests/test_aircraft_field_envelope.py": "67e60717a92580e3c4caa4974994cd92a96c98562be805b31319b3585f296639",
"tests/test_aircraft_field_flight.py": "ae5e18f0e2efe5ad01523cb1cf9bc64139094aeaac7477a900a9abd8e6ae8f18",
"tests/test_aircraft_field_probe.py": "fe4e5b58bbdca0f366fe4c614f7506f2a05fa29fabcde345e322cdb3d62db897",
"tests/test_aircraft_field_rules.py": "dbed3a499eeddf2513e3582667ea2bd90fff6ed26057891c7df6e196c3d00e84",
"tests/test_aircraft_field_runner.py": "822717f77702c335667b226f025aa6525415689b492f9ed42dd256d4c893429d",
"tests/test_aircraft_flight_envelope.py": "6499ec174ed68dbfc07bd49275eaff8a7e60865615bbaefee354de7233a6ff13",
"tests/test_aircraft_flight_policy.py": "147a27fb57c0b01cded35eae26af4394d7f41eeeb68856f564972e1c89c629c9",
"tests/test_aircraft_route_demand.py": "96d9a21c49605cb671525f977928a21c57f1d0b441460a2624892006e7057efb",
"tests/test_aircraft_route_envelope.py": "08b16d4e7f97db96e3f88af0cfccd9b6bc083f6f25ec33cffd7ec36b18798729",
"tests/test_aircraft_route_policy.py": "b717734a07a59ada837f05c36172110bd7d0b5a5a277e8fae55a11dcab3e2aa2",
"tests/test_aircraft_route_probe.py": "bd8cb998fef33db8f26342eec0198c54b7715662d333530e2bede572c81f162f",
"tests/test_aircraft_service.py": "9c19a09354ccfe8b41961204d80c3621d11e6704909b7266fa00e6c197bfd20b",
"tests/test_aircraft_service_cancel_runner.py": "1220e7c45c50590d12c9a5192eb4482e7e6942d7c00f36d9a79b5ca70bd1429d",
"tests/test_aircraft_translation.py": "983fcff4800e777cd1c42126431ca94e7c03bc06b5fb34a243704b8ca55dc36d",
"tests/test_archive_game_control.py": "8126e2be91f9ee8c09fceb82d03bb0d9c51247909189a424c3e24dd2b1ed22ce",
"tests/test_archive_packed.py": "37712810b7c6fd11a2df35665df81546f8b98682dc74b317ad1f9ad6ad274d86",
"tests/test_automatic_equipment.py": "117c02741647feb91a5b9ec7cce5e9909d0338a4fea476e7e7a8164ee93e119c",
"tests/test_body_recovery_lifecycle.py": "b4cc6df60863e12a16ac555ecb9818e318f6325cd989bc97d5bb6ed737857a73",
"tests/test_casualty_feedback.py": "2d8bada9a3fd7583af4fd4f07033dd9eac28ca3bdf34a4557c8985b7a1714dbc",
"tests/test_casualty_ground_policy.py": "6543c594293d7122242ec68d506a92dc81464d110cdb7496a225555cee338c83",
"tests/test_casualty_incapacitation.py": "55b5cfb7b3eae496a8cc18888872d11331ecc01afb7326fbee3b8d65047dbe93",
"tests/test_casualty_loading_policy.py": "cdf2c0abe4b794502f18228b173db47c4093ea062378ec9e3971e0c4f9e3bf1f",
"tests/test_casualty_remove_probe.py": "e3b8ac386bb8e4a9832215cbbe1cacf7a5bd1314467bd4b07ed4a57b2db75458",
"tests/test_casualty_reservation_death.py": "fd68dce04ea48ee2a22fac499c32a5c53847a25e3f14eaba3f50437d2c040f25",
"tests/test_chat_client_ownership.py": "c559dbda1af996455038da9eeb5ffcfc6332da9b93082da8ad3071f5d72b8bdf",
"tests/test_command_maintenance.py": "be2c942aa11a5f874448e94f06925f2f1de2210a14881fb7e486842119cb673c",
"tests/test_content_policy.py": "260eedd838802647af59f33a15510d2c721aa80a7540d54e47f22734041cb49e",
"tests/test_convoy_admission.py": "0ace42a7e1afee7413e45a3909e7ea5c29dbb8c0e692acc3dc9a35ea7ffd4adf",
"tests/test_convoy_auto_settings.py": "fe4a1e237e31bfac11f07b1986bff859f6b4712aa7759ce9e359e28e5ec2aec1",
"tests/test_convoy_budget.py": "481364c432715336825466a9ff199edeedaa2d3621daba90c0503addfa6010f7",
"tests/test_convoy_column.py": "a626be183761fb823cbb78e287cb410583500e37fd7d0ee96041d539a0af36e2",
"tests/test_convoy_combat.py": "b31239028d6fa0b43812c67eb3532ff1b3f4a87b43092dfed6b98de90f8b3a68",
"tests/test_convoy_dispatch.py": "47e77f544ec6f3f34346dc6b5082f9df0a2d869897e094ca993a92c7315468c0",
"tests/test_convoy_lifecycle.py": "1f1a7f938bbb618c21889199c48cb512fb3e21a5087708fe8361400762fb1472",
"tests/test_convoy_mine_stock.py": "e0073271428f00edf86251c9af5530f39094261b05474058df6b794bd958091f",
"tests/test_convoy_placement.py": "dcbf572747a85edbfac341e7e358b1987150a2eb721708a3a025639be228a7c3",
"tests/test_convoy_road_plan.py": "62bb655a84f90e934bb894f8e472a8a06905d72e1c0b05bd641e46eb8f4873b4",
"tests/test_convoy_startup.py": "2c9106023ecb6dcfb5c96c2edc98b51695c325c685b2ced37b999b6cd4504c65",
"tests/test_debug_ai.py": "7f4b847ba11e8da937eba7be3c4c0ab898b44567f6f553ff842da54c1e7a85c2",
"tests/test_dedicated_native.py": "f0323b20743221bd1ad46d6462246c2a0e2be84b395e40faa39007ef330aaa3c",
"tests/test_dedicated_preflight.py": "0d654375db6b8eb91d0b92663b50e32776aaa7ecafbfdb83c00f04826df5236e",
"tests/test_diagnostic_no_splash.py": "d99539a8b3277c2f1ac3e3bfa4c897876fe21e704c9ae33c542eed79fc2e9e65",
"tests/test_discovery_map_position.py": "0644aea60d4c546e819ef417771563ab7598e84d5e13db2fa63416ae1fe6ddb0",
"tests/test_enemy_awareness.py": "881289417a1e4af219546b113d018e9bc6a402a16cf4bfa7e983ab240f41c2aa",
"tests/test_enemy_equipment.py": "bbc753525bdfe05ea9ee7fcf45f3158307ed56428518b08845e097fbcdf299c0",
"tests/test_enemy_gunner_skill.py": "67172901ed950517977e535c1237e8eaab10d22d52452bbe05fe16bfbb4089fe",
"tests/test_enemy_loadout.py": "0cdfd28ce4d9c89223a7f439eaec1cad762cfc6c9e1cc4c3213d4600a3501b37",
"tests/test_enemy_medicine.py": "d13ab1d4ebe81614e00a9a579c6bcc6bd5b2c608187458f414e47f47686d7ad0",
"tests/test_enemy_optics.py": "06361eccef16d60a6f5072f9b126814a8f686c478049760047bb2ae8d19b5c52",
"tests/test_enemy_radio.py": "698c3ea5e1a3680d5b0438c50a341e53dd09f08d2f1f935e59667bc72ae83765",
"tests/test_engineer_mine.py": "3ffd360652ba66d4bb96247496e9b34175cc35c4e5d665f6524cb1cbd563bb73",
"tests/test_engineer_mine_hq.py": "822f50e363be3ba03bc5d12748cfc93d83e93552d66797b01afc6460e7ab7d5d",
"tests/test_engineer_mine_site.py": "9c01b326f4d171041669f6aff25a1750ab80cec113be4481eeabc471c45ccd80",
"tests/test_environment_policy.py": "66b86e66f47c4ce397c6093a50a724bbe8dedbf3db53e0dd7d53ff33243a0b52",
"tests/test_environment_restart_runner.py": "05bc09bc45db70ba4a635b65b0a96aa38437ba50c98640b47ed8d0683c3a5f71",
"tests/test_escape_result_wording.py": "7b3613cccd4f24d3ef4665dfc1854cfc958a69018a59f9b8090617f0185a82a8",
"tests/test_external_addons.py": "4e2c3fa2c92661c49ea0c492648b736bebd54f24cd244f3fe27710a0c7a487ab",
"tests/test_external_profile_review.py": "a35e9670a8f5eb47d28b4d6afe498e5a58b2ab2dbdc59912a206010ac8dc5240",
"tests/test_extraction_placement_policy.py": "d924f163d98c78989938ca01eca5935891fb454266810f4817cbe49651b84ae2",
"tests/test_faction_catalog_scope.py": "c8fab92575f2621f47ed8685243338aa9ea717bb809c2ef9e8e0884af9df263b",
"tests/test_faction_menu.py": "9e6381a4786487962358362b75a2287532a688ab27df756e84801e2bb6dc2e55",
"tests/test_faction_selection.py": "77e4789499b3560e729a115197c5b02d032c291ae1bd44b1cac5a2c2c476e450",
"tests/test_failure_result_refresh.py": "076444d2c740609ea4290de1525cd5d7fbd99beef3c48c134afb581422a3dcfe",
"tests/test_field_sites.py": "fddb0e44e72fdfe32bb94347a14da64efbd2208e4f252754e80c620fbecda56c",
"tests/test_finite_magazine_reservation.py": "dce435b1dd2d9b1e0ae1f54b5f911ca4207227c4c23586b4f4701c6a6995fc8b",
"tests/test_flight_action_runner.py": "aa14ebe85fce7c0435f48aceec1d4463b33fe8a5792b4e935b543dff94f4ad02",
"tests/test_force_ledger.py": "3dc268db304b9465d53056edfcd8cedcc15591b411c55ae8f9bd43e163ff9c49",
"tests/test_gameplay_review_fixes.py": "5f988d63ea4b2a8a364b181982ddd462baa628ab66e3a35d0fb5ea6f20c50b0b",
"tests/test_gameplay_session_regressions.py": "d9968b06627ce10412e5b1165987de662385d5dcb29090c5626b90fb59df52f2",
"tests/test_generated_sites.py": "111095f40133b025ab67380b6cdcbc25ce0ecbc03379d1a015db6fdb0e5f2b25",
"tests/test_ground_depot_lifecycle.py": "927a6f15560e177c838322e18ef555ce7db3acde0651d1a43353a2c6e805f3a8",
"tests/test_ground_depot_loading.py": "61b31dc3c2a6cf6bf0aef67fe3ec92b4b2d51ee93fe47e7cc8dc77f2235747af",
"tests/test_ground_depot_provenance.py": "33880dbf308dd4f338cc4e4bb04449d662cc2fe0941721a819528b7f7a6decd7",
"tests/test_ground_depot_transfer.py": "fc37626765919dd449432d445a17ec25a390ed687807571a1c5e2570c4ecddb7",
"tests/test_guard_cancellation_policy.py": "f8f134b6d525a3c775677b2a95c562b12aa84ba287318c08c833d684ad0bd9d8",
"tests/test_headless_display_probe.py": "d4d6c9907d7419ca888d5d9ba7448cbe6f5d2e53810f74c85660dfbdfc9f7e2d",
"tests/test_headless_display_runner.py": "f03a908e813c9ca4dc2ff13b3ade08549931e39490b8636742390a304c73974f",
"tests/test_headless_game_runner.py": "0d84160076ec9961e7315ccd50d6ce45ff971328c298649505fbba6305c22f31",
"tests/test_headless_input_exercise_runner.py": "0b812647718a3d7145905a3ed17fef97b025d57b1372773d2c1069a3473a9b1f",
"tests/test_headless_input_proof.py": "55c84de6dac3a9c44bd1ab4113d306544025a405c613f6e7d26550328e84f6c1",
"tests/test_hint_delivery.py": "1ec462cea5890379ad33ea3f16591896e085d1a30fd1af4a3411b14e5dc8acc3",
"tests/test_hq_ammo_dispatch.py": "6c7a4cbaa41ca3bee01082ffab376fc2db5b08757aac88c5e8caf99b39677d0a",
"tests/test_hq_ammo_reporting.py": "7cdf673d137a5c016630dd61d21d29f860469519c56303a12e19ee9630e1664f",
"tests/test_hq_ammo_sampler.py": "4f59b80291ec6f636a0ba5f748689f2664d3a1e44e74c2f709fb73c8019c7572",
"tests/test_hq_assignment_lifecycle.py": "4cfd15d1655b7cfadcbc08104bd01cdfc9960dc88a95ebc5a9958f6f71ce4aea",
"tests/test_hq_body_observer.py": "6cae50ef0a2b2fe35845f42e90998c517c061fc417cadfac375bacc89bbe603a",
"tests/test_hq_convoy_combat.py": "9f4cd9688effba59be85fea230ed59a2dab3adcf25b40677f9140ab727b33e0a",
"tests/test_hq_convoy_dispatch.py": "945a3cba06694608b4880408a13447ebbbf812d400fba3af5b7a57cb006a1f6d",
"tests/test_hq_coverage.py": "d790ae0e5b533f702284e6deeb2c84f7ede5c89bb2b6a68847400e915d50c146",
"tests/test_hq_delivered_casualties.py": "c22ad9e395b36b41e8292b034f170e14b5d13a6a02b2a81dc619dd37110ad905",
"tests/test_hq_delivered_task.py": "076aecdb0ff0d614cadbffedf9d9f8cbb1383fb94a468bd92050b31251bcbce2",
"tests/test_hq_doctrine.py": "5c18ee72454cf92132dedfb4bf581d174d67fc2e423158347ebe52ca74e8a416",
"tests/test_hq_local_awareness.py": "00c8023f85e88ffc1113353836962c31e8e541a32c9b2f1f66b91eaff5b923af",
"tests/test_hq_local_handoff.py": "0fdbcac1958b0d12296753e7c9d92700079ea6c5c8e33d0e21e8318f997b79e7",
"tests/test_hq_local_handoff_intake.py": "c51f0ca082456331eb5856bf6dad864c3852adc20beba9b6829bdef978b11d88",
"tests/test_hq_memory.py": "839c7adc63dfab023fafe1547e29caf0ccef52882c5d2fad7b342691b562a41d",
"tests/test_hq_mine_sampler.py": "67186d8f6609c3544a9c60f57af876b046618f9b586b2a56520d3a5c8a0e6e22",
"tests/test_hq_mounted_ammo_sampler.py": "b1c630909e5227d0f7bd0d69d7927403fcb0f33e7297d5fa52f96001720f8442",
"tests/test_hq_mounted_binding.py": "40b6af209178cab30b2d6b4420acabf2086532fe0d3f836caaba60e369bdb905",
"tests/test_hq_multiconvoy_supply.py": "c96a941e75673a2c95adee83b57a84d3d8e2af772e96b197f85d78a90d469a2e",
"tests/test_hq_planner_budget.py": "c9e6b85a3d25267c187f503f903136a16aee382e9d842f61ff88c550b5bb4e51",
"tests/test_hq_pursuit.py": "7ccbf51c7317097d9db6a66cc5be4bec67e542187f0fce5b4f3750bdc4311733",
"tests/test_hq_radio_node.py": "2297ae23b7a5fece845c13f16432dece6e2dde55ecc097a5be6311f470dd5242",
"tests/test_hq_report_selection.py": "4bd4c4800c217584ad9e1b4a37968350eb9a160e0151fc8b0375781736726cc0",
"tests/test_hq_road_intercept.py": "ba4ce9af49acdbf5c0c04b849761ea36abe2ec7d68ccde1f0cd731fb9e3ed451",
"tests/test_hq_status_sampler.py": "b8582fb71b7ac77a23158ccd6230e8124ef0432831204e4b8992dee3a9c10062",
"tests/test_hq_task_reservations.py": "aa6c5a38618d4bb469c84f18fb7d1748501b4608bd1929cf7e0a6600d248c0f8",
"tests/test_hq_uplink_fairness.py": "fc4808a2045522ac6038eef9c37c75ef133bd8af7ffa02c6c1d105b3bfd6c555",
"tests/test_hq_vehicle_seats.py": "8f35fcbd30e51b5576349245a102105926c7df738f3f77abb6ffcd780c6cb62e",
"tests/test_hq_watch.py": "5bf0debdeecb8f7fff6be94cc3772acfa948b839771d309291b1720b249b2890",
"tests/test_hunter_combat.py": "240472940515795b205d5caf530392ce416e3e0d2b97e473bb935930f29287d6",
"tests/test_hunter_lifecycle.py": "c2e3bff077dcb4cc181cbae5526d38a8638be7b2187c72ed64b1e279b63cbafc",
"tests/test_hunter_opening.py": "8d791372f465b6242a386d81b8e2136865390cbea5dfdcbfc6bb8b4f717c041d",
"tests/test_hunter_profiles.py": "bdc7898666a7e1078ece35b5dc9bf903d2218843abb24addcea9353fe6b3f7f3",
"tests/test_infantry_ammo_access.py": "bd80e4405c3f2029553b5e932ec49c6370b8366cd4e9ed03be89393f86c07dbf",
"tests/test_infantry_ammo_transfer.py": "e1172dda6350d2f8b89166ba63995cd1590435930ba220cd38b022307103a306",
"tests/test_infantry_combat.py": "03bc85811c52bd894ab8545794135227fc33b911a51f4e70d89fbeb2673de8ee",
"tests/test_infantry_mine_coordinator.py": "2fdb2138685a329cef11557973450bd5189d3d7d657dac5cc51b3df2530fab6b",
"tests/test_infantry_mine_transfer.py": "a94ae1bb6f646bc0cc307a99d0323d4139624ec6df887b6c8c4bbeb84eed8d25",
"tests/test_infantry_placement_settle.py": "1490a797e016b99a222280f57875cc83096980022d1784495a80b8a406d400f7",
"tests/test_infantry_resupply_coordinator.py": "65fa119778289175766ba7fdecd9e5685199736dffecc32056692121cbc6a682",
"tests/test_infantry_resupply_planning.py": "211e3d0ee20242f271afc46885e1ba7845ff2406d663bfe5118f40578cd5d709",
"tests/test_infantry_resupply_waypoints.py": "df3596515e0bb6a4cbf1e6f07d56755344415ad1deeffb8a70f71e8ed73a139e",
"tests/test_infantry_supply_pool.py": "6fc0053337bbb889021c6eba608796ef946ff4d30a1b01cf678927293218d9d2",
"tests/test_initial_admission_exhaustion.py": "14d6959a1185f154389be1405c49e2f7c1c9a3f27295e26074ac4ec74380057d",
"tests/test_initial_guard_policy.py": "0c80e744db1ce0a0d0746c43d867f5d2f47d9b92bc48d6561ceeb28a204d8743",
"tests/test_intel_admin.py": "f2704740a380de8e93c7ceace414744f938442cffc6bca77a3439b4ae36aade6",
"tests/test_intel_body_inspection.py": "04dd19efafc796f349976d29df77cb71b95615e527ad9add4fceda1f6105fc94",
"tests/test_intel_discovery_feedback.py": "49b2fedd8704ec67af60a6bb3dd156ddca28eb334d18b20692ab1e4659f439c5",
"tests/test_intel_registration.py": "41cd929a29ea5e6b37d856cfc873c33fa2a8130e3aad30146f522ce217875488",
"tests/test_intel_reroll.py": "d102cff7467323440273eb457b5dfed6610d27f32c52c6fb7801ce93348ef5ae",
"tests/test_inventory_control_runner.py": "f325fe1975f7a56fbbb1a6357206d2ac0c9e7c32c396473fdfaf1cb80ad39b11",
"tests/test_inventory_enumeration_policy.py": "95cbfd7c4351cb9a8e1cd6783524be79f77255e5996299919a61dcfce8b0f21a",
"tests/test_inventory_layout.py": "8e176f8a87c300b8062a37ee34b22a105978c7d9c6147b506757135f4f48a1ff",
"tests/test_item_station_teardown.py": "4e0f508dea6172862be82d6c7f295ede2bfb2412c390a0937a75ab176655f4b6",
"tests/test_journal_readability.py": "47764126522e7d7a90100cd9beff741bf49e4d8390111f977919d3e323a5c7df",
"tests/test_local_admission.py": "0bde82f6d5c31c4187ed0aa1935940b8b9e634868b3a4820eca073580ad136b4",
"tests/test_mine_intel.py": "db64129001c0010ad11389ff764356893ac7c4fbf45e7c82aa56bbe4c75f4929",
"tests/test_mine_intel_discovery_integration.py": "bac2c8ec269d6e51a46fc17893de4114a5613f37899a1e044a9132d97d44cc5a",
"tests/test_mission_rules.py": "f534ae447fe1db6ae939430c3b14568d2bf1b84956dca295cce04211411d9ee7",
"tests/test_mortar_activity_completion.py": "a0db3b63962bc95de42ec12ef17c53730464ac7421a4475020957121513586ec",
"tests/test_mortar_aim_renewal.py": "cf228b7f83d247d93277ec4c8644eb1090a20336a7e9ee2b90086c78199a70ca",
"tests/test_mortar_courier_storage.py": "0eb75fbcdcd712ff1c2220dcdd87cff6f3ed1e6e8f1c889916daa6b84a4359f5",
"tests/test_mortar_load_ack.py": "6eceee33969ec268d904f062bd1ac12ec4269cf87acd235469052b193b048774",
"tests/test_mortar_logistics.py": "98cdf38e43eb564163d8b409dfc95c4ae23e775c423651f05698acd52a7ef5a2",
"tests/test_mortar_refresh.py": "0ac74cff8aa10fb06ecb75d17eb7ca3a6b80bf5194522bffec583a44fc01a419",
"tests/test_mortar_report_ledger.py": "fd2346e06c37a9e7621e1861e0f472b72ac14786fd2bcfbd785b62700d55ffde",
"tests/test_mortar_station.py": "6570f18f787b7366ec5341da68dd99acf541cbbc31c6db7a9a3ae967506456ec",
"tests/test_mortar_transactions.py": "b169cee3ccde42a24b6a0aa0ac2c3ff879bd1478bed1979dbea7b82c8006ee43",
"tests/test_mounted_ammo_pickup.py": "f304f2426e152171ce61509ad467e87fc9f1933962032fef8ac3f78b3194f22e",
"tests/test_mounted_ammo_transfer.py": "88afc9fe65e42b42cd46e060e9bde9c1a6c59cd4cd4f20f8642ba9d05ae4c7e0",
"tests/test_mounted_initial_stock.py": "cf7d101d8bd31cbdaaa0e7d66f0d8b39aff9b3b70acf51641902c6d0de5be096",
"tests/test_mounted_resupply.py": "c17525ffeca6791b4542ea0c7641e4b220b03bce506fc2fda924aac09e8b24ce",
"tests/test_mounted_supply_integration.py": "2f365cd9918bf39457fab046b8e046392f7b35e2b2eff45a0d2ed7d6ffee956a",
"tests/test_native_aircraft_control.py": "3ffed5429896254d96b67ff3fdd01f65689f526e6a1766cc6874e2e63f2e26f3",
"tests/test_native_alarm_hearing.py": "7842886a177aa9fbb6b943b72703c4dafd18d162f26581ce30ce04289e7e9ab5",
"tests/test_native_convoy_cover_probe.py": "452ec47f1b3ee9c27e7a31d7c2c09b16dbe981723f4b7dd72afd3fad899a73ba",
"tests/test_native_convoy_mine_stock.py": "f069900030cb644ba9e04adb01a6d847a1afa6248a6c458f547aa4fcbd4b5a40",
"tests/test_native_convoy_probe.py": "9a0ed03c1274d0c5b7f459285f7f2c17c68800cd6db8dd55dcae706bfd9d700f",
"tests/test_native_end_lifecycle.py": "8b187723c9039e68e3e590c812c91dcffe1e5917d4e450ed798dc177888fda7a",
"tests/test_native_end_runner.py": "aed94be9b370a412937303cc5b66f0151c2cd64c3e1358f983f9ea53eb0d1057",
"tests/test_native_flight_footprint.py": "96923c018608f0c4d24294a9f8e769e2037be1fac8f1d51f4d73463706e134ad",
"tests/test_native_flight_input_diagnostics.py": "355e2e45b86b9a46c68efb0563d16bef7a032cd7758169704b4b26ea92bee2bc",
"tests/test_native_hq_body_probe.py": "f2b761fadf013d55d4e9c2ae11c5349fc054e767cf950aa632a43b8f4fe1d758",
"tests/test_native_infantry_cargo.py": "0d27423c6834503840813327d0d3ba0d675206ca759260ff79cb775adf83e314",
"tests/test_native_infantry_fixture_lifecycle.py": "c20ed9dd152489a8242ec0b97135b0691c9c104783bb843b0715cdd8d7c2e156",
"tests/test_native_infantry_setup.py": "8d935cd24ae49ca8a11f9a52fbd73146e567b8f36e0a7acc6565eb3e7d55f1fd",
"tests/test_native_local_admission_probe.py": "16864bc359ab607dae3919442bd18f191320721411a8156e23be999f24e4454f",
"tests/test_native_local_handoff_probe.py": "5a0904863ea00fd7ad262fcf91d8c1e55036b2041f16b043104f333c37d8c7ba",
"tests/test_native_maintenance_refuel.py": "15eb8c0ee75778fce2a1caace045940b63cd253f81d16a081f669643b9fefcae",
"tests/test_native_maintenance_stock.py": "7acbb488f7075428c08a10cf0e975ca0d508f3bb6416eddcc2991da93a5fad91",
"tests/test_native_memory_deadlines.py": "cd50cb03be9efdde260a4cec4e6ab652fad43625928a0c4248cacaf129552cae",
"tests/test_native_mine_stock_runner.py": "51b30d4d7d7543b1674285448d382dcbca55272a0403ea977d2cf08db6a5290c",
"tests/test_native_mortar_probe.py": "217801a6eddd48f76e99363a72a9812c0f48766ebd2faf8e188f4466ed1e4088",
"tests/test_native_mortar_refresh.py": "60f3c4fcb063506e9bd85e4abd3cd2fc802304bc71933f3e31d88f5b896aaa7b",
"tests/test_native_mortar_salvo.py": "f45625eb92d16adc8b3eb57bc72b77c8829d46c2c7e5bef40d302fc90252ba72",
"tests/test_native_mortar_transfer.py": "3b2a201a73c9ff2509276428988e4a98023c6aa94f8eeb42bc06c6cc604473d2",
"tests/test_native_mounted_ammo_probe.py": "dd7169d8127fef52a4815fb4ad8227307df557170da6a22723c765bcd74ba340",
"tests/test_native_mounted_courier_probe.py": "4dadd3157f7da193ce8996b5b08e802f891295ad82a4236366f3018c778c07e7",
"tests/test_native_mounted_swap_probe.py": "08674b3c0121756fe94762bd0acd5b6880ba5b234691557851eca5558718e2ea",
"tests/test_native_objective_map_probe.py": "ef0663aa7d620e06fda63fef578abb397a9dcd8fe5336af5445056e32e19aa28",
"tests/test_native_observer_selector.py": "bafdca52e25cc45d94f2fc306c078e5e59d48f2e2540248acc3822b42668e937",
"tests/test_native_package.py": "0776a1eedede7185aa36c7fe816ea6231e6f475c0f6d210a2c732b23dc6d765e",
"tests/test_native_package_external.py": "8eb3eaee401640521c67a51607104a28de89ea9c32b3b6dffd05d9d3026fca3d",
"tests/test_native_player_death_fixture.py": "0d0825ebb948a68ff8b8f5cbdcc7e27bdf940e5af1e277ba1780d03e12f2ba33",
"tests/test_native_shared_map_ownership.py": "672d248550339dc6350e548034c50b3440d44b91668457f3efb2d91c8445c3dc",
"tests/test_native_stats.py": "a9ce90c74f0ae7e5c40e451f6b1d60dadde831c3d858710a70929390d5c70f7c",
"tests/test_objective_map_element.py": "b02e59f977aa81462649282f99e70b0b6320b31ba0ea46f586e9ac0c5d15b884",
"tests/test_objective_map_presentation.py": "2418f4c0f370bd436b316e56d5ead97ff4b6aa7cdfb3777c9d2af22486148268",
"tests/test_observer_ownership.py": "879c6185d834c03f8d62e7e35359c8bb5f6821f6dde03c73957be2ba614947c6",
"tests/test_optional_transport.py": "16c72845dd07f4ade7de361136c04bd264ff75634152e83a19d19a2fdf59bd0e",
"tests/test_ordinary_gate_choices.py": "0e21f2933a4862eb5fd2f04b3b32dc7de6b2ca72d920aaa332d179edadb932cf",
"tests/test_ordinary_gate_evidence.py": "2bb3cff082b3fe45f668933a5039fd06a8d31562049cdd41c4f32181136ea5df",
"tests/test_ordinary_gate_observer.py": "78ff734604724a525809567ecda88f4d5fcd67816a6ba4960b72d0685f1a8b00",
"tests/test_ordinary_input_observer.py": "09cf661ae47f53cb429a7ab17c2b752ae30a04368a260468227b0678148b2434",
"tests/test_ordinary_input_runner.py": "1ed373818673a438647fc7074c4c689f5bac0a91e8d55edf29d466b96f6703f8",
"tests/test_ordinary_look_evidence.py": "1b98be4b69a5e5bacf46791f1e009fa3c73cdaff875c012837c9888443a61633",
"tests/test_ordinary_look_observer.py": "cd5842e54c9ccab16766637bf2ab4e4e0b98f4d597b5927b0c2ec3f720fa3668",
"tests/test_ordinary_screenshot.py": "eadd4f8ae2a8057d0ac7bca5e8f4abc260faa10cddfca31b8552d7b49669ab33",
"tests/test_packed_chat_game.py": "d23c099d17a0dda09e5ee28931a4850f9bf6df5a7874581342eacbd16860565e",
"tests/test_packed_core_game.py": "ddac4281f74999b1e60c2052bbdee36c97699192cfd5174a88b6f01ee740111e",
"tests/test_packed_external_game.py": "c5581fa3225bbc5b160fafc26c65783eb7d551489ab101b17f7a6acc1d8d9e63",
"tests/test_pak_inventory.py": "8f0b55bb295117c226900bd641d25175db1021a365866a5ce6482a78d08c7f41",
"tests/test_participant_selection.py": "e153f69ffa60d186dc3b1a238df1d48f2a0623b2dd8331d2cbbbdd57cce5529e",
"tests/test_performance_comparison.py": "5f932de9e9898acdd379f26c777a35c884269522dbf8c41991a7a25bf61c369a",
"tests/test_player_admission_policy.py": "745ec0a9e491ffcf5bec53ebf67ecee8333f4dcfa5d19bafbde31cbd1cad7f8b",
"tests/test_player_medical.py": "e4b3140a3afc0161db53f261e5480e51f1ca09f85657e25b0efb7dbba3336e3f",
"tests/test_powered_flight_pad.py": "690c1c6e05f3520a6d4d6c45a0fc5d9184e30a12b24356b3126bdb35c4171b82",
"tests/test_powered_flight_policy.py": "86bfd5851be6fe3a187e1fe7fd2b7b0965c891cf29b2260b0df292255c5c547a",
"tests/test_prefab_identity.py": "2a1c6e4cb1ead0c7b36b8fffb2ba0c59dc7e025dafaf8344a8158d38fe17582d",
"tests/test_preparation_status.py": "e43cb7ce81232a31d00219004574dc2d1806760e0b6f0c49693725ffcb1b4e9e",
"tests/test_prison_action_selection_evidence.py": "1fee0421669721618dc2f9a3039f945d470b83b186661d3b1f00291ff8b78e9f",
"tests/test_prison_action_selection_proof.py": "1f09fb84b73ea916bb39ef985c58aa6886223e60cd425f929b3a020eef74ebae",
"tests/test_prison_ai.py": "557015a4a3191aede258dcd7dee4ec4f555c3efde02331687185ed124cebb4fc",
"tests/test_prison_alignment_evidence.py": "214af04ff9b0e8ebf0bc97f528233f5d55fccc7623392a65c6dd286ed415e724",
"tests/test_prison_alignment_proof.py": "04c96825ea03b95c3966e3a53ce2c15990d63388386d84f2bff3e6b6838b18c0",
"tests/test_prison_approach_evidence.py": "660e03b6f9932947c1aafc4c043c2a2c5bca776433c2146df18e8bb90c606a9a",
"tests/test_prison_approach_proof.py": "ca71ba6c8cc20dad52d2966984676a111004333c24bc408f1ec84312e4208039",
"tests/test_prison_coarse_facing.py": "fe0ceebb74dba77005d6a7e31baa1a50156cc66f79a1d90eba4db9b27b099acb",
"tests/test_prison_escape_policy.py": "d5d54588116eb730a8fda046f25fc4edc89a5345f85774cbc0f0a9b3adb85b98",
"tests/test_prison_held_action_evidence.py": "bbb032736774bc5db5fab7758faeaf038eeaae9eb49ba706a52f1e9bfe09fd01",
"tests/test_prison_held_action_proof.py": "349ee99d36f18fb7c70382ce95f1e9d84d819575a45b6f5429394d1702f1f227",
"tests/test_prison_held_input_adapter.py": "56fa60ae69bf280e1c2e90e7882fa213914623980b6800a4312c6f1017b8f632",
"tests/test_prison_held_runner.py": "d50905e899c2d0d92ca2f4c51dccbf2166ee21b8c6d2d4b218da459b724c5a4c",
"tests/test_prison_placement_policy.py": "34539744426f0b30e41883203484ed60606df8ca319324014f07e833bcbf854b",
"tests/test_private_prefix_cleanup.py": "bc6d3fcf6a5ee5b5266bfc4516642d2f73e71dfc870c527d67cb5a47964dede0",
"tests/test_progression_identity.py": "2fb3725aa735e00b20ba7a4ac45f8e087d4346c58a176bee091bab0a9755c1df",
"tests/test_project_schema.py": "0e25ade3ee0083618c1b2837aaaef36ce33663d78f35d862e1dbec256f4d6e40",
"tests/test_radio_defence_policy.py": "48c9c01dc6135a3f6d2187b0974645758040f041c3c2c2c26b14222fc572dfe1",
"tests/test_radio_feedback_policy.py": "6b576472f81a35bd4df4dae3f19925b046eedbba262ad67f9bfe1ce9d220a487",
"tests/test_radio_waiting_text.py": "2aa54d8126b3fddae2b77d496f56d2d6e6d393c6d5124bdb5598713d9c29d629",
"tests/test_random_settings.py": "75fbcba53ff2331811fb91051bbae1b2c28108fa9477d98372e0eb057655f225",
"tests/test_recovery_policy.py": "adc4966ab92f0849d08636d93da5bd02b9162d1ad7369b325a1a357903abaa55",
"tests/test_relative_look_runner.py": "131d829c60a7bbfe3e047af8e38d255e5ecb9d84b7d2188d14422dde724fa05e",
"tests/test_release_check.py": "8b6e755ed922ad129ba01c228989610a31f3a79841dc7cdddd4ddbd0e510971b",
"tests/test_rough_intel_feedback.py": "d7395ecc498dda46e1c9a4c8fbf98a64f2bbd013de7806517fb8008756e7b40d",
"tests/test_runner_private_cleanup.py": "4380874af7553391ea7e1e234c8a3f8e61922e0f16b1bf9bd4821cc479e5edf4",
"tests/test_scouts.py": "25c6bb1bcc9cb171d12cb1e59b5b278e256a7a4b257b5ce3a1d76d60d459bb59",
"tests/test_server_log_regressions.py": "733084d7d2e33eb96740768c48d9e25bd7f3ffa9081949e38d0776c6822f5748",
"tests/test_settings_migration.py": "5a82ba8672b72fb388a95e297d53452e45679ed3b94f5c7d4598455179038aef",
"tests/test_shared_map_ownership.py": "486eb3a8a04a47878b87ec3952c613542871077af1de27ea7299fa3d72caff1d",
"tests/test_site_discovery_policy.py": "40fda37b86d469a1cf8fcb7a1fb18abcaab0df44ad09f50018744d42f8f4f649",
"tests/test_source_bundle.py": "074ad87ee7ab0b41ab94a7cb28efca66a975c24b8e2574122a13a52a4d491d0a",
"tests/test_spawn_preload_timeout.py": "db3a3aa42c20f047da90cac6755cb283d15cb3de6a22a57a6e1f352e9b4511dc",
"tests/test_spawn_retry_budget.py": "c182acfcfd52cd74a94dc3336d7603d14668850a684b758cc7545a98a5d14beb",
"tests/test_spawn_scene.py": "d89ef752906c1cf27c4cc7292997a4d793ddb3b56a6dfbdeff837978350167be",
"tests/test_spawn_scene_inventory.py": "f29bee9c629072f51caf66b680013b18f608bbfc5135a1f020e1a2904e89cdd5",
"tests/test_spawn_scene_lease.py": "adaf38b259cc36af526884d3d2312ccec0cbe6eca18d7aed2c1a066be8ea0da6",
"tests/test_spectator_guidance.py": "26c02deb1a707f51dcf577a9ccb789bf33f432b41d9404d36a7b1b3c8802298f",
"tests/test_spectator_recovery.py": "8bb59c51df003e24532ad9476af4c8ff3b7f4276dca25e8162b91eb77c7b67c2",
"tests/test_supply_budget_admission.py": "3d0e1372f89873470c336038c667df38d2e2e71b3dc2abfddd1215939c448fc5",
"tests/test_supply_convoys.py": "19309aff2b38f59eae2f5637960f133b78957962ad2dd95527a847692f127e74",
"tests/test_terrain_adapter.py": "bcc6f469a12399f833651c591b3e1ca9a8e7f49d8b98e223a271fddc245bc4c4",
"tests/test_terrain_airfields.py": "3a6e7151902657a38d8bf0510fb5c1a8049408d4f84d51ca260a0b5d651431e4",
"tests/test_terrain_sites.py": "c3534a7fb8fcbae887965c47300fbba3c00db5569fcddc3ad3d8c00e9aa2d2d0",
"tests/test_terrain_takeover.py": "5cb36e7faad13867620cae608e119988f84ab9970aa7b40fcd60fb7ec939a8dd",
"tests/test_time_policy.py": "45ae5768f6e87009b4074937cbc2e384c59341e905a3f250672bd2a110b2e6c5",
"tests/test_town_garrisons.py": "3674f713d7adc62ec9098f7923991c9f6b1d0edfc1431ccfd82fc8031ddae17f",
"tests/test_unconscious_controls.py": "74d4008a5c02ad0087b55030c177c8320b7099c11b97a14d93acf0ad14941356",
"tests/test_vanilla_game_control.py": "8ab3777a5bd0f8213efae08bd6db70a05790af992c2abfda8e5e5aa079beebbb",
"tests/test_vehicle_alarm.py": "1b58d6b35f080003ecab03b23c8da68e0ba2a6a82db4edce89e6031d83f26c82",
"tests/test_vehicle_alarm_perception.py": "6c8854088c28e2a7b4ee8d38a1f10f66eddfcf9d67afdd460b395d19877b7191",
"tests/test_vehicle_entry_diagnostics.py": "49e8b4cd8274e08de628e89f4471ddb47823af38d98b464336e8c98a4308dbda",
"tests/test_vehicle_maintenance_stock.py": "e09a6e98f314eef1cf487cbaf8b2185bda950c12329939214ed1ba95713a097a",
"tests/test_vehicle_security.py": "f08a1cffb0860ac7ad93e94f4cb8b7cc37b8c49b3dee72b1d310fc72d9f95422",
"tests/test_vehicle_security_native_probe.py": "977384c5ec07588bc77aa9aeae45b008c02d55d31169e46984a1947e987545c3",
"tests/test_view_distance.py": "ddc6cbeb41485f14a4f2ce23a7a86f1708e7e335bbeecee6309be49fd72e00e7",
"tools/archive_native.py": "445736e18e645f1d6fac0aaf837627e94179d295c21a6a67a8e84b5b468758f9",
"tools/archive_packed.py": "99cec180db72dc93c1ea8256bc316d42c23ab02843d5331a9d228b1a06a71d57",
"tools/check.py": "0e3f6f2ba5ffd3fdc35fcc3da24aaac9e5074213c39f643fa915c58b3c2fb813",
"tools/compare_performance.py": "568acfee2525b8924f3e7a39784e8641f76d63bb3703dcce8251ab9ac9bb1854",
"tools/dedicated_native.py": "35e0c1402be1d54f1b4345de8ac4fa7fc73f8cdfd09c7cc6f832a39dfb33e621",
"tools/dedicated_preflight.py": "ee56e05a15ada3bda80fecd74a024d141dcc3df00416821ac2c1a29ff308123f",
"tools/desktop/kwin-right-monitor.js": "ff2b6f7b9d1b1eb9f92b61b39df18f1ddc44be5540e18b1fc1829eb2fc1fb1a2",
"tools/external_addons.py": "c389b76c4d5f0f763420cd7d564d3ff5ebb7350cac10d2a26164c17f59b72dde",
"tools/headless_display_probe.py": "4ec3851835474eb4d8b84fc74c20d08567d92906ce832643d911f1d062abf0bd",
"tools/headless_game.py": "e7cab472ee51497343174cb460022b3e4591f148d4acbc6e6f881fc68c0fda1b",
"tools/headless_input_proof.py": "1952fb2ba577b80420133b9698b6d718d25211c86f853de8d22e0acb15f9f9c3",
"tools/headless_inventory_control.py": "194121b64ee39c31cc25935afea8ee9dddbce04cbf26aaf058e25d02ee9828fe",
"tools/headless_workbench.py": "02427c82e3d4f4ebbd46fe9a65e2076aa87c70a055ba7c535945abe10b29f514",
"tools/import_settings.py": "8b41ea8fb45e5c3840dad67f9d2494cba5dfa1e0e67d41e334fdd04e515a68a1",
"tools/native_command.py": "883c5955018e43c9451e3e6cb56e9cc8491c77920be3264478612a82c248cbbe",
"tools/native_package.py": "32195bf9b43024028e9931a99885d0a131b28ba1b77b32e9d6ed70b914625559",
"tools/native_provenance.py": "d4777f1f6ffed6993f7009ee2af41b100e8e0138d60ebfdcc5404ff2128f8e2a",
"tools/native_report.py": "bb75ef5fe551f45776d441f15a49ccad4daf19abca505187f9b2d30102538658",
"tools/ordinary_gate_choices.py": "59a0055d44f2f5b27c530406e5cbd46847357285d2d260d08e5c34cc53b7a795",
"tools/ordinary_gate_evidence.py": "5f02596c92b945b28081d861e466f01897875489e673bf0feafa6e4ebdae1708",
"tools/ordinary_look_evidence.py": "3b6a0415352295e15e988ff78659e81981001e1ee03430a5b4c2df1518dd9a31",
"tools/packed_external.py": "46203c078a82e825ec2e82c2495e6e165aa7ddc92368d2fe7786d87b957d3096",
"tools/pak_inventory.py": "95b0b64ab1f89a2142385ca596016fa131b49d933e31aef42d9bf18e2ec01383",
"tools/parse_native_stats.py": "32aa0935d63e59ace29fcdb1a02eaa850898b21ee4cce011a21d364e3dd69c75",
"tools/prefab_identity.py": "26088826275e84dcac2dbac771faf0552545791d30e9110df1ce88ee0d5a81ad",
"tools/prison_action_selection_evidence.py": "668b1d6ff86903ddeb702fd0c49d8d8110cd58559062d6d650f2962e4e321ab6",
"tools/prison_action_selection_proof.py": "00d397bf9b13405a2612678ec866f09d452acb4079f2072eb97c79a7fdf650da",
"tools/prison_alignment_evidence.py": "67d5675c13b2de75110c53b99d1bd88e0eb0c36673488312711b03fec32e4235",
"tools/prison_alignment_proof.py": "37bd011642ca96dd0279e90cce785fc689002011b3977055f15c0dfad4161bed",
"tools/prison_approach_evidence.py": "12f1618b16f845d987ba928c8d95f2d448bc6a600fb76f8870b2ae8fd4a660cb",
"tools/prison_approach_proof.py": "fcd2936fa5a67ba6a970c56e8e4d04cc76bff6ffc6087ac95085716fb5fa673f",
"tools/prison_held_action_evidence.py": "971a630d663291d50c407dbadf6005e17ea035db88b5358e5ec1f6b24e6824fb",
"tools/prison_held_action_proof.py": "450f03c6dbb4960d9f15a0f9c43ae5a18ab00594181e23321a2eea9b59ed47fd",
"tools/private_prefix_cleanup.py": "336889ddfbfe8032eef584d8e9e222d85e33a039441f8fe9c4904e1db8ee10e9",
"tools/project_schema.py": "cc1527c5f68fb75711208f293f4751c206fedc725934d9db7d4b7fe539f60cec",
"tools/reference_guard.py": "545b67111927d73bf2020f291528ea6f2f687a994b3e37bf567f239c32c8cd78",
"tools/release_check.py": "65df1bff33638a583905ba5f6c583a095b9f7e38186b6f29d70b72a61525589e",
"tools/source_bundle.py": "e8b06f9340a8d67da992373f4642385a028acebe9aa1b3752f62cab95c8fce98",
"tools/source_manifest.py": "c1a985348bad16f3b5b69ef7e545b6341eca298d8ae08111b8340b31535cc199",
"tools/terrain_adapter.py": "d5ca50a5dc3ab4ba8b7d8cf2c72a9c3579b6567efbad5572acab991267116417"
}
@@ -0,0 +1,8 @@
{
"exit_code": 0,
"registered_programs": 283,
"log_sha256": "71ec1c4a6beebacc412d1693ee9874ff4e75ec6a62f1a759e95a85fa1f85eadd",
"source_test_tool_bindings": "suite-inputs.json",
"source_count": 407,
"native_compilation_separate": true
}
@@ -0,0 +1,83 @@
{
"implemented": "Authored discovery and recovered mine-warning UI outside native player-annotation lists, supported standard/shared parents, exact surface ownership and pan/zoom/close/reopen cleanup. No UGC override.",
"authored_files": 407,
"regression_programs": 283,
"native_runs": {
"native-2026-10-02-objective-map-compile": {
"assertions": 0,
"completions": 0,
"script_failures": 2,
"engine_errors": 6,
"runner_result": "test-failed",
"native_qualified": false
},
"native-2026-10-02-objective-map-canvas": {
"assertions": 6,
"completions": 0,
"script_failures": 1,
"engine_errors": 37,
"runner_result": "test-failed",
"native_qualified": false
},
"native-2026-10-02-objective-map-close": {
"assertions": 32,
"completions": 0,
"script_failures": 1,
"engine_errors": 16,
"runner_result": "test-failed",
"native_qualified": false
},
"native-2026-10-02-objective-map-geometry": {
"assertions": 91,
"completions": 1,
"script_failures": 0,
"engine_errors": 16,
"runner_result": "smoke-completed",
"native_qualified": false
},
"native-2026-10-02-objective-map-ui": {
"assertions": 91,
"completions": 1,
"script_failures": 0,
"engine_errors": 16,
"runner_result": "smoke-completed",
"native_qualified": false
},
"native-2026-10-02-objective-map-warning": {
"assertions": 101,
"completions": 1,
"script_failures": 0,
"engine_errors": 16,
"runner_result": "smoke-completed",
"native_qualified": false
},
"native-2026-10-02-objective-map-final": {
"assertions": 101,
"completions": 1,
"script_failures": 0,
"engine_errors": 16,
"runner_result": "smoke-completed",
"native_qualified": false
},
"native-2026-10-02-objective-map-normal": {
"assertions": 63,
"completions": 1,
"script_failures": 0,
"engine_errors": 13,
"runner_result": "smoke-completed",
"native_qualified": false
}
},
"visual_review": {
"standard": "Read-only private-window captures show question glyph, changed radio glyph/text, reopened marker and long-warning ink without obvious widget-edge truncation. Workbench viewport501x225 limits readability; full-resolution accessibility/manual-input review remains.",
"shared": "Disabled render-target screenshots show world view, not the shared map. Only native widget identity/geometry/lifecycle is verified; no held-texture or500ms capture claim.",
"engine_screenshots": "System.MakeScreenshot captures world only and is not counted as UI evidence.",
"private_capture": "Seven raw captures, exact process/display/socket/profile bindings, no input or focus changes. Initial observer failed writing due scratch-copy quota; failure and recovery retained."
},
"preservation": "Original533 and existing owner-fixes candidate412 files unchanged. Of61 inherited paths59 byte-identical; two runner/registry overlaps preserve exact baselines with intended additions only. Index unchanged.",
"packaging": "Existing owner-fixes package unchanged and predates this increment.",
"remaining": "Human full escape, physical held map, manual map interaction, restricted-platform behavior, remote/JIP/reconnect/twelve-player multiplayer, physical logistics, comparative FPS and clean release.",
"committed": false,
"published": false,
"release_qualified": false
}
@@ -0,0 +1,268 @@
[
{
"stage": "standard-rough",
"sha256": "8d6f397c66aa85537c0e926f98cc25606a03ce6ed57f74de45a2912d742a7567",
"workbench": {
"pid": 1644979,
"start": 102281921,
"uid": 1000
},
"gamescope": {
"pid": 1644811,
"start": 102281789,
"uid": 1000
},
"display": ":2",
"window": {
"window": 33554439,
"pid": 1644979,
"server_pid": 1644979,
"xres_query": {
"status": 0,
"count": 1,
"mask": 2
},
"title": "World Editor - ERR_Core/Worlds/ERR_Everon.ent"
},
"sockets": [
{
"path": "/tmp/.X11-unix/X2",
"inode": 111618915
},
{
"path": "@/tmp/.X11-unix/X2",
"inode": 111618914
}
],
"profile": "/home/jakub/devel/escapistsrereintroduced/.build/objective-map-profile-0832-final",
"read_only": true
},
{
"stage": "standard-exact",
"sha256": "ec77991c1cefa4154061191cecf3ebcce65d55ab304221609ef3b8b65b80ed90",
"workbench": {
"pid": 1644979,
"start": 102281921,
"uid": 1000
},
"gamescope": {
"pid": 1644811,
"start": 102281789,
"uid": 1000
},
"display": ":2",
"window": {
"window": 33554439,
"pid": 1644979,
"server_pid": 1644979,
"xres_query": {
"status": 0,
"count": 1,
"mask": 2
},
"title": "World Editor - ERR_Core/Worlds/ERR_Everon.ent"
},
"sockets": [
{
"path": "/tmp/.X11-unix/X2",
"inode": 111618915
},
{
"path": "@/tmp/.X11-unix/X2",
"inode": 111618914
}
],
"profile": "/home/jakub/devel/escapistsrereintroduced/.build/objective-map-profile-0832-final",
"read_only": true
},
{
"stage": "standard-long-warning",
"sha256": "118b1e294f7d6fe7c4979b0305d92bd7bcdfba14ed29a833754ce80c72ad5334",
"workbench": {
"pid": 1644979,
"start": 102281921,
"uid": 1000
},
"gamescope": {
"pid": 1644811,
"start": 102281789,
"uid": 1000
},
"display": ":2",
"window": {
"window": 33554439,
"pid": 1644979,
"server_pid": 1644979,
"xres_query": {
"status": 0,
"count": 1,
"mask": 2
},
"title": "World Editor - ERR_Core/Worlds/ERR_Everon.ent"
},
"sockets": [
{
"path": "/tmp/.X11-unix/X2",
"inode": 111618915
},
{
"path": "@/tmp/.X11-unix/X2",
"inode": 111618914
}
],
"profile": "/home/jakub/devel/escapistsrereintroduced/.build/objective-map-profile-0832-final",
"read_only": true
},
{
"stage": "standard-reopened",
"sha256": "073afc8541ab8748a2d4f0d047252b69a5c946d829786205c40d56ce6284ce89",
"workbench": {
"pid": 1644979,
"start": 102281921,
"uid": 1000
},
"gamescope": {
"pid": 1644811,
"start": 102281789,
"uid": 1000
},
"display": ":2",
"window": {
"window": 33554439,
"pid": 1644979,
"server_pid": 1644979,
"xres_query": {
"status": 0,
"count": 1,
"mask": 2
},
"title": "World Editor - ERR_Core/Worlds/ERR_Everon.ent"
},
"sockets": [
{
"path": "/tmp/.X11-unix/X2",
"inode": 111618915
},
{
"path": "@/tmp/.X11-unix/X2",
"inode": 111618914
}
],
"profile": "/home/jakub/devel/escapistsrereintroduced/.build/objective-map-profile-0832-final",
"read_only": true
},
{
"stage": "shared-root",
"sha256": "8926842e7db54e3b20ca52efb89c99e0ef7808f6c3733bb2d6979daec5c02508",
"workbench": {
"pid": 1644979,
"start": 102281921,
"uid": 1000
},
"gamescope": {
"pid": 1644811,
"start": 102281789,
"uid": 1000
},
"display": ":2",
"window": {
"window": 33554439,
"pid": 1644979,
"server_pid": 1644979,
"xres_query": {
"status": 0,
"count": 1,
"mask": 2
},
"title": "World Editor - ERR_Core/Worlds/ERR_Everon.ent"
},
"sockets": [
{
"path": "/tmp/.X11-unix/X2",
"inode": 111618915
},
{
"path": "@/tmp/.X11-unix/X2",
"inode": 111618914
}
],
"profile": "/home/jakub/devel/escapistsrereintroduced/.build/objective-map-profile-0832-final",
"read_only": true
},
{
"stage": "shared-long-warning",
"sha256": "4728b27e9e5d64e951ce1310ce1d19ca8c7a2cc626dc96c4b991149d9fc5d70b",
"workbench": {
"pid": 1644979,
"start": 102281921,
"uid": 1000
},
"gamescope": {
"pid": 1644811,
"start": 102281789,
"uid": 1000
},
"display": ":2",
"window": {
"window": 33554439,
"pid": 1644979,
"server_pid": 1644979,
"xres_query": {
"status": 0,
"count": 1,
"mask": 2
},
"title": "World Editor - ERR_Core/Worlds/ERR_Everon.ent"
},
"sockets": [
{
"path": "/tmp/.X11-unix/X2",
"inode": 111618915
},
{
"path": "@/tmp/.X11-unix/X2",
"inode": 111618914
}
],
"profile": "/home/jakub/devel/escapistsrereintroduced/.build/objective-map-profile-0832-final",
"read_only": true
},
{
"stage": "shared-reused-root",
"sha256": "c6bb48afd2c51786a08a0f858688cbdd12df9859af8029efede20a1f1a9a9415",
"workbench": {
"pid": 1644979,
"start": 102281921,
"uid": 1000
},
"gamescope": {
"pid": 1644811,
"start": 102281789,
"uid": 1000
},
"display": ":2",
"window": {
"window": 33554439,
"pid": 1644979,
"server_pid": 1644979,
"xres_query": {
"status": 0,
"count": 1,
"mask": 2
},
"title": "World Editor - ERR_Core/Worlds/ERR_Everon.ent"
},
"sockets": [
{
"path": "/tmp/.X11-unix/X2",
"inode": 111618915
},
{
"path": "@/tmp/.X11-unix/X2",
"inode": 111618914
}
],
"profile": "/home/jakub/devel/escapistsrereintroduced/.build/objective-map-profile-0832-final",
"read_only": true
}
]
Binary file not shown.

After

Width:  |  Height:  |  Size: 198 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 197 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB