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:
+43
-10
@@ -1,21 +1,54 @@
|
||||
# Extraction ownership and results
|
||||
# Smoke-signalled rescue extraction
|
||||
|
||||
Core owns `ERR_ExtractionService` independently of mission progression and HQ. The scenario registers one physical extraction vehicle during preparation. The service refuses subsequent assignment, including after loss. It never spawns a replacement. Once sites are prepared, starting the service validates the escape boundary and checks for a helicopter controller, pilot position and at least twelve pilot/passenger compartments. An unsuitable transport or invalid boundary prevents player spawning and rolls back authored site content.
|
||||
The radio countdown now prepares a rescue route. Rescue command announces preparations through the mission radio notification and, when configured, the existing TTS service. Players use their own smoke grenades to signal the pickup. The original continuous radio-defence countdown remains configurable.
|
||||
|
||||
`ERR_GameMode` ticks extraction before the empty-server pause, so a lost helicopter or a reserved disconnected occupant reaching the boundary can still resolve. Radio progress and normal mission work retain their empty-server behavior. Loss is terminal throughout the active mission, including prison and radio phases. Waiting until extraction to discover that its only helicopter is gone is no longer necessary. The mode publishes a specific replicated status/debriefing reason for helicopter loss or no remaining survivors.
|
||||
Preparation validates a clear pickup point but does not spawn a parked helicopter. Countdown completion reveals that exact point on the map. An activated smoke grenade thrown by a current prisoner within 25 metres of the marker signals extraction. Grenades already triggered at the spot before its reveal, unlit grenades, smoke above the site and signals outside the area do not qualify. Detection uses authoritative grenade state, not client particle rendering; grenade lifetime remains owned by the engine. Any normal smoke colour works. Detection runs once per mission tick only while awaiting the signal.
|
||||
|
||||
During extraction, the service checks the registered vehicle's position against the boundary and each registered participant's actual compartment occupancy. Boarding alone, crossing before the extraction phase, a dead occupant, a survivor left behind, or an unregistered NPC cannot produce a winning identity. Living unconscious occupants and reserved disconnected occupants can escape. The first qualifying boundary crossing freezes the identity snapshot and emits one `OnResolved` event; subsequent ticks do not award additional escapees.
|
||||
The server selects rescue aircraft and crew from the round's resolved prisoner faction, including a Random faction selection. Aircraft, AI groups and original pilots/gunners all retain that faction. They are not registered with enemy VirtualHQ.
|
||||
|
||||
| Prisoner faction | Transport | Armed escorts | Crew appearance |
|
||||
| --- | --- | --- | --- |
|
||||
| US Army | Two UH-1H Hueys | Two armed Hueys | US pilots |
|
||||
| RHS US forces | Two UH-1H Hueys | Two armed Hueys | RHS USMC pilots |
|
||||
| Soviet Army | One armed Mi-8 | Two armed Mi-8s | Soviet pilots |
|
||||
| RHS Russian forces | One black Russian Mi-8 | Two matching Mi-8s | RHS Russian pilots |
|
||||
| FIA | One Mi-8 with the Soviet flag removed | Two matching Mi-8s | Selected FIA faction crew |
|
||||
| ION | Two Hueys with civilian liveries | Two armed Hueys with matching liveries | Selected ION faction crew |
|
||||
|
||||
The Huey transports retain eight actual authored cargo seats each: sixteen across the pair, with no extra or overlapping seats. Mi-8 transports retain their fourteen cargo seats. The second Huey uses a separately surveyed landing point 90–170 metres from the smoke marker. Preparation requires room for both transports; generated terrain placement continues searching if a candidate has no suitable second pad. Dispatch checks the second landing area again and has a bounded retry if it has become obstructed. Approaches, cruise heights and departure destinations separate the aircraft. A lost assigned transport is not replaced.
|
||||
|
||||
Escorts respond to enemies actually perceived by their crew near the pickup. Native weapons/perception handle fire. Selected faction members supply crew where no dedicated pilot prefab exists, rather than dressing FIA or ION rescuers as Soviet pilots. Existing helicopter models are used; the RHS US profile uses Hueys rather than inventing a larger Western airframe or changing native seating layouts.
|
||||
|
||||
Pickup transports now align with the pad at a commanded horizontal speed of up to 14 m/s, previously 8 m/s. Once within 15 metres horizontally, their commanded descent can reach 9 m/s at altitude, previously 3 m/s. The existing proportional control smoothly reduces that descent below 30 metres and retains exactly the old gentle profile for the final ten metres. Actual motion also depends on native helicopter physics. The alignment requirement, upright settling, physical ground support and three-second boarding-readiness hold remain in place. Enemy reconnaissance/logistics helicopters, escorts and outbound rescue flights retain their existing flight profiles.
|
||||
|
||||
In the protected native Everon test, the two Hueys became boardable about 70 and 78 seconds after entering the landing phase (69.36 and 77.45 seconds on the simulation clock). The earlier profile took approximately 152 wall-clock seconds for the fleet, measured from ten-second log samples. This is roughly half the previous landing wait; it excludes initial dispatch/travel time and does not guarantee the same timing on every terrain or under combat damage.
|
||||
|
||||
The FIA Mi-8 also became boardable in about 80 wall-clock seconds (79.19 simulation seconds) in the revised-profile test. Both aircraft types retained native ground contact and the original stationary/upright checks before wounded loading.
|
||||
|
||||
The transports land near the mark, verify physical ground support and wait for every living roster participant. Players may board either assigned transport. Unconscious and reserved disconnected bodies also need boarding; casualty loading selects a nearby registered transport with a suitable bench and keeps the loading transaction bound to that aircraft. Mi-8 and Huey cargo benches are supported; pilot and gunner seats are excluded. Eight uninterrupted seconds with all survivors aboard and all transports landed starts departure. A passenger leaving during that interval resets it. When every living prisoner is aboard an outbound rescue, unconsciousness alone does not start the no-rescuer defeat timer; actual deaths and transport loss still apply. Passengers do not release the autopilot; taking a crew seat or changing the aircraft faction does. The flight ends after all assigned transports cross the existing escape boundary and are at least one kilometre away from the pickup. Only living registered participants aboard those transports receive the escape result. No player pilot is required.
|
||||
|
||||
After boarding, the helicopters retain the flight controller's ten-second takeoff hold before climbing. The rescue controller keeps them awake throughout that hold, as the base flight controller does, so a parked transport cannot return to physics sleep before the climb begins.
|
||||
|
||||
Results belong to backend account identities. `ConnectedWinners` maps those identities to their current authenticated connection records and rejects recycled IDs. It is an adapter for the native game-end API, whose transient ID array is not a durable result store. Successor UI delivery uses a replicated controller result derived from the server identity snapshot and tagged with the current mission replication ID. Audit/binding resets and republishes it; the end screen ignores stale native winner IDs and refreshes after delayed result updates. The actual local-controller/native-widget fixture passes; real reconnect/replication acceptance remains separate.
|
||||
|
||||
## Native development checks
|
||||
## Validation
|
||||
|
||||
`--project core --smoke extraction-capacity --rounds 1` uses real vanilla character entities and the authored Mi-8, with an isolated synthetic identity roster. The transport exposes 17 pilot/passenger positions; twelve characters successfully occupy separate native seats. A second case kills one occupant, disembarks another, makes a passenger unconscious, and reuses a disconnected account's connection ID for a different character. The expected partial result distinguishes ten living aboard escapees from three non-escapees; reconnect mapping follows identity rather than the recycled ID.
|
||||
`ERR_NativeRescueProbe` is an opt-in WORKBENCH-only fixture (`-errRescueProbe 1`). It uses the real mission, original player, radio countdown, native smoke grenade trigger, transport physics, native crew and passenger compartments. It checks old on-site, off-target and unlit smoke rejection, dispatch, physical landing, boarding and evacuation. The fixture disables player/rescue damage to isolate the route from random mission combat. Collision, ground support and compartment checks remain active. Fixture teleportation only moves the test player between objectives; it does not teleport the aircraft. This does not establish multiplayer replication, combat effectiveness, audible TTS or manual grenade throwing on every terrain.
|
||||
|
||||
This fixture requests its own end-of-test reset. Its use of native compartments, scripted consciousness and synthetic records does not establish manual boarding, piloting, medical treatment, twelve network clients, actual reconnects or UI replication.
|
||||
Use `-errRescueSignalOnly 1` alongside the probe flag for just the countdown/smoke/dispatch checks.
|
||||
|
||||
`--project core --smoke early-helicopter-loss` destroys the registered helicopter during prison while the actual local prisoner is alive. It expects the normal mission tick to reach defeat with the specific loss reason.
|
||||
`tests/test_rescue_capacity.py` executes the production seat collector against duplicate parent/child compartments and unavailable seats. `tests/test_rescue_boarding.py` executes the production boarding timer against missing passengers, disembark/reboard and clock rollback.
|
||||
|
||||
`--project core --smoke extraction-startup-failure --rounds 1` substitutes a real vanilla vehicle with insufficient seating only in the fixture's in-memory catalog. `extraction-boundary-failure` uses the proper helicopter with an invalid radius. Both are negative startup tests: they must retain PREPARING, withhold players and clear authored population/stock/scenery. Their expected startup ERROR is retained in the archived native report.
|
||||
`tests/test_rescue_factions.py` checks faction-specific aircraft and crew selection. `tests/test_rescue_landing.py` checks preparation-time fleet space and dispatch recovery from a blocked secondary pad. `tests/test_rescue_recovery.py` covers passengers split between transports, fleet loss and the requirement that both transports cross the escape boundaries. `tests/test_casualty_fleet.py` covers transport selection, existing casualty reservations and exact aircraft identity during loading.
|
||||
|
||||
The integrated [040928 native run](evidence/native-2026-09-19-040928/report.json) has 100 passing assertions across capacity, partial results, result widgets and time settings/progression, with no script/VM exceptions. Seven inherited vehicle resource errors remain.
|
||||
`tests/test_rescue_descent.py` executes the actual landing-velocity methods and verifies the faster pickup profile, continuous braking, unchanged near-ground commands, alignment gate and original behavior for escorts and outbound aircraft. It also checks settling across several simulation rates; its policy-only timings are not native flight measurements.
|
||||
|
||||
The old parked-helicopter capacity, early-loss and initial-placement fixtures describe the previous extraction design. Archived evidence is retained as historical evidence, not acceptance of this new rescue flow. The old fixtures must not be used to assert current progression.
|
||||
|
||||
The [2026-10-11 validation report](evidence/rescue-20261011/report.json) records a protected native end-to-end flight and final signal checks, along with their scope and remaining live-play checks.
|
||||
|
||||
The [2026-10-13 faction and fleet evidence](evidence/rescue-factions-2026-10-13/README.md) records the six-faction native aircraft/crew/capacity matrix and a protected two-Huey landing, wounded boarding and measured airborne departure. The final departure check requires both transports to climb above ten metres with engines running, no ground contact and their original passengers retained. Its [source-bound report](evidence/rescue-factions-2026-10-13/report.json) retains failed fixture attempts, existing engine errors and additional asset warnings. These checks do not qualify remote casualty ownership, twelve simultaneous players, escort combat or the complete two-transport journey across the escape boundary.
|
||||
|
||||
The subsequent [faster-landing evidence](evidence/rescue-landing-2026-10-13/README.md) measures the revised descent with actual engine position, velocity, attitude, ground-contact and boarding-readiness observations. It retains the old timing samples, exact source hashes and complete diagnostics, including native errors; passing behavior does not imply a clean strict engine report.
|
||||
|
||||
Focused rescue/casualty tests, the source-bundle check and the rescue resource-reference audit passed. The repository-wide `tools/check.py` remains blocked by the existing missing saved root entity ID in `Prefabs/Items/Equipment/ERRM_AtlasLeaf.et`; this change does not modify that prefab.
|
||||
|
||||
Reference in New Issue
Block a user