flight: the toy 767 flies, breaks and answers every device
The airframe slice, end to end.
Launcher: steer x trims the heading, steer y trims the launch elevation, and
Launch throws the toy along the nose it is pointing. Every sign was read back
off the running airframe rather than assumed.
Flight: a force-driven arcade model. The nose follows the stick, the velocity
is pulled onto the nose over followTime, the wings hand back the share of
gravity they carry, Boost adds speed and Dive spoils the lift. The speed the
model asks for is clamped to the Rules.PHYS envelope before a Newton is spent,
and anything above the cap is taken back the same frame. Bounded authority, so
a block still knocks the toy off its line. Once it has been scraping the table
for a moment the model stands down and lets friction end the round.
Damage: contacts past impactThreshold raise impact on the bus and fill a damage
pool; each whole point sheds the part the hit landed nearest, hiding the art
slice's child and dropping a bounded loose copy with partLost. A missing wing
costs lift, authority, and rolls the toy toward the hole; a missing engine
costs half the thrust; a missing tail costs the pitch damper. Loose parts are
speed- and spin-clamped every frame and culled below the playroom floor.
Pause freezes this airframe where it hangs and hands its speed back on resume.
Controls carry keyboard, gamepad and touch on every action: Boost moved to the
right trigger, the stick got a radial deadzone and smoothing, and the touch
column reads Launch (large) / Boost / Dive / Menu down the right edge. The map
still suppresses the engine's walking scheme.
Verified in play at 1080x1440, with each input family alone: aim, launch,
climb, bank, boost, dive and pause on keyboard, on a simulated pad and on the
on-screen controls; a run into the city shed a wing and an engine and the toy
visibly spiralled after; Physics.bodyState never read past
Rules.PHYS.planeBoostSpeed over a boosted run; every round ended in wreck with
the next plane back on the launcher; 150 rigid bodies, none with ccd = true.
---
playroom-set: the window is lit and the table is not in its shadow
Model carries a castsShadows field. It is not in the Model component README's
list of public fields, and reading the render-layer documentation - which says
a layer hides an entity from a camera 'while it still exists for lighting,
shadows and physics' - had settled the question the other way. So the emissive
pane outside the window had been removed: it stands between the low sun and the
only opening in the room, and it shadowed the whole table, opaque or transparent.
With castsShadows = false on that one mesh the window is the brightest thing in
the game again and the sun still rakes the full length of the table. The sky
itself drops to a dim warm fill, which is what it should have been all along -
its image-based light reaches an enclosed room as though the room were not
there, so it was the sky's brightness, not the window's, that was flooding
every painted surface.
Luma spread at the launcher station goes from 75 to 113, with nothing crushed
and nothing clipped. The grade still costs 0.16 ms of GPU per frame.