Integrate physical radio calls and finite vehicle maintenance

This commit is contained in:
2026-09-20 06:37:17 +02:00
parent 963cab50c0
commit 915476f709
152 changed files with 26426 additions and 28 deletions
+16
View File
@@ -36,3 +36,19 @@ The [archived full-addon native run](evidence/native-2026-09-20-050906-convoy-se
This demonstrates normal startup execution and detection of physical magnified optics, not successful new attachment insertion. The physical-presence check runs before the callback check and uses the same event for preexisting and newly fitted scopes; the journal does not record actor/rifle identity or whether a request preceded confirmation. The 53 deadlines likewise do not distinguish an incompatible mount from other unconfirmed startup outcomes. The preservation path performs no insertion when a scope is already observed; a separate before/after observation of the same rifle would be required to qualify a new native insertion. No additional fixture or resource manipulation was performed for this checkpoint.
The [final full-addon checkpoint](evidence/native-2026-09-20-053057-optics-security-hq-integration/report.json) compiles all current optics, vehicle and diagnostic classes and completes 56 HQ-memory assertions with zero script/runtime failures. Four installed external localization errors remain. This does not add new optic-insertion or multiplayer evidence.
## One-time group radio fitting
`ERR_EnemyRadio` adapts the owner's one-basic-set-per-group behavior and distributed relay allocation. The inspected source sections are the radio capability helper and `LogConnection` relay block in `escapists-ai/Scripts/Game/EscapistsAI/EAI_HQ.c` (SHA-256 `4898ac471fb16433fc5d98244a8cec89c5e8e006af2c94bbcd89113a2b7107c8`) and the basic radio allocation block in `EAI_HQStatus.c` (SHA-256 `7127dcf23be7bcbb9415d8ef6c8f1da5bec551fbf16fc1054487dcd7a877d885`). Original files remain read-only. Original game-mode/helper dependencies and the unbounded later status retry are replaced with successor ownership and bounded startup state.
HQ passes its stable registration ID to the existing equipment coordinator. A group whose positive ID is congruent to one modulo four is selected once for a manpack; other groups need only a basic radio. Duplicate registration cannot change that selection. The service uses the existing three-second equipment cadence, at most five checks, a completed native roster of at most 32 original soldiers, and at most 256 inventory items per soldier. There is no independent timer, tactical order or force creation.
Candidate actors must first receive their canonical equipment entry. That coordinator retains exact-actor tombstones, so transferring a previously bound soldier into another newly registered group cannot grant it another pending radio. The radio service freezes the original complete crew, rejects changed/duplicate/dead/captured membership, and stops permanently on teardown. Unknown inventories block a new grant. Native default-loadout radios are inspected first: an existing basic set satisfies the basic allocation permanently, and an existing manpack satisfies both allocations. Removing that observed equipment does not reopen the allocation.
Only the already-catalogued vanilla R148 (`E1A5D4B878AA8980`) and R107M (`54C68E438DD34265`) are requested; exact installed RDB path/GUID pairs were independently verified. Native `CanInsertResource(..., PURPOSE_ANY)` must accept a resource before insertion through the same actor's inventory manager. No occupied item is removed to make room. A selected manpack is attempted before a missing basic set, with a basic fallback if no original carrier has a fitting untried manpack slot. At most one native request may be submitted for the whole group per check, and each original actor/resource pair is attempted at most once.
An accepted pending request blocks all other group radio requests. Explicit failure permits another original carrier before the fifth check, while callback success permanently spends that allocation even if the radio is removed before observation. The fifth check observes only; an unresolved accepted insertion is quarantined and is not repeated after deadline, Stop, group transfer or a late callback. Basic and relay allocations remain separate: an already observed basic set is never replaced, although a previously selected optional relay allocation may still finish during startup. Native operations already accepted cannot be cancelled by this service.
Mortar groups explicitly opt out when HQ registers them: their existing readiness service owns gunner handsets and requires a dedicated physical RTO manpack. This prevents competing startup grants. Normal authored site/convoy radios are preserved by actual inventory inspection. HQ networking continues to derive capability solely from living physical carriers and inventories; fitting never declares a delivered report or invents a route.
Journal outcomes distinguish an already equipped group with zero requests, recorded native callback completion, physical capability observed after a request without proven insertion provenance, and unresolved pending timeout. `tests/test_enemy_radio.py` executes the actual radio service and equipment coordinator against native API doubles, including cross-group pending-carrier transfer, no selection reroll, existing equipment/loss, malformed inventory/roster, explicit failure, success after removal, callback ordering, deadline and mortar opt-out. `tests/test_enemy_equipment.py` retains its separate equipment lifecycle regressions. The [native call/memory run](evidence/native-2026-09-20-062203-radio-call-memory/report.json) compiles this service and completes 59 assertions, with all six site groups reporting existing radios and zero new requests. Actual physical routes and interruption are exercised. New compatible insertion and ordinary/multiplayer loss/capture behavior remain pending. Four external localization errors remain; there are no script/runtime failures in this run.