@jgengine/core 0.10.0 → 0.12.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.
Files changed (727) hide show
  1. package/CHANGELOG.md +39 -2
  2. package/LICENSE +203 -661
  3. package/README.md +1 -1
  4. package/dist/ai/crowd.d.ts +55 -0
  5. package/dist/ai/crowd.js +114 -0
  6. package/dist/ai/flock.d.ts +5 -2
  7. package/dist/ai/flock.js +5 -2
  8. package/dist/ai/groupAssist.d.ts +1 -0
  9. package/dist/ai/groupAssist.js +1 -0
  10. package/dist/ai/heatSystem.d.ts +76 -0
  11. package/dist/ai/heatSystem.js +97 -0
  12. package/dist/ai/interestScheduler.d.ts +107 -0
  13. package/dist/ai/interestScheduler.js +118 -0
  14. package/dist/ai/jobBoard.d.ts +1 -0
  15. package/dist/ai/jobBoard.js +1 -0
  16. package/dist/ai/laneSelect.d.ts +5 -2
  17. package/dist/ai/laneSelect.js +5 -2
  18. package/dist/ai/mobBrain.d.ts +1 -0
  19. package/dist/ai/mobBrain.js +1 -0
  20. package/dist/ai/populationDirector.d.ts +103 -0
  21. package/dist/ai/populationDirector.js +190 -0
  22. package/dist/ai/pursuit.d.ts +56 -0
  23. package/dist/ai/pursuit.js +53 -0
  24. package/dist/ai/spawnDirector.d.ts +7 -2
  25. package/dist/ai/spawnDirector.js +18 -15
  26. package/dist/ai/spawnPoint.d.ts +3 -1
  27. package/dist/ai/spawnPoint.js +3 -1
  28. package/dist/ai/targetAcquisition.d.ts +84 -0
  29. package/dist/ai/targetAcquisition.js +92 -0
  30. package/dist/anim/easing.d.ts +19 -0
  31. package/dist/anim/easing.js +19 -0
  32. package/dist/anim/oscillator.d.ts +12 -0
  33. package/dist/anim/oscillator.js +25 -0
  34. package/dist/area/areaEffectField.d.ts +127 -0
  35. package/dist/area/areaEffectField.js +175 -0
  36. package/dist/area/stackPolicy.d.ts +47 -0
  37. package/dist/area/stackPolicy.js +99 -0
  38. package/dist/authoring.d.ts +2 -1
  39. package/dist/authoring.js +2 -1
  40. package/dist/board/laneBoard.d.ts +13 -0
  41. package/dist/board/laneBoard.js +13 -0
  42. package/dist/board/timelineBoard.d.ts +10 -0
  43. package/dist/board/timelineBoard.js +10 -0
  44. package/dist/combat/abilityKit.d.ts +18 -0
  45. package/dist/combat/abilityKit.js +24 -9
  46. package/dist/combat/animationState.d.ts +5 -0
  47. package/dist/combat/animationState.js +5 -0
  48. package/dist/combat/breakMeters.d.ts +10 -0
  49. package/dist/combat/breakMeters.js +10 -0
  50. package/dist/combat/castRunner.d.ts +5 -0
  51. package/dist/combat/castRunner.js +5 -0
  52. package/dist/combat/comboPoints.d.ts +5 -0
  53. package/dist/combat/comboPoints.js +5 -0
  54. package/dist/combat/comboString.d.ts +5 -0
  55. package/dist/combat/comboString.js +5 -0
  56. package/dist/combat/damageInterceptors.d.ts +192 -0
  57. package/dist/combat/damageInterceptors.js +251 -0
  58. package/dist/combat/damageMatchup.d.ts +68 -0
  59. package/dist/combat/damageMatchup.js +42 -0
  60. package/dist/combat/damageResolution.d.ts +63 -0
  61. package/dist/combat/damageResolution.js +50 -0
  62. package/dist/combat/death.d.ts +7 -1
  63. package/dist/combat/death.js +5 -0
  64. package/dist/combat/deathReason.d.ts +14 -0
  65. package/dist/combat/deathReason.js +1 -0
  66. package/dist/combat/defensiveWindow.d.ts +5 -0
  67. package/dist/combat/defensiveWindow.js +5 -0
  68. package/dist/combat/dotField.d.ts +5 -1
  69. package/dist/combat/dotField.js +5 -1
  70. package/dist/combat/downed.d.ts +5 -0
  71. package/dist/combat/downed.js +5 -0
  72. package/dist/combat/effects.d.ts +5 -0
  73. package/dist/combat/effects.js +5 -0
  74. package/dist/combat/encounterSequence.d.ts +258 -0
  75. package/dist/combat/encounterSequence.js +426 -0
  76. package/dist/combat/hitReaction.d.ts +57 -1
  77. package/dist/combat/hitReaction.js +45 -5
  78. package/dist/combat/magazine.d.ts +54 -0
  79. package/dist/combat/magazine.js +96 -0
  80. package/dist/combat/projectiles.d.ts +5 -0
  81. package/dist/combat/projectiles.js +32 -14
  82. package/dist/combat/receivedDamage.d.ts +117 -0
  83. package/dist/combat/receivedDamage.js +92 -0
  84. package/dist/combat/regenShield.d.ts +5 -1
  85. package/dist/combat/regenShield.js +5 -1
  86. package/dist/combat/renderCues.d.ts +51 -0
  87. package/dist/combat/renderCues.js +44 -0
  88. package/dist/combat/resourcePool.d.ts +5 -0
  89. package/dist/combat/resourcePool.js +5 -0
  90. package/dist/combat/rewardAllocation.d.ts +121 -0
  91. package/dist/combat/rewardAllocation.js +251 -0
  92. package/dist/combat/shotOrigin.d.ts +18 -1
  93. package/dist/combat/shotOrigin.js +39 -0
  94. package/dist/combat/statusApplication.d.ts +96 -0
  95. package/dist/combat/statusApplication.js +81 -0
  96. package/dist/combat/telegraph.d.ts +11 -2
  97. package/dist/combat/telegraph.js +11 -2
  98. package/dist/combat/thresholdCrossings.d.ts +85 -0
  99. package/dist/combat/thresholdCrossings.js +116 -0
  100. package/dist/combat.d.ts +35 -0
  101. package/dist/combat.js +35 -0
  102. package/dist/commands/commandRegistry.d.ts +11 -0
  103. package/dist/commands/commandRegistry.js +9 -2
  104. package/dist/crafting/crop.d.ts +18 -0
  105. package/dist/crafting/crop.js +18 -0
  106. package/dist/crafting/production.d.ts +5 -0
  107. package/dist/crafting/production.js +5 -0
  108. package/dist/devtools/controls.d.ts +38 -0
  109. package/dist/devtools/controls.js +181 -0
  110. package/dist/devtools/devtools.d.ts +5 -197
  111. package/dist/devtools/devtools.js +38 -774
  112. package/dist/devtools/discover.d.ts +32 -0
  113. package/dist/devtools/discover.js +240 -0
  114. package/dist/devtools/fallbackSeams.d.ts +50 -0
  115. package/dist/devtools/fallbackSeams.js +111 -0
  116. package/dist/devtools/frame.d.ts +15 -0
  117. package/dist/devtools/frame.js +247 -0
  118. package/dist/devtools/logs.d.ts +15 -0
  119. package/dist/devtools/logs.js +86 -0
  120. package/dist/devtools/overrides.d.ts +16 -0
  121. package/dist/devtools/overrides.js +66 -0
  122. package/dist/devtools/rewriteTunables.d.ts +17 -0
  123. package/dist/devtools/rewriteTunables.js +276 -0
  124. package/dist/devtools/saveEndpoint.d.ts +46 -0
  125. package/dist/devtools/saveEndpoint.js +48 -0
  126. package/dist/devtools/transformTunables.d.ts +3 -0
  127. package/dist/devtools/transformTunables.js +3 -0
  128. package/dist/devtools/tunableSchema.d.ts +31 -0
  129. package/dist/devtools/tunableSchema.js +31 -0
  130. package/dist/devtools/types.d.ts +212 -0
  131. package/dist/devtools/types.js +1 -0
  132. package/dist/economy/auctionBook.d.ts +122 -0
  133. package/dist/economy/auctionBook.js +213 -0
  134. package/dist/economy/currency.d.ts +12 -1
  135. package/dist/economy/currency.js +12 -1
  136. package/dist/economy/listingBook.d.ts +91 -0
  137. package/dist/economy/listingBook.js +144 -0
  138. package/dist/economy/priceHistory.d.ts +44 -0
  139. package/dist/economy/priceHistory.js +89 -0
  140. package/dist/economy/resourceLedger.d.ts +222 -0
  141. package/dist/economy/resourceLedger.js +353 -0
  142. package/dist/economy/sharedWallet.d.ts +14 -0
  143. package/dist/economy/sharedWallet.js +14 -0
  144. package/dist/economy/techTree.d.ts +12 -0
  145. package/dist/economy/techTree.js +12 -0
  146. package/dist/economy/unlockPoints.d.ts +92 -0
  147. package/dist/economy/unlockPoints.js +103 -0
  148. package/dist/economy/wallet.d.ts +26 -2
  149. package/dist/economy/wallet.js +35 -6
  150. package/dist/editor/commandApply.d.ts +5 -0
  151. package/dist/editor/commandApply.js +755 -0
  152. package/dist/editor/commands.d.ts +235 -7
  153. package/dist/editor/commands.js +82 -124
  154. package/dist/editor/directives.d.ts +94 -0
  155. package/dist/editor/directives.js +206 -0
  156. package/dist/editor/document.d.ts +194 -13
  157. package/dist/editor/document.js +1166 -19
  158. package/dist/editor/entityCatalog.d.ts +42 -0
  159. package/dist/editor/entityCatalog.js +101 -0
  160. package/dist/editor/environment.d.ts +74 -0
  161. package/dist/editor/environment.js +169 -0
  162. package/dist/editor/grid.d.ts +229 -0
  163. package/dist/editor/grid.js +366 -0
  164. package/dist/editor/gridAdapters.d.ts +80 -0
  165. package/dist/editor/gridAdapters.js +134 -0
  166. package/dist/editor/index.d.ts +98 -6
  167. package/dist/editor/index.js +13 -2
  168. package/dist/editor/liveSync.d.ts +127 -0
  169. package/dist/editor/liveSync.js +249 -0
  170. package/dist/editor/minimap.d.ts +31 -0
  171. package/dist/editor/minimap.js +73 -0
  172. package/dist/editor/runtimeInspector.d.ts +88 -0
  173. package/dist/editor/runtimeInspector.js +239 -0
  174. package/dist/editor/streamer.d.ts +66 -0
  175. package/dist/editor/streamer.js +68 -0
  176. package/dist/editor/types.d.ts +250 -1
  177. package/dist/editor/world.d.ts +136 -0
  178. package/dist/editor/world.js +303 -0
  179. package/dist/faction/reputation.d.ts +5 -0
  180. package/dist/faction/reputation.js +5 -0
  181. package/dist/format/distance.d.ts +17 -0
  182. package/dist/format/distance.js +18 -0
  183. package/dist/format/duration.d.ts +27 -0
  184. package/dist/format/duration.js +45 -0
  185. package/dist/format/speed.d.ts +17 -0
  186. package/dist/format/speed.js +25 -0
  187. package/dist/game/breeding.d.ts +161 -0
  188. package/dist/game/breeding.js +181 -0
  189. package/dist/game/cameraConfig.d.ts +451 -0
  190. package/dist/game/cameraConfig.js +1 -0
  191. package/dist/game/connectedPlayers.d.ts +6 -4
  192. package/dist/game/connectedPlayers.js +2 -2
  193. package/dist/game/cosmetics.d.ts +9 -0
  194. package/dist/game/cosmetics.js +16 -0
  195. package/dist/game/defineGame.d.ts +110 -5
  196. package/dist/game/defineGame.js +49 -4
  197. package/dist/game/defineSystem.d.ts +90 -0
  198. package/dist/game/defineSystem.js +47 -0
  199. package/dist/game/dialogue.d.ts +33 -0
  200. package/dist/game/dialogue.js +21 -0
  201. package/dist/game/events.d.ts +63 -13
  202. package/dist/game/events.js +5 -0
  203. package/dist/game/feed.d.ts +33 -0
  204. package/dist/game/feed.js +35 -2
  205. package/dist/game/gamePhase.d.ts +11 -0
  206. package/dist/game/gamePhase.js +16 -0
  207. package/dist/game/leaderboard.d.ts +5 -0
  208. package/dist/game/leaderboard.js +5 -0
  209. package/dist/game/loadout.d.ts +5 -0
  210. package/dist/game/loadout.js +5 -0
  211. package/dist/game/lootFilter.d.ts +2 -0
  212. package/dist/game/lootFilter.js +2 -0
  213. package/dist/game/lootPipeline.d.ts +164 -0
  214. package/dist/game/lootPipeline.js +216 -0
  215. package/dist/game/lootTable.d.ts +19 -2
  216. package/dist/game/lootTable.js +15 -5
  217. package/dist/game/objectives.d.ts +43 -0
  218. package/dist/game/objectives.js +36 -0
  219. package/dist/game/paramLayers.d.ts +148 -0
  220. package/dist/game/paramLayers.js +185 -0
  221. package/dist/game/ping.d.ts +5 -0
  222. package/dist/game/ping.js +5 -0
  223. package/dist/game/playableGame.d.ts +116 -432
  224. package/dist/game/playableGame.js +1 -1
  225. package/dist/game/progression.d.ts +35 -0
  226. package/dist/game/progression.js +19 -0
  227. package/dist/game/quest.d.ts +8 -0
  228. package/dist/game/quest.js +30 -3
  229. package/dist/game/race.d.ts +141 -0
  230. package/dist/game/race.js +169 -0
  231. package/dist/game/recordBook.d.ts +3 -1
  232. package/dist/game/recordBook.js +4 -1
  233. package/dist/game/ruleSelection.d.ts +75 -0
  234. package/dist/game/ruleSelection.js +127 -0
  235. package/dist/game/runDraft.d.ts +5 -0
  236. package/dist/game/runDraft.js +5 -0
  237. package/dist/game/saveStore.d.ts +111 -0
  238. package/dist/game/saveStore.js +312 -0
  239. package/dist/game/snapshotHistory.d.ts +67 -0
  240. package/dist/game/snapshotHistory.js +95 -0
  241. package/dist/game/social.d.ts +38 -1
  242. package/dist/game/social.js +71 -0
  243. package/dist/game/spawnPoints.d.ts +5 -0
  244. package/dist/game/spawnPoints.js +5 -0
  245. package/dist/game/systemRuntime.d.ts +50 -0
  246. package/dist/game/systemRuntime.js +157 -0
  247. package/dist/game/systemSchedule.d.ts +72 -0
  248. package/dist/game/systemSchedule.js +242 -0
  249. package/dist/game/toasts.d.ts +43 -0
  250. package/dist/game/toasts.js +44 -0
  251. package/dist/game/trade.d.ts +10 -0
  252. package/dist/game/trade.js +10 -0
  253. package/dist/game/tribe.d.ts +184 -0
  254. package/dist/game/tribe.js +432 -0
  255. package/dist/game/unlocks.d.ts +8 -0
  256. package/dist/game/unlocks.js +16 -0
  257. package/dist/game/vfxInstance.d.ts +138 -0
  258. package/dist/game/vfxInstance.js +96 -0
  259. package/dist/game/worldItem.d.ts +17 -4
  260. package/dist/game/worldItem.js +17 -4
  261. package/dist/gameplay.d.ts +93 -0
  262. package/dist/gameplay.js +93 -0
  263. package/dist/index.d.ts +5 -14
  264. package/dist/index.js +5 -14
  265. package/dist/input/actionBindings.d.ts +23 -6
  266. package/dist/input/actionBindings.js +23 -6
  267. package/dist/input/axisInput.d.ts +7 -2
  268. package/dist/input/axisInput.js +7 -2
  269. package/dist/input/controlGroups.d.ts +67 -0
  270. package/dist/input/controlGroups.js +41 -0
  271. package/dist/input/touchScheme.d.ts +82 -6
  272. package/dist/input/touchScheme.js +123 -10
  273. package/dist/interaction/lockpick.d.ts +61 -0
  274. package/dist/interaction/lockpick.js +168 -0
  275. package/dist/interaction/proximityPrompt.d.ts +2 -0
  276. package/dist/interaction/proximityPrompt.js +2 -0
  277. package/dist/interaction/qte.d.ts +5 -0
  278. package/dist/interaction/qte.js +5 -0
  279. package/dist/interaction/skillCheck.d.ts +5 -0
  280. package/dist/interaction/skillCheck.js +5 -0
  281. package/dist/inventory/encumbrance.d.ts +69 -0
  282. package/dist/inventory/encumbrance.js +68 -0
  283. package/dist/inventory/inventoryModel.d.ts +12 -0
  284. package/dist/inventory/inventoryModel.js +12 -0
  285. package/dist/inventory/shapedGrid.d.ts +16 -0
  286. package/dist/inventory/shapedGrid.js +16 -0
  287. package/dist/inventory/slotModel.d.ts +10 -0
  288. package/dist/inventory/slotModel.js +10 -0
  289. package/dist/item/durability.d.ts +5 -0
  290. package/dist/item/durability.js +6 -3
  291. package/dist/item/itemIdentity.d.ts +171 -0
  292. package/dist/item/itemIdentity.js +138 -0
  293. package/dist/item/itemInstanceRegistry.d.ts +32 -0
  294. package/dist/item/itemInstanceRegistry.js +34 -0
  295. package/dist/item/itemgen.d.ts +163 -0
  296. package/dist/item/itemgen.js +151 -0
  297. package/dist/item/modularItem.d.ts +5 -0
  298. package/dist/item/modularItem.js +5 -0
  299. package/dist/item/use.d.ts +5 -0
  300. package/dist/item/use.js +5 -0
  301. package/dist/item/useBehavior.d.ts +142 -0
  302. package/dist/item/useBehavior.js +105 -0
  303. package/dist/item/weapon.d.ts +5 -0
  304. package/dist/item/weapon.js +5 -0
  305. package/dist/math/scalar.d.ts +25 -0
  306. package/dist/math/scalar.js +47 -0
  307. package/dist/meta/changelog.d.ts +4 -1
  308. package/dist/meta/changelog.js +39 -2
  309. package/dist/movement/avoidance.d.ts +45 -0
  310. package/dist/movement/avoidance.js +123 -0
  311. package/dist/movement/cameraRig.d.ts +8 -0
  312. package/dist/movement/cameraRig.js +8 -0
  313. package/dist/movement/dash.d.ts +11 -0
  314. package/dist/movement/dash.js +11 -0
  315. package/dist/movement/formation.d.ts +135 -0
  316. package/dist/movement/formation.js +194 -0
  317. package/dist/movement/glideModel.d.ts +5 -0
  318. package/dist/movement/glideModel.js +5 -0
  319. package/dist/movement/grappleSwing.d.ts +5 -0
  320. package/dist/movement/grappleSwing.js +5 -0
  321. package/dist/movement/leaderTrail.d.ts +5 -0
  322. package/dist/movement/leaderTrail.js +5 -0
  323. package/dist/movement/movementModel.d.ts +50 -9
  324. package/dist/movement/movementModel.js +75 -29
  325. package/dist/movement/playerMovement.js +167 -12
  326. package/dist/movement/poseState.d.ts +13 -0
  327. package/dist/movement/poseState.js +16 -0
  328. package/dist/movement/steering.d.ts +8 -0
  329. package/dist/movement/steering.js +18 -0
  330. package/dist/multiplayer/combatSnapshot.d.ts +3 -0
  331. package/dist/multiplayer/combatSnapshot.js +16 -8
  332. package/dist/multiplayer/lagCompensation.d.ts +5 -0
  333. package/dist/multiplayer/lagCompensation.js +5 -0
  334. package/dist/multiplayer/presenceModel.d.ts +11 -1
  335. package/dist/multiplayer/presenceModel.js +17 -1
  336. package/dist/multiplayer/simultaneousCommit.d.ts +3 -0
  337. package/dist/multiplayer/simultaneousCommit.js +3 -0
  338. package/dist/multiplayer.d.ts +11 -0
  339. package/dist/multiplayer.js +11 -0
  340. package/dist/nav/pathFollow.d.ts +57 -0
  341. package/dist/nav/pathFollow.js +109 -0
  342. package/dist/orders/orderKinds.d.ts +156 -0
  343. package/dist/orders/orderKinds.js +197 -0
  344. package/dist/orders/orderQueue.d.ts +208 -0
  345. package/dist/orders/orderQueue.js +211 -0
  346. package/dist/physics/drivableVehicle.d.ts +31 -0
  347. package/dist/physics/drivableVehicle.js +16 -0
  348. package/dist/physics/flightDynamics.d.ts +82 -0
  349. package/dist/physics/flightDynamics.js +165 -0
  350. package/dist/physics/gravityField.d.ts +25 -0
  351. package/dist/physics/gravityField.js +41 -0
  352. package/dist/physics/kinematicVehicle.d.ts +108 -1
  353. package/dist/physics/kinematicVehicle.js +212 -15
  354. package/dist/physics/physicsWorld.d.ts +50 -12
  355. package/dist/physics/physicsWorld.js +120 -122
  356. package/dist/physics/radialImpulse.d.ts +25 -0
  357. package/dist/physics/radialImpulse.js +27 -0
  358. package/dist/physics/vehicleObstacles.d.ts +44 -0
  359. package/dist/physics/vehicleObstacles.js +115 -0
  360. package/dist/procedural.d.ts +3 -0
  361. package/dist/procedural.js +3 -0
  362. package/dist/progression/statGraph.d.ts +116 -0
  363. package/dist/progression/statGraph.js +318 -0
  364. package/dist/puzzle/cellGrid.d.ts +9 -0
  365. package/dist/puzzle/cellGrid.js +9 -0
  366. package/dist/puzzle/fallingPiece.d.ts +9 -0
  367. package/dist/puzzle/fallingPiece.js +9 -0
  368. package/dist/puzzle/nonogram.d.ts +39 -0
  369. package/dist/puzzle/nonogram.js +136 -0
  370. package/dist/random/nameGen.d.ts +5 -0
  371. package/dist/random/nameGen.js +5 -0
  372. package/dist/random/pick.d.ts +8 -0
  373. package/dist/random/pick.js +31 -0
  374. package/dist/random/rng.d.ts +26 -1
  375. package/dist/random/rng.js +32 -9
  376. package/dist/random/seedLink.d.ts +4 -0
  377. package/dist/random/seedLink.js +4 -0
  378. package/dist/relation/keyedValues.d.ts +54 -0
  379. package/dist/relation/keyedValues.js +115 -0
  380. package/dist/relation/thresholds.d.ts +62 -0
  381. package/dist/relation/thresholds.js +62 -0
  382. package/dist/render/color.d.ts +12 -0
  383. package/dist/render/color.js +26 -0
  384. package/dist/render/lookPreset.d.ts +41 -0
  385. package/dist/render/lookPreset.js +29 -0
  386. package/dist/render/postProcessing.d.ts +20 -0
  387. package/dist/render/postProcessing.js +21 -1
  388. package/dist/rules/predicate.d.ts +53 -0
  389. package/dist/rules/predicate.js +64 -0
  390. package/dist/rules/ruleEffects.d.ts +38 -0
  391. package/dist/rules/ruleEffects.js +37 -0
  392. package/dist/rules/triggeredRules.d.ts +160 -0
  393. package/dist/rules/triggeredRules.js +241 -0
  394. package/dist/runtime/adapter.d.ts +55 -3
  395. package/dist/runtime/adapter.js +57 -1
  396. package/dist/runtime/cameraDirector.d.ts +1 -0
  397. package/dist/runtime/cameraDirector.js +1 -0
  398. package/dist/runtime/commandRunner.d.ts +1 -0
  399. package/dist/runtime/commandRunner.js +1 -0
  400. package/dist/runtime/context/combat.d.ts +51 -0
  401. package/dist/runtime/context/combat.js +130 -0
  402. package/dist/runtime/context/combatFx.d.ts +23 -0
  403. package/dist/runtime/context/combatFx.js +161 -0
  404. package/dist/runtime/context/deathLoot.d.ts +30 -0
  405. package/dist/runtime/context/deathLoot.js +39 -0
  406. package/dist/runtime/context/player.d.ts +48 -0
  407. package/dist/runtime/context/player.js +125 -0
  408. package/dist/runtime/context/registries.d.ts +13 -0
  409. package/dist/runtime/context/registries.js +84 -0
  410. package/dist/runtime/context/scene.d.ts +59 -0
  411. package/dist/runtime/context/scene.js +291 -0
  412. package/dist/runtime/context/snapshotCodecs.d.ts +12 -0
  413. package/dist/runtime/context/snapshotCodecs.js +26 -0
  414. package/dist/runtime/context/worldItems.d.ts +21 -0
  415. package/dist/runtime/context/worldItems.js +37 -0
  416. package/dist/runtime/descriptors/baseline.d.ts +48 -0
  417. package/dist/runtime/descriptors/baseline.js +157 -0
  418. package/dist/runtime/descriptors/features.d.ts +79 -0
  419. package/dist/runtime/descriptors/features.js +299 -0
  420. package/dist/runtime/gameContext.d.ts +2 -327
  421. package/dist/runtime/gameContext.js +273 -778
  422. package/dist/runtime/gameContextTypes.d.ts +467 -0
  423. package/dist/runtime/gameContextTypes.js +1 -0
  424. package/dist/runtime/gameRuntime.d.ts +1 -0
  425. package/dist/runtime/gameRuntime.js +1 -0
  426. package/dist/runtime/headlessRunner.d.ts +62 -0
  427. package/dist/runtime/headlessRunner.js +45 -0
  428. package/dist/runtime/hostPersistence.d.ts +12 -0
  429. package/dist/runtime/hostPersistence.js +12 -0
  430. package/dist/runtime/hostPolicy.d.ts +51 -0
  431. package/dist/runtime/hostPolicy.js +68 -0
  432. package/dist/runtime/hostedGameRunner.d.ts +11 -4
  433. package/dist/runtime/hostedGameRunner.js +27 -3
  434. package/dist/runtime/hostedWorldSession.d.ts +15 -5
  435. package/dist/runtime/hostedWorldSession.js +12 -4
  436. package/dist/runtime/inputSnapshot.d.ts +8 -3
  437. package/dist/runtime/inputSnapshot.js +6 -2
  438. package/dist/runtime/motionIntents.d.ts +11 -2
  439. package/dist/runtime/motionIntents.js +16 -2
  440. package/dist/runtime/perContext.d.ts +15 -0
  441. package/dist/runtime/perContext.js +21 -0
  442. package/dist/runtime/runtimeSave.d.ts +79 -0
  443. package/dist/runtime/runtimeSave.js +105 -0
  444. package/dist/runtime/save.d.ts +4 -0
  445. package/dist/runtime/save.js +4 -0
  446. package/dist/runtime/snapshot.d.ts +7 -0
  447. package/dist/runtime/snapshot.js +7 -0
  448. package/dist/runtime/visibility.d.ts +2 -1
  449. package/dist/runtime/visibility.js +2 -1
  450. package/dist/runtime/worldChannel.d.ts +7 -3
  451. package/dist/runtime/worldChannel.js +51 -6
  452. package/dist/runtime/worldMirror.d.ts +14 -2
  453. package/dist/runtime/worldMirror.js +15 -2
  454. package/dist/runtime/worldProjection.d.ts +47 -0
  455. package/dist/runtime/worldProjection.js +52 -0
  456. package/dist/runtime/worldReplication.d.ts +30 -7
  457. package/dist/runtime/worldReplication.js +41 -9
  458. package/dist/runtime/worldSnapshot.d.ts +42 -3
  459. package/dist/runtime/worldSnapshot.js +34 -7
  460. package/dist/scene/assetCatalog.d.ts +26 -0
  461. package/dist/scene/assetCatalog.js +4 -0
  462. package/dist/scene/assetDiagnostics.d.ts +69 -0
  463. package/dist/scene/assetDiagnostics.js +110 -0
  464. package/dist/scene/assetGenerator.d.ts +65 -0
  465. package/dist/scene/assetGenerator.js +64 -0
  466. package/dist/scene/assetSpace.d.ts +137 -0
  467. package/dist/scene/assetSpace.js +257 -0
  468. package/dist/scene/authoredTriggers.d.ts +219 -0
  469. package/dist/scene/authoredTriggers.js +454 -0
  470. package/dist/scene/behaviorRuntime.d.ts +75 -0
  471. package/dist/scene/behaviorRuntime.js +217 -0
  472. package/dist/scene/behaviors.d.ts +14 -2
  473. package/dist/scene/behaviors.js +7 -2
  474. package/dist/scene/bodyBind.d.ts +60 -0
  475. package/dist/scene/bodyBind.js +51 -0
  476. package/dist/scene/builtinSceneKinds.d.ts +5 -0
  477. package/dist/scene/builtinSceneKinds.js +67 -0
  478. package/dist/scene/colliders.d.ts +71 -1
  479. package/dist/scene/colliders.js +145 -1
  480. package/dist/scene/collisionMesh.d.ts +94 -0
  481. package/dist/scene/collisionMesh.js +699 -0
  482. package/dist/scene/companion.d.ts +147 -0
  483. package/dist/scene/companion.js +193 -0
  484. package/dist/scene/entityStats.d.ts +18 -11
  485. package/dist/scene/entityStats.js +21 -16
  486. package/dist/scene/entityStore.d.ts +12 -1
  487. package/dist/scene/entityStore.js +15 -0
  488. package/dist/scene/facing.d.ts +18 -0
  489. package/dist/scene/facing.js +26 -0
  490. package/dist/scene/modelSockets.d.ts +33 -0
  491. package/dist/scene/modelSockets.js +29 -0
  492. package/dist/scene/objectQuery.d.ts +2 -0
  493. package/dist/scene/objectQuery.js +2 -0
  494. package/dist/scene/objectStore.d.ts +4 -0
  495. package/dist/scene/objectStore.js +6 -0
  496. package/dist/scene/possession.d.ts +8 -0
  497. package/dist/scene/possession.js +14 -0
  498. package/dist/scene/roster.d.ts +3 -0
  499. package/dist/scene/roster.js +12 -0
  500. package/dist/scene/sceneKinds.d.ts +256 -0
  501. package/dist/scene/sceneKinds.js +218 -0
  502. package/dist/scene/sceneOwnership.d.ts +169 -0
  503. package/dist/scene/sceneOwnership.js +179 -0
  504. package/dist/scene/sceneRaycast.js +15 -0
  505. package/dist/scene/selectionBookmarks.d.ts +93 -0
  506. package/dist/scene/selectionBookmarks.js +122 -0
  507. package/dist/scene/vehicleSeat.d.ts +68 -0
  508. package/dist/scene/vehicleSeat.js +59 -0
  509. package/dist/sensor/concealment.d.ts +3 -0
  510. package/dist/sensor/concealment.js +3 -0
  511. package/dist/sensor/freezeMonitor.d.ts +1 -0
  512. package/dist/sensor/freezeMonitor.js +1 -0
  513. package/dist/sensor/frustumSensor.d.ts +7 -3
  514. package/dist/sensor/frustumSensor.js +7 -3
  515. package/dist/sensor/hiddenStateProbe.d.ts +5 -2
  516. package/dist/sensor/hiddenStateProbe.js +5 -2
  517. package/dist/sensor/recordingBuffer.d.ts +2 -1
  518. package/dist/sensor/recordingBuffer.js +2 -1
  519. package/dist/sensor/replayLoop.d.ts +6 -2
  520. package/dist/sensor/replayLoop.js +6 -2
  521. package/dist/sensor/revealQuery.d.ts +2 -1
  522. package/dist/sensor/revealQuery.js +2 -1
  523. package/dist/sensor/visionCone.d.ts +10 -3
  524. package/dist/sensor/visionCone.js +10 -3
  525. package/dist/session/contestedChannel.d.ts +1 -0
  526. package/dist/session/contestedChannel.js +1 -0
  527. package/dist/session/extraction.d.ts +1 -0
  528. package/dist/session/extraction.js +1 -0
  529. package/dist/session/roles.d.ts +6 -0
  530. package/dist/session/roles.js +6 -0
  531. package/dist/session/roundState.d.ts +8 -0
  532. package/dist/session/roundState.js +2 -0
  533. package/dist/settings/settingsModel.d.ts +1 -0
  534. package/dist/settings/settingsModel.js +1 -0
  535. package/dist/stats/accumulatorMeter.d.ts +6 -0
  536. package/dist/stats/accumulatorMeter.js +6 -0
  537. package/dist/stats/eventMeter.d.ts +5 -0
  538. package/dist/stats/eventMeter.js +5 -0
  539. package/dist/stats/rollCheck.d.ts +5 -0
  540. package/dist/stats/rollCheck.js +5 -0
  541. package/dist/stats/spawnLevelStats.d.ts +110 -0
  542. package/dist/stats/spawnLevelStats.js +140 -0
  543. package/dist/stats/statModifiers.d.ts +5 -0
  544. package/dist/stats/statModifiers.js +5 -0
  545. package/dist/stats/statPool.d.ts +70 -0
  546. package/dist/stats/statPool.js +59 -0
  547. package/dist/store/changeSignal.d.ts +3 -0
  548. package/dist/store/changeSignal.js +2 -0
  549. package/dist/store/defineKeyedStore.d.ts +38 -0
  550. package/dist/store/defineKeyedStore.js +42 -0
  551. package/dist/store/defineStore.d.ts +33 -0
  552. package/dist/store/defineStore.js +35 -0
  553. package/dist/store/observableKeyedStore.d.ts +7 -0
  554. package/dist/store/observableKeyedStore.js +35 -2
  555. package/dist/survival/decayMeter.d.ts +55 -0
  556. package/dist/survival/decayMeter.js +130 -57
  557. package/dist/survival/moodle.d.ts +2 -0
  558. package/dist/survival/regionHealth.d.ts +6 -0
  559. package/dist/survival/regionHealth.js +6 -3
  560. package/dist/tactics/fallingGrid.d.ts +4 -2
  561. package/dist/tactics/fallingGrid.js +4 -2
  562. package/dist/tactics/predictiveQuery.d.ts +3 -0
  563. package/dist/tactics/predictiveQuery.js +3 -0
  564. package/dist/tactics/snapshot.d.ts +2 -0
  565. package/dist/tactics/snapshot.js +2 -0
  566. package/dist/tactics/surface.d.ts +1 -0
  567. package/dist/tactics/surface.js +1 -0
  568. package/dist/tactics/tacticalGrid.d.ts +1 -0
  569. package/dist/tactics/tacticalGrid.js +1 -0
  570. package/dist/time/beatClock.d.ts +14 -4
  571. package/dist/time/beatClock.js +14 -4
  572. package/dist/time/calendarClock.d.ts +3 -0
  573. package/dist/time/calendarClock.js +3 -0
  574. package/dist/time/idleProgress.d.ts +4 -0
  575. package/dist/time/idleProgress.js +4 -0
  576. package/dist/time/simClock.d.ts +2 -0
  577. package/dist/time/simClock.js +20 -5
  578. package/dist/ui/actionModel.d.ts +110 -0
  579. package/dist/ui/actionModel.js +159 -0
  580. package/dist/ui/gameLayout.d.ts +30 -11
  581. package/dist/ui/gameLayout.js +30 -11
  582. package/dist/ui/hudDocument.d.ts +114 -0
  583. package/dist/ui/hudDocument.js +220 -0
  584. package/dist/ui/hudLayout.d.ts +38 -1
  585. package/dist/ui/hudLayout.js +220 -17
  586. package/dist/ui/selectionModel.d.ts +92 -0
  587. package/dist/ui/selectionModel.js +88 -0
  588. package/dist/ui/tooltipModel.d.ts +63 -0
  589. package/dist/ui/tooltipModel.js +82 -0
  590. package/dist/ui.d.ts +15 -0
  591. package/dist/ui.js +15 -0
  592. package/dist/visibility/bounds.d.ts +8 -1
  593. package/dist/visibility/bounds.js +8 -1
  594. package/dist/visibility/frustum.d.ts +12 -3
  595. package/dist/visibility/frustum.js +12 -3
  596. package/dist/work/jobQueue.d.ts +201 -0
  597. package/dist/work/jobQueue.js +253 -0
  598. package/dist/work/unitTraining.d.ts +58 -0
  599. package/dist/work/unitTraining.js +52 -0
  600. package/dist/world/authoredEntities.d.ts +29 -0
  601. package/dist/world/authoredEntities.js +29 -0
  602. package/dist/world/authoredObjects.d.ts +72 -0
  603. package/dist/world/authoredObjects.js +81 -0
  604. package/dist/world/authoredSpawn.d.ts +39 -0
  605. package/dist/world/authoredSpawn.js +37 -0
  606. package/dist/world/buildSockets.d.ts +152 -0
  607. package/dist/world/buildSockets.js +188 -0
  608. package/dist/world/buildingGenerator.d.ts +18 -0
  609. package/dist/world/buildingGenerator.js +62 -0
  610. package/dist/world/buildings.d.ts +5 -0
  611. package/dist/world/buildings.js +5 -0
  612. package/dist/world/catenary.d.ts +22 -0
  613. package/dist/world/catenary.js +69 -0
  614. package/dist/world/cityBlocks.d.ts +152 -0
  615. package/dist/world/cityBlocks.js +670 -0
  616. package/dist/world/cityContent.d.ts +77 -0
  617. package/dist/world/cityContent.js +261 -0
  618. package/dist/world/cityGeometry.d.ts +114 -0
  619. package/dist/world/cityGeometry.js +573 -0
  620. package/dist/world/cityKind.d.ts +314 -0
  621. package/dist/world/cityKind.js +1578 -0
  622. package/dist/world/features.d.ts +133 -10
  623. package/dist/world/features.js +66 -6
  624. package/dist/world/footprintGrid.d.ts +59 -0
  625. package/dist/world/footprintGrid.js +141 -0
  626. package/dist/world/geometry.d.ts +64 -0
  627. package/dist/world/geometry.js +94 -0
  628. package/dist/world/grassKind.d.ts +51 -0
  629. package/dist/world/grassKind.js +101 -0
  630. package/dist/world/markers.d.ts +50 -4
  631. package/dist/world/markers.js +49 -0
  632. package/dist/world/massing.js +1 -1
  633. package/dist/world/minimapBake.d.ts +78 -0
  634. package/dist/world/minimapBake.js +208 -0
  635. package/dist/world/minimapTrack.d.ts +17 -0
  636. package/dist/world/minimapTrack.js +22 -0
  637. package/dist/world/pathInstances.d.ts +27 -0
  638. package/dist/world/pathInstances.js +27 -0
  639. package/dist/world/pathNetwork.d.ts +159 -0
  640. package/dist/world/pathNetwork.js +684 -0
  641. package/dist/world/pathTerrain.d.ts +80 -0
  642. package/dist/world/pathTerrain.js +142 -0
  643. package/dist/world/place.d.ts +166 -0
  644. package/dist/world/place.js +96 -0
  645. package/dist/world/placeAsset.d.ts +81 -0
  646. package/dist/world/placeAsset.js +79 -0
  647. package/dist/world/placement.d.ts +4 -0
  648. package/dist/world/placement.js +4 -0
  649. package/dist/world/placementController.d.ts +6 -0
  650. package/dist/world/placementController.js +6 -0
  651. package/dist/world/poleLineKind.d.ts +40 -0
  652. package/dist/world/poleLineKind.js +97 -0
  653. package/dist/world/polyline.d.ts +34 -0
  654. package/dist/world/polyline.js +88 -0
  655. package/dist/world/resourceNode.d.ts +109 -0
  656. package/dist/world/resourceNode.js +140 -0
  657. package/dist/world/roads.d.ts +8 -0
  658. package/dist/world/roads.js +38 -0
  659. package/dist/world/scatter.js +2 -20
  660. package/dist/world/scatterRegion.d.ts +164 -0
  661. package/dist/world/scatterRegion.js +409 -0
  662. package/dist/world/sceneShapes.d.ts +43 -0
  663. package/dist/world/sceneShapes.js +1 -0
  664. package/dist/world/segment.d.ts +27 -0
  665. package/dist/world/segment.js +43 -0
  666. package/dist/world/soilKind.d.ts +48 -0
  667. package/dist/world/soilKind.js +92 -0
  668. package/dist/world/spatialSample.d.ts +241 -0
  669. package/dist/world/spatialSample.js +465 -0
  670. package/dist/world/streets.d.ts +29 -0
  671. package/dist/world/streets.js +55 -0
  672. package/dist/world/terraform.d.ts +213 -1
  673. package/dist/world/terraform.js +627 -22
  674. package/dist/world/terrain.d.ts +164 -20
  675. package/dist/world/terrain.js +325 -41
  676. package/dist/world/terrainGuides.d.ts +182 -0
  677. package/dist/world/terrainGuides.js +343 -0
  678. package/dist/world/vec2.d.ts +81 -0
  679. package/dist/world/vec2.js +128 -0
  680. package/dist/world/vec3.d.ts +49 -0
  681. package/dist/world/vec3.js +76 -0
  682. package/dist/world/vegetation.d.ts +71 -0
  683. package/dist/world/vegetation.js +151 -0
  684. package/dist/world/visibilityField.d.ts +154 -0
  685. package/dist/world/visibilityField.js +271 -0
  686. package/dist/world/volumetricClouds.d.ts +52 -0
  687. package/dist/world/volumetricClouds.js +43 -0
  688. package/dist/world/walls.d.ts +9 -0
  689. package/dist/world/walls.js +9 -0
  690. package/dist/world/waterKind.d.ts +55 -0
  691. package/dist/world/waterKind.js +99 -0
  692. package/dist/world.d.ts +141 -0
  693. package/dist/world.js +141 -0
  694. package/package.json +32 -8
  695. package/skills/game-design/SKILL.md +28 -0
  696. package/skills/game-design/agents/openai.yaml +4 -0
  697. package/skills/game-design/references/application-playbook.md +170 -0
  698. package/skills/game-design/references/field-guide.md +288 -0
  699. package/skills/jgengine/SKILL.md +54 -0
  700. package/skills/jgengine/api.md +527 -0
  701. package/skills/jgengine/capabilities.md +131 -0
  702. package/skills/jgengine/recipes/minimal-game.md +88 -0
  703. package/skills/jgengine-combat/SKILL.md +38 -0
  704. package/skills/jgengine-combat/api.md +585 -0
  705. package/skills/jgengine-combat/capabilities.md +213 -0
  706. package/skills/jgengine-combat/recipes/portable-stat-pools.md +122 -0
  707. package/skills/jgengine-combat/reference.md +108 -0
  708. package/skills/jgengine-gameplay/SKILL.md +39 -0
  709. package/skills/jgengine-gameplay/api.md +1920 -0
  710. package/skills/jgengine-gameplay/capabilities.md +454 -0
  711. package/skills/jgengine-gameplay/reference-systems.md +56 -0
  712. package/skills/jgengine-world/SKILL.md +51 -0
  713. package/skills/jgengine-world/api.md +3056 -0
  714. package/skills/jgengine-world/capabilities.md +476 -0
  715. package/skills/jgengine-world/recipes/commanding-entities.md +128 -0
  716. package/skills/jgengine-world/reference.md +261 -0
  717. package/dist/cartridge/runtime.d.ts +0 -15
  718. package/dist/cartridge/runtime.js +0 -556
  719. package/dist/cartridge/spec.d.ts +0 -188
  720. package/dist/cartridge/spec.js +0 -19
  721. package/dist/cartridge/validate.d.ts +0 -2
  722. package/dist/cartridge/validate.js +0 -78
  723. package/dist/store/engineStore.d.ts +0 -22
  724. package/dist/store/engineStore.js +0 -50
  725. package/dist/store/features.d.ts +0 -10
  726. package/dist/store/features.js +0 -23
  727. package/llms.txt +0 -5389
@@ -0,0 +1,82 @@
1
+ import { type GravityField } from "./gravityField.js";
2
+ /** Three-dimensional world-space vector used by the flight model. */
3
+ export type FlightVector = readonly [number, number, number];
4
+ /** Supported aerodynamic/propulsion families. */
5
+ export type AircraftKind = "fixedWing" | "rotorcraft" | "vtol";
6
+ /** Normalized pilot inputs for one flight-simulation tick. */
7
+ export interface FlightControlInput {
8
+ throttle: number;
9
+ pitch: number;
10
+ roll: number;
11
+ yaw: number;
12
+ collective?: number;
13
+ airbrake?: number;
14
+ afterburner?: number;
15
+ vectoring?: number;
16
+ }
17
+ /** Angular authority, response, damping, and self-leveling configuration. */
18
+ export interface FlightControlRates {
19
+ pitch: number;
20
+ roll: number;
21
+ yaw: number;
22
+ response: number;
23
+ damping: number;
24
+ stability: number;
25
+ }
26
+ /** Data-first physical tuning shared by all aircraft instances of one catalog type. */
27
+ export interface AircraftTuning {
28
+ kind: AircraftKind;
29
+ mass: number;
30
+ gravity?: number;
31
+ maxThrust: number;
32
+ maxSpeed: number;
33
+ drag: number;
34
+ sideDrag: number;
35
+ lift: number;
36
+ stallSpeed: number;
37
+ controls: FlightControlRates;
38
+ afterburnerMultiplier?: number;
39
+ hoverThrust?: number;
40
+ rotorResponse?: number;
41
+ groundEffectHeight?: number;
42
+ vtolTransitionSpeed?: number;
43
+ groundClearance?: number;
44
+ }
45
+ /** Spawn state and injectable world-field samplers for an aircraft instance. */
46
+ export interface AircraftOptions {
47
+ position?: FlightVector;
48
+ velocity?: FlightVector;
49
+ rotation?: FlightVector;
50
+ wind?: (position: FlightVector) => FlightVector;
51
+ groundHeight?: (x: number, z: number) => number;
52
+ gravityField?: GravityField;
53
+ }
54
+ /** Pose and aerodynamic telemetry returned after one flight tick. */
55
+ export interface AircraftStep {
56
+ position: FlightVector;
57
+ velocity: FlightVector;
58
+ rotation: FlightVector;
59
+ forwardSpeed: number;
60
+ airspeed: number;
61
+ verticalSpeed: number;
62
+ angleOfAttack: number;
63
+ liftFraction: number;
64
+ stalled: boolean;
65
+ grounded: boolean;
66
+ gForce: number;
67
+ }
68
+ /** Stateful six-degree-of-freedom aircraft simulation. */
69
+ export interface AircraftDynamics {
70
+ tick(dt: number, input: FlightControlInput): AircraftStep;
71
+ pose(): {
72
+ position: FlightVector;
73
+ rotation: FlightVector;
74
+ };
75
+ velocity(): FlightVector;
76
+ resetTo(position: FlightVector, rotation?: FlightVector): void;
77
+ setVelocity(velocity: FlightVector): void;
78
+ }
79
+ /** Six-degree-of-freedom arcade flight model for fixed-wing, helicopter, and VTOL aircraft.
80
+ * @capability flight-dynamics simulate fixed-wing, helicopter, and VTOL aircraft
81
+ */
82
+ export declare function createAircraftDynamics(tuning: AircraftTuning, options?: AircraftOptions): AircraftDynamics;
@@ -0,0 +1,165 @@
1
+ import { uniformGravity } from "./gravityField.js";
2
+ const clamp = (value, min, max) => Math.max(min, Math.min(max, value));
3
+ const length = (v) => Math.hypot(v[0], v[1], v[2]);
4
+ function axes(rotation) {
5
+ const [pitch, yaw, roll] = rotation;
6
+ const sp = Math.sin(pitch);
7
+ const cp = Math.cos(pitch);
8
+ const sy = Math.sin(yaw);
9
+ const cy = Math.cos(yaw);
10
+ const sr = Math.sin(roll);
11
+ const cr = Math.cos(roll);
12
+ const forward = [sy * cp, sp, cy * cp];
13
+ const flatRight = [cy, 0, -sy];
14
+ const flatUp = [-sy * sp, cp, -cy * sp];
15
+ return {
16
+ forward,
17
+ right: [flatRight[0] * cr + flatUp[0] * sr, flatUp[1] * sr, flatRight[2] * cr + flatUp[2] * sr],
18
+ up: [-flatRight[0] * sr + flatUp[0] * cr, flatUp[1] * cr, -flatRight[2] * sr + flatUp[2] * cr],
19
+ };
20
+ }
21
+ function dot(a, b) {
22
+ return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
23
+ }
24
+ function wrapAngle(value) {
25
+ let angle = value;
26
+ while (angle > Math.PI)
27
+ angle -= Math.PI * 2;
28
+ while (angle < -Math.PI)
29
+ angle += Math.PI * 2;
30
+ return angle;
31
+ }
32
+ /** Six-degree-of-freedom arcade flight model for fixed-wing, helicopter, and VTOL aircraft.
33
+ * @capability flight-dynamics simulate fixed-wing, helicopter, and VTOL aircraft
34
+ */
35
+ export function createAircraftDynamics(tuning, options = {}) {
36
+ let position = [...(options.position ?? [0, 0, 0])];
37
+ let velocity = [...(options.velocity ?? [0, 0, 0])];
38
+ let rotation = [...(options.rotation ?? [0, 0, 0])];
39
+ let angular = [0, 0, 0];
40
+ let rotor = 0;
41
+ let lastVerticalSpeed = velocity[1];
42
+ const gravity = Math.abs(tuning.gravity ?? 9.81);
43
+ const gravityField = options.gravityField ?? uniformGravity([0, -gravity, 0]);
44
+ const windAt = options.wind ?? (() => [0, 0, 0]);
45
+ const groundAt = options.groundHeight ?? (() => 0);
46
+ return {
47
+ tick(dt, input) {
48
+ const stepDt = clamp(dt, 0, 0.05);
49
+ const wind = windAt(position);
50
+ const gravityVector = gravityField.sample(position);
51
+ const gravityMagnitude = Math.max(0.001, length(gravityVector));
52
+ const relative = [velocity[0] - wind[0], velocity[1] - wind[1], velocity[2] - wind[2]];
53
+ const airspeed = length(relative);
54
+ const basis = axes(rotation);
55
+ const forwardSpeed = dot(relative, basis.forward);
56
+ const rightSpeed = dot(relative, basis.right);
57
+ const upSpeed = dot(relative, basis.up);
58
+ const angleOfAttack = Math.atan2(-upSpeed, Math.max(0.01, Math.abs(forwardSpeed)));
59
+ const speedAuthority = clamp(airspeed / Math.max(1, tuning.stallSpeed), 0.12, 1);
60
+ const rotorTarget = tuning.kind === "fixedWing" ? 0 : clamp(input.collective ?? input.throttle, 0, 1);
61
+ const rotorResponse = Math.max(0.01, tuning.rotorResponse ?? 3.5);
62
+ rotor += (rotorTarget - rotor) * (1 - Math.exp(-rotorResponse * stepDt));
63
+ const vectoring = tuning.kind === "vtol" ? clamp(input.vectoring ?? 1, 0, 1) : tuning.kind === "rotorcraft" ? 1 : 0;
64
+ const transition = tuning.kind === "vtol"
65
+ ? clamp(Math.max(vectoring, 1 - airspeed / Math.max(1, tuning.vtolTransitionSpeed ?? 32)), 0, 1)
66
+ : vectoring;
67
+ const controlAuthority = transition + (1 - transition) * speedAuthority;
68
+ const rates = tuning.controls;
69
+ const targets = [
70
+ clamp(input.pitch, -1, 1) * rates.pitch * controlAuthority,
71
+ clamp(input.yaw, -1, 1) * rates.yaw * controlAuthority,
72
+ clamp(input.roll, -1, 1) * rates.roll * controlAuthority,
73
+ ];
74
+ const response = 1 - Math.exp(-Math.max(0, rates.response) * stepDt);
75
+ angular[0] += (targets[0] - angular[0]) * response;
76
+ angular[1] += (targets[1] - angular[1]) * response;
77
+ angular[2] += (targets[2] - angular[2]) * response;
78
+ const damping = Math.max(0, 1 - rates.damping * stepDt);
79
+ angular[0] *= damping;
80
+ angular[1] *= damping;
81
+ angular[2] *= damping;
82
+ const stability = clamp(rates.stability * stepDt, 0, 1);
83
+ if (Math.abs(input.pitch) < 0.05)
84
+ angular[0] += -rotation[0] * stability;
85
+ if (Math.abs(input.roll) < 0.05)
86
+ angular[2] += -rotation[2] * stability;
87
+ rotation[0] = clamp(rotation[0] + angular[0] * stepDt, -Math.PI * 0.49, Math.PI * 0.49);
88
+ rotation[1] = wrapAngle(rotation[1] + angular[1] * stepDt);
89
+ rotation[2] = wrapAngle(rotation[2] + angular[2] * stepDt);
90
+ const updated = axes(rotation);
91
+ const throttle = clamp(input.throttle, 0, 1);
92
+ const afterburner = 1 + clamp(input.afterburner ?? 0, 0, 1) * ((tuning.afterburnerMultiplier ?? 1) - 1);
93
+ const thrustAccel = tuning.maxThrust * throttle * afterburner / Math.max(0.01, tuning.mass);
94
+ const hoverAccel = (tuning.hoverThrust ?? gravity * tuning.mass * 1.08) * rotor / Math.max(0.01, tuning.mass);
95
+ const ground = groundAt(position[0], position[2]);
96
+ const clearance = Math.max(0, position[1] - ground);
97
+ const groundEffectHeight = Math.max(0.1, tuning.groundEffectHeight ?? 8);
98
+ const groundEffect = transition > 0 ? 1 + clamp(1 - clearance / groundEffectHeight, 0, 1) * 0.18 : 1;
99
+ const liftFraction = clamp((Math.abs(forwardSpeed) / Math.max(0.1, tuning.stallSpeed)) ** 2, 0, 1.35);
100
+ const stallAngle = Math.PI * 0.22;
101
+ const aoaEfficiency = clamp(1 - Math.max(0, Math.abs(angleOfAttack) - stallAngle) / (Math.PI * 0.3), 0.08, 1);
102
+ const wingLift = tuning.lift * liftFraction * aoaEfficiency * (1 - transition);
103
+ const rotorLift = hoverAccel * groundEffect * transition;
104
+ const forwardThrust = thrustAccel * (1 - transition * 0.82);
105
+ const cyclicForward = transition * hoverAccel * Math.sin(rotation[0]) * 0.75;
106
+ const cyclicSide = -transition * hoverAccel * Math.sin(rotation[2]) * 0.75;
107
+ const dragScale = tuning.drag * (1 + clamp(input.airbrake ?? 0, 0, 1) * 4);
108
+ const speedRatio = airspeed / Math.max(1, tuning.maxSpeed);
109
+ const dragAccel = dragScale * airspeed * (1 + speedRatio * speedRatio);
110
+ const invAir = airspeed > 0.001 ? 1 / airspeed : 0;
111
+ velocity[0] += (updated.forward[0] * (forwardThrust + cyclicForward) + updated.right[0] * cyclicSide + updated.up[0] * wingLift - relative[0] * invAir * dragAccel - updated.right[0] * rightSpeed * tuning.sideDrag + updated.up[0] * rotorLift + gravityVector[0]) * stepDt;
112
+ velocity[1] += (updated.forward[1] * (forwardThrust + cyclicForward) + updated.right[1] * cyclicSide + updated.up[1] * wingLift - relative[1] * invAir * dragAccel - updated.right[1] * rightSpeed * tuning.sideDrag + updated.up[1] * rotorLift + gravityVector[1]) * stepDt;
113
+ velocity[2] += (updated.forward[2] * (forwardThrust + cyclicForward) + updated.right[2] * cyclicSide + updated.up[2] * wingLift - relative[2] * invAir * dragAccel - updated.right[2] * rightSpeed * tuning.sideDrag + updated.up[2] * rotorLift + gravityVector[2]) * stepDt;
114
+ const newSpeed = length(velocity);
115
+ if (newSpeed > tuning.maxSpeed * afterburner && newSpeed > 0) {
116
+ const scale = tuning.maxSpeed * afterburner / newSpeed;
117
+ velocity[0] *= scale;
118
+ velocity[1] *= scale;
119
+ velocity[2] *= scale;
120
+ }
121
+ position[0] += velocity[0] * stepDt;
122
+ position[1] += velocity[1] * stepDt;
123
+ position[2] += velocity[2] * stepDt;
124
+ const floor = ground + (tuning.groundClearance ?? 0.6);
125
+ let grounded = false;
126
+ if (position[1] < floor) {
127
+ position[1] = floor;
128
+ if (velocity[1] < 0)
129
+ velocity[1] *= -0.08;
130
+ velocity[0] *= 0.985;
131
+ velocity[2] *= 0.985;
132
+ grounded = true;
133
+ }
134
+ const verticalAcceleration = stepDt > 0 ? (velocity[1] - lastVerticalSpeed) / stepDt : 0;
135
+ lastVerticalSpeed = velocity[1];
136
+ return {
137
+ position: [...position],
138
+ velocity: [...velocity],
139
+ rotation: [...rotation],
140
+ forwardSpeed,
141
+ airspeed,
142
+ verticalSpeed: velocity[1],
143
+ angleOfAttack,
144
+ liftFraction,
145
+ stalled: transition < 0.5 && (Math.abs(forwardSpeed) < tuning.stallSpeed || aoaEfficiency < 0.35),
146
+ grounded,
147
+ gForce: (verticalAcceleration - gravityVector[1]) / gravityMagnitude,
148
+ };
149
+ },
150
+ pose: () => ({ position: [...position], rotation: [...rotation] }),
151
+ velocity: () => [...velocity],
152
+ resetTo(nextPosition, nextRotation = [0, 0, 0]) {
153
+ position = [...nextPosition];
154
+ velocity = [0, 0, 0];
155
+ rotation = [...nextRotation];
156
+ angular = [0, 0, 0];
157
+ rotor = 0;
158
+ lastVerticalSpeed = 0;
159
+ },
160
+ setVelocity(nextVelocity) {
161
+ velocity = [...nextVelocity];
162
+ lastVerticalSpeed = velocity[1];
163
+ },
164
+ };
165
+ }
@@ -0,0 +1,25 @@
1
+ /** Three-dimensional acceleration vector sampled from a gravity field. */
2
+ export type GravityVector = readonly [number, number, number];
3
+ /** Position-dependent gravity source used by movement and vehicle simulations. */
4
+ export interface GravityField {
5
+ sample(position: GravityVector): GravityVector;
6
+ }
7
+ /** Center, strength, and falloff for radial gravity. */
8
+ export interface PointGravityOptions {
9
+ center: GravityVector;
10
+ strength: number;
11
+ falloff?: "constant" | "inverseSquare";
12
+ minRadius?: number;
13
+ }
14
+ /** Constant vector gravity for ordinary worlds, space stations, and sideways-gravity levels.
15
+ * @capability gravity-field sample configurable uniform, radial, or combined gravity
16
+ */
17
+ export declare function uniformGravity(vector?: GravityVector): GravityField;
18
+ /** Radial gravity toward one center, with optional inverse-square falloff for planetary worlds.
19
+ * @capability gravity-field sample configurable uniform, radial, or combined gravity
20
+ */
21
+ export declare function pointGravity(options: PointGravityOptions): GravityField;
22
+ /** Adds several gravity sources into one field.
23
+ * @capability gravity-field sample configurable uniform, radial, or combined gravity
24
+ */
25
+ export declare function combineGravity(fields: readonly GravityField[]): GravityField;
@@ -0,0 +1,41 @@
1
+ /** Constant vector gravity for ordinary worlds, space stations, and sideways-gravity levels.
2
+ * @capability gravity-field sample configurable uniform, radial, or combined gravity
3
+ */
4
+ export function uniformGravity(vector = [0, -9.81, 0]) {
5
+ return { sample: () => vector };
6
+ }
7
+ /** Radial gravity toward one center, with optional inverse-square falloff for planetary worlds.
8
+ * @capability gravity-field sample configurable uniform, radial, or combined gravity
9
+ */
10
+ export function pointGravity(options) {
11
+ const minRadius = Math.max(0.001, options.minRadius ?? 1);
12
+ return {
13
+ sample(position) {
14
+ const dx = options.center[0] - position[0];
15
+ const dy = options.center[1] - position[1];
16
+ const dz = options.center[2] - position[2];
17
+ const distance = Math.max(minRadius, Math.hypot(dx, dy, dz));
18
+ const scale = options.falloff === "inverseSquare" ? options.strength / (distance * distance) : options.strength;
19
+ return [dx / distance * scale, dy / distance * scale, dz / distance * scale];
20
+ },
21
+ };
22
+ }
23
+ /** Adds several gravity sources into one field.
24
+ * @capability gravity-field sample configurable uniform, radial, or combined gravity
25
+ */
26
+ export function combineGravity(fields) {
27
+ return {
28
+ sample(position) {
29
+ let x = 0;
30
+ let y = 0;
31
+ let z = 0;
32
+ for (const field of fields) {
33
+ const vector = field.sample(position);
34
+ x += vector[0];
35
+ y += vector[1];
36
+ z += vector[2];
37
+ }
38
+ return [x, y, z];
39
+ },
40
+ };
41
+ }
@@ -12,6 +12,77 @@ export interface KinematicVehicleTuning {
12
12
  handbrakeGrip: number;
13
13
  /** Forward-speed decay per second when coasting (sleds, boats); default `0`. */
14
14
  rollingResistance?: number;
15
+ /** Optional higher-fidelity powertrain. Omit to preserve the direct arcade acceleration model. */
16
+ powertrain?: KinematicPowertrainTuning;
17
+ /** Optional bicycle-model steering with speed-sensitive lock and smoothed rack response. */
18
+ steering?: KinematicSteeringTuning;
19
+ /** Optional aerodynamic drag/downforce and electronic driver assists. */
20
+ dynamics?: KinematicDynamicsTuning;
21
+ /**
22
+ * Optional mass-and-force chassis layer (#1051). When present it supersedes `engineAccel`/`brakeAccel`
23
+ * with force/mass dynamics — a tire friction budget, lateral weight transfer, and engine braking — so
24
+ * vehicles of different mass, drive/brake force, and center-of-gravity drive measurably differently.
25
+ * Omit to preserve the direct arcade acceleration model exactly.
26
+ */
27
+ chassis?: KinematicChassisTuning;
28
+ }
29
+ /**
30
+ * Mass-and-force chassis layer (#1051); when present it supersedes `engineAccel`/`brakeAccel` with
31
+ * force/mass dynamics. Drive/brake become forces divided by `massKg`, a per-tick tire friction budget
32
+ * (`tireGrip` * grip curve * surface * downforce * m * g) is split lateral-first then longitudinal so
33
+ * hard slides and launches saturate, and `comHeight`/`trackWidth` set weight-transfer washout and body
34
+ * lean. Coasting decelerates from physical road load, not a per-vehicle constant: rolling resistance
35
+ * `μ_rr · m · g` always, plus engine braking `ENGINE_BRAKE_FRACTION · engineForce` routed through the
36
+ * current gear (so it strengthens as the car downshifts) whenever the throttle is lifted and a
37
+ * `powertrain` is configured. All fields are required; omit the whole block for the legacy model.
38
+ */
39
+ export interface KinematicChassisTuning {
40
+ /** Total vehicle mass, kg (1200 compact … 11000 bus); divides every drive/brake force into accel. */
41
+ massKg: number;
42
+ /** Peak drive force at the wheels, N — scaled by the powertrain torque curve and throttle. Also sets engine-braking magnitude. */
43
+ engineForce: number;
44
+ /** Peak service-brake force, N; still modulated by the existing ABS logic. */
45
+ brakeForce: number;
46
+ /** Peak tire friction coefficient μ on an ideal surface (~0.9 street, 1.1 sport, 0.7 bus). */
47
+ tireGrip: number;
48
+ /** Center-of-mass height, m (0.45 sports car … 1.4 bus); drives weight transfer and body lean. */
49
+ comHeight: number;
50
+ /** Lateral wheel spacing (track width), m; larger resists lateral weight transfer. */
51
+ trackWidth: number;
52
+ }
53
+ /** Data-first gearbox and torque-curve tuning for a kinematic ground vehicle. */
54
+ export interface KinematicPowertrainTuning {
55
+ idleRpm: number;
56
+ redlineRpm: number;
57
+ shiftUpRpm: number;
58
+ shiftDownRpm: number;
59
+ shiftSeconds: number;
60
+ finalDrive: number;
61
+ wheelRadius: number;
62
+ gears: readonly number[];
63
+ torqueCurve: GripCurve;
64
+ }
65
+ /** Bicycle-model steering settings; all angles are radians. */
66
+ export interface KinematicSteeringTuning {
67
+ wheelbase: number;
68
+ maxAngle: number;
69
+ highSpeedAngle: number;
70
+ highSpeedAt: number;
71
+ response: number;
72
+ yawDamping?: number;
73
+ }
74
+ /** Aerodynamic and electronic-assist settings layered over tire grip. */
75
+ export interface KinematicDynamicsTuning {
76
+ aerodynamicDrag?: number;
77
+ downforce?: number;
78
+ tractionControl?: number;
79
+ abs?: number;
80
+ stabilityControl?: number;
81
+ bodyPitchFactor?: number;
82
+ bodyRollFactor?: number;
83
+ maxBodyPitch?: number;
84
+ maxBodyRoll?: number;
85
+ attitudeResponse?: number;
15
86
  }
16
87
  export interface KinematicVehicleOptions {
17
88
  position?: readonly [number, number, number];
@@ -20,6 +91,26 @@ export interface KinematicVehicleOptions {
20
91
  surfaceFriction?: (x: number, z: number) => number;
21
92
  /** Extra velocity damping per second by world position (rough ground drag); default `0`. */
22
93
  dragAt?: (x: number, z: number) => number;
94
+ /**
95
+ * Veto or clamp a planar move before it commits — walls, closed gates, arena bounds. Given the
96
+ * attempted `from`→`to` on the XZ plane, return the destination actually allowed; velocity is
97
+ * rederived from the permitted displacement, so motion blocked on an axis stops on that axis
98
+ * instead of grinding into the obstacle. Default: no clamp (the move always commits).
99
+ */
100
+ clampMove?: (from: readonly [number, number], to: readonly [number, number]) => readonly [number, number];
101
+ }
102
+ /**
103
+ * Per-tick multipliers layered over the base tuning — the transient overrides games apply for one
104
+ * frame without rebuilding the vehicle: nitro/boost, a braced-plow bonus, or entering a speed zone or
105
+ * slow field. Each defaults to `1` (no change), so passing nothing leaves the base tuning untouched.
106
+ */
107
+ export interface KinematicVehicleModifiers {
108
+ /** Scale top speed this tick (sustained boost, speed pads). */
109
+ topSpeedScale?: number;
110
+ /** Scale engine acceleration this tick (boost, brace bonus). */
111
+ accelScale?: number;
112
+ /** Scale turn rate this tick (brace penalty, heavy-load steering). */
113
+ turnRateScale?: number;
23
114
  }
24
115
  export interface KinematicVehicleStep {
25
116
  position: readonly [number, number, number];
@@ -31,6 +122,22 @@ export interface KinematicVehicleStep {
31
122
  slip: number;
32
123
  /** The `surfaceFriction` sample used this tick (`< 1` = off the ideal surface). */
33
124
  surface: number;
125
+ /** One-based forward gear, or `0` while reversing/neutral. */
126
+ gear: number;
127
+ rpm: number;
128
+ steerAngle: number;
129
+ yawRate: number;
130
+ longitudinalAcceleration: number;
131
+ tractionLimited: boolean;
132
+ absActive: boolean;
133
+ /**
134
+ * Demanded drive force exceeded the tire friction budget left after cornering this tick — a
135
+ * traction-limited launch (#1051). Always `false` without a `chassis` block; distinct from
136
+ * `tractionLimited`, which stays owned by the traction-control assist.
137
+ */
138
+ wheelspin: boolean;
139
+ bodyPitch: number;
140
+ bodyRoll: number;
34
141
  }
35
142
  /**
36
143
  * The pure-kinematic arcade car every racing game hand-rolled (#282.1): steer-yaw scaled by speed,
@@ -39,7 +146,7 @@ export interface KinematicVehicleStep {
39
146
  * (drift meters, boost, off-track rules) via `surfaceFriction`/`dragAt` hooks and the returned slip.
40
147
  */
41
148
  export interface KinematicVehicle {
42
- tick(dt: number, axis: AxisInput): KinematicVehicleStep;
149
+ tick(dt: number, axis: AxisInput, modifiers?: KinematicVehicleModifiers): KinematicVehicleStep;
43
150
  pose(): {
44
151
  position: readonly [number, number, number];
45
152
  heading: number;