@jgengine/convex 0.50.0 → 0.51.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -26,6 +26,1249 @@ At publish, rename this heading to the new version and mirror the entries into
26
26
  `packages/core/src/meta/changelog.ts` (the typed `CHANGELOG` export).
27
27
  -->
28
28
 
29
+ ## 0.51.0
30
+
31
+ ### Migrate
32
+
33
+ - **Bump lockstep SDK packages to `^0.51.0`:** `@jgengine/{core,rapier,react,ws,node,sql,convex,shell,editor,assets,navbake}`. CLI `jgengine` is `0.48.0`; `@jgengine/github` is `0.38.0`.
34
+ - @jgengine/core/breeding/inheritance is now @jgengine/core/inheritance/inheritance; inheritStats is inheritValues (result .values, options defaultRule and mutation.fields/amount, no 0.55 default) and scatterLevels is scatterPoints
35
+ - `QUADRUPED_GAIT_TRANSITIONS` is gone: use `WALK_TROT_FROUDE` for walk–trot and `trotGallopSpeed(mass)` for trot–gallop
36
+ - `muscleMetabolicPower(spec, state)` is now `muscleMetabolicPower(state)`
37
+ - BROADLEAF_GENERATOR, BROADLEAF_SCHEMA, CONIFER_GENERATOR and CONIFER_SCHEMA are gone; map a scatter item to { generator: "plant.grown", params: { species, age, ...look } } instead
38
+ - GrassSpecies is now GroundCoverSpecies in plants/groundCover/groundCoverSpecies; each record needs habit and seedEstablishment.
39
+ - replace nature.bush scatter items with plant.grown and a shrub species
40
+ - LLMville saved keybinds move from the `llmville` key to the shell's `LLMville` key once, and `moveBackward` becomes `moveBack`
41
+ - LLMville's Convex function paths change for the production switch: `jgengine/runtime:*` becomes `runtime:*`, presence moves to `presence:list/sync/leave`, chat to `multiplayer/worldChat:messages/sendMessage`; no schema change
42
+ - partsGeneratorFor is now placedGeneratorFor; registerPlaceableGeneratorOutput opts a new output family into marker placement
43
+ - landform snapshots are version 4 (iceEastScale and iceSouthScale replace iceFlux); GlacialParams.iceYears and iceSteps are replaced by iceStep, ela is optional when elaHistory is given, and the default erosion constant is 1e-4·50^(1−l)
44
+ - difficultyProfile(tiers, tier, overrides) takes the game's tier record; EncumbranceConfig.soft/floor, CarryableConfig.carryCapacity and createPlotPermissions ladder/editor/guildDefault are required
45
+ - Authored fire areas: `position` is now the grid's corner, `config` keeps only `cols`, `rows` and `cellSize`, and `burnRate`, `spreadRate`, `wind` and `extinguishRate` are gone. Set `fuel` (a standard fuel model code such as `"GR2"`, or one code per cell), `moisture` (a `MOISTURE_SCENARIOS` code, default `"D2L2"`) and optionally `climate` (`airTemperatureC`, `relativeHumidity`).
46
+ - bodyTemperature needs the game's own steps; see Fernwild's for the old values
47
+ - TurfWarDecl.contestedGrip is required; pass the grip your blocks read as contested (the old value was 30)
48
+ - pickSpawnPoint is gone; use the spawn point selection in waves/spawnPoint built on distanceBiasRegion
49
+ - runPipeline is gone; use foldStatContributions or a statGraph
50
+ - landform snapshots are version 5 and add iceSliding and iceTurn
51
+ - landform snapshots are version 3 and carry iceFlux; older snapshots no longer restore
52
+ - PLANT_SIM_VERSION is 2, so version 1 plant snapshots no longer restore; grow them again
53
+ - asset:person_* and character/* references become libraryModel("human/..."); every game moved off the cartoon figure, and Fernwild no longer shows a bow or sword the player does not have
54
+ - DEFAULT_REPUTATION_TIERS and DEFAULT_MOOD_TIERS are gone; pass your game's tier list to createReputationLedger, StandingTrackDef.tiers, moodTierOf, readMood, createMoodReader, createAgent mood and createAgentSystem mood
55
+ - game/breeding.ts is gone; BabyStage, babyStage, mode, eggHealthSeconds and multiples are gone from breeding/breeding.ts; pass stages, a litter(rng) callback and a conceive callback (use inheritValues) to createBreedingField; saved babies are offspring and imprint is bond
56
+ - Ocean's depthAt prop is now bedAt (ground height). syncOceanMaterial takes the SkyLight as its 4th argument. @jgengine/core/sky/skySun.draw is now skyLight.draw. bandFogColor takes { timeOfDay, cycle, band }.
57
+ - @jgengine/core/ai/policeResponse and ai/heatSystem are gone; use ai/alertLevel createAlertLevel with your own tier ladder and tuning, and compose dispatch with time/pacedSchedule
58
+ - bossArena and ai/director/boss exports are gone; use createSummonedEncounter and the phaseLadder exports; maxCompanionWeight is gone, so filter candidates in your own gather()
59
+ - createKnockoutTaming, TamingFeeder and TamingState are gone; use createSubdualFeeding, FeedingSupply and SubdualFeedingState and pass your own capacity, drain, foods and costs
60
+ - import shuffleWithRng from @jgengine/core/random/pick instead of @jgengine/core/cards/cardPile; replace pileRng(seed) with seededRng(seed) from @jgengine/core/random/rng.
61
+ - LLMville settings use the engine settings store (graphics.quality, accessibility.reducedMotion) and engine binding overrides for keybinds
62
+ - LLMville camera look and tablet menu state live in one engine key-value store document on injected storage; src/storage/storage.ts is deleted
63
+ - an existing llmville:app-settings blob and the old ai-game:* local keys move over once on first boot, with regression tests
64
+ - `LootFilterRule.when`, `GateDef.requires` and `UpgradeNodeDef.standing` take a `Predicate`: `{ standing: { trackId: "park", min: 20 } }` becomes `{ gte: ["standing.park", 20] }`, `{ balance: { currency: "cash", min: 500 } }` becomes `{ gte: ["balance.cash", 500] }`, `{ rarity: "rare" }` becomes `{ eq: ["rarity", "rare"] }`.
65
+ - `GateFacts` is a fact record (`{ standing: {...}, balance: {...} }`); `gateFacts()` builds it. `GateStatus.missing` lists unmet predicate clauses.
66
+ - Gates no longer reject `standing.min > standing.max`; a non-finite operand still fails at load.
67
+ - Import `GLTF_MATERIAL_EXTENSIONS` in place of `GLTF_MATERIAL_EXTENSIONS_R182`; it also lists `KHR_materials_diffuse_roughness`.
68
+ - `TerrainMaterialLayer.materialUrl` is now `materialMaps`; `TerrainLayerMap`, `MAX_TERRAIN_LAYER_MAPS` and the detail material's `layerMaps` option are gone, scans go through `detail.surfaces` and paint layers (up to eight)
69
+ - `SceneCaptureBinding` takes no `bind` prop, and the game canvas keeps no copy of its last frame: ask for a frame with `requestSceneCapture` or `requestSceneThumbnail`, which read the next frame as it renders.
70
+ - `createWorldGameServer` auto-saves once a second instead of every changed tick. Pass `saveIntervalMs: 0` to keep per-tick saves.
71
+ - `createWorldStreamer`, `shardDistance` and their types move from `@jgengine/core/editor` to `@jgengine/core/visibility/streamer`. `StreamUpdate` no longer carries `resident`; call `streamer.resident()`.
72
+ - The engine runs on three 0.187 and vite 8. Packages peer on `three >=0.187.0`; move your app to `three@^0.187.0`, `vite@^8`, `@vitejs/plugin-react@^6` and `@tailwindcss/vite@^4.3`, and keep `@react-three/fiber` on `~9.7.0` (9.8.x unmounts drei `Html` roots inside React's commit and logs an error at boot).
73
+ - `PCFSoftShadowMap` is removed in three 0.187 (it falls back to `PCFShadowMap` with a warning). Use `shadows="percentage"`.
74
+ - GLSL that calls `inverseTransformDirection` should call `transformNormalByInverseViewMatrix` or `transformDirectionByInverseViewMatrix`.
75
+
76
+ ### Added
77
+
78
+ - an inheritance part passes values from two parents per field, picked or blended, with mutations
79
+ - the meter part ticks regen, decay and a regen delay, and a change reports what overflowed
80
+ - a paced schedule part fires events at a pace from a start time, with jitter, a count, pause and save
81
+ - a motion track part moves a thing along a path over time and reports its arrival
82
+ - `inheritValues` (`@jgengine/core/inheritance/inheritance`): A child's values from two parents, field by field: each field picked whole from one parent or blended between them, then a few rare mutation rolls adding to random fields. Also `InheritMutation`, `InheritOptions`, `InheritRule`, `Inherited`, `scatterPoints`.
83
+ - `createMotionTrack` (`@jgengine/core/movement/motionTrack`): Moves a thing along a path of points over time and reports when it arrives. Also `MotionTrack`, `MotionTrackConfig`, `MotionTrackState`.
84
+ - `changeMeter` (`@jgengine/core/stats/statPool`): Add `amount` now (negative drains). Also `MeterRates`, `MeterState`, `createMeter`, `tickMeter`.
85
+ - `createPacedSchedule` (`@jgengine/core/time/pacedSchedule`): A pace from a start time: every `due(now)` call returns the events that have come due, drawing each jittered gap from the injected rng. Also `PacedSchedule`, `PacedScheduleConfig`, `PacedScheduleState`.
86
+ - fairChance (random/fairChance) deals chance rolls like a shuffled deck: the odds hold over any stretch and a 50% roll never runs more than four the same way
87
+ - acrossSeeds (random/seedSweep) runs a scenario under many seeds and returns the share it held for, so tests check odds instead of one lucky run; longestStreak reports streaks
88
+ - world models take a seed, saved with the world; schedule chances are dealt by fairChance from it
89
+ - `fairChance` (`@jgengine/core/random/fairChance`): Whether roll `index` of the chance named `key` succeeds, dealt from shuffled bags like a deck of cards: over any stretch of rolls the share that succeed stays at `chance`, so a 70% roll can't miss nine times running or a 30% one hit nine times running. Also `FairChanceOptions`, `longestStreak`.
90
+ - `acrossSeeds` (`@jgengine/core/random/seedSweep`): Run a seeded scenario once per seed (`sweep:0`, `sweep:1`, …) and report the share it held for. Also `SeedSweep`.
91
+ - Fernwild's survivor creator on New game: a name, four bodies, a height slider and a live preview
92
+ - seven start beaches on the island map and in a list, graded Easy, Medium or Hard; death wakes you on the beach you chose
93
+ - the inventory pane heading shows the survivor's name
94
+ - engine per-entity looks (ModelConfig.looks, SceneEntity.look), setSpawnPose, a New game setup screen (newGameSetup) and a per-player onboarding area
95
+ - `runPlayed` (`@jgengine/core/game/gameFlow`): Whether a run already played in this world, so a new one has to restart the page first.
96
+ - `modelForLook` (`@jgengine/core/model/modelLook`): The model one entity draws for its `look` (`SceneEntity.look`): that entry of `model.looks` laid over the model, so a look swaps the body while keeping the model's held, worn and attachment tables unless it names its own. Also `modelLooks`.
97
+ - `useEntityLookModel` (`@jgengine/core/model/SceneModels.draw`): `model` as the live entity `instanceId` draws it: its current `look` laid over the model ({@link modelForLook}), re-rendering only when the look changes.
98
+ - `OnboardingArea` (`@jgengine/core/onboarding/onboarding`): Where a `"teaching-area"` onboarding guides: centre XZ and radius in metres, and what to call it.
99
+ - EntityPreview takes cameraTarget, so a standing figure's portrait can aim at its chest instead of its feet
100
+ - fernwild-gear flow wears a cloth set from the inventory
101
+ - the rock generator's smooth shading draws a stone rounded instead of as flat low-poly triangles, and its crags param cuts cracks and stacked ledges into it
102
+ - glaciers in the landform simulator: shallow-ice flow with Glen's law and sliding, wall drag, erosion by sliding speed, and till moraines where the ice ends
103
+ - coasts in the landform simulator: wave-cut cliff retreat damped by the platform it leaves, platform lowering and beach sand
104
+ - till and beach cover classes, shown by landformSurface as gravel and sand
105
+ - `CoastalParams` (`@jgengine/core/landform/evolution/landscapeEvolution`): Waves on the coast: cliff retreat and platform wear (see `coastal/waveErosion`). Also `GlacialParams`.
106
+ - `GLEN_RATE_FACTOR` (`@jgengine/core/landform/glacial/iceFlow`): Glen's flow rate factor A of temperate ice in Pa⁻³ yr⁻¹ (2.4·10⁻²⁴ Pa⁻³ s⁻¹, Cuffey & Paterson 2010). Also `ICE_WEIGHT`, `iceDeformationRate`.
107
+ - `TILL_YIELD` (`@jgengine/core/landform/materials/sedimentCover`): What glacial till breaks into: unsorted, from boulders to rock flour.
108
+ - `arthropodStride`, `arthropodTopSpeed` and `compareArthropod` give a real insect or spider's stride, gait and top speed scaled to a leg length, from Full & Tu 1991, Pfeffer et al. 2019, Wahl et al. 2015 and Biancardi et al. 2011.
109
+ - `validateArthropodReference` checks each runner's published stride fits against its speed, predicts the cockroach's top speed from the two ants within 4%, and checks the √leg-length scaling against Hurlbert et al.'s ant exponents.
110
+ - `bun run games:capabilities locomotion --creatures ... --arthropods <id[:8],...>` scores a game's insects and spiders against them.
111
+ - `bipedRunning`: `requiredExtensorMass` and `bipedRunningSupport` compute the leg extensor mass a biped needs at each joint for fast running from Hutchinson's free-body model, with his published limb data for human, chicken, turkey, emu, ostrich, alligator and Tyrannosaurus in `HUTCHINSON_BIPEDS`
112
+ - `scaleBipedLimb`, `theropodMassFromLegLength` and `compareBiped` score a game biped of any size: walk or run by the ostrich walk–run Froude number (`BIRD_WALK_RUN_FROUDE`), top speed for its mass, and the muscle a fast run needs
113
+ - `validateBipedReference` checks it against Hutchinson's own required masses, his other theropod models, and ostrich and Tyrannosaurus top speeds
114
+ - `bun run games:capabilities locomotion --creatures ... --bipeds <id,...>` scores the named creatures as theropods; `--validate` also checks the biped reference
115
+ - `flightPower`, `minimumPowerSpeed`, `maximumRangeSpeed`, `cruisingWingbeatFrequency`, `universalWingbeatFrequency` and `compareFlier` give a bird, pterosaur or insect's flight power and speeds from its mass, span and wing area (Pennycuick 2008 and 2013).
116
+ - `validateFlightReference` checks the model against ornithodolite airspeeds of 31 migrating species, seabird and albatross wingbeats and 19 insects.
117
+ - `bun run games:capabilities locomotion --creatures ... --fliers <id,...>` scores a game's fliers against Argentavis, Pteranodon or Quetzalcoatlus.
118
+ - `trotGallopSpeed(mass)` and `WALK_TROT_FROUDE` in quadrupedGait
119
+ - `GRUBER_WOBBLING_MASSES` and `LANDING_ACTIVATION` in humanFall; `simulateFall` takes `landingActivation` and `wobbling` (null for a rigid body)
120
+ - measureLocomotion and compareLocomotion score a game character's start, stop, reversal, tightest turn, jump, landing speed and uphill speed against a real person at the same speed.
121
+ - bun run games:capabilities locomotion prints that comparison for every game with a walking player (game:entity names a player whose role is set only at spawn); --validate checks the human reference itself.
122
+ - timeToSpeed, the human sprint time from standing to a speed.
123
+ - `compareLocomotion` (`@jgengine/core/movement/reference/compareLocomotion`): Measure a game character and compare it, metric by metric, with what a real person does at its top speed. Also `HumanLocomotionReference`, `LocomotionComparisonRow`, `LocomotionMetrics`, `LocomotionProbeOptions`, `defaultHumanReference`, `formatLocomotionComparison`, `measureLocomotion`, `referenceLocomotion`.
124
+ - `timeToSpeed` (`@jgengine/core/movement/reference/humanEnvelope`): Time to sprint from rest to `speed` (capped just under top speed), s.
125
+ - simulateFall drops a planar human with real segment masses and floor contact (limp, braced or landing on bent legs) and reports impact speeds, peak pelvis, head and foot forces, HIC15 and femur load; validateHumanFall checks it against published falls and drop landings.
126
+ - compareRagdollFall falls a createRagdoll body and the human reference the same ways and tables them against injury limits (HIC15 700, femur 10 kN, hip fracture 7 kN); humanRagdollConfig builds a ragdoll with real human proportions and masses.
127
+ - bun run games:capabilities locomotion --falls prints the stock humanoid ragdoll against a real fall; --validate also checks the fall reference.
128
+ - `INJURY_LIMITS` (`@jgengine/core/movement/reference/compareRagdollFall`): Injury assessment reference values for a mid-size adult man: HIC15 700 and femur axial force 10 kN (US FMVSS 208, 49 CFR 571.208), and a proximal femur breaking at about 7 kN when struck on the hip in a fall (A. Also `RagdollFallOptions`, `RagdollFallRow`, `compareRagdollFall`, `formatRagdollFall`, `humanRagdollConfig`, `measureRagdollFall`, `stockHumanoidRagdoll`.
129
+ - `HEAD_ON_FLOOR` (`@jgengine/core/movement/reference/humanFall`): Scalp and skull on a hard floor: about 4 kN at 4 mm of compression, nearly elastic. Also `FallOptions`, `FallReport`, `FallTone`, `PELVIS_ON_FLOOR`, `simulateFall`, `validateHumanFall`.
130
+ - quadrupedStride gives a quadruped's gait, stride length, stride frequency and fore and hind duty factors at any speed from Alexander and Jayes's dynamic similarity, with walk to trot at Froude 0.35 and trot to gallop at 2.5.
131
+ - animalTopSpeed gives an animal's top running speed from its mass (Hirt et al. 2017), and compareQuadruped scores a game creature's walk and sprint against a real animal of its size.
132
+ - bun run games:capabilities locomotion --creatures <module>#<export> prints that comparison for a game's creature table; --validate also checks the quadruped reference.
133
+ - `ALEXANDER_JAYES_CURSORIAL` (`@jgengine/core/movement/reference/quadrupedGait`): The dynamic-similarity fits of R. Also `CreatureLocomotion`, `FroudePowerLaw`, `MAMMAL_TOP_SPEEDS`, `QUADRUPED_GAIT_TRANSITIONS`, `QuadrupedBody`, `QuadrupedComparison`, `QuadrupedGait`, `QuadrupedStride` and 7 more.
134
+ - a human locomotion reference in core/movement/reference: a sagittal multibody human with de Leva body segments, joint torque limits and foot contact with friction
135
+ - Geyer-Herr muscle-reflex walking fitted by CMA-ES at 0.7-2.2 m/s on level ground, a 6% grade up and down, and stairs
136
+ - spring-mass running, a sprint force-velocity profile with braking and the 505 turn test, curve-running speed limits, and a torque-driven countermovement jump
137
+ - validateHumanReference checks the reference against published walking, running, sprint, turn and jump data
138
+ - `createCmaEvolutionStrategy` (`@jgengine/core/math/cmaEvolutionStrategy`): Creates a CMA-ES minimiser (N. Also `CmaEvolutionStrategy`, `CmaOptions`, `CmaState`.
139
+ - `DE_LEVA_MALE` (`@jgengine/core/movement/reference/anthropometry`): Adult male body-segment parameters of P. Also `AnthropometricTable`, `HUMAN_SEGMENT`, `PlanarHumanGeometry`, `SegmentParameters`, `planarHumanSegments`.
140
+ - `CHANG_KRAM_CURVE_SPEEDS` (`@jgengine/core/movement/reference/curveRunning`): Chang & Kram (2007) measured top speeds on flat curves by radius (m → m/s), and on the straight. Also `RECREATIONAL_SPRINTER`, `SprintMechanics`, `maxCurveSpeed`, `minTurnRadius`.
141
+ - `SHOE_ON_CONCRETE` (`@jgengine/core/movement/reference/footContact`): Shoe sole on a hard floor. Also `ContactParameters`, `ContactPointState`, `GroundProfile`, `footContactForce`, `slopeGround`, `stairGround`.
142
+ - `createHumanBody` (`@jgengine/core/movement/reference/humanBody`): Creates the sagittal reference human (Winter's seven-segment gait model with de Leva anthropometry), stepping its exact multibody dynamics with semi-implicit Euler at a fixed step. Also `FootForces`, `HumanBody`, `HumanBodyOptions`, `HumanBodyState`, `HumanJointTorques`, `HumanSide`.
143
+ - `RECREATIONAL_SPRINT_PROFILE` (`@jgengine/core/movement/reference/humanEnvelope`): A physically active young man (80 kg, 1.80 m) who is not a trained sprinter: F0 7.5 N/kg sits in the team-sport and recreational range of the force–velocity profiles in J.-B. Also `SprintProfile`, `SprintState`, `slopeCostOfTransport`, `slopeSpeed`, `sprint`, `sprintTopSpeed`, `stoppingDistance`, `test505Time` and 1 more.
144
+ - `analyzeLocomotion` (`@jgengine/core/movement/reference/humanGaitAnalysis`): Measure a driver's steady gait: run `settle` seconds, then `measure` seconds of speed, stride, duty factor, flight, per-stance vertical ground force shape and metabolic cost of transport. Also `GaitReport`, `LocomotionDriver`, `StanceForce`.
145
+ - `FITTED_WALKS` (`@jgengine/core/movement/reference/humanGaits`): Geyer–Herr reflex parameters fitted by CMA-ES on the 80 kg, 1.80 m reference human, minimising gross metabolic cost of transport at the target speed with penalties on speed error, step-time variation, a heel-strike transient above 1.3 body weights, a loading peak above 1.25, a mid-stance valley under 0.55, and any flight phase. Also `FittedWalk`, `WALK_TERRAIN`, `WalkTerrain`, `fittedWalk`, `measureWalk`.
146
+ - `COUNTERMOVEMENT_JUMP` (`@jgengine/core/movement/reference/humanJump`): Fitted by CMA-ES maximising the reference human's jump height with the trunk within 0.25 rad of upright at takeoff and the push force under 3 body weights. Also `JumpParameters`, `JumpReport`, `simulateJump`.
147
+ - `RUNNING_NET_COST` (`@jgengine/core/movement/reference/humanReferenceValidation`): Net metabolic cost of level running, J/(kg·m), nearly independent of speed: 3.8–4.0 (P. Also `HumanValidationRow`, `formatHumanValidation`, `validateHumanReference`.
148
+ - `YOUNG_MALE_STRENGTH` (`@jgengine/core/movement/reference/jointStrength`): Young adult male lower-limb strength. Also `HumanJointStrength`, `JointExertion`, `LegJoint`, `maxJointTorque`.
149
+ - `HILL_CONSTANTS` (`@jgengine/core/movement/reference/muscleTendon`): Shared contractile and elastic constants of the muscle model of H. Also `MuscleJointSpan`, `MuscleSpec`, `MuscleState`, `muscleMetabolicPower`, `stepMuscle`.
150
+ - `createPlanarMultibody` (`@jgengine/core/movement/reference/planarMultibody`): Creates a {@link PlanarMultibody} from segments. Also `PlanarMultibody`, `PlanarSegment`.
151
+ - `GEYER_HERR_MUSCLES` (`@jgengine/core/movement/reference/reflexWalker`): Muscle–tendon units of H. Also `GEYER_HERR_REFLEXES`, `LegMuscle`, `LegStimulation`, `ReflexParameters`, `ReflexWalker`, `ReflexWalkerState`, `actuateLegMuscles`, `createReflexWalker`.
152
+ - `RECREATIONAL_RUNNER` (`@jgengine/core/movement/reference/springMassRunning`): An 80 kg, 1.80 m man: leg length 0.94 m; leg stiffness 11 kN/m for 70 kg scaled with body mass (C. Also `SpringMassRunner`, `SpringMassStep`, `springMassStep`.
153
+ - carbon.lightHalfSaturation, a saturating light response (Thornley 1976), so a shaded crown keeps its leaves and an open one stops overbuilding
154
+ - growth.establishmentYears and the sapwoodAtBreastHeightM2 stat
155
+ - stand neighbours are periodic images in the light field, and space nearer a neighbour's stem gets no light (crown shyness, Putz et al. 1984)
156
+ - `BAAD_LEAF_TO_SAPWOOD` (`@jgengine/core/plants/validation/stemAllometry`): Leaf area per sapwood area at breast height of temperate and boreal trees taller than 5 m in the Biomass And Allometry Database (Falster et al. Also `FIA_STAND_DIAMETER`, `LeafToSapwoodBand`, `StandDiameterAtAge`.
157
+ - plants draw leaf cards with a leaf atlas baked per leaf shape, at the mid and low detail levels
158
+ - plant growth, meshing and atlas baking run in a worker pool, so a first visit to Fernwild spends about 64 ms of main-thread time on plants instead of about 2.2 s
159
+ - the plant worker pool reports its queued and running jobs and can be reset
160
+ - `PlantGrownGeneratorOptions` (`@jgengine/core/plants/grown/plantGrown`): Options for {@link createPlantGrownGenerator}.
161
+ - `createWorkerPlantGrower` (`@jgengine/core/plants/grown/plantGrowPool`): A pool of workers that grow plants with the same simulation as the main thread, so a first visit grows a forest without spending frame time. Also `PlantGrowRequest`, `PlantGrowResult`, `PlantGrower`, `PlantMeshOrder`, `WorkerPlantGrower`, `WorkerPlantGrowerOptions`, `WorkerPlantGrowerState`.
162
+ - `PLANT_LEAF_ATLAS_CELLS` (`@jgengine/core/plants/mesh/plantLeafAtlas`): Cells of a {@link PlantLeafAtlas}, left to right: one leaf, a leafy shoot, a crown cluster. Also `PLANT_LEAF_ATLAS_CELL_COUNT`, `PlantLeafAtlas`, `bakePlantLeafAtlas`, `plantLeafAtlas`, `plantLeafAtlasKey`.
163
+ - plant.grown, a generator that grows a plant species to any age and day, then meshes it at four detail levels with fixed triangle budgets (120k, 30k, 8k, 1.5k)
164
+ - a style layer on plant.grown (leaves or clumps, tints, saturation, paint, lit or cel-ramp shading, bark grain) that restyles without regrowing; the engine names no styles
165
+ - grown structures and meshes are cached in memory and in IndexedDB through an injected PlantCacheStorage, so a cached plant returns in under 5 ms
166
+ - an optional async prepare step on GeneratorDefinition (prepareGenerator, prepareGeneratorVariants); the scatter field runs it as scene loading before it bakes
167
+ - toonRampMaterial, a cel-shading ramp material part in material/
168
+ - eastern white pine (pinus-strobus), fit to the Carmean NC-128 site-index curve within 15% at 50 and 100 years; evergreen foliage no longer turns in autumn
169
+ - a plant-styles dev demo with one maple and one pine in realistic, toon and clay looks from one structure
170
+ - `prepareGenerator` (`@jgengine/core/generator/generator`): Await a generator's `prepare` for the output {@link runGenerator} would return with the same arguments. Also `prepareGeneratorVariants`.
171
+ - `TOON_RAMP_TEXELS` (`@jgengine/core/material/toonRamp`): Texels across a ramp texture: enough for 8 bands with blended edges. Also `ToonRamp`.
172
+ - `toonRampMaterial` (`@jgengine/core/material/toonRamp.draw`): A shared vertex-coloured toon material for a ramp: one per distinct ramp, so every mesh drawn with the same look batches into the same program.
173
+ - `createIndexedDbPlantCacheStorage` (`@jgengine/core/plants/cache/plantCache`): A storage over the browser's IndexedDB, or null where there is none (bun, node, a locked-down frame). Also `CachedPlantStructure`, `PlantCache`, `PlantCacheOptions`, `PlantCacheState`, `PlantCacheStorage`, `createMemoryPlantCacheStorage`, `createPlantCache`.
174
+ - `decodePlantMesh` (`@jgengine/core/plants/cache/plantCodec`): The mesh {@link encodePlantMesh} wrote. Also `decodePlantStructure`, `encodePlantMesh`, `encodePlantStructure`.
175
+ - `BUILTIN_PLANT_SPECIES` (`@jgengine/core/plants/grown/plantGrown`): Species the engine ships, registered with {@link registerPlantGenerators}. Also `PLANT_CACHE`, `PLANT_GROWN_GENERATOR`, `PLANT_GROWN_SCHEMA`, `PLANT_MESH_OUTPUT`, `createPlantGrownGenerator`, `plantStructureKey`, `plantStyleOf`.
176
+ - `DEFAULT_PLANT_STYLE` (`@jgengine/core/plants/mesh/plantMesh`): The style a plant gets when none is given: the species' own colours, lit, with real leaves. Also `PLANT_MESH_LODS`, `PLANT_MESH_TRIANGLE_BUDGETS`, `PlantMesh`, `PlantMeshInput`, `PlantMeshLook`, `PlantStyle`, `buildPlantMesh`, `isPlantMesh` and 1 more.
177
+ - `plantMeshMaterials` (`@jgengine/core/plants/mesh/plantMesh.draw`): The shared materials a plant mesh's wood and foliage draw with for its look: lit vertex colour (with generated bark grain when asked) or one cel-shading ramp for both. Also `plantMeshSources`.
178
+ - `PINUS_STROBUS` (`@jgengine/core/plants/species/data/pinusStrobus`): Eastern white pine.
179
+ - `EASTERN_WHITE_PINE_CARMEAN` (`@jgengine/core/plants/validation/heightAgeCurves`): NC-128 curve 103: eastern white pine, northern Wisconsin (FVS `htcalc.f`), total age.
180
+ - `bun run jgengine plants import|fit|write|report` imports FIA site trees, Carmean curves, Ek and Bechtold crown widths and Tallo crowns, and fits each species' growth by CMA-ES (Stava et al. 2014) across worker threads
181
+ - PLANT_LIBRARY of 10 fitted species (sugar and red maple, white and red pine, northern red oak, paper birch, white spruce, quaking aspen, basswood, balsam fir), each within ±15% height and ±25% DBH of FIA dominant trees and inside the Tallo p10–p90 crown width at 20, 50 and 100 years
182
+ - SPECIES_REFERENCE and REFERENCE_STAND, the imported targets every species is tested against
183
+ - `ABIES_BALSAMEA` (`@jgengine/core/plants/species/data/abiesBalsamea`): Balsam fir.
184
+ - `ACER_RUBRUM` (`@jgengine/core/plants/species/data/acerRubrum`): Red maple.
185
+ - `BETULA_PAPYRIFERA` (`@jgengine/core/plants/species/data/betulaPapyrifera`): Paper birch.
186
+ - `PICEA_GLAUCA` (`@jgengine/core/plants/species/data/piceaGlauca`): White spruce.
187
+ - `PINUS_RESINOSA` (`@jgengine/core/plants/species/data/pinusResinosa`): Red pine.
188
+ - `PLANT_LIBRARY` (`@jgengine/core/plants/species/data/plantLibrary`): Every species record the engine ships, registered with the grown-plant generator.
189
+ - `POPULUS_TREMULOIDES` (`@jgengine/core/plants/species/data/populusTremuloides`): Quaking aspen.
190
+ - `QUERCUS_RUBRA` (`@jgengine/core/plants/species/data/quercusRubra`): Northern red oak.
191
+ - `TILIA_AMERICANA` (`@jgengine/core/plants/species/data/tiliaAmericana`): American basswood.
192
+ - `REFERENCE_STAND` (`@jgengine/core/plants/species/speciesReference`): The stand a species is grown in to compare with its reference: fully stocked and even-aged, seen from a dominant tree. Also `GrowthCurve`, `SpeciesReference`, `crownWidthBandM`, `growthCurveAt`, `standDbhAtCm`, `standHeightAtM`.
193
+ - `SPECIES_REFERENCE` (`@jgengine/core/plants/species/speciesReferenceTable`): Written by `bun run jgengine plants import` from USDA FIA site trees and FVS (US public domain), Tallo (Jucker et al.
194
+ - `ForestCrownWidthEquation` (`@jgengine/core/plants/validation/crownAllometry`): Bechtold 2003 forest-grown crown width CW = a + b·D + cr·CR% + hi·HI in feet from DBH in inches, used from 5 in DBH, as coded in FVS Lake States `cwcalc.f` (US public domain). Also `OpenCrownWidthEquation`.
195
+ - `generatorVariantFor` (`@jgengine/core/generator/generator`): The one variant of `base` that belongs to `key` (a placement id): its own seed, and params nudged by `explore` from a stream seeded by the key.
196
+ - `branchAzimuthHistogram` (`@jgengine/core/plants/validation/plantSilhouette`): Where a plant's main limbs point: the share of first-order branches whose first segment leaves the stem toward each of `bins` compass sectors, counter-clockwise from +x. Also `PlantSilhouetteFrame`, `PlantSilhouettes`, `histogramDistance`, `plantSilhouettes`, `silhouetteIoU`.
197
+ - `scatterPlacementVariant` (`@jgengine/core/scatter/scatterGenerator`): The variant one placement of a unique item grows as: its own seed and params, from the palette item and the placement id alone, so it regrows the same anywhere.
198
+ - `createScatterHeroSet` (`@jgengine/core/scatter/scatterHeroes`): A hero set for one species. Also `ScatterHeroMember`, `ScatterHeroSet`, `ScatterHeroSetOptions`, `ScatterHeroSetState`, `ScatterHeroUpdate`.
199
+ - `ScatterHeroesProps` (`@jgengine/core/scatter/ScatterHeroes.draw`): Props for {@link ScatterHeroes}.
200
+
201
+ - Scatter `variants: "unique"` grows every placement from its own seed. The nearest few (`heroes`, `heroDistance`, `heroDetail`) draw as their own mesh, grown in the plant workers; the rest draw as 4 shared stand-ins and their impostors.
202
+ - The plant-styles demo has a `unique` view: 100 sugar maples, each from its own seed.
203
+ - grass grows as a tiller field: `createTillerField` with mow, trample, graze and shade, read into `GrassLook` by `tillerCellLook`
204
+ - ryegrass, timothy and Kentucky bluegrass records in `GRASS_LIBRARY`
205
+ - grass-field dev demo (lawn, meadow, worn path, shaded floor from one sim)
206
+ - `GRASS_LIBRARY` (`@jgengine/core/plants/groundCover/grassSpecies`): Every grass record shipped with the engine. Also `GrassSpecies`, `LOLIUM_PERENNE`, `PHLEUM_PRATENSE`, `POA_PRATENSIS`.
207
+ - `createTillerField` (`@jgengine/core/plants/groundCover/tillerSim`): Create a grass field of tiller cohorts, sown on 1 January with every species' tillers at a short, half-full sward. Also `CellArea`, `TillerCell`, `TillerCohort`, `TillerField`, `TillerFieldOptions`, `TillerFieldSnapshot`, `tillerCellLook`.
208
+ - white clover, dandelion, oxeye daisy and springy turf-moss grow in the tiller field next to the grasses (GROUND_COVER_LIBRARY).
209
+ - GroundCoverSpecies.habit: grass tillers die when they seed, herb rosettes live on, and moss fills the ground the sward leaves bare, so it takes shaded lawns.
210
+ - tillerCellLook draws herb flowers over grass heads and sizes blades from the species holding the most ground.
211
+ - `GRASS_LIBRARY` (`@jgengine/core/plants/groundCover/groundCoverSpecies`): The grasses shipped with the engine. Also `GROUND_COVER_LIBRARY`, `GroundCoverSpecies`, `LEUCANTHEMUM_VULGARE`, `LOLIUM_PERENNE`, `PHLEUM_PRATENSE`, `POA_PRATENSIS`, `RHYTIDIADELPHUS_SQUARROSUS`, `TARAXACUM_OFFICINALE` and 1 more.
212
+ - the plant-library demo takes ?seed=<name> to regrow every species from another seed.
213
+ - 42 more species in the plant library, 52 in all, each fitted to FIA site trees, Carmean or FIA height curves and Tallo crowns, with columnar, weeping and multi-stemmed forms.
214
+ - growth.basalStems (stems a seedling sets at its base) and growth.tropism.setpointMax (shoots may hang below the horizontal); DBH of a multi-stemmed tree is the quadratic sum of its stems.
215
+ - carbon.hydraulicHeightShare, the share of the species' maximum height its hydraulic limit sits at, fitted per species.
216
+ - the plant-library dev demo, a contact sheet of every species open-grown to 60 years.
217
+ - `ABIES_GRANDIS` (`@jgengine/core/plants/species/data/abiesGrandis`): Grand fir.
218
+ - `ABIES_LASIOCARPA` (`@jgengine/core/plants/species/data/abiesLasiocarpa`): Subalpine fir.
219
+ - `ACER_SACCHARINUM` (`@jgengine/core/plants/species/data/acerSaccharinum`): Silver maple.
220
+ - `BETULA_ALLEGHANIENSIS` (`@jgengine/core/plants/species/data/betulaAlleghaniensis`): Yellow birch.
221
+ - `CARYA_OVATA` (`@jgengine/core/plants/species/data/caryaOvata`): Shagbark hickory.
222
+ - `FAGUS_GRANDIFOLIA` (`@jgengine/core/plants/species/data/fagusGrandifolia`): American beech.
223
+ - `FRAXINUS_AMERICANA` (`@jgengine/core/plants/species/data/fraxinusAmericana`): White ash.
224
+ - `FRAXINUS_NIGRA` (`@jgengine/core/plants/species/data/fraxinusNigra`): Black ash.
225
+ - `FRAXINUS_PENNSYLVANICA` (`@jgengine/core/plants/species/data/fraxinusPennsylvanica`): Green ash.
226
+ - `JUGLANS_NIGRA` (`@jgengine/core/plants/species/data/juglansNigra`): Black walnut.
227
+ - `LARIX_LARICINA` (`@jgengine/core/plants/species/data/larixLaricina`): Tamarack.
228
+ - `LARIX_OCCIDENTALIS` (`@jgengine/core/plants/species/data/larixOccidentalis`): Western larch.
229
+ - `LIQUIDAMBAR_STYRACIFLUA` (`@jgengine/core/plants/species/data/liquidambarStyraciflua`): Sweetgum.
230
+ - `LIRIODENDRON_TULIPIFERA` (`@jgengine/core/plants/species/data/liriodendronTulipifera`): Yellow-poplar.
231
+ - `PICEA_ENGELMANNII` (`@jgengine/core/plants/species/data/piceaEngelmannii`): Engelmann spruce.
232
+ - `PICEA_MARIANA` (`@jgengine/core/plants/species/data/piceaMariana`): Black spruce.
233
+ - `PICEA_SITCHENSIS` (`@jgengine/core/plants/species/data/piceaSitchensis`): Sitka spruce.
234
+ - `PINUS_BANKSIANA` (`@jgengine/core/plants/species/data/pinusBanksiana`): Jack pine.
235
+ - `PINUS_CLAUSA` (`@jgengine/core/plants/species/data/pinusClausa`): Sand pine.
236
+ - `PINUS_CONTORTA` (`@jgengine/core/plants/species/data/pinusContorta`): Lodgepole pine.
237
+ - `PINUS_ECHINATA` (`@jgengine/core/plants/species/data/pinusEchinata`): Shortleaf pine.
238
+ - `PINUS_ELLIOTTII` (`@jgengine/core/plants/species/data/pinusElliottii`): Slash pine.
239
+ - `PINUS_PALUSTRIS` (`@jgengine/core/plants/species/data/pinusPalustris`): Longleaf pine.
240
+ - `PINUS_TAEDA` (`@jgengine/core/plants/species/data/pinusTaeda`): Loblolly pine.
241
+ - `PINUS_VIRGINIANA` (`@jgengine/core/plants/species/data/pinusVirginiana`): Virginia pine.
242
+ - `POPULUS_DELTOIDES` (`@jgengine/core/plants/species/data/populusDeltoides`): Eastern cottonwood.
243
+ - `POPULUS_GRANDIDENTATA` (`@jgengine/core/plants/species/data/populusGrandidentata`): Bigtooth aspen.
244
+ - `PRUNUS_SEROTINA` (`@jgengine/core/plants/species/data/prunusSerotina`): Black cherry.
245
+ - `PSEUDOTSUGA_MENZIESII` (`@jgengine/core/plants/species/data/pseudotsugaMenziesii`): Douglas-fir.
246
+ - `QUERCUS_ALBA` (`@jgengine/core/plants/species/data/quercusAlba`): White oak.
247
+ - `QUERCUS_COCCINEA` (`@jgengine/core/plants/species/data/quercusCoccinea`): Scarlet oak.
248
+ - `QUERCUS_FALCATA` (`@jgengine/core/plants/species/data/quercusFalcata`): Southern red oak.
249
+ - `QUERCUS_MACROCARPA` (`@jgengine/core/plants/species/data/quercusMacrocarpa`): Bur oak.
250
+ - `QUERCUS_MONTANA` (`@jgengine/core/plants/species/data/quercusMontana`): Chestnut oak.
251
+ - `QUERCUS_NIGRA` (`@jgengine/core/plants/species/data/quercusNigra`): Water oak.
252
+ - `QUERCUS_VELUTINA` (`@jgengine/core/plants/species/data/quercusVelutina`): Black oak.
253
+ - `ROBINIA_PSEUDOACACIA` (`@jgengine/core/plants/species/data/robiniaPseudoacacia`): Black locust.
254
+ - `THUJA_OCCIDENTALIS` (`@jgengine/core/plants/species/data/thujaOccidentalis`): Northern white-cedar.
255
+ - `THUJA_PLICATA` (`@jgengine/core/plants/species/data/thujaPlicata`): Western redcedar.
256
+ - `TSUGA_CANADENSIS` (`@jgengine/core/plants/species/data/tsugaCanadensis`): Eastern hemlock.
257
+ - `TSUGA_HETEROPHYLLA` (`@jgengine/core/plants/species/data/tsugaHeterophylla`): Western hemlock.
258
+ - `ULMUS_AMERICANA` (`@jgengine/core/plants/species/data/ulmusAmericana`): American elm.
259
+ - palms and ferns grow from the plant simulator: coconut, cabbage palm, Hawaiian tree fern, bracken and western sword fern, fitted to USDA PLANTS heights.
260
+ - frond and fan leaf shapes draw one arched, folded leaf per node; fronds rise when young and droop as they age.
261
+ - growth.frondEstablishmentYears grows a young palm's fronds to full size over its first years.
262
+ - `CIBOTIUM_GLAUCUM` (`@jgengine/core/plants/species/data/cibotiumGlaucum`): Hawaiian tree fern.
263
+ - `COCOS_NUCIFERA` (`@jgengine/core/plants/species/data/cocosNucifera`): Coconut palm.
264
+ - `POLYSTICHUM_MUNITUM` (`@jgengine/core/plants/species/data/polystichumMunitum`): Western sword fern.
265
+ - `PTERIDIUM_AQUILINUM` (`@jgengine/core/plants/species/data/pteridiumAquilinum`): Bracken.
266
+ - `SABAL_PALMETTO` (`@jgengine/core/plants/species/data/sabalPalmetto`): Cabbage palm.
267
+ - `habitHeightAt20M` (`@jgengine/core/plants/species/habitReference`): Height a habit species should reach by 20 years: PLANTS' 20-year height, or its mature height for a fern or herb that is full grown within a few years. Also `habitHeightCeilingM`.
268
+ - `isFrondShape` (`@jgengine/core/plants/structure/frondPose`): Whether a leaf shape is a frond (pinnate palm and fern leaves) or a fan (palmate palm leaves): one large leaf per metamer, drawn as an arched blade rather than a card. Also `FrondPose`.
269
+ - `plant.grown` takes `deadYears`: a snag drops twigs, then limbs, then breaks and falls, faster in soft wood and warm climates
270
+ - `PlantGrowth.kill()` and `stats().decayClass` (snag decay classes 1–5)
271
+ - plant-life-cycle dev demo (a maple through its year, then decaying)
272
+ - shrubs grow as clumps whose stems die and resprout from the roots (growth.stemLifespanYears), so a bush keeps its size for decades
273
+ - highbush blueberry, the first shrub, fitted to USDA PLANTS heights (3.66 m at 20 years) and checked by the library test
274
+ - flowers and fruit draw as small coloured clusters (reproduction.fruitColor)
275
+ - plants import, fit, write and report handle shrubs, palms, ferns and herbs through USDA PLANTS (habitSpecies.ts, habitReferenceTable.ts)
276
+ - `VACCINIUM_CORYMBOSUM` (`@jgengine/core/plants/species/data/vacciniumCorymbosum`): Highbush blueberry.
277
+ - `HABIT_CHECK_AGES` (`@jgengine/core/plants/species/habitReference`): Ages a habit species is grown to and checked at. Also `HabitReference`, `SHRUB_STEMS`, `basalStemCount`.
278
+ - `HABIT_REFERENCE` (`@jgengine/core/plants/species/habitReferenceTable`): USDA PLANTS heights and growth form of every shrub, palm, fern and herb in the library.
279
+ - createStand, a forest plot of competing trees stepped a year at a time: each tree a stem and crown advancing along its species' reference curves by the light it gets through taller crowns, with suppression and age mortality, seed rain into a seedling bank and recruits at breast height.
280
+ - standTreeGrowth, the createPlantGrowth inputs that grow one stand tree at full detail from its own seed, lifetime light and spacing.
281
+ - the forest-stand dev demo, a cleared hectare at 30, 100 and 200 years.
282
+ - `createStand` (`@jgengine/core/plants/stand/standSim`): Create a forest plot. Also `Stand`, `StandOptions`, `StandPlanting`, `StandSnapshot`, `StandStats`, `StandTree`, `StandTreeGrowth`, `StandTreeState` and 1 more.
283
+ - fernwild-first-person-walk flow shoots first person mid-walk, mid-run and mid-jump
284
+ - `keepHeadUnderEye` (`@jgengine/core/camera/firstPersonBody.draw`): Slides `body` across the ground so its folded head sits straight under the `eye` camera, from `rest` (the body's own position before any slide).
285
+ - a reference helicopter in flight/reference (createHelicopterModel): blade-element main and tail rotors with Pitt–Peters dynamic inflow, flapping, cyclic, ground effect and vortex ring state, a governor and a power-limited engine, so autorotation emerges after an engine cut
286
+ - the MBB Bo-105 (createBo105Model), validated against NASA TM-110356 hover and forward-flight power within 12% and 7%, with trimHelicopter and trimIsolatedRotor
287
+ - compareRotorcraft in bun run perf flight measures each game rotor block against the Bo-105 rotor
288
+ - `createHelicopterModel` (`@jgengine/core/flight/reference/helicopter`): a blade-element helicopter on the reference 6-DOF. Also `HelicopterDesign`, `HelicopterModel`, `HelicopterModelOptions`, `HelicopterRotorTelemetry`, `HelicopterSurface`, `HelicopterTrim`, `HelicopterTrimCondition`, `trimHelicopter`.
289
+ - `evaluateRotor` (`@jgengine/core/flight/reference/helicopterRotor`): blade-element rotor loads, flapping and dynamic inflow. Also `RotorDesign`, `RotorFlow`, `RotorLoads`, `RotorPitch`, `IsolatedRotorCondition`, `IsolatedRotorTrim`, `createRotorLoads`, `naca23012RotorSection`, `rotorStateCount`, `rotorStateNames`, `settleRotor`, `solveNewton`, `trimIsolatedRotor`.
290
+ - `createBo105Model` (`@jgengine/core/flight/reference/bo105Helicopter`). Also `BO105_DESIGN`, `BO105_MAIN_ROTOR`, `BO105_TAIL_ROTOR`, `BO105_HOVER_DATA`, `BO105_FORWARD_FLIGHT_DATA`, `BO105_TUNNEL_AIR`.
291
+ - `compareRotorcraft` (`@jgengine/core/flight/reference/rotorcraftComparison`). Also `RotorcraftComparison`, `RotorcraftComparisonAircraft`, `RotorcraftComparisonRow`.
292
+ - `solveLinearSystem` and `steadyAirData` (`@jgengine/core/flight/reference/aircraftTrim`) are now exported.
293
+ - a component-level jet engine cycle in flight/reference (createGasTurbineCycle): real-gas turbojet and turbofan, mixed or separate exhaust, cooled turbines, afterburner and inlet recovery, solved off-design for thrust and fuel flow at any Mach and altitude
294
+ - createGasTurbineEngine gives the cycle two spools with inertia and a fuel control, so thrust lags the throttle the way a real engine does
295
+ - F100-PW-220 and IAE V2500-A1 engine designs, validated against published ratings, the NASA TP-1538 thrust tables and the Stevens & Lewis power lag
296
+ - createF16Model({ engine: "cycle" }) flies the reference F-16 on the F100 cycle instead of its thrust table
297
+ - bun run perf flight now measures every game jet's thrust lapse, afterburner and spool time against the F100 cycle (compareJetEngines)
298
+ - `WALSH_FLETCHER_GAS` (`@jgengine/core/flight/reference/gasTurbine`): Dry air and kerosene combustion products with temperature-dependent specific heat, from the polynomials of Walsh & Fletcher, *Gas Turbine Performance* (2nd ed., 2004). Also `GasModel`, `GasStream`, `GasTurbineComponents`, `GasTurbineCycle`, `GasTurbineDesign`, `GasTurbineFlight`, `GasTurbinePoint`, `InletKind` and 3 more.
299
+ - `createGasTurbineEngine` (`@jgengine/core/flight/reference/gasTurbineEngine`): Creates a {@link GasTurbineEngine}: two spools with real inertia flying the cycle's steady operating line, in the quasi-steady manner of simplified engine transient models. Also `GasTurbineCommand`, `GasTurbineEngine`, `GasTurbineEngineOptions`, `GasTurbineEngineOutput`, `gasTurbinePropulsion`.
300
+ - `compareJetEngines` (`@jgengine/core/flight/reference/jetEngineComparison`): Measures each game jet's engine against the F100-PW-220 cycle engine and real F100 figures: dry thrust, how it lapses with altitude and Mach, the afterburner ratio and spool-up time. Also `JetComparison`, `JetComparisonAircraft`, `JetComparisonRow`.
301
+ - `F100_PW_220` (`@jgengine/core/flight/reference/referenceEngines`): Pratt & Whitney F100-PW-220 (F-16C/D), sized at sea-level static from its published figures: 228 lb/s airflow, bypass ratio 0.63, overall pressure ratio 25. Also `F100_PW_220_DYNAMICS`, `F100_PW_220_PUBLISHED`, `MATTINGLY_LEVEL_3`, `MATTINGLY_LEVEL_4`, `V2500_A1`, `V2500_A1_PUBLISHED`.
302
+ - `f16CycleEngine` (`@jgengine/core/flight/reference/f16Aircraft`): the shared F100-PW-220 cycle engine the F-16 flies with `engine: "cycle"`.
303
+ - `ComparisonTable` (`@jgengine/core/flight/reference/flightComparison`): any game / reference / real table `formatFlightComparison` prints.
304
+ - a reference rocket in flight/reference (createRocket): multistage 6-DOF on a rotating WGS 84 Earth with J2 gravity, the 1976 standard atmosphere, thrust curves that lose ambient pressure on each nozzle, gimballed engines, staging, jet damping and drag through Mach, with steerRocket and gravityTurnTarget to fly it
305
+ - the Saturn V AS-506 S-IC flight (SATURN_V_AS506), validated against the Apollo 11 flight evaluation report within 1% at both engine cutoffs, plus exact Tsiolkovsky staging, a closed circular orbit and J2 node regression within 1%
306
+ - compareRocketAscent in bun run perf flight flies a game motor build of the same rocket beside the reference and the report
307
+ - a reference rocket in flight/reference (createRocket): multistage 6-DOF on a rotating WGS 84 Earth, with a Saturn V comparison
308
+ - `WGS84_EARTH` (`@jgengine/core/flight/reference/rocket`): WGS 84 Earth (NIMA TR8350.2): μ, equatorial radius, flattening, J2 and rotation rate. Also `EarthModel`, `GravityTurnProgram`, `Rocket`, `RocketAero`, `RocketControl`, `RocketDesign`, `RocketEngine`, `RocketLaunch` and 11 more.
309
+ - `compareRocketAscent` (`@jgengine/core/flight/reference/rocketComparison`): Flies the Saturn V AS-506 S-IC ascent three ways and lines them up: the game's rigid-body `motor` model built from the published numbers ({@link saturnVGameTuning}), the reference rocket ({@link createRocket}), and the flight evaluation report. Also `saturnVGameTuning`.
310
+ - `F1_ENGINE` (`@jgengine/core/flight/reference/saturnV`): Rocketdyne F-1 as flown on AS-506, read from the flight evaluation report's S-IC stage performance (MPR-SAT-FE-69-9, figure 5-3): 34.0 MN stage thrust at liftoff and about 39.8 MN near vacuum give 6.80 MN per engine at sea level and 7.955 MN in vacuum, so an 11.4 m² exit area; the 2655 kg/s propellant flow per engine that empties the stage at 161.6 s gives a vacuum specific impulse of 305.5 s. Also `SATURN_V_AS506`, `SATURN_V_AS506_ASCENT`, `SATURN_V_AS506_EVENTS`, `SATURN_V_AS506_LAUNCH`.
311
+ - a landform simulator in core/landform grows terrain from tectonic uplift, river incision (implicit Braun & Willett solver), lakes, sediment fans and lake fill, hillslope creep, landslides with talus at the angle of repose, and tilted rock strata with their own hardness
312
+ - geomorphic law measurements (Flint's slope-area law, Hack's law) that test the simulated terrain; at steady state concavity is 0.500 and steepness matches (U/K)^(1/n), and Hack's exponent is about 0.6
313
+ - `DEFAULT_LANDFORM_PARAMS` (`@jgengine/core/landform/evolution/landscapeEvolution`): Sensible defaults for a 100 m grid: 1 mm/yr uplift, K = 2·10⁻⁵, m = 0.5, n = 1 (concavity 0.5), D = 0.01 m²/yr, repose 34°, 10 kyr steps. Also `LandformFields`, `LandformInitial`, `LandformParams`, `LandformSnapshot`, `LandformStepReport`, `LandscapeEvolution`, `LandscapeEvolutionOptions`, `createLandscapeEvolution` and 1 more.
314
+ - `UNIFORM_ROCK` (`@jgengine/core/landform/evolution/rockStrata`): The default single rock: uniform, standing at 45°. Also `LandformStrata`, `RockLayer`.
315
+ - `dInfinityArea` (`@jgengine/core/landform/flow/dInfinity`): D∞ upstream area per cell in m² over a depression-free `surface`, weighted by `rainfall` when given.
316
+ - `FLAT_RISE` (`@jgengine/core/landform/flow/flowRouting`): Rise per cell across filled flats, in metres; small next to any relief, large next to rounding. Also `FlowRouting`.
317
+ - `D8_DCOL` (`@jgengine/core/landform/grid/landformGrid`): Column offsets of the D8 neighbours: east, south-east, south, south-west, west, north-west, north, north-east. Also `D8_DROW`, `LANDFORM_MAX_SIDE`, `LandformEdge`, `LandformGrid`.
318
+ - `fitPowerLaw` (`@jgengine/core/landform/validation/geomorphicLaws`): Fit y = c · x^e by least squares on log x, log y over the points where both are positive. Also `ChannelSelection`, `PowerLawFit`, `hackLawFit`, `slopeAreaFit`, `upstreamLength`.
319
+ - createDuneField grows barchan, transverse, linear and star dunes from a wind regime and sand supply (Werner 1995 slab model): slip faces stand at the angle of repose and dunes migrate at a speed inversely proportional to height
320
+ - `DEFAULT_DUNE_PARAMS` (`@jgengine/core/landform/dunes/duneField`): Werner's (1995) rules: one wind toward the east, hop 1, landing 0.6 on sand and 0.4 on bed, 15° shadow. Also `DuneField`, `DuneFieldOptions`, `DuneGrid`, `DuneInitial`, `DuneParams`, `DuneSnapshot`, `WindMode`, `createDuneField` and 1 more.
321
+ - the landform generator grows a terrain heightfield with rock, gravel, sand, mud and soil layers from uplift, rivers, landslides and dunes; prepare runs in a worker and results are cached
322
+ - landformTerrainSnapshot turns a grown landform into the editor's terrain document, and the editor's grow_landform verb applies it as one undoable edit
323
+ - `LANDFORM_CACHE` (`@jgengine/core/landform/generator/landformGenerator`): The cache {@link LANDFORM_GENERATOR} uses: memory only. Also `LANDFORM_GENERATOR`, `LANDFORM_OUTPUT`, `LANDFORM_SCHEMA`, `LandformCache`, `LandformCacheOptions`, `LandformGeneratorOptions`, `LandformGeneratorParams`, `LandformGrower` and 7 more.
324
+ - `LANDFORM_TERRAIN_MAX_SIDE` (`@jgengine/core/landform/generator/landformTerrain`): Largest landform side `growLandform` accepts, so one job's work stays bounded. Also `LANDFORM_TERRAIN_SURFACES`, `LandformRecipe`, `LandformSnapshotOptions`, `LandformTerrain`, `growLandform`, `landformTerrainSnapshot`.
325
+ - landform material layers: rivers sort gravel, sand and silt by settling speed (alluvial fans fine downstream, lakes keep a coarse delta and settle silt over their floor), landslides lay scree, and bedrock weathers into soil by the Heimsath soil production function
326
+ - landformSurface reads a landscape out as per-cell blend weights over the rock, gravel, sand, mud and soil surface materials, with the bedrock id under each cell
327
+ - `LANDFORM_SURFACE_KINDS` (`@jgengine/core/landform/materials/landformSurface`): The surface kinds a landform paints, in their order in {@link LandformSurface.weights}. Also `LandformSurface`, `LandformSurfaceKind`, `LandformSurfaceOptions`, `landformSurface`.
328
+ - `COVER_CLASSES` (`@jgengine/core/landform/materials/sedimentCover`): Classes of loose cover, in their order in {@link SedimentCover.thickness}. Also `CoverClass`, `DEFAULT_GRAIN_SIZES`, `DEFAULT_ROCK_YIELD`, `GRAIN_CLASSES`, `GrainClass`, `GrainMix`, `GrainSizes`, `SCREE_YIELD` and 3 more.
329
+ - LLMville mounts in the shell game player: shell first-person movement, camera, lighting and server join replace its private controller, profiler, clock and session glue
330
+ - LLMville's HUD, tablet frame, cards, toasts and settings run on the UI kit, with its warm cream, coral and teal palette as kit tokens (look direction A)
331
+ - LLMville's rules use the engine parts: grid hookup and research tiers are Ladders, rack heat a Meter, bills the Schedule, the daily market a Table with Modifiers, the tutorial onboarding and the neighbourhood goal a contribution pool; every price and rate is pinned by tests
332
+ - LLMville's shared world rides the shell presence lane and the engine chat contract, drawn through a new `scene.RemotePlayers` seam
333
+ - Core `useCalendarClock` (`time/calendarClock.view`), a live in-world date and time aligned to the server clock
334
+ - Core `pickKeyed` in `random/pick`, a Table pick by an integer key so every client agrees on a shared day
335
+ - Core `validatePlacementBounds` beside `validatePlacement`, for bounds a game has already measured
336
+ - Touch controls take `touch.reserve` edge bands, so a game's own bottom bar never covers the joystick
337
+ - Presence functions take a `checkpoint`, presence sync leaves on last unsubscribe and unload, `helpers.findServer` reads the shared world, and chat messages carry `fromLabel`
338
+ - `KitCount` takes a node value, and rebind actions take a context so keys shared across contexts are not conflicts
339
+ - an even-aged stand option on PlantEnvironment (stand.spacingIndex) that shades a plant by neighbours of its own height, for forest-grown form
340
+ - plants/validation/crownAllometry with the Ek 1974 and Bechtold 2003 crown-width equations, Tallo measured crown widths and a crown profile measure, tested at 20, 50 and 100 years open- and forest-grown for both species
341
+ - `EASTERN_WHITE_PINE_CROWN_WIDTH` (`@jgengine/core/plants/validation/crownAllometry`): FVS `cwcalc.f` species 129, eastern white pine. Also `CrownProfile`, `CrownWidthClass`, `CrownWidthEquations`, `SUGAR_MAPLE_CROWN_WIDTH`, `TALLO_CROWN_WIDTH`, `crownProfile`, `forestGrownCrownWidthM`, `measuredCrownWidthBandM` and 1 more.
342
+ - the runtime hull reproduces the reference: resistance, planing trim, propeller thrust, MMG manoeuvring and seakeeping on a shared sea state, each a named effect a game can switch on; boatFromReference gives a real boat in one line
343
+ - each boat effect has a strength, a multiplier from 0 (the simple model's term) where 1 is exactly the reference measurement and the dial keeps going past it, finite and monotone over 0 to 4; boatFromReference takes per-boat overrides so a fleet is data
344
+ - `hullSurgeAddedMass` (`@jgengine/core/physics/boatDynamics`): Surge added mass of a hull as half a prolate spheroid of its length and twice its volume (the double-body image across the still surface): Lamb's `k₁ = α₀/(2 − α₀)` times the displaced mass. Also `BoatAddedMass`, `BoatEffects`.
345
+ - `hullManoeuvringForces` (`@jgengine/core/physics/boatManoeuvring`): Hull forces from drift and yaw rate at midship (the MMG `X_H` without straight-running resistance, `Y_H`, `N_H`). Also `HullManoeuvring`, `ManoeuvringDerivatives`, `ManoeuvringLoads`, `ManoeuvringRudder`, `RudderInflow`, `rudderForces`.
346
+ - `planingForces` (`@jgengine/core/physics/boatPlaning`): Savitsky's (1964) planing forces at a trim: the mean wetted length that carries the weight, the mean bottom velocity, Schoenherr friction, the centre of pressure `l_p/(λb) = 0.75 − 1/(5.21·C_V²/λ² + 2.39)`, and the trimming moment about G with the thrust line. Also `PlaningBottom`, `PlaningForces`, `planingTrim`.
347
+ - `prepareOpenWater` (`@jgengine/core/physics/boatPropeller`): Reduces an open-water description to cubics in `J`: the B-series polynomials with pitch, area ratio and blades fixed (plus the ITTC-1978 correction `K_T −= ΔC_D·0.3·(P/D)·(cZ/D)`, `K_Q += ΔC_D·0.25·(cZ/D)` when full scale), or the given polynomial. Also `BoatEngine`, `BoatPropeller`, `PreparedOpenWater`, `PropellerOpenWater`, `PropellerPoint`, `propellerPoint`.
348
+ - `BOAT_REFERENCE_IDS` (`@jgengine/core/physics/boatReferences`): Every id {@link boatFromReference} accepts. Also `BoatOverrides`, `BoatReferenceId`, `boatFromReference`.
349
+ - `SEA_WATER_KINEMATIC_VISCOSITY` (`@jgengine/core/physics/boatResistance`): Kinematic viscosity of sea water at 15 °C (ITTC 7.5-02-01-03), m²/s. Also `BoatWater`, `FrictionLine`, `HullResistance`, `frictionLineCoefficient`, `prepareHullResistance`.
350
+ - `prepareSeakeeping` (`@jgengine/core/physics/boatSeakeeping`): Cuts a hull into strips at its draught and works out its heave–pitch added mass, damping and restoring about G at the reference frequency (strip theory, zero speed), its roll oscillator, and each strip's radiation solution. Also `HullOffsetTable`, `HullSeakeeping`, `PreparedSeakeeping`, `SeakeepingExcitation`, `SeakeepingLoads`, `SectionRadiation`, `seakeepingExcitation`, `seakeepingForces` and 3 more.
351
+ - `createWaveField` (`@jgengine/core/water/seaState`): Samples a spectrum into a deterministic wave field: frequencies in equal bands from 0.5ωp to 4ωp, each jittered within its band, amplitudes `√(2·S(ω)·Δω)`, seeded phases, and with `spreading` each heading drawn from `cos^(2s)` about the mean. Also `SeaStateSpectrum`, `WaveField`, `WaveFieldComponent`, `WaveFieldOptions`, `regularWaveField`, `seaSpectrumDensity`, `waveFieldHeight`, `waveFieldSignificantHeight`.
352
+ - the runtime car reproduces the reference: Magic Formula tyres with load sensitivity, weight transfer, drift feel, aero, rolling resistance, brake fade, suspension kinematics, torque curve and gearing and road friction, each a named effect with a 0-upward dial; carFromReference gives a real car in one line and a fleet is data
353
+ - `brakeFadeShare` (`@jgengine/core/physics/brakeFade`): The share of cold brake force the pads give at disc temperature `temperature` °C, with the fade scaled by `strength`. Also `VehicleBrakeFadeEffect`.
354
+ - `CAR_CLASS_IDS` (`@jgengine/core/physics/carReferences`): The vehicle classes. Also `CAR_REFERENCE_IDS`, `CAR_REFERENCE_VEHICLE_IDS`, `CarClassId`, `CarOverrides`, `CarReferenceId`, `CarReferenceVehicleId`, `carFromReference`.
355
+ - `engineTorque` (`@jgengine/core/physics/engineTorqueCurve`): Crank torque at `rpm` and pedal `pedal` (`0..1`), N·m: `pedal·T(rpm) − (1 − pedal)·friction(rpm)`, with the curve's dips and the friction scaled by `strength`. Also `VehicleTorqueCurveEffect`.
356
+ - `roadFrictionAt` (`@jgengine/core/physics/roadFriction`): The tyre-friction multiplier the road gives on surface `surface`, with its distance from the test track scaled by `strength`. Also `VehicleRoadFrictionEffect`.
357
+ - `TNO_205_60R15_TIRE` (`@jgengine/core/physics/tireMagicFormula`): The TNO 205/60 R15 passenger-car tyre (`TNO_car205_60R15.tir`, the set in Pacejka, *Tire and Vehicle Dynamics*, 3rd ed., 2012, Appendix 3), dry asphalt, 4000 N nominal load: μx ≈ 1.04, μy ≈ 0.88, about 53 kN/rad of cornering stiffness at nominal load. Also `MagicFormulaTireCoefficients`, `MagicFormulaWheelCurve`, `VehicleMagicFormulaEffect`, `magicFormulaTrail`, `magicFormulaWheel`.
358
+ - `ROAD_CAR_STEERING_COMPLIANCE` (`@jgengine/core/physics/vehicleAligningTorque`): Steering-system compliance of a road car's rack and column, road-wheel rad per N·m. Also `VehicleAligningTorqueEffect`, `aligningSteer`.
359
+ - `VehicleStepBrakes` (`@jgengine/core/physics/vehicleDynamics`): Brake telemetry of a {@link VehicleDynamicsStep}.
360
+ - `suspensionKinematics` (`@jgengine/core/physics/vehicleSuspensionKinematics`): Lateral load transfer, roll lever and camber gain for one lateral acceleration `ay` (m/s², either sign), blended from the simple split by `strength`. Also `SuspensionKinematicsLoads`, `VehicleSuspensionKinematicsEffect`.
361
+ - `crownBalanceLean` (`@jgengine/core/physics/vehicleTireCrown`): The balance lean, rad, that a bike rolled to `lean` runs at: the inverse of {@link crownShownLean}. Also `VehicleTireCrownEffect`.
362
+ - one reference-grade wind field read by grass, weather and boats, forests and ground cover placed by the stand model from editor scene kinds, granular soil that ruts, and a landform start option in jgengine create, each a named effect with a 0-upward dial
363
+ - `createSoftGround` (`@jgengine/core/granular/softGround`): Lay soft ground over a terrain's vertex grid. Also `SoftGround`, `SoftGroundOptions`, `SoftGroundSnapshot`, `SoftGroundWheel`, `SoftSurfaceClass`, `softSurfaceSoil`.
364
+ - `GRASS_WIND_REFERENCE_SPEED` (`@jgengine/core/grass/grassWind`): Wind speed, m/s, a grass kind's `windStrength` was tuned to: a gentle-to-moderate breeze (Beaufort 3–4). Also `GRASS_WIND_SAMPLE_HEIGHT`, `GrassWind`, `GrassWindLook`, `grassSwayAmplitude`, `grassWindAt`, `grassWindLook`.
365
+ - `LANDFORM_START_PARAMS` (`@jgengine/core/landform/generator/landformStart`): Each start's generator params, about a 960 m map: a range cut by rivers then worked by ice above its snowline, a sand sea under one wind, and a river-cut range drowned to a coast. Also `landformStartTerrain`, `withGeneratedTerrain`.
366
+ - `GLACIAL_PHASE_YEARS` (`@jgengine/core/landform/generator/landformTerrain`): Years glaciers work a range when a recipe has a `glacierEla`.
367
+ - `AIR_DENSITY` (`@jgengine/core/physics/boatWindage`): Sea-level air density, kg/m³ (ISA). Also `BoatWind`, `boatWindageForce`.
368
+ - `DrivableSoil` (`@jgengine/core/physics/drivableVehicle`): Soft ground a car's wheels rut, and the wheel size they press with.
369
+ - `GROUND_COVER_FIELD_KIND` (`@jgengine/core/plants/groundCover/groundCoverField`): The editor volume kind a ground-cover field is placed as. Also `GROUND_COVER_SCHEMA`, `GroundCoverParams`, `growGroundCoverLook`, `resolveGroundCoverObject`.
370
+ - `FOREST_STAND_KIND` (`@jgengine/core/plants/stand/forestStand`): The editor path kind a forest stand is drawn as. Also `FOREST_STAND_SCHEMA`, `FOREST_STAND_TREE_BUDGET`, `ForestStandParams`, `ForestStandPlot`, `ForestStandTree`, `growForestStandPlot`, `readForestStandParams`, `resolveForestStand`.
371
+ - `registerScatterSource` (`@jgengine/core/scatter/scatterRegion`): Register the {@link ScatterSource} for a path kind; idempotent, last registration wins. Also `ScatterSource`.
372
+ - `LANDFORM_STARTS` (`@jgengine/core/terrain/terrainGenerator`): The plain data a document stores to have its ground grown on first load; `landform/generator/landformStart` grows it. Also `EditorTerrainGenerator`, `LandformStart`.
373
+ - `WEATHER_WIND_SAMPLE_HEIGHT` (`@jgengine/core/weather/weatherUniforms.draw`): Height, m, precipitation reads the shared wind at: the meteorological 10 m.
374
+ - `WIND_SURFACE_ROUGHNESS` (`@jgengine/core/world/windEffects`): EN 1991-1-4 Table 4.1: z₀ and z_min per terrain category. Also `PreparedWindEffects`, `WindEffects`, `WindGustEffect`, `WindGustSynthesis`, `WindProfileEffect`, `WindSurfaceClass`, `WindSurfaceRoughness`, `validateWindEffects` and 7 more.
375
+ - the runtime aircraft reproduces the reference: atmosphere, thrust lapse and spool, polars, damping derivatives, rotor inflow with autorotation and rocket mass flow, each a named effect with a 0-upward dial; aircraftFromReference gives a real aircraft in one line
376
+ - `aeroTermValue` (`@jgengine/core/flight/aeroTable`): One term's contribution: its constant or table value times its factor. Also `AeroFactor`, `AeroInput`, `AeroState`, `AeroSurfaceTravel`, `AeroTable`, `AeroTerm`, `sampleAeroTable`, `sumAeroTerms` and 1 more.
377
+ - `afterburnerCommand` (`@jgengine/core/flight/afterburner`): Splits a throttle position into dry and afterburner commands, `0..1` each, at a strength: the dry stop moves from full throttle to `dryThrottle` up to strength 1. Also `AircraftAfterburner`, `afterburnerRatio`.
378
+ - `effectStrength` (`@jgengine/core/flight/aircraftEffects`): An effect's strength: `0` when absent, else its `strength` (default `1`), never below `0`. Also `AircraftEffects`, `mixEffect`.
379
+ - `AIRCRAFT_REFERENCE_IDS` (`@jgengine/core/flight/aircraftReferences`): Every id {@link aircraftFromReference} accepts. Also `AircraftOverrides`, `AircraftReferenceId`, `aircraftFromReference`.
380
+ - `SEA_LEVEL_AIR` (`@jgengine/core/flight/atmosphere`): Sea-level standard air, SI units. Also `AirSample`, `AircraftAtmosphere`, `atmosphereAt`, `standardAir`.
381
+ - `autorotationRates` (`@jgengine/core/flight/autorotation`): Rotor speed and governor rates for a speed share, governor integral, throttle (engine power share) and aerodynamic rotor torque, N·m, in air of `densityRatio` to sea level. Also `AircraftAutorotation`, `AutorotationRates`, `settledGovernor`.
382
+ - `derivativeMoments` (`@jgengine/core/flight/derivatives`): Sums the moment coefficients at an air state, keeping the damping part apart so the strength can scale it alone. Also `AircraftDerivatives`, `DerivativeMoments`.
383
+ - `spoolRate` (`@jgengine/core/flight/engineSpool`): The spool's response rate, 1/s, for a step of `step` (share of the dry range) toward its target, at a strength: blends from the simple `spoolRate` up to strength 1, then divides by the strength. Also `AircraftEngineSpool`, `spoolThrust`.
384
+ - `machDragArea` (`@jgengine/core/flight/machDrag`): Drag area, m², at a Mach number before the strength: the tabled coefficient times the reference area. Also `AircraftMachDrag`.
385
+ - `mainGearMoment` (`@jgengine/core/flight/mainGear`): Nose-down pitching moment, N·m, from a ground reaction `load`, N, at the main wheels. Also `AircraftMainGear`.
386
+ - `nozzleThrust` (`@jgengine/core/flight/nozzle`): Delivered thrust, N, for the curve's vacuum thrust, its peak and the ambient pressure, Pa. Also `AircraftNozzle`.
387
+ - `polarCoefficients` (`@jgengine/core/flight/polar`): Sums the polar's lift, drag and side-force coefficients at an air state. Also `AircraftAeroGeometry`, `AircraftPolar`, `PolarCoefficients`.
388
+ - `C172_PROPELLER_POWER` (`@jgengine/core/flight/propeller`): McCauley 1C160/DTM7553 power coefficients, same grid. Also `AircraftPropeller`, `C172_PROPELLER_THRUST`, `PropellerLoads`, `propellerLoads`, `propellerThrust`, `settledShaftSpeed`.
389
+ - `rotatingEarthAcceleration` (`@jgengine/core/flight/rotatingEarth`): Acceleration, m/s² world axes, at a position and Earth-relative velocity: gravity toward the centre blended from the flat field (`simple`) up to strength 1, plus Coriolis and centrifugal terms for the frame's spin. Also `AircraftRotatingEarth`, `RotatingEarthFrame`, `rotatingEarthFrame`.
390
+ - `rotorInflowLoads` (`@jgengine/core/flight/rotorInflow`): Rotor thrust and torque at a collective lever `0..1`, rotor speed (share of rated), axial velocity through the disc (m/s, positive climbing), edgewise speed (m/s), air density and hub height above the ground (m). Also `AircraftRotorInflow`, `RotorInflowLoads`.
391
+ - `F100_DRY_LAPSE` (`@jgengine/core/flight/thrustLapse`): F100-PW-220 installed thrust lapse from the reference engine cycle (`scripts/reference/flight/gasTurbine.ts`, sized to the published ratings and fitted to NASA TP-1538's F-16 thrust tables): full dry thrust over sea-level static. Also `AircraftThrustLapse`, `F100_WET_LAPSE`, `lapseRatio`, `thrustLapse`.
392
+ - `inducedDragFactor` (`@jgengine/core/flight/wingGroundEffect`): Share of free-air induced drag left at a centre-of-gravity height above the ground, `0..1`, at a strength. Also `AircraftWingGroundEffect`.
393
+ - seeded nature generators for broadleaf, conifer, palm, bush, fern, rock and driftwood, with presets for oak, birch, tropical, dead tree, pine, spruce, redwood, coconut, cycad, fan palm, shrub, berry bush, hedge, fern, tree-fern, bracken, rock, boulder, pebbles, slab and fallen log
394
+ - a scatter palette item can grow from a generator ({ generator, preset, params, variants }); its variants are baked once, instanced, and share one far impostor
395
+ - editor markers can place any generator family that registers a mesh builder, not only parts generators
396
+ - a nature variant grid demo in apps/dev (nature-variants)
397
+ - `getGeneratorMesh` (`@jgengine/core/generator/generatorMesh.draw`): The mesh builder registered for an output family, or undefined. Also `GeneratorMeshBuilder`, `GeneratorMeshSource`, `registerGeneratorMesh`.
398
+ - `GeneratorMeshInstance` (`@jgengine/core/generator/GeneratorMeshInstance.draw`): One placed generator instance drawn through the mesh builder registered for its output family (`registerGeneratorMesh`), regrown from its params and seed. Also `GeneratorMeshInstanceProps`.
399
+ - `BROADLEAF_GENERATOR` (`@jgengine/core/nature/natureGenerators`): Broadleaf trees: oak, birch, tropical hardwood, dead tree. Also `BROADLEAF_SCHEMA`, `BUSH_GENERATOR`, `BUSH_SCHEMA`, `CONIFER_GENERATOR`, `CONIFER_SCHEMA`, `DRIFTWOOD_GENERATOR`, `DRIFTWOOD_SCHEMA`, `FERN_GENERATOR` and 7 more.
400
+ - `addBlob` (`@jgengine/core/nature/natureMesh`): A lumpy ellipsoid: a leaf cluster, a bush clump, a coconut. Also `BlobOptions`, `ConeOptions`, `FrondOptions`, `NatureMesh`, `NatureRgb`, `NatureVec`, `StoneOptions`, `TubeOptions` and 5 more.
401
+ - `natureGeometry` (`@jgengine/core/nature/natureMesh.draw`): A three geometry for a nature mesh, its sRGB vertex colours converted to linear. Also `natureMaterial`.
402
+ - `isScatterGeneratorItem` (`@jgengine/core/scatter/scatterGenerator`): True when a scatter mapping names a generator rather than a model. Also `ScatterGeneratorItem`, `scatterGeneratorBase`, `scatterGeneratorVariantCount`.
403
+ - `placedGeneratorFor` (`@jgengine/core/scene/assetGenerator`): The placeable generator (parts, nature …) a placed marker's `meta.assetId` names, or undefined. Also `registerPlaceableGeneratorOutput`.
404
+ - `BROADLEAF_GENERATOR` (`@jgengine/core/world`): Broadleaf trees: oak, birch, tropical hardwood, dead tree. Also `BROADLEAF_SCHEMA`, `BUSH_GENERATOR`, `BUSH_SCHEMA`, `BlobOptions`, `CONIFER_GENERATOR`, `CONIFER_SCHEMA`, `ConeOptions`, `DRIFTWOOD_GENERATOR` and 27 more.
405
+ - a reference 6-DOF flight model in flight/reference: quaternion rigid body, RK4 (error falls about 19x per halved step), US Standard Atmosphere 1976, a wind hook, coefficient tables, and gear with struts, brakes and nosewheel steering
406
+ - the F-16 from NASA TP-1538 matches the Stevens & Lewis check case within 0.02%, its trim within 0.2% and its published modes within 1%
407
+ - a Cessna 172 with a blade-element propeller and O-320 engine, within the 172N handbook: stall 0%, top speed +4%, climb +10%, take-off roll +21% (the chart is flaps 10°)
408
+ - runFlightTests flies stall, top speed, climb, roll, sustained turn and take-off on the reference or a game RigidAircraft; bun run perf flight [game] prints game / reference / real per aircraft
409
+ - `linearizeReferenceAircraft` (`@jgengine/core/flight/reference/aircraftTrim`): Linearizes a reference aircraft about a trim point by central differences of the wind-axis equations, with propulsion and actuator states held, and names the classical modes: short period and phugoid from the longitudinal matrix, dutch roll, roll subsidence and spiral from the lateral one. Also `Eigenvalue`, `FlightLinearization`, `FlightMode`, `TrimCondition`, `TrimResult`, `WindAxisState`, `matrixEigenvalues`, `referenceStateFromWindAxes` and 3 more.
410
+ - `C172_PROPELLER` (`@jgengine/core/flight/reference/cessna172Aircraft`): McCauley 1C160/DTM7553 fixed-pitch propeller: 75 in diameter, 53 in geometric pitch, two blades. Also `createCessna172Model`.
411
+ - `createCoefficientTable` (`@jgengine/core/flight/reference/coefficientTable`): Creates a gridded {@link CoefficientTable}, the form aerodynamic data comes in (alpha by beta by Mach by deflection). Also `CoefficientTable`, `CoefficientTableAxis`, `evenBreakpoints`.
412
+ - `STEVENS_LEWIS_GRAVITY` (`@jgengine/core/flight/reference/f16Aircraft`): Stevens & Lewis gravity, 32.17 ft/s², in m/s². Also `F16ModelOptions`, `createF16Model`, `f16PowerCommand`, `f16Thrust`, `stevensLewisAtmosphere`.
413
+ - `CESSNA_172N_PUBLISHED` (`@jgengine/core/flight/reference/flightComparison`): Cessna 172N figures from its Pilot's Operating Handbook (1978) at 2300 lb, sea level, standard day: stall 50 KCAS flaps up, top speed 125 KTAS, climb 770 ft/min at 73 KIAS, take-off ground roll 805 ft (the chart is flaps 10°). Also `FlightComparison`, `FlightComparisonAircraft`, `FlightComparisonRow`, `PublishedFlightFigures`, `compareFlight`, `formatFlightComparison`.
414
+ - `KNOTS_PER_MPS` (`@jgengine/core/flight/reference/flightTests`): Knots in one m/s. Also `FlightTestControls`, `FlightTestOptions`, `FlightTestReport`, `FlightTestSample`, `FlightTestSubject`, `referenceFlightSubject`, `rigidAircraftFlightSubject`, `runFlightTests`.
415
+ - `clarkYPropellerSection` (`@jgengine/core/flight/reference/propeller`): The section data of a flat-bottomed propeller airfoil in the Clark Y family: a thin-airfoil lift slope corrected by Prandtl–Glauert up to Mach 0.7, zero lift at −4° to the flat lower surface, a stall near `cl = 1.2` that falls to flat-plate lift, a parabolic drag bucket, Lock's compressibility drag rise past a critical Mach that drops as the section thickens toward the hub, and flat-plate drag past the stall. Also `BladeSection`, `PropellerGeometry`, `PropellerMap`, `createPropellerMap`, `solvePropeller`.
416
+ - `createReferenceAircraft` (`@jgengine/core/flight/reference/referenceAircraft`): Creates a {@link ReferenceAircraft}: a flat, non-rotating Earth 6-DOF rigid body with quaternion attitude, a full inertia tensor (with the `Ixz` product) plus gyroscopic engine momentum, gravity falling off with altitude, an injected atmosphere and wind, the α̇ aerodynamic terms solved implicitly, first-order rate-limited actuators, propulsion states, and spring-damper gear with tyre friction. Also `ReferenceActuator`, `ReferenceAeroCoefficients`, `ReferenceAirData`, `ReferenceAircraft`, `ReferenceAircraftModel`, `ReferenceAircraftOptions`, `ReferenceAircraftSample`, `ReferenceAircraftState` and 11 more.
417
+ - `SEA_LEVEL_DENSITY` (`@jgengine/core/flight/reference/standardAtmosphere`): Sea-level standard density, kg/m³. Also `AtmosphereModel`, `AtmosphereSample`, `SEA_LEVEL_PRESSURE`, `SEA_LEVEL_SPEED_OF_SOUND`, `STANDARD_EARTH_RADIUS`, `STANDARD_GRAVITY`, `calibratedAirspeed`, `geopotentialAltitude` and 2 more.
418
+ - glaciers follow the LR04 glacial cycles: snowlineHistory scales the snowline by the benthic δ18O stack (Lisiecki and Raymo 2005, CC BY), and GlacialParams.elaHistory feeds it to a run
419
+ - only beds at the pressure-melting point slide and erode; thin ice high above the snowline stays frozen to its rock (snowlineTemperature, lapseRate, geothermalFlux)
420
+ - meltwater supercooling stops a glacier wearing its bed where the bed climbs out of an overdeepening too steeply (Alley et al. 2003)
421
+ - `LR04_STACK` (`@jgengine/core/landform/glacial/glacialClimate`): The LR04 benthic δ¹⁸O stack (Lisiecki & Raymo 2005), 0 to 800 ka. Also `Delta18ORecord`, `SnowlineHistory`, `SnowlineHistoryOptions`, `snowlineAt`, `snowlineHistory`.
422
+ - addGameAssetFiles adds files to the running game's asset list after it was set
423
+ - drag a model or character card from the editor's Asset library onto the viewport; it pulls the asset if needed and places it where it lands, saved in editor.scene.json
424
+ - `LIBRARY_DRAG_MIME` (`@jgengine/editor/libraryDrag`): Custom drag mime for a shared-library model or character card dragged toward the viewport. Also `LibraryDragPayload`, `LibraryDropHandler`, `LibraryDropPoint`.
425
+ - plot permissions take an everyone role and a saved ban list; llmville's lab access (owner, owner's bot, visitors, bans) now runs on them
426
+ - plot permissions take an everyone role and a saved ban list
427
+ - llmville's lab access (owner, the owner's bot, visitors, guests and bans) runs on the engine's plot permissions, with a test for each case
428
+ - createPhaseSchedule in time/stateSchedule, phases that end by time or when the game calls advance(), with snapshot and restore
429
+ - createPhaseSchedule jumps to a named phase, retunes a phase in play, follows a per-phase next and can drop overshoot
430
+ - ride cycles and breakdowns run on the shared phase schedule; saves keep their shape
431
+ - daily routines resolve their holds and walks through the shared state schedule
432
+ - `createPhaseSchedule` (`@jgengine/core/time/stateSchedule`): A stateful timeline of named phases, ended by their own durations or by `advance()`. Also `PhaseSchedule`, `PhaseScheduleConfig`, `PhaseScheduleState`, `PhaseSpec`, `PhaseTransition`.
433
+ - ObjectiveBannerHost and OnboardingBanner take placement: "inline", so the banner can stack inside a HudSlots slot instead of covering the screen at a fixed height
434
+ - a scatter region's clearance keeps other regions' scatter out of each of its placements, so a palm no longer grows through a boulder
435
+ - fernwild-jungle-views flow shoots the beach edge, the sea and the jungle floor at noon.
436
+ - survey terrain reads hills outlines (rolling hills with plains between them), cliff lines (one side raised across a steep face) and an erosion meta on peaks and ridges that cuts gullies into them
437
+ - `SurveyCliff` (`@jgengine/core/terrain/surveyTerrain`): A cliff along a line: one side stands `height` higher, across a face `face` metres wide. Also `SurveyHills`.
438
+ - fernwild-icons flow stocks the survivor and shoots the hotbar and inventory
439
+ - KillFeed takes renderIcon for a game's own item art, rowStyle for bare lines and oldestFirst so new lines land at the bottom
440
+ - fernwild-pickup flow punches the spawn tree and picks up stones in first person
441
+ - sceneScatterSolids (AuthoredScene scatterSolids) makes a scatter palette item solid: each placement blocks the player, NPCs and physics with a box of the given radius and height, and stops blocking once mined out
442
+ - `SCATTER_SOLID_LAYER` (`@jgengine/core/scatter/scatterSolids`): Layer {@link syncScatterSolids} owns in `ctx.world.solids`. Also `ScatterSolidSpec`, `scatterSolids`, `syncScatterSolids`.
443
+ - KitVitalIcons draws survival pools as a column of glyphs that fill from the bottom, turning the low tone when a pool needs the player, with the numbers beside each glyph on demand
444
+ - `KitVitalIcons` (`@jgengine/core/hud/kitHud.view`): Survival pools as a strip of glyphs that fill from the bottom as the pool fills: a heart, a bolt, a drumstick, a drop. Also `KitVitalIcon`, `KitVitalIconsProps`.
445
+ - clothing a rigged human wears shows on its body: `ModelConfig.worn` maps item ids to a body area (head, torso, legs, hands, feet), set per entity with `ctx.scene.entity.update(id, { worn })`
446
+ - `attachWornLayer` (`@jgengine/core/anim/wearable/wornLayers.draw`): Dress a rigged humanoid in one worn layer: every opaque skinned mesh under `rig` gets a shell of the layer's region, bound to that mesh's own skeleton, so the piece bends with every clip, IK pass and folded first-person head. Also `useWornLayers`.
447
+ - `WEAR_REGIONS` (`@jgengine/core/anim/wearable/wornRegion`): The engine's region for each body area: a cap over the crown, a long-sleeved top, trousers, boots to mid-shin, gloves. Also `BodyFrame`, `SkinBone`, `SkinGeometry`, `WearRegion`, `WearRegionName`, `WornLayer`.
448
+ - fire/ landscape solver: Finney 2002 minimum-travel-time spread with a triangle update, on fuel, terrain and canopy grids, with snapshot, restore, reset and retune
449
+ - crown fire from Van Wagner 1977 and Rothermel 1991, matching BehavePlus crown outputs to 1e-6
450
+ - Albini ember spotting from surface fires and torching trees with Chase's ridge-valley correction, and NFDRS ember ignition probability
451
+ - per-cell burn state, flaming and smouldering burnout, char, ash, scorch height and fuel left for renderers
452
+ - `CANOPY_HEAT_KJ_KG` (`@jgengine/core/fire/crownFire`): Low heat of combustion of crown foliage, kJ/kg (8000 Btu/lb, as BehavePlus). Also `CanopyFuel`, `CrownFire`, `CrownFireType`, `activeCrownCriticalRate`, `assessCrownFire`, `canopyFuelLoad`, `crownFlameLength`, `crownInitiationIntensity` and 2 more.
453
+ - `DEFAULT_FIRE_TUNING` (`@jgengine/core/fire/fireLandscape`): Defaults: 16-direction stencil, BehavePlus-default wind limit, crown fire and spotting on. Also `CanopyStand`, `FireBurnState`, `FireCellKind`, `FireCellReading`, `FireLandscape`, `FireLandscapeConfig`, `FireLandscapeSnapshot`, `FireLayers` and 5 more.
454
+ - `emberIgnitionProbability` (`@jgengine/core/fire/spotting`): Probability that a firebrand landing in fine dead fuel starts a fire (Schroeder 1969, in the NFDRS form of Cohen & Deeming 1985): from 1-h fuel moisture and the fuel's temperature, 0..1. Also `SpotDistance`, `SpotTerrain`, `TorchingSpecies`, `surfaceFireSpotDistance`, `torchingTreeSpotDistance`.
455
+ - fire/ fuel moisture over time from weather: NFDRS 1978 dead fuel time lags, sun and rain, Jolly 2005 live green-up, as a fire moisture field
456
+ - `DEFAULT_FUEL_MOISTURE_TUNING` (`@jgengine/core/fire/fuelMoisture`): NFDRS 1978 dead fuel lags and rain boundaries, NFDRS 2016 live fuel ranges. Also `FuelMoistureModel`, `FuelMoistureSnapshot`, `FuelMoistureTuning`, `MoistureWeather`, `createFuelMoistureModel`, `equilibriumMoistureContent`, `fuelLevelWeather`, `growingSeasonIndex` and `vaporPressureDeficit`.
457
+ - `decodeFireArray` (`@jgengine/core/fire/fireArrays`): Decode base64 from {@link encodeFireArray} into a typed array of the same byte length. Also `encodeFireArray`.
458
+ - fire/ surface spread from Rothermel 1972 with Albini 1976 corrections, matching BehavePlus test outputs to 1e-6
459
+ - the 40 Scott & Burgan 2005 fuel models, the 13 Anderson models, non-burnable codes and the 16 moisture scenarios
460
+ - wind adjustment to midflame, Anderson 1983 fire ellipse, Byram fireline intensity and flame length, Van Wagner scorch height
461
+ - `ANDERSON_FUEL_MODELS` (`@jgengine/core/fire/fuelModels`): The original 13 fuel models (Anderson 1982; Albini 1976), keyed by code `FM1`..`FM13`. Also `FuelLoads`, `FuelModel`, `FuelMoisture`, `KG_M2_PER_LB_FT2`, `KG_M2_PER_TON_ACRE`, `KJ_KG_PER_BTU_LB`, `MOISTURE_SCENARIOS`, `M_PER_FT` and 4 more.
462
+ - `KW_M_PER_BTU_FT_S` (`@jgengine/core/fire/surfaceFire`): kW/m per Btu/ft/s. Also `MPS_PER_MPH`, `SpreadConditions`, `SurfaceFuelbed`, `SurfaceSpread`, `WindLimit`, `curedHerbFraction`, `ellipseEccentricity`, `firelineIntensity` and 8 more.
463
+ - `twentyFootWind` (`@jgengine/core/fire/windAdjustment`): 20-ft wind from a 10-m wind: divide by 1.15 (Turner & Lawson 1978, as in BehavePlus). Also `CanopyShelter`, `windAdjustmentFactor`.
464
+ - fire/ fuel from the world: crown fuel read from grown plants, canopy stands rasterized onto the fire grid, ground fuel and elevation sampled from terrain, and per-cell sun exposure for fuel moisture
465
+ - FireLandscapeView draws a fire landscape: scorch, char and ash overlay, flame billboards sized by flame length, and smoke drifting downwind
466
+ - a fire demo in apps/dev (?game=fire, ?t= pins the time)
467
+ - `FireLandscapeView` (`@jgengine/core/fire/FireLandscape.draw`): Draw a {@link FireLandscape}: a ground overlay of flaming, smouldering, charred and ashen cells, flame billboards as tall as each cell's flame length, and smoke puffs rising from burning cells and drifting downwind. Also `FireLandscapeViewProps`.
468
+ - `plantCanopyFuel` (`@jgengine/core/fire/fuelSources`): Read a grown plant's crown fuel without changing it: foliage mass is its leaf area (from `PlantGrowth.stats().leafAreaM2`) over the species' specific leaf area; fine branchwood is the skeleton segments thinner than `fineWoodRadiusM` times the species' wood density. Also `FireGridFrame`, `PlantCanopyFuel`, `rasterizeCanopyFuel`, `sampleFireGround`, `sunExposure`.
469
+ - `FireLandscape.originX` and `originZ` expose where the grid sits.
470
+ - `FireLandscape.extinguish(col, row)` puts a burning cell out and keeps the fuel it had left.
471
+ - Fuel moisture models take `rainShare`: the share of rain each cell receives under shelter.
472
+ - Authored fire areas run on fire/: `AuthoredFireRuntime` (from `simulation.fire(id)`) has `ignite(x, z)` and `extinguish(x, z)`, authored weather rains on their fuel moisture and blows their wind, and the editor inspector picks their fuel model and moisture scenario.
473
+ - statPoolFraction in stats/statPool; stagger and buildup meters save and restore their state
474
+ - `StaggerMeterState` (`@jgengine/core/combat/breakMeters`): A stagger gauge's saved state: its meter and whether it has broken.
475
+ - `ComfortBands` (`@jgengine/core/gameplay`): One ladder of comfort steps outside the comfortable band.
476
+ - `EventMeterMode` (`@jgengine/core/stats/eventMeter`): What a full meter does with the next gain: hold the fill until consumed, or carry the excess into a fresh cycle.
477
+ - `statPoolFraction` (`@jgengine/core/stats/statPool`): The pool's fill as `0..1` over its own `min..max`; `0` when the range is empty.
478
+ - `ComfortBands` (`@jgengine/core/survival/bodyTemperature`): One ladder of comfort steps outside the comfortable band.
479
+ - createPhaseSchedule in time/stateSchedule, phases that end by time or when the game calls advance(), with snapshot and restore
480
+ - `createPhaseSchedule` (`@jgengine/core/time/stateSchedule`): A stateful timeline of named phases, ended by their own durations or by `advance()`. Also `PhaseSchedule`, `PhaseScheduleConfig`, `PhaseScheduleState`, `PhaseSpec`, `PhaseTransition`.
481
+ - an includes comparator in rules/predicate, for a list fact that holds a value
482
+ - distanceBiasRegion and distanceBiasStrength in world/spatialSample, the one way to pick a spawn point by distance
483
+ - `selectSpawnPoint` (`@jgengine/core/authoring`): Select a spawn point by game intent, keeping the weighting in the placement part's candidate table. Also `SpawnPointBiasStrength`.
484
+ - `selectSpawnPoint` (`@jgengine/core/waves/spawnPoint`): Select a spawn point by game intent, keeping the weighting in the placement part's candidate table. Also `SpawnPointBiasStrength`.
485
+ - `distanceBiasRegion` (`@jgengine/core/world`): a flat candidate table. Also `DistanceBias`, `DistanceBiasStrength`, `SpawnPointBiasStrength`, `SpawnPointDistanceBias`, `SpawnPointSelectionOptions`, `distanceBiasStrength`, `selectSpawnPoint`.
486
+ - `distanceBiasRegion` (`@jgengine/core/world/spatialSample`): a flat candidate table. Also `DistanceBias`, `DistanceBiasStrength`, `distanceBiasStrength`.
487
+ - statGraph foldStatContributions, applyStatOp and boundStatValue for plain ordered value stacks
488
+ - `applyStatOp` (`@jgengine/core/progression/statGraph`): Apply one {@link StatOp} to a running value — the engine's one definition of what add, multiply, override and clamp mean. Also `StatBounds`, `boundStatValue`, `foldStatContributions`.
489
+ - GlacialParams.deformingTill, the till under sliding ice that deforms and travels with it at half the sliding speed (default 0.5 m, Boulton & Hindmarsh 1987), so a glacier clears its loose bed
490
+ - a granular demo in the dev app: sand poured into dry and damp piles, a trench dug across both, and a granite stone dropped that breaks with fractureRock
491
+ - granular/ — loose sand, gravel and soil that pile, avalanche, dig, compact and rut on a heightfield: a depth-averaged flow with the Pouliquen–Forterre friction law, Culmann cohesive banks and Bekker pressure–sinkage, costing only the cells that move
492
+ - createGranularTerrain binds it to an EditableTerrain, writing every change back as a TerraformDelta; landformLooseCover reads loose depth and material from a landform's cover
493
+ - collapsedColumn, a DEM column collapse the continuum is calibrated against, with Lube et al. (2004) and Pouliquen (1999) flume checks
494
+ - `continuumCollapse` (`@jgengine/core/granular/granularExperiments`): Release a column of `aspect` = h_i / r_i, radius `radius` m, on a flat bed and measure the deposit. Also `ContinuumCollapse`, `FlumeFlow`, `PouredHeap`, `inclinedFlume`, `pouredHeap`.
495
+ - `createGranularLayer` (`@jgengine/core/granular/granularLayer`): Create a granular layer over a bedrock grid. Also `GranularLayer`, `GranularLayerConfig`, `GranularLayerSnapshot`, `GranularPressReport`, `GranularStepReport`.
496
+ - `DAMP_SAND` (`@jgengine/core/granular/granularMaterial`): Sand with about 1% water. Also `BekkerSoil`, `DRY_SAND`, `GLASS_BEADS`, `GRAVEL`, `GranularMaterial`, `SANDY_LOAM`, `culmannHeight`, `flowFriction` and 6 more.
497
+ - `createGranularTerrain` (`@jgengine/core/granular/granularTerrain`): Bind a granular layer to a terrain's vertex grid. Also `GranularTerrain`, `GranularTerrainOptions`, `LandformCoverPlacement`, `landformLooseCover`.
498
+ - a discrete element reference for sand and gravel (physics/reference/discreteElements.ts): spheres and clumps, Hertz–Mindlin contacts, rolling resistance and capillary cohesion; deterministic, with snapshot and restore
499
+ - experiments that check it against published values: restitution, dry and damp angle of repose, Janssen silo saturation, Beverloo hopper discharge and the Brazil-nut effect
500
+ - `DEM_GLASS_BEADS` (`@jgengine/core/physics/reference/discreteElementExperiments`): Soda-lime glass beads: restitution 0.97 and friction 0.092 measured by Foerster, Louge, Chang & Allia (1994). Also `DEM_SAND`, `DEM_STEEL`, `HopperOptions`, `HopperResult`, `JanssenFit`, `PouredConeOptions`, `PouredConeResult`, `ShakerOptions` and 13 more.
501
+ - `bridgeRuptureDistance` (`@jgengine/core/physics/reference/discreteElements`): Gap at which a bridge breaks (Lian et al. Also `DemBodySpec`, `DemInteraction`, `DemLiquid`, `DemMaterial`, `DemSnapshot`, `DemSphereSpec`, `DemStepReport`, `DemWallMotion` and 8 more.
502
+ - a first-order (Blatter–Pattyn) Stokes ice-flow solver, createFirstOrderIceFlow, that matches the ISMIP-HOM full-Stokes benchmarks within one standard deviation
503
+ - GlacialParams.model picks first-order or shallow-ice glaciers, with layers and erosionExponent
504
+ - `createFirstOrderIceFlow` (`@jgengine/core/landform/glacial/firstOrderIceFlow`): A first-order (Blatter–Pattyn) Stokes ice-flow solver for a plan grid. Also `FirstOrderGrid`, `FirstOrderIceFlow`, `FirstOrderInput`, `FirstOrderOptions`, `FirstOrderReport`.
505
+ - `GlacierModel` (`@jgengine/core/landform/glacial/glacierFlow`): Which ice model moves a glacier.
506
+ - 12 MakeHuman people (CC0) in the asset library, built on pull from MakeHuman's base mesh and targets at a pinned commit and rigged on its default skeleton
507
+ - `retargetClipByRest` (`@jgengine/assets/clipRetarget`) maps a clip between differently built humanoid skeletons; the MakeHuman people get Rocketbox Idle, Walk and Run through it
508
+ - `loadRocketboxClip` (`@jgengine/assets/rocketboxPull`) loads one Rocketbox clip with its bare skeleton
509
+ - a plant growth simulator in core/plants: Acer saccharum grows from seed to 400 years with a seeded biology model (bud self-organisation on shadow voxels, LIGNUM carbon balance, pipe model, tropisms, sag, self-pruning) that gives the same tree in bun and Chrome
510
+ - plant species records as plain data with credited sources, a structure builder (skeleton with regions, bark distance, leaves, clusters, crown envelope) and the Carmean 1989 sugar maple height curve to validate against
511
+ - a 400-year plant growth row in bun run perf timing
512
+ - the plant light field can snapshot and restore its grids
513
+ - `ShootCandidates` (`@jgengine/core/plants/growth/carbonBalance`): Growth candidates for one year: every bud that could extend, with its Borchert–Honda share of the tree's vigour and its carbon cost per metamer. Also `StructureCost`.
514
+ - `NODE_AXIS_START` (`@jgengine/core/plants/growth/growthState`): Node flag: first internode of a lateral axis (a branch base). Also `GrowthState`, `NODE_DEAD`, `NODE_FIELDS`, `NODE_NO_SPUR`, `NODE_SCAR`, `SCALAR_FIELDS`.
515
+ - `LightField` (`@jgengine/core/plants/growth/lightField`): Relative light (0..1 of open sky) and the least-shaded direction at a point. Also `LightFieldSnapshot`.
516
+ - `GrowingSeason` (`@jgengine/core/plants/growth/phenology`): The leaf-on window of one year and the radiation it collects.
517
+ - `PipeCost` (`@jgengine/core/plants/growth/pipeModel`): {@link StructureCost} rebuilt each year from the current foliage.
518
+ - `OPEN_TEMPERATE_SITE` (`@jgengine/core/plants/growth/plantEnvironment`): A temperate, well-watered, fertile open site at 45° N: the site Carmean's curves describe. Also `PlantEnvironment`.
519
+ - `DEFAULT_GROWTH_LIMITS` (`@jgengine/core/plants/growth/plantGrowth`): Most buds and nodes a plant may hold: 4000 and 60000. Also `GrowthLimits`, `PLANT_SIM_VERSION`, `PlantGrowth`, `PlantGrowthSnapshot`, `PlantGrowthStats`, `createPlantGrowth`.
520
+ - `PLANT_PI` (`@jgengine/core/plants/growth/plantMath`): π to double precision.
521
+ - `TropismWeights` (`@jgengine/core/plants/growth/tropism`): The weights Palubicki et al.
522
+ - `ACER_SACCHARUM` (`@jgengine/core/plants/species/data/acerSaccharum`): Sugar maple.
523
+ - `plantSpeciesById` (`@jgengine/core/plants/species/plantSpecies`): A registered species, or undefined. Also `BarkKind`, `HalleOldemanModel`, `LeafShapeParams`, `PlantSpecies`, `SeasonalColor`, `plantSpeciesIds`, `registerPlantSpecies`, `validatePlantSpecies`.
524
+ - `PLANT_SOURCES` (`@jgengine/core/plants/species/speciesSources`): Every source a plant species value or growth rule comes from; each one is credited in CREDITS.md. Also `PlantSourceId`.
525
+ - `CROWN_HULL_BINS` (`@jgengine/core/plants/structure/plantStructure`): Height bins and azimuth sectors of {@link PlantStructure.crownHull}. Also `CROWN_HULL_SECTORS`, `PLANT_CLUSTER_LEVELS`, `PLANT_ORGAN`, `PLANT_REGION`, `PlantClusterLevel`, `PlantRegion`, `PlantStructure`, `PlantStructureSource` and 3 more.
526
+ - `SUGAR_MAPLE_CARMEAN` (`@jgengine/core/plants/validation/heightAgeCurves`): NC-128 curve 3: sugar maple, northern Wisconsin and Upper Michigan (Carmean 1978), total age. Also `SiteIndexCurve`, `siteIndexHeightM`.
527
+ - the remaining crown retrenchment after about 300 years is documented as veteran-tree behaviour (Fay 2002; Lonsdale 2013)
528
+ - the cross-engine test now grows 160 years, past the bud cap
529
+ - one generator contract for procedural systems: a typed param schema (defineParamSchema), a seeded pure generate step (defineGenerator, GeneratorContext), seeded variants (generatorVariants) and baked LOD variants (bakeGeneratorVariants), with a registry (registerGenerator)
530
+ - param fields bound their variant exploration (explore windows, log-scale sizes, capped colour drift) so every variant stays plausible
531
+ - the editor shows a 20-tile variant grid under a generator's params (pick, keep, place, reroll), and RPC/MCP gets list_generators, generator_variants, apply_variant and place_variant
532
+ - grass runs on the contract, with putting green, fairway, savanna and dune presets, bare ground and mow stripes
533
+ - `BUILDING_GENERATOR` (`@jgengine/core/buildings/buildingGenerator`): The building parts generator.
534
+ - `bakeGeneratorVariants` (`@jgengine/core/generator/generator`): Bake N variants of a generator at each of its `lods` — the set an instanced renderer draws from (pick one per instance with {@link variantIndexAt}) and the editor's variant grid previews. Also `BakedGeneratorVariant`, `GeneratorContext`, `GeneratorDefinition`, `GeneratorOutput`, `GeneratorVariant`, `GeneratorVariantOptions`, `RunGeneratorOptions`, `defineGenerator` and 8 more.
535
+ - `getGeneratorPreview` (`@jgengine/core/generator/generatorPreview.draw`): The preview registered for an output family, or undefined when that family has none. Also `GeneratorPreview`, `GeneratorPreviewFrame`, `GeneratorPreviewProps`, `registerGeneratorPreview`.
536
+ - `GeneratorVariantGrid` (`@jgengine/core/generator/GeneratorVariantGrid.draw`): A grid of seeded generator variants, each drawn live in its own tile. Also `GeneratorVariantGridProps`.
537
+ - `childParamGroups` (`@jgengine/core/generator/paramSchema`): The groups nested directly under `parent` (top-level groups when `parent` is undefined), in declared order. Also `ActionParamField`, `BoolParamField`, `ColorExplore`, `ColorParamField`, `CurveParamField`, `CurvePoint`, `GradientParamField`, `GradientStop` and 21 more.
538
+ - `createGrassTuftTemplate` (`@jgengine/core/grass/grassField`): Build the shared tuft template for a patch. Also `GrassTemplateLod`, `GrassTuftInputs`, `GrassTuftTemplate`, `grassBareAt`, `grassFieldNoise`.
539
+ - `GRASS_FIELD_OUTPUT` (`@jgengine/core/grass/grassKind`): The generator output family a grass look bakes to: {@link GrassFieldBake}. Also `GRASS_GENERATOR`, `GrassFieldBake`.
540
+ - `PARTS_OUTPUT` (`@jgengine/core/scene/assetGenerator`): The output family of a generator that returns {@link GeneratedAsset} parts. Also `isGeneratedAsset`, `partsGeneratorFor`.
541
+ - `GRASS_FIELD_OUTPUT` (`@jgengine/core/world`): The generator output family a grass look bakes to: {@link GrassFieldBake}. Also `BakedGeneratorVariant`, `CurvePoint`, `GRASS_GENERATOR`, `GRASS_PRESETS`, `GeneratorContext`, `GeneratorDefinition`, `GeneratorVariant`, `GeneratorVariantOptions` and 18 more.
542
+ - 46 older CC0 Quaternius packs from OpenGameArt (1,462 models: characters, animals, monsters, vehicles, buildings, weapons, food, nature) are in the asset library with triangles, bounds and clips; the Fantasy Props MegaKit is pinned to its CC0 OpenGameArt zip (94 models). Re-uploads by other users and the CC-BY-SA 2016 packs are left out.
543
+ - Pack pulls convert FBX- and OBJ-only archives to GLB (`extractPackModels`, `@jgengine/assets/packModelConvert`): rig and clips kept, centimetres made metres, solid materials kept opaque, one draw per material, colour textures attached by file or by material name.
544
+ - a realistic rigged human (Rocketbox, MIT) is the default body, with engine-authored jump, swim, tread, punch, swing, gather, hurt and death clips built on any mapped humanoid rig
545
+ - humanoid hand sockets and ModelConfig.held, so an entity holds only what it has in hand; five engine-built survival tools share one grip frame
546
+ - first-person body option (firstPerson.body) that keeps the player's arms and held item in view
547
+ - `STARTER_PEOPLE` (`@jgengine/assets`): The model-library people a fresh game pulls with the starter packs: realistic rigged humans, a man and a woman, that `libraryModel(name)` animates with the full humanoid clip set.
548
+ - `STARTER_PEOPLE` (`@jgengine/assets/packs/starter`): The model-library people a fresh game pulls with the starter packs: realistic rigged humans, a man and a woman, that `libraryModel(name)` animates with the full humanoid clip set.
549
+ - `HUMANOID_SOCKETS` (`@jgengine/core/anim/humanoidActionClips.draw`): Standard slots that get a socket; each socket node takes its slot's name. Also `addHumanoidSockets`, `buildHumanoidActionClips`, `firstPersonArms`, `withHumanoidActionClips`.
550
+ - `HUMANOID_ACTIONS` (`@jgengine/core/anim/humanoidActions`): The authored action set. Also `HUMANOID_ACTION_NAMES`, `HUMANOID_ACTION_SLOTS`, `HUMANOID_FIRST_PERSON_CARRY`, `HumanoidActionClip`, `HumanoidActionName`, `HumanoidAnimationInput`, `HumanoidPoseKey`, `HumanoidRotation` and 1 more.
551
+ - `LOCOMOTION_AIRBORNE_PARAM` (`@jgengine/core/anim/locomotionGraph`): Off the ground, as the shared player motor reports it: `true` in a jump or a fall. Also `LOCOMOTION_AIRBORNE_STATE`, `LOCOMOTION_SWIMMING_PARAM`, `LOCOMOTION_SWIM_STATE`.
552
+ - `BIPED_SCHEME` (`@jgengine/core/anim/skeletonStandard`): 3ds Max Biped rigs (`Bip01 Pelvis`, `Bip01 L UpperArm`), which every Microsoft Rocketbox human shares: the engine's realistic default body. Also `HUMANOID_BODY_SLOTS`, `detectHumanoidRig`.
553
+ - `FirstPersonBodyContext` (`@jgengine/core/camera/firstPersonBody.draw`): The entity whose own body the first-person camera looks out of, or `null` when no body is drawn in first person. Also `collapseHead`, `humanoidHead`, `useFirstPersonBody`.
554
+ - Fernwild's south beach as ARK draws it: pale sand with pebbles and driftwood, palms and cycads by the water, a jungle wall of tall trees, tree ferns, bushes and waist-high grass a few metres inland; the survivor wakes on it beside a palm
555
+ - nature bushes grow real leaves in two-sided clusters, and palm trunks draw with the bark material
556
+ - grass fields take growAbove, the lowest ground they grow on, so a field behind a beach leaves the sand bare
557
+ - Whipple bicycle benchmark (Meijaard et al. 2007): linear eigenvalues and weave/capsize speeds match the paper to 1e-11; a nonlinear multibody bicycle linearises to the same eigenvalues (worst gap 4e-12)
558
+ - createReferenceMotorcycle, Sharp, Evangelou & Limebeer's 2004 multibody GSX-R1000 with the motorcycle Magic Formula tyre; steered by torque only, so countersteer, weave and wobble come from the physics. At 75 m/s wobble is -1.83±46.5i and weave -0.39±28.2i (paper: -1.7±47.3i, -0.3±28.5i)
559
+ - createRiddenMotorcycle, a steering-torque rider that takes a game bike's AxisInput, and measureBikeHandling (launch, braking, lean, countersteer, lane change, slalom)
560
+ - compareBikeTuning and the handling command score any tuning with a lean block against the reference bike and MOTORRAD's 2001 GSX-R1000 test (0-100 3.22 s vs 2.9, 0-200 7.98 s vs 7.3, 100-0 38.3 m vs 38.6)
561
+ - rigidBodyTree (Featherstone CRBA/RNEA), matrix eigenvalues and a shared RK4; the reference car now uses the shared RK4 and linear solve
562
+ - `matrixEigenvalues` (`@jgengine/core/math/linearAlgebra`): Eigenvalues of a real square matrix (row-major, `n × n`): balancing, reduction to upper Hessenberg form by stabilised elimination, then the Francis double-shift QR iteration (Wilkinson & Reinsch, *Handbook for Automatic Computation* II, the EISPACK `balanc`/`elmhes`/`hqr` scheme). Also `Eigenvalue`, `solveLinearSystem`.
563
+ - `MOTORCYCLE_PUBLISHED_TOLERANCES` (`@jgengine/core/physics/reference/compareHandling`): How close the reference motorcycle must land to each published number: braking within 5%, 0-100 and 0-200 km/h within 12% (the torque curve between the engine's published peaks and its inertia are estimates). Also `BikeHandlingComparison`, `MotorcyclePublishedCheck`, `checkReferenceMotorcycle`, `compareBikeMetrics`, `compareBikeTuning`, `measureReferenceMotorcycle`, `validateReferenceMotorcycles`.
564
+ - `polynomialRoots` (`@jgengine/core/physics/reference/eigenvalues`): Roots of the real polynomial `c[0] + c[1]·λ + … + c[n]·λⁿ` (`c[n] ≠ 0`): the companion-matrix eigenvalues, then two Newton steps on the polynomial itself to recover full double precision.
565
+ - `measureBikeHandling` (`@jgengine/core/physics/reference/motorcycleManeuvers`): Drives fresh bikes from `create` through every bike scenario: a launch (0-100, 0-200 km/h), braking from 100 km/h, a full-steer lean test like `measureLean` (plus the lateral g the lean holds), an ISO 3888-1 double lane change with lanes sized for the bike, and a slalom. Also `BikeCourseSubject`, `BikeHandlingMetrics`, `BikeHandlingOptions`, `BikeScenario`.
566
+ - `createRiddenMotorcycle` (`@jgengine/core/physics/reference/motorcycleRider`): Puts a steering-torque rider on a reference motorcycle; the bike only ever gets a bar torque, so countersteer, the lean response and its limits come from the multibody physics. Also `MotorcycleRiderOptions`, `RiddenMotorcycle`, `RiddenMotorcycleState`.
567
+ - `SPORT_FRONT_120_70_ZR17` (`@jgengine/core/physics/reference/motorcycleTire`): Front 120/70 ZR17 sport tyre (Sharp, Evangelou & Limebeer 2004, Tables II–III middle rows; longitudinal shape from the 160/70 fit with pDx1 = 1.381, pDx2 = −0.04143, §4.5; relaxation §4.8). Also `MotorcycleTireCoefficients`, `MotorcycleTireInput`, `MotorcycleTireOutput`, `SPORT_REAR_180_55_ZR17`, `motorcycleMagicFormula`.
568
+ - `GSXR1000_SHARP_2004` (`@jgengine/core/physics/reference/realMotorcycles`): Suzuki GSX-R1000 K1 (2001) with a prone rider, the machine of Sharp, Evangelou & Limebeer, "Advances in the modelling of motorcycle dynamics", *Multibody System Dynamics* 12 (2004) 251–283, Appendix tables A.I–A.VIII: masses, inertias, geometry, stops, stiffness, damping and aerodynamics as published, tyres from their section 3. Also `PublishedMotorcyclePerformance`, `REAL_MOTORCYCLES`, `RealMotorcycle`.
569
+ - `createReferenceMotorcycle` (`@jgengine/core/physics/reference/referenceMotorcycle`): Creates a {@link ReferenceMotorcycle}: the multibody motorcycle of {@link ReferenceMotorcycleSpec} on a {@link createRigidBodyTree} (13 degrees of freedom), integrated by classical RK4 at 0.5 ms under a 1 kHz control sample. Also `MotorcycleBody`, `MotorcycleControls`, `MotorcycleModes`, `MotorcyclePowertrain`, `MotorcycleRearLinkage`, `MotorcycleWheel`, `ReferenceMotorcycle`, `ReferenceMotorcycleOptions` and 5 more.
570
+ - `createRigidBodyTree` (`@jgengine/core/physics/reference/rigidBodyTree`): Creates a {@link RigidBodyTree}: a tree of rigid bodies on free, revolute and prismatic joints with exact dynamics in spatial-vector form (Featherstone, *Rigid Body Dynamics Algorithms*, 2008): the composite-rigid-body algorithm for the mass matrix and the recursive Newton–Euler algorithm for the velocity-product and applied forces. Also `RigidBodyDefinition`, `RigidBodyTree`, `RigidBodyTreeState`, `RigidJoint`.
571
+ - `createRungeKutta4` (`@jgengine/core/physics/reference/rungeKutta`): Creates a {@link RungeKutta4} for states of `size` entries; its scratch buffers are allocated once, so a step allocates nothing. Also `RungeKutta4`.
572
+ - `BENCHMARK_BICYCLE` (`@jgengine/core/physics/reference/whippleBicycle`): The benchmark bicycle of Meijaard et al. Also `BENCHMARK_BICYCLE_EIGENVALUES`, `WhippleBicycle`, `WhippleBicycleInput`, `WhippleBicycleParameters`, `WhippleBicycleSnapshot`, `WhippleBicycleStart`, `WhippleBicycleState`, `WhippleLinearCoefficients` and 6 more.
573
+ - MMG standard method for ship manoeuvring in physics/reference: hull, propeller and rudder forces, or swung thrust for an outboard or waterjet, integrated in time.
574
+ - Turning-circle and zig-zag trials that run on the reference ship or a game boat. The KVLCC2 L7 model lands within 3% of the paper's turning indices and 1.5° of its zig-zag overshoots.
575
+ - bun run perf boat now also compares turning circles and zig-zags, on a KVLCC2 game build beside MARIN's free-running tests.
576
+ - `kvlcc2Subject` (`@jgengine/core/physics/reference/boatComparison`): The KVLCC2 L7 tanker model as a reference boat: its MMG model for resistance and manoeuvring, a game build with the same mass, rudder, steering rate and propeller (bollard thrust and zero-thrust speed at the self-propulsion revolutions), and MARIN's free-running turning and zig-zag results. Also `ManoeuvringSubject`.
577
+ - `KVLCC2_L7` (`@jgengine/core/physics/reference/shipManoeuvring`): The KVLCC2 L7 free-running model (1/45.7, MARIN) with the hull, propeller and rudder coefficients Yasukawa and Yoshimura used for their simulations (2015, Tables 1 and 3). Also `KVLCC2_L7_PUBLISHED`, `KVLCC2_L7_SPEED`, `ManoeuvringTrialBoat`, `MmgForces`, `MmgHullDerivatives`, `MmgPropeller`, `MmgRudder`, `MmgShip` and 10 more.
578
+ - Ocean waves in physics/reference: Pierson–Moskowitz and JONSWAP spectra, a seeded irregular sea (long- or short-crested), and its pressure field for the hull integrator, so buoyancy and the nonlinear Froude–Krylov force come from one integral.
579
+ - Frank close-fit heave added mass and damping of any ship section, and zero-speed strip theory for heave and pitch RAOs in head waves.
580
+ - A 6-DOF hull in waves (seakeepingHullFromStrip, stepSeakeeping) with strip-theory radiation and diffraction and momentum slamming. Its RAOs track strip theory within 6% for waves of 1.5 boat lengths and longer.
581
+ - bun run perf boat now also compares heave and pitch in head waves for every boat.
582
+ - `wigleyStandIn` (`@jgengine/core/physics/reference/boatComparison`): A Wigley hull (`C_B` 4/9) with a boat tuning's length, beam and mass, floating level with G on the waterline: the seakeeping stand-in for a boat whose real lines are unknown.
583
+ - `irregularSea` (`@jgengine/core/physics/reference/oceanWaves`): Samples a spectrum into a deterministic irregular sea: frequencies in equal bands from 0.5ωp to 4ωp, each jittered within its band so the record does not repeat, amplitudes `√(2·S(ω)·Δω)`, random phases, and with `spreading` each component given a heading drawn from `cos^(2s)` about the mean. Also `IrregularSeaOptions`, `OceanSea`, `SeaSpectrum`, `WaveComponent`, `regularSea`, `seaElevation`, `seaWaterAt`, `spectralMoment` and 1 more.
584
+ - `restingSeakeepingState` (`@jgengine/core/physics/reference/seakeepingHull`): The hull floating at rest in still water: G above the origin at its equilibrium height, heel and trim. Also `SeakeepingHull`, `SeakeepingHullOptions`, `SeakeepingState`, `SeakeepingStation`, `SurgeForce`, `seakeepingHullFromStrip`, `stepSeakeeping`.
585
+ - `lewisSection` (`@jgengine/core/physics/reference/sectionHydrodynamics`): A Lewis-form half-section `x = M((1 + a1) sin θ − a3 sin 3θ)`, `y = −M((1 − a1) cos θ + a3 cos 3θ)` from the keel (`θ = 0`) to the waterline (`θ = π/2`), fitted to a half-breadth, draft and section area coefficient. Also `HalfSection`, `SectionHeave`, `sectionHeave`.
586
+ - `heavePitchResponse` (`@jgengine/core/physics/reference/stripTheory`): Heave and pitch of a hull in regular head waves at zero speed by strip theory (Salvesen–Tuck–Faltinsen, `U = 0`): each section's added mass, damping and diffraction from {@link sectionHeave}, Froude–Krylov force from the incident pressure on the section contour, waterplane restoring, and the coupled heave–pitch equations solved about G. Also `HeavePitchCoefficients`, `HeavePitchResponse`, `StripHull`, `StripSections`, `stripSections`.
587
+ - Reference hull hydrostatics in physics/reference: water pressure integrated over a hull mesh cut at the surface gives floating attitude, KB, BM, GM and the GZ curve with free trim. Checked against the Wigley hull's closed forms and the exact box-barge GZ to 90°.
588
+ - Holtrop–Mennen resistance and propulsion factors. They reproduce the 1982 worked example's coefficients and its 1793 kN total within 0.1%.
589
+ - Wageningen B-series propeller with the ITTC-1978 scale correction, and a waterjet by momentum theory.
590
+ - Savitsky planing hull: running trim, resistance and porpoising limit. Resistance is within 12% of the NACA TN 2876 tank runs.
591
+ - bun run perf boat [game] prints game boat vs reference hull vs published figures, metric by metric.
592
+ - `compareBoat` (`@jgengine/core/physics/reference/boatComparison`): Runs a game boat tuning and its reference hull through the same straight-line tests (calm-water resistance at set speeds, top speed and time to 90% of it on the game's own thrust law, coast-down distance to a quarter of top speed, and running trim for planing hulls) and lines them up beside published figures. Also `BoatComparisonSubject`, `ReferenceBoat`, `holtropExampleSubject`, `referenceBoatSubjects`, `referenceSubjectFor`, `speedboatSubject`, `surgeAddedMass`.
593
+ - `boxBarge` (`@jgengine/core/physics/reference/hullForm`): A rectangular box barge `length × beam × depth`: the textbook hull whose large-angle righting arm has a closed form. Also `HullMesh`, `HullOffsets`, `PrismaticPlaningHullOptions`, `WigleyHullOptions`, `hullMeshFromOffsets`, `meshVolume`, `prismaticPlaningHull`, `wigleyHull`.
594
+ - `MARINE_GRAVITY` (`@jgengine/core/physics/reference/hullHydrostatics`): Standard gravity, m/s². Also `FloatingAttitude`, `FloatingCondition`, `HullIntegrator`, `HullLoads`, `HullWater`, `HydrostaticParticulars`, `RightingArmPoint`, `SEA_WATER_DENSITY` and 9 more.
595
+ - `bSeriesBladeSection` (`@jgengine/core/physics/reference/marinePropeller`): Holtrop and Mennen's (1982) estimate of the 0.75R chord and thickness ratio from diameter, blades and area ratio. Also `BSeriesPropeller`, `OpenWaterPoint`, `PropellerOperatingPoint`, `ScrewBladeSection`, `Waterjet`, `WaterjetPoint`, `bSeriesOpenWater`, `bSeriesShipOpenWater` and 4 more.
596
+ - `NACA_TN2876_MODEL` (`@jgengine/core/physics/reference/planingHull`): Model 276's beam, m, and its tank water. Also `NACA_TN2876_RUNS`, `PlaningEquilibrium`, `PlaningFluid`, `PlaningHull`, `PlaningState`, `PrismaticPlaningRun`, `planingAtTrim`, `planingEquilibrium` and 3 more.
597
+ - `HOLTROP_MENNEN_EXAMPLE` (`@jgengine/core/physics/reference/shipResistance`): The hypothetical single-screw ship of Holtrop and Mennen's 1982 numerical example, with the results the paper prints for 25 knots, so the method is checked against its own authors' arithmetic. Also `HoltropConditions`, `HoltropHull`, `HoltropPropeller`, `HoltropPropulsionFactors`, `HoltropResistance`, `SEA_WATER_VISCOSITY`, `holtropMennenResistance`, `holtropPropulsionFactors` and 2 more.
598
+ - createReferenceCar, a multibody reference car in physics/reference: Kane's equations for body and four corners, exact double-wishbone and MacPherson kinematics, bushing and steering compliance, Karnopp clutch and brakes, engine inertia, plate-LSD or Torsen differential, compliant halfshafts, RK4 at 0.5 ms
599
+ - solveSuspension and createSuspensionTable, suspension kinematics from hardpoints (camber, toe, track and spring length through travel and steer)
600
+ - REAL_CARS (Mazda MX-5 ND, Scion FR-S) with cited specs and published tests; both land within 2.1% on 0-100 and braking and 0.03 g on the skidpad
601
+ - measureStandardManeuvers, ISO 4138 steady-state circle, ISO 7401 step steer and ISO 3888-1 lane change for any vehicle sim
602
+ - compareVehicleTuning and bun run games:capabilities handling, which score game cars against the reference car and a real car's published numbers; --validate checks the reference cars themselves
603
+ - `PUBLISHED_TOLERANCES` (`@jgengine/core/physics/reference/compareHandling`): How close the reference car must land to each published number: 0–100 km/h and 100–0 km/h braking within 5%, skidpad within 0.03 g. Also `ComparableHandlingMetrics`, `ComparableHandlingOptions`, `HandlingComparisonRow`, `PublishedCheck`, `VehicleHandlingComparison`, `checkReferenceAgainstPublished`, `compareHandlingMetrics`, `compareVehicleTuning` and 4 more.
604
+ - `magicFormulaContact` (`@jgengine/core/physics/reference/magicFormulaTire`): The transient contact of {@link createMagicFormulaTire} as a pure right-hand side, for a caller that integrates the deflections itself (a multibody car's ODE): forces from the current deflections and the deflection rates `du/dt = −Vsx − |Vx|·u/σκ`, `dv/dt = Vsy − |Vx|·v/σα`, `dφ′/dt = |Vx|·(φ − φ′)/σα`. Also `MagicFormulaContactState`.
605
+ - `MAZDA_MX5_ND` (`@jgengine/core/physics/reference/realCars`): 2016 Mazda MX-5 Miata Club (ND, 2.0 L, six-speed manual, limited-slip differential): light, 50:50, rear drive. Also `REAL_CARS`, `RealCar`, `RealCarTestData`, `SCION_FRS_2013`.
606
+ - `createReferenceCar` (`@jgengine/core/physics/reference/referenceCar`): Creates a {@link ReferenceCar}: a multibody car integrated with classical fourth-order Runge–Kutta (default 0.5 ms; halving the step converges at fourth order between control samples) and a 1 kHz driver/controller sample. Also `ReferenceAero`, `ReferenceAxle`, `ReferenceBrakes`, `ReferenceCar`, `ReferenceCarOptions`, `ReferenceCarSpec`, `ReferenceCarState`, `ReferenceCarStep` and 6 more.
607
+ - `measureStandardManeuvers` (`@jgengine/core/physics/reference/standardManeuvers`): Runs the standard handling tests on fresh vehicles from `create`: ISO 4138 steady-state circular driving (constant radius), ISO 7401 step steer, and the ISO 3888-1 double lane change. Also `StandardManeuver`, `StandardManeuverOptions`, `StandardManeuverReport`.
608
+ - `createSuspensionSample` (`@jgengine/core/physics/reference/suspensionKinematics`): An empty {@link SuspensionSample} to reuse with {@link SuspensionTable.sample}. Also `DoubleWishboneGeometry`, `MacPhersonGeometry`, `SuspensionGeometry`, `SuspensionPoint`, `SuspensionPose`, `SuspensionSample`, `SuspensionTable`, `createSuspensionTable` and 1 more.
609
+ - a full Pacejka Magic Formula 6.1 tyre in physics/reference (combined slip, camber, inflation pressure, turn and spin slip with parking torque, Fx Fy Mx My Mz) with the published TNO 205/60 R15 coefficient set and a .tir reader
610
+ - createMagicFormulaTire, a transient tyre with relaxation-length contact dynamics that holds still at standstill and converges at second order as the step halves
611
+ - MF 6.1 vertical force from deflection, effective rolling radius, relaxation lengths and spin slip helpers
612
+ - `TNO_205_60R15` (`@jgengine/core/physics/reference/magicFormulaTire`): The TNO 205/60 R15 passenger-car tyre (`TNO_car205_60R15.tir`, MF-Tyre/MF-Swift 6.2 fit, Delft-Tyre 2013), the parameter set listed in Pacejka, *Tire and Vehicle Dynamics*, 3rd ed. Also `MagicFormulaCoefficients`, `MagicFormulaInput`, `MagicFormulaOutput`, `MagicFormulaTire`, `MagicFormulaTireOptions`, `MagicFormulaTireState`, `MagicFormulaTireStep`, `MagicFormulaTireStepInput` and 8 more.
613
+ - parallel bonds in the DEM reference (Potyondy & Cundall 2004): bonded grains carry force and moment and break in tension or shear, with snapshot and restore
614
+ - physics/reference/bondedRock.ts, granite, sandstone, limestone and basalt as bonded grains calibrated to their Young's modulus and Brazilian strength, with Brazilian, modulus and impact tests
615
+ - fracture/, rocks that break by impact into convex fragments sized by the JKMRC t10 law and the Gaudin–Schuhmann distribution, with Vogel–Peukert breakage odds, a fragment burst and fragment meshes
616
+ - the fracture.rock generator previews a broken stone
617
+ - bun run perf fracture scores fractureRock, StructureGraph.toDebris and toDebrisBodies against the t10 law
618
+ - `boxCell` (`@jgengine/core/fracture/convexCell`): An axis-aligned box cell from `min` to `max`. Also `CellFace`, `CellPlane`, `CellVec`, `ConvexCell`, `cellContains`, `cellVolume`, `clipCell`, `transformCell`.
619
+ - `compareFracture` (`@jgengine/core/fracture/fractureComparison`): Break a 0.5 m granite block at each energy with every subject. Also `FractureComparisonRow`, `formatFractureComparison`.
620
+ - `KWH_PER_TONNE` (`@jgengine/core/fracture/fragmentSize`): 1 kWh/t in J/kg. Also `FragmentSizes`, `GaudinSchuhmannFit`, `RosinRammlerFit`, `SizeFit`, `T10Fit`, `breakageProbability`, `fitGaudinSchuhmann`, `fitRosinRammler` and 6 more.
621
+ - `BASALT_BREAKAGE` (`@jgengine/core/fracture/rockFracture`): Basalt: very hard, A×b 30. Also `FractureOptions`, `FractureResult`, `GRANITE_BREAKAGE`, `LIMESTONE_BREAKAGE`, `ROCK_BREAKAGE`, `RockBreakage`, `RockFragment`, `SANDSTONE_BREAKAGE` and 3 more.
622
+ - `FRACTURE_GENERATORS` (`@jgengine/core/fracture/rockFractureGenerator`): The fracture generators. Also `ROCK_FRACTURE_GENERATOR`, `ROCK_FRACTURE_SCHEMA`, `fragmentMesh`, `rockCell`.
623
+ - `BASALT` (`@jgengine/core/physics/reference/bondedRock`): Basalt: ρ 2900 kg/m³, E 70 GPa (reported 50–90), σ_t 14 MPa. Also `BEREA_SANDSTONE`, `BondedRockModel`, `BondedSpecimen`, `BrazilianResult`, `CalibrationResult`, `GrainPacking`, `INDIANA_LIMESTONE`, `ImpactOptions` and 14 more.
624
+ - `DemBondSpec`, `DemBondLoad` (`@jgengine/core/physics/reference/discreteElements`): parallel bond spec and load; `DiscreteElements` gains `bond`, `bondTouching`, `bondLoad`, `bondCount`, `bondEnds`, `bondIntact`.
625
+ - Rocketbox's 471 animation clips are library entries (kind animation), tagged by body, motion and whether they travel; the editor's Asset library has an Animations tab
626
+ - assets pull <clip key> writes a skeleton-only clip.glb that plays on any Rocketbox human, and assets pull <Rocketbox character> --clips <keys> bakes clips onto the character, retargeted by bone name and made in place
627
+ - `ROCKETBOX_CLIP_FOLDERS` (`@jgengine/assets/library/libraryRocketbox`): Rocketbox's three animation folders: in place (`static`), travelling on the ground (`xy`) and in 3D (`xyz`).
628
+ - `pullRocketboxClip` (`@jgengine/assets/rocketboxPull`): Pull one clip from Rocketbox's animation library and write `<outDir>/clip.glb`: the shared skeleton (no mesh) and one animation named `clip.name`, its tracks keyed by bone name in the same centimetre-under-a-0.01-root units a pulled avatar uses, so a mixer on any pulled Rocketbox human plays it unchanged. Also `PullRocketboxClipOptions`, `PulledRocketboxClip`.
629
+ - a shared asset library of 12,678 licensed entries (models, characters, materials, decals, HDRIs, icons) from ambientCG, Poly Haven, game-icons.net, Sketchfab CC0/CC BY, Rocketbox, KayKit and Quaternius, each with source, author, licence, page, tags, triangles and size
630
+ - a licence gate in code: only CC0, public domain, MIT and CC BY are accepted; Kenney, Mixamo, Textures.com, Fab and BlenderKit uploads are refused
631
+ - `assets library ingest|search|credits|stats` and `assets pull <source>:<id>`; a game that quotes a library key gets it at provision time, bytes stay in the shared asset store
632
+ - the editor's Content Browser has an Asset library with search, kind tabs, tags, thumbnails, licence badges and Add to game
633
+ - `SpriteIcon` and `libraryIconUrl` draw game-icons.net item icons (4,239, credited per artist); `ActionBar` takes `renderIcon` in both looks
634
+ - Saltwick's crop bar shows beet, cabbage, sunflower and raspberry icons, and its credits name the icon artist
635
+ - `libraryCreditSections` (`@jgengine/assets/library/assetLibrary`): Credit sections for the library entries a game ships: one section per source, one line per credited author (game-icons.net's "Icons made by …" rule) with the entries listed, and one line per CC0 source. Also `LibraryEntry`, `LibraryHit`, `LibraryIssue`, `LibraryRecord`, `LibraryRecordFile`, `LibrarySearchOptions`, `libraryCredits`, `libraryLicenseLabel` and 3 more.
636
+ - `libraryRecordFiles` (`@jgengine/assets/library/generated`): Every committed library ingest file, as untyped JSON; `readLibraryRecordFile` checks each one.
637
+ - `GAMEICONS_ARTISTS` (`@jgengine/assets/library/libraryIcons`): game-icons.net's folder names and the credit each artist asks for ("Icons made by {author}"), from the repository's `license.txt`. Also `GAMEICONS_CC0_ARTISTS`, `GAMEICONS_PACK`, `libraryIconCredits`, `libraryIconUrl`.
638
+ - `assetLibrary` (`@jgengine/assets/library/libraryIndex`): Every entry in the shared asset library: the committed ingest files plus the measured packs.
639
+ - `IngestFetch` (`@jgengine/assets/library/libraryIngest`): The fetch seam ingest uses; tests pass a stub. Also `IngestOptions`, `KayKitTreePack`.
640
+ - `EXCLUDED_PROVIDERS` (`@jgengine/assets/library/libraryLicense`): Providers JGengine never ships, whatever licence a re-upload claims: Kenney (house rule), and Mixamo, Textures.com, Fab and BlenderKit (no redistribution). Also `LIBRARY_LICENSES`, `LibraryLicense`, `licenseRequiresCredit`, `normalizeLibraryLicense`.
641
+ - `pullLibraryEntry` (`@jgengine/assets/library/libraryPull`): Pulls one library entry into `ctx.outRoot` at {@link libraryServedPath}: pack entries through the pack pull, ambientCG materials through the material path, Poly Haven and Rocketbox models through the model library's converters, Poly Haven textures and HDRIs and ambientCG HDRIs as files, and a Sketchfab model through its download API with the token named by the source (`SKETCHFAB_TOKEN`). Also `LibraryPullContext`.
642
+ - `libraryServedPath` (`@jgengine/assets/library/libraryServed`): The served folder and URL for a library entry. Also `LibraryServedPath`.
643
+ - `ASSET_LIBRARY_SOURCES` (`@jgengine/assets/library/librarySources`): The upstreams the shared asset library indexes, in ingest order. Also `GAMEICONS_REVISION`, `LIBRARY_KINDS`, `LibraryKind`, `LibrarySource`, `LibrarySourceId`, `ROCKETBOX_REVISION`, `librarySource`.
644
+ - `SpriteIcon` (`@jgengine/core/ui/icons/spriteIcon.view`): A one-colour icon from a served SVG or PNG, tinted by `color` (or the text colour): game-icons.net item icons in place of two-letter text tiles. Also `SpriteIconProps`.
645
+ - `LibraryLoader` (`@jgengine/editor/shell/AssetLibraryBrowser`): Loads the shared asset library index; lazy so the editor bundle never carries it until opened.
646
+ - simple dog breeding needs only inheritValues and a tierAt stage list; a test shows it
647
+ - `BreedingEggSpec` (`@jgengine/core/breeding/breeding`): An egg's temperature band in °C, inclusive, and the seconds it survives out of that band before it is lost. Also `BreedingOffspring`.
648
+ - the sky publishes one light record each frame (sun, moon, ambient, sky colours, cloud cover), via publishSkyLight and readSkyLight. Water and clouds read it, so a game's own sky can replace the engine's.
649
+ - weather conditions take cloudCover (0..1). It blends like the other conditions, and rain or storm raise it. The editor's simulation inspector edits it.
650
+ - raymarched clouds lit by the sun by day and the moon by night. They thicken and grey with cloud cover, and far cloud fades into the horizon.
651
+ - the ocean bakes the ground under it into a bed map. Clear shallows, depth colour, shore foam, swash and rolling foam lines follow the real shoreline. It reflects the sky, takes sun and moon light and fog, and with horizon: true it follows the camera out to the horizon.
652
+ - ocean() takes horizon, clarity and bedResolution. Fernwild uses them, with an overcast weather state, blue sky and clouds.
653
+ - `createSkyLight` (`@jgengine/core/sky/skyLight.draw`): A sky light at noon under a clear sky, for a scene whose sky has not published one yet. Also `SkyDirection`, `SkyLight`, `publishSkyLight`, `readSkyLight`.
654
+ - `CLOUD_NOISE_SIZE` (`@jgengine/core/sky/volumetricClouds`): Edge length of the tileable cloud noise volume, in voxels.
655
+ - `OceanBedBounds` (`@jgengine/core/water/oceanBed`): A rect in an ocean sheet's local XZ: `[minX, minZ, maxX, maxZ]`.
656
+ - 1,030 Smithsonian Open Access scans (fossils, aircraft, spacecraft, artefacts) are library models, each listed only when its own 3D package is marked CC0, credited to the museum unit that holds it, with page and thumbnail. The shared DEMO_KEY ran out after the first 1,000 search items; `assets library ingest smithsonian` with `SI_API_KEY` set lists the other half.
657
+ - `assets pull smithsonian:<id>` fetches the package's Draco GLB into the shared store at real scale.
658
+ - `createAlertLevel` (`@jgengine/core/ai/alertLevel`): An alert level any stealth, heist or pursuit game can use, over the meter and ladder parts: reports raise a bounded value only while an observer holds the target in view, the value bleeds on the caller's curve once the target has been out of every observer's sight, labelled cut points decide what the alert resolves to, and a stand-down countdown tells the caller when to call its units off. Also `AlertAnchor`, `AlertLevel`, `AlertLevelConfig`, `AlertLevelState`, `AlertSighting`, `AlertStats`, `AlertStep`, `AlertTickContext` and 2 more.
659
+ - `createAlertLevel` (`@jgengine/core/world`): An alert level any stealth, heist or pursuit game can use, over the meter and ladder parts: reports raise a bounded value only while an observer holds the target in view, the value bleeds on the caller's curve once the target has been out of every observer's sight, labelled cut points decide what the alert resolves to, and a stand-down countdown tells the caller when to call its units off. Also `AlertAnchor`, `AlertLevel`, `AlertLevelConfig`, `AlertLevelState`, `AlertSighting`, `AlertStats`, `AlertStep`, `AlertTickContext` and 2 more.
660
+ - ringWallSolids in world/worldSolids, a ring wall that follows the ground
661
+ - `advancePhase` (`@jgengine/core/ai/phaseLadder`): Advance the phase clock by `dt` at a fraction of the ladder's value and return the phase in effect. Also `PhaseClockState`, `PhaseLike`, `PhaseStep`, `PhaseTell`, `createPhaseClock`.
662
+ - `createSummonedEncounter` (`@jgengine/core/summonedEncounter/summonedEncounter`): A fight a game starts by meeting a requirement at a place: the summoner pays a tier's cost and its extra condition, a portal counts down, then takes every candidate in range up to each kind's cap, each remembered where they stood. Also `CostSource`, `RefusedCandidate`, `SummonCandidate`, `SummonCheck`, `SummonResult`, `SummonReturn`, `SummonTier`, `SummonedEncounter` and 5 more.
663
+ - `ringWallSolids` (`@jgengine/core/world/worldSolids`): A closed ring wall: `sides` solid slabs round a circular floor, each standing on the lowest ground under it so no gap opens on a slope. Also `RingWallOptions`.
664
+ - `createSubdualFeeding` (`@jgengine/core/subdual/subdualFeeding`): Track subdual, feeding and quality for every creature the caller names. Also `FeedingDose`, `FeedingFood`, `FeedingSupply`, `SubdualFeeding`, `SubdualFeedingConfig`, `SubdualFeedingEvent`, `SubdualFeedingState`.
665
+ - a seeded surface material generator (sand, grass, soil, mud, rock, gravel, bark, snow) on the generator contract, baking tileable albedo, height, normal, roughness and AO once at load in slices
666
+ - terrain detail.surfaces blends generated ground, shoreline sand and slope rock through the existing terrain detail material, with anti-tiling and height-aware edges
667
+ - generated rock and driftwood use the rock and bark surfaces, projected in world space
668
+ - a material-variants dev demo showing every preset, or seeded variants of one
669
+ - `SURFACE_MATERIAL_GENERATOR` (`@jgengine/core/material/surfaceMaterialGenerator`): The surface material generator: one schema for every kind, with presets for the common looks. Also `SURFACE_MATERIAL_KINDS`, `SURFACE_MATERIAL_OUTPUT`, `SURFACE_MATERIAL_SCHEMA`, `SurfaceMaterialKind`, `SurfaceMaterialMaps`, `SurfaceMaterialParams`, `SurfaceMaterialSpec`, `bakeSurfaceMaterial` and 3 more.
670
+ - `bakeSurfaceMaterialShared` (`@jgengine/core/material/surfaceMaterialTextures.draw`): Bake a surface material once per spec and detail level and share it: a world that names the same sand twice, or remounts its terrain, pays for one bake. Also `SurfaceMaterialArrayTextures`, `SurfaceMaterialStandardMaps`, `bakeSurfaceMaterialSharedJob`, `surfaceMaterialArrayTextures`, `surfaceMaterialStandardMaps`.
671
+ - `NatureSurface` (`@jgengine/core/nature/natureMesh`): Generated surface materials a nature mesh can be drawn with.
672
+ - `ResolvedTerrainSurfaceLayer` (`@jgengine/core/terrain/terrain`): One generated terrain surface with its tile metres and tint resolved. Also `ResolvedTerrainSurfaces`, `TerrainSurfaceRole`.
673
+ - `createTerrainSurfaceTextures` (`@jgengine/core/terrain/terrainDetailMaterial.draw`): Bake a terrain's generated surfaces (shared per spec) and stack them into array textures. Also `TerrainSurfaceSlot`, `TerrainSurfaceTextures`, `createTerrainSurfaceTexturesJob`.
674
+ - `TerrainSurfaceLayer` (`@jgengine/core/world/features`): One generated terrain surface: a material spec plus how it tiles and tints. Also `TerrainSurfacesConfig`.
675
+ - hashUnit (a stable 0-1 roll per key, avalanched so neighbouring keys roll independently) and hashWords (FNV-1a over byte or word arrays, for digests) in @jgengine/core/random/rng.
676
+ - pole_line reads its seed. Each span's sag varies by the new sagJitter (default 0.2), so Randomize cables changes the run.
677
+ - `shuffleWithRng` (`@jgengine/core/random/pick`): A shuffled copy of `values` (Fisher–Yates) drawn from `rng`; the same seeded stream always gives the same order.
678
+ - `hashUnit` (`@jgengine/core/random/rng`): A stable roll in `[0, 1)` for one key — one deterministic draw with no stream to keep. Also `hashWords`.
679
+ - Rocketbox and Khronos model-library pulls try the `packs` release first (`model-library-<name>.zip`, or `JGENGINE_ASSETS_MIRROR`) and fall back to api.github.com only when the mirror lacks the entry.
680
+ - `scripts/mirror-assets.ts` builds one zip per Rocketbox or Khronos entry from the real source and uploads it; `workflow_dispatch` takes a `model` input.
681
+ - every check and generator row in scripts/run-stages.ts names the paths it reads; a diff that reaches none of them skips it, and a game-only diff judges games-depth on its own games
682
+ - a gate's cached pass is keyed on the files its row reads, not the whole tree
683
+ - scripts/perf-known-failing.json lists harbor-heat and drift-foundry as over the frame budget; it only shrinks
684
+ - LLMville PLAN.md names the engine owner of every module, the engine gaps, and six adoption milestones that each delete the private code they replace
685
+ - LLMville art direction describes today's look and offers three directions for the owner to choose
686
+ - `@jgengine/core/parts` re-exports the model layer of the part homes
687
+ - `bun run idea-clock <game>` reports minutes from a game's first commit to its from-zero flow
688
+ - jgengine create writes a 3d game that plays from second 0: a main menu (New game, Continue, Controls, Settings, Credits) in the game's own kit, credits read from jgengine.json, and a starter loop of walk, gather, an energy meter, a rank ladder that unlocks sprint and a beacon goal, built on statPool, thresholds, predicate, pacedSchedule and pick.
689
+ - Every scaffold writes PLAN.md (Direction, Features, Gaps, Milestones, design brief pending), src/game/probe.ts, proofs/flows/from-zero.flow.ts that reaches the goal through real keys inside the first minute, and perf-budget.json. `create --brief "<words>"` fills the plan's Brief line.
690
+ - games-design passes a pending brief until milestone 1 is ticked and requires the full brief from then on; games-depth only requires the from-zero proof to play until then, with its bars unchanged.
691
+ - GameFlowUI title and pause menus open the engine settings surface and show a sectioned credits document, so the games already on it gain Settings.
692
+ - Every 3D game gets an F3 perf overlay (FPS graph, draws, nodes, programs, costliest subsystems), a per-session input-plus-seed replay saved with F2+R and played back headless with `playReplayRecording`, and a context-loss screen instead of a black frame.
693
+ - `createReplayRecorder` (`@jgengine/core/replay/replayRecording`), `playReplayRecording` (`@jgengine/core/replay/replayPlayback.draw`), `PerfOverlay` (`@jgengine/core/devtools/perfOverlay.draw`); `createPlaySession` takes a `recorder` and `tick(held, dt?)`.
694
+ - `GrowthStage` (`@jgengine/core/breeding/breeding`): One growth stage: its name and the share of a species' maturation time it lasts.
695
+ - a cookbook of thirty common features, each a test that builds it from the parts in a few lines, rendered by gen into the jgengine skill and the website
696
+ - `evaluateStandingPredicate` (`@jgengine/core/progression/standing`): Evaluate a predicate over `standing.<trackId>` facts read from `reader` for one actor; an unknown track throws. Also `standingTracksRead`.
697
+ - `applyStatRate` (`@jgengine/core/progression/statGraph`): Scale one id's `rate` by a {@link StatRateModifier}; an omitted modifier leaves it unchanged. Also `StatRateModifier`.
698
+ - `predicateFloor` (`@jgengine/core/rules/predicate`): The `gte` floor a predicate sets on one fact path (the largest, when several), or `null` when it sets none — what a "needs 20 standing" line reads off an authored condition. Also `PredicateLeaf`, `predicateLeaves`.
699
+ - bun run part-stats and a gen stat line show importers per part home, the create* count and the folder count, with --worklist naming the private copies left
700
+ - the granular sand and soil model and its published-data experiments are back; a physical model checked against published data is engine ground truth and stays without a game adopter
701
+ - `continuumCollapse` (`@jgengine/core/granular/granularExperiments`): Release a column of `aspect` = h_i / r_i, radius `radius` m, on a flat bed and measure the deposit. Also `ContinuumCollapse`, `FlumeFlow`, `PouredHeap`, `inclinedFlume`, `pouredHeap`.
702
+ - `createGranularLayer` (`@jgengine/core/granular/granularLayer`): Create a granular layer over a bedrock grid. Also `GranularLayer`, `GranularLayerConfig`, `GranularLayerSnapshot`, `GranularPressReport`, `GranularStepReport`.
703
+ - `DAMP_SAND` (`@jgengine/core/granular/granularMaterial`): Sand with about 1% water. Also `BekkerSoil`, `DRY_SAND`, `GLASS_BEADS`, `GRAVEL`, `GranularMaterial`, `SANDY_LOAM`, `culmannHeight`, `flowFriction` and 6 more.
704
+ - `createGranularTerrain` (`@jgengine/core/granular/granularTerrain`): Bind a granular layer to a terrain's vertex grid. Also `GranularTerrain`, `GranularTerrainOptions`, `LandformCoverPlacement`, `landformLooseCover`.
705
+ - `tickCooldown` (`@jgengine/core/time/cooldown`): One step of a plain-number countdown: `remaining` seconds less `dt`, never below 0.
706
+ - ambient fauna groups for fish schools, insects and motes, and large flyers, built from flock, motion and spawn parts, instanced, authored as editor zones; Fernwild adopts them
707
+ - `FLOCK_MAX_NEIGHBORS` (`@jgengine/core/ai/flock`): Flockmates one agent considers per step in {@link createFlockStepper} unless `maxNeighbors` says otherwise. Also `FlockBuffers`, `FlockStepper`, `FlockStepperState`.
708
+ - `FAUNA_GLOBAL_CAP` (`@jgengine/core/ambientFauna/ambientFauna`): Default of {@link AmbientFaunaOptions.globalCap}. Also `AmbientFaunaOptions`, `AmbientFaunaState`, `FAUNA_GROUP_LIMIT`, `FaunaArea`, `FaunaFrame`, `FaunaGroup`, `FaunaGroupState`, `FaunaMotion` and 5 more.
709
+ - `AmbientFauna` (`@jgengine/core/ambientFauna/AmbientFauna.draw`): Ambient fauna: fish schools, insect swarms, drifting motes and soaring flyers, one instanced draw per species part. Also `AmbientFaunaProps`.
710
+ - `AmbientFaunaConfig` (`@jgengine/core/ambientFauna/ambientFaunaConfig`): Turn ambient fauna on: the species table plus how groups see the world. Also `FaunaSpecies`.
711
+ - `AMBIENT_FAUNA_KIND` (`@jgengine/core/ambientFauna/ambientFaunaKind`): The editor volume kind that places an ambient group: its footprint is the area, or it borrows the footprint of another volume (a water volume for a school, a grass field for a swarm). Also `AMBIENT_FAUNA_SCHEMA`, `faunaGroupsFromVolumes`.
712
+ - `FaunaSelection` (`@jgengine/core/ambientFauna/faunaCull`): How many agents {@link selectVisible} put in each LOD list. Also `FaunaView`.
713
+ - an art direction for every game: palette, packs, HDRI, LUT, fonts, kit and the pass list each look pass works from
714
+ - curated HDRIs, LUT grades, 40 PBR materials and OFL fonts in the asset library, each picked by id in one line
715
+ - `CuratedJob` (`@jgengine/assets/catalogs/curatedPull`): One curated file to serve: what it is, its id and the folder under `public/` that holds it. Also `CuratedKind`, `CuratedPullContext`.
716
+ - `FONT_DIR` (`@jgengine/assets/catalogs/fontLibrary`): Where a game serves fonts from, relative to `public/`. Also `FONT_LIBRARY`, `FONT_LICENSE`, `FONT_PACKAGE_VERSION`, `FontEntry`, `FontId`, `FontRole`, `libraryFontPairing`.
717
+ - `HDRI_DIR` (`@jgengine/assets/catalogs/hdriLibrary`): Where a game serves the HDRI folder from, relative to `public/`. Also `HDRI_LIBRARY`, `HDRI_LICENSE`, `HDRI_RESOLUTION`, `HdriEntry`, `HdriId`, `hdriEnvironment`.
718
+ - `creditsForLooks` (`@jgengine/assets/catalogs/looksCredits`): Credit sections for the HDRIs, colour grades and fonts a game ships, each entry with its author and licence. Also `LooksUsed`.
719
+ - `LUT_GRADES` (`@jgengine/assets/catalogs/lutGrades`): The 16 shipped colour grades, each a recipe baked into a 32³ cube. Also `LUT_GRADE_DIR`, `LUT_GRADE_LICENSE`, `LUT_GRADE_SIZE`, `LutGrade`, `LutGradeId`, `LutGradeRecipe`, `lutGrade`.
720
+ - `formatCubeLut` (`@jgengine/core/postfx/cubeLut`): Writes a {@link LutCube} as `.cube` text (the inverse of {@link parseCubeLut}). Also `parseCubeLut`.
721
+ - Brightway Park: lawn `foliage/grass`, promenade and plazas `paving/plaza`, service paths `ground/gravel-fine` and back lots `ground/dirt-road` as terrain paint layers in `editor.scene.json`.
722
+ - Brightway Park: gulls soaring over the gate and the south shore from two `ambient_fauna` volumes. The catalog has no gull, so they are the Dove model (Poly by Google, CC-BY 3.0) tinted white; credited in `ART-CREDITS.md`.
723
+ - Odd Orbit: room floors from library scans, tinted to the pastel palette: `stone/terrazzo` living floor, `tile/ceramic` kitchen, `wood/floor` bedroom, `plastic/matte` work corner, `foliage/grass` garden bed.
724
+ - Odd Orbit: drifting motes and glowflies over the habitat garden from two `ambient_fauna` volumes.
725
+ - industrial-sunset HDRI, bleach-bypass-warm grade, Saira Stencil One, Barlow Condensed, dark cracked asphalt and packed dirt in the look and material libraries
726
+ - `autumn-painterly` colour grade, `im-fell-english-sc` and `alegreya` fonts in the look library. The `dusk` HDRI is already Poly Haven `qwantani_dusk_2_puresky`.
727
+ - Ember Command's units, buildings and props are Quaternius models (RPG Characters, Medieval Village and Buildings, Fantasy Props), team-tinted; autumn Stylized Nature forest, leaf litter and crop fields in the scene; horizon smoke, torch fire, drifting leaves, crows and banners in the wind.
728
+ - Ember Command's parchment kit with the wax red accent, the golden mood, dusk sky at 0.7, the grade, and credits for every pack, sky, grade and font.
729
+ - the Kloofendal tropical sky, Source Sans 3 and a tropical lush grade in the look library
730
+ - `withSwappableRoadSurface` (`@jgengine/core/roads/liveRoadSurface`): Wrap a road source so a game can change what its streets are made of while it runs: wet asphalt after dusk, snow over winter, a painted event route. Also `SurfaceSwappableRoadSource`.
731
+ - screen-space reflections, soft shadows, volumetric fog and motion blur, each behind its own toggle and quality tier; rigged characters get foot IK, locomotion and glance by default
732
+ - `GLTF_MATERIAL_EXTENSIONS` (`@jgengine/assets/gltfMaterials`): Native material/texture extensions the pinned Three.js GLTFLoader implements.
733
+ - `CHARACTER_MOTION_ON` (`@jgengine/core/anim/characterMotion`): Every part on: what a rigged entity gets when nothing switches a part off. Also `CharacterMotionConfig`, `CharacterMotionParts`, `CharacterMotionPlan`, `planCharacterMotion`, `resolveCharacterMotion`.
734
+ - `CharacterMotionContext` (`@jgengine/core/anim/characterMotion.draw`): The game's own character-motion layer (`scene.characterMotion`); the shell provides it. Also `useCharacterMotion`.
735
+ - `idleOnlyAnimation` (`@jgengine/core/game/clipRoles`): The rig's idle clip alone, looping: what a rigged entity plays when its locomotion is switched off (`characterMotion.locomotion: false`).
736
+ - `DEFAULT_OCCLUDER_DISTANCE` (`@jgengine/core/lighting/softShadows`): Metres between a typical caster and the ground it shadows, used when a light leaves it unset. Also `DEFAULT_SHADOW_RADIUS`, `SUN_ANGULAR_DIAMETER_DEG`, `ShadowFilter`, `SoftShadowInput`, `lightingHasSoftShadows`, `softShadowRadius`.
737
+ - `registerMotionBlurBody` (`@jgengine/core/postfx/motionBlurPass.draw`): Let motion blur follow a moving body (a character, a car, a thrown crate) along its own screen motion.
738
+ - `MAX_GLOSSY_SURFACES` (`@jgengine/core/postfx/ssrPass.draw`): Most glossy surfaces one frame masks; the nearest scan order keeps the first ones found.
739
+ - `LOOK_SUN_SIZE` (`@jgengine/core/render/lookPreset`): The key light's angular size each look gives a sun that leaves `lightSize` unset, so its shadows soften like daylight while the player's soft-shadows setting is on.
740
+ - `DEFAULT_MOTION_BLUR` (`@jgengine/core/render/postProcessing`): Motion blur used for the fields a `motionBlur` config leaves unset. Also `DEFAULT_SSR`, `MotionBlurConfig`, `SsrConfig`.
741
+ - `GraphicsPostStages` (`@jgengine/core/settings/graphicsProfile`): One switch per post stage a tier or the player can turn off.
742
+ - nine ambientCG ground scans in the material library (Ground033, Grass005, Ground020, Rock035, Ground054, Ground025, Gravel022, Gravel032, Ground031)
743
+ - `libraryTerrainSurface(name)` for `detail.surfaces.ground|sand|rock`; the editor's Scan picker and `set_terrain_layers` resolve a layer's library name to colour, normal, roughness, AO and height maps
744
+ - `detail.scanTriplanarAngle` (default 45) switches scans to side projections on slopes; scan height decides which layer breaks through at blend edges
745
+ - `refreshStaticTransforms` (`@jgengine/core/model/staticTransforms.draw`): Re-bake a frozen subtree's world matrices from its current position, rotation and scale, and its parent's world matrix: the one-off update for static content something moved (a door swung, a placement edited).
746
+ - `HlodConfig` (`@jgengine/core/visibility/config`): Far static cells draw one merged proxy instead of their props.
747
+ - i18n plurals, locale formatting and right-to-left layout with the platform's Intl APIs; the player's locale is a shell setting
748
+ - `selectPlural` (`@jgengine/core/i18n/i18n`): The template of `message` for `count`: the exact `zero`, else the locale's category, else `other`. Also `Message`, `PluralCategory`, `PluralMessage`.
749
+ - `LocaleRoot` (`@jgengine/core/i18n/i18n.view`): The shell's locale root: keeps `i18n` on the player's locale setting (browser default, base-locale fallback), provides it to the tree, and sets `lang` and `dir` on the document and a wrapper so right-to-left locales flip the HUD. Also `LocaleScope`.
750
+ - `formatCompact` (`@jgengine/core/i18n/localeFormat`): A short large number: `12500` is `12.5K` in English, `1.25万` in Japanese. Also `DurationFormatOptions`, `formatDate`, `formatLocaleCurrency`, `formatLocaleDuration`, `formatLocaleNumber`, `formatPercent`, `formatRelative`, `formatRelativeTo` and 1 more.
751
+ - `LOCALE_SETTING_ID` (`@jgengine/core/i18n/localeSetting`): The persisted settings id of the player's locale. Also `localeSettingDef`, `matchLocale`, `readLocale`, `withLocaleSetting`.
752
+ - `localeDirection` (`@jgengine/core/i18n/textDirection`): Reading direction of a locale tag (`"ar"`, `"he-IL"`, `"ur-PK"` are `rtl`). Also `TextDirection`.
753
+ - `TextDirectionProvider` (`@jgengine/core/i18n/textDirection.view`): Sets the reading direction `useTextDirection` answers below it. Also `useTextDirection`.
754
+ - `LOCALE_SETTING_ID` (`@jgengine/core/ui`): The persisted settings id of the player's locale. Also `Message`, `PluralCategory`, `PluralMessage`, `TextDirection`, `localeDirection`, `localeSettingDef`, `matchLocale`, `readLocale` and 2 more.
755
+ - `LocaleRoot` (`@jgengine/react`): The shell's locale root: keeps `i18n` on the player's locale setting (browser default, base-locale fallback), provides it to the tree, and sets `lang` and `dir` on the document and a wrapper so right-to-left locales flip the HUD. Also `LocaleScope`, `TextDirectionProvider`, `useTextDirection`.
756
+ - `bun run games:provision build <game>` runs a game's asset pipeline in one call: provision, KTX2 texture twins, simplified mesh levels and baked impostor atlases for the model files its `jgengine.json` `assetBuild` names. Cached by content, at most 4 workers, idle priority; `--no-impostors` and `--textures-only` narrow it.
757
+ - `buildModelLods` (`@jgengine/assets`) writes `<file>.lods/` beside a model: geometry-only levels that keep each material's source index, an optional impostor atlas, and `meta.json`.
758
+ - `visibility.meshLods: { screenSizes, hysteresis?, impostorDistance? }` switches props and scatter to the built levels by size on screen, and big props to baked impostor cards past a distance. `ModelConfig.meshLods` overrides it per model; `false` turns it off. Off unless set; a model with no built files draws as before.
759
+ - `ModelVariantLodConfig` takes `hysteresisRatio` and `scaleWithInstance`.
760
+ - Harbor Heat builds levels for its library props and trees and bakes impostors for its jacaranda and quiver trees; Fernwild builds levels for its grass, flowers, plants, mushrooms and ore rocks.
761
+ - `CharacterMotion` (`@jgengine/core/physics/physicsBackend`): A backend-native kinematic character mover: collide-and-slide, stepping, slopes and ground snap in the solver. Also `CharacterMotionDesc`, `CharacterMotionResult`, `PhysicsQuatOut`, `PhysicsVec3Out`, `RayCastVehicle`, `RayCastVehicleDesc`, `RayCastWheelDesc`, `RayCastWheelState`.
762
+ - `VehicleBackendLinkState` (`@jgengine/core/physics/vehicleBackendLink`): A link's serializable state: the pose its chassis last synced to.
763
+ - `DEFAULT_SIM_HZ` (`@jgengine/core/runtime/simLoop`): Steps per second a loop runs at when `hz` is not set: the physics backends' own substep rate, so one sim step is one solver step.
764
+ - `RapierSnapshot` (`@jgengine/rapier`): A Rapier backend's serializable state: the world bytes plus the engine-handle tables over Rapier's own handles.
765
+ - `RapierSnapshot` (`@jgengine/rapier/rapierBackend`): A Rapier backend's serializable state: the world bytes plus the engine-handle tables over Rapier's own handles.
766
+ - `defineGame({ health })` (`@jgengine/shell`) turns on crash reports, telemetry, auto quality and the game's own recoverable error screen. Each part is off unless the game sets it, and no vendor SDK is in the engine.
767
+ - `createCrashSeam`, `installCrashHandlers` and `scrubCrashText` (`@jgengine/core/health/crashSeam`) catch render, tick and async errors, window errors and unhandled rejections, and hand a scrubbed report with build, game, tier and the last N events to an injected `CrashReporter`.
768
+ - `createTelemetry` (`@jgengine/core/health/telemetrySink`) is a batched, bounded event queue in front of an injected `TelemetrySink`; with no sink it does nothing.
769
+ - `createAutoQuality` (`@jgengine/core/health/autoQuality`) picks a graphics tier from frame time with hysteresis, a cooldown and backoff, driven by an injected clock. A new Auto quality setting keeps the player's tier pick and every effect toggle.
770
+ - Per-game `bundleKb` budgets in each game's `perf-budget.json`, enforced and printed as a table by the site asset check.
771
+ - The load probe reports bytes allocated per tick under `BUN_JSC_useGC=false`.
772
+ - Drift Foundry turns on auto quality and its own error screen.
773
+ - `createWorldStreamer` follows every focus point (every player), with hysteresis, per-update load and unload budgets, a loading state held until `markReady`, `retune`, and `snapshot`/`restore`. `gridShards` and `gridCellId` make streamed grid cells.
774
+ - `createCellContent` (`@jgengine/core/visibility/cellContent`), with `sceneObjectCells` and `sceneEntityCells`: bodies and entities in an unloaded cell keep simulating, freeze, or despawn with a saved record, by the rule the game picks, and come back a few per tick.
775
+ - `createCellStreaming` and `bindCellStreaming` (`@jgengine/core/visibility/cellStreaming`): cells load and unload around every player within budgets, and model files are fetched before a cell's content comes back. The renderer keeps an away cell's far proxy, parks a leaving cell once its proxy is built, and warms cells it has never seen.
776
+ - `createNavTiles` and `navTileFromGrid` (`@jgengine/core/nav/navTiles`): a nav mesh built and stored per tile, rebuilt only where a region changed, streamed around focus points, and stitched into one `NavRuntime` so paths cross tile borders.
777
+ - `ObjectStore.retain` keeps parked props in `snapshot()`, so a save written while a cell is away still holds them.
778
+ - The agent bridge's `scene_counts` verb reports resident entities and objects.
779
+
780
+ ### Changed
781
+
782
+ - Merge remote-tracking branch 'origin/t3/general-value-inheritance' into agent/engine-parts
783
+ - # Conflicts:
784
+ - # games/capabilities.json
785
+ - # games/fernwild/src/game/creatures.ts
786
+ - # scripts/type-escape-baseline.json
787
+ - Merge remote-tracking branch 'origin/t3/meter-rates-overflow' into agent/engine-parts
788
+ - Merge remote-tracking branch 'origin/t3/paced-schedule' into agent/engine-parts
789
+ - Merge remote-tracking branch 'origin/t3/motion-track-part' into agent/engine-parts
790
+ - # .claude/skills/jgengine-world/capabilities.md
791
+ - Proof: bun run drive fernwild --flow fernwild-creator (makes Ada in the north, shows her from the front and in the pane, dies in the south and wakes in the north)
792
+ - Fernwild's cloth armour can be worn: double-click a piece to wear it in ARK's head, torso, legs, hands or feet slot, click a worn piece to take it off; each piece widens the comfortable temperature band (hypothermal and hyperthermal insulation), counts toward weight, survives a save and stays with the body on death
793
+ - Fernwild's inventory centre pane is ARK's survivor pane: the live survivor between the five armour slots, insulation, an XP bar and the stats with their level-up buttons
794
+ - Fernwild's rocks, boulders and pebbles are rounded and craggy, as ARK draws rock
795
+ - Fernwild's thirst test drains its forty minutes in 2-second steps, so it finishes inside CI's 5 s test limit (it ran 5.1 s on beta). The assertions are unchanged.
796
+ - Part of #2767
797
+ - Part of #2767
798
+ - Part of #2767
799
+ - `muscleMetabolicPower(state)` charges positive fibre work at 1/0.25 and negative at 1/1.2 (Margaria 1968), the model that best follows slope changes of seven compared by Koelewijn et al. 2019; `MuscleState` carries `activeForce`
800
+ - `FITTED_WALKS` are refitted under the new cost, with slope fits at 1.3 m/s
801
+ - Part of #2699
802
+ - prepareGeneratorVariants prepares every variant at the same time
803
+ - Fernwild's trees use leaf cards
804
+ - Part of #2699
805
+ - Fernwild's broadleaf trees, pines, redwoods and dead trees are grown maples and pines; only its palette entries changed
806
+ - Fernwild's load baseline is re-recorded: a first visit grows 28 tree variants (about 2 s of main-thread work); later visits read them from IndexedDB
807
+ - Part of #2699
808
+ - the reference stand is spaced for a dominant tree (spacing index 0.3, Oliver & Larson 1996), and 20-year DBH targets come from the FIA site trees' height–diameter relation where the site trees hold no trees that young
809
+ - Part of #2699
810
+ - Fernwild's trees are unique, at the same frame cost as before.
811
+ - A scatter impostor field keeps its far mesh when a few placements are hidden.
812
+
813
+ Part of #2699
814
+ - Part of #2699
815
+ - Part of #2699
816
+ - Part of #2699
817
+ - a Tallo DBH class with under 10 trees of the species takes its genus's trees, flagged genus; FIA height curves are anchored at breast height; BAAD leaf area per mass counts only plants 5 m and taller.
818
+ - species the fit could not hold inside the limits are replaced: coast redwood by black locust, Scots pine by Virginia pine, red spruce by eastern cottonwood, eastern redcedar by southern red oak, white fir by water oak, ponderosa pine by sand pine.
819
+ - Part of #2699
820
+ - Part of #2699
821
+ - Part of #2699
822
+ - Part of #2699
823
+ - Tested: a dense red pine plantation self-thins with slope about -1.7 (Reineke -1.6), a cleared plot seeded by maple, birch and aspen turns maple-dominated by year 200, and a hectare runs 300 years in about 3 s.
824
+ - Not yet: the bake verb, and full-detail trees shaped by their neighbours' crowns over time rather than by mean light and spacing.
825
+ - Part of #2699
826
+ - release 0.50.0: games start from zero with designed loops (Brightway Park, Fernwild, Scrap Signal), engine onboarding and new-game state, depth checks
827
+ - `ReferencePropulsion.settle` and `evaluate` receive the surface deflections, so a rotor can read its controls.
828
+ - Part of #2698
829
+ - Part of #2698
830
+ - Part of #2698
831
+ - Part of #2742
832
+ - Part of #2742
833
+ - Part of #2742
834
+ - sugar maple and white pine are refitted (species version 2) and the plant simulation version is 3, so cached plants regrow
835
+ - Open-grown crowns still run 1.2-1.7x Ek 1974 per DBH because simulated crowns hold too little leaf area; tracked in #2729
836
+ - Part of #2699
837
+ - Part of #2837
838
+ - Part of #2837
839
+ - Part of #2837
840
+ - Part of #2837
841
+ - Fernwild grows its trees, palms, rocks, boulders, bushes, ferns and pebbles from the nature generators instead of repeating one GLB per species
842
+ - Part of #2698
843
+ - ice shields its bed from rivers, soil creep and lakes, rockfall onto a glacier rides it to the snout, and till melts out over the ablation zone
844
+ - Fernwild's tutorial banner sits in the top slot above the ADDED/CONSUMED lines, so the two never overlap
845
+ - Fernwild's south beach has big weathered boulders, rocks, ferns and cycads out on the sand and in the surf, as ARK's does
846
+ - Fernwild's south jungle canopy grows maples among its palms again, now that grown trees draw leaf cards instead of flat slabs.
847
+ - Fernwild's inland rolls: hills through the jungle, plains, eastern forest, redwoods and highlands, five cliff lines, and gullied mountains instead of smooth cones
848
+ - Fernwild has waist-high grass inland: green grass with straw tips and broad leaves through the jungle and plains, as in ARK
849
+ - Fernwild's forty-minute dry-throat survival test gets a 20 s timeout; it ran just past CI's 5 s default
850
+ - Fernwild's hotbar, inventory, crafting list and creature screens draw game-icons.net item icons on the coloured tiles instead of two-letter initials
851
+ - Fernwild's credits name each icon artist
852
+ - Faster frames in every game with a large scatter field: an instanced draw that holds nothing, and a field chunk past its draw distance, now leave the per-frame matrix pass instead of being walked every frame
853
+ - The matrix pass's check for a world matrix written from outside is unrolled and skips the constant bottom row
854
+ - Fernwild shows ARK's item lines at the top of the screen: an icon and "ADDED: 3x Thatch" for every item gained, "CONSUMED: 1x Cooked Meat" for food eaten, stacking and fading; the grey +3 Thatch text on the trunk and the left-edge gain line are gone
855
+ - Fernwild's load baseline is re-recorded at 13.7 s scene ready: clean beta already measured 14-16 s against the old 9.7 s, so every Fernwild landing failed the guard (#2758)
856
+ - OnboardingHud shows a window of steps; Fernwild shows two
857
+ - Fernwild's rocks, boulders and ore rocks are solid: the survivor walks around them instead of through them, as in ARK
858
+ - Fernwild's vitals are ARK's right-edge icon column: temperature, level, weight, water, food, stamina and health as cyan game-icons glyphs; H shows the numbers beside them, as ARK's extended HUD does
859
+ - Each worn piece is a layer of the body's own skin cut to that area by bone and height, pushed out a few millimetres and skinned to the same skeleton, so it bends with every clip, foot IK and the folded first-person head (`@jgengine/core/anim/wearable`)
860
+ - Fernwild's cloth hat, shirt, trousers, gloves and boots now show on the survivor in tan and brown fibre, in third person, first person and the inventory's survivor pane; taking a piece off removes it
861
+ - Fernwild credits ambientCG for the cloth texture
862
+ - Part of #2741
863
+ - Part of #2741
864
+ - Part of #2741
865
+ - Part of #2768
866
+ - Part of #2768
867
+ - Landform glaciers default to first-order flow, which drags ice on the valley walls so a V valley turns into a U (cross-section exponent 1.0 to 2.05 over 40 kyr, as Harbor 1992 found)
868
+ - Glacial till now travels down the ice surface to the glacier's snout
869
+ - Part of #2699
870
+ - Part of #2699
871
+ - Part of #2698
872
+ - Shared matrixEigenvalues and solveLinearSystem now live in core math/; flight trim and the bike use the same ones
873
+ - Part of #2698
874
+ - Part of #2698
875
+ - Part of #2698
876
+ - Tests reproduce the coefficient set's published characteristic values within 1% (peak friction, cornering and slip stiffness, pressure terms, trail, rolling resistance, vertical stiffness); tyre temperature is left out because MF 6.1 has no thermal model and no thermal set is published for this tyre
877
+ - Part of #2698
878
+ - Part of #2768
879
+ - Sun shafts and height haze were already in the atmosphere post stage. The sea now writes depth so shafts no longer treat it as open sky.
880
+ - Perf (fernwild, walk, 8 s, RTX 3070, machine at 85% CPU load from other work; best of 6 alternating runs): beta p50 17.4 ms / GPU 11.9 ms, this branch p50 17.6 ms / GPU 11.7 ms. Run-to-run spread under that load was about 30%.
881
+ - Before (beta), at noon, overcast, rain, storm, dawn, dusk, night and the shore: ![before](https://raw.githubusercontent.com/Noisemaker111/jgengine/pr-shots/pr-shots/t3/sky-water-light-systems/sky-before-sheet.png)
882
+ - After: ![after](https://raw.githubusercontent.com/Noisemaker111/jgengine/pr-shots/pr-shots/t3/sky-water-light-systems/sky-after-sheet.png)
883
+ - Shore before / after: ![shore-before](https://raw.githubusercontent.com/Noisemaker111/jgengine/pr-shots/pr-shots/t3/sky-water-light-systems/shore-before.png) ![shore-after](https://raw.githubusercontent.com/Noisemaker111/jgengine/pr-shots/pr-shots/t3/sky-water-light-systems/shore-after.png)
884
+ - Waves, then overcast into rain (the clock runs 12x in the middle): ![clip](https://raw.githubusercontent.com/Noisemaker111/jgengine/pr-shots/pr-shots/t3/sky-water-light-systems/fernwild-weather.gif)
885
+ - Fernwild: grained beach sand with pebbles, grass and soil inland, cliff rock on slopes
886
+ - Every procedural system hashes and draws through the shared seeded RNG in random/rng; about 40 private FNV, LCG and string-hash copies across the engine and games are deleted.
887
+ - Harbor Heat's turf test now keeps the Carmines angry for the whole run. Under fair rolls, one angry spell (it cools in about 800 s) rarely lets them retake a block; the old roll passed on a 9-of-9 streak. Worth a balance look.
888
+ - Still private, on purpose: the jgengine CLI starter terrain and @jgengine/github have no core dependency; odd-orbit's idle-wander hash stays because its balance bot only keeps the charter with that spread.
889
+ - the perf gate judges a 16.7 ms p95 frame on the RTX 3070 at 1600x900, one game at a time on the uncapped clock, and keeps the GL allocation check; draws are printed, not gated
890
+ - Part of #2837
891
+ - Part of #2837
892
+ - Part of #2837
893
+ - Part of #2837
894
+ - Part of #2837
895
+ - Part of #2837
896
+ - Part of #2837
897
+ - Part of #2837
898
+ - Part of #2837
899
+ - Part of #2837
900
+ - Part of #2837
901
+ - Rule: reference sims are the engine's physical ground truth, live in scripts/reference, run in CI, and need the published data they reproduce, not a game
902
+ - Part of #2837
903
+ - Part of #2837
904
+ - Part of #2837
905
+ - Part of #2837
906
+ - Part of #2837
907
+ - Part of #2837
908
+ - Part of #2837
909
+ - Part of #2837
910
+ - Part of #2837
911
+ - Part of #2837
912
+ - Part of #2837
913
+ - Part of #2837
914
+ - Part of #2837
915
+ - Part of #2837
916
+ - Part of #2837
917
+
918
+ ### Fixed
919
+
920
+ - barrel checks reuse the parsed package instead of rebuilding it five times
921
+ - Fernwild creatures use scatterPoints after the merge
922
+ - Harbor Heat's Carmines calmed down 40 s after losing a block, before their first push at 83 s, so they never pushed back. Losing a block now angers them for about 7 minutes, they push every 60 s for 25 hold, and an undefended block falls back to them in 4-5 minutes in 93 of 100 runs
923
+ - Harbor Heat's 'drop them or lose the block' now holds: each crew member dropped on your block gives back 10 hold, so beating a push's 3-man crew undoes it
924
+ - entity hydrate kept dropping what an entity wore
925
+ - world map labels near the east edge read leftward and stay on the map
926
+ - the implicit ice solve visits only icy cells and their neighbours, so a 40 km range under 7% ice steps 5 times faster (157 s to 31 s per 2 kyr) with bit-identical results
927
+ - The quadruped reference changes from trot to gallop at 1.54·M^0.216 m/s (Heglund & Taylor 1988), so a horse at the transition now has duty factor 0.43 (Biewener 1983: 0.39–0.43)
928
+ - A 1 m drop landing peaks at 5.6 BW (Niu et al.: 4.4–6.1): soft tissue on the trunk, thighs and shanks wobbles on the bone (Gruber 1998), and the legs brake with the ankle extensors fully on and hip and knee extensors at 0.4 (Santello & McDonagh 1998)
929
+ - Net walking cost on a +6% grade is 1.44× level and on a −6% grade 0.65× (Minetti et al. 2002: 1.44–1.64× and 0.51–0.71×); level walking at 1.3 m/s still costs 3.14 J/(kg·m), inside Ralston's ±12%
930
+ - open-grown sugar maple and white pine crowns now match Ek 1974 widths (0.8–1.25×) at 20, 50 and 100 years, and stand-grown crowns sit inside the Tallo band
931
+ - forest-grown trees reach FIA site-tree diameters on site index 65, and open-grown trees carry the BAAD leaf area per sapwood area
932
+ - evergreen foliage is renewed only after leaf.lifespanYears, and laterals the bud cap refuses grow as short shoots
933
+ - species leaf area per mass comes from BAAD plants 5 m or taller, so a sapling's thin shade leaves no longer halve a canopy tree's foliage mass (sugar maple back to 22 m²/kg, inside the Jenkins 2003 crown-fuel band)
934
+ - a mown lawn no longer reads as gone to seed.
935
+ - rhizomes and stolons no longer root past a cell's shade limit.
936
+ - a coconut palm no longer grows a giant flat slab of bark; palms and ferns have no cambium, so surplus carbon no longer widens their newest trunk sections.
937
+ - the grown-plant generator's species picker listed only sugar maple and white pine, so a scene asking for any other species got a sugar maple.
938
+ - scale-leaved species are sized by their spray, so cedars no longer starve; longleaf pine carries 2 needles per node.
939
+ - palm and fern stems no longer widen after they form, since they have no cambium; a palm keeps its crown to old age.
940
+ - Fernwild's dead trees are snags, not winter maples
941
+ - pickWeighted gives a roll exactly on a boundary to the later item and never returns a zero-weight item, so it matches what loot tables always did
942
+ - The material library lists `ground/beach` once; Harbor Heat's and the terrain pass's entries for the same Ground033 scan both landed.
943
+ - The ambientCG source list has one `Ground033` entry; the same two passes each added it, which failed the shipped-manifest check.
944
+ - in first person, walking, running and jumping no longer show the player's own neck, hair or collar; the body slides so its folded head stays under the camera
945
+ - sugar maples grow a broad, rounded crown instead of a spire; apical control now falls with age (apicalControlMature, apicalControlHalfYears), while white pines keep enough of it to stay conical
946
+ - two data errors common in copied F-16 table ports (corrupted CL rows at beta 5-15°, alpha 15-25°, and idle thrust -170 for -710 at Mach 0.6); this uses the book values
947
+ - ice thickness is solved fully implicitly by Newton's method with an active set, so glaciers converge on real mountains instead of piling up 15 times too much ice
948
+ - first-order glaciers match each face's speed to the first-order solve, so a smooth steep bed carries a smooth ice surface (steps under 2 m, from 130–150 m)
949
+ - the editor's Asset library 'Add to game' and drag work in the shared dev runner (bun run drive): the runner serves library pulls for the game it hosts, and the pulled files join that game's asset list
950
+ - a game quoting a makehuman: key gets it at provision time
951
+ - round state and agent work schedules run on the shared phase part; a finished match no longer reports a full timeLeft
952
+ - Fernwild's from-zero proof faces what it gathers, closes a tame's inventory opened by mistake, rests when winded, walks to the Phiomia itself and stops chopping before the bag is overweight
953
+ - a grass field's ground mat samples the ground once per vertex instead of six times, and tests only the clearance masks that reach it, so large grass fields no longer freeze the click into play
954
+ - Wet fuel no longer catches when lit; a cell's fire only starts where its fuel can carry one.
955
+ - the browser fixture cleanup test holds its save response without a real socket, so it no longer times out on Linux CI
956
+ - event, break, combo and resource meters, regen shields, vitals and body temperature run on the shared meter, pool and tier parts; stat modifiers stack through statGraph; reward claims use pickUniform
957
+ - round state and agent work schedules run on the shared phase part; a finished match no longer reports a full timeLeft
958
+ - quest, skill tree, talent, recipe and build permission gates are conditions the shared requirement part evaluates; harvest strikes use spatial/spatialIndex instead of their own grid
959
+ - wave countdowns and population refills run on the shared schedule part; spawn picks, wave entries and population species use the shared weighted pick; pressure and interest tiers use tierAt
960
+ - affixes, loot stats and walk speed stack through statGraph; encumbrance tiers use tierAt; loot plans and Scrap Signal's rarity roll use pickWeighted
961
+ - glacial erosion as the square of sliding speed (erosionExponent 2) no longer runs away; a valley comes out the same whether 16 kyr pass in one landscape step or eight
962
+ - ice and bed take turns within a landscape step, each turn wearing at most a tenth of a cell and at least iceStep long, and walls the ice undercuts collapse after each turn
963
+ - till piles no higher than the ice it melts out of and no steeper than its angle of repose, takes the room of the ice that held it, and what runs clear of the ice leaves with the meltwater
964
+ - loose cover under a glacier is held by the ice and does not slide
965
+ - debris a glacier melts out emerges on its surface and rides to where the ice ends, laid there as end and lateral moraines instead of a till blanket under the glacier that shielded its bed
966
+ - a sugar maple grows from seed to 400 years in about 3.6 s, down from 6.4 s. Passes are fused, the growth solve walks only nodes with spare sapwood, the bud threshold uses a quickselect, and the light field and pipe cost are classes so many live plants stay fast
967
+ - old crowns no longer freeze at the bud cap and starve. Leaf cohorts keep their age through merges, gas exchange keeps half its rate at the height limit (Koch et al. 2004), and lateral tips that keep losing at the cap give their slot away (Sachs & Novoplansky 1995)
968
+ - short grass (greens, fairways) showed no blades because the turf mat floated above them; the mat now sits under the blades and carries fine blade grain and normal detail up close
969
+ - a small grass patch with no mow stripes lost its whole mat to the edge feather
970
+ - survey outlines (coast, ridge, river, biome) no longer draw as brown road strips across the ground and the shallows
971
+ - auto-exposure no longer lifts a night back up to dusk; it lifts only by the sky's share of daylight
972
+ - grass blades masked to nothing no longer leave flat slivers on bare ground
973
+ - the reference rigid-body tree can snapshot and restore its state
974
+ - the Magic Formula tyre rolling backward now mirrors the slip, so friction opposes sliding in reverse (a parked car used to creep)
975
+ - the dev runner served .svg files as octet-stream, so SVG masks and images from a game's public folder did not draw
976
+ - library ingest's public-catalogue fetch is on the scaffold-launch remote list
977
+ - Fernwild owns its baby-to-adult stages, timings, incubation bands and litter odds; old breeding saves start fresh (save key fernwild.breeding2)
978
+ - the night sky stayed dusk-orange. Night now holds between the twilights, and the day cycle owns fog colour, so night has no bright horizon band.
979
+ - Fernwild, Scrap Signal and Beacon Bastion own their boss costs, caps, clocks and phase numbers; old Fernwild boss saves start fresh (save key fernwild.brood)
980
+ - Fernwild owns its taming numbers and food rows in data/taming.ts; old creature saves start fresh (save key fernwild.creatures2)
981
+ - weather particles, lightning, fire smoke, reverb noise, scatter regions, editor directives, world-model schedule chances, LOD phases and building massing now draw from the shared generator, so their seeded output changes once. Terrain shape, llmville rolls and harbor-heat traffic keep their exact values.
982
+ - A 403 saying the session's GitHub access is not enabled is reported as a sandbox policy denial naming the entry, not as a transient error.
983
+ - the crowd and RVO hot paths measure length with math/scalar length2 (sqrt of the squares) instead of Math.hypot, so the nav crowd corridor test reads the same gap on every machine (from #2846, with clamp's doc comment restored)
984
+ - CI's core test shard ran 1,000 files in one process for about 13 minutes on every PR; the long simulation tests move to shard d, and shards d and h run in four cost-balanced lanes
985
+ - preflight runs only the generators a diff reaches, and skips one whose inputs have not changed since it last ran; a lane never fails on a stale generated file, and a stale api baseline entry is pruned at land time
986
+ - CI's full-history checkouts fetch no file contents up front, and the games job type-checks the reached games four at a time
987
+ - a test that reads the wall clock runs alone after its shard's lanes, so a timing budget never measures the tests beside it
988
+ - `jgengine has` ranks by names first, drops description-only hits, names the parts a feature is made of and answers `gap` below the bar
989
+ - The builder template binds no pause key, since it has no game-flow pause.
990
+ - breeding is built from the Inheritance and Phases parts; a dog breeds with only those two imported; game/breeding.ts is gone and Fernwild's stage list lives in its config
991
+ - the last private clamp and lerp copies in core use the math home; bounds are ordered at the call sites that could reverse them
992
+ - the boot probe, load guard and captures launch Chromium headless with no sandbox when the machine has no display, so a cloud landing needs no Xvfb
993
+ - resource ledger bands and decay meter thresholds are the Ladder part
994
+ - Received-damage scale, flat, cap and floor policies fold through the stat ops.
995
+ - Vital and decay rates scale through `applyStatRate`; a rate may now be a stack of named stat-op contributions.
996
+ - Loot filter rules, standing requirements, upgrade standing gates and unlock gates are predicates.
997
+ - every private clamp, lerp and clamp01 copy in core is deleted; the homes are math/scalar and anim/easing
998
+ - resource nodes refill through the Slots part and the creature, driver and traffic cooldowns run on the Schedule part
999
+ - every weighted choice in core goes through random/pick pickWeighted; the private weight loops in city, roads, storyteller, decisionGraph and spatialSample are gone
1000
+ - Ember Command roads use `ground/dirt-road` instead of packed dirt, and cliffs use `ground/cliff` instead of Rock022's `ground/rock`.
1001
+
1002
+ No before/after screenshots: cloud software GL fails to compile the world shader (`shoot ember-command --mode play` times out waiting for capture-ready), so evidence is tests, `check asset-availability concept-homes` and the editor RPC readbacks of the layer stacks.
1003
+ - Brightway Park looks like its art direction: Quaternius guests and staff, town pieces in place of boxes, food props on stalls, its sky, grade, fonts and paper kit, and credits for the new packs
1004
+ - Deepward looks like its art direction: authored machinery in place of primitive props, its sky, grade, fonts and terminal kit, its own menu, settings and credits
1005
+ - Drift Foundry looks like its art direction: dressed foundry yard and track, its sky, grade, fonts and kit, ambient life
1006
+ - library fonts and .cube grades load from the game's own folder when the host serves a game
1007
+ - The dev server config no longer imports the material library, so it loads without a built `@jgengine/core`.
1008
+ - grade LUTs and game fonts load through the per-game asset resolver
1009
+ - Fernwild takes its tropical sky, tropical lush grade, holo kit with the shallows-teal accent, Oswald and Source Sans 3, and lists them in its credits
1010
+ - Harbor Heat looks like its art direction: faced city blocks, dressed streets and ground, its sky, grade, fonts and kit, ambient life
1011
+ - static content stops paying per-frame matrix and draw cost: static matrices, batched props, HLOD per cell, on-demand capture and precompile off the critical path
1012
+ - A far HLOD cell no longer draws a proxy and impostor cards for the same prop, and its proxy holds only a model's coarsest level instead of every level.
1013
+ - the Rapier adapter is typed with handle maps and no per-contact scans, Rapier's character and vehicle controllers sit behind the backend seam, and games step at a fixed rate with render interpolation by default
1014
+ - A hosted world saves at most once a second by default in the node server (`saveIntervalMs`), the memory store no longer copies a snapshot twice, radius queries skip a dedupe set, and viewer interest and entity fingerprints allocate less. 64 clients by 2,000 entities: host 110-126 ms to 58-76 ms per tick on this container, 21.9 MB to 14.1 MB allocated per tick.
1015
+ - Drift Foundry rebuilt its career, event and calendar snapshot on every call, several times per tick: a steady-state step falls from 442 KB to 40 KB allocated and from 0.60 ms to 0.09 ms.
1016
+ - A world scene batch that still holds a removed object draws nothing instead of crashing the scene.
1017
+ - The shader warmup replay no longer draws a post pass into the target it samples, which three 0.187 turned into a GL feedback-loop error.
1018
+ - Material overrides set iridescence thickness through `iridescenceThicknessMinimum` and `iridescenceThicknessMaximum`.
1019
+ - The scaffold templates pin three 0.187, vite 8, plugin-react 6 and fiber ~9.7.0.
1020
+
1021
+ ### Removed
1022
+
1023
+ - `@jgengine/core/breeding/inheritance` no longer exports `InheritanceOptions`, `Inherited`, `inheritStats`, `scatterLevels`.
1024
+ - `@jgengine/core/fracture/convexCell` no longer exports `CellFace`, `CellPlane`, `CellVec`, `ConvexCell`, `boxCell`, `cellContains`, `cellVolume`, `clipCell` and 1 more.
1025
+ - `@jgengine/core/fracture/fractureComparison` no longer exports `FractureComparisonRow`, `compareFracture`, `formatFractureComparison`.
1026
+ - `@jgengine/core/fracture/fragmentSize` no longer exports `FragmentSizes`, `GaudinSchuhmannFit`, `KWH_PER_TONNE`, `RosinRammlerFit`, `SizeFit`, `T10Fit`, `breakageProbability`, `fitGaudinSchuhmann` and 7 more.
1027
+ - `@jgengine/core/fracture/rockFracture` no longer exports `BASALT_BREAKAGE`, `FractureOptions`, `FractureResult`, `GRANITE_BREAKAGE`, `LIMESTONE_BREAKAGE`, `ROCK_BREAKAGE`, `RockBreakage`, `RockFragment` and 4 more.
1028
+ - `@jgengine/core/fracture/rockFractureGenerator` no longer exports `FRACTURE_GENERATORS`, `ROCK_FRACTURE_GENERATOR`, `ROCK_FRACTURE_SCHEMA`, `fragmentMesh`, `rockCell`.
1029
+ - `@jgengine/core/granular/granularExperiments` no longer exports `ContinuumCollapse`, `FlumeFlow`, `PouredHeap`, `continuumCollapse`, `inclinedFlume`, `pouredHeap`.
1030
+ - `@jgengine/core/granular/granularLayer` no longer exports `GranularLayer`, `GranularLayerConfig`, `GranularLayerSnapshot`, `GranularPressReport`, `GranularStepReport`, `createGranularLayer`.
1031
+ - `@jgengine/core/granular/granularMaterial` no longer exports `BekkerSoil`, `DAMP_SAND`, `DRY_SAND`, `GLASS_BEADS`, `GRAVEL`, `GranularMaterial`, `SANDY_LOAM`, `culmannHeight` and 7 more.
1032
+ - `@jgengine/core/granular/granularTerrain` no longer exports `GranularTerrain`, `GranularTerrainOptions`, `LandformCoverPlacement`, `createGranularTerrain`, `landformLooseCover`.
1033
+ - `@jgengine/core/movement/reference/compareRagdollFall` no longer exports `INJURY_LIMITS`, `RagdollFallOptions`, `RagdollFallRow`, `compareRagdollFall`, `formatRagdollFall`, `humanRagdollConfig`, `measureRagdollFall`, `stockHumanoidRagdoll`.
1034
+ - `@jgengine/core/movement/reference/humanFall` no longer exports `FallOptions`, `FallReport`, `FallTone`, `HEAD_ON_FLOOR`, `PELVIS_ON_FLOOR`, `simulateFall`, `validateHumanFall`.
1035
+ - `@jgengine/core/movement/reference/quadrupedGait` no longer exports `ALEXANDER_JAYES_CURSORIAL`, `CreatureLocomotion`, `FroudePowerLaw`, `MAMMAL_TOP_SPEEDS`, `QUADRUPED_GAIT_TRANSITIONS`, `QuadrupedBody`, `QuadrupedComparison`, `QuadrupedGait` and 8 more.
1036
+ - `@jgengine/core/physics/reference/bondedRock` no longer exports `BASALT`, `BEREA_SANDSTONE`, `BondedRockModel`, `BondedSpecimen`, `BrazilianResult`, `CalibrationResult`, `GrainPacking`, `INDIANA_LIMESTONE` and 15 more.
1037
+ - `@jgengine/core/physics/reference/discreteElementExperiments` no longer exports `ColumnCollapseOptions`, `ColumnCollapseResult`, `DEM_GLASS_BEADS`, `DEM_SAND`, `DEM_STEEL`, `HopperOptions`, `HopperResult`, `JanssenFit` and 17 more.
1038
+ - `@jgengine/core/physics/reference/discreteElements` no longer exports `DemBodySpec`, `DemBondLoad`, `DemBondSpec`, `DemInteraction`, `DemLiquid`, `DemMaterial`, `DemSnapshot`, `DemSphereSpec` and 11 more.
1039
+ - the nature.broadleaf and nature.conifer generators with their schemas and presets
1040
+ - `@jgengine/core/nature/natureGenerators` no longer exports `BROADLEAF_GENERATOR`, `BROADLEAF_SCHEMA`, `CONIFER_GENERATOR`, `CONIFER_SCHEMA`.
1041
+ - `@jgengine/core/world` no longer exports `BROADLEAF_GENERATOR`, `BROADLEAF_SCHEMA`, `CONIFER_GENERATOR`, `CONIFER_SCHEMA`.
1042
+ - `@jgengine/core/physics/reference/boatComparison` no longer exports `wigleyStandIn`.
1043
+ - `@jgengine/core/physics/reference/oceanWaves` no longer exports `IrregularSeaOptions`, `OceanSea`, `SeaSpectrum`, `WaveComponent`, `irregularSea`, `regularSea`, `seaElevation`, `seaWaterAt` and 2 more.
1044
+ - `@jgengine/core/physics/reference/seakeepingHull` no longer exports `SeakeepingHull`, `SeakeepingHullOptions`, `SeakeepingState`, `SeakeepingStation`, `SurgeForce`, `restingSeakeepingState`, `seakeepingHullFromStrip`, `stepSeakeeping`.
1045
+ - `@jgengine/core/physics/reference/sectionHydrodynamics` no longer exports `HalfSection`, `SectionHeave`, `lewisSection`, `sectionHeave`.
1046
+ - `@jgengine/core/physics/reference/stripTheory` no longer exports `HeavePitchCoefficients`, `HeavePitchResponse`, `StripHull`, `StripSections`, `heavePitchResponse`, `stripSections`.
1047
+ - `@jgengine/core/plants/grown/plantGrown` no longer exports `BUILTIN_PLANT_SPECIES`.
1048
+ - `@jgengine/core/plants/validation/crownAllometry` no longer exports `CrownWidthEquations`, `EASTERN_WHITE_PINE_CROWN_WIDTH`, `SUGAR_MAPLE_CROWN_WIDTH`, `TALLO_CROWN_WIDTH`, `measuredCrownWidthBandM`.
1049
+ - `@jgengine/core/plants/validation/heightAgeCurves` no longer exports `EASTERN_WHITE_PINE_CARMEAN`, `SUGAR_MAPLE_CARMEAN`.
1050
+ - `@jgengine/core/plants/validation/stemAllometry` no longer exports `FIA_STAND_DIAMETER`, `StandDiameterAtAge`.
1051
+ - `@jgengine/core/plants/groundCover/grassSpecies` no longer exports `GRASS_LIBRARY`, `GrassSpecies`, `LOLIUM_PERENNE`, `PHLEUM_PRATENSE`, `POA_PRATENSIS`.
1052
+ - `@jgengine/core/fracture/convexCell` no longer exports `CellFace`, `CellPlane`, `CellVec`, `ConvexCell`, `boxCell`, `cellContains`, `cellVolume`, `clipCell` and 1 more.
1053
+ - `@jgengine/core/fracture/fractureComparison` no longer exports `FractureComparisonRow`, `compareFracture`, `formatFractureComparison`.
1054
+ - `@jgengine/core/fracture/fragmentSize` no longer exports `FragmentSizes`, `GaudinSchuhmannFit`, `KWH_PER_TONNE`, `RosinRammlerFit`, `SizeFit`, `T10Fit`, `breakageProbability`, `fitGaudinSchuhmann` and 7 more.
1055
+ - `@jgengine/core/fracture/rockFracture` no longer exports `BASALT_BREAKAGE`, `FractureOptions`, `FractureResult`, `GRANITE_BREAKAGE`, `LIMESTONE_BREAKAGE`, `ROCK_BREAKAGE`, `RockBreakage`, `RockFragment` and 4 more.
1056
+ - `@jgengine/core/fracture/rockFractureGenerator` no longer exports `FRACTURE_GENERATORS`, `ROCK_FRACTURE_GENERATOR`, `ROCK_FRACTURE_SCHEMA`, `fragmentMesh`, `rockCell`.
1057
+ - `@jgengine/core/granular/granularExperiments` no longer exports `ContinuumCollapse`, `FlumeFlow`, `PouredHeap`, `continuumCollapse`, `inclinedFlume`, `pouredHeap`.
1058
+ - `@jgengine/core/granular/granularLayer` no longer exports `GranularLayer`, `GranularLayerConfig`, `GranularLayerSnapshot`, `GranularPressReport`, `GranularStepReport`, `createGranularLayer`.
1059
+ - `@jgengine/core/granular/granularMaterial` no longer exports `BekkerSoil`, `DAMP_SAND`, `DRY_SAND`, `GLASS_BEADS`, `GRAVEL`, `GranularMaterial`, `SANDY_LOAM`, `culmannHeight` and 7 more.
1060
+ - `@jgengine/core/granular/granularTerrain` no longer exports `GranularTerrain`, `GranularTerrainOptions`, `LandformCoverPlacement`, `createGranularTerrain`, `landformLooseCover`.
1061
+ - `@jgengine/core/landform/evolution/landscapeEvolution` no longer exports `CoastalParams`, `GlacialParams`.
1062
+ - `@jgengine/core/landform/glacial/firstOrderIceFlow` no longer exports `FirstOrderGrid`, `FirstOrderIceFlow`, `FirstOrderInput`, `FirstOrderOptions`, `FirstOrderReport`, `createFirstOrderIceFlow`.
1063
+ - `@jgengine/core/landform/glacial/glacierFlow` no longer exports `GlacierModel`.
1064
+ - `@jgengine/core/landform/glacial/iceFlow` no longer exports `GLEN_RATE_FACTOR`, `ICE_WEIGHT`, `iceDeformationRate`.
1065
+ - `@jgengine/core/landform/materials/sedimentCover` no longer exports `TILL_YIELD`.
1066
+ - `@jgengine/core/math/cmaEvolutionStrategy` no longer exports `CmaEvolutionStrategy`, `CmaOptions`, `CmaState`, `createCmaEvolutionStrategy`.
1067
+ - `@jgengine/core/movement/reference/anthropometry` no longer exports `AnthropometricTable`, `DE_LEVA_MALE`, `HUMAN_SEGMENT`, `PlanarHumanGeometry`, `SegmentParameters`, `planarHumanSegments`.
1068
+ - `@jgengine/core/movement/reference/compareLocomotion` no longer exports `HumanLocomotionReference`, `LocomotionComparisonRow`, `LocomotionMetrics`, `LocomotionProbeOptions`, `compareLocomotion`, `defaultHumanReference`, `formatLocomotionComparison`, `measureLocomotion` and 1 more.
1069
+ - `@jgengine/core/movement/reference/compareRagdollFall` no longer exports `INJURY_LIMITS`, `RagdollFallOptions`, `RagdollFallRow`, `compareRagdollFall`, `formatRagdollFall`, `humanRagdollConfig`, `measureRagdollFall`, `stockHumanoidRagdoll`.
1070
+ - `@jgengine/core/movement/reference/curveRunning` no longer exports `CHANG_KRAM_CURVE_SPEEDS`, `RECREATIONAL_SPRINTER`, `SprintMechanics`, `maxCurveSpeed`, `minTurnRadius`.
1071
+ - `@jgengine/core/movement/reference/footContact` no longer exports `ContactParameters`, `ContactPointState`, `GroundProfile`, `SHOE_ON_CONCRETE`, `footContactForce`, `slopeGround`, `stairGround`.
1072
+ - `@jgengine/core/movement/reference/humanBody` no longer exports `FootForces`, `HumanBody`, `HumanBodyOptions`, `HumanBodyState`, `HumanJointTorques`, `HumanSide`, `createHumanBody`.
1073
+ - `@jgengine/core/movement/reference/humanEnvelope` no longer exports `RECREATIONAL_SPRINT_PROFILE`, `SprintProfile`, `SprintState`, `slopeCostOfTransport`, `slopeSpeed`, `sprint`, `sprintTopSpeed`, `stoppingDistance` and 3 more.
1074
+ - `@jgengine/core/movement/reference/humanFall` no longer exports `FallOptions`, `FallReport`, `FallTone`, `GRUBER_WOBBLING_MASSES`, `HEAD_ON_FLOOR`, `LANDING_ACTIVATION`, `PELVIS_ON_FLOOR`, `WobblingMass` and 2 more.
1075
+ - `@jgengine/core/movement/reference/humanGaitAnalysis` no longer exports `GaitReport`, `LocomotionDriver`, `StanceForce`, `analyzeLocomotion`.
1076
+ - `@jgengine/core/movement/reference/humanGaits` no longer exports `FITTED_WALKS`, `FittedWalk`, `WALK_TERRAIN`, `WalkTerrain`, `fittedWalk`, `measureWalk`.
1077
+ - `@jgengine/core/movement/reference/humanJump` no longer exports `COUNTERMOVEMENT_JUMP`, `JumpParameters`, `JumpReport`, `simulateJump`.
1078
+ - `@jgengine/core/movement/reference/humanReferenceValidation` no longer exports `HumanValidationRow`, `RUNNING_NET_COST`, `formatHumanValidation`, `validateHumanReference`.
1079
+ - `@jgengine/core/movement/reference/jointStrength` no longer exports `HumanJointStrength`, `JointExertion`, `LegJoint`, `YOUNG_MALE_STRENGTH`, `maxJointTorque`.
1080
+ - `@jgengine/core/movement/reference/muscleTendon` no longer exports `HILL_CONSTANTS`, `MuscleJointSpan`, `MuscleSpec`, `MuscleState`, `muscleMetabolicPower`, `stepMuscle`.
1081
+ - `@jgengine/core/movement/reference/planarMultibody` no longer exports `PlanarMultibody`, `PlanarSegment`, `createPlanarMultibody`.
1082
+ - `@jgengine/core/movement/reference/quadrupedGait` no longer exports `ALEXANDER_JAYES_CURSORIAL`, `CreatureLocomotion`, `FroudePowerLaw`, `MAMMAL_TOP_SPEEDS`, `QuadrupedBody`, `QuadrupedComparison`, `QuadrupedGait`, `QuadrupedStride` and 9 more.
1083
+ - `@jgengine/core/movement/reference/reflexWalker` no longer exports `GEYER_HERR_MUSCLES`, `GEYER_HERR_REFLEXES`, `LegMuscle`, `LegStimulation`, `ReflexParameters`, `ReflexWalker`, `ReflexWalkerState`, `actuateLegMuscles` and 1 more.
1084
+ - `@jgengine/core/movement/reference/springMassRunning` no longer exports `RECREATIONAL_RUNNER`, `SpringMassRunner`, `SpringMassStep`, `springMassStep`.
1085
+ - `@jgengine/core/physics/reference/bondedRock` no longer exports `BASALT`, `BEREA_SANDSTONE`, `BondedRockModel`, `BondedSpecimen`, `BrazilianResult`, `CalibrationResult`, `GrainPacking`, `INDIANA_LIMESTONE` and 15 more.
1086
+ - `@jgengine/core/physics/reference/discreteElementExperiments` no longer exports `ColumnCollapseOptions`, `ColumnCollapseResult`, `DEM_GLASS_BEADS`, `DEM_SAND`, `DEM_STEEL`, `HopperOptions`, `HopperResult`, `JanssenFit` and 17 more.
1087
+ - `@jgengine/core/physics/reference/discreteElements` no longer exports `DemBodySpec`, `DemBondLoad`, `DemBondSpec`, `DemInteraction`, `DemLiquid`, `DemMaterial`, `DemSnapshot`, `DemSphereSpec` and 11 more.
1088
+ - `@jgengine/core/terrain/surveyTerrain` no longer exports `SurveyCliff`, `SurveyHills`.
1089
+ - the procedural palm and fern nature generators; Fernwild now places the grown species.
1090
+ - `@jgengine/core/nature/natureGenerators` no longer exports `FERN_GENERATOR`, `FERN_SCHEMA`, `PALM_GENERATOR`, `PALM_SCHEMA`.
1091
+ - `@jgengine/core/nature/natureMesh` no longer exports `FrondOptions`, `addFrond`.
1092
+ - `@jgengine/core/world` no longer exports `FERN_GENERATOR`, `FERN_SCHEMA`, `FrondOptions`, `PALM_GENERATOR`, `PALM_SCHEMA`, `addFrond`.
1093
+ - the nature.bush generator and addLeafCluster; Fernwild's bushes are grown blueberries
1094
+ - `@jgengine/core/nature/natureGenerators` no longer exports `BUSH_GENERATOR`, `BUSH_SCHEMA`.
1095
+ - `@jgengine/core/nature/natureMesh` no longer exports `LeafClusterOptions`, `addLeafCluster`.
1096
+ - `@jgengine/core/world` no longer exports `BUSH_GENERATOR`, `BUSH_SCHEMA`.
1097
+ - `@jgengine/core/movement/reference/flightPower` no longer exports `FLAPPING_MASS_LIMIT`, `FlierBody`, `FlierComparison`, `FlightPower`, `INDUCED_POWER_FACTOR`, `INSECT_WINGBEATS`, `ORNITHODOLITE_AIRSPEEDS`, `PUBLISHED_FLIERS` and 8 more.
1098
+ - loot's own weighted picker and the building lots' copy; both use the table part, random/pick pickWeighted
1099
+ - LLMville's private level builder, asset workbench, builder agent and dev-only map decor; the world's authored home is `src/editor.scene.json`
1100
+ - LLMville's private movement controller, input, touch controls, frame profiler and diagnostics overlay, clock, world join and presence glue
1101
+ - LLMville's private UI components, settings screens and most of its stylesheet
1102
+ - `@jgengine/core/nature/natureMesh` no longer exports `LeafClusterOptions`, `NatureMeshPart`, `addLeafCluster`.
1103
+ - `@jgengine/core/nature/natureMesh.draw` no longer exports `natureDraws`.
1104
+ - `@jgengine/core/scene/assetGenerator` no longer exports `partsGeneratorFor`.
1105
+ - the engine's built-in easy/standard/expert difficulty tiers; Harbor Heat and Drift Foundry keep theirs
1106
+ - the engine's built-in "common" drop rarity; a game sets content.defaultRarity or names a rarity per drop
1107
+ - the engine's built-in 0.85 encumbrance band and 0.5 slow floor, and the carryable default of 8
1108
+ - the fixed owner/editor/viewer build roles; a plot takes the game's own role ladder
1109
+ - `@jgengine/core/landform/glacial/firstOrderIceFlow` no longer exports `FirstOrderGrid`, `FirstOrderIceFlow`, `FirstOrderInput`, `FirstOrderOptions`, `FirstOrderReport`, `createFirstOrderIceFlow`.
1110
+ - `@jgengine/core/landform/glacial/glacierFlow` no longer exports `GlacierModel`.
1111
+ - `@jgengine/core/math/cmaEvolutionStrategy` no longer exports `CmaEvolutionStrategy`, `CmaOptions`, `CmaState`, `createCmaEvolutionStrategy`.
1112
+ - `@jgengine/core/movement/reference/anthropometry` no longer exports `AnthropometricTable`, `DE_LEVA_MALE`, `HUMAN_SEGMENT`, `PlanarHumanGeometry`, `SegmentParameters`, `planarHumanSegments`.
1113
+ - `@jgengine/core/movement/reference/curveRunning` no longer exports `CHANG_KRAM_CURVE_SPEEDS`, `RECREATIONAL_SPRINTER`, `SprintMechanics`, `maxCurveSpeed`, `minTurnRadius`.
1114
+ - `@jgengine/core/movement/reference/footContact` no longer exports `ContactParameters`, `ContactPointState`, `GroundProfile`, `SHOE_ON_CONCRETE`, `footContactForce`, `slopeGround`, `stairGround`.
1115
+ - `@jgengine/core/movement/reference/humanBody` no longer exports `FootForces`, `HumanBody`, `HumanBodyOptions`, `HumanBodyState`, `HumanJointTorques`, `HumanSide`, `createHumanBody`.
1116
+ - `@jgengine/core/movement/reference/humanEnvelope` no longer exports `RECREATIONAL_SPRINT_PROFILE`, `SprintProfile`, `SprintState`, `slopeCostOfTransport`, `slopeSpeed`, `sprint`, `sprintTopSpeed`, `stoppingDistance` and 2 more.
1117
+ - `@jgengine/core/movement/reference/humanGaitAnalysis` no longer exports `GaitReport`, `LocomotionDriver`, `StanceForce`, `analyzeLocomotion`.
1118
+ - `@jgengine/core/movement/reference/humanGaits` no longer exports `FITTED_WALKS`, `FittedWalk`, `WALK_TERRAIN`, `WalkTerrain`, `fittedWalk`, `measureWalk`.
1119
+ - `@jgengine/core/movement/reference/humanJump` no longer exports `COUNTERMOVEMENT_JUMP`, `JumpParameters`, `JumpReport`, `simulateJump`.
1120
+ - `@jgengine/core/movement/reference/humanReferenceValidation` no longer exports `HumanValidationRow`, `RUNNING_NET_COST`, `formatHumanValidation`, `validateHumanReference`.
1121
+ - `@jgengine/core/movement/reference/jointStrength` no longer exports `HumanJointStrength`, `JointExertion`, `LegJoint`, `YOUNG_MALE_STRENGTH`, `maxJointTorque`.
1122
+ - `@jgengine/core/movement/reference/muscleTendon` no longer exports `HILL_CONSTANTS`, `MuscleJointSpan`, `MuscleSpec`, `MuscleState`, `muscleMetabolicPower`, `stepMuscle`.
1123
+ - `@jgengine/core/movement/reference/planarMultibody` no longer exports `PlanarMultibody`, `PlanarSegment`, `createPlanarMultibody`.
1124
+ - `@jgengine/core/movement/reference/reflexWalker` no longer exports `GEYER_HERR_MUSCLES`, `GEYER_HERR_REFLEXES`, `LegMuscle`, `LegStimulation`, `ReflexParameters`, `ReflexWalker`, `ReflexWalkerState`, `actuateLegMuscles` and 1 more.
1125
+ - `@jgengine/core/movement/reference/springMassRunning` no longer exports `RECREATIONAL_RUNNER`, `SpringMassRunner`, `SpringMassStep`, `springMassStep`.
1126
+ - `createFireGrid`, `FireGrid`, `FireGridConfig` and `FireGridTuning` (`@jgengine/core/weather/weather`): use `createFireLandscape` (`@jgengine/core/fire/fireLandscape`) with `createFuelMoistureModel`.
1127
+ - `FireSpreadLayer` (`@jgengine/core/weather/FireSpreadLayer.draw`) and `@jgengine/core/weather/fireSpreadPose.draw`: use `FireLandscapeView` (`@jgengine/core/fire/FireLandscape.draw`).
1128
+ - the engine's built-in body temperature bands and food and water defaults; Fernwild passes its own
1129
+ - `@jgengine/core/gameplay` no longer exports `ComfortBand`.
1130
+ - `@jgengine/core/survival/bodyTemperature` no longer exports `ComfortBand`.
1131
+ - turf war's built-in contested grip of 30; Harbor Heat passes its own
1132
+ - `@jgengine/core/waves/spawnDirector` no longer exports `SpawnPointBiasStrength`, `SpawnPointDistanceBias`, `SpawnPointSelectionOptions`, `pickSpawnPoint`.
1133
+ - `@jgengine/core/world` no longer exports `pickSpawnPoint`.
1134
+ - cards/modifierPipeline, a second modifier stack no game used; statGraph is the one way to stack add, multiply, override and clamp
1135
+ - `@jgengine/core/cards/modifierPipeline` no longer exports `Modifier`, `ModifierPipeline`, `PipelineContext`, `PipelineResult`, `TraceStep`, `createModifierPipeline`, `runPipeline`.
1136
+ - `@jgengine/core/gameplay` no longer exports `runPipeline`.
1137
+ - `@jgengine/core/flight/reference/aircraftTrim` no longer exports `Eigenvalue`, `FlightLinearization`, `FlightMode`, `TrimCondition`, `TrimResult`, `WindAxisState`, `linearizeReferenceAircraft`, `matrixEigenvalues` and 6 more.
1138
+ - `@jgengine/core/flight/reference/bo105Helicopter` no longer exports `BO105_DESIGN`, `BO105_FORWARD_FLIGHT_DATA`, `BO105_HOVER_DATA`, `BO105_MAIN_ROTOR`, `BO105_TAIL_ROTOR`, `BO105_TUNNEL_AIR`, `createBo105Model`.
1139
+ - `@jgengine/core/flight/reference/cessna172Aircraft` no longer exports `C172_PROPELLER`, `createCessna172Model`.
1140
+ - `@jgengine/core/flight/reference/coefficientTable` no longer exports `CoefficientTable`, `CoefficientTableAxis`, `createCoefficientTable`, `evenBreakpoints`.
1141
+ - `@jgengine/core/flight/reference/f16Aircraft` no longer exports `F16ModelOptions`, `STEVENS_LEWIS_GRAVITY`, `createF16Model`, `f16CycleEngine`, `f16PowerCommand`, `f16Thrust`, `stevensLewisAtmosphere`.
1142
+ - `@jgengine/core/flight/reference/flightComparison` no longer exports `CESSNA_172N_PUBLISHED`, `ComparisonTable`, `FlightComparison`, `FlightComparisonAircraft`, `FlightComparisonRow`, `PublishedFlightFigures`, `compareFlight`, `formatFlightComparison`.
1143
+ - `@jgengine/core/flight/reference/flightTests` no longer exports `FlightTestControls`, `FlightTestOptions`, `FlightTestReport`, `FlightTestSample`, `FlightTestSubject`, `KNOTS_PER_MPS`, `referenceFlightSubject`, `rigidAircraftFlightSubject` and 1 more.
1144
+ - `@jgengine/core/flight/reference/gasTurbine` no longer exports `GasModel`, `GasStream`, `GasTurbineComponents`, `GasTurbineCycle`, `GasTurbineDesign`, `GasTurbineFlight`, `GasTurbinePoint`, `InletKind` and 4 more.
1145
+ - `@jgengine/core/flight/reference/gasTurbineEngine` no longer exports `GasTurbineCommand`, `GasTurbineEngine`, `GasTurbineEngineOptions`, `GasTurbineEngineOutput`, `createGasTurbineEngine`, `gasTurbinePropulsion`.
1146
+ - `@jgengine/core/flight/reference/helicopter` no longer exports `HelicopterDesign`, `HelicopterModel`, `HelicopterModelOptions`, `HelicopterRotorTelemetry`, `HelicopterSurface`, `HelicopterTrim`, `HelicopterTrimCondition`, `createHelicopterModel` and 1 more.
1147
+ - `@jgengine/core/flight/reference/helicopterRotor` no longer exports `IsolatedRotorCondition`, `IsolatedRotorTrim`, `RotorDesign`, `RotorFlow`, `RotorLoads`, `RotorPitch`, `createRotorLoads`, `evaluateRotor` and 6 more.
1148
+ - `@jgengine/core/flight/reference/jetEngineComparison` no longer exports `JetComparison`, `JetComparisonAircraft`, `JetComparisonRow`, `compareJetEngines`.
1149
+ - `@jgengine/core/flight/reference/propeller` no longer exports `BladeSection`, `PropellerGeometry`, `PropellerMap`, `clarkYPropellerSection`, `createPropellerMap`, `solvePropeller`.
1150
+ - `@jgengine/core/flight/reference/referenceAircraft` no longer exports `ReferenceActuator`, `ReferenceAeroCoefficients`, `ReferenceAirData`, `ReferenceAircraft`, `ReferenceAircraftModel`, `ReferenceAircraftOptions`, `ReferenceAircraftSample`, `ReferenceAircraftState` and 12 more.
1151
+ - `@jgengine/core/flight/reference/referenceEngines` no longer exports `F100_PW_220`, `F100_PW_220_DYNAMICS`, `F100_PW_220_PUBLISHED`, `MATTINGLY_LEVEL_3`, `MATTINGLY_LEVEL_4`, `V2500_A1`, `V2500_A1_PUBLISHED`.
1152
+ - `@jgengine/core/flight/reference/rotorcraftComparison` no longer exports `RotorcraftComparison`, `RotorcraftComparisonAircraft`, `RotorcraftComparisonRow`, `compareRotorcraft`.
1153
+ - `@jgengine/core/flight/reference/standardAtmosphere` no longer exports `AtmosphereModel`, `AtmosphereSample`, `SEA_LEVEL_DENSITY`, `SEA_LEVEL_PRESSURE`, `SEA_LEVEL_SPEED_OF_SOUND`, `STANDARD_EARTH_RADIUS`, `STANDARD_GRAVITY`, `calibratedAirspeed` and 3 more.
1154
+ - `@jgengine/core/grass/grassBake.draw` no longer exports `GrassTemplateLod`, `GrassTuftTemplate`, `createGrassTuftTemplate`.
1155
+ - `@jgengine/core/scene/assetGenerator` no longer exports `AssetGeneratorDefinition`, `registerAssetGenerator`.
1156
+ - `@jgengine/core/scene/sceneKinds` no longer exports `ActionParamField`, `BoolParamField`, `ColorParamField`, `NumberParamField`, `ParamField`, `ParamGroup`, `ParamIssue`, `ParamPreset` and 10 more.
1157
+ - `@jgengine/core/world` no longer exports `registerAssetGenerator`.
1158
+ - the KayKit people starter theme and the character/* aliases
1159
+ - `@jgengine/core/flight/reference/aircraftTrim` no longer exports `Eigenvalue`, `matrixEigenvalues`, `solveLinearSystem`.
1160
+ - `@jgengine/core/scatter/scatterHeroes` no longer exports `ScatterHeroMember`, `ScatterHeroSet`, `ScatterHeroSetOptions`, `ScatterHeroSetState`, `ScatterHeroUpdate`, `createScatterHeroSet`.
1161
+ - `@jgengine/core/scatter/ScatterHeroes.draw` no longer exports `ScatterHeroesProps`.
1162
+ - the engine's built-in reputation and mood tier lists (one was World of Warcraft's); each game passes its own
1163
+ - `@jgengine/core/agents/mood` no longer exports `DEFAULT_MOOD_TIERS`.
1164
+ - `@jgengine/core/faction/reputation` no longer exports `DEFAULT_REPUTATION_TIERS`.
1165
+ - `@jgengine/core/world` no longer exports `DEFAULT_REPUTATION_TIERS`.
1166
+ - the second, ARK-only breeding system (game/breeding.ts) and every ARK stage name and number from breeding/breeding.ts
1167
+ - `@jgengine/core/breeding/breeding` no longer exports `BabyStage`, `BreedingBaby`, `babyStage`.
1168
+ - `@jgengine/core/game/breeding` no longer exports `BreedConfig`, `BreedResult`, `Genome`, `ImprintBonusConfig`, `IncubationConfig`, `IncubationState`, `MaturationStage`, `MutationEvent` and 8 more.
1169
+ - `@jgengine/core/sky/skySun.draw` no longer exports `SkySunDirection`.
1170
+ - policeResponse and heatSystem; a general alert level (witness-gated value, game-supplied ladder, stand-down) is built on the meter, ladder and schedule parts, and Harbor Heat owns its stars, officers and numbers
1171
+ - police roadblocks and the lane-graph cordon, which no game used
1172
+ - `@jgengine/core/ai/heatSystem` no longer exports `HeatConfig`, `HeatGain`, `HeatLevelDef`, `HeatPoint`, `HeatState`, `HeatStep`, `HeatTickContext`.
1173
+ - `@jgengine/core/ai/policeResponse` no longer exports `DEFAULT_POLICE_TIERS`, `DEFAULT_POLICE_TUNING`, `PoliceLaneHit`, `PoliceResponse`, `PoliceResponseConfig`, `PoliceResponseKind`, `PoliceResponseState`, `PoliceRoadblockSite` and 12 more.
1174
+ - `@jgengine/core/world` no longer exports `DEFAULT_POLICE_TIERS`, `DEFAULT_POLICE_TUNING`, `HeatConfig`, `HeatGain`, `HeatLevelDef`, `HeatPoint`, `HeatState`, `PoliceLaneHit` and 17 more.
1175
+ - ARK's obelisk boss arena (bossArena/) and ai/director/boss; added summonedEncounter, a general fight started by paying a cost at a place, and ai/phaseLadder, boss phases as cut points over a health fraction
1176
+ - `@jgengine/core/ai/director/boss` no longer exports `BossBehaviour`, `BossPhase`, `BossState`, `BossStep`, `BossTell`, `advanceBoss`, `bossPhase`, `createBossState`.
1177
+ - `@jgengine/core/bossArena/bossArena` no longer exports `ArenaCandidate`, `ArenaReturn`, `ArenaWallOptions`, `BossArena`, `BossArenaEvent`, `BossArenaHooks`, `BossArenaOptions`, `BossArenaPhase` and 6 more.
1178
+ - ARK knockout taming (taming/knockoutTaming.ts); added subdual/subdualFeeding.ts, a general part for winning over a creature by keeping it subdued and feeding it, built on the meter, curve and requirement parts
1179
+ - `@jgengine/core/taming/knockoutTaming` no longer exports `KnockoutTaming`, `KnockoutTamingConfig`, `Narcotic`, `TamingEvent`, `TamingFeeder`, `TamingFood`, `TamingState`, `bonusLevels` and 5 more.
1180
+ - pileRng (use seededRng) and hashMassingSeed (use hashString).
1181
+ - `@jgengine/core/buildings/massing` no longer exports `hashMassingSeed`.
1182
+ - `@jgengine/core/cards/cardPile` no longer exports `pileRng`, `shuffleWithRng`.
1183
+ - `@jgengine/core/gameplay` no longer exports `pileRng`.
1184
+ - the draw, triangle and node ceilings in every perf-budget.json
1185
+ - check orphan-ratchet, which check skill-api already runs
1186
+ - the physics and flight reference sims from the runtime package; they live in scripts/reference and only scripts import them
1187
+ - `@jgengine/core/flight/reference/aircraftTrim` no longer exports `FlightLinearization`, `FlightMode`, `TrimCondition`, `TrimResult`, `WindAxisState`, `linearizeReferenceAircraft`, `referenceStateFromWindAxes`, `steadyAirData` and 3 more.
1188
+ - `@jgengine/core/flight/reference/bo105Helicopter` no longer exports `BO105_DESIGN`, `BO105_FORWARD_FLIGHT_DATA`, `BO105_HOVER_DATA`, `BO105_MAIN_ROTOR`, `BO105_TAIL_ROTOR`, `BO105_TUNNEL_AIR`, `createBo105Model`.
1189
+ - `@jgengine/core/flight/reference/cessna172Aircraft` no longer exports `C172_PROPELLER`, `createCessna172Model`.
1190
+ - `@jgengine/core/flight/reference/coefficientTable` no longer exports `CoefficientTable`, `CoefficientTableAxis`, `createCoefficientTable`, `evenBreakpoints`.
1191
+ - `@jgengine/core/flight/reference/f16Aircraft` no longer exports `F16ModelOptions`, `STEVENS_LEWIS_GRAVITY`, `createF16Model`, `f16CycleEngine`, `f16PowerCommand`, `f16Thrust`, `stevensLewisAtmosphere`.
1192
+ - `@jgengine/core/flight/reference/flightComparison` no longer exports `CESSNA_172N_PUBLISHED`, `ComparisonTable`, `FlightComparison`, `FlightComparisonAircraft`, `FlightComparisonRow`, `PublishedFlightFigures`, `compareFlight`, `formatFlightComparison`.
1193
+ - `@jgengine/core/flight/reference/flightTests` no longer exports `FlightTestControls`, `FlightTestOptions`, `FlightTestReport`, `FlightTestSample`, `FlightTestSubject`, `KNOTS_PER_MPS`, `referenceFlightSubject`, `rigidAircraftFlightSubject` and 1 more.
1194
+ - `@jgengine/core/flight/reference/gasTurbine` no longer exports `GasModel`, `GasStream`, `GasTurbineComponents`, `GasTurbineCycle`, `GasTurbineDesign`, `GasTurbineFlight`, `GasTurbinePoint`, `InletKind` and 4 more.
1195
+ - `@jgengine/core/flight/reference/gasTurbineEngine` no longer exports `GasTurbineCommand`, `GasTurbineEngine`, `GasTurbineEngineOptions`, `GasTurbineEngineOutput`, `createGasTurbineEngine`, `gasTurbinePropulsion`.
1196
+ - `@jgengine/core/flight/reference/helicopter` no longer exports `HelicopterDesign`, `HelicopterModel`, `HelicopterModelOptions`, `HelicopterRotorTelemetry`, `HelicopterSurface`, `HelicopterTrim`, `HelicopterTrimCondition`, `createHelicopterModel` and 1 more.
1197
+ - `@jgengine/core/flight/reference/helicopterRotor` no longer exports `IsolatedRotorCondition`, `IsolatedRotorTrim`, `RotorDesign`, `RotorFlow`, `RotorLoads`, `RotorPitch`, `createRotorLoads`, `evaluateRotor` and 6 more.
1198
+ - `@jgengine/core/flight/reference/jetEngineComparison` no longer exports `JetComparison`, `JetComparisonAircraft`, `JetComparisonRow`, `compareJetEngines`.
1199
+ - `@jgengine/core/flight/reference/propeller` no longer exports `BladeSection`, `PropellerGeometry`, `PropellerMap`, `clarkYPropellerSection`, `createPropellerMap`, `solvePropeller`.
1200
+ - `@jgengine/core/flight/reference/referenceAircraft` no longer exports `ReferenceActuator`, `ReferenceAeroCoefficients`, `ReferenceAirData`, `ReferenceAircraft`, `ReferenceAircraftModel`, `ReferenceAircraftOptions`, `ReferenceAircraftSample`, `ReferenceAircraftState` and 12 more.
1201
+ - `@jgengine/core/flight/reference/referenceEngines` no longer exports `F100_PW_220`, `F100_PW_220_DYNAMICS`, `F100_PW_220_PUBLISHED`, `MATTINGLY_LEVEL_3`, `MATTINGLY_LEVEL_4`, `V2500_A1`, `V2500_A1_PUBLISHED`.
1202
+ - `@jgengine/core/flight/reference/rocket` no longer exports `EarthModel`, `GravityTurnProgram`, `Rocket`, `RocketAero`, `RocketControl`, `RocketDesign`, `RocketEngine`, `RocketLaunch` and 12 more.
1203
+ - `@jgengine/core/flight/reference/rocketComparison` no longer exports `compareRocketAscent`, `saturnVGameTuning`.
1204
+ - `@jgengine/core/flight/reference/rotorcraftComparison` no longer exports `RotorcraftComparison`, `RotorcraftComparisonAircraft`, `RotorcraftComparisonRow`, `compareRotorcraft`.
1205
+ - `@jgengine/core/flight/reference/saturnV` no longer exports `F1_ENGINE`, `SATURN_V_AS506`, `SATURN_V_AS506_ASCENT`, `SATURN_V_AS506_EVENTS`, `SATURN_V_AS506_LAUNCH`.
1206
+ - `@jgengine/core/flight/reference/standardAtmosphere` no longer exports `AtmosphereModel`, `AtmosphereSample`, `SEA_LEVEL_DENSITY`, `SEA_LEVEL_PRESSURE`, `SEA_LEVEL_SPEED_OF_SOUND`, `STANDARD_EARTH_RADIUS`, `STANDARD_GRAVITY`, `calibratedAirspeed` and 3 more.
1207
+ - `@jgengine/core/physics/reference/boatComparison` no longer exports `BoatComparisonSubject`, `ManoeuvringSubject`, `ReferenceBoat`, `compareBoat`, `holtropExampleSubject`, `kvlcc2Subject`, `referenceBoatSubjects`, `referenceSubjectFor` and 3 more.
1208
+ - `@jgengine/core/physics/reference/bondedRock` no longer exports `BASALT`, `BEREA_SANDSTONE`, `BondedRockModel`, `BondedSpecimen`, `BrazilianResult`, `CalibrationResult`, `GrainPacking`, `INDIANA_LIMESTONE` and 15 more.
1209
+ - `@jgengine/core/physics/reference/carEffectProbe` no longer exports `CarEffectMetrics`, `CarEffectProbeOptions`, `CarEffectSubject`, `measureCarEffects`.
1210
+ - `@jgengine/core/physics/reference/compareHandling` no longer exports `BikeHandlingComparison`, `ComparableHandlingMetrics`, `ComparableHandlingOptions`, `HandlingComparisonRow`, `MOTORCYCLE_PUBLISHED_TOLERANCES`, `MotorcyclePublishedCheck`, `PUBLISHED_TOLERANCES`, `PublishedCheck` and 13 more.
1211
+ - `@jgengine/core/physics/reference/discreteElementExperiments` no longer exports `ColumnCollapseOptions`, `ColumnCollapseResult`, `DEM_GLASS_BEADS`, `DEM_SAND`, `DEM_STEEL`, `HopperOptions`, `HopperResult`, `JanssenFit` and 17 more.
1212
+ - `@jgengine/core/physics/reference/discreteElements` no longer exports `DemBodySpec`, `DemBondLoad`, `DemBondSpec`, `DemInteraction`, `DemLiquid`, `DemMaterial`, `DemSnapshot`, `DemSphereSpec` and 11 more.
1213
+ - `@jgengine/core/physics/reference/eigenvalues` no longer exports `polynomialRoots`.
1214
+ - `@jgengine/core/physics/reference/hullForm` no longer exports `HullMesh`, `HullOffsets`, `PrismaticPlaningHullOptions`, `WigleyHullOptions`, `boxBarge`, `hullMeshFromOffsets`, `meshVolume`, `prismaticPlaningHull` and 1 more.
1215
+ - `@jgengine/core/physics/reference/hullHydrostatics` no longer exports `FloatingAttitude`, `FloatingCondition`, `HullIntegrator`, `HullLoads`, `HullWater`, `HydrostaticParticulars`, `MARINE_GRAVITY`, `RightingArmPoint` and 10 more.
1216
+ - `@jgengine/core/physics/reference/magicFormulaTire` no longer exports `MagicFormulaCoefficients`, `MagicFormulaContactState`, `MagicFormulaInput`, `MagicFormulaOutput`, `MagicFormulaTire`, `MagicFormulaTireOptions`, `MagicFormulaTireState`, `MagicFormulaTireStep` and 11 more.
1217
+ - `@jgengine/core/physics/reference/marinePropeller` no longer exports `BSeriesPropeller`, `OpenWaterPoint`, `PropellerOperatingPoint`, `ScrewBladeSection`, `Waterjet`, `WaterjetPoint`, `bSeriesBladeSection`, `bSeriesOpenWater` and 5 more.
1218
+ - `@jgengine/core/physics/reference/motorcycleManeuvers` no longer exports `BikeCourseSubject`, `BikeHandlingMetrics`, `BikeHandlingOptions`, `BikeScenario`, `measureBikeHandling`.
1219
+ - `@jgengine/core/physics/reference/motorcycleRider` no longer exports `MotorcycleRiderOptions`, `RiddenMotorcycle`, `RiddenMotorcycleState`, `createRiddenMotorcycle`.
1220
+ - `@jgengine/core/physics/reference/motorcycleTire` no longer exports `MotorcycleTireCoefficients`, `MotorcycleTireInput`, `MotorcycleTireOutput`, `SPORT_FRONT_120_70_ZR17`, `SPORT_REAR_180_55_ZR17`, `motorcycleMagicFormula`.
1221
+ - `@jgengine/core/physics/reference/oceanWaves` no longer exports `IrregularSeaOptions`, `OceanSea`, `SeaSpectrum`, `WaveComponent`, `irregularSea`, `regularSea`, `seaElevation`, `seaWaterAt` and 2 more.
1222
+ - `@jgengine/core/physics/reference/planingHull` no longer exports `NACA_TN2876_MODEL`, `NACA_TN2876_RUNS`, `PlaningEquilibrium`, `PlaningFluid`, `PlaningHull`, `PlaningState`, `PrismaticPlaningRun`, `planingAtTrim` and 4 more.
1223
+ - `@jgengine/core/physics/reference/realCars` no longer exports `MAZDA_MX5_ND`, `REAL_CARS`, `RealCar`, `RealCarTestData`, `SCION_FRS_2013`.
1224
+ - `@jgengine/core/physics/reference/realMotorcycles` no longer exports `GSXR1000_SHARP_2004`, `PublishedMotorcyclePerformance`, `REAL_MOTORCYCLES`, `RealMotorcycle`.
1225
+ - `@jgengine/core/physics/reference/referenceCar` no longer exports `ReferenceAero`, `ReferenceAxle`, `ReferenceBrakes`, `ReferenceCar`, `ReferenceCarOptions`, `ReferenceCarSpec`, `ReferenceCarState`, `ReferenceCarStep` and 7 more.
1226
+ - `@jgengine/core/physics/reference/referenceMotorcycle` no longer exports `MotorcycleBody`, `MotorcycleControls`, `MotorcycleModes`, `MotorcyclePowertrain`, `MotorcycleRearLinkage`, `MotorcycleWheel`, `ReferenceMotorcycle`, `ReferenceMotorcycleOptions` and 6 more.
1227
+ - `@jgengine/core/physics/reference/rigidBodyTree` no longer exports `RigidBodyDefinition`, `RigidBodyTree`, `RigidBodyTreeState`, `RigidJoint`, `createRigidBodyTree`.
1228
+ - `@jgengine/core/physics/reference/rungeKutta` no longer exports `RungeKutta4`, `createRungeKutta4`.
1229
+ - `@jgengine/core/physics/reference/seakeepingHull` no longer exports `SeakeepingHull`, `SeakeepingHullOptions`, `SeakeepingState`, `SeakeepingStation`, `SurgeForce`, `restingSeakeepingState`, `seakeepingHullFromStrip`, `stepSeakeeping`.
1230
+ - `@jgengine/core/physics/reference/sectionHydrodynamics` no longer exports `HalfSection`, `SectionHeave`, `lewisSection`, `sectionHeave`.
1231
+ - `@jgengine/core/physics/reference/shipManoeuvring` no longer exports `KVLCC2_L7`, `KVLCC2_L7_PUBLISHED`, `KVLCC2_L7_SPEED`, `ManoeuvringTrialBoat`, `MmgForces`, `MmgHullDerivatives`, `MmgPropeller`, `MmgRudder` and 11 more.
1232
+ - `@jgengine/core/physics/reference/shipResistance` no longer exports `HOLTROP_MENNEN_EXAMPLE`, `HoltropConditions`, `HoltropHull`, `HoltropPropeller`, `HoltropPropulsionFactors`, `HoltropResistance`, `SEA_WATER_VISCOSITY`, `holtropMennenResistance` and 3 more.
1233
+ - `@jgengine/core/physics/reference/standardManeuvers` no longer exports `StandardManeuver`, `StandardManeuverOptions`, `StandardManeuverReport`, `measureStandardManeuvers`.
1234
+ - `@jgengine/core/physics/reference/stripTheory` no longer exports `HeavePitchCoefficients`, `HeavePitchResponse`, `StripHull`, `StripSections`, `heavePitchResponse`, `stripSections`.
1235
+ - `@jgengine/core/physics/reference/suspensionKinematics` no longer exports `DoubleWishboneGeometry`, `MacPhersonGeometry`, `SuspensionGeometry`, `SuspensionPoint`, `SuspensionPose`, `SuspensionSample`, `SuspensionTable`, `createSuspensionSample` and 2 more.
1236
+ - `@jgengine/core/physics/reference/whippleBicycle` no longer exports `BENCHMARK_BICYCLE`, `BENCHMARK_BICYCLE_EIGENVALUES`, `WhippleBicycle`, `WhippleBicycleInput`, `WhippleBicycleParameters`, `WhippleBicycleSnapshot`, `WhippleBicycleStart`, `WhippleBicycleState` and 7 more.
1237
+ - cave, summoned encounter, subdual, remains, base building and creature body from core; Fernwild, their only adopter, owns them under engine-local with framework-ok
1238
+ - `@jgengine/core/basebuilding/baseBuilding` no longer exports `BaseBuilding`, `BaseBuildingConfig`, `BaseBuildingState`, `BasePiece`, `BaseVec3`, `StructureBox`, `StructureDamage`, `StructureGroundRule` and 10 more.
1239
+ - `@jgengine/core/basebuilding/BaseStructures.draw` no longer exports `BaseStructures`, `BaseStructuresProps`.
1240
+ - `@jgengine/core/cave/Cave.draw` no longer exports `Cave`, `CaveColors`.
1241
+ - `@jgengine/core/cave/caveLayout` no longer exports `CaveConfig`, `CaveGround`, `CaveLayout`, `caveLayout`.
1242
+ - `@jgengine/core/cave/caveMesh` no longer exports `CaveMesh`, `CaveMeshPart`, `caveMesh`.
1243
+ - `@jgengine/core/creatureBody/autoRig` no longer exports `AutoRigOptions`, `RigShape`, `autoRig`.
1244
+ - `@jgengine/core/creatureBody/bodyPlan` no longer exports `BodyFeatures`, `BodyPlan`, `bodyGlbModel`, `bodyModel`.
1245
+ - `@jgengine/core/creatureBody/gait` no longer exports `GaitLimb`, `GaitRig`, `gaitClips`.
1246
+ - `@jgengine/core/creatureBody/glbRead` no longer exports `ReadImage`, `ReadMaterial`, `ReadModel`, `ReadPrimitive`, `readGlbModel`.
1247
+ - `@jgengine/core/creatureBody/glbWrite` no longer exports `GlbClip`, `GlbImage`, `GlbMaterial`, `GlbModel`, `GlbNode`, `GlbPrimitive`, `GlbSkin`, `GlbTrack` and 2 more.
1248
+ - `@jgengine/core/remains/remains` no longer exports `Remains`, `RemainsField`, `RemainsLeaveInput`, `RemainsOptions`, `RemainsSnapshot`, `RemainsStack`, `createRemainsField`.
1249
+ - `@jgengine/core/subdual/subdualFeeding` no longer exports `FeedingDose`, `FeedingFood`, `FeedingSupply`, `SubdualFeeding`, `SubdualFeedingConfig`, `SubdualFeedingEvent`, `SubdualFeedingState`, `createSubdualFeeding`.
1250
+ - `@jgengine/core/summonedEncounter/summonedEncounter` no longer exports `CostSource`, `RefusedCandidate`, `SummonCandidate`, `SummonCheck`, `SummonResult`, `SummonReturn`, `SummonTier`, `SummonedEncounter` and 6 more.
1251
+ - the city layout (cityLayout.ts) from core; Harbor Heat, its only adopter, owns it under engine-local with framework-ok. The city scene kind stays in core: Ember Command uses it.
1252
+ - `@jgengine/core/city/cityLayout` no longer exports `CITY_ZONES`, `CityLayout`, `CityLayoutDriveway`, `CityLayoutLot`, `CityLayoutPatch`, `CityLayoutStore`, `CityLotOptions`, `CityLotRoad` and 15 more.
1253
+ - `@jgengine/core/loot/lootFilter` no longer exports `LootFilterCondition`.
1254
+ - `@jgengine/core/progression/gates` no longer exports `GateMiss`, `GateRequirement`.
1255
+ - `@jgengine/core/progression/standing` no longer exports `StandingRequirement`.
1256
+ - Ember Command's primitive-built GLBs, `author-models.mjs`, bundled font files and the unused deepward GLBs.
1257
+
1258
+ Before and after, 3D world at the low tier (desktop 1600 wide, phone 390 wide):
1259
+
1260
+ | | Before | After |
1261
+ |---|---|---|
1262
+ | Desktop | ![](https://github.com/Noisemaker111/jgengine/blob/wave3/look-ember-command/changes/media/wave3-look-ember-command/before-desktop.png?raw=true) | ![](https://github.com/Noisemaker111/jgengine/blob/wave3/look-ember-command/changes/media/wave3-look-ember-command/after-desktop.png?raw=true) |
1263
+ | Phone | ![](https://github.com/Noisemaker111/jgengine/blob/wave3/look-ember-command/changes/media/wave3-look-ember-command/before-phone.png?raw=true) | ![](https://github.com/Noisemaker111/jgengine/blob/wave3/look-ember-command/changes/media/wave3-look-ember-command/after-phone.png?raw=true) |
1264
+
1265
+ Not done or caveats:
1266
+ - Ground054 (war-road) and Rock035 (cliffs) are not in the material library and ambientCG is blocked from here; the road uses packed dirt (Ground025) and cliffs Rock022. Grass004 and Ground037 are used.
1267
+ - `bun run perf ember-command` could not run here (software GL times out on a shader error that predates this branch), so frame time is unmeasured.
1268
+ - The medium and high tiers could not be captured. Grass004's scan failed to decode in the headless capture, so the after shot shows the procedural ground colour.
1269
+ - Whole buildings come from the older Quaternius Medieval Village Pack and Modular Medieval Buildings; the MegaKit is modular pieces only.
1270
+ - `@jgengine/assets/gltfMaterials` no longer exports `GLTF_MATERIAL_EXTENSIONS_R182`.
1271
+
29
1272
  ## 0.50.0
30
1273
 
31
1274
  ### Migrate