Capture current mission, AI, map and administration development
Include the current addon, terrain integrations, tools, regression tests and recorded development evidence.
This commit is contained in:
@@ -0,0 +1,21 @@
|
||||
# Inventory injury display compatibility correction
|
||||
|
||||
The observed installed client reported seven `UpdateHitZoneState` argument errors after opening inventory. The retained excerpt contains only the inventory and error records. The SDK damage-state invoker supplies one argument, while the stock widget subscribes a callback whose second boolean default is not supplied by ScriptInvoker.
|
||||
|
||||
The successor now substitutes a one-argument callback in its mission only, forwarding explicitly to the existing native update with attachment refresh enabled. Native initialization and its batching flag stay unchanged. Owned subscriptions are removed on reinitialization, detach and destruction; callbacks from an old mode are inert. No health, damage or treatment behavior is changed. The independent review binds the exact source/test/patch hashes and confirms blood cannot also enter the character-hitzone registration branch.
|
||||
|
||||
## Validation and limits
|
||||
|
||||
The actual-method focused regression passes; its unadapted baseline compiles and fails at the missing-boolean boundary. The initializer and invoker are test doubles, not native UI proof. The source bundle preview passes. The new test is registered as the 308th program.
|
||||
|
||||
The full suite passed 134 programs before the 135th, offline external packaging, failed with `Disk quota exceeded` in shared `/tmp`. Inputs remained unchanged. An outside-sandbox retry also failed; moving temporary files to a disk-backed scratch directory allowed most cases to run but correctly violated the existing requirement that synthetic compat prefixes reside under `/tmp` (three errors and one assertion failure). No guards were relaxed and no other task's temporary files were deleted. A complete 308-program pass is **not** claimed. The actual new adapter regression separately passes using disk-backed disposable compiler files.
|
||||
|
||||
[Native compilation and BMP check](../native-2026-10-03-bmp-ui-callback/report.json) loaded the unchanged current addon and completed 48 assertions before two explicit BMP fixture failures. It compiled this compatibility class but did not open or exercise the inventory injury widgets. Runtime callback delivery, rendered medical UI and multiplayer remain unverified. A bounded next-check plan is retained, not implemented or executed.
|
||||
|
||||
## Separate native BMP finding
|
||||
|
||||
The original slot-4 BMP is now actually reached. Its snapshot is numerically valid but incomplete: 288 rounds, capacity 290, two chambered rounds; `Armament_Empty.et` fails `mount-item-slot-mismatch`. The log cannot distinguish a missing inventory item from a missing or different parent slot. Completeness and custody guards remain unchanged. Radio proof is not reached. The failed run retains all 15 error entries: two fixture failures and 13 previously known resource/engine entries. It confirms unchanged source/dependency inputs and hidden, muted cleanup.
|
||||
|
||||
## Preservation
|
||||
|
||||
All 533 tracked original reference files, the five sealed development candidates, the staged diff and the installed successor runtime are unchanged. Only the new adapter, regression and test registration change executable inputs. The observed installed PAK differed from the pre-fix source in two Workbench diagnostics; it now also lacks this new adapter. The current installed package has **not** been patched or republished. No manual escape, multiplayer, physical BMP support, performance or clean-release qualification is added by this checkpoint.
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,45 @@
|
||||
{
|
||||
"source_log": "/home/jakub/.local/share/Steam/steamapps/compatdata/1874880/pfx/drive_c/users/steamuser/Documents/My Games/ArmaReforger/logs/logs_2026-10-03_20-58-12/console.log",
|
||||
"captured_utc": "2026-10-03T20:24:07.305228+00:00",
|
||||
"observed_prefix_bytes": 572991,
|
||||
"observed_prefix_sha256": "4f2471d3b1c4dea6e2cc9493e3b3b8e38acd12c5a3835b13763eee13ced4e279",
|
||||
"records": [
|
||||
{
|
||||
"line": 3901,
|
||||
"text": "22:07:56.859 GUI : Creating menu 'Inventory20Menu'"
|
||||
},
|
||||
{
|
||||
"line": 3902,
|
||||
"text": "22:07:56.859 GUI : WidgetManager: CrateWidgets @\"{981ACF4F45EAECAE}UI/layouts/Menus/Inventory/InventoryMain.layout\""
|
||||
},
|
||||
{
|
||||
"line": 3907,
|
||||
"text": "22:08:02.028 SCRIPT (E): ScriptInvoker::Invoke: Incompatible parameter '1', expected 'bool', got 'void' (method 'UpdateHitZoneState')"
|
||||
},
|
||||
{
|
||||
"line": 3908,
|
||||
"text": "22:08:02.028 SCRIPT (E): ScriptInvoker::Invoke: Incompatible parameter '1', expected 'bool', got 'void' (method 'UpdateHitZoneState')"
|
||||
},
|
||||
{
|
||||
"line": 3909,
|
||||
"text": "22:08:02.028 SCRIPT (E): ScriptInvoker::Invoke: Incompatible parameter '1', expected 'bool', got 'void' (method 'UpdateHitZoneState')"
|
||||
},
|
||||
{
|
||||
"line": 3910,
|
||||
"text": "22:08:02.028 SCRIPT (E): ScriptInvoker::Invoke: Incompatible parameter '1', expected 'bool', got 'void' (method 'UpdateHitZoneState')"
|
||||
},
|
||||
{
|
||||
"line": 3911,
|
||||
"text": "22:08:02.028 SCRIPT (E): ScriptInvoker::Invoke: Incompatible parameter '1', expected 'bool', got 'void' (method 'UpdateHitZoneState')"
|
||||
},
|
||||
{
|
||||
"line": 3912,
|
||||
"text": "22:08:02.028 SCRIPT (E): ScriptInvoker::Invoke: Incompatible parameter '1', expected 'bool', got 'void' (method 'UpdateHitZoneState')"
|
||||
},
|
||||
{
|
||||
"line": 3913,
|
||||
"text": "22:08:02.028 SCRIPT (E): ScriptInvoker::Invoke: Incompatible parameter '1', expected 'bool', got 'void' (method 'UpdateHitZoneState')"
|
||||
}
|
||||
],
|
||||
"scope": "Read-only live client log excerpt; no input/process/session changes. Seven matching invoker errors after inventory open; no claim that the installed runtime equals current development source."
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"baseline.json": "0b6e21b54717263e233f42303ae4bde82585036e4755a54d4f249c7b7c075315",
|
||||
"client-error-excerpt.json": "b73e26c0188e8a5a80acae7c83ef8e4e2b5de8dbb8e99ecbdeb25c00d28ea582",
|
||||
"installed-source-observation.json": "c1b439f618722e321fc3a905d16a100bc4ba4f39b17a0c8734a453c8bbbf749b",
|
||||
"installed-preservation.json": "00d43b09720af162cb42ca2cfea569a878314e3ae31e808694568742862c798d",
|
||||
"sdk-contract.json": "bc77a7b4482f3e0ca0ce445d2afa7759bc9d2e90e75930e07ac54f0affa8a35f",
|
||||
"source-bundle-preview.json": "d99554c9d08195e3dccdff7882529499f5867080eed382a94c405c28a5139bf8",
|
||||
"suite.log": "2558306359168f634cbf9cca163bec82defa7f75f8718826685f81451e47d92d",
|
||||
"suite-result.json": "c654dfbb6ba6724b6eca94d6bd6de728f80e39b4ce0a922020d19df2479511a9",
|
||||
"suite-inputs.json": "dec9fa4e558b5b328696bc661be1f8eab5efbda70ab7d5eecf668619bd32e127",
|
||||
"quota-recheck.log": "41e264979f0f94aac3f3b3fa48f55e991600e75733e9376fc90aee0e74f400bc",
|
||||
"proposal-fix.patch": "fff4e6cdf72b13dcd82cfb819ae3edf9abdb709c7b9b1bfd7b6b43a8b93c53c2",
|
||||
"proposal-source-manifest.json": "ad0824a453f10d2856fa6afc3e86ec27ec455b55028ed33fc72297cd0986c124",
|
||||
"proposal-review.json": "9ed09dfef1f6dcf1dafdab1d543c8595720eb074b9fb68e1546949f8b3c6f1e0",
|
||||
"proposal-green.log": "2d1e9eee33bf9f7b837eabba67b5b4928882f00de9007188c08349653339ed4e",
|
||||
"proposal-red.log": "e9a0eedbc9d6a52ffc49a66a378194d949744b2c1a225b8b8d16b084475b83d5",
|
||||
"focused-live.log": "2d1e9eee33bf9f7b837eabba67b5b4928882f00de9007188c08349653339ed4e",
|
||||
"independent-review.json": "7b4daa2d7fbdf7765830cce542347b704be5aadf308cc324e1497fdd5aa2c0f3",
|
||||
"next-native-ui-check.json": "50f3a345abec210441d5939910d1857ea91dcc13c13ff105683d61905e7c0f18",
|
||||
"registered-check.py": "9306f03fc01f2d6f5a13762739c8cf4a0301d2da19f562ae297e6f67f4448c57",
|
||||
"preservation.json": "3ebf5e70ede199542c91489a77351157e619f53006113eb42e4eb417abdff62a",
|
||||
"README.md": "cae34364a36057740d067189a1397243d2e38961e03e5077095b2418b3a56653",
|
||||
"post-suite-doc-delta.json": "9223eb5fcb05c7629abcf6c5b84c11049cc8026a87e2a8924b98bddd267075bc",
|
||||
"source/tests/test_inventory_hitzone_compat.py": "bffa64c645a4282a1ed1ce244a9a2de37f20a70c60e8ff5b1544b7289c12c877",
|
||||
"source/addons/core/Scripts/Game/ERR/00_Core/ERR_InventoryHitZoneCompat.c": "23c34f901311dce63a79aafe83c11e2fc25bd3fddb0cde38bd313eb90878ca90"
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
PASS: actual one-argument adapter, explicit refresh, native initialization flag, duplicate/blood ownership, rebind/detach/destruction and foreign-mode transparency
|
||||
@@ -0,0 +1,32 @@
|
||||
{
|
||||
"complete": true,
|
||||
"approved": true,
|
||||
"concrete_blockers": [],
|
||||
"read_only_review": true,
|
||||
"manifest_sha256": "ad0824a453f10d2856fa6afc3e86ec27ec455b55028ed33fc72297cd0986c124",
|
||||
"patch_sha256": "fff4e6cdf72b13dcd82cfb819ae3edf9abdb709c7b9b1bfd7b6b43a8b93c53c2",
|
||||
"files": {
|
||||
"addons/core/Scripts/Game/ERR/00_Core/ERR_InventoryHitZoneCompat.c": "23c34f901311dce63a79aafe83c11e2fc25bd3fddb0cde38bd313eb90878ca90",
|
||||
"tests/test_inventory_hitzone_compat.py": "bffa64c645a4282a1ed1ce244a9a2de37f20a70c60e8ff5b1544b7289c12c877"
|
||||
},
|
||||
"logs": {
|
||||
"red.log": "e9a0eedbc9d6a52ffc49a66a378194d949744b2c1a225b8b8d16b084475b83d5",
|
||||
"green.log": "2d1e9eee33bf9f7b837eabba67b5b4928882f00de9007188c08349653339ed4e"
|
||||
},
|
||||
"sdk_sources": {
|
||||
"/tmp/erri-vanilla-stock/scripts/Game/HitZone/SCR_HitZone.c": "d622f0e7ee5727a2430aa10e78bf37c623a12b229bfcef098e0c385451adb612",
|
||||
"/tmp/erri-vanilla-stock/scripts/Game/HitZone/SCR_CharacterHitZone.c": "b2be31418129fa536c55bebef21ccc9b8ac409d1ce8b3ecb11df0787b33ba47e",
|
||||
"/tmp/erri-vanilla-stock/scripts/Game/UI/Inventory/SCR_InventoryHitZonePointUI.c": "0ffc7359e76a6de03669dc2e631682ec9b107048d829794ab61512dbdb209b02",
|
||||
"/tmp/erri-vanilla-stock/scripts/Game/UI/Inventory/SCR_InventoryMenuUI.c": "717649eaa9a0f39c093e2526c56a17b08d7e63d913d12f41a889497d0d514099"
|
||||
},
|
||||
"previous_review_source_matches": true,
|
||||
"callback_contract": "SDK SCR_HitZone invokes damage-state listeners with this only. Adapter accepts one SCR_HitZone and calls native UpdateHitZoneState(hz,true), preserving original direct initializer arguments and native superclass initialization.",
|
||||
"duplicate_blood_assessment": "No blood/group duplicate registration path: SCR_CharacterBloodHitZone extends SCR_RegeneratingHitZone directly (line429), whereas SCR_CharacterHitZone separately extends SCR_RegeneratingHitZone (line170). The native group registration loop casts to SCR_CharacterHitZone, excluding blood. Separate blood binding and same cast therefore match actual native registration sources. No concrete leftover native subscription demonstrated.",
|
||||
"lifecycle": "Replacement removes the original two-argument callback for each retained source; adapter bindings are deduplicated and removed before reinitialization, on detach, and on destruction. Captured mode identity and retained-source membership reject callbacks after clear or mission replacement. Nonmission initialization keeps native behavior.",
|
||||
"test_review": "Read exact full actual-method adapter harness and retained compiled baseline runtime-failure/proposal pass logs; no tests rerun. Covers explicit bool forwarding, original false initialization flag, source replacement, shared widget ownership, blood/group casting, reinit, detach/destructor and captured late callbacks.",
|
||||
"limits": [
|
||||
"The native initializer, ScriptInvoker registration/removal/dispatch and UI are doubled; no engine execution or rendered inventory proof.",
|
||||
"The test double deduplicates Insert and removes all matching callbacks. Arbitrary duplicate native registrations/removal semantics are not independently proven by this harness; actual blood inheritance resolves the specific suspected duplicate path.",
|
||||
"No claim to fix separate tourniquet, damage-effect or other native inventory listener cleanup."
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"unchanged": true,
|
||||
"files": {
|
||||
"addon.gproj": "73e973a1f1c5910393e16f86a3a40d792031bb2fa3fc7f4dd87a06a16c3e34a4",
|
||||
"data.pak": "43fdaada75a7e4cc5916040b07e8385f5532513fbaf349efba26d70dbd587b27",
|
||||
"resourceDatabase.rdb": "06cb9d25394b496281748b609bef1cab81eebb1025c5a8db61e4a90bc9518c74"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"runtime_files": {
|
||||
"addon.gproj": "73e973a1f1c5910393e16f86a3a40d792031bb2fa3fc7f4dd87a06a16c3e34a4",
|
||||
"data.pak": "43fdaada75a7e4cc5916040b07e8385f5532513fbaf349efba26d70dbd587b27",
|
||||
"resourceDatabase.rdb": "06cb9d25394b496281748b609bef1cab81eebb1025c5a8db61e4a90bc9518c74"
|
||||
},
|
||||
"installed_payloads": 376,
|
||||
"source_deltas": {
|
||||
"Scripts/Game/ERR/40_Chat/ERR_NativeMountedAmmoProbe.c": {
|
||||
"installed": "8d197f7a1398625e5a19db3284b0bf72c6ee6e032843a3e4d9a4e58de42b6825",
|
||||
"current": "7ddb634444c79ad9291d53a754dc0ed383342e36720ddaa4b7aa4bd4e7ee656d"
|
||||
},
|
||||
"Scripts/Game/ERR/40_Chat/ERR_NativeSmoke.c": {
|
||||
"installed": "e2a32dbe372edc2f5cd03a55dcb3dd11689ad8b60940a7a318b0c829d464d3e2",
|
||||
"current": "b7e1857b0678b3a2c71880c0f35b09da9e978f19bacf5b4e7449c893fdbe2b95"
|
||||
}
|
||||
},
|
||||
"identity_caveat": "Observed installed source is not the current tested candidate; this is diagnostic evidence, not multiplayer or exact-source acceptance."
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"verdict": "Feasible bounded native callback/UI integration without desktop input or health mutation; not implemented or launched.",
|
||||
"suggested_fixture": "One explicit WORKBENCH-only inventory-hitzone selector in the existing Core base-smoke lifecycle, after canonical local conscious admission, with a fixed 30-second deadline and ordinary terminal cleanup.",
|
||||
"steps": [
|
||||
"Pin current ERR_GameMode, local controller and original roster actor; require its conscious native character, damage manager and inventory manager. Refuse an already-open menu so no user/foreign menu is adopted.",
|
||||
"Call the actor's SCR_InventoryStorageManagerComponent.OpenInventory() once. Find and retain the exact SCR_InventoryMenuUI from Inventory20Menu, current actor and root identity. This uses native inventory access/life guards and ordinary opening behavior.",
|
||||
"After native inventory/storage preview readiness, call existing public menu.InspectItem(null) once. This requests ordinary character inspection and invokes native InitializeAllHitZonesUI/InitHitZones; wait for all seven points because native initialization spans frames. Do not copy or invoke individual initializer bodies manually.",
|
||||
"Expose bounded WORKBENCH-only read access to the native menu's m_aHitZonePoints and owning player; retain its exact seven original containers and the real blood hitzone. Require each adapter's captured mode and sources include that same blood hitzone. No replacement points or synthetic hitzones.",
|
||||
"Add narrow WORKBENCH counters on the exact containers: override protected UpdateHitZoneState(SCR_HitZone hz, bool updateAttachmentStorage=true), call super exactly once and count only the watched real blood hitzone and refresh value after returning. Arm observation only after initialization, so initial direct calls are excluded.",
|
||||
"Emit the real blood.GetOnDamageStateChanged(false).Invoke(blood) with exactly one argument. Require every pinned original container's native update counter increases exactly once and receives true; preserve a before/after blood health snapshot. This directly exercises installed ScriptInvoker argument dispatch and the successor wrapper into existing native UI behavior, without injury/treatment simulation.",
|
||||
"Request CloseMenu(exactOwnedMenu) once; await native menu disappearance/root detachment instead of assuming synchronous close. Retain original point references only for the bounded check. Invoke the same original blood event after close and require old update counters unchanged, demonstrating automatic detach cleanup rather than calling adapter cleanup directly.",
|
||||
"Optionally one reopen within the same fixed deadline proves seven fresh containers and one update each, while retained old containers stay unchanged. Close only the exact newly owned menu. Complete through existing smoke lifecycle; stop removes probe counters/references and closes only its own still-current menu. No retries or world manipulation."
|
||||
],
|
||||
"source_basis": [
|
||||
"SDK SCR_InventoryStorageManagerComponent.OpenInventory: access and ALIVE guards, native Inventory20Menu open, inventory-open invoker and weapon state handling.",
|
||||
"SDK SCR_InventoryMenuUI.InspectItem(null): existing public character inspection path, InitializeAllHitZonesUI spreads InitHitZones(true) across frames until CHARACTER_HITZONES_COUNT.",
|
||||
"SDK SCR_InventoryMenuUI.InitHitZones: actual stock layout and InitializeHitZoneUI with batch refresh flag; no stock implementation copy needed.",
|
||||
"SDK SCR_HitZone.OnDamageStateChanged: invokes m_OnDamageStateChanged.Invoke(this), exactly matching proposed synthetic notification argument count.",
|
||||
"Existing ERR_NativeItemStationTeardownProbe.EmitNativeCallbacks already directly invokes real hitzone invokers as a labelled native lifecycle test.",
|
||||
"Existing ERR_NativeObjectiveMapProbe retains exact owned menu and awaits asynchronous native closure; reuse that ownership pattern."
|
||||
],
|
||||
"limits": [
|
||||
"This proves native one-argument event delivery to actual native inventory widgets and cleanup. It does not prove natural injury creation, treatment efficacy, health policy, manual navigation, visual readability, remote multiplayer or FPS.",
|
||||
"The deliberate invoker notification is not a naturally occurring damage-state transition; document it explicitly.",
|
||||
"A hidden native window can instantiate UI but does not by itself prove rendered appearance. No screenshot claim without owned-window UI-inclusive capture.",
|
||||
"Existing vanilla menu tourniquet/DOT subscriptions and unrelated UI lifecycle errors remain visible; never suppress script errors to pass the probe.",
|
||||
"Native GUI/storage readiness is asynchronous. If native inspection cannot initialize within the fixed deadline, retain failure rather than constructing substitute widgets or changing UI implementation."
|
||||
],
|
||||
"production_changes_required": false,
|
||||
"live_writes_or_native_execution": false
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"docs/current-status.md": {
|
||||
"before": "570ead864b4f36e620493fe206880863e5a810a23c3d6c36f0f802709660ca2c",
|
||||
"after": "ef6ffdfb7c888772e9ea2502cf95c21276f2e101e7641d5184f0de36630d4f82"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
{
|
||||
"complete": true,
|
||||
"original": {
|
||||
"missing": [],
|
||||
"changed": [],
|
||||
"count": 533,
|
||||
"unexpected": [],
|
||||
"manifest_sha256": "661c5ddf080c4ba8d4463aa4907f739d4d96acaa8694ac8d6f3d85bb94231226"
|
||||
},
|
||||
"candidates": {
|
||||
"crash-start": {
|
||||
"missing": [],
|
||||
"changed": [],
|
||||
"count": 446,
|
||||
"unexpected": [],
|
||||
"manifest_sha256": "8a594a8e340694efaf9874834c05713a40a6d223bbc08491fb42ae84bcce625f"
|
||||
},
|
||||
"depot-mines": {
|
||||
"missing": [],
|
||||
"changed": [],
|
||||
"count": 432,
|
||||
"unexpected": [],
|
||||
"manifest_sha256": "c91acda173e2914fea59fd3e264a451158ee21d85918fe1ec5c8312dd46f7074"
|
||||
},
|
||||
"ground-supply": {
|
||||
"missing": [],
|
||||
"changed": [],
|
||||
"count": 432,
|
||||
"unexpected": [],
|
||||
"manifest_sha256": "0b58fde4127486894917db58ce92b684f984233b341317418e336b1740cac107"
|
||||
},
|
||||
"mine-safety": {
|
||||
"missing": [],
|
||||
"changed": [],
|
||||
"count": 431,
|
||||
"unexpected": [],
|
||||
"manifest_sha256": "202fa0854cf60a6c08ace1f22b276d826abcb538c79b6e052b48e5e51f458a87"
|
||||
},
|
||||
"mounted-pair": {
|
||||
"missing": [],
|
||||
"changed": [],
|
||||
"count": 429,
|
||||
"unexpected": [],
|
||||
"manifest_sha256": "9fee715f8c9c324c465387ba1f88744c9c3748cb49668ce65e9c9500a38b14d7"
|
||||
}
|
||||
},
|
||||
"staged_diff_sha256": "670073db5d7531aca4466cc9d2827d10a46bfcfbd35f27ac97724de9d2fd3725"
|
||||
}
|
||||
@@ -0,0 +1,137 @@
|
||||
--- /dev/null
|
||||
+++ b/addons/core/Scripts/Game/ERR/00_Core/ERR_InventoryHitZoneCompat.c
|
||||
@@ -0,0 +1,49 @@
|
||||
+// Vanilla damage-state invokers supply one argument. Preserve the native UI
|
||||
+// update while supplying its optional attachment-refresh argument explicitly.
|
||||
+modded class SCR_InventoryHitZonePointContainerUI
|
||||
+{
|
||||
+ protected ERR_GameMode m_ERRHitZoneMode;
|
||||
+ protected ref array<SCR_HitZone> m_ERRHitZoneSources = {};
|
||||
+
|
||||
+ override void InitializeHitZoneUI(BaseInventoryStorageComponent storage, SCR_InventoryMenuUI menuManager, int hitZoneId, IEntity player, bool updateAttachmentStorage = true)
|
||||
+ {
|
||||
+ ERR_ClearHitZoneCallbacks();
|
||||
+ super.InitializeHitZoneUI(storage, menuManager, hitZoneId, player, updateAttachmentStorage);
|
||||
+ m_ERRHitZoneMode = ERR_GameMode.Get();
|
||||
+ if (!m_ERRHitZoneMode) return;
|
||||
+ ERR_BindHitZoneCallback(m_pBloodHitZone);
|
||||
+ foreach (HitZone hz : m_aGroupHitZones)
|
||||
+ ERR_BindHitZoneCallback(SCR_CharacterHitZone.Cast(hz));
|
||||
+ }
|
||||
+ protected void ERR_BindHitZoneCallback(SCR_HitZone hz)
|
||||
+ {
|
||||
+ if (!hz || m_ERRHitZoneSources.Contains(hz)) return;
|
||||
+ ScriptInvoker changed = hz.GetOnDamageStateChanged(false);
|
||||
+ if (!changed) return;
|
||||
+ changed.Remove(UpdateHitZoneState);
|
||||
+ changed.Insert(ERR_HitZoneStateChanged);
|
||||
+ m_ERRHitZoneSources.Insert(hz);
|
||||
+ }
|
||||
+ protected void ERR_HitZoneStateChanged(SCR_HitZone hz)
|
||||
+ {
|
||||
+ if (!m_ERRHitZoneMode || m_ERRHitZoneMode != ERR_GameMode.Get() || !m_ERRHitZoneSources.Contains(hz)) return;
|
||||
+ UpdateHitZoneState(hz, true);
|
||||
+ }
|
||||
+ protected void ERR_ClearHitZoneCallbacks()
|
||||
+ {
|
||||
+ m_ERRHitZoneMode = null;
|
||||
+ foreach (SCR_HitZone hz : m_ERRHitZoneSources)
|
||||
+ {
|
||||
+ if (!hz) continue;
|
||||
+ ScriptInvoker changed = hz.GetOnDamageStateChanged(false);
|
||||
+ if (changed) changed.Remove(ERR_HitZoneStateChanged);
|
||||
+ }
|
||||
+ m_ERRHitZoneSources.Clear();
|
||||
+ }
|
||||
+ override void HandlerDeattached(Widget w)
|
||||
+ {
|
||||
+ ERR_ClearHitZoneCallbacks();
|
||||
+ super.HandlerDeattached(w);
|
||||
+ }
|
||||
+ void ~SCR_InventoryHitZonePointContainerUI() { ERR_ClearHitZoneCallbacks(); }
|
||||
+}
|
||||
--- /dev/null
|
||||
+++ b/tests/test_inventory_hitzone_compat.py
|
||||
@@ -0,0 +1,82 @@
|
||||
+"""Actual successor adapter methods; native UI/invoker boundaries are doubled.
|
||||
+
|
||||
+The invoker models the SDK's one supplied argument and rejects a two-argument
|
||||
+subscription. It does not claim rendered medical UI or Enforce execution.
|
||||
+"""
|
||||
+import os
|
||||
+from pathlib import Path
|
||||
+from policy_harness import ROOT, body, run
|
||||
+source=Path(os.environ.get('ERR_HITZONE_COMPAT_SOURCE',ROOT/'addons/core/Scripts/Game/ERR/00_Core/ERR_InventoryHitZoneCompat.c'))
|
||||
+signatures=['override void InitializeHitZoneUI(', 'protected void ERR_BindHitZoneCallback(', 'protected void ERR_HitZoneStateChanged(', 'protected void ERR_ClearHitZoneCallbacks(', 'override void HandlerDeattached(', 'void ~SCR_InventoryHitZonePointContainerUI(']
|
||||
+def cpp(s):
|
||||
+ for a,b in [('override ',''),('protected ',''),('super.','Native::'),('ERR_GameMode.Get()','Mode::Get()'),('SCR_CharacterHitZone.Cast(hz)','Character::Cast(hz)'),('BaseInventoryStorageComponent storage','int storage'),('SCR_InventoryMenuUI menuManager','int menuManager'),('IEntity player','Player* player'),('Widget w','int w'),('SCR_HitZone hz','Zone* hz'),('HitZone hz','Zone* hz'),('ScriptInvoker changed','Invoker* changed'),('hz.','hz->'),('changed.','changed->'),('foreach (','for ('),('null','nullptr'),('void ~SCR_InventoryHitZonePointContainerUI()','void Destroy()')]:s=s.replace(a,b)
|
||||
+ s=s.replace('changed->Remove(UpdateHitZoneState)','changed->Remove(this, 1)').replace('changed->Remove(ERR_HitZoneStateChanged)','changed->Remove(this, 2)')
|
||||
+ s=s.replace('changed->Insert(ERR_HitZoneStateChanged)','changed->Insert(this, 2, [this](Zone* z){ ERR_HitZoneStateChanged(z); })')
|
||||
+ return s
|
||||
+methods='\n'.join(cpp(body(source,sig)) for sig in signatures)
|
||||
+if os.environ.get('ERR_HITZONE_COMPAT_BASELINE')=='1':
|
||||
+ methods='void Destroy(){}' # Installed native initializer/subscription without the new adapter.
|
||||
+run(r'''
|
||||
+#include <cassert>
|
||||
+#include <algorithm>
|
||||
+#include <functional>
|
||||
+#include <vector>
|
||||
+struct Zone;
|
||||
+struct Invoker {
|
||||
+ struct Entry{void* owner;int kind;std::function<void(Zone*)> callback;};
|
||||
+ std::vector<Entry> entries;int errors=0;
|
||||
+ void Remove(void* o,int k){entries.erase(std::remove_if(entries.begin(),entries.end(),[&](Entry e){return e.owner==o&&e.kind==k;}),entries.end());}
|
||||
+ void Insert(void* o,int k,std::function<void(Zone*)> cb={}){Remove(o,k);entries.push_back({o,k,cb});}
|
||||
+ void Invoke(Zone*z){auto snapshot=entries;for(auto&e:snapshot){if(e.kind==1)errors++;else e.callback(z);}}
|
||||
+ int Count(void*o){return std::count_if(entries.begin(),entries.end(),[&](Entry e){return e.owner==o;});}
|
||||
+};
|
||||
+struct Zone{Invoker inv;bool character=true,hasInvoker=true;Invoker*GetOnDamageStateChanged(bool create=true){assert(!create);return hasInvoker?&inv:nullptr;}};
|
||||
+struct Character{static Zone*Cast(Zone*z){return z&&z->character?z:nullptr;}};
|
||||
+template<class T>struct Array:std::vector<T>{using std::vector<T>::vector;bool Contains(T t){return std::find(this->begin(),this->end(),t)!=this->end();}void Insert(T t){this->push_back(t);}void Clear(){this->clear();}};
|
||||
+struct Mode{static inline Mode*current=nullptr;static Mode*Get(){return current;}};
|
||||
+struct Player{Zone*blood;Array<Zone*>zones;};
|
||||
+struct Native {
|
||||
+ Zone*m_pBloodHitZone=nullptr;Array<Zone*>m_aGroupHitZones;
|
||||
+ int init=0,detach=0,updates=0;bool lastRefresh=false;Zone*last=nullptr;Player*lastPlayer=nullptr;
|
||||
+ void UpdateHitZoneState(Zone*z,bool refresh=true){updates++;lastRefresh=refresh;last=z;}
|
||||
+ void InitializeHitZoneUI(int storage,int menuManager,int hitZoneId,Player*player,bool refresh=true){
|
||||
+ assert(storage==11&&menuManager==22&&hitZoneId==3);init++;lastPlayer=player;
|
||||
+ m_pBloodHitZone=player->blood;m_aGroupHitZones=player->zones;
|
||||
+ if(m_pBloodHitZone){m_pBloodHitZone->inv.Insert(this,1);UpdateHitZoneState(m_pBloodHitZone,refresh);}
|
||||
+ for(auto*z:m_aGroupHitZones)if(Character::Cast(z)){z->inv.Insert(this,1);UpdateHitZoneState(z,refresh);}
|
||||
+ }
|
||||
+ void HandlerDeattached(int w){assert(w==7);detach++;}
|
||||
+};
|
||||
+struct Adapter:Native {
|
||||
+ Mode*m_ERRHitZoneMode=nullptr;Array<Zone*>m_ERRHitZoneSources;
|
||||
+METHODS
|
||||
+};
|
||||
+int main(){
|
||||
+ Mode mode,next;Mode::current=&mode;Zone blood,limb,ignored;blood.character=false;ignored.character=false;
|
||||
+ Player player{&blood,{&blood,&limb,&limb,&ignored,nullptr}};
|
||||
+ Adapter a;a.InitializeHitZoneUI(11,22,3,&player,false);
|
||||
+ assert(a.init==1&&a.lastPlayer==&player&&!a.lastRefresh); // Direct native initialization keeps false.
|
||||
+ int before=a.updates;blood.inv.Invoke(&blood);limb.inv.Invoke(&limb);
|
||||
+ assert(blood.inv.errors==0&&limb.inv.errors==0); // Baseline fails here after compiling.
|
||||
+ assert(a.updates==before+2&&a.lastRefresh&&a.last==&limb);
|
||||
+ assert(blood.inv.Count(&a)==1&&limb.inv.Count(&a)==1&&ignored.inv.Count(&a)==0);
|
||||
+ a.InitializeHitZoneUI(11,22,3,&player,true);before=a.updates;blood.inv.Invoke(&blood);assert(a.updates==before+1&&blood.inv.Count(&a)==1);
|
||||
+ // Each widget owns only its callbacks, even on the shared blood invoker.
|
||||
+ Adapter other;other.InitializeHitZoneUI(11,22,3,&player,false);a.HandlerDeattached(7);before=other.updates;
|
||||
+ blood.inv.Invoke(&blood);assert(a.detach==1&&blood.inv.Count(&a)==0&&other.updates==before+1);
|
||||
+ // Current mode loss/replacement makes retained callbacks inert; cleanup still works.
|
||||
+ before=other.updates;Mode::current=nullptr;blood.inv.Invoke(&blood);Mode::current=&next;limb.inv.Invoke(&limb);assert(other.updates==before);
|
||||
+ auto late=limb.inv.entries.back().callback;other.Destroy();assert(blood.inv.Count(&other)==0&&limb.inv.Count(&other)==0);
|
||||
+ Mode::current=&mode;late(&limb);assert(other.updates==before);
|
||||
+ // Reinitialize in a non-successor mode: remove old wrappers, preserve native setup.
|
||||
+ Mode::current=&mode;Adapter reuse;reuse.InitializeHitZoneUI(11,22,3,&player,false);
|
||||
+ Zone b2,l2;b2.character=false;Player p2{&b2,{&l2}};Mode::current=nullptr;
|
||||
+ reuse.InitializeHitZoneUI(11,22,3,&p2,false);assert(reuse.init==2&&!reuse.lastRefresh);
|
||||
+ assert(blood.inv.Count(&reuse)==0&&limb.inv.Count(&reuse)==0);
|
||||
+ b2.inv.Invoke(&b2);assert(b2.inv.errors==1); // Foreign native behavior untouched.
|
||||
+ // Empty/invalid group entries are not adopted; repeated cleanup is harmless.
|
||||
+ Mode::current=&mode;Adapter empty;Player missing{nullptr,{nullptr,&ignored}};empty.InitializeHitZoneUI(11,22,3,&missing,false);
|
||||
+ empty.Destroy();empty.Destroy();assert(ignored.inv.Count(&empty)==0);
|
||||
+}
|
||||
+'''.replace('METHODS',methods))
|
||||
+print('PASS: actual one-argument adapter, explicit refresh, native initialization flag, duplicate/blood ownership, rebind/detach/destruction and foreign-mode transparency')
|
||||
@@ -0,0 +1 @@
|
||||
PASS: actual one-argument adapter, explicit refresh, native initialization flag, duplicate/blood ownership, rebind/detach/destruction and foreign-mode transparency
|
||||
@@ -0,0 +1,19 @@
|
||||
check: /tmp/err-policy-sfqma4zs/check.cpp:42: int main(): Assertion `blood.inv.errors==0&&limb.inv.errors==0' failed.
|
||||
Traceback (most recent call last):
|
||||
File "/tmp/erri-inventory-hitzone-compat/tests/test_inventory_hitzone_compat.py", line 19, in <module>
|
||||
run(r'''
|
||||
~~~^^^^^
|
||||
#include <cassert>
|
||||
^^^^^^^^^^^^^^^^^^
|
||||
...<59 lines>...
|
||||
}
|
||||
^
|
||||
'''.replace('METHODS',methods))
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
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-sfqma4zs/check']' died with <Signals.SIGABRT: 6>.
|
||||
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"finding": "Installed SCR_HitZone invokes one argument; native InventoryHitZonePointContainerUI subscribes a two-argument UpdateHitZoneState method with optional bool, matching reported bool/void runtime errors.",
|
||||
"implementation": "Mission-only one-argument wrapper replaces only the known blood and character damage-state subscriptions after native initialization. Direct updates remain native and preserve updateAttachmentStorage.",
|
||||
"validation": {
|
||||
"proposal": "Focused actual successor methods green.",
|
||||
"baseline": "Compiled native-boundary double without adapter runtime fails missing bool error assertion. This is not executing copied vanilla UI implementation or the engine invoker.",
|
||||
"native": "Not run; rendered UI restoration remains unverified.",
|
||||
"test_registration_needed": "tests/test_inventory_hitzone_compat.py"
|
||||
},
|
||||
"sdk_inputs": {
|
||||
"/tmp/erri-vanilla-stock/scripts/Game/UI/Inventory/SCR_InventoryHitZonePointUI.c": "0ffc7359e76a6de03669dc2e631682ec9b107048d829794ab61512dbdb209b02",
|
||||
"/tmp/erri-vanilla-stock/scripts/Game/HitZone/SCR_HitZone.c": "d622f0e7ee5727a2430aa10e78bf37c623a12b229bfcef098e0c385451adb612"
|
||||
},
|
||||
"limits": [
|
||||
"Existing native tourniquet/DOT listener lifecycle not changed or qualified.",
|
||||
"Does not mutate hitzone health, damage or treatment.",
|
||||
"No active game inspection, identifiers or chat collected."
|
||||
],
|
||||
"live_writes": false
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"files": {
|
||||
"addons/core/Scripts/Game/ERR/00_Core/ERR_InventoryHitZoneCompat.c": {
|
||||
"baseline_sha256": null,
|
||||
"proposal_sha256": "23c34f901311dce63a79aafe83c11e2fc25bd3fddb0cde38bd313eb90878ca90"
|
||||
},
|
||||
"tests/test_inventory_hitzone_compat.py": {
|
||||
"baseline_sha256": null,
|
||||
"proposal_sha256": "bffa64c645a4282a1ed1ce244a9a2de37f20a70c60e8ff5b1544b7289c12c877"
|
||||
}
|
||||
},
|
||||
"patch_sha256": "fff4e6cdf72b13dcd82cfb819ae3edf9abdb709c7b9b1bfd7b6b43a8b93c53c2",
|
||||
"logs": {
|
||||
"red.log": "e9a0eedbc9d6a52ffc49a66a378194d949744b2c1a225b8b8d16b084475b83d5",
|
||||
"green.log": "2d1e9eee33bf9f7b837eabba67b5b4928882f00de9007188c08349653339ed4e"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
ETraceback (most recent call last):
|
||||
Traceback (most recent call last):
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"/tmp/erri-vanilla-stock/scripts/Game/UI/Inventory/SCR_InventoryHitZonePointUI.c": "0ffc7359e76a6de03669dc2e631682ec9b107048d829794ab61512dbdb209b02",
|
||||
"/tmp/erri-vanilla-stock/scripts/Game/HitZone/SCR_HitZone.c": "d622f0e7ee5727a2430aa10e78bf37c623a12b229bfcef098e0c385451adb612"
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"archive_bytes": 3151615,
|
||||
"archive_sha256": "0c953a091a93966c93ea22fa2105077e5a1de4fe4c84c02524f5a53aa983f345",
|
||||
"kind": "DEVELOPMENT SOURCE BUNDLE",
|
||||
"payload_files": 440,
|
||||
"preview": true,
|
||||
"projects": {
|
||||
"core": {
|
||||
"dependencies": [
|
||||
"58D0FB3206B6F859",
|
||||
"595F2BF2F44836FB",
|
||||
"5E524E4FEECCA92B",
|
||||
"629B2BA37EFFD577",
|
||||
"65930CB4CD0237B2"
|
||||
],
|
||||
"guid": "2528466DE220D91C",
|
||||
"id": "ERR_Core"
|
||||
}
|
||||
}
|
||||
}
|
||||
+49
@@ -0,0 +1,49 @@
|
||||
// Vanilla damage-state invokers supply one argument. Preserve the native UI
|
||||
// update while supplying its optional attachment-refresh argument explicitly.
|
||||
modded class SCR_InventoryHitZonePointContainerUI
|
||||
{
|
||||
protected ERR_GameMode m_ERRHitZoneMode;
|
||||
protected ref array<SCR_HitZone> m_ERRHitZoneSources = {};
|
||||
|
||||
override void InitializeHitZoneUI(BaseInventoryStorageComponent storage, SCR_InventoryMenuUI menuManager, int hitZoneId, IEntity player, bool updateAttachmentStorage = true)
|
||||
{
|
||||
ERR_ClearHitZoneCallbacks();
|
||||
super.InitializeHitZoneUI(storage, menuManager, hitZoneId, player, updateAttachmentStorage);
|
||||
m_ERRHitZoneMode = ERR_GameMode.Get();
|
||||
if (!m_ERRHitZoneMode) return;
|
||||
ERR_BindHitZoneCallback(m_pBloodHitZone);
|
||||
foreach (HitZone hz : m_aGroupHitZones)
|
||||
ERR_BindHitZoneCallback(SCR_CharacterHitZone.Cast(hz));
|
||||
}
|
||||
protected void ERR_BindHitZoneCallback(SCR_HitZone hz)
|
||||
{
|
||||
if (!hz || m_ERRHitZoneSources.Contains(hz)) return;
|
||||
ScriptInvoker changed = hz.GetOnDamageStateChanged(false);
|
||||
if (!changed) return;
|
||||
changed.Remove(UpdateHitZoneState);
|
||||
changed.Insert(ERR_HitZoneStateChanged);
|
||||
m_ERRHitZoneSources.Insert(hz);
|
||||
}
|
||||
protected void ERR_HitZoneStateChanged(SCR_HitZone hz)
|
||||
{
|
||||
if (!m_ERRHitZoneMode || m_ERRHitZoneMode != ERR_GameMode.Get() || !m_ERRHitZoneSources.Contains(hz)) return;
|
||||
UpdateHitZoneState(hz, true);
|
||||
}
|
||||
protected void ERR_ClearHitZoneCallbacks()
|
||||
{
|
||||
m_ERRHitZoneMode = null;
|
||||
foreach (SCR_HitZone hz : m_ERRHitZoneSources)
|
||||
{
|
||||
if (!hz) continue;
|
||||
ScriptInvoker changed = hz.GetOnDamageStateChanged(false);
|
||||
if (changed) changed.Remove(ERR_HitZoneStateChanged);
|
||||
}
|
||||
m_ERRHitZoneSources.Clear();
|
||||
}
|
||||
override void HandlerDeattached(Widget w)
|
||||
{
|
||||
ERR_ClearHitZoneCallbacks();
|
||||
super.HandlerDeattached(w);
|
||||
}
|
||||
void ~SCR_InventoryHitZonePointContainerUI() { ERR_ClearHitZoneCallbacks(); }
|
||||
}
|
||||
+82
@@ -0,0 +1,82 @@
|
||||
"""Actual successor adapter methods; native UI/invoker boundaries are doubled.
|
||||
|
||||
The invoker models the SDK's one supplied argument and rejects a two-argument
|
||||
subscription. It does not claim rendered medical UI or Enforce execution.
|
||||
"""
|
||||
import os
|
||||
from pathlib import Path
|
||||
from policy_harness import ROOT, body, run
|
||||
source=Path(os.environ.get('ERR_HITZONE_COMPAT_SOURCE',ROOT/'addons/core/Scripts/Game/ERR/00_Core/ERR_InventoryHitZoneCompat.c'))
|
||||
signatures=['override void InitializeHitZoneUI(', 'protected void ERR_BindHitZoneCallback(', 'protected void ERR_HitZoneStateChanged(', 'protected void ERR_ClearHitZoneCallbacks(', 'override void HandlerDeattached(', 'void ~SCR_InventoryHitZonePointContainerUI(']
|
||||
def cpp(s):
|
||||
for a,b in [('override ',''),('protected ',''),('super.','Native::'),('ERR_GameMode.Get()','Mode::Get()'),('SCR_CharacterHitZone.Cast(hz)','Character::Cast(hz)'),('BaseInventoryStorageComponent storage','int storage'),('SCR_InventoryMenuUI menuManager','int menuManager'),('IEntity player','Player* player'),('Widget w','int w'),('SCR_HitZone hz','Zone* hz'),('HitZone hz','Zone* hz'),('ScriptInvoker changed','Invoker* changed'),('hz.','hz->'),('changed.','changed->'),('foreach (','for ('),('null','nullptr'),('void ~SCR_InventoryHitZonePointContainerUI()','void Destroy()')]:s=s.replace(a,b)
|
||||
s=s.replace('changed->Remove(UpdateHitZoneState)','changed->Remove(this, 1)').replace('changed->Remove(ERR_HitZoneStateChanged)','changed->Remove(this, 2)')
|
||||
s=s.replace('changed->Insert(ERR_HitZoneStateChanged)','changed->Insert(this, 2, [this](Zone* z){ ERR_HitZoneStateChanged(z); })')
|
||||
return s
|
||||
methods='\n'.join(cpp(body(source,sig)) for sig in signatures)
|
||||
if os.environ.get('ERR_HITZONE_COMPAT_BASELINE')=='1':
|
||||
methods='void Destroy(){}' # Installed native initializer/subscription without the new adapter.
|
||||
run(r'''
|
||||
#include <cassert>
|
||||
#include <algorithm>
|
||||
#include <functional>
|
||||
#include <vector>
|
||||
struct Zone;
|
||||
struct Invoker {
|
||||
struct Entry{void* owner;int kind;std::function<void(Zone*)> callback;};
|
||||
std::vector<Entry> entries;int errors=0;
|
||||
void Remove(void* o,int k){entries.erase(std::remove_if(entries.begin(),entries.end(),[&](Entry e){return e.owner==o&&e.kind==k;}),entries.end());}
|
||||
void Insert(void* o,int k,std::function<void(Zone*)> cb={}){Remove(o,k);entries.push_back({o,k,cb});}
|
||||
void Invoke(Zone*z){auto snapshot=entries;for(auto&e:snapshot){if(e.kind==1)errors++;else e.callback(z);}}
|
||||
int Count(void*o){return std::count_if(entries.begin(),entries.end(),[&](Entry e){return e.owner==o;});}
|
||||
};
|
||||
struct Zone{Invoker inv;bool character=true,hasInvoker=true;Invoker*GetOnDamageStateChanged(bool create=true){assert(!create);return hasInvoker?&inv:nullptr;}};
|
||||
struct Character{static Zone*Cast(Zone*z){return z&&z->character?z:nullptr;}};
|
||||
template<class T>struct Array:std::vector<T>{using std::vector<T>::vector;bool Contains(T t){return std::find(this->begin(),this->end(),t)!=this->end();}void Insert(T t){this->push_back(t);}void Clear(){this->clear();}};
|
||||
struct Mode{static inline Mode*current=nullptr;static Mode*Get(){return current;}};
|
||||
struct Player{Zone*blood;Array<Zone*>zones;};
|
||||
struct Native {
|
||||
Zone*m_pBloodHitZone=nullptr;Array<Zone*>m_aGroupHitZones;
|
||||
int init=0,detach=0,updates=0;bool lastRefresh=false;Zone*last=nullptr;Player*lastPlayer=nullptr;
|
||||
void UpdateHitZoneState(Zone*z,bool refresh=true){updates++;lastRefresh=refresh;last=z;}
|
||||
void InitializeHitZoneUI(int storage,int menuManager,int hitZoneId,Player*player,bool refresh=true){
|
||||
assert(storage==11&&menuManager==22&&hitZoneId==3);init++;lastPlayer=player;
|
||||
m_pBloodHitZone=player->blood;m_aGroupHitZones=player->zones;
|
||||
if(m_pBloodHitZone){m_pBloodHitZone->inv.Insert(this,1);UpdateHitZoneState(m_pBloodHitZone,refresh);}
|
||||
for(auto*z:m_aGroupHitZones)if(Character::Cast(z)){z->inv.Insert(this,1);UpdateHitZoneState(z,refresh);}
|
||||
}
|
||||
void HandlerDeattached(int w){assert(w==7);detach++;}
|
||||
};
|
||||
struct Adapter:Native {
|
||||
Mode*m_ERRHitZoneMode=nullptr;Array<Zone*>m_ERRHitZoneSources;
|
||||
METHODS
|
||||
};
|
||||
int main(){
|
||||
Mode mode,next;Mode::current=&mode;Zone blood,limb,ignored;blood.character=false;ignored.character=false;
|
||||
Player player{&blood,{&blood,&limb,&limb,&ignored,nullptr}};
|
||||
Adapter a;a.InitializeHitZoneUI(11,22,3,&player,false);
|
||||
assert(a.init==1&&a.lastPlayer==&player&&!a.lastRefresh); // Direct native initialization keeps false.
|
||||
int before=a.updates;blood.inv.Invoke(&blood);limb.inv.Invoke(&limb);
|
||||
assert(blood.inv.errors==0&&limb.inv.errors==0); // Baseline fails here after compiling.
|
||||
assert(a.updates==before+2&&a.lastRefresh&&a.last==&limb);
|
||||
assert(blood.inv.Count(&a)==1&&limb.inv.Count(&a)==1&&ignored.inv.Count(&a)==0);
|
||||
a.InitializeHitZoneUI(11,22,3,&player,true);before=a.updates;blood.inv.Invoke(&blood);assert(a.updates==before+1&&blood.inv.Count(&a)==1);
|
||||
// Each widget owns only its callbacks, even on the shared blood invoker.
|
||||
Adapter other;other.InitializeHitZoneUI(11,22,3,&player,false);a.HandlerDeattached(7);before=other.updates;
|
||||
blood.inv.Invoke(&blood);assert(a.detach==1&&blood.inv.Count(&a)==0&&other.updates==before+1);
|
||||
// Current mode loss/replacement makes retained callbacks inert; cleanup still works.
|
||||
before=other.updates;Mode::current=nullptr;blood.inv.Invoke(&blood);Mode::current=&next;limb.inv.Invoke(&limb);assert(other.updates==before);
|
||||
auto late=limb.inv.entries.back().callback;other.Destroy();assert(blood.inv.Count(&other)==0&&limb.inv.Count(&other)==0);
|
||||
Mode::current=&mode;late(&limb);assert(other.updates==before);
|
||||
// Reinitialize in a non-successor mode: remove old wrappers, preserve native setup.
|
||||
Mode::current=&mode;Adapter reuse;reuse.InitializeHitZoneUI(11,22,3,&player,false);
|
||||
Zone b2,l2;b2.character=false;Player p2{&b2,{&l2}};Mode::current=nullptr;
|
||||
reuse.InitializeHitZoneUI(11,22,3,&p2,false);assert(reuse.init==2&&!reuse.lastRefresh);
|
||||
assert(blood.inv.Count(&reuse)==0&&limb.inv.Count(&reuse)==0);
|
||||
b2.inv.Invoke(&b2);assert(b2.inv.errors==1); // Foreign native behavior untouched.
|
||||
// Empty/invalid group entries are not adopted; repeated cleanup is harmless.
|
||||
Mode::current=&mode;Adapter empty;Player missing{nullptr,{nullptr,&ignored}};empty.InitializeHitZoneUI(11,22,3,&missing,false);
|
||||
empty.Destroy();empty.Destroy();assert(ignored.inv.Count(&empty)==0);
|
||||
}
|
||||
'''.replace('METHODS',methods))
|
||||
print('PASS: actual one-argument adapter, explicit refresh, native initialization flag, duplicate/blood ownership, rebind/detach/destruction and foreign-mode transparency')
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,549 @@
|
||||
{
|
||||
"exit": 1,
|
||||
"seconds": 95.57,
|
||||
"inputs_unchanged": true,
|
||||
"removed_override_names": [],
|
||||
"regression_programs": 135,
|
||||
"programs": [
|
||||
{
|
||||
"path": "tests/test_profile_config.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_welcome_voice.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_objective_map_presentation.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_objective_map_element.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_native_objective_map_probe.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_prefab_identity.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_spawn_scene.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_spawn_scene_inventory.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_spawn_scene_lease.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_prison_ai.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_native_player_death_fixture.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_hq_planner_budget.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_observer_ownership.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_chat_client_ownership.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_native_observer_selector.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_ground_depot_loading.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_ground_depot_lifecycle.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_ground_depot_mine_claim.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_ground_depot_transfer.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_ground_depot_provenance.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_crash_start.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_start_settings.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_intercept_vehicle_footprint.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_bmp_intercept_geometry.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_native_random_radius_trace.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_native_random_radius_runner.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_native_supply_travel.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_native_supply_travel_hook.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_native_supply_travel_runner.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_native_mounted_intercept.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_hq_mounted_dispatch.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_hq_mounted_intercept.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_hq_mounted_intercept_pair.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_convoy_intercept_pair.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_native_maintenance_refuel.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_mine_intel.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_mine_intel_discovery_integration.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_infantry_combat.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_enemy_medicine.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_hunter_combat.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_hq_local_awareness.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_unconscious_controls.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_town_garrisons.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_field_sites.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_gameplay_session_regressions.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_gameplay_review_fixes.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_server_log_regressions.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_mortar_load_ack.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_hunter_profiles.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_hunter_lifecycle.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_hunter_capture.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_hunter_opening.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_enemy_awareness.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_intel_body_inspection.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_body_recovery_lifecycle.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_air_support_policy.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_air_logistics_orders.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_air_recon.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_scouts.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_mortar_station.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_random_settings.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_debug_ai.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_generated_sites.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_terrain_sites.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_terrain_adapter.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_terrain_airfields.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_terrain_takeover.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_terrain_presentation.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_terrain_selection.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_faction_selection.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_faction_menu.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_content_policy.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_hq_road_intercept.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_hq_delivered_task.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_hq_local_handoff.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_hq_local_handoff_intake.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_native_local_handoff_probe.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_infantry_resupply_waypoints.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_infantry_placement_settle.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_native_infantry_fixture_lifecycle.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_native_infantry_cargo.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_native_infantry_setup.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_infantry_ammo_access.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_infantry_resupply_planning.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_infantry_supply_pool.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_hq_multiconvoy_supply.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_enemy_gunner_skill.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_native_memory_deadlines.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_convoy_auto_settings.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_convoy_startup.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_failure_result_refresh.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_infantry_resupply_coordinator.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_infantry_mine_coordinator.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_infantry_mine_transfer.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_infantry_ammo_transfer.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_finite_magazine_reservation.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_mounted_ammo_transfer.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_mounted_ammo_pickup.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_mounted_resupply.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_mounted_supply_integration.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_hq_ammo_reporting.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_enemy_radio.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_native_maintenance_stock.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_packed_external_game.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_hq_radio_node.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_vehicle_maintenance_stock.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_optional_transport.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_vehicle_entry_diagnostics.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_vehicle_security_native_probe.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_vehicle_security.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_vehicle_alarm.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_vehicle_alarm_perception.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_native_convoy_mine_stock.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_native_mine_stock_runner.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_native_mounted_ammo_probe.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_native_mounted_swap_probe.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_native_mounted_courier_probe.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_native_alarm_hearing.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_native_convoy_cover_probe.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_enemy_optics.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_convoy_combat.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_ai_stinger_admin.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_hq_ammo_dispatch.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_hq_convoy_combat.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_hq_ammo_sampler.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_hq_mine_sampler.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_hq_mounted_ammo_sampler.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_hq_mounted_binding.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_hq_vehicle_seats.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_native_hq_body_probe.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_hq_delivered_casualties.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_external_profile_review.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_hq_uplink_fairness.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_actor_group.py",
|
||||
"exit": 0
|
||||
},
|
||||
{
|
||||
"path": "tests/test_native_package_external.py",
|
||||
"exit": 1
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,537 @@
|
||||
PASS: shared config transaction rejects client writes, preserves first-save/prior/fallback state across open, write, backup, partial-copy, readback and mismatch failures
|
||||
PASS: actual Save/Commit preserves semantically valid backup across unrelated menu edits and repairs; unknown fields/default sections retained; actual terrain parser; other parsers, catalog and disk doubled
|
||||
....
|
||||
----------------------------------------------------------------------
|
||||
Ran 4 tests in 0.001s
|
||||
|
||||
OK
|
||||
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 mixed-roster worker/item selection, ownership/refusal and radio/planning/two-leg state transitions, fixed deadline, late proof quarantine, finite import and no adoption after Stop
|
||||
PASS: actual depot HQ lifecycle, existing planner priority, server/mode/owner gates, idempotent polling and owner replacement
|
||||
PASS: actual HQ mine/magazine claim separation, real demand methods, exact token cleanup and original authority gates; native availability doubled
|
||||
PASS: actual full magazine/inert-PMN4 depot leaf, exact custody, isolated callbacks, finite reservation, false/unknown and Stop quarantine, once-only delivery and caps; native movement unqualified
|
||||
PASS: actual mine/magazine provenance and separated finite mine imports; actual authored identity capture, READY-only detached provenance, same shared stock admission, completed exact two-leg proof, lifetime caps and Stop no late adoption
|
||||
PASS: actual crash geometry, detached definition setup, frozen server choice and guarded phase policy; integration/source ordering checked
|
||||
PASS: actual GameMode readiness admission and common full-footprint survey require crash authorization and both surveyed areas
|
||||
PASS: actual start defaults/parse/save, failure retention and authorized command wiring; current/next feedback, aliases and no random choice; native UI and core mode freezing are separate
|
||||
PASS: actual immutable measured footprint/root/attachment matching, bounds/transforms, moving geometry, seated-body and cargo reciprocity, finite hierarchy caps; native geometry doubled
|
||||
PASS: actual BMP singleton geometry and typed current order; one survey, full straight segment, width, known history, reservations, settlement/clearance and work caps; placement/footprint tested separately
|
||||
PASS: actual five random-radius diagnostic wrappers, disabled transparency, cached opt-in, exact zero and exclusion branch, native arguments/returns/outarg preservation, single superclass call and shared16-log cap
|
||||
PASS: zero-radius trace disabled by default, scoped before setup, exact opt-in emission; no native launch
|
||||
PASS: complete actual supply-travel probe, immutable 6+2 formations and 25 actors, admission/travel deadlines, six observed native-boundary moves, stop/ownership/partial-substitution refusals
|
||||
PASS: actual distinct supply-travel hook, fixed420s selector, original observer protection/restoration, failure/terminal cleanup and no legacy convoy setup
|
||||
PASS: actual supply-travel selector requires Chat, one round and480s; existing outcomes unaffected; no native launch
|
||||
usage: test_native_mounted_intercept.py [-h] [--steam STEAM]
|
||||
[--external-addons EXTERNAL_ADDONS]
|
||||
--compat COMPAT --profile PROFILE
|
||||
[--smoke {crash-start,crash-geometry,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,supply-travel,mounted-ammo,alarm-hearing,hq-memory,hq-awareness,aircraft-field,aircraft-route,native-end-active,native-end-preparing,aircraft-control,aircraft-cancel,aircraft-translate,map-ownership,mortar-refresh,mortar-salvo,mortar-courier,station-teardown,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}]
|
||||
[--trace-random-radius]
|
||||
[--maintenance-refuel]
|
||||
[--mounted-swap-eligibility]
|
||||
[--mounted-bmp] [--mine-stock]
|
||||
[--mounted-courier]
|
||||
[--mounted-intercept] [--convoy-cover]
|
||||
[--field-terrain-audit]
|
||||
[--field-service-cancel]
|
||||
[--route-service-cancel]
|
||||
[--station-teardown-diagnostics]
|
||||
[--flight-autohover]
|
||||
[--flight-action-inputs]
|
||||
[--flight-input-diagnostics]
|
||||
[--recon-takeover-only]
|
||||
[--body-recovery-only]
|
||||
[--rounds ROUNDS] [--timeout TIMEOUT]
|
||||
[--project {core,chat}]
|
||||
test_native_mounted_intercept.py: error: --mounted-intercept requires Chat --smoke convoy, one round and timeout at least900 seconds
|
||||
usage: test_native_mounted_intercept.py [-h] [--steam STEAM]
|
||||
[--external-addons EXTERNAL_ADDONS]
|
||||
--compat COMPAT --profile PROFILE
|
||||
[--smoke {crash-start,crash-geometry,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,supply-travel,mounted-ammo,alarm-hearing,hq-memory,hq-awareness,aircraft-field,aircraft-route,native-end-active,native-end-preparing,aircraft-control,aircraft-cancel,aircraft-translate,map-ownership,mortar-refresh,mortar-salvo,mortar-courier,station-teardown,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}]
|
||||
[--trace-random-radius]
|
||||
[--maintenance-refuel]
|
||||
[--mounted-swap-eligibility]
|
||||
[--mounted-bmp] [--mine-stock]
|
||||
[--mounted-courier]
|
||||
[--mounted-intercept] [--convoy-cover]
|
||||
[--field-terrain-audit]
|
||||
[--field-service-cancel]
|
||||
[--route-service-cancel]
|
||||
[--station-teardown-diagnostics]
|
||||
[--flight-autohover]
|
||||
[--flight-action-inputs]
|
||||
[--flight-input-diagnostics]
|
||||
[--recon-takeover-only]
|
||||
[--body-recovery-only]
|
||||
[--rounds ROUNDS] [--timeout TIMEOUT]
|
||||
[--project {core,chat}]
|
||||
test_native_mounted_intercept.py: error: --mounted-intercept requires Chat --smoke convoy, one round and timeout at least900 seconds
|
||||
usage: test_native_mounted_intercept.py [-h] [--steam STEAM]
|
||||
[--external-addons EXTERNAL_ADDONS]
|
||||
--compat COMPAT --profile PROFILE
|
||||
[--smoke {crash-start,crash-geometry,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,supply-travel,mounted-ammo,alarm-hearing,hq-memory,hq-awareness,aircraft-field,aircraft-route,native-end-active,native-end-preparing,aircraft-control,aircraft-cancel,aircraft-translate,map-ownership,mortar-refresh,mortar-salvo,mortar-courier,station-teardown,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}]
|
||||
[--trace-random-radius]
|
||||
[--maintenance-refuel]
|
||||
[--mounted-swap-eligibility]
|
||||
[--mounted-bmp] [--mine-stock]
|
||||
[--mounted-courier]
|
||||
[--mounted-intercept] [--convoy-cover]
|
||||
[--field-terrain-audit]
|
||||
[--field-service-cancel]
|
||||
[--route-service-cancel]
|
||||
[--station-teardown-diagnostics]
|
||||
[--flight-autohover]
|
||||
[--flight-action-inputs]
|
||||
[--flight-input-diagnostics]
|
||||
[--recon-takeover-only]
|
||||
[--body-recovery-only]
|
||||
[--rounds ROUNDS] [--timeout TIMEOUT]
|
||||
[--project {core,chat}]
|
||||
test_native_mounted_intercept.py: error: --mounted-intercept requires Chat --smoke convoy, one round and timeout at least900 seconds
|
||||
usage: test_native_mounted_intercept.py [-h] [--steam STEAM]
|
||||
[--external-addons EXTERNAL_ADDONS]
|
||||
--compat COMPAT --profile PROFILE
|
||||
[--smoke {crash-start,crash-geometry,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,supply-travel,mounted-ammo,alarm-hearing,hq-memory,hq-awareness,aircraft-field,aircraft-route,native-end-active,native-end-preparing,aircraft-control,aircraft-cancel,aircraft-translate,map-ownership,mortar-refresh,mortar-salvo,mortar-courier,station-teardown,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}]
|
||||
[--trace-random-radius]
|
||||
[--maintenance-refuel]
|
||||
[--mounted-swap-eligibility]
|
||||
[--mounted-bmp] [--mine-stock]
|
||||
[--mounted-courier]
|
||||
[--mounted-intercept] [--convoy-cover]
|
||||
[--field-terrain-audit]
|
||||
[--field-service-cancel]
|
||||
[--route-service-cancel]
|
||||
[--station-teardown-diagnostics]
|
||||
[--flight-autohover]
|
||||
[--flight-action-inputs]
|
||||
[--flight-input-diagnostics]
|
||||
[--recon-takeover-only]
|
||||
[--body-recovery-only]
|
||||
[--rounds ROUNDS] [--timeout TIMEOUT]
|
||||
[--project {core,chat}]
|
||||
test_native_mounted_intercept.py: error: --mounted-intercept requires Chat --smoke convoy, one round and timeout at least900 seconds
|
||||
usage: test_native_mounted_intercept.py [-h] [--steam STEAM]
|
||||
[--external-addons EXTERNAL_ADDONS]
|
||||
--compat COMPAT --profile PROFILE
|
||||
[--smoke {crash-start,crash-geometry,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,supply-travel,mounted-ammo,alarm-hearing,hq-memory,hq-awareness,aircraft-field,aircraft-route,native-end-active,native-end-preparing,aircraft-control,aircraft-cancel,aircraft-translate,map-ownership,mortar-refresh,mortar-salvo,mortar-courier,station-teardown,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}]
|
||||
[--trace-random-radius]
|
||||
[--maintenance-refuel]
|
||||
[--mounted-swap-eligibility]
|
||||
[--mounted-bmp] [--mine-stock]
|
||||
[--mounted-courier]
|
||||
[--mounted-intercept] [--convoy-cover]
|
||||
[--field-terrain-audit]
|
||||
[--field-service-cancel]
|
||||
[--route-service-cancel]
|
||||
[--station-teardown-diagnostics]
|
||||
[--flight-autohover]
|
||||
[--flight-action-inputs]
|
||||
[--flight-input-diagnostics]
|
||||
[--recon-takeover-only]
|
||||
[--body-recovery-only]
|
||||
[--rounds ROUNDS] [--timeout TIMEOUT]
|
||||
[--project {core,chat}]
|
||||
test_native_mounted_intercept.py: error: --mounted-intercept and --convoy-cover are mutually exclusive
|
||||
PASS: actual native interception witness requires real radio cursor/lineage, original actor identities, fixed movement/hold/expiry/resume and immutable deadline; no movement/delivery injection
|
||||
PASS: actual CLI rejects wrong mode/project/rounds/899s/conflict before runtime; valid flag and terminal branch identify synthetic-observation qualification
|
||||
PASS: visible base hook and actual fixture override delegate once; delivery proof uses retained pre-super route only on successful production transition
|
||||
actual mounted HQ dispatch planning, radio, ownership and lifecycle checks passed
|
||||
PASS: actual mounted intercept eligibility/order chronology, fixed destinations, native road selection bounds, width, segment heading, clearance and settlement delegation; no native driving claim
|
||||
PASS: actual paired arc geometry,40m/80m spacing, separate original polylines, both-position validation and128road/4096segment budget; no native driving proof
|
||||
PASS: actual typed original BMP singleton, loss/footprint/custody guards and native cancellation, UAZ-only pair admission, rollback, native allocation/revocation boundaries, per-member ownership, hold and expiry
|
||||
PASS: actual Tick clock initialization admits fractional first ticks and expires without extending the original start
|
||||
PASS: actual finite conservation/deadline/callback policies; read-only selection, bounded once-only inventory submission and no can refill; native transfer not executed
|
||||
PASS: actual exact-context membership, bounded identity/reach gates, native start/cache/eligibility ordering and no duplicate/foreign action start; fuel manager identity and empty-can headroom guards checked
|
||||
PASS: actual detached node/value snapshot and conservation refuse mismatched lengths before indexed reads, retain original identities under native out-array aliasing and log bounded counts once; native cause remains unknown
|
||||
PASS: actual mine evidence sealing/recovery, historical coarse publication, caps, canonical ownership, marker join retry/owner-change/stop; native arming and replicated vector-array transport untested
|
||||
PASS: actual full document recovery retains authored/sealed targets, one shared spent ledger, retry/exhaustion semantics and canonical multi-player ownership alongside supplemental mine intel
|
||||
PASS: actual infantry search suspension, quiet grace, finite resume, expiry/replacement and defensive/ownership boundaries
|
||||
PASS: infantry combat gate precedes radio delivery and preserves non-task transports
|
||||
PASS: actual HQ contact transition wakes only fit squad members, cancels only task orders and logs changes once
|
||||
PASS: actual finite medicine grants, authored stock deduction, full-backpack refusal/pouch fallback, no loot replenishment, unresolved-operation quarantine and ownership/stop guards
|
||||
PASS: only recent native detected/identified threats suspend hunter travel; stale/disarmed/destroyed contacts cannot strand patrols
|
||||
PASS: actual hunter combat transition cancels only its travel once, holds through renewed contact and resumes after quiet; unregistered startup preserved
|
||||
PASS: 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: actual player-entry hook latches original hunter capture before native callbacks; both release layers cancel ownership without new entities/refund; bounded current-owner guards and prior-release policy
|
||||
PASS: real opening road geometry enforces wide azimuths; fresh delivered contact preempts patrol cooldown, respects radio failures and does not starve in-flight interception
|
||||
PASS: 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: actual helicopter delay applies resolved Random values, preserves countdown on save failure, and leaves active flights running
|
||||
PASS: hill prominence/elevation, actual road edges/heights/bends and server-only finite scout admission, pending stock, timeout and no replacements/refills
|
||||
PASS: mortar duty scope excludes players, other crews, stopped/client/inactive states; only destruction releases an active assignment, while the gunner may approach the gun
|
||||
PASS: random mode restrictions, full numeric ranges, independent calendar dates and strict daylight boundaries
|
||||
PASS: actual killais eligibility includes the 1000m boundary, excludes players/retained bodies/dead/non-character entities and checks full 3D distance
|
||||
PASS: actual generation scheduler bounds each tick, enforces deadline/candidate ceiling, validates fallback, commits only accepted positions, skips only dispensable sites, preserves required objectives/intel, and resets the next search budget
|
||||
PASS: 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: real sampling handles absent airports and extraction clearance preserves geometry/navigation/flatness while selecting the correct aircraft survey
|
||||
PASS: universal connector, embedded/standalone exports, multiple terrains, stable IDs, native nav configs, missing-nav visibility, path validation and overwrite protection
|
||||
PASS: airfield detection accepts physical runways/towers and bounded authored markers, rejects unrelated props, water and out-of-world markers, and samples terrain height
|
||||
PASS: configured airport parsing, bounded readiness, stale admission rejection and cleanup wiring
|
||||
PASS: automatic default, explicit header/CLI opt-out, editor/authored-mode guards, optional airport override precedence and fresh-round saving guard
|
||||
PASS: singleton identity guards, paired faction deserialization and client world-cleanup wiring
|
||||
PASS: task/map/respawn getters survive delayed old destruction and preserve ordinary-mode behavior
|
||||
PASS: replication hierarchy refuses absent/aliased nodes and establishes delivery dependencies idempotently
|
||||
PASS: standalone old faction delegates collected once, with null/deleted owners ignored
|
||||
PASS: actual terrain takeover startup skips mode-less/menu worlds, always forwards super, retains eligible/unsupported/authored/client/editor semantics
|
||||
PASS: native name callback preserves authored modes, opt-outs and failures; terrain suffix follows world changes, cached resolution and confirmed takeover metadata restores on cleanup without changing scenario resource or overwriting later titles
|
||||
PASS: actual terrain parent traversal, Armenhof/Nogova names, Everon alias, missing-resource fallback, empty names and bounded cycles/depth
|
||||
PASS: saved terrain GUIDs, defaults, restart persistence, clearing, backup recovery, corrupt-file preservation, write failures, and client write denial
|
||||
PASS: startup terrain capture protects client/editor/menu worlds, default behavior, same-map loads and reload-loop recovery
|
||||
PASS: actual transition waits for native startup, disconnects without bans, requires an empty session, retains every loaded mod, bounds waiting and consumes requests once
|
||||
PASS: actual faction resolution reserves explicit roles, samples without replacement, substitutes disabled selections, and rejects duplicate/unknown/missing choices and insufficient pools
|
||||
PASS: Random all submits persistent random roles immediately; manual mixed choices, stale/unauthorized UI guards and debounce preserved
|
||||
PASS: actual content policy gates parent packs, individual factions, faction identity and finite group rotation with vanilla fallback
|
||||
PASS: actual delivered road eligibility, ahead projection without chords, reservations, stock road query bounds, terrain/water/obstruction refusal and clean outputs
|
||||
PASS: actual delivered-task lineage, expiry, old-order retention, native commit, release, road precision expiry and duplicate delivery
|
||||
PASS: actual original-roster local handoff,100m3D bound,busy carrier/budget exclusion,origin interruption including deletedsource,normal radio delivery and per-source replay history
|
||||
PASS: actual visual intake retains source/time/position/id, rejects replay, prefers usable own route, excludes simultaneous callers and conservatively resets negative-sweep dwell
|
||||
PASS: actual fixture local/radio gating, immutable source/time/position, interrupted-report exclusion and exact-owner cleanup
|
||||
PASS: local-handoff runner refuses wrong project/round count/insufficient deadline before runtime work
|
||||
PASS: actual fixture allocator terminal/unsubmitted guard, original-group lookup and both candidate gates
|
||||
PASS: actual report-derived waypoint insertion/order and tighter positive radii; no formation navigation claim
|
||||
PASS: actual Place/Stop waits native pose update, bounds four attempts, preserves original position, restores pending/settled placement and respects ownership/accepted-move quarantine
|
||||
PASS: actual fixture current/original recipient ownership, unresolved transfer cleanup, exact-token release and idempotent Stop
|
||||
PASS: actual fixture phased-cargo readiness, bounded callbacks, captured-stock mixed-caliber selection/continuation, reservation cleanup and component magazine counts
|
||||
PASS: actual inventory-fixture setup uses ordinary prison unlock before constructing its convoy-waiting probe; failed unlock cannot run fixture
|
||||
PASS: actual authored storage anchors, native trace flags, own-hierarchy exclusion, external wall/vehicle obstruction, range, unknown geometry and bounded context refusal
|
||||
PASS: actual Compatible and bounded stock preflight before report/claim consumption, later compatible truck, launcher controls, convoy binding, finite identities, disjoint tokens, shared report replay/cooldown, original recipients and HQ cleanup
|
||||
PASS: actual finite convoy supply pool; immutable slots, shared demand state, sparse/capped discovery and permanent shutdown
|
||||
PASS: actual HQ rotates finite donors, skips unavailable/contacted trucks, uses delivered reports and dispatches at most one trip per planning cadence
|
||||
PASS: actual original turret identity, native/canonical guards, scoped maximum-skill profile, reset, dismount/reboard, requested-skill preservation and restoration
|
||||
PASS: bounded HQ startup/memory windows and outcome-specific full-route deadlines
|
||||
PASS: explicit escape-route skips only administrator stress, preserving original full-fixture wait/failure paths
|
||||
PASS: normal escape route keeps ordinary catalog and generated placement; historical selectors remain unchanged
|
||||
PASS: actual patrol fixture leaves prison before responder HQ proof, followed by separate permanent-patrol observation
|
||||
PASS: exact patrol-hq finite responder preparation and native search-radius receipt verification
|
||||
PASS: actual read migrates old valid settings, preserves explicit disabled state, rejects invalid data; next-round feedback and fixed menu remain honest
|
||||
PASS: actual automatic convoy timing/authority/admission/one-attempt/manual-task/stop policy; native deployment unproved
|
||||
PASS: late authoritative failure reason refreshes open result; detach, mode change and success subscriptions preserved
|
||||
infantry resupply actual rules, radio transitions, owned cleanup and unresolved-operation tests passed
|
||||
PASS: actual resupply Roster preserves permanent release, original slot mapping and bounded ownership
|
||||
PASS: actual designated zero/one original carrier selection, settled startup, shared finite claims, no refund after submission
|
||||
PASS: actual HQ startup grant readiness forwarding is authoritative and fail-closed
|
||||
PASS: actual finite PMN4 designated-zero/one entitlement, pinned original ownership, shared commit, physical custody, callback quarantine/deletion and no retry
|
||||
PASS: actual bounded empty-return and finite delivery; phase-isolated callbacks, exact ownership proof, stop quarantine and original actor/vehicle boundaries
|
||||
PASS: actual shared finite identity reservation; competing consumers, submission permanence, stale cleanup and96-item bound
|
||||
PASS: actual carried-mounted swap, shared committed claim, physical slot reach, exact two-way proof, uncertainty and terminal cleanup
|
||||
PASS: actual mounted pickup, exact finite ownership, pre-submission commit, physical custody, bounded callback and quarantine lifecycle; no native coverage claim
|
||||
PASS: actual mounted courier admission, radio, individual orders, two-stage transfer, reboarding, token cleanup and quarantine lifecycle
|
||||
PASS: actual scoped crew permit and native board completion/failure preserves foreign seats without teleport fallback
|
||||
PASS: actual shared mounted stock/history ownership, atomic exact HQ pair claim, and bounded stopped-owner proof polling
|
||||
PASS: actual carried/mounted early ammunition policy and status-first shared uplink; complete threshold, phases, cooldown, failures requested check-ins and non-urgent detached carried-mine status
|
||||
PASS: actual group radio startup preservation, finite native grants, callback quarantine, frozen selection/actor ownership and bounded observation
|
||||
PASS: actual maintenance native-stock check rejects missing/duplicate/wrong-identity/unowned/depleted/malformed stock and is read-only; native runtime not executed
|
||||
..................
|
||||
----------------------------------------------------------------------
|
||||
Ran 18 tests in 0.266s
|
||||
|
||||
OK
|
||||
PASS: actual radio node rejects current incapacitation, death, ownership and faction changes despite cached inventory; one-second capability refresh remains explicit
|
||||
PASS: Southern finite maintenance stock preserves weapons/clues and optional transport, historical Western fixture stays separate; native capacity/consumption untested
|
||||
PASS: optional transport deferred behind required readiness, bounded once-only spawn/omission, isolated cleanup, occupied-candidate retention and required-default preservation
|
||||
PASS: actual diagnostic fallback runs only on failed missing-context call, derives unique native pilot door, preserves stock eligibility and restores prior index on success/failure; diagnostics mutate no game state.
|
||||
PASS: actual native-prelude cleanup restores only original changed damage, refuses stale/incapacitated/aboard teleport; bounded five-seat/four-door fixture wiring checked. Native execution remains pending.
|
||||
PASS: actual CreateTransport requires successful scoped Configure after handbrake, preserves ordinary vehicles, tracks spawned entity before failures and never treats failed lock registration as ready.
|
||||
PASS: actual preparation Configure guards/idempotence/breach preservation, security eligibility/final current-body server mutation and all scoped action guards; all five seat/four door resource overrides. Native hold, prefab merge, replication and boarding remain unverified.
|
||||
PASS: production vehicle alarm single trigger/replica completion/no replay, fixed deadline/readiness wait, failed audio, dedicated server, moving exact handle, destruction/native end/deletion/clock and mission teardown. Native sound and multiplayer delivery require engine qualification.
|
||||
PASS: production alarm emitter/receiver original time/location, explicit native queue only, 32-entry cap, 50m local witness eligibility, bound perception, native-super preservation; actual engine broadcast/hearing remains unverified.
|
||||
PASS: actual optional candidate barrier, exact callback/custody proof and unchanged mine/primary snapshots; no native transfer claim
|
||||
Native finite mine-stock runner: parser, scope, exclusions and command pass
|
||||
PASS: actual bounded native mounted proof/detached payload/deadline/cleanup methods, production-only setup and isolated runner selector
|
||||
PASS: actual one-existing-convoy candidate readiness, sender-root identity, incomplete cargo refusal and fixed three-candidate bound
|
||||
PASS: actual BMP capture requires complete armed exact original resource; pinned delivery/slot checks and isolated CLI flag
|
||||
PASS: actual opt-in pre-unlock isolation refuses wrong mode/phase/flag and existing hunters; no baseline service changes
|
||||
PASS: actual once-only native dry query, exact before/after slots, native refusal, shutdown; shared bounded discovery and distinct opt-in verdict
|
||||
PASS: actual completion selector and pre-cleanup variant capture preserve separate radio and eligibility verdicts
|
||||
PASS: actual cargo diagnostic stages separate absent/foreign magazines, used/empty/invalid rounds, well mismatch and exact truck storage/attachment without mutation
|
||||
PASS: actual native courier witness rejects missing radio/custody/swap/reboard evidence; CLI opt-in bounded; native success remains unqualified
|
||||
PASS: actual courier constructor/Tick waits for preparation, returns before physical checks, preserves fixed deadline and sticky stop/failure; Enfusion startup awaits native verification
|
||||
PASS: actual arranged native alarm fixture deadline, single emit, natural-route observation, original timestamp/area/detail assertions, natural observer proximity/activation wait, failure cleanup and independent canonical-body restoration; native delivery itself remains unqualified.
|
||||
PASS: actual convoy cover observation/snapshot/uplink/HOLD/RESUME/cleanup transitions; native boundaries mocked, non-convoy runner opt-in refused
|
||||
Enemy optics actual-service ownership, preservation, callback, deadline and bounded-inspection policies passed
|
||||
PASS: actual delivered cover freshness/lineage/replay and canonical executor; owned waypoint-only hold, one resume at preserved route index, invalid ownership/crew/ledger refusal and fail-closed native recreation
|
||||
PASS: actual Stinger show/set/help state precise actor-roll effects; read-only help, bounded values, malformed syntax and failed-save preservation; no rerolls/gameplay edits and no native persistence claim
|
||||
PASS: new/retasked search and radio delivery ammo gates; active tasks and delivered release preserved
|
||||
HQ convoy delivered-report planning and downlink regressions passed
|
||||
PASS: actual own-inventory ammo inspection deduplicates loaded/carried/shared wells, separates chambers/launchers, freezes scalar snapshots and treats unsupported/capped/foreign inventory as unknown
|
||||
PASS: actual carried PMN4 inventory, original-owner guards, bounded deduplication, independent unknown state and detached counts
|
||||
PASS: actual mounted hierarchy sampling, ownership exclusion, deduplication, completeness/caps, quarter threshold and detached validation; no runtime policy or ammunition mutation
|
||||
PASS: WORKBENCH opt-in diagnostics distinguish cycles/cap/storage/manager/mount failures without repeated native traversal
|
||||
PASS: actual HQ original convoy-root admission rejects wrong force/server/group and never supplies replacement lookup
|
||||
PASS: production mounted structural seat scan ignores >128 carried/cargo descendants, shares exact native mount/magazine ownership, preserves attachment seats and exact occupants, rejects unknown/cyclic/oversize structures; native binding still requires qualification.
|
||||
PASS: native body fixture uses existing immutable actors, real production LOS/queued uplink, pre-delivery isolation, actual status overlap, bounded cleanup and no fabricated reports/spawns
|
||||
PASS: actual native fixture lookup selects exact BODY kind/identity/message from bounded evaluations, never sighting-only Get
|
||||
PASS: actual ammo snapshot comparison checks every scalar/category flag; native probe requires real roster rescan, loaded-round lower bound and separate immutable pending/Watch objects
|
||||
PASS: actual delivered slot-union bodies preserve overlap/disjoint evidence, replay idempotence, status subset integrity, full-wipe closure and formation-local bounds
|
||||
test_review_added_allowed_media_invalidates_snapshot (__main__.ReviewTests.test_review_added_allowed_media_invalidates_snapshot) ... ok
|
||||
test_review_added_source_directory_rejected (__main__.ReviewTests.test_review_added_source_directory_rejected) ... ok
|
||||
test_review_loose_root_resource_and_symlink_rejected (__main__.ReviewTests.test_review_loose_root_resource_and_symlink_rejected) ... ok
|
||||
test_review_metadata_media_and_sidecars_remain_allowed_and_bound (__main__.ReviewTests.test_review_metadata_media_and_sidecars_remain_allowed_and_bound) ... ok
|
||||
test_review_missing_link_rejected (__main__.ReviewTests.test_review_missing_link_rejected) ... ok
|
||||
test_review_package_guard_sees_new_scripts (__main__.ReviewTests.test_review_package_guard_sees_new_scripts) ... ok
|
||||
test_review_retargeted_private_link_rejected (__main__.ReviewTests.test_review_retargeted_private_link_rejected) ... ok
|
||||
|
||||
----------------------------------------------------------------------
|
||||
Ran 7 tests in 0.076s
|
||||
|
||||
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
|
||||
E.EEEEE..EEE.EEEE
|
||||
======================================================================
|
||||
ERROR: test_cache_tampering_cannot_relabel_changed_payload_as_unchanged (__main__.ExternalPackageTests.test_cache_tampering_cannot_relabel_changed_payload_as_unchanged)
|
||||
----------------------------------------------------------------------
|
||||
Traceback (most recent call last):
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tests/test_native_package_external.py", line 137, in test_cache_tampering_cannot_relabel_changed_payload_as_unchanged
|
||||
self.prepare()
|
||||
~~~~~~~~~~~~^^
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tests/test_native_package_external.py", line 25, in prepare
|
||||
self.authored=n.copy_payload(self.root,self.session)
|
||||
~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tools/native_package.py", line 172, in copy_payload
|
||||
with destination.open('xb') as output:
|
||||
~~~~~~~~~~~~~~~~^^^^^^
|
||||
OSError: [Errno 122] Disk quota exceeded
|
||||
|
||||
======================================================================
|
||||
ERROR: test_context_only_passed_to_ai_and_chat_in_full_build (__main__.ExternalPackageTests.test_context_only_passed_to_ai_and_chat_in_full_build)
|
||||
----------------------------------------------------------------------
|
||||
Traceback (most recent call last):
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tests/test_native_package_external.py", line 165, in test_context_only_passed_to_ai_and_chat_in_full_build
|
||||
code,summary,calls=self.run_double(args,result)
|
||||
~~~~~~~~~~~~~~~^^^^^^^^^^^^^
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tests/test_native_package_external.py", line 59, in run_double
|
||||
code=n.run(args,self.root)
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tools/native_package.py", line 500, in run
|
||||
authored = copy_payload(root, session)
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tools/native_package.py", line 172, in copy_payload
|
||||
with destination.open('xb') as output:
|
||||
~~~~~~~~~~~~~~~~^^^^^^
|
||||
OSError: [Errno 122] Disk quota exceeded
|
||||
|
||||
======================================================================
|
||||
ERROR: test_diagnostic_continuation_cannot_ignore_unverified_external_report (__main__.ExternalPackageTests.test_diagnostic_continuation_cannot_ignore_unverified_external_report)
|
||||
----------------------------------------------------------------------
|
||||
Traceback (most recent call last):
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tests/test_native_package_external.py", line 182, in test_diagnostic_continuation_cannot_ignore_unverified_external_report
|
||||
code,summary,calls=self.run_double(args,lambda *a,**k:reports.pop(0))
|
||||
~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tests/test_native_package_external.py", line 59, in run_double
|
||||
code=n.run(args,self.root)
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tools/native_package.py", line 500, in run
|
||||
authored = copy_payload(root, session)
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tools/native_package.py", line 172, in copy_payload
|
||||
with destination.open('xb') as output:
|
||||
~~~~~~~~~~~~~~~~^^^^^^
|
||||
OSError: [Errno 122] Disk quota exceeded
|
||||
|
||||
======================================================================
|
||||
ERROR: test_diagnostic_continuation_stops_on_mid_batch_external_mutation (__main__.ExternalPackageTests.test_diagnostic_continuation_stops_on_mid_batch_external_mutation)
|
||||
----------------------------------------------------------------------
|
||||
Traceback (most recent call last):
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tests/test_native_package_external.py", line 175, in test_diagnostic_continuation_stops_on_mid_batch_external_mutation
|
||||
code,summary,calls=self.run_double(args,result)
|
||||
~~~~~~~~~~~~~~~^^^^^^^^^^^^^
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tests/test_native_package_external.py", line 59, in run_double
|
||||
code=n.run(args,self.root)
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tools/native_package.py", line 500, in run
|
||||
authored = copy_payload(root, session)
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tools/native_package.py", line 172, in copy_payload
|
||||
with destination.open('xb') as output:
|
||||
~~~~~~~~~~~~~~~~^^^^^^
|
||||
OSError: [Errno 122] Disk quota exceeded
|
||||
|
||||
======================================================================
|
||||
ERROR: test_exact_profiles_expose_only_reviewed_six_not_workshop_parent (__main__.ExternalPackageTests.test_exact_profiles_expose_only_reviewed_six_not_workshop_parent)
|
||||
----------------------------------------------------------------------
|
||||
Traceback (most recent call last):
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tests/test_native_package_external.py", line 76, in test_exact_profiles_expose_only_reviewed_six_not_workshop_parent
|
||||
self.prepare()
|
||||
~~~~~~~~~~~~^^
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tests/test_native_package_external.py", line 25, in prepare
|
||||
self.authored=n.copy_payload(self.root,self.session)
|
||||
~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tools/native_package.py", line 172, in copy_payload
|
||||
with destination.open('xb') as output:
|
||||
~~~~~~~~~~~~~~~~^^^^^^
|
||||
OSError: [Errno 122] Disk quota exceeded
|
||||
|
||||
======================================================================
|
||||
ERROR: test_external_payload_change_cannot_qualify_after_clean_native_exit (__main__.ExternalPackageTests.test_external_payload_change_cannot_qualify_after_clean_native_exit)
|
||||
----------------------------------------------------------------------
|
||||
Traceback (most recent call last):
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tests/test_native_package_external.py", line 129, in test_external_payload_change_cannot_qualify_after_clean_native_exit
|
||||
self.prepare();pak=self.source/ext.DIRECT[0]/'data.pak'
|
||||
~~~~~~~~~~~~^^
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tests/test_native_package_external.py", line 25, in prepare
|
||||
self.authored=n.copy_payload(self.root,self.session)
|
||||
~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tools/native_package.py", line 172, in copy_payload
|
||||
with destination.open('xb') as output:
|
||||
~~~~~~~~~~~~~~~~^^^^^^
|
||||
OSError: [Errno 122] Disk quota exceeded
|
||||
|
||||
======================================================================
|
||||
ERROR: test_missing_native_exit_or_failed_cleanup_remain_disqualifying (__main__.ExternalPackageTests.test_missing_native_exit_or_failed_cleanup_remain_disqualifying)
|
||||
----------------------------------------------------------------------
|
||||
Traceback (most recent call last):
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tests/test_native_package_external.py", line 157, in test_missing_native_exit_or_failed_cleanup_remain_disqualifying
|
||||
self.prepare();report=self.native_double(write_status=False,cleanup=False)
|
||||
~~~~~~~~~~~~^^
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tests/test_native_package_external.py", line 25, in prepare
|
||||
self.authored=n.copy_payload(self.root,self.session)
|
||||
~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tools/native_package.py", line 172, in copy_payload
|
||||
with destination.open('xb') as output:
|
||||
~~~~~~~~~~~~~~~~^^^^^^
|
||||
OSError: [Errno 122] Disk quota exceeded
|
||||
|
||||
======================================================================
|
||||
ERROR: test_native_clean_exit_binds_before_after_external_fingerprints (__main__.ExternalPackageTests.test_native_clean_exit_binds_before_after_external_fingerprints)
|
||||
----------------------------------------------------------------------
|
||||
Traceback (most recent call last):
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tests/test_native_package_external.py", line 118, in test_native_clean_exit_binds_before_after_external_fingerprints
|
||||
self.prepare();report=self.native_double()
|
||||
~~~~~~~~~~~~^^
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tests/test_native_package_external.py", line 25, in prepare
|
||||
self.authored=n.copy_payload(self.root,self.session)
|
||||
~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tools/native_package.py", line 172, in copy_payload
|
||||
with destination.open('xb') as output:
|
||||
~~~~~~~~~~~~~~~~^^^^^^
|
||||
OSError: [Errno 122] Disk quota exceeded
|
||||
|
||||
======================================================================
|
||||
ERROR: test_native_helper_rejects_missing_or_wrong_context_before_creating_profile (__main__.ExternalPackageTests.test_native_helper_rejects_missing_or_wrong_context_before_creating_profile)
|
||||
----------------------------------------------------------------------
|
||||
Traceback (most recent call last):
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tests/test_native_package_external.py", line 92, in test_native_helper_rejects_missing_or_wrong_context_before_creating_profile
|
||||
self.prepare()
|
||||
~~~~~~~~~~~~^^
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tests/test_native_package_external.py", line 25, in prepare
|
||||
self.authored=n.copy_payload(self.root,self.session)
|
||||
~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tools/native_package.py", line 172, in copy_payload
|
||||
with destination.open('xb') as output:
|
||||
~~~~~~~~~~~~~~~~^^^^^^
|
||||
OSError: [Errno 122] Disk quota exceeded
|
||||
|
||||
======================================================================
|
||||
ERROR: test_policy_mutation_or_deleted_input_cannot_qualify (__main__.ExternalPackageTests.test_policy_mutation_or_deleted_input_cannot_qualify)
|
||||
----------------------------------------------------------------------
|
||||
Traceback (most recent call last):
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tests/test_native_package_external.py", line 141, in test_policy_mutation_or_deleted_input_cannot_qualify
|
||||
self.prepare();path=self.context['policy_path']
|
||||
~~~~~~~~~~~~^^
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tests/test_native_package_external.py", line 25, in prepare
|
||||
self.authored=n.copy_payload(self.root,self.session)
|
||||
~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tools/native_package.py", line 172, in copy_payload
|
||||
with destination.open('xb') as output:
|
||||
~~~~~~~~~~~~~~~~^^^^^^
|
||||
OSError: [Errno 122] Disk quota exceeded
|
||||
|
||||
======================================================================
|
||||
ERROR: test_relinked_private_dependency_fails_without_altering_installed_inputs (__main__.ExternalPackageTests.test_relinked_private_dependency_fails_without_altering_installed_inputs)
|
||||
----------------------------------------------------------------------
|
||||
Traceback (most recent call last):
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tests/test_native_package_external.py", line 146, in test_relinked_private_dependency_fails_without_altering_installed_inputs
|
||||
self.prepare()
|
||||
~~~~~~~~~~~~^^
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tests/test_native_package_external.py", line 25, in prepare
|
||||
self.authored=n.copy_payload(self.root,self.session)
|
||||
~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tools/native_package.py", line 172, in copy_payload
|
||||
with destination.open('xb') as output:
|
||||
~~~~~~~~~~~~~~~~^^^^^^
|
||||
OSError: [Errno 122] Disk quota exceeded
|
||||
|
||||
======================================================================
|
||||
ERROR: test_unchanged_external_inputs_do_not_suppress_native_errors (__main__.ExternalPackageTests.test_unchanged_external_inputs_do_not_suppress_native_errors)
|
||||
----------------------------------------------------------------------
|
||||
Traceback (most recent call last):
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tests/test_native_package_external.py", line 153, in test_unchanged_external_inputs_do_not_suppress_native_errors
|
||||
self.prepare();report=self.native_double(error='RESOURCES (E): retained upstream localization error')
|
||||
~~~~~~~~~~~~^^
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tests/test_native_package_external.py", line 25, in prepare
|
||||
self.authored=n.copy_payload(self.root,self.session)
|
||||
~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tools/native_package.py", line 172, in copy_payload
|
||||
with destination.open('xb') as output:
|
||||
~~~~~~~~~~~~~~~~^^^^^^
|
||||
OSError: [Errno 122] Disk quota exceeded
|
||||
|
||||
======================================================================
|
||||
ERROR: test_unrelated_addon_wrong_link_and_whole_tree_link_are_refused (__main__.ExternalPackageTests.test_unrelated_addon_wrong_link_and_whole_tree_link_are_refused)
|
||||
----------------------------------------------------------------------
|
||||
Traceback (most recent call last):
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tests/test_native_package_external.py", line 110, in test_unrelated_addon_wrong_link_and_whole_tree_link_are_refused
|
||||
self.prepare();profile=self.profile('core');records=n.expose_external('core',profile,self.steam,self.context)
|
||||
~~~~~~~~~~~~^^
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tests/test_native_package_external.py", line 25, in prepare
|
||||
self.authored=n.copy_payload(self.root,self.session)
|
||||
~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tools/native_package.py", line 172, in copy_payload
|
||||
with destination.open('xb') as output:
|
||||
~~~~~~~~~~~~~~~~^^^^^^
|
||||
OSError: [Errno 122] Disk quota exceeded
|
||||
|
||||
----------------------------------------------------------------------
|
||||
Ran 17 tests in 3.118s
|
||||
|
||||
FAILED (errors=13)
|
||||
Traceback (most recent call last):
|
||||
File "/tmp/erri-medical-ui-2223/run-suite.py", line 33, in <module>
|
||||
try:module.check()
|
||||
~~~~~~~~~~~~^^
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tools/check.py", line 92, in check
|
||||
subprocess.run([sys.executable,str(ROOT/'tests'/name)],check=True)
|
||||
~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/tmp/erri-medical-ui-2223/run-suite.py", line 24, in track
|
||||
try:result=original(args,*a,**kw)
|
||||
~~~~~~~~^^^^^^^^^^^^^^
|
||||
File "/usr/lib/python3.14/subprocess.py", line 578, in run
|
||||
raise CalledProcessError(retcode, process.args,
|
||||
output=stdout, stderr=stderr)
|
||||
subprocess.CalledProcessError: Command '['/usr/bin/python3', '/home/jakub/devel/escapistsrereintroduced/tests/test_native_package_external.py']' returned non-zero exit status 1.
|
||||
PASS: 37 prefabs have unique saved root entity IDs
|
||||
PASS: 299 original script entries tracked across 18 unfinished responsibilities
|
||||
PASS: 1 isolated addons, acyclic dependencies, 60 unique resources, exact vanilla/authorized external references
|
||||
Suite exit 1 programs 135 unchanged True
|
||||
Reference in New Issue
Block a user