@jgengine/core 0.10.0 → 0.11.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 (607) hide show
  1. package/CHANGELOG.md +13 -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/spawnDirector.d.ts +7 -2
  21. package/dist/ai/spawnDirector.js +18 -15
  22. package/dist/ai/spawnPoint.d.ts +3 -1
  23. package/dist/ai/spawnPoint.js +3 -1
  24. package/dist/ai/targetAcquisition.d.ts +84 -0
  25. package/dist/ai/targetAcquisition.js +92 -0
  26. package/dist/anim/easing.d.ts +19 -0
  27. package/dist/anim/easing.js +19 -0
  28. package/dist/anim/oscillator.d.ts +12 -0
  29. package/dist/anim/oscillator.js +25 -0
  30. package/dist/area/areaEffectField.d.ts +127 -0
  31. package/dist/area/areaEffectField.js +175 -0
  32. package/dist/area/stackPolicy.d.ts +47 -0
  33. package/dist/area/stackPolicy.js +99 -0
  34. package/dist/authoring.d.ts +1 -0
  35. package/dist/authoring.js +1 -0
  36. package/dist/board/laneBoard.d.ts +13 -0
  37. package/dist/board/laneBoard.js +13 -0
  38. package/dist/board/timelineBoard.d.ts +10 -0
  39. package/dist/board/timelineBoard.js +10 -0
  40. package/dist/combat/abilityKit.d.ts +18 -0
  41. package/dist/combat/abilityKit.js +24 -9
  42. package/dist/combat/animationState.d.ts +5 -0
  43. package/dist/combat/animationState.js +5 -0
  44. package/dist/combat/breakMeters.d.ts +10 -0
  45. package/dist/combat/breakMeters.js +10 -0
  46. package/dist/combat/castRunner.d.ts +5 -0
  47. package/dist/combat/castRunner.js +5 -0
  48. package/dist/combat/comboPoints.d.ts +5 -0
  49. package/dist/combat/comboPoints.js +5 -0
  50. package/dist/combat/comboString.d.ts +5 -0
  51. package/dist/combat/comboString.js +5 -0
  52. package/dist/combat/damageInterceptors.d.ts +192 -0
  53. package/dist/combat/damageInterceptors.js +251 -0
  54. package/dist/combat/damageMatchup.d.ts +68 -0
  55. package/dist/combat/damageMatchup.js +42 -0
  56. package/dist/combat/damageResolution.d.ts +63 -0
  57. package/dist/combat/damageResolution.js +50 -0
  58. package/dist/combat/death.d.ts +7 -1
  59. package/dist/combat/death.js +5 -0
  60. package/dist/combat/deathReason.d.ts +14 -0
  61. package/dist/combat/deathReason.js +1 -0
  62. package/dist/combat/defensiveWindow.d.ts +5 -0
  63. package/dist/combat/defensiveWindow.js +5 -0
  64. package/dist/combat/dotField.d.ts +5 -1
  65. package/dist/combat/dotField.js +5 -1
  66. package/dist/combat/downed.d.ts +5 -0
  67. package/dist/combat/downed.js +5 -0
  68. package/dist/combat/effects.d.ts +5 -0
  69. package/dist/combat/effects.js +5 -0
  70. package/dist/combat/encounterSequence.d.ts +258 -0
  71. package/dist/combat/encounterSequence.js +426 -0
  72. package/dist/combat/hitReaction.d.ts +57 -1
  73. package/dist/combat/hitReaction.js +45 -5
  74. package/dist/combat/magazine.d.ts +54 -0
  75. package/dist/combat/magazine.js +96 -0
  76. package/dist/combat/projectiles.d.ts +5 -0
  77. package/dist/combat/projectiles.js +32 -14
  78. package/dist/combat/receivedDamage.d.ts +117 -0
  79. package/dist/combat/receivedDamage.js +92 -0
  80. package/dist/combat/regenShield.d.ts +5 -1
  81. package/dist/combat/regenShield.js +5 -1
  82. package/dist/combat/renderCues.d.ts +51 -0
  83. package/dist/combat/renderCues.js +44 -0
  84. package/dist/combat/resourcePool.d.ts +5 -0
  85. package/dist/combat/resourcePool.js +5 -0
  86. package/dist/combat/rewardAllocation.d.ts +121 -0
  87. package/dist/combat/rewardAllocation.js +251 -0
  88. package/dist/combat/shotOrigin.d.ts +18 -1
  89. package/dist/combat/shotOrigin.js +39 -0
  90. package/dist/combat/statusApplication.d.ts +96 -0
  91. package/dist/combat/statusApplication.js +81 -0
  92. package/dist/combat/telegraph.d.ts +11 -2
  93. package/dist/combat/telegraph.js +11 -2
  94. package/dist/combat/thresholdCrossings.d.ts +85 -0
  95. package/dist/combat/thresholdCrossings.js +116 -0
  96. package/dist/combat.d.ts +34 -0
  97. package/dist/combat.js +34 -0
  98. package/dist/commands/commandRegistry.d.ts +11 -0
  99. package/dist/commands/commandRegistry.js +9 -2
  100. package/dist/crafting/crop.d.ts +18 -0
  101. package/dist/crafting/crop.js +18 -0
  102. package/dist/crafting/production.d.ts +5 -0
  103. package/dist/crafting/production.js +5 -0
  104. package/dist/devtools/rewriteTunables.d.ts +17 -0
  105. package/dist/devtools/rewriteTunables.js +276 -0
  106. package/dist/devtools/saveEndpoint.d.ts +46 -0
  107. package/dist/devtools/saveEndpoint.js +48 -0
  108. package/dist/devtools/transformTunables.d.ts +3 -0
  109. package/dist/devtools/transformTunables.js +3 -0
  110. package/dist/devtools/tunableSchema.d.ts +31 -0
  111. package/dist/devtools/tunableSchema.js +31 -0
  112. package/dist/economy/currency.d.ts +12 -1
  113. package/dist/economy/currency.js +12 -1
  114. package/dist/economy/listingBook.d.ts +91 -0
  115. package/dist/economy/listingBook.js +144 -0
  116. package/dist/economy/resourceLedger.d.ts +222 -0
  117. package/dist/economy/resourceLedger.js +353 -0
  118. package/dist/economy/sharedWallet.d.ts +14 -0
  119. package/dist/economy/sharedWallet.js +14 -0
  120. package/dist/economy/techTree.d.ts +12 -0
  121. package/dist/economy/techTree.js +12 -0
  122. package/dist/economy/wallet.d.ts +26 -2
  123. package/dist/economy/wallet.js +35 -6
  124. package/dist/editor/commands.d.ts +190 -7
  125. package/dist/editor/commands.js +727 -55
  126. package/dist/editor/document.d.ts +159 -13
  127. package/dist/editor/document.js +750 -19
  128. package/dist/editor/grid.d.ts +229 -0
  129. package/dist/editor/grid.js +366 -0
  130. package/dist/editor/gridAdapters.d.ts +80 -0
  131. package/dist/editor/gridAdapters.js +134 -0
  132. package/dist/editor/index.d.ts +73 -6
  133. package/dist/editor/index.js +6 -2
  134. package/dist/editor/liveSync.d.ts +127 -0
  135. package/dist/editor/liveSync.js +249 -0
  136. package/dist/editor/runtimeInspector.d.ts +88 -0
  137. package/dist/editor/runtimeInspector.js +239 -0
  138. package/dist/editor/types.d.ts +107 -1
  139. package/dist/faction/reputation.d.ts +5 -0
  140. package/dist/faction/reputation.js +5 -0
  141. package/dist/format/distance.d.ts +17 -0
  142. package/dist/format/distance.js +18 -0
  143. package/dist/format/duration.d.ts +27 -0
  144. package/dist/format/duration.js +45 -0
  145. package/dist/format/speed.d.ts +17 -0
  146. package/dist/format/speed.js +25 -0
  147. package/dist/game/connectedPlayers.d.ts +6 -4
  148. package/dist/game/connectedPlayers.js +2 -2
  149. package/dist/game/cosmetics.d.ts +9 -0
  150. package/dist/game/cosmetics.js +16 -0
  151. package/dist/game/defineGame.d.ts +100 -2
  152. package/dist/game/defineGame.js +39 -2
  153. package/dist/game/defineSystem.d.ts +88 -0
  154. package/dist/game/defineSystem.js +45 -0
  155. package/dist/game/dialogue.d.ts +33 -0
  156. package/dist/game/dialogue.js +21 -0
  157. package/dist/game/events.d.ts +35 -13
  158. package/dist/game/events.js +5 -0
  159. package/dist/game/feed.d.ts +33 -0
  160. package/dist/game/feed.js +35 -2
  161. package/dist/game/gamePhase.d.ts +11 -0
  162. package/dist/game/gamePhase.js +16 -0
  163. package/dist/game/leaderboard.d.ts +5 -0
  164. package/dist/game/leaderboard.js +5 -0
  165. package/dist/game/loadout.d.ts +5 -0
  166. package/dist/game/loadout.js +5 -0
  167. package/dist/game/lootFilter.d.ts +2 -0
  168. package/dist/game/lootFilter.js +2 -0
  169. package/dist/game/lootPipeline.d.ts +164 -0
  170. package/dist/game/lootPipeline.js +216 -0
  171. package/dist/game/lootTable.d.ts +19 -2
  172. package/dist/game/lootTable.js +15 -5
  173. package/dist/game/objectives.d.ts +43 -0
  174. package/dist/game/objectives.js +36 -0
  175. package/dist/game/paramLayers.d.ts +148 -0
  176. package/dist/game/paramLayers.js +185 -0
  177. package/dist/game/ping.d.ts +5 -0
  178. package/dist/game/ping.js +5 -0
  179. package/dist/game/playableGame.d.ts +92 -7
  180. package/dist/game/quest.d.ts +8 -0
  181. package/dist/game/quest.js +29 -0
  182. package/dist/game/race.d.ts +141 -0
  183. package/dist/game/race.js +169 -0
  184. package/dist/game/recordBook.d.ts +3 -1
  185. package/dist/game/recordBook.js +4 -1
  186. package/dist/game/ruleSelection.d.ts +75 -0
  187. package/dist/game/ruleSelection.js +127 -0
  188. package/dist/game/runDraft.d.ts +5 -0
  189. package/dist/game/runDraft.js +5 -0
  190. package/dist/game/saveStore.d.ts +111 -0
  191. package/dist/game/saveStore.js +312 -0
  192. package/dist/game/snapshotHistory.d.ts +67 -0
  193. package/dist/game/snapshotHistory.js +95 -0
  194. package/dist/game/social.d.ts +38 -1
  195. package/dist/game/social.js +71 -0
  196. package/dist/game/spawnPoints.d.ts +5 -0
  197. package/dist/game/spawnPoints.js +5 -0
  198. package/dist/game/systemRuntime.d.ts +50 -0
  199. package/dist/game/systemRuntime.js +157 -0
  200. package/dist/game/systemSchedule.d.ts +72 -0
  201. package/dist/game/systemSchedule.js +242 -0
  202. package/dist/game/toasts.d.ts +43 -0
  203. package/dist/game/toasts.js +44 -0
  204. package/dist/game/trade.d.ts +10 -0
  205. package/dist/game/trade.js +10 -0
  206. package/dist/game/unlocks.d.ts +8 -0
  207. package/dist/game/unlocks.js +16 -0
  208. package/dist/game/vfxInstance.d.ts +138 -0
  209. package/dist/game/vfxInstance.js +96 -0
  210. package/dist/game/worldItem.d.ts +17 -4
  211. package/dist/game/worldItem.js +17 -4
  212. package/dist/gameplay.d.ts +91 -0
  213. package/dist/gameplay.js +91 -0
  214. package/dist/index.d.ts +5 -14
  215. package/dist/index.js +5 -14
  216. package/dist/input/actionBindings.d.ts +23 -6
  217. package/dist/input/actionBindings.js +23 -6
  218. package/dist/input/axisInput.d.ts +7 -2
  219. package/dist/input/axisInput.js +7 -2
  220. package/dist/input/controlGroups.d.ts +67 -0
  221. package/dist/input/controlGroups.js +41 -0
  222. package/dist/input/touchScheme.d.ts +82 -6
  223. package/dist/input/touchScheme.js +123 -10
  224. package/dist/interaction/lockpick.d.ts +61 -0
  225. package/dist/interaction/lockpick.js +168 -0
  226. package/dist/interaction/proximityPrompt.d.ts +2 -0
  227. package/dist/interaction/proximityPrompt.js +2 -0
  228. package/dist/interaction/qte.d.ts +5 -0
  229. package/dist/interaction/qte.js +5 -0
  230. package/dist/interaction/skillCheck.d.ts +5 -0
  231. package/dist/interaction/skillCheck.js +5 -0
  232. package/dist/inventory/inventoryModel.d.ts +12 -0
  233. package/dist/inventory/inventoryModel.js +12 -0
  234. package/dist/inventory/shapedGrid.d.ts +16 -0
  235. package/dist/inventory/shapedGrid.js +16 -0
  236. package/dist/inventory/slotModel.d.ts +10 -0
  237. package/dist/inventory/slotModel.js +10 -0
  238. package/dist/item/durability.d.ts +5 -0
  239. package/dist/item/durability.js +5 -0
  240. package/dist/item/itemIdentity.d.ts +171 -0
  241. package/dist/item/itemIdentity.js +138 -0
  242. package/dist/item/itemInstanceRegistry.d.ts +32 -0
  243. package/dist/item/itemInstanceRegistry.js +34 -0
  244. package/dist/item/itemgen.d.ts +163 -0
  245. package/dist/item/itemgen.js +151 -0
  246. package/dist/item/modularItem.d.ts +5 -0
  247. package/dist/item/modularItem.js +5 -0
  248. package/dist/item/use.d.ts +5 -0
  249. package/dist/item/use.js +5 -0
  250. package/dist/item/useBehavior.d.ts +142 -0
  251. package/dist/item/useBehavior.js +105 -0
  252. package/dist/item/weapon.d.ts +5 -0
  253. package/dist/item/weapon.js +5 -0
  254. package/dist/math/scalar.d.ts +25 -0
  255. package/dist/math/scalar.js +47 -0
  256. package/dist/meta/changelog.d.ts +4 -1
  257. package/dist/meta/changelog.js +16 -2
  258. package/dist/movement/avoidance.d.ts +45 -0
  259. package/dist/movement/avoidance.js +123 -0
  260. package/dist/movement/cameraRig.d.ts +8 -0
  261. package/dist/movement/cameraRig.js +8 -0
  262. package/dist/movement/dash.d.ts +11 -0
  263. package/dist/movement/dash.js +11 -0
  264. package/dist/movement/formation.d.ts +135 -0
  265. package/dist/movement/formation.js +194 -0
  266. package/dist/movement/glideModel.d.ts +5 -0
  267. package/dist/movement/glideModel.js +5 -0
  268. package/dist/movement/grappleSwing.d.ts +5 -0
  269. package/dist/movement/grappleSwing.js +5 -0
  270. package/dist/movement/leaderTrail.d.ts +5 -0
  271. package/dist/movement/leaderTrail.js +5 -0
  272. package/dist/movement/movementModel.d.ts +35 -8
  273. package/dist/movement/movementModel.js +42 -14
  274. package/dist/movement/playerMovement.js +65 -10
  275. package/dist/movement/poseState.d.ts +13 -0
  276. package/dist/movement/poseState.js +16 -0
  277. package/dist/movement/steering.d.ts +8 -0
  278. package/dist/movement/steering.js +18 -0
  279. package/dist/multiplayer/combatSnapshot.d.ts +3 -0
  280. package/dist/multiplayer/combatSnapshot.js +3 -0
  281. package/dist/multiplayer/lagCompensation.d.ts +5 -0
  282. package/dist/multiplayer/lagCompensation.js +5 -0
  283. package/dist/multiplayer/presenceModel.d.ts +9 -1
  284. package/dist/multiplayer/presenceModel.js +9 -1
  285. package/dist/multiplayer/simultaneousCommit.d.ts +3 -0
  286. package/dist/multiplayer/simultaneousCommit.js +3 -0
  287. package/dist/multiplayer.d.ts +11 -0
  288. package/dist/multiplayer.js +11 -0
  289. package/dist/nav/pathFollow.d.ts +57 -0
  290. package/dist/nav/pathFollow.js +109 -0
  291. package/dist/orders/orderKinds.d.ts +156 -0
  292. package/dist/orders/orderKinds.js +197 -0
  293. package/dist/orders/orderQueue.d.ts +208 -0
  294. package/dist/orders/orderQueue.js +211 -0
  295. package/dist/physics/drivableVehicle.d.ts +29 -0
  296. package/dist/physics/drivableVehicle.js +16 -0
  297. package/dist/physics/kinematicVehicle.d.ts +21 -1
  298. package/dist/physics/kinematicVehicle.js +23 -8
  299. package/dist/physics/physicsWorld.d.ts +24 -12
  300. package/dist/physics/physicsWorld.js +11 -5
  301. package/dist/physics/radialImpulse.d.ts +25 -0
  302. package/dist/physics/radialImpulse.js +27 -0
  303. package/dist/procedural.d.ts +3 -0
  304. package/dist/procedural.js +3 -0
  305. package/dist/progression/statGraph.d.ts +116 -0
  306. package/dist/progression/statGraph.js +318 -0
  307. package/dist/puzzle/cellGrid.d.ts +9 -0
  308. package/dist/puzzle/cellGrid.js +9 -0
  309. package/dist/puzzle/fallingPiece.d.ts +9 -0
  310. package/dist/puzzle/fallingPiece.js +9 -0
  311. package/dist/puzzle/nonogram.d.ts +39 -0
  312. package/dist/puzzle/nonogram.js +136 -0
  313. package/dist/random/nameGen.d.ts +5 -0
  314. package/dist/random/nameGen.js +5 -0
  315. package/dist/random/pick.d.ts +8 -0
  316. package/dist/random/pick.js +31 -0
  317. package/dist/random/rng.d.ts +22 -0
  318. package/dist/random/rng.js +28 -8
  319. package/dist/random/seedLink.d.ts +4 -0
  320. package/dist/random/seedLink.js +4 -0
  321. package/dist/relation/keyedValues.d.ts +54 -0
  322. package/dist/relation/keyedValues.js +115 -0
  323. package/dist/relation/thresholds.d.ts +62 -0
  324. package/dist/relation/thresholds.js +62 -0
  325. package/dist/render/color.d.ts +12 -0
  326. package/dist/render/color.js +26 -0
  327. package/dist/render/lookPreset.d.ts +41 -0
  328. package/dist/render/lookPreset.js +29 -0
  329. package/dist/render/postProcessing.d.ts +20 -0
  330. package/dist/render/postProcessing.js +21 -1
  331. package/dist/rules/predicate.d.ts +53 -0
  332. package/dist/rules/predicate.js +64 -0
  333. package/dist/rules/ruleEffects.d.ts +38 -0
  334. package/dist/rules/ruleEffects.js +37 -0
  335. package/dist/rules/triggeredRules.d.ts +160 -0
  336. package/dist/rules/triggeredRules.js +241 -0
  337. package/dist/runtime/adapter.d.ts +42 -3
  338. package/dist/runtime/adapter.js +44 -1
  339. package/dist/runtime/cameraDirector.d.ts +1 -0
  340. package/dist/runtime/cameraDirector.js +1 -0
  341. package/dist/runtime/commandRunner.d.ts +1 -0
  342. package/dist/runtime/commandRunner.js +1 -0
  343. package/dist/runtime/context/combatFx.d.ts +23 -0
  344. package/dist/runtime/context/combatFx.js +161 -0
  345. package/dist/runtime/context/registries.d.ts +13 -0
  346. package/dist/runtime/context/registries.js +84 -0
  347. package/dist/runtime/context/worldItems.d.ts +21 -0
  348. package/dist/runtime/context/worldItems.js +37 -0
  349. package/dist/runtime/descriptors/baseline.d.ts +48 -0
  350. package/dist/runtime/descriptors/baseline.js +134 -0
  351. package/dist/runtime/descriptors/features.d.ts +74 -0
  352. package/dist/runtime/descriptors/features.js +281 -0
  353. package/dist/runtime/gameContext.d.ts +114 -13
  354. package/dist/runtime/gameContext.js +303 -395
  355. package/dist/runtime/gameRuntime.d.ts +1 -0
  356. package/dist/runtime/gameRuntime.js +1 -0
  357. package/dist/runtime/headlessRunner.d.ts +60 -0
  358. package/dist/runtime/headlessRunner.js +44 -0
  359. package/dist/runtime/hostPersistence.d.ts +12 -0
  360. package/dist/runtime/hostPersistence.js +12 -0
  361. package/dist/runtime/hostedGameRunner.d.ts +8 -3
  362. package/dist/runtime/hostedGameRunner.js +26 -3
  363. package/dist/runtime/hostedWorldSession.d.ts +12 -4
  364. package/dist/runtime/hostedWorldSession.js +11 -4
  365. package/dist/runtime/inputSnapshot.d.ts +8 -3
  366. package/dist/runtime/inputSnapshot.js +6 -2
  367. package/dist/runtime/motionIntents.d.ts +11 -2
  368. package/dist/runtime/motionIntents.js +16 -2
  369. package/dist/runtime/perContext.d.ts +15 -0
  370. package/dist/runtime/perContext.js +21 -0
  371. package/dist/runtime/runtimeSave.d.ts +79 -0
  372. package/dist/runtime/runtimeSave.js +105 -0
  373. package/dist/runtime/save.d.ts +4 -0
  374. package/dist/runtime/save.js +4 -0
  375. package/dist/runtime/snapshot.d.ts +7 -0
  376. package/dist/runtime/snapshot.js +7 -0
  377. package/dist/runtime/visibility.d.ts +2 -1
  378. package/dist/runtime/visibility.js +2 -1
  379. package/dist/runtime/worldChannel.d.ts +7 -3
  380. package/dist/runtime/worldChannel.js +51 -6
  381. package/dist/runtime/worldMirror.d.ts +14 -2
  382. package/dist/runtime/worldMirror.js +15 -2
  383. package/dist/runtime/worldProjection.d.ts +47 -0
  384. package/dist/runtime/worldProjection.js +52 -0
  385. package/dist/runtime/worldReplication.d.ts +30 -7
  386. package/dist/runtime/worldReplication.js +41 -9
  387. package/dist/runtime/worldSnapshot.d.ts +30 -3
  388. package/dist/runtime/worldSnapshot.js +20 -5
  389. package/dist/scene/assetCatalog.d.ts +21 -0
  390. package/dist/scene/assetCatalog.js +4 -0
  391. package/dist/scene/assetDiagnostics.d.ts +69 -0
  392. package/dist/scene/assetDiagnostics.js +110 -0
  393. package/dist/scene/assetGenerator.d.ts +65 -0
  394. package/dist/scene/assetGenerator.js +64 -0
  395. package/dist/scene/assetSpace.d.ts +137 -0
  396. package/dist/scene/assetSpace.js +259 -0
  397. package/dist/scene/authoredTriggers.d.ts +169 -0
  398. package/dist/scene/authoredTriggers.js +340 -0
  399. package/dist/scene/behaviorRuntime.d.ts +75 -0
  400. package/dist/scene/behaviorRuntime.js +217 -0
  401. package/dist/scene/behaviors.d.ts +14 -2
  402. package/dist/scene/behaviors.js +7 -2
  403. package/dist/scene/bodyBind.d.ts +60 -0
  404. package/dist/scene/bodyBind.js +51 -0
  405. package/dist/scene/builtinSceneKinds.d.ts +5 -0
  406. package/dist/scene/builtinSceneKinds.js +62 -0
  407. package/dist/scene/colliders.d.ts +13 -1
  408. package/dist/scene/colliders.js +37 -1
  409. package/dist/scene/entityStats.d.ts +11 -2
  410. package/dist/scene/entityStats.js +11 -2
  411. package/dist/scene/entityStore.d.ts +12 -1
  412. package/dist/scene/entityStore.js +15 -0
  413. package/dist/scene/facing.d.ts +18 -0
  414. package/dist/scene/facing.js +26 -0
  415. package/dist/scene/modelSockets.d.ts +33 -0
  416. package/dist/scene/modelSockets.js +29 -0
  417. package/dist/scene/objectQuery.d.ts +2 -0
  418. package/dist/scene/objectQuery.js +2 -0
  419. package/dist/scene/objectStore.d.ts +4 -0
  420. package/dist/scene/objectStore.js +6 -0
  421. package/dist/scene/possession.d.ts +8 -0
  422. package/dist/scene/possession.js +14 -0
  423. package/dist/scene/roster.d.ts +3 -0
  424. package/dist/scene/roster.js +12 -0
  425. package/dist/scene/sceneKinds.d.ts +240 -0
  426. package/dist/scene/sceneKinds.js +214 -0
  427. package/dist/scene/sceneOwnership.d.ts +169 -0
  428. package/dist/scene/sceneOwnership.js +179 -0
  429. package/dist/scene/selectionBookmarks.d.ts +93 -0
  430. package/dist/scene/selectionBookmarks.js +122 -0
  431. package/dist/scene/vehicleSeat.d.ts +68 -0
  432. package/dist/scene/vehicleSeat.js +59 -0
  433. package/dist/sensor/concealment.d.ts +3 -0
  434. package/dist/sensor/concealment.js +3 -0
  435. package/dist/sensor/freezeMonitor.d.ts +1 -0
  436. package/dist/sensor/freezeMonitor.js +1 -0
  437. package/dist/sensor/frustumSensor.d.ts +7 -3
  438. package/dist/sensor/frustumSensor.js +7 -3
  439. package/dist/sensor/hiddenStateProbe.d.ts +5 -2
  440. package/dist/sensor/hiddenStateProbe.js +5 -2
  441. package/dist/sensor/recordingBuffer.d.ts +2 -1
  442. package/dist/sensor/recordingBuffer.js +2 -1
  443. package/dist/sensor/replayLoop.d.ts +6 -2
  444. package/dist/sensor/replayLoop.js +6 -2
  445. package/dist/sensor/revealQuery.d.ts +2 -1
  446. package/dist/sensor/revealQuery.js +2 -1
  447. package/dist/sensor/visionCone.d.ts +10 -3
  448. package/dist/sensor/visionCone.js +10 -3
  449. package/dist/session/contestedChannel.d.ts +1 -0
  450. package/dist/session/contestedChannel.js +1 -0
  451. package/dist/session/extraction.d.ts +1 -0
  452. package/dist/session/extraction.js +1 -0
  453. package/dist/session/roles.d.ts +6 -0
  454. package/dist/session/roles.js +6 -0
  455. package/dist/session/roundState.d.ts +8 -0
  456. package/dist/session/roundState.js +2 -0
  457. package/dist/settings/settingsModel.d.ts +1 -0
  458. package/dist/settings/settingsModel.js +1 -0
  459. package/dist/stats/accumulatorMeter.d.ts +6 -0
  460. package/dist/stats/accumulatorMeter.js +6 -0
  461. package/dist/stats/eventMeter.d.ts +5 -0
  462. package/dist/stats/eventMeter.js +5 -0
  463. package/dist/stats/rollCheck.d.ts +5 -0
  464. package/dist/stats/rollCheck.js +5 -0
  465. package/dist/stats/statModifiers.d.ts +5 -0
  466. package/dist/stats/statModifiers.js +5 -0
  467. package/dist/store/defineKeyedStore.d.ts +38 -0
  468. package/dist/store/defineKeyedStore.js +42 -0
  469. package/dist/store/defineStore.d.ts +33 -0
  470. package/dist/store/defineStore.js +35 -0
  471. package/dist/store/observableKeyedStore.d.ts +5 -0
  472. package/dist/store/observableKeyedStore.js +34 -2
  473. package/dist/survival/decayMeter.d.ts +55 -0
  474. package/dist/survival/decayMeter.js +130 -55
  475. package/dist/survival/moodle.d.ts +2 -0
  476. package/dist/survival/regionHealth.d.ts +6 -0
  477. package/dist/survival/regionHealth.js +5 -0
  478. package/dist/tactics/fallingGrid.d.ts +4 -2
  479. package/dist/tactics/fallingGrid.js +4 -2
  480. package/dist/tactics/predictiveQuery.d.ts +3 -0
  481. package/dist/tactics/predictiveQuery.js +3 -0
  482. package/dist/tactics/snapshot.d.ts +2 -0
  483. package/dist/tactics/snapshot.js +2 -0
  484. package/dist/tactics/surface.d.ts +1 -0
  485. package/dist/tactics/surface.js +1 -0
  486. package/dist/tactics/tacticalGrid.d.ts +1 -0
  487. package/dist/tactics/tacticalGrid.js +1 -0
  488. package/dist/time/beatClock.d.ts +14 -4
  489. package/dist/time/beatClock.js +14 -4
  490. package/dist/time/calendarClock.d.ts +3 -0
  491. package/dist/time/calendarClock.js +3 -0
  492. package/dist/time/idleProgress.d.ts +4 -0
  493. package/dist/time/idleProgress.js +4 -0
  494. package/dist/time/simClock.d.ts +2 -0
  495. package/dist/time/simClock.js +20 -5
  496. package/dist/ui/actionModel.d.ts +110 -0
  497. package/dist/ui/actionModel.js +159 -0
  498. package/dist/ui/gameLayout.d.ts +30 -11
  499. package/dist/ui/gameLayout.js +30 -11
  500. package/dist/ui/hudDocument.d.ts +114 -0
  501. package/dist/ui/hudDocument.js +220 -0
  502. package/dist/ui/hudLayout.d.ts +33 -1
  503. package/dist/ui/hudLayout.js +204 -17
  504. package/dist/ui/selectionModel.d.ts +92 -0
  505. package/dist/ui/selectionModel.js +88 -0
  506. package/dist/ui/tooltipModel.d.ts +63 -0
  507. package/dist/ui/tooltipModel.js +82 -0
  508. package/dist/ui.d.ts +15 -0
  509. package/dist/ui.js +15 -0
  510. package/dist/visibility/bounds.d.ts +8 -1
  511. package/dist/visibility/bounds.js +8 -1
  512. package/dist/visibility/frustum.d.ts +12 -3
  513. package/dist/visibility/frustum.js +12 -3
  514. package/dist/work/jobQueue.d.ts +201 -0
  515. package/dist/work/jobQueue.js +253 -0
  516. package/dist/work/unitTraining.d.ts +58 -0
  517. package/dist/work/unitTraining.js +52 -0
  518. package/dist/world/authoredObjects.d.ts +58 -0
  519. package/dist/world/authoredObjects.js +69 -0
  520. package/dist/world/buildingGenerator.d.ts +18 -0
  521. package/dist/world/buildingGenerator.js +62 -0
  522. package/dist/world/buildings.d.ts +5 -0
  523. package/dist/world/buildings.js +5 -0
  524. package/dist/world/catenary.d.ts +22 -0
  525. package/dist/world/catenary.js +69 -0
  526. package/dist/world/features.d.ts +115 -7
  527. package/dist/world/features.js +56 -5
  528. package/dist/world/footprintGrid.d.ts +59 -0
  529. package/dist/world/footprintGrid.js +141 -0
  530. package/dist/world/geometry.d.ts +64 -0
  531. package/dist/world/geometry.js +94 -0
  532. package/dist/world/grassKind.d.ts +51 -0
  533. package/dist/world/grassKind.js +101 -0
  534. package/dist/world/pathInstances.d.ts +27 -0
  535. package/dist/world/pathInstances.js +27 -0
  536. package/dist/world/pathTerrain.d.ts +80 -0
  537. package/dist/world/pathTerrain.js +142 -0
  538. package/dist/world/placeAsset.d.ts +81 -0
  539. package/dist/world/placeAsset.js +77 -0
  540. package/dist/world/placement.d.ts +4 -0
  541. package/dist/world/placement.js +4 -0
  542. package/dist/world/placementController.d.ts +6 -0
  543. package/dist/world/placementController.js +6 -0
  544. package/dist/world/polyline.d.ts +34 -0
  545. package/dist/world/polyline.js +81 -0
  546. package/dist/world/roads.d.ts +8 -0
  547. package/dist/world/roads.js +38 -0
  548. package/dist/world/scatterRegion.d.ts +164 -0
  549. package/dist/world/scatterRegion.js +409 -0
  550. package/dist/world/sceneShapes.d.ts +43 -0
  551. package/dist/world/sceneShapes.js +1 -0
  552. package/dist/world/segment.d.ts +27 -0
  553. package/dist/world/segment.js +43 -0
  554. package/dist/world/soilKind.d.ts +48 -0
  555. package/dist/world/soilKind.js +92 -0
  556. package/dist/world/spatialSample.d.ts +241 -0
  557. package/dist/world/spatialSample.js +465 -0
  558. package/dist/world/terraform.d.ts +213 -1
  559. package/dist/world/terraform.js +655 -20
  560. package/dist/world/terrain.d.ts +119 -20
  561. package/dist/world/terrain.js +247 -41
  562. package/dist/world/terrainGuides.d.ts +182 -0
  563. package/dist/world/terrainGuides.js +343 -0
  564. package/dist/world/vec2.d.ts +81 -0
  565. package/dist/world/vec2.js +128 -0
  566. package/dist/world/vec3.d.ts +49 -0
  567. package/dist/world/vec3.js +76 -0
  568. package/dist/world/vegetation.d.ts +71 -0
  569. package/dist/world/vegetation.js +151 -0
  570. package/dist/world/visibilityField.d.ts +154 -0
  571. package/dist/world/visibilityField.js +271 -0
  572. package/dist/world/volumetricClouds.d.ts +52 -0
  573. package/dist/world/volumetricClouds.js +43 -0
  574. package/dist/world/walls.d.ts +9 -0
  575. package/dist/world/walls.js +9 -0
  576. package/dist/world/waterKind.d.ts +55 -0
  577. package/dist/world/waterKind.js +99 -0
  578. package/dist/world.d.ts +132 -0
  579. package/dist/world.js +132 -0
  580. package/package.json +32 -8
  581. package/skills/jgengine/SKILL.md +51 -0
  582. package/skills/jgengine/api.md +434 -0
  583. package/skills/jgengine/capabilities.md +29 -0
  584. package/skills/jgengine/reference-cartridge.md +72 -0
  585. package/skills/jgengine-combat/SKILL.md +34 -0
  586. package/skills/jgengine-combat/api.md +549 -0
  587. package/skills/jgengine-combat/capabilities.md +169 -0
  588. package/skills/jgengine-combat/reference.md +98 -0
  589. package/skills/jgengine-gameplay/SKILL.md +39 -0
  590. package/skills/jgengine-gameplay/api.md +1794 -0
  591. package/skills/jgengine-gameplay/capabilities.md +378 -0
  592. package/skills/jgengine-gameplay/reference-systems.md +60 -0
  593. package/skills/jgengine-world/SKILL.md +38 -0
  594. package/skills/jgengine-world/api.md +2652 -0
  595. package/skills/jgengine-world/capabilities.md +370 -0
  596. package/skills/jgengine-world/reference.md +222 -0
  597. package/dist/cartridge/runtime.d.ts +0 -15
  598. package/dist/cartridge/runtime.js +0 -556
  599. package/dist/cartridge/spec.d.ts +0 -188
  600. package/dist/cartridge/spec.js +0 -19
  601. package/dist/cartridge/validate.d.ts +0 -2
  602. package/dist/cartridge/validate.js +0 -78
  603. package/dist/store/engineStore.d.ts +0 -22
  604. package/dist/store/engineStore.js +0 -50
  605. package/dist/store/features.d.ts +0 -10
  606. package/dist/store/features.js +0 -23
  607. package/llms.txt +0 -5389
@@ -0,0 +1,318 @@
1
+ const OP_ORDER = { override: 0, add: 1, mul: 2, clampMin: 3, clampMax: 4 };
2
+ function applyOp(acc, op, value) {
3
+ switch (op) {
4
+ case "add":
5
+ return acc + value;
6
+ case "mul":
7
+ return acc * value;
8
+ case "override":
9
+ return value;
10
+ case "clampMin":
11
+ return Math.max(acc, value);
12
+ case "clampMax":
13
+ return Math.min(acc, value);
14
+ }
15
+ }
16
+ function normalizeEntry(entry) {
17
+ return Array.isArray(entry) ? [...entry] : [entry];
18
+ }
19
+ function applyBounds(value, bounds) {
20
+ let out = value;
21
+ if (bounds.min !== undefined)
22
+ out = Math.max(bounds.min, out);
23
+ if (bounds.max !== undefined)
24
+ out = Math.min(bounds.max, out);
25
+ switch (bounds.round) {
26
+ case "floor":
27
+ return Math.floor(out);
28
+ case "ceil":
29
+ return Math.ceil(out);
30
+ case "round":
31
+ return Math.round(out);
32
+ default:
33
+ return out;
34
+ }
35
+ }
36
+ /**
37
+ * A data-driven stat graph: game-owned named inputs feed caller-authored derived
38
+ * formulas, with contribution provenance, uncommitted previews, cycle detection, and
39
+ * selective recomputation. Formula semantics and numeric tables stay entirely game-defined.
40
+ *
41
+ * @capability stat-graph derive game-defined stats from named inputs with provenance and preview
42
+ */
43
+ export function createStatGraph(def) {
44
+ const inputs = new Map();
45
+ for (const input of def.inputs) {
46
+ if (inputs.has(input.id))
47
+ throw new Error(`duplicate stat input id: ${input.id}`);
48
+ inputs.set(input.id, input);
49
+ }
50
+ const derived = new Map();
51
+ for (const node of def.derived ?? []) {
52
+ if (inputs.has(node.id) || derived.has(node.id))
53
+ throw new Error(`duplicate stat id: ${node.id}`);
54
+ derived.set(node.id, node);
55
+ }
56
+ // Validate dependencies and topologically order derived nodes (cycle detection).
57
+ for (const node of derived.values()) {
58
+ for (const dep of node.deps ?? []) {
59
+ if (!inputs.has(dep) && !derived.has(dep)) {
60
+ throw new Error(`stat "${node.id}" depends on unknown stat "${dep}"`);
61
+ }
62
+ }
63
+ }
64
+ const order = [];
65
+ const visiting = new Set();
66
+ const done = new Set();
67
+ const visit = (id) => {
68
+ if (done.has(id) || inputs.has(id))
69
+ return;
70
+ if (visiting.has(id))
71
+ throw new Error(`stat dependency cycle through "${id}"`);
72
+ visiting.add(id);
73
+ for (const dep of derived.get(id)?.deps ?? [])
74
+ visit(dep);
75
+ visiting.delete(id);
76
+ done.add(id);
77
+ order.push(id);
78
+ };
79
+ for (const id of derived.keys())
80
+ visit(id);
81
+ // Transitive dependents: changing X invalidates X and everything downstream of it.
82
+ const dependents = new Map();
83
+ for (const node of derived.values()) {
84
+ for (const dep of node.deps ?? []) {
85
+ let set = dependents.get(dep);
86
+ if (!set)
87
+ dependents.set(dep, (set = new Set()));
88
+ set.add(node.id);
89
+ }
90
+ }
91
+ const affected = (id) => {
92
+ const out = new Set([id]);
93
+ const stack = [id];
94
+ while (stack.length > 0) {
95
+ const cur = stack.pop();
96
+ for (const dep of dependents.get(cur) ?? []) {
97
+ if (!out.has(dep)) {
98
+ out.add(dep);
99
+ stack.push(dep);
100
+ }
101
+ }
102
+ }
103
+ return out;
104
+ };
105
+ const inputIds = Array.from(inputs.keys());
106
+ const derivedIds = Array.from(derived.keys());
107
+ const allIds = [...inputIds, ...order];
108
+ function makeSheet(baseState, sourceState) {
109
+ const baseValues = new Map(Object.entries(baseState));
110
+ const sources = sourceState;
111
+ const valueCache = new Map();
112
+ const stepCache = new Map();
113
+ const knows = (id) => inputs.has(id) || derived.has(id);
114
+ function externalSteps(id) {
115
+ const collected = [];
116
+ for (const mods of sources.values()) {
117
+ const list = mods.get(id);
118
+ if (list)
119
+ collected.push(...list);
120
+ }
121
+ // Stable sort by op precedence; registration order is preserved within an op.
122
+ return collected
123
+ .map((c, index) => ({ c, index }))
124
+ .sort((a, b) => OP_ORDER[a.c.op] - OP_ORDER[b.c.op] || a.index - b.index)
125
+ .map((entry) => entry.c);
126
+ }
127
+ function resolveSteps(id) {
128
+ const cached = stepCache.get(id);
129
+ if (cached)
130
+ return cached;
131
+ const inputDef = inputs.get(id);
132
+ const steps = [];
133
+ let acc;
134
+ if (inputDef) {
135
+ acc = baseValues.get(id) ?? inputDef.base ?? inputDef.min ?? 0;
136
+ steps.push({ source: "base", op: "add", value: acc, subtotal: acc });
137
+ }
138
+ else {
139
+ const node = derived.get(id);
140
+ if (!node)
141
+ throw new Error(`unknown stat: ${id}`);
142
+ const deps = new Set(node.deps ?? []);
143
+ const ctx = {
144
+ value: (dep) => {
145
+ if (!deps.has(dep))
146
+ throw new Error(`stat "${id}" read undeclared dependency "${dep}"`);
147
+ return resolveValue(dep);
148
+ },
149
+ };
150
+ const out = node.compute(ctx);
151
+ const contribs = typeof out === "number" ? [{ source: "formula", op: "add", value: out }] : out;
152
+ acc = 0;
153
+ for (const c of contribs) {
154
+ acc = applyOp(acc, c.op, c.value);
155
+ steps.push({ ...c, subtotal: acc });
156
+ }
157
+ }
158
+ for (const c of externalSteps(id)) {
159
+ acc = applyOp(acc, c.op, c.value);
160
+ steps.push({ ...c, subtotal: acc });
161
+ }
162
+ const bounds = inputDef ?? derived.get(id);
163
+ const bounded = applyBounds(acc, bounds);
164
+ if (bounded !== acc) {
165
+ steps.push({ source: "bounds", op: "override", value: bounded, subtotal: bounded });
166
+ }
167
+ stepCache.set(id, steps);
168
+ return steps;
169
+ }
170
+ function resolveValue(id) {
171
+ const cached = valueCache.get(id);
172
+ if (cached !== undefined)
173
+ return cached;
174
+ const steps = resolveSteps(id);
175
+ const value = steps.length === 0 ? 0 : steps[steps.length - 1].subtotal;
176
+ valueCache.set(id, value);
177
+ return value;
178
+ }
179
+ function invalidate(ids) {
180
+ for (const id of ids) {
181
+ for (const target of affected(id)) {
182
+ valueCache.delete(target);
183
+ stepCache.delete(target);
184
+ }
185
+ }
186
+ }
187
+ function cloneBase() {
188
+ const out = {};
189
+ for (const [id, value] of baseValues)
190
+ out[id] = value;
191
+ return out;
192
+ }
193
+ function cloneSourceMaps() {
194
+ const clone = new Map();
195
+ for (const [sourceId, mods] of sources) {
196
+ const inner = new Map();
197
+ for (const [statId, list] of mods)
198
+ inner.set(statId, list.map((c) => ({ ...c })));
199
+ clone.set(sourceId, inner);
200
+ }
201
+ return clone;
202
+ }
203
+ return {
204
+ get(id) {
205
+ if (!knows(id))
206
+ throw new Error(`unknown stat: ${id}`);
207
+ return resolveValue(id);
208
+ },
209
+ getBase(id) {
210
+ const inputDef = inputs.get(id);
211
+ if (!inputDef)
212
+ throw new Error(`not an input stat: ${id}`);
213
+ return baseValues.get(id) ?? inputDef.base ?? inputDef.min ?? 0;
214
+ },
215
+ setBase(id, value) {
216
+ if (!inputs.has(id))
217
+ throw new Error(`not an input stat: ${id}`);
218
+ baseValues.set(id, value);
219
+ invalidate([id]);
220
+ },
221
+ addSource(sourceId, mods) {
222
+ const map = new Map();
223
+ for (const [statId, entry] of Object.entries(mods)) {
224
+ if (!knows(statId))
225
+ throw new Error(`source "${sourceId}" targets unknown stat "${statId}"`);
226
+ map.set(statId, normalizeEntry(entry));
227
+ }
228
+ // Replacing a source must invalidate stats it USED to target, not just its new targets.
229
+ const touched = new Set(map.keys());
230
+ for (const statId of sources.get(sourceId)?.keys() ?? [])
231
+ touched.add(statId);
232
+ sources.set(sourceId, map);
233
+ invalidate(touched);
234
+ },
235
+ removeSource(sourceId) {
236
+ const map = sources.get(sourceId);
237
+ if (!map)
238
+ return false;
239
+ sources.delete(sourceId);
240
+ invalidate(map.keys());
241
+ return true;
242
+ },
243
+ hasSource(sourceId) {
244
+ return sources.has(sourceId);
245
+ },
246
+ sources() {
247
+ return Array.from(sources.keys());
248
+ },
249
+ values() {
250
+ const out = {};
251
+ for (const id of allIds)
252
+ out[id] = resolveValue(id);
253
+ return out;
254
+ },
255
+ explain(id) {
256
+ if (!knows(id))
257
+ throw new Error(`unknown stat: ${id}`);
258
+ const steps = resolveSteps(id).map((step) => ({ ...step }));
259
+ return { id, value: resolveValue(id), steps };
260
+ },
261
+ preview(mutate) {
262
+ const draft = makeSheet(cloneBase(), cloneSourceMaps());
263
+ mutate(draft);
264
+ return draft.values();
265
+ },
266
+ toJSON() {
267
+ const sourcesOut = {};
268
+ for (const [sourceId, mods] of sources) {
269
+ const inner = {};
270
+ for (const [statId, list] of mods)
271
+ inner[statId] = list.map((c) => ({ ...c }));
272
+ sourcesOut[sourceId] = inner;
273
+ }
274
+ return { base: cloneBase(), sources: sourcesOut };
275
+ },
276
+ };
277
+ }
278
+ return {
279
+ inputIds,
280
+ derivedIds,
281
+ create(base) {
282
+ return makeSheet({ ...(base ?? {}) }, new Map());
283
+ },
284
+ restore(state) {
285
+ const sources = new Map();
286
+ for (const [sourceId, mods] of Object.entries(state.sources ?? {})) {
287
+ const inner = new Map();
288
+ for (const [statId, list] of Object.entries(mods))
289
+ inner.set(statId, list.map((c) => ({ ...c })));
290
+ sources.set(sourceId, inner);
291
+ }
292
+ return makeSheet({ ...(state.base ?? {}) }, sources);
293
+ },
294
+ };
295
+ }
296
+ /**
297
+ * Bridge the shared {@link StatModifierSet} shape (add/multiply, used by talents, items,
298
+ * and buffs) into stat-graph contributions, so a ranked talent tree or gear roll feeds
299
+ * the graph as one named source instead of a parallel store.
300
+ *
301
+ * @capability stat-graph-bridge feed an existing StatModifierSet into a stat-graph source
302
+ */
303
+ export function statModifierContributions(source, set) {
304
+ const out = {};
305
+ for (const stat of Object.keys(set)) {
306
+ const modifier = set[stat];
307
+ if (!modifier)
308
+ continue;
309
+ const list = [];
310
+ if (modifier.add !== undefined)
311
+ list.push({ source, op: "add", value: modifier.add });
312
+ if (modifier.multiply !== undefined)
313
+ list.push({ source, op: "mul", value: modifier.multiply });
314
+ if (list.length > 0)
315
+ out[stat] = list;
316
+ }
317
+ return out;
318
+ }
@@ -11,16 +11,25 @@ export interface CellRun<T> {
11
11
  }[];
12
12
  readonly direction: "row" | "column";
13
13
  }
14
+ /** @internal */
14
15
  export declare function createCellGrid<T>(width: number, height: number): CellGrid<T>;
16
+ /** @internal */
15
17
  export declare function inGridBounds<T>(grid: CellGrid<T>, x: number, y: number): boolean;
18
+ /** @internal */
16
19
  export declare function cellAt<T>(grid: CellGrid<T>, x: number, y: number): T | null;
20
+ /** @internal */
17
21
  export declare function withCell<T>(grid: CellGrid<T>, x: number, y: number, value: T | null): CellGrid<T>;
22
+ /** @internal */
18
23
  export declare function withCells<T>(grid: CellGrid<T>, entries: readonly {
19
24
  readonly x: number;
20
25
  readonly y: number;
21
26
  readonly value: T | null;
22
27
  }[]): CellGrid<T>;
28
+ /** @internal */
23
29
  export declare function fullRows<T>(grid: CellGrid<T>): number[];
30
+ /** @internal */
24
31
  export declare function clearRows<T>(grid: CellGrid<T>, rows: readonly number[]): CellGrid<T>;
32
+ /** @internal */
25
33
  export declare function collapseColumns<T>(grid: CellGrid<T>): CellGrid<T>;
34
+ /** @internal */
26
35
  export declare function findRuns<T>(grid: CellGrid<T>, minLength: number, matches?: (a: T, b: T) => boolean): CellRun<T>[];
@@ -1,14 +1,18 @@
1
+ /** @internal */
1
2
  export function createCellGrid(width, height) {
2
3
  return { width, height, cells: new Array(width * height).fill(null) };
3
4
  }
5
+ /** @internal */
4
6
  export function inGridBounds(grid, x, y) {
5
7
  return x >= 0 && x < grid.width && y >= 0 && y < grid.height;
6
8
  }
9
+ /** @internal */
7
10
  export function cellAt(grid, x, y) {
8
11
  if (!inGridBounds(grid, x, y))
9
12
  return null;
10
13
  return grid.cells[y * grid.width + x] ?? null;
11
14
  }
15
+ /** @internal */
12
16
  export function withCell(grid, x, y, value) {
13
17
  if (!inGridBounds(grid, x, y))
14
18
  return grid;
@@ -16,6 +20,7 @@ export function withCell(grid, x, y, value) {
16
20
  cells[y * grid.width + x] = value;
17
21
  return { width: grid.width, height: grid.height, cells };
18
22
  }
23
+ /** @internal */
19
24
  export function withCells(grid, entries) {
20
25
  const cells = grid.cells.slice();
21
26
  for (const entry of entries) {
@@ -24,6 +29,7 @@ export function withCells(grid, entries) {
24
29
  }
25
30
  return { width: grid.width, height: grid.height, cells };
26
31
  }
32
+ /** @internal */
27
33
  export function fullRows(grid) {
28
34
  const rows = [];
29
35
  for (let y = 0; y < grid.height; y += 1) {
@@ -39,6 +45,7 @@ export function fullRows(grid) {
39
45
  }
40
46
  return rows;
41
47
  }
48
+ /** @internal */
42
49
  export function clearRows(grid, rows) {
43
50
  const removed = new Set(rows);
44
51
  const kept = [];
@@ -55,6 +62,7 @@ export function clearRows(grid, rows) {
55
62
  cells.push(...row);
56
63
  return { width: grid.width, height: grid.height, cells };
57
64
  }
65
+ /** @internal */
58
66
  export function collapseColumns(grid) {
59
67
  const cells = grid.cells.slice();
60
68
  for (let x = 0; x < grid.width; x += 1) {
@@ -88,6 +96,7 @@ function scanRuns(length, cellAtIndex, minLength, matches) {
88
96
  }
89
97
  return runs;
90
98
  }
99
+ /** @internal */
91
100
  export function findRuns(grid, minLength, matches = (a, b) => a === b) {
92
101
  const runs = [];
93
102
  for (let y = 0; y < grid.height; y += 1) {
@@ -6,18 +6,27 @@ export interface FallingPiece<TShape extends string = string> {
6
6
  readonly y: number;
7
7
  }
8
8
  export type ShapeTable<TShape extends string = string> = Record<TShape, readonly (readonly (readonly [number, number])[])[]>;
9
+ /** @internal */
9
10
  export declare function pieceCells<TShape extends string>(table: ShapeTable<TShape>, piece: FallingPiece<TShape>): readonly (readonly [number, number])[];
11
+ /** @internal */
10
12
  export declare function pieceCollides<T, TShape extends string>(grid: CellGrid<T>, table: ShapeTable<TShape>, piece: FallingPiece<TShape>): boolean;
13
+ /** @internal */
11
14
  export declare function mergePiece<T, TShape extends string>(grid: CellGrid<T>, table: ShapeTable<TShape>, piece: FallingPiece<TShape>, value: T): CellGrid<T>;
15
+ /** @internal */
12
16
  export declare function dropDistance<T, TShape extends string>(grid: CellGrid<T>, table: ShapeTable<TShape>, piece: FallingPiece<TShape>): number;
17
+ /** @internal */
13
18
  export declare function gravityInterval(level: number, base?: number, perLevel?: number, min?: number): number;
19
+ /** @internal */
14
20
  export declare function levelForLines(lines: number, linesPerLevel?: number): number;
21
+ /** @internal */
15
22
  export declare function lineScore(cleared: number, level: number, table?: readonly number[]): number;
16
23
  export interface LockDelayState {
17
24
  readonly delaySeconds: number;
18
25
  readonly elapsed: number;
19
26
  }
27
+ /** @internal */
20
28
  export declare function createLockDelay(delaySeconds: number): LockDelayState;
29
+ /** @internal */
21
30
  export declare function stepLockDelay(state: LockDelayState, grounded: boolean, dt: number): {
22
31
  state: LockDelayState;
23
32
  locked: boolean;
@@ -1,10 +1,12 @@
1
1
  import { cellAt } from "./cellGrid.js";
2
+ /** @internal */
2
3
  export function pieceCells(table, piece) {
3
4
  const rotations = table[piece.shape];
4
5
  const index = ((piece.rotation % rotations.length) + rotations.length) % rotations.length;
5
6
  const state = rotations[index];
6
7
  return state.map(([ox, oy]) => [piece.x + ox, piece.y + oy]);
7
8
  }
9
+ /** @internal */
8
10
  export function pieceCollides(grid, table, piece) {
9
11
  for (const [x, y] of pieceCells(table, piece)) {
10
12
  if (x < 0 || x >= grid.width || y >= grid.height)
@@ -14,6 +16,7 @@ export function pieceCollides(grid, table, piece) {
14
16
  }
15
17
  return false;
16
18
  }
19
+ /** @internal */
17
20
  export function mergePiece(grid, table, piece, value) {
18
21
  const cells = grid.cells.slice();
19
22
  for (const [x, y] of pieceCells(table, piece)) {
@@ -22,25 +25,31 @@ export function mergePiece(grid, table, piece, value) {
22
25
  }
23
26
  return { width: grid.width, height: grid.height, cells };
24
27
  }
28
+ /** @internal */
25
29
  export function dropDistance(grid, table, piece) {
26
30
  let distance = 0;
27
31
  while (!pieceCollides(grid, table, { ...piece, y: piece.y + distance + 1 }))
28
32
  distance += 1;
29
33
  return distance;
30
34
  }
35
+ /** @internal */
31
36
  export function gravityInterval(level, base = 0.8, perLevel = 0.07, min = 0.05) {
32
37
  return Math.max(min, base - level * perLevel);
33
38
  }
39
+ /** @internal */
34
40
  export function levelForLines(lines, linesPerLevel = 10) {
35
41
  return Math.floor(lines / linesPerLevel);
36
42
  }
37
43
  const CLASSIC_LINE_SCORE = [0, 40, 100, 300, 1200];
44
+ /** @internal */
38
45
  export function lineScore(cleared, level, table = CLASSIC_LINE_SCORE) {
39
46
  return (table[cleared] ?? 0) * (level + 1);
40
47
  }
48
+ /** @internal */
41
49
  export function createLockDelay(delaySeconds) {
42
50
  return { delaySeconds, elapsed: 0 };
43
51
  }
52
+ /** @internal */
44
53
  export function stepLockDelay(state, grounded, dt) {
45
54
  if (!grounded)
46
55
  return { state: { ...state, elapsed: 0 }, locked: false };
@@ -0,0 +1,39 @@
1
+ /** A cell in a nonogram line: not yet determined, painted, or ruled out. */
2
+ export type NonogramCell = "unknown" | "filled" | "empty";
3
+ /** A line clue — the lengths of its consecutive filled runs, in order. */
4
+ export type NonogramClue = readonly number[];
5
+ /** A solved grid, row-major; `true` is a filled cell. */
6
+ export type NonogramSolution = readonly (readonly boolean[])[];
7
+ /** Run lengths of the filled cells in a boolean line — the clue a solved line yields.
8
+ * @internal
9
+ */
10
+ export declare function runLengths(line: readonly boolean[]): number[];
11
+ /** Row and column clues derived from a solution grid — the puzzle a solved board poses.
12
+ * @internal
13
+ */
14
+ export declare function deriveClues(solution: NonogramSolution): {
15
+ rows: number[][];
16
+ cols: number[][];
17
+ };
18
+ /**
19
+ * Constraint-propagate one line against its `clue`: intersect every clue-consistent arrangement, forcing a
20
+ * cell `filled` when it is filled in all of them and `empty` when empty in all, leaving the rest `unknown`.
21
+ * Returns the tightened line, or `null` on contradiction (no arrangement fits the current cells) — the
22
+ * per-line deduction step at the heart of every nonogram/picross solver.
23
+ * @internal
24
+ */
25
+ export declare function solveLine(line: readonly NonogramCell[], clue: NonogramClue): NonogramCell[] | null;
26
+ /** Outcome of {@link solveNonogram}: the deduced board and whether propagation fully determined it. */
27
+ export interface NonogramSolveResult {
28
+ /** True when every cell is decided by line propagation alone (the puzzle is uniquely line-solvable). */
29
+ solved: boolean;
30
+ /** The board after propagation stalls — `unknown` cells remain when solving needs guessing. */
31
+ board: NonogramCell[][];
32
+ }
33
+ /**
34
+ * Solve a nonogram from its row and column clues by iterated line propagation until the board stops
35
+ * changing. `solved` is true iff the board is fully determined without guessing — the standard test for
36
+ * whether a nonogram is fair. Returns `solved: false` with a partial board on contradiction or ambiguity.
37
+ * @internal
38
+ */
39
+ export declare function solveNonogram(rows: readonly NonogramClue[], cols: readonly NonogramClue[]): NonogramSolveResult;
@@ -0,0 +1,136 @@
1
+ /** Run lengths of the filled cells in a boolean line — the clue a solved line yields.
2
+ * @internal
3
+ */
4
+ export function runLengths(line) {
5
+ const runs = [];
6
+ let run = 0;
7
+ for (const cell of line) {
8
+ if (cell) {
9
+ run += 1;
10
+ }
11
+ else if (run > 0) {
12
+ runs.push(run);
13
+ run = 0;
14
+ }
15
+ }
16
+ if (run > 0)
17
+ runs.push(run);
18
+ return runs;
19
+ }
20
+ /** Row and column clues derived from a solution grid — the puzzle a solved board poses.
21
+ * @internal
22
+ */
23
+ export function deriveClues(solution) {
24
+ const width = solution[0]?.length ?? 0;
25
+ const rows = solution.map((row) => runLengths(row));
26
+ const cols = [];
27
+ for (let c = 0; c < width; c += 1)
28
+ cols.push(runLengths(solution.map((row) => row[c] ?? false)));
29
+ return { rows, cols };
30
+ }
31
+ /**
32
+ * Constraint-propagate one line against its `clue`: intersect every clue-consistent arrangement, forcing a
33
+ * cell `filled` when it is filled in all of them and `empty` when empty in all, leaving the rest `unknown`.
34
+ * Returns the tightened line, or `null` on contradiction (no arrangement fits the current cells) — the
35
+ * per-line deduction step at the heart of every nonogram/picross solver.
36
+ * @internal
37
+ */
38
+ export function solveLine(line, clue) {
39
+ const n = line.length;
40
+ const everFilled = new Array(n).fill(false);
41
+ const everEmpty = new Array(n).fill(false);
42
+ const current = new Array(n).fill(false);
43
+ let arrangements = 0;
44
+ const record = () => {
45
+ arrangements += 1;
46
+ for (let k = 0; k < n; k += 1) {
47
+ if (current[k])
48
+ everFilled[k] = true;
49
+ else
50
+ everEmpty[k] = true;
51
+ }
52
+ };
53
+ const place = (pos, clueIndex) => {
54
+ if (clueIndex === clue.length) {
55
+ for (let k = pos; k < n; k += 1)
56
+ if (line[k] === "filled")
57
+ return;
58
+ record();
59
+ return;
60
+ }
61
+ const len = clue[clueIndex];
62
+ for (let start = pos; start + len <= n; start += 1) {
63
+ let gapHasFilled = false;
64
+ for (let k = pos; k < start; k += 1)
65
+ if (line[k] === "filled") {
66
+ gapHasFilled = true;
67
+ break;
68
+ }
69
+ let runOk = true;
70
+ for (let k = start; k < start + len; k += 1)
71
+ if (line[k] === "empty") {
72
+ runOk = false;
73
+ break;
74
+ }
75
+ const separatorOk = start + len >= n || line[start + len] !== "filled";
76
+ if (!gapHasFilled && runOk && separatorOk) {
77
+ for (let k = start; k < start + len; k += 1)
78
+ current[k] = true;
79
+ place(start + len + 1, clueIndex + 1);
80
+ for (let k = start; k < start + len; k += 1)
81
+ current[k] = false;
82
+ }
83
+ if (line[start] === "filled")
84
+ break;
85
+ }
86
+ };
87
+ place(0, 0);
88
+ if (arrangements === 0)
89
+ return null;
90
+ const out = line.slice();
91
+ for (let k = 0; k < n; k += 1) {
92
+ if (everFilled[k] && !everEmpty[k])
93
+ out[k] = "filled";
94
+ else if (everEmpty[k] && !everFilled[k])
95
+ out[k] = "empty";
96
+ }
97
+ return out;
98
+ }
99
+ /**
100
+ * Solve a nonogram from its row and column clues by iterated line propagation until the board stops
101
+ * changing. `solved` is true iff the board is fully determined without guessing — the standard test for
102
+ * whether a nonogram is fair. Returns `solved: false` with a partial board on contradiction or ambiguity.
103
+ * @internal
104
+ */
105
+ export function solveNonogram(rows, cols) {
106
+ const height = rows.length;
107
+ const width = cols.length;
108
+ const board = Array.from({ length: height }, () => new Array(width).fill("unknown"));
109
+ let changed = true;
110
+ while (changed) {
111
+ changed = false;
112
+ for (let r = 0; r < height; r += 1) {
113
+ const solved = solveLine(board[r], rows[r]);
114
+ if (solved === null)
115
+ return { solved: false, board };
116
+ for (let c = 0; c < width; c += 1)
117
+ if (solved[c] !== board[r][c]) {
118
+ board[r][c] = solved[c];
119
+ changed = true;
120
+ }
121
+ }
122
+ for (let c = 0; c < width; c += 1) {
123
+ const column = board.map((row) => row[c]);
124
+ const solved = solveLine(column, cols[c]);
125
+ if (solved === null)
126
+ return { solved: false, board };
127
+ for (let r = 0; r < height; r += 1)
128
+ if (solved[r] !== board[r][c]) {
129
+ board[r][c] = solved[r];
130
+ changed = true;
131
+ }
132
+ }
133
+ }
134
+ const solved = board.every((row) => row.every((cell) => cell !== "unknown"));
135
+ return { solved, board };
136
+ }
@@ -14,5 +14,10 @@ export interface NameGenerator {
14
14
  name(): string;
15
15
  }
16
16
  export declare function pickFrom(rng: () => number, bank: readonly string[]): string;
17
+ /**
18
+ * Generate procedural names from templates and word banks with an injected random source.
19
+ *
20
+ * @capability name-generator generate procedural names from templates and word banks
21
+ */
17
22
  export declare function createNameGenerator(options: NameGeneratorOptions): NameGenerator;
18
23
  export declare function fillTemplate(template: string, vars: Record<string, () => string> | Record<string, string>): string;
@@ -3,6 +3,11 @@ export function pickFrom(rng, bank) {
3
3
  throw new Error("pickFrom: bank must not be empty");
4
4
  return bank[Math.floor(rng() * bank.length)];
5
5
  }
6
+ /**
7
+ * Generate procedural names from templates and word banks with an injected random source.
8
+ *
9
+ * @capability name-generator generate procedural names from templates and word banks
10
+ */
6
11
  export function createNameGenerator(options) {
7
12
  const { rng, syllables } = options;
8
13
  const minSyllables = Math.max(1, options.minSyllables ?? 2);