Capture current mission, AI, map and administration development
Include the current addon, terrain integrations, tools, regression tests and recorded development evidence.
@@ -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=↦Config cfg;Widget root,otherRoot,shared,reused;cfg.RootWidgetRef=&root;map.root=&root;map.config=&cfg;
|
||||
+ Probe p;p.m_Map=↦p.m_Config=&cfg;p.m_ExpectedRoot=&root;Marker marker;Presentation presentation;Menu menu;p.m_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=↦
|
||||
+ 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=↦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=↦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=↦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=↦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=↦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=↦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=ℑ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=ℑ
|
||||
+ 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.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
|
||||
}
|
||||
]
|
||||
|
After Width: | Height: | Size: 198 KiB |
|
After Width: | Height: | Size: 198 KiB |
|
After Width: | Height: | Size: 197 KiB |
|
After Width: | Height: | Size: 135 KiB |
|
After Width: | Height: | Size: 140 KiB |
|
After Width: | Height: | Size: 140 KiB |
|
After Width: | Height: | Size: 134 KiB |