Files
jakub 6a667d8deb Capture current mission, AI, map and administration development
Include the current addon, terrain integrations, tools, regression tests and recorded development evidence.
2026-10-13 22:52:53 +02:00

55 lines
9.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Smoke-signalled rescue extraction
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.
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.
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.
## Validation
`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.
Use `-errRescueSignalOnly 1` alongside the probe flag for just the countdown/smoke/dispatch checks.
`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.
`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.
`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.