Include the current addon, terrain integrations, tools, regression tests and recorded development evidence.
142 lines
12 KiB
JSON
142 lines
12 KiB
JSON
{
|
|
"recommendation": "One paired temporary armed checkpoint using two original UAZ escorts from one already admitted convoy. Extend the existing bounded mounted interception controller; do not create a parallel force system.",
|
|
"why_missing": {
|
|
"owned": "EAI_HQRoadblocks.Assemble chooses2 UAZ PKM vehicles, third BMP after6 losses; Plan assigns distinct road positions; UpdateUnit waits actual boarding/travel then holds and lets an engineer work.",
|
|
"current": "ERR_HQMountedDispatch owns exactly one order/unit/task/downlink; ReserveIntercept rejects any existing intercept token globally. Thus no coordinated two-vehicle checkpoint can be formed. Infantry road holds and one original finite engineer mine attempt are already implemented separately.",
|
|
"props": "No barricade prop creation found in the inspected owned EAI_HQRoadblocks implementation. Do not cite the stale missing-props row as evidence that a prop-spawning feature must be recreated."
|
|
},
|
|
"player_visible_result": "When two original armed escorts and two existing HQ slots are available, HQ may coordinate a spaced pair at one predicted road corridor. Both real downlinks must finish and both original destinations/owners revalidate BEFORE either detour begins. Checkpoint-ready requires both physically arrived; no guaranteed lane blockage.",
|
|
"scope": {
|
|
"active_jobs": 1,
|
|
"vehicles_per_job_max": 2,
|
|
"original_slots": [
|
|
0,
|
|
3,
|
|
5
|
|
],
|
|
"same_original_convoy": true,
|
|
"deadline": "Keep existing absolute ObservedAt+120000; never extend on second delivery/arrival.",
|
|
"attempts": "Existing belief+revision attempt ledger remains bounded/spent; tokens monotonically allocated from existing400001..400256 domain, one per actual member. Stop planning if fewer than required IDs remain; no collision/reuse.",
|
|
"fallback": "Preserve current single-escort behavior when a complete pair cannot be admitted BEFORE any claims/downlink; never silently replace a failed partner after commitment.",
|
|
"excluded": [
|
|
"New forces or vehicles",
|
|
"BMP deployment/escalation",
|
|
"Barricades or scenery spawning",
|
|
"Extra ammo/mines or stock refill",
|
|
"Engineer placement resets",
|
|
"Player/target live-position reads",
|
|
"Teleport/SetAngles/forced native arrival",
|
|
"Permanent checkpoints or longer-lived memory"
|
|
]
|
|
},
|
|
"implementation_boundaries": [
|
|
{
|
|
"file": "addons/core/Scripts/Game/ERR/10_AI/ERR_HQMountedIntercept.c",
|
|
"methods": [
|
|
"ERR_HQMountedInterceptRules.Select",
|
|
"FromPolyline"
|
|
],
|
|
"change": "Optional paired selection returns exactly2 separate positions on the same retained real polyline, sampled along arc length (not a chord across bends). Require nonoverlapping existing conservative vehicle footprints and >=40m separation, each ahead/dry/clear/non-elevated/outside settlements, each80m from unrelated reservations. Treat partner spacing inside this single owned plan explicitly, without weakening global Unreserved. Keep<=128 roads/4096segments and<=2survey calls per planning pass. If two valid slots absent, use existing single selection unchanged."
|
|
},
|
|
{
|
|
"file": "addons/core/Scripts/Game/ERR/10_AI/ERR_HQMountedDispatch.c",
|
|
"methods": [
|
|
"PlanMountedIntercept",
|
|
"TickMountedIntercept",
|
|
"ReleaseMountedIntercept",
|
|
"Assigned",
|
|
"HuntingAssigned",
|
|
"ReserveUnit",
|
|
"Status"
|
|
],
|
|
"change": "Bounded1or2-member job. Same original convoy and same delivered belief; require2free slots under unchanged global8/lower runtime caps, two native radio routes, original armed status and no logistics/combat ownership. Pair uses both-delivered barrier: neither moves on first receipt. Revalidate both and commit only once both routes arrived within original deadline/freshness. Precommit interruption releases claims with ordinary travel untouched. Postcommit loss uses existing explicit cancellation, never substitutes partners or renews deadline. Count pending/delivered members individually; singleton fallback chosen before claims only."
|
|
},
|
|
{
|
|
"file": "addons/core/Scripts/Game/ERR/10_AI/ERR_ConvoyService.c",
|
|
"methods": [
|
|
"ReserveIntercept",
|
|
"InterceptEligible",
|
|
"InterceptCurrent",
|
|
"ReleaseIntercept",
|
|
"ERR_ConvoyVehicle.DeliverIntercept",
|
|
"TickIntercept"
|
|
],
|
|
"change": "Add all-validated pair reservation and prepare/commit for exactly2 owned detours. Preallocate both native waypoint entities before installing either, recheck exact original identities/HQ tokens. Failures before commit clean only prepared handles and exact pair claims, with existing route unchanged. Keep singleton API. Global interception exclusion permits only the exact pinned partner, not arbitrary parallel tokens. Existing per-vehicle arrival/route-index/expiry stays."
|
|
},
|
|
{
|
|
"file": "addons/core/Scripts/Game/ERR/10_AI/ERR_SupplyConvoyColumn.c",
|
|
"methods": [
|
|
"Tick"
|
|
],
|
|
"change": "Prefer no algorithm change: verify existing detached-member partition handles two intercepted originals, remaining leader loss and sole returning survivor without rewinding the surviving column. Only change if actual-method regression demonstrates a concrete issue."
|
|
},
|
|
{
|
|
"file": "addons/core/Scripts/Game/ERR/10_AI/ERR_SupplyConvoyTactics.c",
|
|
"methods": [
|
|
"combat ownership/Stop gates"
|
|
],
|
|
"change": "Prefer no production change: verify any intercept prevents conflicting whole-task combat/logistics control exactly as current code. Ensure pair termination clears both owned interception claims before native whole-task combat may take over."
|
|
}
|
|
],
|
|
"atomicity_and_cleanup": [
|
|
"Prevalidate both HQ units, orders, stock evidence, paths and two-unit capacity before claims. No temporary pool-budget change or extra physical entity.",
|
|
"During the two-delivery barrier BOTH members retain ordinary authored travel. Only after both receipts and prepared waypoint commit do their owned detours replace ordinary travel. Arrival requires each exact original entity at its destination.",
|
|
"Pair cancellation uses existing exact-token ReleaseIntercept and HQ LogisticsReservation checks, even if one original has already independently released. Never adopt replacement group/entity/waypoint.",
|
|
"Source ammo is untouched: readiness checks same immutable delivered mounted-ammo snapshot and native original crew binding; actual firing consumes native mounted ammunition. No new supply ledger.",
|
|
"Stop/round owner replacement must release pair before normal service teardown; survivor ownership follows current reviewed convoy policy, not a new roadblock-specific policy."
|
|
],
|
|
"regression_design_only": [
|
|
"Current code demonstrates absence: first claim succeeds; second original escort ReserveIntercept fails because an active token exists. This is a feature baseline, not an existing bug assertion.",
|
|
"Pair atomic admission rejects insufficient squad/token capacity, stale/unknown/disarmed delivered status, busy sibling task, foreign/captured actor or second claim failure without disturbing original route/foreign claims.",
|
|
"First real radio delivery must not create a detour. Second failed/late delivery releases pair claims while both ordinary routes remain. Both timely receipts plus revalidation required to commit either detour; native waypoint2 creation failure leaves waypoint1 uninstalled and cleaned.",
|
|
"Actual geometry controls bends/short polyline/obstructions/bridge-height/water/settlement, bounded query work and deterministic spacing.",
|
|
"Two-detached column tests: remaining leader survives, leader dies, each return order, both return same tick, no ordinary column rewind.",
|
|
"Expiry, capture, Stop twice, original crew loss and native waypoint failure clean only owned handles; no registration, stock, receipt or deployment count increase."
|
|
],
|
|
"qualification_limits": [
|
|
"A pair does not recreate airport force spawning, BMP escalation, separate engineer detachments, four-mine flanks or full owned roadblock parity.",
|
|
"Existing single-intercept native witness has not yet demonstrated complete driving/hold/resume. Offline pair tests do not resolve that physical acceptance gap.",
|
|
"Native navigation may not achieve chosen offsets or block traffic. Describe as paired armed interception until actual arrival/hold evidence exists."
|
|
],
|
|
"decision": "Implementable coherent follow-on, but larger than a one-line fix; do not hide claim/radio/capacity work behind a second ReserveIntercept call. Plan only this turn.",
|
|
"writes": {
|
|
"target": false,
|
|
"original": false,
|
|
"tests": false,
|
|
"native": false
|
|
},
|
|
"source_sha256": {
|
|
"/home/jakub/devel/escapists/escapists-ai/Scripts/Game/EscapistsAI/EAI_HQRoadblocks.c": "128776f0b448162ee36cfc71b2a38d2cd06d6d6e4679253f215896aa3fcabb98",
|
|
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQMountedDispatch.c": "e98e931e010124ba567f415690999b96868f32a18edc7c4e1f21c0775b3c095f",
|
|
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQMountedIntercept.c": "c239aaad0ac556744f76b94286c6f204be51b51acdf44e788ca794c2ae967eae",
|
|
"addons/core/Scripts/Game/ERR/10_AI/ERR_ConvoyService.c": "e503e3a2eeaff638dee7fac6830cfbac6b8d87402e1191ff65aaa9961d9e0b86",
|
|
"addons/core/Scripts/Game/ERR/10_AI/ERR_SupplyConvoyColumn.c": "35678ec625fb0a3c0871e2c373fcff49816440a97a165ed25c8798dd72ef059f",
|
|
"addons/core/Scripts/Game/ERR/10_AI/ERR_SupplyConvoyTactics.c": "dc3acdffc8ca48f11b131f66d30d679ca68f3b3004344bdc78723bc9305915e0",
|
|
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQRoadIntercept.c": "0897e82d7805ef56f05f2b9c23903280285ea6bfa51796a2df86bb564ece78f7",
|
|
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQ.c": "5d66c53baf8762e76ae59e28721edaa348014af6d988d42891d9a84a6cf44969"
|
|
},
|
|
"production_change_count": 3,
|
|
"production_changes_required": [
|
|
"ERR_HQMountedDispatch.c: bounded member/job state, Plan/Tick/Release, Assigned/HuntingAssigned/ReserveUnit/Status.",
|
|
"ERR_HQMountedIntercept.c: paired same-polyline destination selection; existing eligibility/deadline constraints retained.",
|
|
"ERR_ConvoyService.c: atomic pair reservation and pair waypoint prepare/commit; exact-current/release compatibility."
|
|
],
|
|
"review_or_tests_only": [
|
|
"ERR_SupplyConvoyColumn.c",
|
|
"ERR_SupplyConvoyTactics.c",
|
|
"ERR_HQ.c global admission policy: unchanged current8force cap and runtime lower limits."
|
|
],
|
|
"delivery_barrier": {
|
|
"phases": [
|
|
"Validate complete pair, available2slots and fresh delivered status/history.",
|
|
"Atomically reserve both exact original crews; pending claims count2 but neither changes ordinary travel.",
|
|
"Advance both actual downlinks independently. First delivered receipt is latched only; no detour waypoint yet.",
|
|
"If second route fails/expires or either identity/claim changes, discard queued pair and release only exact claims. Neither escort has moved due to checkpoint, so no invented instantaneous recall.",
|
|
"After both routes delivered within unchanged fixed validity limits, revalidate both and prepare both native move waypoint entities without installing either. Any allocation/preflight failure deletes only prepared waypoints and preserves normal authored orders.",
|
|
"Commit both prepared detours during same service operation; use existing original-crew/order ownership checks. Native Group.AddWaypoint offers no transactional guarantee\u2014post-commit ownership loss remains normal explicit cancellation, not asserted atomic movement."
|
|
],
|
|
"deadline": "No renewal; original ObservedAt+120000 and command delivery freshness still apply.",
|
|
"quota": "At admission and commit require Assigned()+2 and HuntingAssigned()+2 within current limits (global maximum8). Pending reservations count2, and failure releases exact2 without consuming ongoing occupancy; attempt remains spent to avoid retry loops."
|
|
}
|
|
}
|