@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.
- package/CHANGELOG.md +39 -2
- package/LICENSE +203 -661
- package/README.md +1 -1
- package/dist/ai/crowd.d.ts +55 -0
- package/dist/ai/crowd.js +114 -0
- package/dist/ai/flock.d.ts +5 -2
- package/dist/ai/flock.js +5 -2
- package/dist/ai/groupAssist.d.ts +1 -0
- package/dist/ai/groupAssist.js +1 -0
- package/dist/ai/heatSystem.d.ts +76 -0
- package/dist/ai/heatSystem.js +97 -0
- package/dist/ai/interestScheduler.d.ts +107 -0
- package/dist/ai/interestScheduler.js +118 -0
- package/dist/ai/jobBoard.d.ts +1 -0
- package/dist/ai/jobBoard.js +1 -0
- package/dist/ai/laneSelect.d.ts +5 -2
- package/dist/ai/laneSelect.js +5 -2
- package/dist/ai/mobBrain.d.ts +1 -0
- package/dist/ai/mobBrain.js +1 -0
- package/dist/ai/populationDirector.d.ts +103 -0
- package/dist/ai/populationDirector.js +190 -0
- package/dist/ai/pursuit.d.ts +56 -0
- package/dist/ai/pursuit.js +53 -0
- package/dist/ai/spawnDirector.d.ts +7 -2
- package/dist/ai/spawnDirector.js +18 -15
- package/dist/ai/spawnPoint.d.ts +3 -1
- package/dist/ai/spawnPoint.js +3 -1
- package/dist/ai/targetAcquisition.d.ts +84 -0
- package/dist/ai/targetAcquisition.js +92 -0
- package/dist/anim/easing.d.ts +19 -0
- package/dist/anim/easing.js +19 -0
- package/dist/anim/oscillator.d.ts +12 -0
- package/dist/anim/oscillator.js +25 -0
- package/dist/area/areaEffectField.d.ts +127 -0
- package/dist/area/areaEffectField.js +175 -0
- package/dist/area/stackPolicy.d.ts +47 -0
- package/dist/area/stackPolicy.js +99 -0
- package/dist/authoring.d.ts +2 -1
- package/dist/authoring.js +2 -1
- package/dist/board/laneBoard.d.ts +13 -0
- package/dist/board/laneBoard.js +13 -0
- package/dist/board/timelineBoard.d.ts +10 -0
- package/dist/board/timelineBoard.js +10 -0
- package/dist/combat/abilityKit.d.ts +18 -0
- package/dist/combat/abilityKit.js +24 -9
- package/dist/combat/animationState.d.ts +5 -0
- package/dist/combat/animationState.js +5 -0
- package/dist/combat/breakMeters.d.ts +10 -0
- package/dist/combat/breakMeters.js +10 -0
- package/dist/combat/castRunner.d.ts +5 -0
- package/dist/combat/castRunner.js +5 -0
- package/dist/combat/comboPoints.d.ts +5 -0
- package/dist/combat/comboPoints.js +5 -0
- package/dist/combat/comboString.d.ts +5 -0
- package/dist/combat/comboString.js +5 -0
- package/dist/combat/damageInterceptors.d.ts +192 -0
- package/dist/combat/damageInterceptors.js +251 -0
- package/dist/combat/damageMatchup.d.ts +68 -0
- package/dist/combat/damageMatchup.js +42 -0
- package/dist/combat/damageResolution.d.ts +63 -0
- package/dist/combat/damageResolution.js +50 -0
- package/dist/combat/death.d.ts +7 -1
- package/dist/combat/death.js +5 -0
- package/dist/combat/deathReason.d.ts +14 -0
- package/dist/combat/deathReason.js +1 -0
- package/dist/combat/defensiveWindow.d.ts +5 -0
- package/dist/combat/defensiveWindow.js +5 -0
- package/dist/combat/dotField.d.ts +5 -1
- package/dist/combat/dotField.js +5 -1
- package/dist/combat/downed.d.ts +5 -0
- package/dist/combat/downed.js +5 -0
- package/dist/combat/effects.d.ts +5 -0
- package/dist/combat/effects.js +5 -0
- package/dist/combat/encounterSequence.d.ts +258 -0
- package/dist/combat/encounterSequence.js +426 -0
- package/dist/combat/hitReaction.d.ts +57 -1
- package/dist/combat/hitReaction.js +45 -5
- package/dist/combat/magazine.d.ts +54 -0
- package/dist/combat/magazine.js +96 -0
- package/dist/combat/projectiles.d.ts +5 -0
- package/dist/combat/projectiles.js +32 -14
- package/dist/combat/receivedDamage.d.ts +117 -0
- package/dist/combat/receivedDamage.js +92 -0
- package/dist/combat/regenShield.d.ts +5 -1
- package/dist/combat/regenShield.js +5 -1
- package/dist/combat/renderCues.d.ts +51 -0
- package/dist/combat/renderCues.js +44 -0
- package/dist/combat/resourcePool.d.ts +5 -0
- package/dist/combat/resourcePool.js +5 -0
- package/dist/combat/rewardAllocation.d.ts +121 -0
- package/dist/combat/rewardAllocation.js +251 -0
- package/dist/combat/shotOrigin.d.ts +18 -1
- package/dist/combat/shotOrigin.js +39 -0
- package/dist/combat/statusApplication.d.ts +96 -0
- package/dist/combat/statusApplication.js +81 -0
- package/dist/combat/telegraph.d.ts +11 -2
- package/dist/combat/telegraph.js +11 -2
- package/dist/combat/thresholdCrossings.d.ts +85 -0
- package/dist/combat/thresholdCrossings.js +116 -0
- package/dist/combat.d.ts +35 -0
- package/dist/combat.js +35 -0
- package/dist/commands/commandRegistry.d.ts +11 -0
- package/dist/commands/commandRegistry.js +9 -2
- package/dist/crafting/crop.d.ts +18 -0
- package/dist/crafting/crop.js +18 -0
- package/dist/crafting/production.d.ts +5 -0
- package/dist/crafting/production.js +5 -0
- package/dist/devtools/controls.d.ts +38 -0
- package/dist/devtools/controls.js +181 -0
- package/dist/devtools/devtools.d.ts +5 -197
- package/dist/devtools/devtools.js +38 -774
- package/dist/devtools/discover.d.ts +32 -0
- package/dist/devtools/discover.js +240 -0
- package/dist/devtools/fallbackSeams.d.ts +50 -0
- package/dist/devtools/fallbackSeams.js +111 -0
- package/dist/devtools/frame.d.ts +15 -0
- package/dist/devtools/frame.js +247 -0
- package/dist/devtools/logs.d.ts +15 -0
- package/dist/devtools/logs.js +86 -0
- package/dist/devtools/overrides.d.ts +16 -0
- package/dist/devtools/overrides.js +66 -0
- package/dist/devtools/rewriteTunables.d.ts +17 -0
- package/dist/devtools/rewriteTunables.js +276 -0
- package/dist/devtools/saveEndpoint.d.ts +46 -0
- package/dist/devtools/saveEndpoint.js +48 -0
- package/dist/devtools/transformTunables.d.ts +3 -0
- package/dist/devtools/transformTunables.js +3 -0
- package/dist/devtools/tunableSchema.d.ts +31 -0
- package/dist/devtools/tunableSchema.js +31 -0
- package/dist/devtools/types.d.ts +212 -0
- package/dist/devtools/types.js +1 -0
- package/dist/economy/auctionBook.d.ts +122 -0
- package/dist/economy/auctionBook.js +213 -0
- package/dist/economy/currency.d.ts +12 -1
- package/dist/economy/currency.js +12 -1
- package/dist/economy/listingBook.d.ts +91 -0
- package/dist/economy/listingBook.js +144 -0
- package/dist/economy/priceHistory.d.ts +44 -0
- package/dist/economy/priceHistory.js +89 -0
- package/dist/economy/resourceLedger.d.ts +222 -0
- package/dist/economy/resourceLedger.js +353 -0
- package/dist/economy/sharedWallet.d.ts +14 -0
- package/dist/economy/sharedWallet.js +14 -0
- package/dist/economy/techTree.d.ts +12 -0
- package/dist/economy/techTree.js +12 -0
- package/dist/economy/unlockPoints.d.ts +92 -0
- package/dist/economy/unlockPoints.js +103 -0
- package/dist/economy/wallet.d.ts +26 -2
- package/dist/economy/wallet.js +35 -6
- package/dist/editor/commandApply.d.ts +5 -0
- package/dist/editor/commandApply.js +755 -0
- package/dist/editor/commands.d.ts +235 -7
- package/dist/editor/commands.js +82 -124
- package/dist/editor/directives.d.ts +94 -0
- package/dist/editor/directives.js +206 -0
- package/dist/editor/document.d.ts +194 -13
- package/dist/editor/document.js +1166 -19
- package/dist/editor/entityCatalog.d.ts +42 -0
- package/dist/editor/entityCatalog.js +101 -0
- package/dist/editor/environment.d.ts +74 -0
- package/dist/editor/environment.js +169 -0
- package/dist/editor/grid.d.ts +229 -0
- package/dist/editor/grid.js +366 -0
- package/dist/editor/gridAdapters.d.ts +80 -0
- package/dist/editor/gridAdapters.js +134 -0
- package/dist/editor/index.d.ts +98 -6
- package/dist/editor/index.js +13 -2
- package/dist/editor/liveSync.d.ts +127 -0
- package/dist/editor/liveSync.js +249 -0
- package/dist/editor/minimap.d.ts +31 -0
- package/dist/editor/minimap.js +73 -0
- package/dist/editor/runtimeInspector.d.ts +88 -0
- package/dist/editor/runtimeInspector.js +239 -0
- package/dist/editor/streamer.d.ts +66 -0
- package/dist/editor/streamer.js +68 -0
- package/dist/editor/types.d.ts +250 -1
- package/dist/editor/world.d.ts +136 -0
- package/dist/editor/world.js +303 -0
- package/dist/faction/reputation.d.ts +5 -0
- package/dist/faction/reputation.js +5 -0
- package/dist/format/distance.d.ts +17 -0
- package/dist/format/distance.js +18 -0
- package/dist/format/duration.d.ts +27 -0
- package/dist/format/duration.js +45 -0
- package/dist/format/speed.d.ts +17 -0
- package/dist/format/speed.js +25 -0
- package/dist/game/breeding.d.ts +161 -0
- package/dist/game/breeding.js +181 -0
- package/dist/game/cameraConfig.d.ts +451 -0
- package/dist/game/cameraConfig.js +1 -0
- package/dist/game/connectedPlayers.d.ts +6 -4
- package/dist/game/connectedPlayers.js +2 -2
- package/dist/game/cosmetics.d.ts +9 -0
- package/dist/game/cosmetics.js +16 -0
- package/dist/game/defineGame.d.ts +110 -5
- package/dist/game/defineGame.js +49 -4
- package/dist/game/defineSystem.d.ts +90 -0
- package/dist/game/defineSystem.js +47 -0
- package/dist/game/dialogue.d.ts +33 -0
- package/dist/game/dialogue.js +21 -0
- package/dist/game/events.d.ts +63 -13
- package/dist/game/events.js +5 -0
- package/dist/game/feed.d.ts +33 -0
- package/dist/game/feed.js +35 -2
- package/dist/game/gamePhase.d.ts +11 -0
- package/dist/game/gamePhase.js +16 -0
- package/dist/game/leaderboard.d.ts +5 -0
- package/dist/game/leaderboard.js +5 -0
- package/dist/game/loadout.d.ts +5 -0
- package/dist/game/loadout.js +5 -0
- package/dist/game/lootFilter.d.ts +2 -0
- package/dist/game/lootFilter.js +2 -0
- package/dist/game/lootPipeline.d.ts +164 -0
- package/dist/game/lootPipeline.js +216 -0
- package/dist/game/lootTable.d.ts +19 -2
- package/dist/game/lootTable.js +15 -5
- package/dist/game/objectives.d.ts +43 -0
- package/dist/game/objectives.js +36 -0
- package/dist/game/paramLayers.d.ts +148 -0
- package/dist/game/paramLayers.js +185 -0
- package/dist/game/ping.d.ts +5 -0
- package/dist/game/ping.js +5 -0
- package/dist/game/playableGame.d.ts +116 -432
- package/dist/game/playableGame.js +1 -1
- package/dist/game/progression.d.ts +35 -0
- package/dist/game/progression.js +19 -0
- package/dist/game/quest.d.ts +8 -0
- package/dist/game/quest.js +30 -3
- package/dist/game/race.d.ts +141 -0
- package/dist/game/race.js +169 -0
- package/dist/game/recordBook.d.ts +3 -1
- package/dist/game/recordBook.js +4 -1
- package/dist/game/ruleSelection.d.ts +75 -0
- package/dist/game/ruleSelection.js +127 -0
- package/dist/game/runDraft.d.ts +5 -0
- package/dist/game/runDraft.js +5 -0
- package/dist/game/saveStore.d.ts +111 -0
- package/dist/game/saveStore.js +312 -0
- package/dist/game/snapshotHistory.d.ts +67 -0
- package/dist/game/snapshotHistory.js +95 -0
- package/dist/game/social.d.ts +38 -1
- package/dist/game/social.js +71 -0
- package/dist/game/spawnPoints.d.ts +5 -0
- package/dist/game/spawnPoints.js +5 -0
- package/dist/game/systemRuntime.d.ts +50 -0
- package/dist/game/systemRuntime.js +157 -0
- package/dist/game/systemSchedule.d.ts +72 -0
- package/dist/game/systemSchedule.js +242 -0
- package/dist/game/toasts.d.ts +43 -0
- package/dist/game/toasts.js +44 -0
- package/dist/game/trade.d.ts +10 -0
- package/dist/game/trade.js +10 -0
- package/dist/game/tribe.d.ts +184 -0
- package/dist/game/tribe.js +432 -0
- package/dist/game/unlocks.d.ts +8 -0
- package/dist/game/unlocks.js +16 -0
- package/dist/game/vfxInstance.d.ts +138 -0
- package/dist/game/vfxInstance.js +96 -0
- package/dist/game/worldItem.d.ts +17 -4
- package/dist/game/worldItem.js +17 -4
- package/dist/gameplay.d.ts +93 -0
- package/dist/gameplay.js +93 -0
- package/dist/index.d.ts +5 -14
- package/dist/index.js +5 -14
- package/dist/input/actionBindings.d.ts +23 -6
- package/dist/input/actionBindings.js +23 -6
- package/dist/input/axisInput.d.ts +7 -2
- package/dist/input/axisInput.js +7 -2
- package/dist/input/controlGroups.d.ts +67 -0
- package/dist/input/controlGroups.js +41 -0
- package/dist/input/touchScheme.d.ts +82 -6
- package/dist/input/touchScheme.js +123 -10
- package/dist/interaction/lockpick.d.ts +61 -0
- package/dist/interaction/lockpick.js +168 -0
- package/dist/interaction/proximityPrompt.d.ts +2 -0
- package/dist/interaction/proximityPrompt.js +2 -0
- package/dist/interaction/qte.d.ts +5 -0
- package/dist/interaction/qte.js +5 -0
- package/dist/interaction/skillCheck.d.ts +5 -0
- package/dist/interaction/skillCheck.js +5 -0
- package/dist/inventory/encumbrance.d.ts +69 -0
- package/dist/inventory/encumbrance.js +68 -0
- package/dist/inventory/inventoryModel.d.ts +12 -0
- package/dist/inventory/inventoryModel.js +12 -0
- package/dist/inventory/shapedGrid.d.ts +16 -0
- package/dist/inventory/shapedGrid.js +16 -0
- package/dist/inventory/slotModel.d.ts +10 -0
- package/dist/inventory/slotModel.js +10 -0
- package/dist/item/durability.d.ts +5 -0
- package/dist/item/durability.js +6 -3
- package/dist/item/itemIdentity.d.ts +171 -0
- package/dist/item/itemIdentity.js +138 -0
- package/dist/item/itemInstanceRegistry.d.ts +32 -0
- package/dist/item/itemInstanceRegistry.js +34 -0
- package/dist/item/itemgen.d.ts +163 -0
- package/dist/item/itemgen.js +151 -0
- package/dist/item/modularItem.d.ts +5 -0
- package/dist/item/modularItem.js +5 -0
- package/dist/item/use.d.ts +5 -0
- package/dist/item/use.js +5 -0
- package/dist/item/useBehavior.d.ts +142 -0
- package/dist/item/useBehavior.js +105 -0
- package/dist/item/weapon.d.ts +5 -0
- package/dist/item/weapon.js +5 -0
- package/dist/math/scalar.d.ts +25 -0
- package/dist/math/scalar.js +47 -0
- package/dist/meta/changelog.d.ts +4 -1
- package/dist/meta/changelog.js +39 -2
- package/dist/movement/avoidance.d.ts +45 -0
- package/dist/movement/avoidance.js +123 -0
- package/dist/movement/cameraRig.d.ts +8 -0
- package/dist/movement/cameraRig.js +8 -0
- package/dist/movement/dash.d.ts +11 -0
- package/dist/movement/dash.js +11 -0
- package/dist/movement/formation.d.ts +135 -0
- package/dist/movement/formation.js +194 -0
- package/dist/movement/glideModel.d.ts +5 -0
- package/dist/movement/glideModel.js +5 -0
- package/dist/movement/grappleSwing.d.ts +5 -0
- package/dist/movement/grappleSwing.js +5 -0
- package/dist/movement/leaderTrail.d.ts +5 -0
- package/dist/movement/leaderTrail.js +5 -0
- package/dist/movement/movementModel.d.ts +50 -9
- package/dist/movement/movementModel.js +75 -29
- package/dist/movement/playerMovement.js +167 -12
- package/dist/movement/poseState.d.ts +13 -0
- package/dist/movement/poseState.js +16 -0
- package/dist/movement/steering.d.ts +8 -0
- package/dist/movement/steering.js +18 -0
- package/dist/multiplayer/combatSnapshot.d.ts +3 -0
- package/dist/multiplayer/combatSnapshot.js +16 -8
- package/dist/multiplayer/lagCompensation.d.ts +5 -0
- package/dist/multiplayer/lagCompensation.js +5 -0
- package/dist/multiplayer/presenceModel.d.ts +11 -1
- package/dist/multiplayer/presenceModel.js +17 -1
- package/dist/multiplayer/simultaneousCommit.d.ts +3 -0
- package/dist/multiplayer/simultaneousCommit.js +3 -0
- package/dist/multiplayer.d.ts +11 -0
- package/dist/multiplayer.js +11 -0
- package/dist/nav/pathFollow.d.ts +57 -0
- package/dist/nav/pathFollow.js +109 -0
- package/dist/orders/orderKinds.d.ts +156 -0
- package/dist/orders/orderKinds.js +197 -0
- package/dist/orders/orderQueue.d.ts +208 -0
- package/dist/orders/orderQueue.js +211 -0
- package/dist/physics/drivableVehicle.d.ts +31 -0
- package/dist/physics/drivableVehicle.js +16 -0
- package/dist/physics/flightDynamics.d.ts +82 -0
- package/dist/physics/flightDynamics.js +165 -0
- package/dist/physics/gravityField.d.ts +25 -0
- package/dist/physics/gravityField.js +41 -0
- package/dist/physics/kinematicVehicle.d.ts +108 -1
- package/dist/physics/kinematicVehicle.js +212 -15
- package/dist/physics/physicsWorld.d.ts +50 -12
- package/dist/physics/physicsWorld.js +120 -122
- package/dist/physics/radialImpulse.d.ts +25 -0
- package/dist/physics/radialImpulse.js +27 -0
- package/dist/physics/vehicleObstacles.d.ts +44 -0
- package/dist/physics/vehicleObstacles.js +115 -0
- package/dist/procedural.d.ts +3 -0
- package/dist/procedural.js +3 -0
- package/dist/progression/statGraph.d.ts +116 -0
- package/dist/progression/statGraph.js +318 -0
- package/dist/puzzle/cellGrid.d.ts +9 -0
- package/dist/puzzle/cellGrid.js +9 -0
- package/dist/puzzle/fallingPiece.d.ts +9 -0
- package/dist/puzzle/fallingPiece.js +9 -0
- package/dist/puzzle/nonogram.d.ts +39 -0
- package/dist/puzzle/nonogram.js +136 -0
- package/dist/random/nameGen.d.ts +5 -0
- package/dist/random/nameGen.js +5 -0
- package/dist/random/pick.d.ts +8 -0
- package/dist/random/pick.js +31 -0
- package/dist/random/rng.d.ts +26 -1
- package/dist/random/rng.js +32 -9
- package/dist/random/seedLink.d.ts +4 -0
- package/dist/random/seedLink.js +4 -0
- package/dist/relation/keyedValues.d.ts +54 -0
- package/dist/relation/keyedValues.js +115 -0
- package/dist/relation/thresholds.d.ts +62 -0
- package/dist/relation/thresholds.js +62 -0
- package/dist/render/color.d.ts +12 -0
- package/dist/render/color.js +26 -0
- package/dist/render/lookPreset.d.ts +41 -0
- package/dist/render/lookPreset.js +29 -0
- package/dist/render/postProcessing.d.ts +20 -0
- package/dist/render/postProcessing.js +21 -1
- package/dist/rules/predicate.d.ts +53 -0
- package/dist/rules/predicate.js +64 -0
- package/dist/rules/ruleEffects.d.ts +38 -0
- package/dist/rules/ruleEffects.js +37 -0
- package/dist/rules/triggeredRules.d.ts +160 -0
- package/dist/rules/triggeredRules.js +241 -0
- package/dist/runtime/adapter.d.ts +55 -3
- package/dist/runtime/adapter.js +57 -1
- package/dist/runtime/cameraDirector.d.ts +1 -0
- package/dist/runtime/cameraDirector.js +1 -0
- package/dist/runtime/commandRunner.d.ts +1 -0
- package/dist/runtime/commandRunner.js +1 -0
- package/dist/runtime/context/combat.d.ts +51 -0
- package/dist/runtime/context/combat.js +130 -0
- package/dist/runtime/context/combatFx.d.ts +23 -0
- package/dist/runtime/context/combatFx.js +161 -0
- package/dist/runtime/context/deathLoot.d.ts +30 -0
- package/dist/runtime/context/deathLoot.js +39 -0
- package/dist/runtime/context/player.d.ts +48 -0
- package/dist/runtime/context/player.js +125 -0
- package/dist/runtime/context/registries.d.ts +13 -0
- package/dist/runtime/context/registries.js +84 -0
- package/dist/runtime/context/scene.d.ts +59 -0
- package/dist/runtime/context/scene.js +291 -0
- package/dist/runtime/context/snapshotCodecs.d.ts +12 -0
- package/dist/runtime/context/snapshotCodecs.js +26 -0
- package/dist/runtime/context/worldItems.d.ts +21 -0
- package/dist/runtime/context/worldItems.js +37 -0
- package/dist/runtime/descriptors/baseline.d.ts +48 -0
- package/dist/runtime/descriptors/baseline.js +157 -0
- package/dist/runtime/descriptors/features.d.ts +79 -0
- package/dist/runtime/descriptors/features.js +299 -0
- package/dist/runtime/gameContext.d.ts +2 -327
- package/dist/runtime/gameContext.js +273 -778
- package/dist/runtime/gameContextTypes.d.ts +467 -0
- package/dist/runtime/gameContextTypes.js +1 -0
- package/dist/runtime/gameRuntime.d.ts +1 -0
- package/dist/runtime/gameRuntime.js +1 -0
- package/dist/runtime/headlessRunner.d.ts +62 -0
- package/dist/runtime/headlessRunner.js +45 -0
- package/dist/runtime/hostPersistence.d.ts +12 -0
- package/dist/runtime/hostPersistence.js +12 -0
- package/dist/runtime/hostPolicy.d.ts +51 -0
- package/dist/runtime/hostPolicy.js +68 -0
- package/dist/runtime/hostedGameRunner.d.ts +11 -4
- package/dist/runtime/hostedGameRunner.js +27 -3
- package/dist/runtime/hostedWorldSession.d.ts +15 -5
- package/dist/runtime/hostedWorldSession.js +12 -4
- package/dist/runtime/inputSnapshot.d.ts +8 -3
- package/dist/runtime/inputSnapshot.js +6 -2
- package/dist/runtime/motionIntents.d.ts +11 -2
- package/dist/runtime/motionIntents.js +16 -2
- package/dist/runtime/perContext.d.ts +15 -0
- package/dist/runtime/perContext.js +21 -0
- package/dist/runtime/runtimeSave.d.ts +79 -0
- package/dist/runtime/runtimeSave.js +105 -0
- package/dist/runtime/save.d.ts +4 -0
- package/dist/runtime/save.js +4 -0
- package/dist/runtime/snapshot.d.ts +7 -0
- package/dist/runtime/snapshot.js +7 -0
- package/dist/runtime/visibility.d.ts +2 -1
- package/dist/runtime/visibility.js +2 -1
- package/dist/runtime/worldChannel.d.ts +7 -3
- package/dist/runtime/worldChannel.js +51 -6
- package/dist/runtime/worldMirror.d.ts +14 -2
- package/dist/runtime/worldMirror.js +15 -2
- package/dist/runtime/worldProjection.d.ts +47 -0
- package/dist/runtime/worldProjection.js +52 -0
- package/dist/runtime/worldReplication.d.ts +30 -7
- package/dist/runtime/worldReplication.js +41 -9
- package/dist/runtime/worldSnapshot.d.ts +42 -3
- package/dist/runtime/worldSnapshot.js +34 -7
- package/dist/scene/assetCatalog.d.ts +26 -0
- package/dist/scene/assetCatalog.js +4 -0
- package/dist/scene/assetDiagnostics.d.ts +69 -0
- package/dist/scene/assetDiagnostics.js +110 -0
- package/dist/scene/assetGenerator.d.ts +65 -0
- package/dist/scene/assetGenerator.js +64 -0
- package/dist/scene/assetSpace.d.ts +137 -0
- package/dist/scene/assetSpace.js +257 -0
- package/dist/scene/authoredTriggers.d.ts +219 -0
- package/dist/scene/authoredTriggers.js +454 -0
- package/dist/scene/behaviorRuntime.d.ts +75 -0
- package/dist/scene/behaviorRuntime.js +217 -0
- package/dist/scene/behaviors.d.ts +14 -2
- package/dist/scene/behaviors.js +7 -2
- package/dist/scene/bodyBind.d.ts +60 -0
- package/dist/scene/bodyBind.js +51 -0
- package/dist/scene/builtinSceneKinds.d.ts +5 -0
- package/dist/scene/builtinSceneKinds.js +67 -0
- package/dist/scene/colliders.d.ts +71 -1
- package/dist/scene/colliders.js +145 -1
- package/dist/scene/collisionMesh.d.ts +94 -0
- package/dist/scene/collisionMesh.js +699 -0
- package/dist/scene/companion.d.ts +147 -0
- package/dist/scene/companion.js +193 -0
- package/dist/scene/entityStats.d.ts +18 -11
- package/dist/scene/entityStats.js +21 -16
- package/dist/scene/entityStore.d.ts +12 -1
- package/dist/scene/entityStore.js +15 -0
- package/dist/scene/facing.d.ts +18 -0
- package/dist/scene/facing.js +26 -0
- package/dist/scene/modelSockets.d.ts +33 -0
- package/dist/scene/modelSockets.js +29 -0
- package/dist/scene/objectQuery.d.ts +2 -0
- package/dist/scene/objectQuery.js +2 -0
- package/dist/scene/objectStore.d.ts +4 -0
- package/dist/scene/objectStore.js +6 -0
- package/dist/scene/possession.d.ts +8 -0
- package/dist/scene/possession.js +14 -0
- package/dist/scene/roster.d.ts +3 -0
- package/dist/scene/roster.js +12 -0
- package/dist/scene/sceneKinds.d.ts +256 -0
- package/dist/scene/sceneKinds.js +218 -0
- package/dist/scene/sceneOwnership.d.ts +169 -0
- package/dist/scene/sceneOwnership.js +179 -0
- package/dist/scene/sceneRaycast.js +15 -0
- package/dist/scene/selectionBookmarks.d.ts +93 -0
- package/dist/scene/selectionBookmarks.js +122 -0
- package/dist/scene/vehicleSeat.d.ts +68 -0
- package/dist/scene/vehicleSeat.js +59 -0
- package/dist/sensor/concealment.d.ts +3 -0
- package/dist/sensor/concealment.js +3 -0
- package/dist/sensor/freezeMonitor.d.ts +1 -0
- package/dist/sensor/freezeMonitor.js +1 -0
- package/dist/sensor/frustumSensor.d.ts +7 -3
- package/dist/sensor/frustumSensor.js +7 -3
- package/dist/sensor/hiddenStateProbe.d.ts +5 -2
- package/dist/sensor/hiddenStateProbe.js +5 -2
- package/dist/sensor/recordingBuffer.d.ts +2 -1
- package/dist/sensor/recordingBuffer.js +2 -1
- package/dist/sensor/replayLoop.d.ts +6 -2
- package/dist/sensor/replayLoop.js +6 -2
- package/dist/sensor/revealQuery.d.ts +2 -1
- package/dist/sensor/revealQuery.js +2 -1
- package/dist/sensor/visionCone.d.ts +10 -3
- package/dist/sensor/visionCone.js +10 -3
- package/dist/session/contestedChannel.d.ts +1 -0
- package/dist/session/contestedChannel.js +1 -0
- package/dist/session/extraction.d.ts +1 -0
- package/dist/session/extraction.js +1 -0
- package/dist/session/roles.d.ts +6 -0
- package/dist/session/roles.js +6 -0
- package/dist/session/roundState.d.ts +8 -0
- package/dist/session/roundState.js +2 -0
- package/dist/settings/settingsModel.d.ts +1 -0
- package/dist/settings/settingsModel.js +1 -0
- package/dist/stats/accumulatorMeter.d.ts +6 -0
- package/dist/stats/accumulatorMeter.js +6 -0
- package/dist/stats/eventMeter.d.ts +5 -0
- package/dist/stats/eventMeter.js +5 -0
- package/dist/stats/rollCheck.d.ts +5 -0
- package/dist/stats/rollCheck.js +5 -0
- package/dist/stats/spawnLevelStats.d.ts +110 -0
- package/dist/stats/spawnLevelStats.js +140 -0
- package/dist/stats/statModifiers.d.ts +5 -0
- package/dist/stats/statModifiers.js +5 -0
- package/dist/stats/statPool.d.ts +70 -0
- package/dist/stats/statPool.js +59 -0
- package/dist/store/changeSignal.d.ts +3 -0
- package/dist/store/changeSignal.js +2 -0
- package/dist/store/defineKeyedStore.d.ts +38 -0
- package/dist/store/defineKeyedStore.js +42 -0
- package/dist/store/defineStore.d.ts +33 -0
- package/dist/store/defineStore.js +35 -0
- package/dist/store/observableKeyedStore.d.ts +7 -0
- package/dist/store/observableKeyedStore.js +35 -2
- package/dist/survival/decayMeter.d.ts +55 -0
- package/dist/survival/decayMeter.js +130 -57
- package/dist/survival/moodle.d.ts +2 -0
- package/dist/survival/regionHealth.d.ts +6 -0
- package/dist/survival/regionHealth.js +6 -3
- package/dist/tactics/fallingGrid.d.ts +4 -2
- package/dist/tactics/fallingGrid.js +4 -2
- package/dist/tactics/predictiveQuery.d.ts +3 -0
- package/dist/tactics/predictiveQuery.js +3 -0
- package/dist/tactics/snapshot.d.ts +2 -0
- package/dist/tactics/snapshot.js +2 -0
- package/dist/tactics/surface.d.ts +1 -0
- package/dist/tactics/surface.js +1 -0
- package/dist/tactics/tacticalGrid.d.ts +1 -0
- package/dist/tactics/tacticalGrid.js +1 -0
- package/dist/time/beatClock.d.ts +14 -4
- package/dist/time/beatClock.js +14 -4
- package/dist/time/calendarClock.d.ts +3 -0
- package/dist/time/calendarClock.js +3 -0
- package/dist/time/idleProgress.d.ts +4 -0
- package/dist/time/idleProgress.js +4 -0
- package/dist/time/simClock.d.ts +2 -0
- package/dist/time/simClock.js +20 -5
- package/dist/ui/actionModel.d.ts +110 -0
- package/dist/ui/actionModel.js +159 -0
- package/dist/ui/gameLayout.d.ts +30 -11
- package/dist/ui/gameLayout.js +30 -11
- package/dist/ui/hudDocument.d.ts +114 -0
- package/dist/ui/hudDocument.js +220 -0
- package/dist/ui/hudLayout.d.ts +38 -1
- package/dist/ui/hudLayout.js +220 -17
- package/dist/ui/selectionModel.d.ts +92 -0
- package/dist/ui/selectionModel.js +88 -0
- package/dist/ui/tooltipModel.d.ts +63 -0
- package/dist/ui/tooltipModel.js +82 -0
- package/dist/ui.d.ts +15 -0
- package/dist/ui.js +15 -0
- package/dist/visibility/bounds.d.ts +8 -1
- package/dist/visibility/bounds.js +8 -1
- package/dist/visibility/frustum.d.ts +12 -3
- package/dist/visibility/frustum.js +12 -3
- package/dist/work/jobQueue.d.ts +201 -0
- package/dist/work/jobQueue.js +253 -0
- package/dist/work/unitTraining.d.ts +58 -0
- package/dist/work/unitTraining.js +52 -0
- package/dist/world/authoredEntities.d.ts +29 -0
- package/dist/world/authoredEntities.js +29 -0
- package/dist/world/authoredObjects.d.ts +72 -0
- package/dist/world/authoredObjects.js +81 -0
- package/dist/world/authoredSpawn.d.ts +39 -0
- package/dist/world/authoredSpawn.js +37 -0
- package/dist/world/buildSockets.d.ts +152 -0
- package/dist/world/buildSockets.js +188 -0
- package/dist/world/buildingGenerator.d.ts +18 -0
- package/dist/world/buildingGenerator.js +62 -0
- package/dist/world/buildings.d.ts +5 -0
- package/dist/world/buildings.js +5 -0
- package/dist/world/catenary.d.ts +22 -0
- package/dist/world/catenary.js +69 -0
- package/dist/world/cityBlocks.d.ts +152 -0
- package/dist/world/cityBlocks.js +670 -0
- package/dist/world/cityContent.d.ts +77 -0
- package/dist/world/cityContent.js +261 -0
- package/dist/world/cityGeometry.d.ts +114 -0
- package/dist/world/cityGeometry.js +573 -0
- package/dist/world/cityKind.d.ts +314 -0
- package/dist/world/cityKind.js +1578 -0
- package/dist/world/features.d.ts +133 -10
- package/dist/world/features.js +66 -6
- package/dist/world/footprintGrid.d.ts +59 -0
- package/dist/world/footprintGrid.js +141 -0
- package/dist/world/geometry.d.ts +64 -0
- package/dist/world/geometry.js +94 -0
- package/dist/world/grassKind.d.ts +51 -0
- package/dist/world/grassKind.js +101 -0
- package/dist/world/markers.d.ts +50 -4
- package/dist/world/markers.js +49 -0
- package/dist/world/massing.js +1 -1
- package/dist/world/minimapBake.d.ts +78 -0
- package/dist/world/minimapBake.js +208 -0
- package/dist/world/minimapTrack.d.ts +17 -0
- package/dist/world/minimapTrack.js +22 -0
- package/dist/world/pathInstances.d.ts +27 -0
- package/dist/world/pathInstances.js +27 -0
- package/dist/world/pathNetwork.d.ts +159 -0
- package/dist/world/pathNetwork.js +684 -0
- package/dist/world/pathTerrain.d.ts +80 -0
- package/dist/world/pathTerrain.js +142 -0
- package/dist/world/place.d.ts +166 -0
- package/dist/world/place.js +96 -0
- package/dist/world/placeAsset.d.ts +81 -0
- package/dist/world/placeAsset.js +79 -0
- package/dist/world/placement.d.ts +4 -0
- package/dist/world/placement.js +4 -0
- package/dist/world/placementController.d.ts +6 -0
- package/dist/world/placementController.js +6 -0
- package/dist/world/poleLineKind.d.ts +40 -0
- package/dist/world/poleLineKind.js +97 -0
- package/dist/world/polyline.d.ts +34 -0
- package/dist/world/polyline.js +88 -0
- package/dist/world/resourceNode.d.ts +109 -0
- package/dist/world/resourceNode.js +140 -0
- package/dist/world/roads.d.ts +8 -0
- package/dist/world/roads.js +38 -0
- package/dist/world/scatter.js +2 -20
- package/dist/world/scatterRegion.d.ts +164 -0
- package/dist/world/scatterRegion.js +409 -0
- package/dist/world/sceneShapes.d.ts +43 -0
- package/dist/world/sceneShapes.js +1 -0
- package/dist/world/segment.d.ts +27 -0
- package/dist/world/segment.js +43 -0
- package/dist/world/soilKind.d.ts +48 -0
- package/dist/world/soilKind.js +92 -0
- package/dist/world/spatialSample.d.ts +241 -0
- package/dist/world/spatialSample.js +465 -0
- package/dist/world/streets.d.ts +29 -0
- package/dist/world/streets.js +55 -0
- package/dist/world/terraform.d.ts +213 -1
- package/dist/world/terraform.js +627 -22
- package/dist/world/terrain.d.ts +164 -20
- package/dist/world/terrain.js +325 -41
- package/dist/world/terrainGuides.d.ts +182 -0
- package/dist/world/terrainGuides.js +343 -0
- package/dist/world/vec2.d.ts +81 -0
- package/dist/world/vec2.js +128 -0
- package/dist/world/vec3.d.ts +49 -0
- package/dist/world/vec3.js +76 -0
- package/dist/world/vegetation.d.ts +71 -0
- package/dist/world/vegetation.js +151 -0
- package/dist/world/visibilityField.d.ts +154 -0
- package/dist/world/visibilityField.js +271 -0
- package/dist/world/volumetricClouds.d.ts +52 -0
- package/dist/world/volumetricClouds.js +43 -0
- package/dist/world/walls.d.ts +9 -0
- package/dist/world/walls.js +9 -0
- package/dist/world/waterKind.d.ts +55 -0
- package/dist/world/waterKind.js +99 -0
- package/dist/world.d.ts +141 -0
- package/dist/world.js +141 -0
- package/package.json +32 -8
- package/skills/game-design/SKILL.md +28 -0
- package/skills/game-design/agents/openai.yaml +4 -0
- package/skills/game-design/references/application-playbook.md +170 -0
- package/skills/game-design/references/field-guide.md +288 -0
- package/skills/jgengine/SKILL.md +54 -0
- package/skills/jgengine/api.md +527 -0
- package/skills/jgengine/capabilities.md +131 -0
- package/skills/jgengine/recipes/minimal-game.md +88 -0
- package/skills/jgengine-combat/SKILL.md +38 -0
- package/skills/jgengine-combat/api.md +585 -0
- package/skills/jgengine-combat/capabilities.md +213 -0
- package/skills/jgengine-combat/recipes/portable-stat-pools.md +122 -0
- package/skills/jgengine-combat/reference.md +108 -0
- package/skills/jgengine-gameplay/SKILL.md +39 -0
- package/skills/jgengine-gameplay/api.md +1920 -0
- package/skills/jgengine-gameplay/capabilities.md +454 -0
- package/skills/jgengine-gameplay/reference-systems.md +56 -0
- package/skills/jgengine-world/SKILL.md +51 -0
- package/skills/jgengine-world/api.md +3056 -0
- package/skills/jgengine-world/capabilities.md +476 -0
- package/skills/jgengine-world/recipes/commanding-entities.md +128 -0
- package/skills/jgengine-world/reference.md +261 -0
- package/dist/cartridge/runtime.d.ts +0 -15
- package/dist/cartridge/runtime.js +0 -556
- package/dist/cartridge/spec.d.ts +0 -188
- package/dist/cartridge/spec.js +0 -19
- package/dist/cartridge/validate.d.ts +0 -2
- package/dist/cartridge/validate.js +0 -78
- package/dist/store/engineStore.d.ts +0 -22
- package/dist/store/engineStore.js +0 -50
- package/dist/store/features.d.ts +0 -10
- package/dist/store/features.js +0 -23
- package/llms.txt +0 -5389
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
/** @internal */
|
|
1
2
|
export function createSlots(size) {
|
|
2
3
|
return new Array(Math.max(0, size)).fill(null);
|
|
3
4
|
}
|
|
5
|
+
/** @internal */
|
|
4
6
|
export function normalizeSlots(values, size) {
|
|
5
7
|
const grid = createSlots(size);
|
|
6
8
|
for (let index = 0; index < size; index++)
|
|
@@ -10,6 +12,7 @@ export function normalizeSlots(values, size) {
|
|
|
10
12
|
function inRange(grid, index) {
|
|
11
13
|
return Number.isInteger(index) && index >= 0 && index < grid.length;
|
|
12
14
|
}
|
|
15
|
+
/** @internal */
|
|
13
16
|
export function placeAt(grid, index, value) {
|
|
14
17
|
if (!inRange(grid, index))
|
|
15
18
|
return { status: "rejected", reason: "invalid-slot" };
|
|
@@ -19,6 +22,7 @@ export function placeAt(grid, index, value) {
|
|
|
19
22
|
next[index] = value;
|
|
20
23
|
return { status: "ok", grid: next };
|
|
21
24
|
}
|
|
25
|
+
/** @internal */
|
|
22
26
|
export function removeAt(grid, index) {
|
|
23
27
|
if (!inRange(grid, index))
|
|
24
28
|
return { status: "rejected", reason: "invalid-slot" };
|
|
@@ -28,6 +32,7 @@ export function removeAt(grid, index) {
|
|
|
28
32
|
next[index] = null;
|
|
29
33
|
return { status: "ok", grid: next };
|
|
30
34
|
}
|
|
35
|
+
/** @internal */
|
|
31
36
|
export function moveSlot(grid, from, to) {
|
|
32
37
|
if (!inRange(grid, from) || !inRange(grid, to))
|
|
33
38
|
return { status: "rejected", reason: "invalid-slot" };
|
|
@@ -39,6 +44,7 @@ export function moveSlot(grid, from, to) {
|
|
|
39
44
|
next[to] = moved;
|
|
40
45
|
return { status: "ok", grid: next };
|
|
41
46
|
}
|
|
47
|
+
/** @internal */
|
|
42
48
|
export function firstEmpty(grid) {
|
|
43
49
|
for (let index = 0; index < grid.length; index++) {
|
|
44
50
|
if (grid[index] === null)
|
|
@@ -46,12 +52,14 @@ export function firstEmpty(grid) {
|
|
|
46
52
|
}
|
|
47
53
|
return null;
|
|
48
54
|
}
|
|
55
|
+
/** @internal */
|
|
49
56
|
export function insertFirst(grid, value) {
|
|
50
57
|
const index = firstEmpty(grid);
|
|
51
58
|
if (index === null)
|
|
52
59
|
return { status: "rejected", reason: "slot-occupied" };
|
|
53
60
|
return placeAt(grid, index, value);
|
|
54
61
|
}
|
|
62
|
+
/** @internal */
|
|
55
63
|
export function compactSlots(grid) {
|
|
56
64
|
const filled = grid.filter((slot) => slot !== null);
|
|
57
65
|
const next = createSlots(grid.length);
|
|
@@ -59,6 +67,7 @@ export function compactSlots(grid) {
|
|
|
59
67
|
next[index] = filled[index];
|
|
60
68
|
return next;
|
|
61
69
|
}
|
|
70
|
+
/** @internal */
|
|
62
71
|
export function countFilled(grid) {
|
|
63
72
|
let count = 0;
|
|
64
73
|
for (const slot of grid)
|
|
@@ -66,6 +75,7 @@ export function countFilled(grid) {
|
|
|
66
75
|
count += 1;
|
|
67
76
|
return count;
|
|
68
77
|
}
|
|
78
|
+
/** @internal */
|
|
69
79
|
export function indexOfSlot(grid, match) {
|
|
70
80
|
for (let index = 0; index < grid.length; index++) {
|
|
71
81
|
const slot = grid[index];
|
|
@@ -33,6 +33,11 @@ export declare function durabilityFraction(state: DurabilityState): number;
|
|
|
33
33
|
export declare function isBroken(state: DurabilityState): boolean;
|
|
34
34
|
export declare function isDisabled(spec: DurabilitySpec, state: DurabilityState): boolean;
|
|
35
35
|
export declare function wearAmount(spec: DurabilitySpec, kind: WearKind): number;
|
|
36
|
+
/**
|
|
37
|
+
* Apply wear to an item, tracking breakage and repair eligibility.
|
|
38
|
+
*
|
|
39
|
+
* @capability durability track item wear, breakage, and repair
|
|
40
|
+
*/
|
|
36
41
|
export declare function applyWear(state: DurabilityState, amount: number): DurabilityState;
|
|
37
42
|
export declare function wear(spec: DurabilitySpec, state: DurabilityState, kind: WearKind, times?: number): DurabilityState;
|
|
38
43
|
export declare function canRepairAt(spec: DurabilitySpec, stationId?: string): boolean;
|
package/dist/item/durability.js
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
return value < min ? min : value > max ? max : value;
|
|
3
|
-
}
|
|
1
|
+
import { clamp } from "../math/scalar.js";
|
|
4
2
|
export function createDurability(spec) {
|
|
5
3
|
const max = Math.max(0, spec.max);
|
|
6
4
|
return { current: max, max };
|
|
@@ -17,6 +15,11 @@ export function isDisabled(spec, state) {
|
|
|
17
15
|
export function wearAmount(spec, kind) {
|
|
18
16
|
return kind === "use" ? spec.wearPerUse ?? 0 : spec.wearPerHit ?? 0;
|
|
19
17
|
}
|
|
18
|
+
/**
|
|
19
|
+
* Apply wear to an item, tracking breakage and repair eligibility.
|
|
20
|
+
*
|
|
21
|
+
* @capability durability track item wear, breakage, and repair
|
|
22
|
+
*/
|
|
20
23
|
export function applyWear(state, amount) {
|
|
21
24
|
if (amount <= 0)
|
|
22
25
|
return state;
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import type { InstalledPart, PartDef } from "./modularItem.js";
|
|
2
|
+
/**
|
|
3
|
+
* The declarative identity of a built modular item: a caller-named family, its
|
|
4
|
+
* provenance tags, and the parts occupying its slots. This is the "what an item
|
|
5
|
+
* is" layer above the raw stat rollup in ./modularItem — a plain, serializable
|
|
6
|
+
* value with no game noun baked in ("gun", "manufacturer", "potion" are all
|
|
7
|
+
* caller data in `family`/`tags`).
|
|
8
|
+
*/
|
|
9
|
+
export interface ItemIdentity {
|
|
10
|
+
family: string;
|
|
11
|
+
tags: readonly string[];
|
|
12
|
+
parts: readonly InstalledPart[];
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* A predicate over an {@link ItemIdentity}, expressed as data so a whole rule
|
|
16
|
+
* set round-trips through JSON. An empty query matches every identity; each
|
|
17
|
+
* present field narrows the match and all present fields must hold (AND).
|
|
18
|
+
*/
|
|
19
|
+
export interface IdentityQuery {
|
|
20
|
+
/** Match only this family id; omit to match any family. */
|
|
21
|
+
family?: string;
|
|
22
|
+
/** Every listed tag must be present on the identity. */
|
|
23
|
+
allTags?: readonly string[];
|
|
24
|
+
/** At least one listed tag must be present on the identity. */
|
|
25
|
+
anyTags?: readonly string[];
|
|
26
|
+
/** A part of this category must occupy some slot. */
|
|
27
|
+
hasCategory?: string;
|
|
28
|
+
/** A part with this id must occupy some slot. */
|
|
29
|
+
hasPart?: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* A rule that requires a second condition to hold whenever the first matches —
|
|
33
|
+
* e.g. "a scoped rifle requires a stock". Checked at completeness time, not
|
|
34
|
+
* during incremental placement, because the `then` side may be satisfied by a
|
|
35
|
+
* part chosen later in a generation pass.
|
|
36
|
+
*/
|
|
37
|
+
export interface RequireRule {
|
|
38
|
+
id: string;
|
|
39
|
+
kind: "require";
|
|
40
|
+
when: IdentityQuery;
|
|
41
|
+
then: IdentityQuery;
|
|
42
|
+
message?: string;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* A rule that forbids a combination — e.g. "an incendiary barrel cannot pair
|
|
46
|
+
* with a cryo core". A forbid rule can never become satisfiable by adding more
|
|
47
|
+
* parts, so it is the check a backtracking generator runs on each candidate.
|
|
48
|
+
*/
|
|
49
|
+
export interface ForbidRule {
|
|
50
|
+
id: string;
|
|
51
|
+
kind: "forbid";
|
|
52
|
+
when: IdentityQuery;
|
|
53
|
+
forbid: IdentityQuery;
|
|
54
|
+
message?: string;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* A cross-slot compatibility rule constraining which part/tag/family
|
|
58
|
+
* combinations a modular item may hold.
|
|
59
|
+
*/
|
|
60
|
+
export type CompatibilityRule = RequireRule | ForbidRule;
|
|
61
|
+
/**
|
|
62
|
+
* A match/set bonus: extra stats granted when enough parts (or a tag) of a
|
|
63
|
+
* given kind are present — e.g. "3 Blackwood parts grant +recoil control".
|
|
64
|
+
* Counting is declarative (`countBy`/`value`) so the whole catalog is data.
|
|
65
|
+
*/
|
|
66
|
+
export interface SetBonus {
|
|
67
|
+
id: string;
|
|
68
|
+
/** Dimension counted for membership: a part category, a part id, or an identity tag. */
|
|
69
|
+
countBy: "category" | "partId" | "tag";
|
|
70
|
+
/** The value counted; membership is the number of matching parts (or 0/1 for a tag). */
|
|
71
|
+
value: string;
|
|
72
|
+
/** Minimum matching count for the bonus to activate. */
|
|
73
|
+
min: number;
|
|
74
|
+
/** Additive stat deltas applied when the bonus is active. */
|
|
75
|
+
stats: Record<string, number>;
|
|
76
|
+
/** Optional name fragment recorded in provenance/UI when active. */
|
|
77
|
+
namePart?: string;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* One failed {@link CompatibilityRule}, carrying the rule id, its kind, and a
|
|
81
|
+
* human-readable message for UI or generator diagnostics.
|
|
82
|
+
*/
|
|
83
|
+
export interface ConstraintViolation {
|
|
84
|
+
ruleId: string;
|
|
85
|
+
kind: "require" | "forbid";
|
|
86
|
+
message: string;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* A part proposed for a slot during generation, before it is committed to an
|
|
90
|
+
* identity. Used by the backtracking contract to test a placement in isolation.
|
|
91
|
+
*/
|
|
92
|
+
export interface CandidatePlacement {
|
|
93
|
+
slotId: string;
|
|
94
|
+
part: PartDef;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* The serializable record of how an item was generated: its family, tags,
|
|
98
|
+
* per-slot part selection, applied set-bonus ids, and the deterministic seed.
|
|
99
|
+
* Enough for UI provenance display and byte-exact regeneration.
|
|
100
|
+
*/
|
|
101
|
+
export interface ItemProvenance {
|
|
102
|
+
family: string;
|
|
103
|
+
tags: readonly string[];
|
|
104
|
+
/** slotId -> partId of the selected parts. */
|
|
105
|
+
parts: Readonly<Record<string, string>>;
|
|
106
|
+
/** Ids of the set bonuses that were active, for display and re-derivation. */
|
|
107
|
+
bonuses: readonly string[];
|
|
108
|
+
/** Seed of the roll that produced this item; omit for hand-authored items. */
|
|
109
|
+
seed?: number;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Assemble an {@link ItemIdentity} from a family, tags, and installed parts.
|
|
113
|
+
*
|
|
114
|
+
* @capability item-identity assemble a serializable modular-item identity from family, tags, and installed parts
|
|
115
|
+
*/
|
|
116
|
+
export declare function identityOf(family: string, tags: readonly string[], parts: readonly InstalledPart[]): ItemIdentity;
|
|
117
|
+
/**
|
|
118
|
+
* Test whether an identity satisfies a declarative {@link IdentityQuery}.
|
|
119
|
+
*
|
|
120
|
+
* @capability item-identity evaluate a data-defined compatibility query against a modular-item identity
|
|
121
|
+
*/
|
|
122
|
+
export declare function matchesQuery(identity: ItemIdentity, query: IdentityQuery): boolean;
|
|
123
|
+
/**
|
|
124
|
+
* Collect every compatibility rule a completed identity violates. An empty
|
|
125
|
+
* result means the identity is legal.
|
|
126
|
+
*
|
|
127
|
+
* @capability item-identity validate a completed modular item against its compatibility rule set
|
|
128
|
+
*/
|
|
129
|
+
export declare function validateIdentity(identity: ItemIdentity, rules: readonly CompatibilityRule[]): ConstraintViolation[];
|
|
130
|
+
/**
|
|
131
|
+
* Convenience predicate: true when {@link validateIdentity} finds no violations.
|
|
132
|
+
*
|
|
133
|
+
* @capability item-identity check whether a completed modular item is compatibility-valid
|
|
134
|
+
*/
|
|
135
|
+
export declare function isIdentityValid(identity: ItemIdentity, rules: readonly CompatibilityRule[]): boolean;
|
|
136
|
+
/**
|
|
137
|
+
* The generic backtracking contract for procedural generation (see #908): given
|
|
138
|
+
* a partial identity and a candidate part, return the first forbid rule the
|
|
139
|
+
* placement would violate, or null if it stays viable. Require rules are ignored
|
|
140
|
+
* here because they may still be satisfied by a later placement.
|
|
141
|
+
*
|
|
142
|
+
* @capability item-identity test a candidate part placement against forbid rules for generation backtracking
|
|
143
|
+
*/
|
|
144
|
+
export declare function candidateViolatesForbid(partial: ItemIdentity, candidate: CandidatePlacement, rules: readonly CompatibilityRule[]): ForbidRule | null;
|
|
145
|
+
/**
|
|
146
|
+
* Count how many parts (or tags) contribute to a set bonus on an identity.
|
|
147
|
+
*
|
|
148
|
+
* @capability item-identity count set-bonus membership across an item's parts and tags
|
|
149
|
+
*/
|
|
150
|
+
export declare function countSetMembers(identity: ItemIdentity, bonus: SetBonus): number;
|
|
151
|
+
/**
|
|
152
|
+
* Select the set bonuses whose membership count meets their threshold, in the
|
|
153
|
+
* order they were declared.
|
|
154
|
+
*
|
|
155
|
+
* @capability item-identity resolve which match/set bonuses an item qualifies for
|
|
156
|
+
*/
|
|
157
|
+
export declare function activeSetBonuses(identity: ItemIdentity, bonuses: readonly SetBonus[]): SetBonus[];
|
|
158
|
+
/**
|
|
159
|
+
* Fold a set of active bonuses' additive stats onto a stat map, returning a new
|
|
160
|
+
* map (the input is not mutated).
|
|
161
|
+
*
|
|
162
|
+
* @capability item-identity apply active set-bonus stats onto an item's resolved stats
|
|
163
|
+
*/
|
|
164
|
+
export declare function applySetBonuses(stats: Record<string, number>, bonuses: readonly SetBonus[]): Record<string, number>;
|
|
165
|
+
/**
|
|
166
|
+
* Capture the provenance of a generated item — family, tags, per-slot parts,
|
|
167
|
+
* active bonus ids, and optional seed — as a JSON-safe record.
|
|
168
|
+
*
|
|
169
|
+
* @capability item-identity capture serializable provenance for UI display and deterministic regeneration
|
|
170
|
+
*/
|
|
171
|
+
export declare function captureProvenance(identity: ItemIdentity, activeBonuses: readonly SetBonus[], seed?: number): ItemProvenance;
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Assemble an {@link ItemIdentity} from a family, tags, and installed parts.
|
|
3
|
+
*
|
|
4
|
+
* @capability item-identity assemble a serializable modular-item identity from family, tags, and installed parts
|
|
5
|
+
*/
|
|
6
|
+
export function identityOf(family, tags, parts) {
|
|
7
|
+
return { family, tags, parts };
|
|
8
|
+
}
|
|
9
|
+
function hasCategory(identity, category) {
|
|
10
|
+
return identity.parts.some((installed) => installed.part.category === category);
|
|
11
|
+
}
|
|
12
|
+
function hasPart(identity, partId) {
|
|
13
|
+
return identity.parts.some((installed) => installed.part.id === partId);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Test whether an identity satisfies a declarative {@link IdentityQuery}.
|
|
17
|
+
*
|
|
18
|
+
* @capability item-identity evaluate a data-defined compatibility query against a modular-item identity
|
|
19
|
+
*/
|
|
20
|
+
export function matchesQuery(identity, query) {
|
|
21
|
+
if (query.family !== undefined && query.family !== identity.family)
|
|
22
|
+
return false;
|
|
23
|
+
if (query.allTags !== undefined && !query.allTags.every((tag) => identity.tags.includes(tag)))
|
|
24
|
+
return false;
|
|
25
|
+
if (query.anyTags !== undefined && !query.anyTags.some((tag) => identity.tags.includes(tag)))
|
|
26
|
+
return false;
|
|
27
|
+
if (query.hasCategory !== undefined && !hasCategory(identity, query.hasCategory))
|
|
28
|
+
return false;
|
|
29
|
+
if (query.hasPart !== undefined && !hasPart(identity, query.hasPart))
|
|
30
|
+
return false;
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
function ruleFails(identity, rule) {
|
|
34
|
+
if (!matchesQuery(identity, rule.when))
|
|
35
|
+
return false;
|
|
36
|
+
return rule.kind === "require" ? !matchesQuery(identity, rule.then) : matchesQuery(identity, rule.forbid);
|
|
37
|
+
}
|
|
38
|
+
function defaultMessage(rule) {
|
|
39
|
+
return rule.message ?? (rule.kind === "require" ? `${rule.id}: required combination missing` : `${rule.id}: forbidden combination`);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Collect every compatibility rule a completed identity violates. An empty
|
|
43
|
+
* result means the identity is legal.
|
|
44
|
+
*
|
|
45
|
+
* @capability item-identity validate a completed modular item against its compatibility rule set
|
|
46
|
+
*/
|
|
47
|
+
export function validateIdentity(identity, rules) {
|
|
48
|
+
const violations = [];
|
|
49
|
+
for (const rule of rules) {
|
|
50
|
+
if (ruleFails(identity, rule))
|
|
51
|
+
violations.push({ ruleId: rule.id, kind: rule.kind, message: defaultMessage(rule) });
|
|
52
|
+
}
|
|
53
|
+
return violations;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Convenience predicate: true when {@link validateIdentity} finds no violations.
|
|
57
|
+
*
|
|
58
|
+
* @capability item-identity check whether a completed modular item is compatibility-valid
|
|
59
|
+
*/
|
|
60
|
+
export function isIdentityValid(identity, rules) {
|
|
61
|
+
return validateIdentity(identity, rules).length === 0;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* The generic backtracking contract for procedural generation (see #908): given
|
|
65
|
+
* a partial identity and a candidate part, return the first forbid rule the
|
|
66
|
+
* placement would violate, or null if it stays viable. Require rules are ignored
|
|
67
|
+
* here because they may still be satisfied by a later placement.
|
|
68
|
+
*
|
|
69
|
+
* @capability item-identity test a candidate part placement against forbid rules for generation backtracking
|
|
70
|
+
*/
|
|
71
|
+
export function candidateViolatesForbid(partial, candidate, rules) {
|
|
72
|
+
const projected = {
|
|
73
|
+
family: partial.family,
|
|
74
|
+
tags: partial.tags,
|
|
75
|
+
parts: [...partial.parts, { slotId: candidate.slotId, part: candidate.part }],
|
|
76
|
+
};
|
|
77
|
+
for (const rule of rules) {
|
|
78
|
+
if (rule.kind === "forbid" && ruleFails(projected, rule))
|
|
79
|
+
return rule;
|
|
80
|
+
}
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Count how many parts (or tags) contribute to a set bonus on an identity.
|
|
85
|
+
*
|
|
86
|
+
* @capability item-identity count set-bonus membership across an item's parts and tags
|
|
87
|
+
*/
|
|
88
|
+
export function countSetMembers(identity, bonus) {
|
|
89
|
+
switch (bonus.countBy) {
|
|
90
|
+
case "category":
|
|
91
|
+
return identity.parts.filter((installed) => installed.part.category === bonus.value).length;
|
|
92
|
+
case "partId":
|
|
93
|
+
return identity.parts.filter((installed) => installed.part.id === bonus.value).length;
|
|
94
|
+
case "tag":
|
|
95
|
+
return identity.tags.includes(bonus.value) ? 1 : 0;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Select the set bonuses whose membership count meets their threshold, in the
|
|
100
|
+
* order they were declared.
|
|
101
|
+
*
|
|
102
|
+
* @capability item-identity resolve which match/set bonuses an item qualifies for
|
|
103
|
+
*/
|
|
104
|
+
export function activeSetBonuses(identity, bonuses) {
|
|
105
|
+
return bonuses.filter((bonus) => countSetMembers(identity, bonus) >= bonus.min);
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Fold a set of active bonuses' additive stats onto a stat map, returning a new
|
|
109
|
+
* map (the input is not mutated).
|
|
110
|
+
*
|
|
111
|
+
* @capability item-identity apply active set-bonus stats onto an item's resolved stats
|
|
112
|
+
*/
|
|
113
|
+
export function applySetBonuses(stats, bonuses) {
|
|
114
|
+
const out = { ...stats };
|
|
115
|
+
for (const bonus of bonuses) {
|
|
116
|
+
for (const [key, delta] of Object.entries(bonus.stats))
|
|
117
|
+
out[key] = (out[key] ?? 0) + delta;
|
|
118
|
+
}
|
|
119
|
+
return out;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Capture the provenance of a generated item — family, tags, per-slot parts,
|
|
123
|
+
* active bonus ids, and optional seed — as a JSON-safe record.
|
|
124
|
+
*
|
|
125
|
+
* @capability item-identity capture serializable provenance for UI display and deterministic regeneration
|
|
126
|
+
*/
|
|
127
|
+
export function captureProvenance(identity, activeBonuses, seed) {
|
|
128
|
+
const parts = {};
|
|
129
|
+
for (const installed of identity.parts)
|
|
130
|
+
parts[installed.slotId] = installed.part.id;
|
|
131
|
+
return {
|
|
132
|
+
family: identity.family,
|
|
133
|
+
tags: [...identity.tags],
|
|
134
|
+
parts,
|
|
135
|
+
bonuses: activeBonuses.map((bonus) => bonus.id),
|
|
136
|
+
...(seed === undefined ? {} : { seed }),
|
|
137
|
+
};
|
|
138
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A runtime store for procedurally generated item instances — a rolled unique gun, a rolled
|
|
3
|
+
* affixed relic — keyed by a generated id distinct from any static catalog id. The counterpart a
|
|
4
|
+
* game's `content.itemById` consults for ids `lootTable`'s `generate` entries hand back, so runtime
|
|
5
|
+
* rolls never need a hand-rolled parallel registry (#536.1).
|
|
6
|
+
*/
|
|
7
|
+
export interface ItemInstanceRegistry<TDef> {
|
|
8
|
+
/** Stores `def` under a fresh generated id derived from `baseId`; returns that id. */
|
|
9
|
+
register(baseId: string, def: TDef): string;
|
|
10
|
+
get(id: string): TDef | undefined;
|
|
11
|
+
has(id: string): boolean;
|
|
12
|
+
/** Drop a generated instance once nothing references it (consumed, destroyed, sold). */
|
|
13
|
+
release(id: string): void;
|
|
14
|
+
count(): number;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Builds an {@link ItemInstanceRegistry}; generated ids are `"<prefix>:<baseId>:<n>"`, unique per
|
|
18
|
+
* registry instance.
|
|
19
|
+
*
|
|
20
|
+
* @capability item-instance-registry a runtime store for procedurally generated item instances
|
|
21
|
+
*/
|
|
22
|
+
export declare function createItemInstanceRegistry<TDef>(prefix?: string): ItemInstanceRegistry<TDef>;
|
|
23
|
+
/**
|
|
24
|
+
* Bridges any procedural roller into a `LootEntry.generate` callback: rolls a `{ baseId, def }` pair
|
|
25
|
+
* and registers it, returning the runtime id the loot roll hands back as the drop's `item`.
|
|
26
|
+
*
|
|
27
|
+
* @capability item-instance-registry roll and register a procedural item as a loot-table drop
|
|
28
|
+
*/
|
|
29
|
+
export declare function proceduralLootEntry<TDef>(registry: ItemInstanceRegistry<TDef>, roll: (rng: () => number) => {
|
|
30
|
+
baseId: string;
|
|
31
|
+
def: TDef;
|
|
32
|
+
}): (rng: () => number) => string;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Builds an {@link ItemInstanceRegistry}; generated ids are `"<prefix>:<baseId>:<n>"`, unique per
|
|
3
|
+
* registry instance.
|
|
4
|
+
*
|
|
5
|
+
* @capability item-instance-registry a runtime store for procedurally generated item instances
|
|
6
|
+
*/
|
|
7
|
+
export function createItemInstanceRegistry(prefix = "item") {
|
|
8
|
+
let seq = 0;
|
|
9
|
+
const store = new Map();
|
|
10
|
+
return {
|
|
11
|
+
register(baseId, def) {
|
|
12
|
+
seq += 1;
|
|
13
|
+
const id = `${prefix}:${baseId}:${seq}`;
|
|
14
|
+
store.set(id, def);
|
|
15
|
+
return id;
|
|
16
|
+
},
|
|
17
|
+
get: (id) => store.get(id),
|
|
18
|
+
has: (id) => store.has(id),
|
|
19
|
+
release: (id) => void store.delete(id),
|
|
20
|
+
count: () => store.size,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Bridges any procedural roller into a `LootEntry.generate` callback: rolls a `{ baseId, def }` pair
|
|
25
|
+
* and registers it, returning the runtime id the loot roll hands back as the drop's `item`.
|
|
26
|
+
*
|
|
27
|
+
* @capability item-instance-registry roll and register a procedural item as a loot-table drop
|
|
28
|
+
*/
|
|
29
|
+
export function proceduralLootEntry(registry, roll) {
|
|
30
|
+
return (rng) => {
|
|
31
|
+
const rolled = roll(rng);
|
|
32
|
+
return registry.register(rolled.baseId, rolled.def);
|
|
33
|
+
};
|
|
34
|
+
}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One selectable option in a generation step's pool: a stable `id` used in provenance and pinning,
|
|
3
|
+
* the payload `value` a chosen option contributes, and an optional relative `weight` (default 1).
|
|
4
|
+
*/
|
|
5
|
+
export interface GenOption<V = unknown> {
|
|
6
|
+
id: string;
|
|
7
|
+
value: V;
|
|
8
|
+
weight?: number;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Read-only view of the choices resolved so far, threaded into a later step's pool, constraint,
|
|
12
|
+
* weight function, or transform so a decision can depend on earlier picks (dependent choice).
|
|
13
|
+
*/
|
|
14
|
+
export interface GenChoices {
|
|
15
|
+
/** Whether a step has resolved to a (non-skipped) option. */
|
|
16
|
+
has(step: string): boolean;
|
|
17
|
+
/** The chosen option id for a step, or undefined if unresolved or skipped. */
|
|
18
|
+
optionId(step: string): string | undefined;
|
|
19
|
+
/** The chosen option value for a step, or undefined if unresolved or skipped. */
|
|
20
|
+
value<V = unknown>(step: string): V | undefined;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* A step's candidate options: a fixed list, or a function of the choices resolved so far so pools
|
|
24
|
+
* can narrow to earlier picks (a slot pool that depends on a chosen category).
|
|
25
|
+
*/
|
|
26
|
+
export type GenPool<V = unknown> = readonly GenOption<V>[] | ((choices: GenChoices) => readonly GenOption<V>[]);
|
|
27
|
+
/**
|
|
28
|
+
* One decision point in a {@link GenSchema}: pick a single option from a pool, honoring an optional
|
|
29
|
+
* constraint, dependent weighting, selection mode, and optionality. Steps resolve in array order.
|
|
30
|
+
*/
|
|
31
|
+
export interface GenStep<V = unknown> {
|
|
32
|
+
id: string;
|
|
33
|
+
pool: GenPool<V>;
|
|
34
|
+
/** `"weighted"` (default) picks proportional to weight; `"uniform"` ignores weight and picks evenly. */
|
|
35
|
+
select?: "weighted" | "uniform";
|
|
36
|
+
/** Constraint: only options for which this returns true are eligible, given the earlier choices. */
|
|
37
|
+
accept?: (option: GenOption<V>, choices: GenChoices) => boolean;
|
|
38
|
+
/** Override an option's weight as a function of earlier choices; falls back to `option.weight ?? 1`. */
|
|
39
|
+
weightOf?: (option: GenOption<V>, choices: GenChoices) => number;
|
|
40
|
+
/** When no option is eligible, skip this step instead of failing or backtracking. */
|
|
41
|
+
optional?: boolean;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Mutation surface a {@link GenTransform} uses to derive numeric fields after choices resolve.
|
|
45
|
+
* Every `set`/`add`/`mul` is captured as a {@link GenFieldRecord}, and `rng` is the same injected
|
|
46
|
+
* stream the choices drew from, so rolled derivations stay deterministic and explainable.
|
|
47
|
+
*/
|
|
48
|
+
export interface TransformApi {
|
|
49
|
+
readonly choices: GenChoices;
|
|
50
|
+
readonly rng: () => number;
|
|
51
|
+
/** Current value of a field, or 0 if unset. */
|
|
52
|
+
get(field: string): number;
|
|
53
|
+
/** Replace a field's value, recording the change. */
|
|
54
|
+
set(field: string, value: number, note?: string): void;
|
|
55
|
+
/** Add to a field's value, recording the change. */
|
|
56
|
+
add(field: string, amount: number, note?: string): void;
|
|
57
|
+
/** Multiply a field's value, recording the change. */
|
|
58
|
+
mul(field: string, factor: number, note?: string): void;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* A named derivation over the numeric field bag, applied in schema order after all choices resolve
|
|
62
|
+
* (affix rolls, level scaling, budget spend). Each field mutation it makes is recorded as provenance.
|
|
63
|
+
*/
|
|
64
|
+
export interface GenTransform {
|
|
65
|
+
id: string;
|
|
66
|
+
apply: (api: TransformApi) => void;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* The resolved-but-unvalidated draft passed to each {@link GenValidator}: the step choices, their
|
|
70
|
+
* values, and the transformed fields. Returning false from any validator rerolls the whole
|
|
71
|
+
* generation up to the attempt budget.
|
|
72
|
+
*/
|
|
73
|
+
export interface GenDraft {
|
|
74
|
+
choices: Readonly<Record<string, string>>;
|
|
75
|
+
values: Readonly<Record<string, unknown>>;
|
|
76
|
+
fields: Readonly<Record<string, number>>;
|
|
77
|
+
}
|
|
78
|
+
/** A final-assembly check over a {@link GenDraft}; false triggers a whole-pipeline reroll. */
|
|
79
|
+
export type GenValidator = (draft: GenDraft) => boolean;
|
|
80
|
+
/**
|
|
81
|
+
* Provenance for one resolved step: which option stuck, its effective weight, how many options were
|
|
82
|
+
* eligible after constraints, and how many eligible options backtracking rejected before this one.
|
|
83
|
+
* A skipped optional step is recorded with an empty `optionId`.
|
|
84
|
+
*/
|
|
85
|
+
export interface GenChoiceRecord {
|
|
86
|
+
step: string;
|
|
87
|
+
optionId: string;
|
|
88
|
+
weight: number;
|
|
89
|
+
eligible: number;
|
|
90
|
+
rerolls: number;
|
|
91
|
+
}
|
|
92
|
+
/** Provenance for one field mutation a transform made: which transform, field, op, and before/after. */
|
|
93
|
+
export interface GenFieldRecord {
|
|
94
|
+
transform: string;
|
|
95
|
+
field: string;
|
|
96
|
+
op: "set" | "add" | "mul";
|
|
97
|
+
from: number;
|
|
98
|
+
to: number;
|
|
99
|
+
note?: string;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* The full explanation of a generated result: how many whole-pipeline attempts it took, every step
|
|
103
|
+
* choice, and every field mutation. Plain, serializable data for UI, debugging, balancing, and
|
|
104
|
+
* regeneration.
|
|
105
|
+
*/
|
|
106
|
+
export interface GenProvenance {
|
|
107
|
+
attempts: number;
|
|
108
|
+
choices: readonly GenChoiceRecord[];
|
|
109
|
+
fields: readonly GenFieldRecord[];
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* A successful generation: the step-to-option map, step-to-value map, transformed numeric fields,
|
|
113
|
+
* and the {@link GenProvenance} that explains them. Entirely serializable; round-trips through
|
|
114
|
+
* save/load and multiplayer sync unchanged.
|
|
115
|
+
*/
|
|
116
|
+
export interface GenResult {
|
|
117
|
+
choices: Readonly<Record<string, string>>;
|
|
118
|
+
values: Readonly<Record<string, unknown>>;
|
|
119
|
+
fields: Readonly<Record<string, number>>;
|
|
120
|
+
provenance: GenProvenance;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* The outcome of {@link generate}: either a successful {@link GenResult}, or a failure carrying the
|
|
124
|
+
* reason (`"unsatisfiable"` — constraints left no valid assignment; `"rejected"` — validators kept
|
|
125
|
+
* rejecting drafts) and the attempts spent.
|
|
126
|
+
*/
|
|
127
|
+
export type GenOutcome = {
|
|
128
|
+
ok: true;
|
|
129
|
+
result: GenResult;
|
|
130
|
+
} | {
|
|
131
|
+
ok: false;
|
|
132
|
+
reason: "unsatisfiable" | "rejected";
|
|
133
|
+
attempts: number;
|
|
134
|
+
};
|
|
135
|
+
/**
|
|
136
|
+
* A caller-defined generation schema over plain data: ordered choice steps, optional field
|
|
137
|
+
* transforms, optional validators, and bounded reroll/backtracking budgets. Genre-agnostic — it
|
|
138
|
+
* carries no built-in notion of rarity, element, weapon, or name; those are caller step and option ids.
|
|
139
|
+
*/
|
|
140
|
+
export interface GenSchema {
|
|
141
|
+
steps: readonly GenStep[];
|
|
142
|
+
transforms?: readonly GenTransform[];
|
|
143
|
+
validate?: readonly GenValidator[];
|
|
144
|
+
/** Max whole-pipeline attempts when a validator rejects a draft (default 24). */
|
|
145
|
+
maxAttempts?: number;
|
|
146
|
+
/** Max option picks the backtracking search may spend satisfying constraints in one attempt (default 1024). */
|
|
147
|
+
maxPicks?: number;
|
|
148
|
+
}
|
|
149
|
+
/** Per-call options for {@link generate}. */
|
|
150
|
+
export interface GenerateOptions {
|
|
151
|
+
/** Force a step to a specific option id, consuming no rng for it (a requested rarity or family). */
|
|
152
|
+
pin?: Readonly<Record<string, string>>;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Run a caller-defined {@link GenSchema} against an injected `rng` into a deterministic, serializable
|
|
156
|
+
* {@link GenResult} with full provenance. Composes weighted/uniform choice, dependent choice,
|
|
157
|
+
* constraints with bounded backtracking, field transforms, and validation reroll over plain data —
|
|
158
|
+
* the generic seam procedural loot, affix, and modular-part rollers assemble on. Identical schema,
|
|
159
|
+
* seed, and pins reproduce an identical result across server/client and save/load.
|
|
160
|
+
*
|
|
161
|
+
* @capability item-generation compose constraints, weighted pools, transforms, and provenance into a deterministic generated item
|
|
162
|
+
*/
|
|
163
|
+
export declare function generate(schema: GenSchema, rng: () => number, options?: GenerateOptions): GenOutcome;
|