@jgengine/core 0.9.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.
- package/CHANGELOG.md +34 -3
- 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/spawnDirector.d.ts +19 -1
- package/dist/ai/spawnDirector.js +53 -26
- package/dist/ai/spawnPoint.d.ts +7 -0
- package/dist/ai/spawnPoint.js +7 -0
- 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/audio/audioFalloff.d.ts +5 -2
- package/dist/audio/music.d.ts +53 -0
- package/dist/audio/music.js +34 -0
- package/dist/audio/synth.d.ts +60 -0
- package/dist/audio/synth.js +8 -0
- package/dist/authoring.d.ts +15 -0
- package/dist/authoring.js +15 -0
- 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 +47 -0
- package/dist/combat/dotField.js +52 -0
- 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 +7 -2
- package/dist/combat/projectiles.js +48 -17
- package/dist/combat/receivedDamage.d.ts +117 -0
- package/dist/combat/receivedDamage.js +92 -0
- package/dist/combat/regenShield.d.ts +39 -0
- package/dist/combat/regenShield.js +49 -0
- 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 +30 -1
- package/dist/combat/shotOrigin.js +70 -2
- 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 +34 -0
- package/dist/combat.js +34 -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/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/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/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/wallet.d.ts +26 -2
- package/dist/economy/wallet.js +35 -6
- package/dist/editor/commands.d.ts +248 -0
- package/dist/editor/commands.js +865 -0
- package/dist/editor/document.d.ts +186 -0
- package/dist/editor/document.js +884 -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 +97 -0
- package/dist/editor/index.js +10 -0
- package/dist/editor/liveSync.d.ts +127 -0
- package/dist/editor/liveSync.js +249 -0
- package/dist/editor/runtimeInspector.d.ts +88 -0
- package/dist/editor/runtimeInspector.js +239 -0
- package/dist/editor/types.d.ts +175 -0
- package/dist/editor/types.js +29 -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/connectedPlayers.d.ts +30 -0
- package/dist/game/connectedPlayers.js +21 -0
- package/dist/game/cosmetics.d.ts +9 -0
- package/dist/game/cosmetics.js +16 -0
- package/dist/game/defineGame.d.ts +141 -2
- package/dist/game/defineGame.js +39 -1
- package/dist/game/defineSystem.d.ts +88 -0
- package/dist/game/defineSystem.js +45 -0
- package/dist/game/dialogue.d.ts +33 -0
- package/dist/game/dialogue.js +21 -0
- package/dist/game/events.d.ts +50 -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/keyValueStore.d.ts +25 -0
- package/dist/game/keyValueStore.js +61 -0
- package/dist/game/leaderboard.d.ts +5 -0
- package/dist/game/leaderboard.js +5 -0
- package/dist/game/levelSequence.d.ts +24 -2
- package/dist/game/levelSequence.js +51 -2
- 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 +21 -0
- package/dist/game/lootTable.js +15 -4
- package/dist/game/modelAnimation.d.ts +8 -0
- package/dist/game/modelAnimation.js +18 -0
- 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 +160 -12
- package/dist/game/quest.d.ts +8 -0
- package/dist/game/quest.js +29 -0
- package/dist/game/race.d.ts +141 -0
- package/dist/game/race.js +169 -0
- package/dist/game/recordBook.d.ts +5 -5
- 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/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 +91 -0
- package/dist/gameplay.js +91 -0
- package/dist/index.d.ts +5 -7
- package/dist/index.js +5 -7
- package/dist/input/actionBindings.d.ts +24 -5
- package/dist/input/actionBindings.js +23 -5
- package/dist/input/axisInput.d.ts +13 -1
- package/dist/input/axisInput.js +22 -1
- 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/contextMenu.d.ts +1 -0
- package/dist/interaction/contextMenu.js +1 -0
- package/dist/interaction/lockpick.d.ts +61 -0
- package/dist/interaction/lockpick.js +168 -0
- package/dist/interaction/proximityPrompt.d.ts +5 -1
- package/dist/interaction/proximityPrompt.js +5 -3
- 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/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 +5 -0
- 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 +36 -1
- 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 +38 -7
- package/dist/movement/movementModel.js +54 -13
- package/dist/movement/playerMovement.d.ts +41 -0
- package/dist/movement/playerMovement.js +236 -0
- 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 +3 -0
- package/dist/multiplayer/lagCompensation.d.ts +5 -0
- package/dist/multiplayer/lagCompensation.js +5 -0
- package/dist/multiplayer/presenceModel.d.ts +9 -1
- package/dist/multiplayer/presenceModel.js +9 -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 +29 -0
- package/dist/physics/drivableVehicle.js +16 -0
- package/dist/physics/kinematicVehicle.d.ts +21 -1
- package/dist/physics/kinematicVehicle.js +23 -8
- package/dist/physics/physicsWorld.d.ts +24 -12
- package/dist/physics/physicsWorld.js +11 -5
- package/dist/physics/radialImpulse.d.ts +25 -0
- package/dist/physics/radialImpulse.js +27 -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 +24 -0
- package/dist/random/rng.js +30 -8
- 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 +76 -0
- package/dist/render/postProcessing.js +21 -0
- 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 +58 -0
- package/dist/runtime/adapter.js +54 -5
- 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/combatFx.d.ts +23 -0
- package/dist/runtime/context/combatFx.js +161 -0
- package/dist/runtime/context/registries.d.ts +13 -0
- package/dist/runtime/context/registries.js +84 -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 +134 -0
- package/dist/runtime/descriptors/features.d.ts +74 -0
- package/dist/runtime/descriptors/features.js +281 -0
- package/dist/runtime/gameContext.d.ts +163 -19
- package/dist/runtime/gameContext.js +385 -339
- package/dist/runtime/gameRuntime.d.ts +1 -0
- package/dist/runtime/gameRuntime.js +1 -0
- package/dist/runtime/headlessRunner.d.ts +60 -0
- package/dist/runtime/headlessRunner.js +44 -0
- package/dist/runtime/hostPersistence.d.ts +12 -0
- package/dist/runtime/hostPersistence.js +12 -0
- package/dist/runtime/hostedGameRunner.d.ts +54 -0
- package/dist/runtime/hostedGameRunner.js +85 -0
- package/dist/runtime/hostedWorldSession.d.ts +73 -0
- package/dist/runtime/hostedWorldSession.js +64 -0
- package/dist/runtime/inputSnapshot.d.ts +21 -3
- package/dist/runtime/inputSnapshot.js +8 -2
- package/dist/runtime/motionIntents.d.ts +12 -1
- package/dist/runtime/motionIntents.js +26 -1
- 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 +62 -0
- package/dist/runtime/worldChannel.js +114 -0
- package/dist/runtime/worldMirror.d.ts +36 -0
- package/dist/runtime/worldMirror.js +44 -0
- package/dist/runtime/worldProjection.d.ts +47 -0
- package/dist/runtime/worldProjection.js +52 -0
- package/dist/runtime/worldReplication.d.ts +69 -0
- package/dist/runtime/worldReplication.js +217 -0
- package/dist/runtime/worldSnapshot.d.ts +44 -0
- package/dist/runtime/worldSnapshot.js +30 -0
- package/dist/scene/assetCatalog.d.ts +22 -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 +259 -0
- package/dist/scene/authoredTriggers.d.ts +169 -0
- package/dist/scene/authoredTriggers.js +340 -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 +62 -0
- package/dist/scene/colliders.d.ts +18 -0
- package/dist/scene/colliders.js +61 -1
- package/dist/scene/entityStats.d.ts +13 -0
- package/dist/scene/entityStats.js +30 -0
- package/dist/scene/entityStore.d.ts +41 -1
- package/dist/scene/entityStore.js +75 -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 +240 -0
- package/dist/scene/sceneKinds.js +214 -0
- package/dist/scene/sceneOwnership.d.ts +169 -0
- package/dist/scene/sceneOwnership.js +179 -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/statModifiers.d.ts +5 -0
- package/dist/stats/statModifiers.js +5 -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 +9 -0
- package/dist/store/observableKeyedStore.js +43 -2
- package/dist/survival/decayMeter.d.ts +55 -0
- package/dist/survival/decayMeter.js +130 -55
- package/dist/survival/moodle.d.ts +2 -0
- package/dist/survival/regionHealth.d.ts +6 -0
- package/dist/survival/regionHealth.js +5 -0
- package/dist/tactics/fallingGrid.d.ts +6 -4
- package/dist/tactics/fallingGrid.js +6 -4
- 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 +144 -0
- package/dist/ui/gameLayout.js +148 -0
- package/dist/ui/hudDocument.d.ts +114 -0
- package/dist/ui/hudDocument.js +220 -0
- package/dist/ui/hudLayout.d.ts +33 -1
- package/dist/ui/hudLayout.js +204 -17
- package/dist/ui/orientation.d.ts +39 -0
- package/dist/ui/orientation.js +49 -0
- package/dist/ui/selectionModel.d.ts +92 -0
- package/dist/ui/selectionModel.js +88 -0
- package/dist/ui/swingTimer.d.ts +42 -0
- package/dist/ui/swingTimer.js +38 -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/visibility/spatialIndex.js +34 -20
- 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/authoredObjects.d.ts +58 -0
- package/dist/world/authoredObjects.js +69 -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/environmentSummary.d.ts +11 -2
- package/dist/world/environmentSummary.js +11 -1
- package/dist/world/features.d.ts +244 -7
- package/dist/world/features.js +92 -4
- 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/pathInstances.d.ts +27 -0
- package/dist/world/pathInstances.js +27 -0
- package/dist/world/pathTerrain.d.ts +80 -0
- package/dist/world/pathTerrain.js +142 -0
- package/dist/world/placeAsset.d.ts +81 -0
- package/dist/world/placeAsset.js +77 -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/polyline.d.ts +34 -0
- package/dist/world/polyline.js +81 -0
- package/dist/world/roads.d.ts +55 -0
- package/dist/world/roads.js +184 -0
- 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 +80 -0
- package/dist/world/streets.js +144 -0
- package/dist/world/terraform.d.ts +213 -1
- package/dist/world/terraform.js +655 -20
- package/dist/world/terrain.d.ts +138 -12
- package/dist/world/terrain.js +346 -28
- 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 +132 -0
- package/dist/world.js +132 -0
- package/package.json +32 -8
- package/skills/jgengine/SKILL.md +51 -0
- package/skills/jgengine/api.md +434 -0
- package/skills/jgengine/capabilities.md +29 -0
- package/skills/jgengine/reference-cartridge.md +72 -0
- package/skills/jgengine-combat/SKILL.md +34 -0
- package/skills/jgengine-combat/api.md +549 -0
- package/skills/jgengine-combat/capabilities.md +169 -0
- package/skills/jgengine-combat/reference.md +98 -0
- package/skills/jgengine-gameplay/SKILL.md +39 -0
- package/skills/jgengine-gameplay/api.md +1794 -0
- package/skills/jgengine-gameplay/capabilities.md +378 -0
- package/skills/jgengine-gameplay/reference-systems.md +60 -0
- package/skills/jgengine-world/SKILL.md +38 -0
- package/skills/jgengine-world/api.md +2652 -0
- package/skills/jgengine-world/capabilities.md +370 -0
- package/skills/jgengine-world/reference.md +222 -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 -4983
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Composable entity orders: a serializable command queue with lifecycle,
|
|
3
|
+
* preemption, and pluggable order kinds (#912). Player- or AI-issued intent
|
|
4
|
+
* ("move here", "attack that", "patrol this route") becomes reusable data
|
|
5
|
+
* instead of a hard-coded RTS verb kit. The queue owns issue -> activate ->
|
|
6
|
+
* tick -> complete/cancel lifecycle and deterministic preemption policy; each
|
|
7
|
+
* order KIND owns what "running" means, composed over narrow world adapters.
|
|
8
|
+
* Engine code never branches on `move`, `attack`, or any game verb -- kinds are
|
|
9
|
+
* looked up by string in a registry, so a game adds a verb by registering data.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Build an empty order-kind registry. Register the built-in compositions from
|
|
13
|
+
* `orders/orderKinds` or your own verbs, then hand it to `createOrderQueue`.
|
|
14
|
+
* One registry is shared by many per-entity queues.
|
|
15
|
+
*
|
|
16
|
+
* @capability order-registry register order verbs (move/attack/custom) as data so engine code never branches on a verb
|
|
17
|
+
*/
|
|
18
|
+
export function createOrderRegistry() {
|
|
19
|
+
const kinds = new Map();
|
|
20
|
+
return {
|
|
21
|
+
define(kind) {
|
|
22
|
+
if (kinds.has(kind.kind))
|
|
23
|
+
throw new Error(`Order kind "${kind.kind}" is already defined.`);
|
|
24
|
+
kinds.set(kind.kind, kind);
|
|
25
|
+
},
|
|
26
|
+
has(kind) {
|
|
27
|
+
return kinds.has(kind);
|
|
28
|
+
},
|
|
29
|
+
get(kind) {
|
|
30
|
+
return kinds.get(kind) ?? null;
|
|
31
|
+
},
|
|
32
|
+
kinds() {
|
|
33
|
+
return [...kinds.keys()];
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
function cloneOrder(order) {
|
|
38
|
+
return structuredClone(order);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Create a per-entity order queue over a shared kind registry. The queue owns
|
|
42
|
+
* the deterministic lifecycle and preemption policy; the kinds own behavior.
|
|
43
|
+
* Nothing here is random or unbounded: id generation is injected, activation is
|
|
44
|
+
* bounded by the pending count, and a single `tick` advances at most the active
|
|
45
|
+
* order plus one activation.
|
|
46
|
+
*
|
|
47
|
+
* @capability order-queue serializable per-entity command queue with lifecycle, preemption, and pluggable order kinds
|
|
48
|
+
*/
|
|
49
|
+
export function createOrderQueue(registry, options = {}) {
|
|
50
|
+
const onEvent = options.onEvent;
|
|
51
|
+
let counter = 0;
|
|
52
|
+
const genId = options.genId ?? (() => `order-${++counter}`);
|
|
53
|
+
let active = options.initial ? options.initial.active : null;
|
|
54
|
+
let pending = options.initial ? [...options.initial.pending] : [];
|
|
55
|
+
function emit(type, order, reason) {
|
|
56
|
+
onEvent?.({ type, orderId: order.id, kind: order.kind, reason });
|
|
57
|
+
}
|
|
58
|
+
function markCanceled(order, reason) {
|
|
59
|
+
order.phase = "canceled";
|
|
60
|
+
order.cancelReason = reason;
|
|
61
|
+
emit("canceled", order, reason);
|
|
62
|
+
}
|
|
63
|
+
function finishActive(ctx, outcome) {
|
|
64
|
+
if (active === null)
|
|
65
|
+
return;
|
|
66
|
+
const kind = registry.get(active.kind);
|
|
67
|
+
kind?.finish?.(active, ctx, outcome);
|
|
68
|
+
}
|
|
69
|
+
/** Pull pending orders forward until one activates or the queue drains. Bounded by the pending length at entry. */
|
|
70
|
+
function activateNext(ctx, report) {
|
|
71
|
+
let budget = pending.length;
|
|
72
|
+
while (active === null && budget > 0) {
|
|
73
|
+
budget -= 1;
|
|
74
|
+
const next = pending.shift();
|
|
75
|
+
if (next === undefined)
|
|
76
|
+
return;
|
|
77
|
+
const kind = registry.get(next.kind);
|
|
78
|
+
if (kind === null) {
|
|
79
|
+
markCanceled(next, "invalid");
|
|
80
|
+
report.canceled.push({ id: next.id, reason: "invalid" });
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
const started = kind.start(next, ctx);
|
|
84
|
+
if (!started.ok) {
|
|
85
|
+
markCanceled(next, "invalid");
|
|
86
|
+
report.canceled.push({ id: next.id, reason: "invalid" });
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
next.phase = "active";
|
|
90
|
+
active = next;
|
|
91
|
+
emit("activated", next);
|
|
92
|
+
report.activated.push(next.id);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return {
|
|
96
|
+
issue(request) {
|
|
97
|
+
const kind = registry.get(request.kind);
|
|
98
|
+
if (kind === null)
|
|
99
|
+
return { status: "rejected", reason: `Unknown order kind "${request.kind}".` };
|
|
100
|
+
const rejection = kind.validate?.(request.payload) ?? null;
|
|
101
|
+
if (rejection)
|
|
102
|
+
return { status: "rejected", reason: rejection.reason };
|
|
103
|
+
const policy = request.policy ?? "replace";
|
|
104
|
+
if (policy === "reject" && (active !== null || pending.length > 0)) {
|
|
105
|
+
return { status: "rejected", reason: "Queue is busy and policy is reject." };
|
|
106
|
+
}
|
|
107
|
+
const order = {
|
|
108
|
+
id: request.id ?? genId(),
|
|
109
|
+
kind: request.kind,
|
|
110
|
+
payload: request.payload,
|
|
111
|
+
phase: "queued",
|
|
112
|
+
uninterruptible: request.uninterruptible ?? false,
|
|
113
|
+
...(request.issuer !== undefined ? { issuer: request.issuer } : {}),
|
|
114
|
+
};
|
|
115
|
+
emit("issued", order);
|
|
116
|
+
if (policy === "replace") {
|
|
117
|
+
// Preempt the active order unless it is protected; a protected order
|
|
118
|
+
// finishes first and the newcomer waits at the front of the queue.
|
|
119
|
+
for (const queued of pending)
|
|
120
|
+
markCanceled(queued, "replaced");
|
|
121
|
+
pending = [];
|
|
122
|
+
if (active !== null && !active.uninterruptible) {
|
|
123
|
+
markCanceled(active, "replaced");
|
|
124
|
+
active = null;
|
|
125
|
+
}
|
|
126
|
+
pending.push(order);
|
|
127
|
+
return { status: active !== null ? "queued" : "accepted", order: order };
|
|
128
|
+
}
|
|
129
|
+
if (policy === "front") {
|
|
130
|
+
pending.unshift(order);
|
|
131
|
+
return { status: active !== null ? "queued" : "accepted", order: order };
|
|
132
|
+
}
|
|
133
|
+
// append (and the empty-queue reject case)
|
|
134
|
+
pending.push(order);
|
|
135
|
+
return { status: active !== null || pending.length > 1 ? "queued" : "accepted", order: order };
|
|
136
|
+
},
|
|
137
|
+
tick(ctx, dt) {
|
|
138
|
+
const report = { active: null, activated: [], completed: [], canceled: [] };
|
|
139
|
+
if (active === null)
|
|
140
|
+
activateNext(ctx, report);
|
|
141
|
+
if (active !== null) {
|
|
142
|
+
const kind = registry.get(active.kind);
|
|
143
|
+
if (kind === null) {
|
|
144
|
+
markCanceled(active, "invalid");
|
|
145
|
+
report.canceled.push({ id: active.id, reason: "invalid" });
|
|
146
|
+
active = null;
|
|
147
|
+
activateNext(ctx, report);
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
const progress = kind.update(active, ctx, dt);
|
|
151
|
+
if (progress.status === "completed") {
|
|
152
|
+
finishActive(ctx, { phase: "completed" });
|
|
153
|
+
active.phase = "completed";
|
|
154
|
+
emit("completed", active);
|
|
155
|
+
report.completed.push(active.id);
|
|
156
|
+
active = null;
|
|
157
|
+
activateNext(ctx, report);
|
|
158
|
+
}
|
|
159
|
+
else if (progress.status === "failed") {
|
|
160
|
+
finishActive(ctx, { phase: "canceled", reason: "failed" });
|
|
161
|
+
markCanceled(active, "failed");
|
|
162
|
+
report.canceled.push({ id: active.id, reason: "failed" });
|
|
163
|
+
active = null;
|
|
164
|
+
activateNext(ctx, report);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
report.active = active;
|
|
169
|
+
return report;
|
|
170
|
+
},
|
|
171
|
+
active() {
|
|
172
|
+
return active;
|
|
173
|
+
},
|
|
174
|
+
pending() {
|
|
175
|
+
return [...pending];
|
|
176
|
+
},
|
|
177
|
+
isIdle() {
|
|
178
|
+
return active === null && pending.length === 0;
|
|
179
|
+
},
|
|
180
|
+
cancelActive(ctx, reason = "requested") {
|
|
181
|
+
if (active === null)
|
|
182
|
+
return;
|
|
183
|
+
finishActive(ctx, { phase: "canceled", reason });
|
|
184
|
+
markCanceled(active, reason);
|
|
185
|
+
active = null;
|
|
186
|
+
},
|
|
187
|
+
cancelAll(ctx, reason = "requested") {
|
|
188
|
+
for (const queued of pending)
|
|
189
|
+
markCanceled(queued, reason);
|
|
190
|
+
pending = [];
|
|
191
|
+
if (active !== null) {
|
|
192
|
+
finishActive(ctx, { phase: "canceled", reason });
|
|
193
|
+
markCanceled(active, reason);
|
|
194
|
+
active = null;
|
|
195
|
+
}
|
|
196
|
+
},
|
|
197
|
+
clear(ctx) {
|
|
198
|
+
this.cancelAll(ctx, "cleared");
|
|
199
|
+
},
|
|
200
|
+
serialize() {
|
|
201
|
+
return {
|
|
202
|
+
active: active ? cloneOrder(active) : null,
|
|
203
|
+
pending: pending.map(cloneOrder),
|
|
204
|
+
};
|
|
205
|
+
},
|
|
206
|
+
load(state) {
|
|
207
|
+
active = state.active ? cloneOrder(state.active) : null;
|
|
208
|
+
pending = state.pending.map(cloneOrder);
|
|
209
|
+
},
|
|
210
|
+
};
|
|
211
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { AxisInput } from "../input/axisInput.js";
|
|
2
|
+
import type { KinematicVehicle, KinematicVehicleModifiers, KinematicVehicleStep } from "./kinematicVehicle.js";
|
|
3
|
+
/** World-space `[x, y, z]` for a drivable vehicle's resolved pose. */
|
|
4
|
+
export type DrivableVehiclePosition = readonly [number, number, number];
|
|
5
|
+
/** Options for {@link tickDrivableVehicle} — ground snapping and per-tick tuning modifiers. */
|
|
6
|
+
export interface DrivableVehicleOptions {
|
|
7
|
+
/** Resamples world-space Y each tick (terrain height, a ramp, a bridge deck); omit to keep the sim's own flat `y`. */
|
|
8
|
+
groundHeight?: (x: number, z: number) => number;
|
|
9
|
+
modifiers?: KinematicVehicleModifiers;
|
|
10
|
+
}
|
|
11
|
+
/** A `setPose`-ready patch — spread straight into `entities.setPose(vehicleId, drive.pose)`. */
|
|
12
|
+
export interface DrivableVehiclePose {
|
|
13
|
+
position: DrivableVehiclePosition;
|
|
14
|
+
rotationY: number;
|
|
15
|
+
dt: number;
|
|
16
|
+
}
|
|
17
|
+
/** {@link tickDrivableVehicle}'s result — the ready-to-apply pose patch plus the raw sim step for HUD/telemetry reads. */
|
|
18
|
+
export interface DrivableVehicleStep {
|
|
19
|
+
pose: DrivableVehiclePose;
|
|
20
|
+
step: KinematicVehicleStep;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Connects an `AxisInput` sample straight through a {@link KinematicVehicle} to a scene entity's pose
|
|
24
|
+
* for one tick (#533.1) — the throttle/steer/handbrake → sim → `setPose` loop every drivable-vehicle
|
|
25
|
+
* game hand-rolled. Ground-snaps the result when `groundHeight` is given (terrain-following cars, not
|
|
26
|
+
* just flat racetracks). Pair with `scene/vehicleSeat` for who is allowed to drive and where the camera
|
|
27
|
+
* points; this function only steps the sim and shapes the pose patch, nothing else.
|
|
28
|
+
*/
|
|
29
|
+
export declare function tickDrivableVehicle(vehicle: KinematicVehicle, dt: number, axis: AxisInput, options?: DrivableVehicleOptions): DrivableVehicleStep;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Connects an `AxisInput` sample straight through a {@link KinematicVehicle} to a scene entity's pose
|
|
3
|
+
* for one tick (#533.1) — the throttle/steer/handbrake → sim → `setPose` loop every drivable-vehicle
|
|
4
|
+
* game hand-rolled. Ground-snaps the result when `groundHeight` is given (terrain-following cars, not
|
|
5
|
+
* just flat racetracks). Pair with `scene/vehicleSeat` for who is allowed to drive and where the camera
|
|
6
|
+
* points; this function only steps the sim and shapes the pose patch, nothing else.
|
|
7
|
+
*/
|
|
8
|
+
export function tickDrivableVehicle(vehicle, dt, axis, options = {}) {
|
|
9
|
+
const step = vehicle.tick(dt, axis, options.modifiers);
|
|
10
|
+
const [x, y, z] = step.position;
|
|
11
|
+
const resolvedY = options.groundHeight === undefined ? y : options.groundHeight(x, z);
|
|
12
|
+
return {
|
|
13
|
+
pose: { position: [x, resolvedY, z], rotationY: step.heading, dt },
|
|
14
|
+
step,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
@@ -20,6 +20,26 @@ export interface KinematicVehicleOptions {
|
|
|
20
20
|
surfaceFriction?: (x: number, z: number) => number;
|
|
21
21
|
/** Extra velocity damping per second by world position (rough ground drag); default `0`. */
|
|
22
22
|
dragAt?: (x: number, z: number) => number;
|
|
23
|
+
/**
|
|
24
|
+
* Veto or clamp a planar move before it commits — walls, closed gates, arena bounds. Given the
|
|
25
|
+
* attempted `from`→`to` on the XZ plane, return the destination actually allowed; velocity is
|
|
26
|
+
* rederived from the permitted displacement, so motion blocked on an axis stops on that axis
|
|
27
|
+
* instead of grinding into the obstacle. Default: no clamp (the move always commits).
|
|
28
|
+
*/
|
|
29
|
+
clampMove?: (from: readonly [number, number], to: readonly [number, number]) => readonly [number, number];
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Per-tick multipliers layered over the base tuning — the transient overrides games apply for one
|
|
33
|
+
* frame without rebuilding the vehicle: nitro/boost, a braced-plow bonus, or entering a speed zone or
|
|
34
|
+
* slow field. Each defaults to `1` (no change), so passing nothing leaves the base tuning untouched.
|
|
35
|
+
*/
|
|
36
|
+
export interface KinematicVehicleModifiers {
|
|
37
|
+
/** Scale top speed this tick (sustained boost, speed pads). */
|
|
38
|
+
topSpeedScale?: number;
|
|
39
|
+
/** Scale engine acceleration this tick (boost, brace bonus). */
|
|
40
|
+
accelScale?: number;
|
|
41
|
+
/** Scale turn rate this tick (brace penalty, heavy-load steering). */
|
|
42
|
+
turnRateScale?: number;
|
|
23
43
|
}
|
|
24
44
|
export interface KinematicVehicleStep {
|
|
25
45
|
position: readonly [number, number, number];
|
|
@@ -39,7 +59,7 @@ export interface KinematicVehicleStep {
|
|
|
39
59
|
* (drift meters, boost, off-track rules) via `surfaceFriction`/`dragAt` hooks and the returned slip.
|
|
40
60
|
*/
|
|
41
61
|
export interface KinematicVehicle {
|
|
42
|
-
tick(dt: number, axis: AxisInput): KinematicVehicleStep;
|
|
62
|
+
tick(dt: number, axis: AxisInput, modifiers?: KinematicVehicleModifiers): KinematicVehicleStep;
|
|
43
63
|
pose(): {
|
|
44
64
|
position: readonly [number, number, number];
|
|
45
65
|
heading: number;
|
|
@@ -5,6 +5,7 @@ export function createKinematicVehicle(tuning, options = {}) {
|
|
|
5
5
|
const rollingResistance = tuning.rollingResistance ?? 0;
|
|
6
6
|
const surfaceFriction = options.surfaceFriction ?? (() => 1);
|
|
7
7
|
const dragAt = options.dragAt ?? (() => 0);
|
|
8
|
+
const clampMove = options.clampMove;
|
|
8
9
|
let x = options.position?.[0] ?? 0;
|
|
9
10
|
let y = options.position?.[1] ?? 0;
|
|
10
11
|
let z = options.position?.[2] ?? 0;
|
|
@@ -15,21 +16,24 @@ export function createKinematicVehicle(tuning, options = {}) {
|
|
|
15
16
|
return [Math.sin(heading), Math.cos(heading)];
|
|
16
17
|
}
|
|
17
18
|
return {
|
|
18
|
-
tick(dt, axis) {
|
|
19
|
+
tick(dt, axis, modifiers) {
|
|
20
|
+
const topSpeed = tuning.topSpeed * (modifiers?.topSpeedScale ?? 1);
|
|
21
|
+
const engineAccel = tuning.engineAccel * (modifiers?.accelScale ?? 1);
|
|
22
|
+
const turnRate = tuning.turnRate * (modifiers?.turnRateScale ?? 1);
|
|
19
23
|
const [fx0, fz0] = forward();
|
|
20
24
|
const speed = vx * fx0 + vz * fz0;
|
|
21
25
|
const steerScale = Math.min(1, Math.abs(speed) / tuning.turnSpeedRef);
|
|
22
26
|
const direction = speed >= 0 ? 1 : -1;
|
|
23
|
-
heading = steerYaw(heading, axis.steer * steerScale * direction,
|
|
27
|
+
heading = steerYaw(heading, axis.steer * steerScale * direction, turnRate, dt);
|
|
24
28
|
const [fx, fz] = forward();
|
|
25
29
|
let accel = 0;
|
|
26
|
-
if (axis.throttle > 0 && speed <
|
|
27
|
-
accel += axis.throttle *
|
|
30
|
+
if (axis.throttle > 0 && speed < topSpeed)
|
|
31
|
+
accel += axis.throttle * engineAccel;
|
|
28
32
|
if (axis.brake > 0) {
|
|
29
33
|
if (speed > 0.2)
|
|
30
34
|
accel -= axis.brake * tuning.brakeAccel;
|
|
31
35
|
else if (speed > -tuning.reverseSpeed)
|
|
32
|
-
accel -= axis.brake *
|
|
36
|
+
accel -= axis.brake * engineAccel;
|
|
33
37
|
}
|
|
34
38
|
vx += fx * accel * dt;
|
|
35
39
|
vz += fz * accel * dt;
|
|
@@ -52,13 +56,24 @@ export function createKinematicVehicle(tuning, options = {}) {
|
|
|
52
56
|
vx *= dragDamp;
|
|
53
57
|
vz *= dragDamp;
|
|
54
58
|
}
|
|
55
|
-
x
|
|
56
|
-
z
|
|
59
|
+
const toX = x + vx * dt;
|
|
60
|
+
const toZ = z + vz * dt;
|
|
61
|
+
if (clampMove !== undefined && dt > 0) {
|
|
62
|
+
const allowed = clampMove([x, z], [toX, toZ]);
|
|
63
|
+
vx = (allowed[0] - x) / dt;
|
|
64
|
+
vz = (allowed[1] - z) / dt;
|
|
65
|
+
x = allowed[0];
|
|
66
|
+
z = allowed[1];
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
x = toX;
|
|
70
|
+
z = toZ;
|
|
71
|
+
}
|
|
57
72
|
return {
|
|
58
73
|
position: [x, y, z],
|
|
59
74
|
heading,
|
|
60
75
|
forwardSpeed: vx * fx + vz * fz,
|
|
61
|
-
lateralSpeed:
|
|
76
|
+
lateralSpeed: -vx * fz + vz * fx,
|
|
62
77
|
slip,
|
|
63
78
|
surface,
|
|
64
79
|
};
|
|
@@ -2,6 +2,12 @@ export interface PhysicsBounds {
|
|
|
2
2
|
min: readonly [number, number, number];
|
|
3
3
|
max: readonly [number, number, number];
|
|
4
4
|
}
|
|
5
|
+
/**
|
|
6
|
+
* Simulation fidelity intent: `low` (cheap — many bodies, loose stacks, forgiving sleep), `standard`
|
|
7
|
+
* (default), `high` (tight stacks, accurate joints, worth the extra solver work). Sets the solver
|
|
8
|
+
* knobs below to a matched preset; an individual knob left explicit always wins over the preset.
|
|
9
|
+
*/
|
|
10
|
+
export type PhysicsPrecision = "low" | "standard" | "high";
|
|
5
11
|
export interface PhysicsWorldConfig {
|
|
6
12
|
/** Maximum bodies the SoA buffers can hold. Fixed at construction; no reallocation later. */
|
|
7
13
|
capacity: number;
|
|
@@ -9,8 +15,8 @@ export interface PhysicsWorldConfig {
|
|
|
9
15
|
bounds: PhysicsBounds;
|
|
10
16
|
/** Downward acceleration applied to awake bodies each substep. Default -20. */
|
|
11
17
|
gravity?: number;
|
|
12
|
-
/**
|
|
13
|
-
|
|
18
|
+
/** Simulation fidelity intent. Default "standard" — see {@link PhysicsPrecision}. */
|
|
19
|
+
precision?: PhysicsPrecision;
|
|
14
20
|
/** Fixed substep length in seconds. Default 1/60. */
|
|
15
21
|
fixedDt?: number;
|
|
16
22
|
/** Cap on substeps per `step()` — bounds catch-up work, drops the rest. Default 4. */
|
|
@@ -23,21 +29,27 @@ export interface PhysicsWorldConfig {
|
|
|
23
29
|
friction?: number;
|
|
24
30
|
/** Per-second linear velocity damping (physical energy bleed so piles settle and sleep). Default 0.2. */
|
|
25
31
|
linearDamping?: number;
|
|
26
|
-
/**
|
|
32
|
+
/** Speed at or below which a body counts as still. Default 0.08. */
|
|
33
|
+
sleepLinearVelocity?: number;
|
|
34
|
+
/** Maximum simultaneous joints the constraint buffers can hold. Default 256. */
|
|
35
|
+
jointCapacity?: number;
|
|
36
|
+
/**
|
|
37
|
+
* @deprecated Advanced escape hatch — tune only when profiling shows the broadphase grid is the
|
|
38
|
+
* bottleneck; most games never set this. Broadphase cell edge; ideally ≈ small-body diameter.
|
|
39
|
+
* Default 1.
|
|
40
|
+
*/
|
|
41
|
+
cellSize?: number;
|
|
42
|
+
/** @deprecated Advanced escape hatch — prefer `precision`. Sequential-impulse velocity iterations per substep (higher = more stable stacks). */
|
|
27
43
|
solverIterations?: number;
|
|
28
|
-
/** Baumgarte positional-correction fraction per substep, 0..1.
|
|
44
|
+
/** @deprecated Advanced escape hatch — prefer `precision`. Baumgarte positional-correction fraction per substep, 0..1. */
|
|
29
45
|
correctionFactor?: number;
|
|
30
|
-
/** Penetration tolerated before correction kicks in. Default 0.005. */
|
|
46
|
+
/** @deprecated Advanced escape hatch — prefer `precision`. Penetration tolerated before correction kicks in. Default 0.005. */
|
|
31
47
|
slop?: number;
|
|
32
|
-
/**
|
|
33
|
-
sleepLinearVelocity?: number;
|
|
34
|
-
/** Consecutive still substeps before a body sleeps. Default 30. */
|
|
48
|
+
/** @deprecated Advanced escape hatch — prefer `precision`. Consecutive still substeps before a body sleeps. */
|
|
35
49
|
sleepThresholdSteps?: number;
|
|
36
|
-
/** Approach speed a contact must exceed to wake a sleeping body (resting contacts don't).
|
|
50
|
+
/** @deprecated Advanced escape hatch — prefer `precision`. Approach speed a contact must exceed to wake a sleeping body (resting contacts don't). */
|
|
37
51
|
wakeThreshold?: number;
|
|
38
|
-
/**
|
|
39
|
-
jointCapacity?: number;
|
|
40
|
-
/** Baumgarte fraction applied to hard-joint positional error per iteration, 0..1. Default 0.5. */
|
|
52
|
+
/** @deprecated Advanced escape hatch — prefer `precision`. Baumgarte fraction applied to hard-joint positional error per iteration, 0..1. */
|
|
41
53
|
jointCorrection?: number;
|
|
42
54
|
}
|
|
43
55
|
export interface PhysicsStats {
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
const PHYSICS_PRECISION_PRESETS = {
|
|
2
|
+
low: { solverIterations: 2, correctionFactor: 0.15, sleepThresholdSteps: 15, wakeThreshold: 0.75, jointCorrection: 0.35 },
|
|
3
|
+
standard: { solverIterations: 4, correctionFactor: 0.2, sleepThresholdSteps: 30, wakeThreshold: 0.5, jointCorrection: 0.5 },
|
|
4
|
+
high: { solverIterations: 8, correctionFactor: 0.3, sleepThresholdSteps: 45, wakeThreshold: 0.35, jointCorrection: 0.65 },
|
|
5
|
+
};
|
|
1
6
|
export const SHAPE_BOX = 0;
|
|
2
7
|
export const SHAPE_SPHERE = 1;
|
|
3
8
|
export const JOINT_FIXED = 0;
|
|
@@ -119,6 +124,7 @@ export class PhysicsWorld {
|
|
|
119
124
|
stepMs: 0,
|
|
120
125
|
};
|
|
121
126
|
constructor(config) {
|
|
127
|
+
const preset = PHYSICS_PRECISION_PRESETS[config.precision ?? "standard"];
|
|
122
128
|
this.capacity = config.capacity;
|
|
123
129
|
this.bounds = { min: config.bounds.min, max: config.bounds.max };
|
|
124
130
|
this.gravity = config.gravity ?? -20;
|
|
@@ -129,16 +135,16 @@ export class PhysicsWorld {
|
|
|
129
135
|
this.restitutionThreshold = config.restitutionThreshold ?? 1;
|
|
130
136
|
this.friction = config.friction ?? 0.4;
|
|
131
137
|
this.linearDamping = config.linearDamping ?? 0.2;
|
|
132
|
-
this.solverIterations = Math.max(1, config.solverIterations ??
|
|
133
|
-
this.correctionFactor = config.correctionFactor ??
|
|
138
|
+
this.solverIterations = Math.max(1, config.solverIterations ?? preset.solverIterations);
|
|
139
|
+
this.correctionFactor = config.correctionFactor ?? preset.correctionFactor;
|
|
134
140
|
this.slop = config.slop ?? 0.005;
|
|
135
141
|
const sleepV = config.sleepLinearVelocity ?? 0.08;
|
|
136
142
|
const sleepMoveEps = sleepV * this.fixedDt;
|
|
137
143
|
this.sleepMove2 = sleepMoveEps * sleepMoveEps;
|
|
138
|
-
this.sleepSteps = config.sleepThresholdSteps ??
|
|
139
|
-
this.wakeThreshold = config.wakeThreshold ??
|
|
144
|
+
this.sleepSteps = config.sleepThresholdSteps ?? preset.sleepThresholdSteps;
|
|
145
|
+
this.wakeThreshold = config.wakeThreshold ?? preset.wakeThreshold;
|
|
140
146
|
this.jointCapacity = Math.max(0, config.jointCapacity ?? 256);
|
|
141
|
-
this.jointCorrection = config.jointCorrection ??
|
|
147
|
+
this.jointCorrection = config.jointCorrection ?? preset.jointCorrection;
|
|
142
148
|
const cap = config.capacity;
|
|
143
149
|
this.posX = new Float32Array(cap);
|
|
144
150
|
this.posY = new Float32Array(cap);
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/** How a radial impulse fades from the blast center to its edge. */
|
|
2
|
+
export type RadialFalloff = "linear" | "quadratic" | "none";
|
|
3
|
+
/** A radial push: the impulse vector plus the 0..1 falloff sampled at the target. */
|
|
4
|
+
export interface RadialImpulse {
|
|
5
|
+
/** Impulse along the first axis (direction × magnitude). */
|
|
6
|
+
x: number;
|
|
7
|
+
/** Impulse along the second axis (direction × magnitude). */
|
|
8
|
+
y: number;
|
|
9
|
+
/** Impulse magnitude = `power` × `falloff`. */
|
|
10
|
+
magnitude: number;
|
|
11
|
+
/** Falloff weight at the target, 1 at the center down to 0 at the radius. */
|
|
12
|
+
falloff: number;
|
|
13
|
+
}
|
|
14
|
+
/** Options for {@link radialImpulse}. */
|
|
15
|
+
export interface RadialImpulseOptions {
|
|
16
|
+
/** Falloff shape. Defaults to `"linear"` (`1 − d/r`). */
|
|
17
|
+
falloff?: RadialFalloff;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Point-source radial impulse pushing a `target` away from a blast `source`: full `power` at the center
|
|
21
|
+
* fading to zero at `radius`. Returns `null` when the target sits at or beyond the radius (unaffected),
|
|
22
|
+
* so callers can early-out. At the exact center the direction is zero. This is the explosion/knockback/
|
|
23
|
+
* shockwave push — every arena game hand-rolled the distance, falloff, and normalize.
|
|
24
|
+
*/
|
|
25
|
+
export declare function radialImpulse(source: readonly [number, number], target: readonly [number, number], radius: number, power: number, options?: RadialImpulseOptions): RadialImpulse | null;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
function falloffAt(distance, radius, shape) {
|
|
2
|
+
const linear = 1 - distance / radius;
|
|
3
|
+
if (shape === "none")
|
|
4
|
+
return 1;
|
|
5
|
+
if (shape === "quadratic")
|
|
6
|
+
return linear * linear;
|
|
7
|
+
return linear;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Point-source radial impulse pushing a `target` away from a blast `source`: full `power` at the center
|
|
11
|
+
* fading to zero at `radius`. Returns `null` when the target sits at or beyond the radius (unaffected),
|
|
12
|
+
* so callers can early-out. At the exact center the direction is zero. This is the explosion/knockback/
|
|
13
|
+
* shockwave push — every arena game hand-rolled the distance, falloff, and normalize.
|
|
14
|
+
*/
|
|
15
|
+
export function radialImpulse(source, target, radius, power, options = {}) {
|
|
16
|
+
if (radius <= 0)
|
|
17
|
+
return null;
|
|
18
|
+
const dx = target[0] - source[0];
|
|
19
|
+
const dy = target[1] - source[1];
|
|
20
|
+
const distance = Math.hypot(dx, dy);
|
|
21
|
+
if (distance >= radius)
|
|
22
|
+
return null;
|
|
23
|
+
const falloff = falloffAt(distance, radius, options.falloff ?? "linear");
|
|
24
|
+
const magnitude = power * falloff;
|
|
25
|
+
const invLen = distance > 1e-6 ? 1 / distance : 0;
|
|
26
|
+
return { x: dx * invLen * magnitude, y: dy * invLen * magnitude, magnitude, falloff };
|
|
27
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { createDecayMeterSet, type DecayMeterSet } from "./survival/decayMeter.js";
|
|
2
|
+
export { createMoodleStack, stackMoodles, type Moodle, type MoodleStack } from "./survival/moodle.js";
|
|
3
|
+
export { createMultiRegionHealth, type MultiRegionHealth } from "./survival/regionHealth.js";
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import type { StatModifierSet } from "../stats/statModifiers.js";
|
|
2
|
+
/**
|
|
3
|
+
* A game-owned named input value. The engine ships no attribute vocabulary — ids,
|
|
4
|
+
* bounds, defaults, and metadata are entirely caller data, so the same graph can
|
|
5
|
+
* model STR/AGI/INT, SPECIAL scores, skills, difficulty knobs, or anything else.
|
|
6
|
+
*/
|
|
7
|
+
export interface StatInputDef {
|
|
8
|
+
id: string;
|
|
9
|
+
/** Default base value a fresh sheet starts at. Defaults to `min ?? 0`. */
|
|
10
|
+
base?: number;
|
|
11
|
+
/** Lower bound applied to the resolved value. */
|
|
12
|
+
min?: number;
|
|
13
|
+
/** Upper bound applied to the resolved value. */
|
|
14
|
+
max?: number;
|
|
15
|
+
/** Free-form, engine-ignored metadata (labels, descriptions, UI hints). */
|
|
16
|
+
meta?: Readonly<Record<string, unknown>>;
|
|
17
|
+
}
|
|
18
|
+
/** How a single contribution folds into a running value. */
|
|
19
|
+
export type StatOp = "add" | "mul" | "override" | "clampMin" | "clampMax";
|
|
20
|
+
/**
|
|
21
|
+
* One folded contribution to a value, retained so a sheet can explain
|
|
22
|
+
* "why is this value 42?" — every step carries the source that produced it.
|
|
23
|
+
*/
|
|
24
|
+
export interface StatContribution {
|
|
25
|
+
/** Provenance label — who/what produced this contribution. */
|
|
26
|
+
source: string;
|
|
27
|
+
op: StatOp;
|
|
28
|
+
value: number;
|
|
29
|
+
}
|
|
30
|
+
/** A modifier entry targeting one stat: a single contribution or an ordered list. */
|
|
31
|
+
export type StatModEntry = StatContribution | readonly StatContribution[];
|
|
32
|
+
/** The read-only view a derived formula gets: resolved values of its declared dependencies. */
|
|
33
|
+
export interface StatDeriveContext {
|
|
34
|
+
/** Resolved (fully modified) value of a declared dependency (input or derived). */
|
|
35
|
+
value(id: string): number;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* A derived value whose formula and dependencies are caller-owned. `compute` may
|
|
39
|
+
* return a scalar (shorthand for a single `add`) or an ordered list of contributions
|
|
40
|
+
* folded left-to-right, so additive/multiplicative/clamped and conditional modifiers
|
|
41
|
+
* are all expressed as plain data or branches inside the function.
|
|
42
|
+
*/
|
|
43
|
+
export interface StatDerivedDef {
|
|
44
|
+
id: string;
|
|
45
|
+
/** ids (inputs or other derived) this formula reads — drives ordering, cycle detection, and selective recompute. */
|
|
46
|
+
deps?: readonly string[];
|
|
47
|
+
min?: number;
|
|
48
|
+
max?: number;
|
|
49
|
+
round?: "floor" | "ceil" | "round";
|
|
50
|
+
meta?: Readonly<Record<string, unknown>>;
|
|
51
|
+
compute(ctx: StatDeriveContext): number | readonly StatContribution[];
|
|
52
|
+
}
|
|
53
|
+
/** The full schema of a stat graph: its named inputs and caller-authored derived formulas. */
|
|
54
|
+
export interface StatGraphDef {
|
|
55
|
+
inputs: readonly StatInputDef[];
|
|
56
|
+
derived?: readonly StatDerivedDef[];
|
|
57
|
+
}
|
|
58
|
+
/** Plain-data, JSON-safe sheet state: input base values plus registered modifier sources. */
|
|
59
|
+
export interface StatSheetState {
|
|
60
|
+
base: Record<string, number>;
|
|
61
|
+
sources: Record<string, Record<string, StatContribution[]>>;
|
|
62
|
+
}
|
|
63
|
+
/** One line of a provenance trace: a contribution plus the running total after it folds in. */
|
|
64
|
+
export interface StatContributionStep extends StatContribution {
|
|
65
|
+
/** Running total after this contribution folds in. */
|
|
66
|
+
subtotal: number;
|
|
67
|
+
}
|
|
68
|
+
/** A full provenance trace for one stat: the ordered steps that produced its value. */
|
|
69
|
+
export interface StatExplanation {
|
|
70
|
+
id: string;
|
|
71
|
+
value: number;
|
|
72
|
+
steps: StatContributionStep[];
|
|
73
|
+
}
|
|
74
|
+
/** A live per-entity instance of a {@link StatGraph}: mutable base values and modifier sources over a shared schema. */
|
|
75
|
+
export interface StatSheet {
|
|
76
|
+
/** Resolve the fully modified value of an input or derived stat. */
|
|
77
|
+
get(id: string): number;
|
|
78
|
+
/** The stored base of an input stat (before modifiers/clamping). */
|
|
79
|
+
getBase(id: string): number;
|
|
80
|
+
setBase(id: string, value: number): void;
|
|
81
|
+
/** Register (or replace) a named modifier source targeting one or more stats. */
|
|
82
|
+
addSource(sourceId: string, mods: Record<string, StatModEntry>): void;
|
|
83
|
+
removeSource(sourceId: string): boolean;
|
|
84
|
+
hasSource(sourceId: string): boolean;
|
|
85
|
+
sources(): string[];
|
|
86
|
+
/** Resolve every input and derived stat into a plain record. */
|
|
87
|
+
values(): Record<string, number>;
|
|
88
|
+
/** Ordered contribution trace explaining a stat's current value. */
|
|
89
|
+
explain(id: string): StatExplanation;
|
|
90
|
+
/** Resolve values under a proposed, uncommitted mutation (e.g. a previewed allocation). */
|
|
91
|
+
preview(mutate: (draft: StatSheet) => void): Record<string, number>;
|
|
92
|
+
toJSON(): StatSheetState;
|
|
93
|
+
}
|
|
94
|
+
/** A compiled, immutable stat-graph schema that mints per-entity {@link StatSheet}s from base values or saved state. */
|
|
95
|
+
export interface StatGraph {
|
|
96
|
+
readonly inputIds: readonly string[];
|
|
97
|
+
readonly derivedIds: readonly string[];
|
|
98
|
+
create(base?: Record<string, number>): StatSheet;
|
|
99
|
+
restore(state: StatSheetState): StatSheet;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* A data-driven stat graph: game-owned named inputs feed caller-authored derived
|
|
103
|
+
* formulas, with contribution provenance, uncommitted previews, cycle detection, and
|
|
104
|
+
* selective recomputation. Formula semantics and numeric tables stay entirely game-defined.
|
|
105
|
+
*
|
|
106
|
+
* @capability stat-graph derive game-defined stats from named inputs with provenance and preview
|
|
107
|
+
*/
|
|
108
|
+
export declare function createStatGraph(def: StatGraphDef): StatGraph;
|
|
109
|
+
/**
|
|
110
|
+
* Bridge the shared {@link StatModifierSet} shape (add/multiply, used by talents, items,
|
|
111
|
+
* and buffs) into stat-graph contributions, so a ranked talent tree or gear roll feeds
|
|
112
|
+
* the graph as one named source instead of a parallel store.
|
|
113
|
+
*
|
|
114
|
+
* @capability stat-graph-bridge feed an existing StatModifierSet into a stat-graph source
|
|
115
|
+
*/
|
|
116
|
+
export declare function statModifierContributions<TStat extends string>(source: string, set: StatModifierSet<TStat>): Record<string, StatContribution[]>;
|