@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,454 @@
1
+ <!-- GENERATED by scripts/gen-capability-index.ts — do not edit. Regenerate: bun run gen:capabilities -->
2
+
3
+ # jgengine-gameplay — capability index
4
+
5
+ Reach for these before hand-rolling. Each row is *the thing you need* → *the primitive that already does it*.
6
+
7
+ ## advance-ledger — settle due scheduled transactions through a policy pipeline
8
+
9
+ - `advanceLedger` (function) · `import { advanceLedger } from "@jgengine/core/gameplay"`
10
+
11
+ ## auction-book — timed bid auctions with escrowed bids, buyout, anti-snipe close extension, and collection-box settlement
12
+
13
+ - `createAuctionBook` (function) · `import { createAuctionBook } from "@jgengine/core/gameplay"`
14
+
15
+ ## best-record — persist personal-best times/scores with safe storage fallback
16
+
17
+ - `createRecordBook` (function) · `import { createRecordBook } from "@jgengine/core/gameplay"`
18
+
19
+ ## build — a serializable directed/undirected pair key that resists delimiter collisions
20
+
21
+ - `createPairKeyCodec` (function) · `import { createPairKeyCodec } from "@jgengine/core/gameplay"`
22
+
23
+ ## cancel-scheduled-rule — remove a scheduled rule and its cursor entirely
24
+
25
+ - `cancelRule` (function) · `import { cancelRule } from "@jgengine/core/gameplay"`
26
+
27
+ ## cancel-work — remove a job and compute its refund from reservation and progress
28
+
29
+ - `cancelJob` (function) · `import { cancelJob } from "@jgengine/core/gameplay"`
30
+
31
+ ## carry-encumbrance — carried mass vs capacity into movement penalty tiers and a speed multiplier
32
+
33
+ - `resolveEncumbrance` (function) · `import { resolveEncumbrance } from "@jgengine/core/inventory/encumbrance"`
34
+
35
+ ## carry-load — sum carried mass from item stacks via an injected mass resolver
36
+
37
+ - `totalLoad` (function) · `import { totalLoad } from "@jgengine/core/inventory/encumbrance"`
38
+
39
+ ## compose-game-loop — fold composable systems into the game loop without a manual tick fan-out
40
+
41
+ - `composeGameLoop` (function) · `import { composeGameLoop } from "@jgengine/core/gameplay"`
42
+
43
+ ## consumables — use/consume items with cooldowns and effects
44
+
45
+ - `createItemUse` (function) · `import { createItemUse } from "@jgengine/core/gameplay"`
46
+
47
+ ## cosmetics — equip cosmetic skins and customizations by slot
48
+
49
+ - `createCosmetics` (function) · `import { createCosmetics } from "@jgengine/core/gameplay"`
50
+
51
+ ## creature-breeding — deterministic stat inheritance, mutation, and lineage genetics for taming games
52
+
53
+ - `breedOffspring` (function) · `import { breedOffspring } from "@jgengine/core/game/breeding"`
54
+
55
+ ## decay-meter — survival meters that drain/refill over game time (hunger, water, oxygen, stamina)
56
+
57
+ - `createDecayMeterSet` (function) · `import { createDecayMeterSet } from "@jgengine/core/gameplay"`
58
+ - `decayMeterMoodles` (function) · `import { decayMeterMoodles } from "@jgengine/core/gameplay"`
59
+ - `decayMeterSnapshot` (function) · `import { decayMeterSnapshot } from "@jgengine/core/gameplay"`
60
+ - `decayMeterState` (function) · `import { decayMeterState } from "@jgengine/core/gameplay"`
61
+ - `decayMeters` (function) · `import { decayMeters } from "@jgengine/core/gameplay"`
62
+ - `initDecayMeters` (function) · `import { initDecayMeters } from "@jgengine/core/gameplay"`
63
+ - `refillMeter` (function) · `import { refillMeter } from "@jgengine/core/gameplay"`
64
+
65
+ ## declarative-predicate — serializable data-driven conditions with no callbacks in saved content
66
+
67
+ - `evaluatePredicate` (function) · `import { evaluatePredicate } from "@jgengine/core/gameplay"`
68
+ - `readPath` (function) · `import { readPath } from "@jgengine/core/gameplay"`
69
+
70
+ ## define-system — composable game behavior — pure data + hooks the engine schedules; pass via `defineGame({ systems })`
71
+
72
+ - `defineSystem` (function) · `import { defineSystem } from "@jgengine/core/gameplay"`
73
+
74
+ ## detect — fire-once threshold/milestone/tier crossings when a value moves
75
+
76
+ - `crossThresholds` (function) · `import { crossThresholds } from "@jgengine/core/gameplay"`
77
+
78
+ ## dialogue-bridge — open/close the talkable→DialogueBox flow with no per-game store or command glue
79
+
80
+ - `createGameDialogue` (function) · `import { createGameDialogue } from "@jgengine/core/gameplay"`
81
+
82
+ ## durability — track item wear, breakage, and repair
83
+
84
+ - `applyWear` (function) · `import { applyWear } from "@jgengine/core/gameplay"`
85
+
86
+ ## encumbrance-move-curve — progressive move-speed multiplier from a carry-load fraction
87
+
88
+ - `encumbranceMoveMultiplier` (function) · `import { encumbranceMoveMultiplier } from "@jgengine/core/inventory/encumbrance"`
89
+
90
+ ## enqueue-work — reserve inputs and add a timed job, honoring capacity and validation policy
91
+
92
+ - `enqueue` (function) · `import { enqueue } from "@jgengine/core/gameplay"`
93
+
94
+ ## event-bus — typed publish/subscribe bus for gameplay events
95
+
96
+ - `createGameEvents` (function) · `import { createGameEvents } from "@jgengine/core/gameplay"`
97
+
98
+ ## event-feed — a rolling feed of recent gameplay events for a HUD ticker or killfeed
99
+
100
+ - `createGameFeed` (function) · `import { createGameFeed } from "@jgengine/core/gameplay"`
101
+
102
+ ## game-save — save/load game state with a pluggable backend, autosave, slots, and migration
103
+
104
+ - `createSaveStore` (function) · `import { createSaveStore } from "@jgengine/core/gameplay"`
105
+
106
+ ## game-system — declare a composable capability with its own schedule and lifecycle
107
+
108
+ - `SystemDefinition` (interface) · `import { SystemDefinition } from "@jgengine/core/gameplay"`
109
+
110
+ ## imprint-bonus — apply imprint stat and handler bonuses at an imprint fraction
111
+
112
+ - `applyImprintBonus` (function) · `import { applyImprintBonus } from "@jgengine/core/game/breeding"`
113
+
114
+ ## imprint-increment — per-care-request imprint gain across a maturation schedule
115
+
116
+ - `imprintIncrementPerRequest` (function) · `import { imprintIncrementPerRequest } from "@jgengine/core/game/breeding"`
117
+
118
+ ## incubation-tick — advance egg incubation health inside/outside its temperature range
119
+
120
+ - `tickIncubation` (function) · `import { tickIncubation } from "@jgengine/core/game/breeding"`
121
+
122
+ ## incubation-viability — test whether an egg incubation still has health to hatch
123
+
124
+ - `incubationViable` (function) · `import { incubationViable } from "@jgengine/core/game/breeding"`
125
+
126
+ ## item-generation — compose constraints, weighted pools, transforms, and provenance into a deterministic generated item
127
+
128
+ - `generate` (function) · `import { generate } from "@jgengine/core/gameplay"`
129
+
130
+ ## item-identity — resolve which match/set bonuses an item qualifies for
131
+
132
+ - `activeSetBonuses` (function) · `import { activeSetBonuses } from "@jgengine/core/gameplay"`
133
+ - `applySetBonuses` (function) · `import { applySetBonuses } from "@jgengine/core/gameplay"`
134
+ - `candidateViolatesForbid` (function) · `import { candidateViolatesForbid } from "@jgengine/core/gameplay"`
135
+ - `captureProvenance` (function) · `import { captureProvenance } from "@jgengine/core/gameplay"`
136
+ - `countSetMembers` (function) · `import { countSetMembers } from "@jgengine/core/gameplay"`
137
+ - `identityOf` (function) · `import { identityOf } from "@jgengine/core/gameplay"`
138
+ - `isIdentityValid` (function) · `import { isIdentityValid } from "@jgengine/core/gameplay"`
139
+ - `matchesQuery` (function) · `import { matchesQuery } from "@jgengine/core/gameplay"`
140
+ - `validateIdentity` (function) · `import { validateIdentity } from "@jgengine/core/gameplay"`
141
+
142
+ ## item-instance-registry — a runtime store for procedurally generated item instances
143
+
144
+ - `createItemInstanceRegistry` (function) · `import { createItemInstanceRegistry } from "@jgengine/core/gameplay"`
145
+ - `proceduralLootEntry` (function) · `import { proceduralLootEntry } from "@jgengine/core/gameplay"`
146
+
147
+ ## item-use-composition — compose pluggable, ordered item use-behaviors from serializable references
148
+
149
+ - `createUseBehaviorRegistry` (function) · `import { createUseBehaviorRegistry } from "@jgengine/core/gameplay"`
150
+
151
+ ## lap-splits — per-lap durations from a cumulative split book
152
+
153
+ - `lapDurations` (function) · `import { lapDurations } from "@jgengine/core/gameplay"`
154
+ - `parDelta` (function) · `import { parDelta } from "@jgengine/core/gameplay"`
155
+ - `splitSegments` (function) · `import { splitSegments } from "@jgengine/core/gameplay"`
156
+
157
+ ## lap-timer — wall-clock current/last/best lap timing with splits
158
+
159
+ - `createLapTimer` (function) · `import { createLapTimer } from "@jgengine/core/gameplay"`
160
+
161
+ ## leaderboard — ranked score tracking across global, server, and per-profile scopes
162
+
163
+ - `createLeaderboard` (function) · `import { createLeaderboard } from "@jgengine/core/gameplay"`
164
+
165
+ ## leveling-track — grant XP, resolve level-ups against a curve, and write level+xp stats back through a stat adapter
166
+
167
+ - `leveling` (function) · `import { leveling } from "@jgengine/core/gameplay"`
168
+
169
+ ## lifecycle — declarative start/restart run flow — the engine owns the command glue and phase sync, the game supplies pure state transitions
170
+
171
+ - `LifecycleConfig` (interface) · `import { LifecycleConfig } from "@jgengine/core/gameplay"`
172
+
173
+ ## limb-health — per-body-part/region health tracked separately
174
+
175
+ - `createMultiRegionHealth` (function) · `import { createMultiRegionHealth } from "@jgengine/core/gameplay"`
176
+
177
+ ## listing-book — player-driven marketplace listings with a house cut, expiry sweep, and seller collection box
178
+
179
+ - `createListingBook` (function) · `import { createListingBook } from "@jgengine/core/gameplay"`
180
+
181
+ ## loadouts — save and swap named equipment loadouts
182
+
183
+ - `createLoadouts` (function) · `import { createLoadouts } from "@jgengine/core/gameplay"`
184
+
185
+ ## local-save — persist a game to on-device localStorage (offline)
186
+
187
+ - `localSaveBackend` (function) · `import { localSaveBackend } from "@jgengine/core/gameplay"`
188
+
189
+ ## loot-filter — filter and highlight drops by rarity/name rules
190
+
191
+ - `evaluateLootFilter` (function) · `import { evaluateLootFilter } from "@jgengine/core/gameplay"`
192
+
193
+ ## loot-pipeline — compose ordered loot pools with fallbacks, roll modifiers, and provenance
194
+
195
+ - `createLootPipeline` (function) · `import { createLootPipeline } from "@jgengine/core/gameplay"`
196
+ - `defineLootPipeline` (function) · `import { defineLootPipeline } from "@jgengine/core/gameplay"`
197
+
198
+ ## loot-table — register loot tables and roll weighted randomized drops
199
+
200
+ - `createLootRegistry` (function) · `import { createLootRegistry } from "@jgengine/core/gameplay"`
201
+ - `lootTable` (function) · `import { lootTable } from "@jgengine/core/gameplay"`
202
+
203
+ ## maturation-stage — resolve the baby/juvenile/adolescent/adult stage from elapsed maturation
204
+
205
+ - `maturationStage` (function) · `import { maturationStage } from "@jgengine/core/game/breeding"`
206
+
207
+ ## modular-item — attach parts into item mount slots to compute combined stats
208
+
209
+ - `slotAccepts` (function) · `import { slotAccepts } from "@jgengine/core/gameplay"`
210
+
211
+ ## move — a keyed value toward a target by a bounded step
212
+
213
+ - `towardValue` (function) · `import { towardValue } from "@jgengine/core/gameplay"`
214
+
215
+ ## name-generator — generate procedural names from templates and word banks
216
+
217
+ - `createNameGenerator` (function) · `import { createNameGenerator } from "@jgengine/core/gameplay"`
218
+
219
+ ## notice-feed — serializable tone-tagged notice/event feed bounded by count and age (toasts, life events, killfeed)
220
+
221
+ - `appendFeed` (function) · `import { appendFeed } from "@jgengine/core/gameplay"`
222
+ - `pruneFeed` (function) · `import { pruneFeed } from "@jgengine/core/gameplay"`
223
+
224
+ ## objectives — check progress of a threshold objective against a live metric
225
+
226
+ - `evaluateObjective` (function) · `import { evaluateObjective } from "@jgengine/core/gameplay"`
227
+
228
+ ## param-layers — register parameter layers by stable id and resolve serialized selections
229
+
230
+ - `createLayerRegistry` (function) · `import { createLayerRegistry } from "@jgengine/core/gameplay"`
231
+ - `diffParams` (function) · `import { diffParams } from "@jgengine/core/gameplay"`
232
+ - `orderLayers` (function) · `import { orderLayers } from "@jgengine/core/gameplay"`
233
+ - `resolveParams` (function) · `import { resolveParams } from "@jgengine/core/gameplay"`
234
+ - `resolveSelection` (function) · `import { resolveSelection } from "@jgengine/core/gameplay"`
235
+ - `validateLayers` (function) · `import { validateLayers } from "@jgengine/core/gameplay"`
236
+
237
+ ## pause-scheduled-rule — stop a scheduled rule from firing while retaining its cursor
238
+
239
+ - `pauseRule` (function) · `import { pauseRule } from "@jgengine/core/gameplay"`
240
+
241
+ ## pause-work — pause a queued or active job in place, retaining its progress
242
+
243
+ - `pauseJob` (function) · `import { pauseJob } from "@jgengine/core/gameplay"`
244
+
245
+ ## ping-wheel — contextual ping/marker communication between teammates
246
+
247
+ - `createPingSystem` (function) · `import { createPingSystem } from "@jgengine/core/gameplay"`
248
+
249
+ ## policy-annotate — tag a scheduled transaction's provenance without changing its value
250
+
251
+ - `annotate` (function) · `import { annotate } from "@jgengine/core/gameplay"`
252
+
253
+ ## policy-cap — cap a scheduled transaction amount by context
254
+
255
+ - `capAmount` (function) · `import { capAmount } from "@jgengine/core/gameplay"`
256
+
257
+ ## policy-curve — scale a transaction by a curve over context
258
+
259
+ - `curveScale` (function) · `import { curveScale } from "@jgengine/core/gameplay"`
260
+
261
+ ## policy-redirect — redirect a scheduled transaction's source or recipient
262
+
263
+ - `redirect` (function) · `import { redirect } from "@jgengine/core/gameplay"`
264
+
265
+ ## policy-reject — reject scheduled transactions by predicate
266
+
267
+ - `rejectWhen` (function) · `import { rejectWhen } from "@jgengine/core/gameplay"`
268
+
269
+ ## policy-tax — split off a fraction of a transaction as tax or transfer
270
+
271
+ - `taxFraction` (function) · `import { taxFraction } from "@jgengine/core/gameplay"`
272
+
273
+ ## policy-threshold — scale a transaction by a context threshold band
274
+
275
+ - `thresholdScale` (function) · `import { thresholdScale } from "@jgengine/core/gameplay"`
276
+
277
+ ## price-history — rolling per-item sale records aggregated into market price stats
278
+
279
+ - `createPriceHistory` (function) · `import { createPriceHistory } from "@jgengine/core/gameplay"`
280
+
281
+ ## production-building — a factory building converting inputs to outputs over time
282
+
283
+ - `createProductionState` (function) · `import { createProductionState } from "@jgengine/core/gameplay"`
284
+
285
+ ## progression-curve — evaluate a level/rank curve (const, linear, power, geometric, steps, piecewise) at a point
286
+
287
+ - `evalCurve` (function) · `import { evalCurve } from "@jgengine/core/gameplay"`
288
+
289
+ ## quest-log — track accepted quests and their per-objective progress
290
+
291
+ - `createQuestJournal` (function) · `import { createQuestJournal } from "@jgengine/core/gameplay"`
292
+
293
+ ## race-placements — look up one racer's place + win/lose within a finish order
294
+
295
+ - `placementOf` (function) · `import { placementOf } from "@jgengine/core/gameplay"`
296
+ - `racePlacements` (function) · `import { racePlacements } from "@jgengine/core/gameplay"`
297
+
298
+ ## race-session — pure idle→countdown→racing→finished clock every racer wraps around its state
299
+
300
+ - `idleRaceSession` (function) · `import { idleRaceSession } from "@jgengine/core/gameplay"`
301
+
302
+ ## race-track — a checkpoint race with laps, standings, splits, and win conditions
303
+
304
+ - `createRaceState` (function) · `import { createRaceState } from "@jgengine/core/gameplay"`
305
+
306
+ ## resolve — the current tier/band label for a keyed or scalar value
307
+
308
+ - `tierAt` (function) · `import { tierAt } from "@jgengine/core/gameplay"`
309
+
310
+ ## resource-ledger — schedule recurring resource transactions with policy transforms
311
+
312
+ - `createResourceLedger` (function) · `import { createResourceLedger } from "@jgengine/core/gameplay"`
313
+
314
+ ## resume-scheduled-rule — resume a paused scheduled rule, deferring missed cycles to its catch-up policy
315
+
316
+ - `resumeRule` (function) · `import { resumeRule } from "@jgengine/core/gameplay"`
317
+
318
+ ## resume-work — resume a paused job back into the queue's slot competition
319
+
320
+ - `resumeJob` (function) · `import { resumeJob } from "@jgengine/core/gameplay"`
321
+
322
+ ## retained-vfx — create/update/stop long-lived dynamic visual effects (beam, tether, zone, target line) by stable id
323
+
324
+ - `createVfxInstanceStore` (function) · `import { createVfxInstanceStore } from "@jgengine/core/gameplay"`
325
+
326
+ ## rule-selection — register rules and bridge a selection to its contributed parameter layers
327
+
328
+ - `createRuleRegistry` (function) · `import { createRuleRegistry } from "@jgengine/core/gameplay"`
329
+ - `rerollRules` (function) · `import { rerollRules } from "@jgengine/core/gameplay"`
330
+ - `selectRules` (function) · `import { selectRules } from "@jgengine/core/gameplay"`
331
+
332
+ ## run-modifiers — a roguelike run built from stacking drafted modifier picks
333
+
334
+ - `createRunDraft` (function) · `import { createRunDraft } from "@jgengine/core/gameplay"`
335
+
336
+ ## seeded-random — injected deterministic randomness for game logic — never `Math.random` in a simulation
337
+
338
+ - `seededRng` (function) · `import { seededRng } from "@jgengine/core/gameplay"`
339
+
340
+ ## set — a bounded keyed value in a caller-owned serializable record
341
+
342
+ - `setValue` (function) · `import { setValue } from "@jgengine/core/gameplay"`
343
+
344
+ ## social-emotes — emotes and social interactions between nearby players
345
+
346
+ - `createSocial` (function) · `import { createSocial } from "@jgengine/core/gameplay"`
347
+
348
+ ## spawn-points — register spawn locations and pick where entities respawn
349
+
350
+ - `createSpawnPoints` (function) · `import { createSpawnPoints } from "@jgengine/core/gameplay"`
351
+
352
+ ## stat-graph — derive game-defined stats from named inputs with provenance and preview
353
+
354
+ - `createStatGraph` (function) · `import { createStatGraph } from "@jgengine/core/gameplay"`
355
+
356
+ ## stat-graph-bridge — feed an existing StatModifierSet into a stat-graph source
357
+
358
+ - `statModifierContributions` (function) · `import { statModifierContributions } from "@jgengine/core/gameplay"`
359
+
360
+ ## system-schedule — compile fixed/frame/interval system ticks into deterministic ordered stages
361
+
362
+ - `compileSystemSchedule` (function) · `import { compileSystemSchedule } from "@jgengine/core/gameplay"`
363
+
364
+ ## tick-work — advance jobs over time, completing work and emitting typed lifecycle events
365
+
366
+ - `tick` (function) · `import { tick } from "@jgengine/core/gameplay"`
367
+
368
+ ## toast-feed — queue of transient self-expiring on-screen messages (toasts, announcer, kill-feed)
369
+
370
+ - `appendToast` (function) · `import { appendToast } from "@jgengine/core/gameplay"`
371
+ - `createToastQueue` (function) · `import { createToastQueue } from "@jgengine/core/gameplay"`
372
+
373
+ ## touch-controls — default on-screen button silhouette for a touch action
374
+
375
+ - `touchButtonShape` (function) · `import { touchButtonShape } from "@jgengine/core/gameplay"`
376
+
377
+ ## tribe-group — shared-ownership group (tribe/guild/clan) with ranked permissions, group vs personal assets, alliances, and a bounded event log
378
+
379
+ - `createTribe` (function) · `import { createTribe } from "@jgengine/core/game/tribe"`
380
+
381
+ ## tribe-registry — registry of tribes with mutual alliances and cross-tribe relation lookup
382
+
383
+ - `createTribeRegistry` (function) · `import { createTribeRegistry } from "@jgengine/core/game/tribe"`
384
+
385
+ ## triggered-rules — event-conditioned effects with declarative predicates, lifetimes, and stacking
386
+
387
+ - `createTriggeredRuleEngine` (function) · `import { createTriggeredRuleEngine } from "@jgengine/core/gameplay"`
388
+ - `getRuleEffect` (function) · `import { getRuleEffect } from "@jgengine/core/gameplay"`
389
+ - `listRuleEffects` (function) · `import { listRuleEffects } from "@jgengine/core/gameplay"`
390
+ - `registerRuleEffect` (function) · `import { registerRuleEffect } from "@jgengine/core/gameplay"`
391
+
392
+ ## typed-keyed-store — a cast-free typed handle onto a per-owner keyed family of reactive game-store slots, replayable and host-authoritative
393
+
394
+ - `defineKeyedStore` (function) · `import { defineKeyedStore } from "@jgengine/core/store/defineKeyedStore"`
395
+
396
+ ## typed-store — a cast-free typed handle onto one reactive game-store slot, replayable and host-authoritative
397
+
398
+ - `defineStore` (function) · `import { defineStore } from "@jgengine/core/store/defineStore"`
399
+
400
+ ## unit-training — compose a timed work queue that trains catalog units into spawn orders
401
+
402
+ - `unitTrainingConfig` (function) · `import { unitTrainingConfig } from "@jgengine/core/gameplay"`
403
+
404
+ ## unlock-points — spendable point pool earned per level and spent to unlock nodes, with refund and respec
405
+
406
+ - `createUnlockPoints` (function) · `import { createUnlockPoints } from "@jgengine/core/economy/unlockPoints"`
407
+
408
+ ## unlockables — gate content behind unlock conditions the player earns
409
+
410
+ - `createUnlockCatalog` (function) · `import { createUnlockCatalog } from "@jgengine/core/gameplay"`
411
+
412
+ ## wallet — hold currency balances with charge and affordability checks
413
+
414
+ - `createEmptyWallet` (function) · `import { createEmptyWallet } from "@jgengine/core/gameplay"`
415
+
416
+ ## weapon-stats — resolve per-weapon stat values for combat math
417
+
418
+ - `createWeaponStats` (function) · `import { createWeaponStats } from "@jgengine/core/gameplay"`
419
+
420
+ ## weighted-pick — pick one item from a set with an injected random source
421
+
422
+ - `pickUniform` (function) · `import { pickUniform } from "@jgengine/core/gameplay"`
423
+
424
+ ## work-active-jobs — list jobs currently progressing in a work queue
425
+
426
+ - `activeJobs` (function) · `import { activeJobs } from "@jgengine/core/gameplay"`
427
+
428
+ ## work-job-by-id — look up a queued job by id
429
+
430
+ - `jobById` (function) · `import { jobById } from "@jgengine/core/gameplay"`
431
+
432
+ ## work-job-progress — compute a job's fractional progress
433
+
434
+ - `jobProgress` (function) · `import { jobProgress } from "@jgengine/core/gameplay"`
435
+
436
+ ## work-order-fifo — order queued jobs by enqueue sequence
437
+
438
+ - `fifoOrdering` (function) · `import { fifoOrdering } from "@jgengine/core/gameplay"`
439
+
440
+ ## work-order-priority — order queued jobs by priority, then FIFO within equal priority
441
+
442
+ - `priorityOrdering` (function) · `import { priorityOrdering } from "@jgengine/core/gameplay"`
443
+
444
+ ## work-queue — a serializable timed job queue with reservation, cancellation, completion, and output routing
445
+
446
+ - `createWorkQueue` (function) · `import { createWorkQueue } from "@jgengine/core/gameplay"`
447
+
448
+ ## work-queue-size — count non-terminal jobs in a work queue
449
+
450
+ - `queueSize` (function) · `import { queueSize } from "@jgengine/core/gameplay"`
451
+
452
+ ## work-queued-jobs — list jobs waiting for a slot, in selection order
453
+
454
+ - `queuedJobs` (function) · `import { queuedJobs } from "@jgengine/core/gameplay"`
@@ -0,0 +1,56 @@
1
+ # Composable systems (`defineSystem`)
2
+
3
+ Single public authoring path: `defineGame({ systems, loop?, … })` from `@jgengine/shell/defineGame`. Systems are meaningful capabilities — not micro-ticks.
4
+
5
+ ## API
6
+
7
+ ```ts
8
+ import { defineSystem } from "@jgengine/core/game/defineSystem";
9
+ import { compileSystemSchedule, DEFAULT_FIXED_STAGES, DEFAULT_FRAME_STAGES } from "@jgengine/core/game/systemSchedule";
10
+ import { composeGameLoop, installSystems } from "@jgengine/core/game/systemRuntime";
11
+
12
+ export const combat = defineSystem({
13
+ id: "combat",
14
+ feature: "quest", // optional — enables ctx.game.quest without features: { quest: true }
15
+ dependsOn: ["movement"], // optional — must also be in systems[]
16
+ tick: {
17
+ type: "fixed", // | "frame" | "interval" | "manual"
18
+ rate: 60, // fixed only (Hz); default 60
19
+ every: 1, // interval only (game-seconds)
20
+ stage: "combat",
21
+ after: "movement", // optional local order within the stage
22
+ before: "cleanup",
23
+ },
24
+ create(ctx) {},
25
+ start(ctx) {},
26
+ update(ctx, dt) {},
27
+ events: {
28
+ "entity.died"(ctx, event) {},
29
+ },
30
+ save: { key: "combat", snapshot: () => state, hydrate: (data) => { state = data; } },
31
+ replicate: (ctx) => ({ key: "combat-pub", snapshot: () => pub, hydrate: (d) => { pub = d; } }),
32
+ reset(ctx) {},
33
+ dispose(ctx) {},
34
+ });
35
+ ```
36
+
37
+ `defineGame` OR-merges `feature` flags, then `composeGameLoop(systems, loop)` so systems install on `onInit` and tick before residual `loop.onTick`. Classic games migrate by moving fan-out out of `onTick` into systems while keeping boot in `loop`.
38
+
39
+ ## Timing channels
40
+
41
+ | `tick.type` | When it runs |
42
+ |-------------|--------------|
43
+ | `fixed` | Accumulator at `rate` Hz (default 60); multi-subscribe OK |
44
+ | `frame` | Once per `onTick` with the frame's game `dt` |
45
+ | `interval` | Every `every` game-seconds (own accumulator per system) |
46
+ | `manual` | Installed only; call `systemsOf(ctx)?.runManual(ctx, id)` |
47
+ | *(omit)* | Event-only — handlers in `events` |
48
+
49
+ Multiple systems may share a channel. Order is stage tables + optional `before`/`after` — **never import order**. `compileSystemSchedule` validates unique ids, `dependsOn`, and cycles.
50
+
51
+ Default stages: fixed `input → movement → combat → ai → activities → cleanup`; frame includes those plus `animation → camera → effects`.
52
+
53
+ ## Ownership
54
+
55
+ - **Save / replicate** — system modules register via `ctx.game.registerSave` / `registerReplicate` at install.
56
+ - **Reset / dispose** — `loop.onReset` / `loop.onDispose` (composed) run system hooks.
@@ -0,0 +1,51 @@
1
+ ---
2
+ name: jgengine-world
3
+ description: Build spatial runtime, movement, interaction, AI, and environments.
4
+ ---
5
+
6
+ # JGengine world runtime
7
+
8
+ ## Ownership
9
+
10
+ This skill owns runtime spatial behavior: authored-scene consumption, environments, movement, input mapping, interaction, AI, navigation, physics, visibility, time, and spatial audio. Scene creation and placement stay in `jgengine-editor`; presentation stays in `jgengine-ui`.
11
+
12
+ Search [capabilities.md](capabilities.md) by intent before designing a primitive. Use [api.md](api.md) for exact exports and [reference.md](reference.md) for environment, camera, navigation, physics, audio, and authored-scene recipes.
13
+
14
+ For a *connected* walkthrough that wires several primitives into a running loop, read the goal-oriented recipes under [recipes/](recipes/) — organized by composition seam (what connects to what), never by genre. Start there before reading a game's source to learn how pieces fit; a hybrid game is just a different composition of the same primitives.
15
+
16
+ - [recipes/commanding-entities.md](recipes/commanding-entities.md) — select → order → tick → resolve: direct command over a group of entities (the command loop behind squad control, base-defense, herding, autobattle, or a mutating game's real-time phase).
17
+
18
+ ## Canonical workflows
19
+
20
+ ### Declare the place
21
+
22
+ A world is the place you play in: substrate + laws, via `world()` from `@jgengine/core/world/place` — `{ id, ground: { mode: flat|round|voxel|board, size, surface?, generator? }, physics? }`. Thin is complete: flat with `Infinity` axes for 3D, `board` for 2D, or omit `world` for pure UI/rules games. Never put seed, sky, or vegetation in a world definition — seeds derive from world id + save/run (`seedForPlace`); sky look and foliage scatter are editor-authored scene content, with the engine default sky when the document has none. `ground.surface` carries matter/feel laws (metal vs slime vs felt) that the same rule systems read — swap the surface, not the rules. See [reference.md](reference.md) for the full shape; `environment()` is the legacy consumption path for editor/preset-written scene data, never the starter.
23
+
24
+ ### Authored world
25
+
26
+ 1. Load the scene document through the shared authored-scene feature.
27
+ 2. Render objects, paths, terrain, foliage, and markers generically.
28
+ 3. Query the same ids/layers for spawns, routes, plots, and interaction.
29
+ 4. Keep derived caches rebuildable; the document remains authoritative.
30
+
31
+ ### Movement and interaction
32
+
33
+ Choose input intent, controller/motor, collision/navigation, and camera as separate seams. Commands express game intent; world systems resolve motion. Interaction targets come from bounded spatial/sensor queries, not full-world scans.
34
+
35
+ ### AI and navigation
36
+
37
+ Compose perception, selection, planning/behavior, movement, and lifecycle independently. Inject randomness and scheduling. Use spatial indexes, interest tiers, or bounded candidate sets for scale.
38
+
39
+ ### Fallback-seam diagnostics
40
+
41
+ Render seams fall back to placeholders when content is unauthored: default green ground (no environment), primitive capsule/box actors (no `entityModels`/`objectModels` mapping), stylized proxy foliage (no scatter `resolveItem`). These placeholders are sometimes intended, so runtime never changes — but a dev-only, opt-in probe (`@jgengine/core/devtools/fallbackSeams`) tells "unauthored/misconfigured" apart from "intended". The shell arms it via `armFallbackSeams(devtoolsEnabled)`; each seam reports at its choice site (`reportFallbackSeam`), and counts surface through the devtools `fallbacks` probe. Disarmed (production) it is a pure, allocation-free no-op.
42
+
43
+ ## Traps
44
+
45
+ - Do not put seed, sky presets, or vegetation/scatter fields in a world definition — `world()` rejects them; dressing belongs to the editor's scene document.
46
+ - Do not put UI layout, touch chrome, combat resolution, or asset acquisition here.
47
+ - Do not duplicate editor coordinates in runtime state.
48
+ - Public APIs accept semantic policies and caller data, not renderer mechanics or internal tuning rolls.
49
+ - Generated environments still need deterministic data assertions; authored environments need scene-document assertions.
50
+ - Audio files and licensing belong to `jgengine-assets`; spatial playback policy belongs here.
51
+