Harden base progression and cleanup; validate finite physical resupply
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
# Native powered flight feasibility
|
||||
|
||||
This new WORKBENCH-only experiment uses the fixture pilot's **native CharacterInputContext** collective/cyclic/anti-torque inputs. It does not move an aircraft by setting velocity, angular velocity, transforms or angles, and does not copy original Escapists flight code. Native compilation and actual powered flight remain unverified.
|
||||
This new WORKBENCH-only experiment uses the fixture pilot's **native CharacterInputContext** collective/cyclic/anti-torque inputs. It does not move an aircraft by setting velocity, angular velocity, transforms or angles, and does not copy original Escapists flight code. The initial probe compiles in archived 090203, but refuses all initial pad candidates before spawning its test aircraft. A later pad-search revision fails compilation in 090705; the corrected helper compiles in 091306 and the 128-point survey runs but refuses all candidates in 091819. The 208-point refinement compiles but refuses all candidates in archived 093319. The 377-candidate revision finds a safe airport pad in the 093749 run, then fails its immediate compound native-component/seat/fuel check before creating a pilot. Actual powered flight remains unqualified.
|
||||
|
||||
This supersedes the earlier aircraft audit's overly broad suggestion that no direct flight controls were exposed. A search confined to vehicle controllers missed the character input layer. There is still no demonstrated stock helicopter route/landing AI activity, but actual script-callable flight inputs exist:
|
||||
|
||||
@@ -13,9 +13,9 @@ This supersedes the earlier aircraft audit's overly broad suggestion that no dir
|
||||
|
||||
## Experiment
|
||||
|
||||
Core-only opt-in outcome `powered-flight`, `-errBaseSmoke 1`. A separate real vanilla unarmed Mi8 is spawned once on one of twelve bounded clear/flat candidate pads 120 m from the registered extraction aircraft. The real extraction aircraft and player are untouched. One stock USSR character (the already-resolved vanilla mortar crew character resource, not a claim of pilot-specific clothing) is created through the actual pilot seat's native `SpawnCharacterInCompartment` mechanism into its own initially empty USSR group. No HQ response system is involved in this flight-mechanism test.
|
||||
Core-only opt-in outcome `powered-flight`, `-errBaseSmoke 1`. A separate real vanilla unarmed Mi8 may be spawned once only after a bounded candidate search finds a clear, flat pad apart from the registered extraction aircraft. The initial twelve candidates at 120 m all fail in archived 090203. The 128-point survey at 120–500 m compiles but finds no acceptable pad in archived 091819. The current draft tests at most 377 candidates: those 128 coarse points followed by 80 points in a fixed local grid around the frozen best above-water coarse sample, then 169 points in a 13-by-13 airport grid at 50 m spacing. The airport center comes from installed vanilla Everon location data; each point must independently pass the same clearance checks. It retains the 0.8 m terrain-difference limit and increases the clearance column to 40 m radius and 60 m swept height. See [pad survey](powered-flight-pad-survey.md); the 093749 runtime log records candidate 213 passing the unchanged pad checks, but its later fixture initialization fails. The real extraction aircraft and player are untouched. One stock USSR character (the already-resolved vanilla mortar crew character resource, not a claim of pilot-specific clothing) is created through the actual pilot seat's native `SpawnCharacterInCompartment` mechanism into its own initially empty USSR group. No HQ response system is involved in this flight-mechanism test.
|
||||
|
||||
Initial physics wakes once and must settle naturally. The probe waits for actual original pilot ownership/seat/one-agent group, real finite fuel and strict grounded readiness. It then requires both real native preparation hooks to run and native input readback to match. Only then it makes **one normal engine-start request**, waits for real engine/rotor spin and observed fuel use, and applies a conservative newly authored height/velocity feedback controller to native inputs.
|
||||
After allocating one airframe and one empty group, initialization polls the same native components for up to 30 seconds. It enumerates actual root pilot slots and selects the audited stock prefab object name `PilotCompartment`, requiring an accessible, empty, unreserved, unlocked PILOT slot. The stock copilot also has PILOT type and is deliberately excluded. Only once the simulation is valid and actual fuel exists does it request one native pilot spawn, latched before the request. The shared 30-second bound is not renewed for seating or settling; the controller’s active pilot assignment must subsequently match that exact occupied primary seat. Initialization logs separate simulation, seat, active assignment and fuel state every two seconds. Initial physics wakes once and must settle naturally. The probe waits for actual original pilot ownership/seat/one-agent group, real finite fuel and strict grounded readiness. It then requires both real native preparation hooks to run and native input readback to match. Before engine start, a new guard measures the complete native model/rotor envelope and requires its radius plus initial displacement, planned 8 m drift and a 1 m margin to fit the cleared 40 m corridor, with the corresponding 60 m height bound. This guard is still awaiting native evidence. Only then it makes **one normal engine-start request**, waits for real engine/rotor spin and observed fuel use, and applies a conservative newly authored height/velocity feedback controller to native inputs.
|
||||
|
||||
The target is 8 m above the aircraft's initial resting origin; success requires 7–9 m altitude, no ground contact, bounded speed/tilt/drift continuously for five seconds, then descent through inputs only. Landing requires native ground contact plus low speed/angular velocity/upright attitude continuously for two seconds, followed by normal engine shutdown. Input bounds and feedback signs are experimental; wrong input mapping, missing callbacks, ineffective input application, drift or failed hover must produce a retained failure, never a physics-position correction. Native setters do not document full numeric/direct-mode semantics, so both response and tuning require native evidence.
|
||||
|
||||
@@ -25,6 +25,56 @@ The run is bounded to 240 s after fixture creation (30 s preparation, 5 s callba
|
||||
|
||||
## Evidence limits and next work
|
||||
|
||||
Four local tests pass: exhaustive actual authority gate, actual bounded input/height/hover/contact-landing policies, and source guards against physical driving/global input/force-start/fuel-health mutation. They do not compile Enforce or prove native input persistence, cyclic signs, throttle/collective mapping or a flyable control law.
|
||||
Six local tests cover: exhaustive actual authority gate, actual bounded input/height/hover/contact-landing policies, and source guards against physical driving/global input/force-start/fuel-health mutation. They do not compile Enforce or prove native input persistence, cyclic signs, throttle/collective mapping or a flyable control law.
|
||||
|
||||
A native failure at the callback/input stage would identify a real integration blocker; a native failure during lift/hover requires reviewing logged actual inputs, RPM, internal position, fuel and motion, not relaxing success. No successful gate should be described as a full autopilot, route following, obstacle avoidance, HQ delivery, aircraft support acceptance or multiplayer proof. If takeoff/hover/landing works, the next independent layer is bounded attitude/position control and explicit loss tests before radio/HQ sortie integration.
|
||||
|
||||
## Archived attempts through 093319
|
||||
|
||||
[090203](evidence/native-2026-09-19-090203-flight-pad-refusal/report.json) compiles and reaches the Core fixture, with 51 prior assertions passing, but its original twelve candidates produce no acceptable separate pad. It records two failure assertions and no smoke completion. The refusal occurs before fixture aircraft/pilot creation, engine start or native control-hook observation; it supplies no flight, fuel-use or landing evidence. The production extraction vehicle is left untouched. The missing pad is a failed feasibility run, not a reason to relax clearance.
|
||||
|
||||
[090443](evidence/native-2026-09-19-090443-hq-proof-compile-failure/report.json) fails Game compilation first at `ERR_NativeHQResponseProof.c:236`, with repeated `Formula too complex` diagnostics and subsequent compiler errors. [090705](evidence/native-2026-09-19-090705-compile-failure/report.json) fails first at `ERR_NativePoweredFlightProbe.c:36` with `Unknown operator '%'` in the expanded pad search, followed by further compiler diagnostics. Both have zero runtime assertions/completions. Raw logs are preserved without filtering. Later source corrections are not qualified by these failures or by the earlier 085442 Core victory run.
|
||||
|
||||
Those three earlier archives retain matching launch/stopped source manifests and verified console hashes. The corrected helpers subsequently compile in [091306](evidence/native-2026-09-19-091306/report.json); [091819](evidence/native-2026-09-19-091819-flight-pad-refusal/report.json) runs the 128-point survey and rejects three low-ground and 125 sloped candidates (best height delta 0.803917 m), before reaching cylinder/sweep checks or spawning an aircraft. [093319](evidence/native-2026-09-19-093319-flight-clearance-refusal/report.json) compiles the 208-point/footprint draft but finds no safe pad: three low-ground, 182 slope and 23 cylinder rejections, with best terrain delta 0.0999985 m. Its 51 preceding assertions do not offset the two explicit fixture failures or establish flight. No aircraft is created and no measured-footprint guard is exercised. The later 093749 run observes the 377-point airport extension finding a safe pad, then fails before pilot creation. Native control callbacks, engine startup, real fuel consumption, takeoff, hover and landing still require successful source-bound observations. No production aircraft support or multiplayer claim follows from these attempts.
|
||||
|
||||
## Deferred native initialization after 093749
|
||||
|
||||
The 09:37:49 run finds the safe airport point `<4800.95,27.8202,11487.4>` on candidate 213 and allocates its single airframe/group. The immediate readiness assertion then fails in the same millisecond. Because the old assertion combined simulation, controller-selected seat and fuel predicates, that evidence does not identify the failing predicate. Installed `GetPilotCompartmentSlot` documentation does not promise that an empty primary seat is available through the controller immediately after spawning.
|
||||
|
||||
The staged correction separates component observation, one-time pilot allocation and actual occupied-seat authorization. The installed `BaseCompartmentManagerComponent.GetCompartments` API and `ExtBaseCompartmentSlot.GetCompartmentName(false)` enumerate native slots and their prefab object names; the audited Mi8 root names its primary slot `PilotCompartment` and copilot `Passenger_m01Cargo`. This changes no controls, survey limits, footprint gate, fuel, health or transforms. It does not retry aircraft or pilot creation. Local tests verify those sequencing and ownership constraints; native compilation and initialization success still require the next source-bound run.
|
||||
|
||||
## Seating timeout observed in 094843
|
||||
|
||||
The 09:48:43 run compiles the deferred initialization correction. At 09:49:34.776 the real root primary slot is accessible, empty and marked piloting; the copilot is separately identified. Simulation validity, fuel manager, controller-selected slot and finite fuel (1938.75) are present. One native pilot allocation succeeds. Stage 1 then reaches its unchanged 30-second seating/ground-settling deadline at 09:50:04.576. This establishes neither occupied-seat ownership nor settled ground contact: the old compound wait did not log those individual predicates. It also disproves any assumption that the controller's pilot-slot getter necessarily requires an occupant, because it returns a slot before pilot creation in this run.
|
||||
|
||||
The staged diagnostic records every two seconds (plus the deadline) actual pilot/group identity, physical selected-seat occupancy, controller active slot, vehicle membership, native entry/exit state, life/consciousness, one-shot wake count and stability time. It also records entity and internal simulation transforms, physics activation/motion, native contact and the existing conservative parked-support result. At the deadline, the existing support helper adds wheel/terrain trace detail when applicable. This is read-only observation: no native action, AI state, transform, health, fuel, readiness predicate or timeout is changed.
|
||||
|
||||
Installed `BaseCompartmentSlot.SpawnCharacterInCompartment` activates the real agent, requests native `GetInVehicle`, and adds its control agent to the supplied group; a non-null return proves the request was accepted, not that occupancy persists on later ticks. Likewise, physics activation does not itself prove contact. The next diagnostic run must distinguish lost native seating/group membership from motion/contact rejection before choosing any behavioral fix. No engine start or powered flight has been observed in 094843.
|
||||
|
||||
## Queued group members identified in 095950
|
||||
|
||||
The 09:59:50 diagnostic run proves the primary pilot remains alive, conscious and in the intended group, but is outside the aircraft: occupancy and vehicle-membership checks remain false, with neither native entry nor exit in progress. The aircraft settles naturally and subsequently passes the strict readiness predicate. The group grows from zero to two, five and six agents despite the fixture allocating only one pilot. Installed `Group_USSR_Base.et` authors six unit slots, and `SCR_AIGroup.EOnInit` schedules those slots through its native spawn queue. Testing the immediate count for zero was therefore insufficient to establish an empty group.
|
||||
|
||||
The staged correction uses the installed memberless `{000CD338713F2B5A}Prefabs/AI/Groups/Group_Base.et` and explicitly initializes its USSR faction before activation. This prevents the unintended finite crew allocation at its source; no spawned actors are deleted or replaced to make counts pass. One native pilot allocation and all physical seat/authority checks remain required. The exact pilot control agent also receives one explicit permanent LOD 0/activation, following the existing physical mortar-crew setup; group LOD alone did not establish that member's LOD. Its prior setting is restored on Stop only while that pilot/group/aircraft remains unclaimed. Native LOD and activation telemetry are recorded. This addresses a source-supported distant-AI setup omission, but 095950 did not measure pilot LOD and does not prove LOD caused the missing occupancy. No boarding retry or seat lock is introduced.
|
||||
|
||||
A separate diagnostic limit remains: in 095950 the simulation's documented internal-physics transform reads as identity/origin zero while entity physics has settled at the airport. The existing footprint and flight checks are retained unchanged and must refuse inconsistent geometry; this patch does not treat that transform as verified world-space flight telemetry. Native compilation and single-pilot seating still await the next run.
|
||||
|
||||
## Native control domain and coordinate correction after 100422
|
||||
|
||||
The 10:04:22 run proves the corrected memberless group contains exactly one real pilot, seated in the primary cockpit, with its active native agent at LOD 0. Strict grounded readiness passes and both native preparation hooks execute. The applied-input observer records the same sequence with immediate collective readback −1 but later applied collective 0, and native MainRotorCollective 0. This establishes that a signed negative minimum does not survive the native apply phase; it does not establish a complete positive input response or a flight-capable controller.
|
||||
|
||||
The staged correction keeps the feedback controller's signed state, gains and limits, but encodes its final collective demand as `(clamp(signedDemand, -1, 1) + 1) / 2`, in [0, 1]. Startup and completed landing therefore command zero; cyclic and anti-torque remain signed. The startup check still requires the actual native input to equal the requested minimum in Direct mode. Native applied-input and rotor-signal diagnostics remain available unchanged. Positive collective response, engine start, fuel use and powered flight require a subsequent native run.
|
||||
|
||||
The same run shows why world geometry cannot use `VehicleBaseSimulation.GetWorldTransform`: its documented return is in **internal physics space**, and it reports origin zero/identity while the actual aircraft entity settles at the airport. All control pose, altitude, drift and complete-footprint measurements now read the actual aircraft's `IEntity.GetWorldTransform`, matching the coordinate space of native model world bounds and rotor PointInfo world transforms. Internal simulation pose is retained only as comparison telemetry. RotorGetTransform remains explicitly local, and native velocities/contact/RPM remain read-only. No transforms or velocities are written; no footprint, drift, tilt, altitude, landing or fuel gate is relaxed.
|
||||
|
||||
## Final native apply callback after 101342
|
||||
|
||||
The 10:13:42 run passes the exact complete footprint gate (110 entities, 93 meshes, 74 hitzones, complete radius 27.6823 m, initial drift 0.100174 m), issues one ordinary engine start, reaches native rotor RPM 196, and consumes actual fuel from 1938.75 to 1937.33. At 10:15:11 it fails the unchanged 8 m drift limit at 9.22315 m, with no stable hover or landing. This is a failed flight, despite the separate footprint/startup achievements.
|
||||
|
||||
Same-sequence native observations prove a broader overwrite than the earlier negative-input inference: sequence 543 writes positive collective 0.280161 but later reads zero; sequence 618 writes 0.631399 but later reads zero, while both cyclic commands also become zero. The preserved [0,1] command range is a bounded experimental choice; this run does not prove that the original negative input was merely domain-clamped or that the full input-to-thrust mapping is known.
|
||||
|
||||
The staged correction keeps native `OnPrepareControls` only as an exact-owned pilot observation counter. It moves the **sole** control integration and write path into the exact-owned pilot's native `OnApplyControls(owner, timeSlice)`, after calling the installed vanilla implementation. The generated CharacterController declaration and installed SCR override confirm this callback exists; its ordering relative to final engine consumption is not fully documented. Native proof is therefore still required, rather than assumed from the callback name. No integration or control write remains in Prepare; no ownership, seat, life, fuel or physics guard changes.
|
||||
|
||||
After native RPM/fuel proof, a new at-most-three-second stage requests 0.05 collective with zero cyclic/anti-torque. Before any climb it requires fresh real apply callbacks and the existing `MainRotorCollective` signal to agree with the nonzero request on distinct fixture ticks spanning at least 500 ms. Missing signals or continued zero values fail; no signal is created or assigned. Engine, drift, height, tilt and callback freshness checks remain active in this stage. The proof does not depend on the optional diagnostics flag. All later physical hover and contact-landing checks remain required. The overall 240-second bound remains unchanged.
|
||||
|
||||
Optional diagnostics now observe native input at the start of Apply before this callback's final writes, then capture the final immediate write readback. These two snapshots are explicitly labelled `beforeWrite`/`written`; neither is alone called downstream consumption proof. Existing rotor signals and the mandatory positive gate provide the later observation. The optional file no longer adds a second native OnApply override, preventing hook-chain ordering from obscuring the comparison. This revision has local source/policy checks only until its next native run.
|
||||
|
||||
Reference in New Issue
Block a user