@jgengine/core 0.10.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -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/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 +1 -0
- package/dist/authoring.js +1 -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 +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 +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 +190 -7
- package/dist/editor/commands.js +727 -55
- package/dist/editor/document.d.ts +159 -13
- package/dist/editor/document.js +750 -19
- 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 +73 -6
- package/dist/editor/index.js +6 -2
- 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 +107 -1
- 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 +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 +100 -2
- package/dist/game/defineGame.js +39 -2
- 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 +35 -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 +92 -7
- 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 +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/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 -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/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 +16 -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 +35 -8
- package/dist/movement/movementModel.js +42 -14
- package/dist/movement/playerMovement.js +65 -10
- 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 +22 -0
- package/dist/random/rng.js +28 -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 +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 +42 -3
- package/dist/runtime/adapter.js +44 -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/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 +114 -13
- package/dist/runtime/gameContext.js +303 -395
- 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 +8 -3
- package/dist/runtime/hostedGameRunner.js +26 -3
- package/dist/runtime/hostedWorldSession.d.ts +12 -4
- package/dist/runtime/hostedWorldSession.js +11 -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 +30 -3
- package/dist/runtime/worldSnapshot.js +20 -5
- package/dist/scene/assetCatalog.d.ts +21 -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 +13 -1
- package/dist/scene/colliders.js +37 -1
- package/dist/scene/entityStats.d.ts +11 -2
- package/dist/scene/entityStats.js +11 -2
- 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 +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 +5 -0
- package/dist/store/observableKeyedStore.js +34 -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 +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 +33 -1
- package/dist/ui/hudLayout.js +204 -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/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/features.d.ts +115 -7
- package/dist/world/features.js +56 -5
- 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 +8 -0
- package/dist/world/roads.js +38 -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/terraform.d.ts +213 -1
- package/dist/world/terraform.js +655 -20
- package/dist/world/terrain.d.ts +119 -20
- package/dist/world/terrain.js +247 -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 +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 -5389
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Caller-owned id for a damage channel — `"fire"`, `"ballistic"`, `"physical"`, `"corrosive"`.
|
|
3
|
+
* The engine never branches on the value; a channel is whatever a game's data declares.
|
|
4
|
+
*/
|
|
5
|
+
export type DamageChannelId = string;
|
|
6
|
+
/**
|
|
7
|
+
* Caller-owned id for a target trait — `"armored"`, `"fleshy"`, `"wet"`, `"boss"`.
|
|
8
|
+
* Traits are the receiver-side facets a matchup scores a channel against.
|
|
9
|
+
*/
|
|
10
|
+
export type TargetTraitId = string;
|
|
11
|
+
/**
|
|
12
|
+
* The independent, typed outputs a channel-vs-trait matchup can scale. Every field is an
|
|
13
|
+
* optional multiplier that defaults to `1` (identity), so a matchup entry names only the axes
|
|
14
|
+
* it bends. `impact` scales the direct hit, `applyChance` the odds a status lands, `magnitude`
|
|
15
|
+
* and `duration` the applied status itself, and `extra` carries any further caller-defined
|
|
16
|
+
* scalar (knockback, stagger, heat) the engine forwards without interpreting.
|
|
17
|
+
*/
|
|
18
|
+
export interface MatchupOutputs {
|
|
19
|
+
/** Multiplier on direct impact magnitude. */
|
|
20
|
+
impact?: number;
|
|
21
|
+
/** Multiplier on status application probability. */
|
|
22
|
+
applyChance?: number;
|
|
23
|
+
/** Multiplier on applied status magnitude (e.g. damage per tick). */
|
|
24
|
+
magnitude?: number;
|
|
25
|
+
/** Multiplier on applied status duration/ticks. */
|
|
26
|
+
duration?: number;
|
|
27
|
+
/** Caller-defined extra scalar outputs, multiplied per axis like the named ones. */
|
|
28
|
+
extra?: Record<string, number>;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* A serializable, data-defined matchup table: `channel → trait → outputs`. When a hit's channel
|
|
32
|
+
* meets a target carrying several traits, every matching entry's outputs multiply together, so
|
|
33
|
+
* axes compose independently (a trait can halve impact yet double status duration). `default`
|
|
34
|
+
* applies for a channel/trait pair the table does not mention.
|
|
35
|
+
*/
|
|
36
|
+
export interface DamageMatchup<TChannel extends string = DamageChannelId, TTrait extends string = TargetTraitId> {
|
|
37
|
+
/** Channel keyed to a per-trait outputs table. */
|
|
38
|
+
entries: Partial<Record<TChannel, Partial<Record<TTrait, MatchupOutputs>>>>;
|
|
39
|
+
/** Outputs used when no listed trait matches the channel; identity when omitted. */
|
|
40
|
+
default?: MatchupOutputs;
|
|
41
|
+
}
|
|
42
|
+
/** One `(trait → outputs)` pair that contributed to a resolved matchup — provenance for UI/debug. */
|
|
43
|
+
export interface MatchupContribution {
|
|
44
|
+
trait: TargetTraitId;
|
|
45
|
+
outputs: MatchupOutputs;
|
|
46
|
+
}
|
|
47
|
+
/** Fully-resolved matchup outputs (every axis populated) plus the contributions that produced them. */
|
|
48
|
+
export interface ResolvedMatchup {
|
|
49
|
+
channel: DamageChannelId;
|
|
50
|
+
impact: number;
|
|
51
|
+
applyChance: number;
|
|
52
|
+
magnitude: number;
|
|
53
|
+
duration: number;
|
|
54
|
+
/** Extra scalar outputs, each defaulting to 1 unless a contribution set it. */
|
|
55
|
+
extra: Record<string, number>;
|
|
56
|
+
/** Whether at least one listed trait matched (false means `default`/identity was used). */
|
|
57
|
+
matched: boolean;
|
|
58
|
+
contributions: MatchupContribution[];
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Resolve a channel against a target's traits into independent, multiplied outputs. Pure and
|
|
62
|
+
* order-independent: every trait the channel has an entry for contributes, its axes multiplying
|
|
63
|
+
* into the running product; unmatched traits are skipped, and when nothing matches the table's
|
|
64
|
+
* `default` (or identity) is used. Bounded by the trait count — no world scan.
|
|
65
|
+
*
|
|
66
|
+
* @capability damage-matchup score a data-defined damage channel against a target's traits into independent typed multipliers
|
|
67
|
+
*/
|
|
68
|
+
export declare function resolveMatchup<TChannel extends string = DamageChannelId, TTrait extends string = TargetTraitId>(matchup: DamageMatchup<TChannel, TTrait>, channel: TChannel | string, targetTraits: readonly (TTrait | string)[]): ResolvedMatchup;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
function multiplyInto(acc, outputs) {
|
|
2
|
+
if (outputs.impact !== undefined)
|
|
3
|
+
acc.impact *= outputs.impact;
|
|
4
|
+
if (outputs.applyChance !== undefined)
|
|
5
|
+
acc.applyChance *= outputs.applyChance;
|
|
6
|
+
if (outputs.magnitude !== undefined)
|
|
7
|
+
acc.magnitude *= outputs.magnitude;
|
|
8
|
+
if (outputs.duration !== undefined)
|
|
9
|
+
acc.duration *= outputs.duration;
|
|
10
|
+
if (outputs.extra !== undefined) {
|
|
11
|
+
for (const [key, value] of Object.entries(outputs.extra)) {
|
|
12
|
+
acc.extra[key] = (acc.extra[key] ?? 1) * value;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Resolve a channel against a target's traits into independent, multiplied outputs. Pure and
|
|
18
|
+
* order-independent: every trait the channel has an entry for contributes, its axes multiplying
|
|
19
|
+
* into the running product; unmatched traits are skipped, and when nothing matches the table's
|
|
20
|
+
* `default` (or identity) is used. Bounded by the trait count — no world scan.
|
|
21
|
+
*
|
|
22
|
+
* @capability damage-matchup score a data-defined damage channel against a target's traits into independent typed multipliers
|
|
23
|
+
*/
|
|
24
|
+
export function resolveMatchup(matchup, channel, targetTraits) {
|
|
25
|
+
const acc = { impact: 1, applyChance: 1, magnitude: 1, duration: 1, extra: {} };
|
|
26
|
+
const contributions = [];
|
|
27
|
+
const byTrait = matchup.entries[channel];
|
|
28
|
+
if (byTrait !== undefined) {
|
|
29
|
+
for (const trait of targetTraits) {
|
|
30
|
+
const outputs = byTrait[trait];
|
|
31
|
+
if (outputs === undefined)
|
|
32
|
+
continue;
|
|
33
|
+
multiplyInto(acc, outputs);
|
|
34
|
+
contributions.push({ trait, outputs });
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const matched = contributions.length > 0;
|
|
38
|
+
if (!matched && matchup.default !== undefined) {
|
|
39
|
+
multiplyInto(acc, matchup.default);
|
|
40
|
+
}
|
|
41
|
+
return { channel, ...acc, matched, contributions };
|
|
42
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { type DamageChannelId, type DamageMatchup, type ResolvedMatchup, type TargetTraitId } from "./damageMatchup.js";
|
|
2
|
+
import { type ReceivedDamageResult, type ReceivedModifier } from "./receivedDamage.js";
|
|
3
|
+
import { type StatusApplicationOutcome, type StatusApplicationSpec, type StatusImmunity, type StatusInstance } from "./statusApplication.js";
|
|
4
|
+
/**
|
|
5
|
+
* One data-defined damage hit: a channel, a base impact, the target's traits and carried statuses,
|
|
6
|
+
* and the caller-owned matchup/received/status data that shapes the outcome. Everything is
|
|
7
|
+
* serializable; the only non-data input is the injected `rng`, so authority can resolve a hit and
|
|
8
|
+
* replicate the returned instances.
|
|
9
|
+
*/
|
|
10
|
+
export interface DamageHitInput {
|
|
11
|
+
channel: DamageChannelId;
|
|
12
|
+
/** Base direct impact before matchup and receiver modifiers. */
|
|
13
|
+
impact: number;
|
|
14
|
+
target: string;
|
|
15
|
+
source?: string;
|
|
16
|
+
/** Traits the target presents to the matchup (`"armored"`, `"shielded"`). */
|
|
17
|
+
targetTraits?: readonly TargetTraitId[];
|
|
18
|
+
/** Statuses the target already carries — feeds received predicates and stacking. */
|
|
19
|
+
targetStatuses?: readonly string[];
|
|
20
|
+
/** Caller tags on the hit (`"crit"`, `"aoe"`). */
|
|
21
|
+
tags?: readonly string[];
|
|
22
|
+
/** Channel-vs-trait table; omitted means identity outputs. */
|
|
23
|
+
matchup?: DamageMatchup;
|
|
24
|
+
/** Receiver-side modifiers to run over the post-matchup impact. */
|
|
25
|
+
received?: readonly ReceivedModifier[];
|
|
26
|
+
/** A status this hit tries to apply; omitted means impact only. */
|
|
27
|
+
status?: StatusApplicationSpec;
|
|
28
|
+
/** The target's existing instance of `status`, for stacking/refresh. */
|
|
29
|
+
currentStatus?: StatusInstance | null;
|
|
30
|
+
/** Statuses the target is immune to. */
|
|
31
|
+
immunity?: StatusImmunity | null;
|
|
32
|
+
/** Deterministic RNG for the status roll; defaults to `Math.random`. */
|
|
33
|
+
rng?: () => number;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* The full, provenance-rich result of resolving a hit — every stage kept for UI and debugging.
|
|
37
|
+
* `impact` is the final number to drain; `matchup`, `received`, and `status` expose exactly how it
|
|
38
|
+
* got there. Authority applies `impact` (plus `received.redirects`/`conversions`) and the returned
|
|
39
|
+
* status `instance`; nothing here mutates game state.
|
|
40
|
+
*/
|
|
41
|
+
export interface DamageHitResolution {
|
|
42
|
+
channel: DamageChannelId;
|
|
43
|
+
/** Final impact on the primary target/channel after matchup and receiver modifiers. */
|
|
44
|
+
impact: number;
|
|
45
|
+
immune: boolean;
|
|
46
|
+
/** The matchup outputs and their contributions. */
|
|
47
|
+
matchup: ResolvedMatchup;
|
|
48
|
+
/** The receiver-side pass over the matchup-scaled impact. */
|
|
49
|
+
received: ReceivedDamageResult;
|
|
50
|
+
/** The status application outcome, when the hit carried a `status`. */
|
|
51
|
+
status?: StatusApplicationOutcome;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Resolve a full damage hit through the data-defined pipeline: score the channel against the
|
|
55
|
+
* target's traits ({@link resolveMatchup}), scale base impact by the matchup's `impact` axis,
|
|
56
|
+
* run receiver-side modifiers ({@link resolveReceivedDamage}), then roll status application scaled
|
|
57
|
+
* by the matchup's `applyChance`/`magnitude`/`duration` axes ({@link resolveStatusApplication}).
|
|
58
|
+
* Pure and deterministic given a seeded `rng`; returns full provenance and never mutates state, so
|
|
59
|
+
* it is safe to run on the authority and replicate the results.
|
|
60
|
+
*
|
|
61
|
+
* @capability damage-hit resolve a full data-defined damage hit — matchup, impact, receiver modifiers, and status application — with provenance
|
|
62
|
+
*/
|
|
63
|
+
export declare function resolveDamageHit(input: DamageHitInput): DamageHitResolution;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { resolveMatchup, } from "./damageMatchup.js";
|
|
2
|
+
import { resolveReceivedDamage, } from "./receivedDamage.js";
|
|
3
|
+
import { resolveStatusApplication, } from "./statusApplication.js";
|
|
4
|
+
/**
|
|
5
|
+
* Resolve a full damage hit through the data-defined pipeline: score the channel against the
|
|
6
|
+
* target's traits ({@link resolveMatchup}), scale base impact by the matchup's `impact` axis,
|
|
7
|
+
* run receiver-side modifiers ({@link resolveReceivedDamage}), then roll status application scaled
|
|
8
|
+
* by the matchup's `applyChance`/`magnitude`/`duration` axes ({@link resolveStatusApplication}).
|
|
9
|
+
* Pure and deterministic given a seeded `rng`; returns full provenance and never mutates state, so
|
|
10
|
+
* it is safe to run on the authority and replicate the results.
|
|
11
|
+
*
|
|
12
|
+
* @capability damage-hit resolve a full data-defined damage hit — matchup, impact, receiver modifiers, and status application — with provenance
|
|
13
|
+
*/
|
|
14
|
+
export function resolveDamageHit(input) {
|
|
15
|
+
const matchup = resolveMatchup(input.matchup ?? { entries: {} }, input.channel, input.targetTraits ?? []);
|
|
16
|
+
const context = {
|
|
17
|
+
channel: input.channel,
|
|
18
|
+
target: input.target,
|
|
19
|
+
...(input.source !== undefined ? { source: input.source } : {}),
|
|
20
|
+
...(input.targetStatuses !== undefined ? { targetStatuses: input.targetStatuses } : {}),
|
|
21
|
+
...(input.tags !== undefined ? { tags: input.tags } : {}),
|
|
22
|
+
};
|
|
23
|
+
const received = resolveReceivedDamage({
|
|
24
|
+
amount: input.impact * matchup.impact,
|
|
25
|
+
context,
|
|
26
|
+
modifiers: input.received ?? [],
|
|
27
|
+
});
|
|
28
|
+
const resolution = {
|
|
29
|
+
channel: input.channel,
|
|
30
|
+
impact: received.amount,
|
|
31
|
+
immune: received.immune,
|
|
32
|
+
matchup,
|
|
33
|
+
received,
|
|
34
|
+
};
|
|
35
|
+
if (input.status !== undefined) {
|
|
36
|
+
resolution.status = resolveStatusApplication({
|
|
37
|
+
spec: input.status,
|
|
38
|
+
scale: {
|
|
39
|
+
applyChance: matchup.applyChance,
|
|
40
|
+
magnitude: matchup.magnitude,
|
|
41
|
+
duration: matchup.duration,
|
|
42
|
+
},
|
|
43
|
+
current: input.currentStatus ?? null,
|
|
44
|
+
immunity: input.immunity ?? null,
|
|
45
|
+
...(input.source !== undefined ? { source: input.source } : {}),
|
|
46
|
+
...(input.rng !== undefined ? { rng: input.rng } : {}),
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
return resolution;
|
|
50
|
+
}
|
package/dist/combat/death.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { GameEvents } from "../game/events.js";
|
|
2
2
|
import type { Drop } from "../game/lootTable.js";
|
|
3
3
|
import type { ScatterOptions } from "../game/worldItem.js";
|
|
4
|
+
import type { DeathReason } from "./deathReason.js";
|
|
4
5
|
import type { EffectVia } from "./effects.js";
|
|
5
6
|
export type DeathReasonKind = DeathReason["kind"];
|
|
6
7
|
export interface OnDeathDropRule {
|
|
@@ -60,6 +61,11 @@ export interface DeathSystem {
|
|
|
60
61
|
resolveDeath(instanceId: string, reason: DeathReason): DeathResolution;
|
|
61
62
|
revive(instanceId: string): boolean;
|
|
62
63
|
}
|
|
64
|
+
/**
|
|
65
|
+
* Resolve entity death and the on-death consequences — drops, respawn eligibility, kill credit.
|
|
66
|
+
*
|
|
67
|
+
* @capability death-system resolve entity death and its on-death consequences
|
|
68
|
+
*/
|
|
63
69
|
export declare function createDeathSystem(deps: DeathSystemDeps): DeathSystem;
|
|
64
70
|
export interface EffectDeathContext {
|
|
65
71
|
from: string;
|
package/dist/combat/death.js
CHANGED
|
@@ -11,6 +11,11 @@ export function normalizeOnDeath(spec) {
|
|
|
11
11
|
function matchesReason(when, reason) {
|
|
12
12
|
return when === undefined || when.reason === reason.kind;
|
|
13
13
|
}
|
|
14
|
+
/**
|
|
15
|
+
* Resolve entity death and the on-death consequences — drops, respawn eligibility, kill credit.
|
|
16
|
+
*
|
|
17
|
+
* @capability death-system resolve entity death and its on-death consequences
|
|
18
|
+
*/
|
|
14
19
|
export function createDeathSystem(deps) {
|
|
15
20
|
const dead = new Set();
|
|
16
21
|
return {
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** Why an entity died — who or what gets credit, for drop/command rules and the `entity.died` event. */
|
|
2
|
+
export type DeathReason = {
|
|
3
|
+
kind: "player_kill";
|
|
4
|
+
killerUserId: string;
|
|
5
|
+
via?: {
|
|
6
|
+
item?: string;
|
|
7
|
+
};
|
|
8
|
+
} | {
|
|
9
|
+
kind: "environment";
|
|
10
|
+
source: string;
|
|
11
|
+
} | {
|
|
12
|
+
kind: "self";
|
|
13
|
+
source: string;
|
|
14
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -31,4 +31,9 @@ export interface DefensiveWindow {
|
|
|
31
31
|
evaluate(nowMs: number, attack: AttackMeta): DefenseResolution;
|
|
32
32
|
isInvulnerable(nowMs: number): boolean;
|
|
33
33
|
}
|
|
34
|
+
/**
|
|
35
|
+
* Open a timed defensive window — block, parry, or i-frames — and test incoming hits against it.
|
|
36
|
+
*
|
|
37
|
+
* @capability parry-window time a block/parry/i-frame defensive window against incoming hits
|
|
38
|
+
*/
|
|
34
39
|
export declare function createDefensiveWindow(config: DefensiveWindowConfig): DefensiveWindow;
|
|
@@ -32,6 +32,11 @@ export function resolveDefense(input) {
|
|
|
32
32
|
return { outcome: "block", perfect: true };
|
|
33
33
|
return { outcome: "hit", perfect: false };
|
|
34
34
|
}
|
|
35
|
+
/**
|
|
36
|
+
* Open a timed defensive window — block, parry, or i-frames — and test incoming hits against it.
|
|
37
|
+
*
|
|
38
|
+
* @capability parry-window time a block/parry/i-frame defensive window against incoming hits
|
|
39
|
+
*/
|
|
35
40
|
export function createDefensiveWindow(config) {
|
|
36
41
|
let openedAt = null;
|
|
37
42
|
function elapsed(nowMs) {
|
|
@@ -39,5 +39,9 @@ export interface DotField {
|
|
|
39
39
|
/** Advance every active DoT; returns the damage due this frame plus an `expired` marker per finished DoT. */
|
|
40
40
|
tick(dtSeconds: number): DotTick[];
|
|
41
41
|
}
|
|
42
|
-
/**
|
|
42
|
+
/**
|
|
43
|
+
* Builds an empty {@link DotField}; `apply` DoTs onto it and drain damage each frame with `tick`.
|
|
44
|
+
*
|
|
45
|
+
* @capability dot-field track stacking damage-over-time effects and drain damage each frame
|
|
46
|
+
*/
|
|
43
47
|
export declare function createDotField(): DotField;
|
package/dist/combat/dotField.js
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/**
|
|
2
|
+
* Builds an empty {@link DotField}; `apply` DoTs onto it and drain damage each frame with `tick`.
|
|
3
|
+
*
|
|
4
|
+
* @capability dot-field track stacking damage-over-time effects and drain damage each frame
|
|
5
|
+
*/
|
|
2
6
|
export function createDotField() {
|
|
3
7
|
const dots = new Map();
|
|
4
8
|
return {
|
package/dist/combat/downed.d.ts
CHANGED
|
@@ -32,4 +32,9 @@ export interface DownedState {
|
|
|
32
32
|
clear(instanceId: string): void;
|
|
33
33
|
snapshot(): Record<string, DownedEntry>;
|
|
34
34
|
}
|
|
35
|
+
/**
|
|
36
|
+
* A downed/bleed-out state that ticks toward death and that teammates can revive before the timer runs out.
|
|
37
|
+
*
|
|
38
|
+
* @capability downed-revive a downed/bleed-out state teammates can revive before death
|
|
39
|
+
*/
|
|
35
40
|
export declare function createDownedState(config: DownedConfig): DownedState;
|
package/dist/combat/downed.js
CHANGED
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A downed/bleed-out state that ticks toward death and that teammates can revive before the timer runs out.
|
|
3
|
+
*
|
|
4
|
+
* @capability downed-revive a downed/bleed-out state teammates can revive before death
|
|
5
|
+
*/
|
|
1
6
|
export function createDownedState(config) {
|
|
2
7
|
const bleedoutSeconds = Math.max(0, config.bleedoutSeconds);
|
|
3
8
|
const reviveSeconds = config.reviveSeconds !== undefined ? Math.max(0, config.reviveSeconds) : 0;
|
package/dist/combat/effects.d.ts
CHANGED
|
@@ -69,4 +69,9 @@ export interface EffectSystem {
|
|
|
69
69
|
preview(input: SingleTargetEffectInput): number;
|
|
70
70
|
applyEffect(input: EffectInput): EffectResult[];
|
|
71
71
|
}
|
|
72
|
+
/**
|
|
73
|
+
* Apply, stack, and tick timed status effects — buffs, debuffs, DoTs — on entities.
|
|
74
|
+
*
|
|
75
|
+
* @capability status-effects apply and tick timed status effects and buffs on entities
|
|
76
|
+
*/
|
|
72
77
|
export declare function createEffectSystem(deps: EffectSystemDeps): EffectSystem;
|
package/dist/combat/effects.js
CHANGED
|
@@ -21,6 +21,11 @@ export function resolveAreaTargets(spatial, input, accept) {
|
|
|
21
21
|
return targets;
|
|
22
22
|
}
|
|
23
23
|
const DEFAULT_DRAIN_STAT = "damage";
|
|
24
|
+
/**
|
|
25
|
+
* Apply, stack, and tick timed status effects — buffs, debuffs, DoTs — on entities.
|
|
26
|
+
*
|
|
27
|
+
* @capability status-effects apply and tick timed status effects and buffs on entities
|
|
28
|
+
*/
|
|
24
29
|
export function createEffectSystem(deps) {
|
|
25
30
|
function resolveRule(instanceId, effect) {
|
|
26
31
|
return deps.resolveReceive(instanceId)?.[effect] ?? null;
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
import type { NavPoint } from "../nav/navGrid.js";
|
|
2
|
+
/**
|
|
3
|
+
* Lifecycle status of one phase in an encounter sequence: waiting to run, currently
|
|
4
|
+
* running, or finished. Groups and leaves share the same three states.
|
|
5
|
+
*/
|
|
6
|
+
export type PhaseStatus = "pending" | "active" | "complete";
|
|
7
|
+
/**
|
|
8
|
+
* Reference to a registered completion predicate: a `kind` naming the evaluator plus
|
|
9
|
+
* opaque `params` the evaluator reads. The sequence core never interprets `params`; the
|
|
10
|
+
* predicate registered under `kind` does.
|
|
11
|
+
*/
|
|
12
|
+
export interface PhaseCompletionRef {
|
|
13
|
+
kind: string;
|
|
14
|
+
params?: Readonly<Record<string, unknown>>;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Reference to a registered spawn provider invoked when a phase is entered: a `kind`
|
|
18
|
+
* naming the provider plus opaque `params`. Spawning is one optional node adapter — a
|
|
19
|
+
* phase without `spawn` simply emits no spawn requests.
|
|
20
|
+
*/
|
|
21
|
+
export interface PhaseSpawnRef {
|
|
22
|
+
kind: string;
|
|
23
|
+
params?: Readonly<Record<string, unknown>>;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* One node in an encounter sequence tree. `data` is caller-owned and opaque to the core.
|
|
27
|
+
* A node with `children` is a group whose children run in order; a node without is a leaf.
|
|
28
|
+
* `completion` gates when the node finishes, `spawn` names an on-enter provider, and
|
|
29
|
+
* `repeat` re-runs the node's subtree that many extra times before advancing.
|
|
30
|
+
*/
|
|
31
|
+
export interface EncounterPhase<TData = unknown> {
|
|
32
|
+
/** Stable, tree-unique id. Survives serialization and phase injection. */
|
|
33
|
+
id: string;
|
|
34
|
+
data?: TData;
|
|
35
|
+
children?: readonly EncounterPhase<TData>[];
|
|
36
|
+
/**
|
|
37
|
+
* Completion predicate reference. A leaf without one completes immediately (a marker or
|
|
38
|
+
* spawn-only phase); a group without one completes once all its children complete.
|
|
39
|
+
*/
|
|
40
|
+
completion?: PhaseCompletionRef;
|
|
41
|
+
spawn?: PhaseSpawnRef;
|
|
42
|
+
/** Extra runs of this node's subtree before advancing. Default 0 (runs once). */
|
|
43
|
+
repeat?: number;
|
|
44
|
+
}
|
|
45
|
+
/** Per-node runtime record. Serializable — holds no functions or tree references. */
|
|
46
|
+
export interface PhaseRuntime {
|
|
47
|
+
status: PhaseStatus;
|
|
48
|
+
/** 0-based repeat iteration currently running. */
|
|
49
|
+
iteration: number;
|
|
50
|
+
/** `elapsed` at which the node was most recently entered, for time-based predicates. */
|
|
51
|
+
enteredAt: number;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Full serializable encounter state: the working phase tree (including any injected
|
|
55
|
+
* phases), a per-node runtime map, the active path from root to the deepest open node,
|
|
56
|
+
* accumulated time, and whether the sequence has finished. Round-trips through JSON with
|
|
57
|
+
* no behavioral change; the registries live in {@link EncounterConfig}, not here.
|
|
58
|
+
*/
|
|
59
|
+
export interface EncounterState<TData = unknown> {
|
|
60
|
+
roots: EncounterPhase<TData>[];
|
|
61
|
+
nodes: Record<string, PhaseRuntime>;
|
|
62
|
+
/** Ids from a root down to the deepest open node; empty before start and once done. */
|
|
63
|
+
activePath: string[];
|
|
64
|
+
elapsed: number;
|
|
65
|
+
started: boolean;
|
|
66
|
+
done: boolean;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Caller-supplied signals a completion predicate reads. Every field is optional and
|
|
70
|
+
* opaque to the core: `counts` of tagged live entities, continuous `metrics`, cumulative
|
|
71
|
+
* `events`, and boolean `flags`. Deterministic given the same values.
|
|
72
|
+
*/
|
|
73
|
+
export interface EncounterSignals {
|
|
74
|
+
counts?: Readonly<Record<string, number>>;
|
|
75
|
+
metrics?: Readonly<Record<string, number>>;
|
|
76
|
+
events?: Readonly<Record<string, number>>;
|
|
77
|
+
flags?: Readonly<Record<string, boolean>>;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Context passed to {@link startEncounter} / {@link updateEncounter}: the caller signals
|
|
81
|
+
* predicates evaluate against, plus named `spawnPoints` catalogs (authored in the scene,
|
|
82
|
+
* referenced by key) that spawn providers place against. Never holds coordinates the
|
|
83
|
+
* sequence itself owns.
|
|
84
|
+
*/
|
|
85
|
+
export interface EncounterContext {
|
|
86
|
+
signals?: EncounterSignals;
|
|
87
|
+
/** Named lists of authored scene spawn points, referenced by spawn providers by key. */
|
|
88
|
+
spawnPoints?: Readonly<Record<string, readonly NavPoint[]>>;
|
|
89
|
+
}
|
|
90
|
+
/** Evaluation context a completion predicate receives for the node under test. */
|
|
91
|
+
export interface PredicateContext {
|
|
92
|
+
phaseId: string;
|
|
93
|
+
iteration: number;
|
|
94
|
+
/** Total accumulated encounter time. */
|
|
95
|
+
elapsed: number;
|
|
96
|
+
/** Time since this node was entered (0 on the tick it is entered). */
|
|
97
|
+
phaseElapsed: number;
|
|
98
|
+
signals: EncounterSignals;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* A completion predicate: pure and deterministic, returns true when the node it gates is
|
|
102
|
+
* finished. Registered under a `kind` and reused across phases with different `params`.
|
|
103
|
+
*/
|
|
104
|
+
export type CompletionPredicate = (params: Readonly<Record<string, unknown>>, ctx: PredicateContext) => boolean;
|
|
105
|
+
/** A single spawn request a provider emits; `ref` is caller-defined, `point` optional. */
|
|
106
|
+
export interface EncounterSpawnRequest {
|
|
107
|
+
ref: string;
|
|
108
|
+
point?: NavPoint;
|
|
109
|
+
data?: unknown;
|
|
110
|
+
}
|
|
111
|
+
/** Evaluation context a spawn provider receives when its phase is entered. */
|
|
112
|
+
export interface SpawnProviderContext {
|
|
113
|
+
phaseId: string;
|
|
114
|
+
iteration: number;
|
|
115
|
+
elapsed: number;
|
|
116
|
+
spawnPoints: Readonly<Record<string, readonly NavPoint[]>>;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* A spawn provider: given the phase's `params` and context, returns the spawn requests to
|
|
120
|
+
* emit on enter. Deterministic; reads authored scene points from `ctx.spawnPoints` rather
|
|
121
|
+
* than embedding coordinates.
|
|
122
|
+
*/
|
|
123
|
+
export type SpawnProvider = (params: Readonly<Record<string, unknown>>, ctx: SpawnProviderContext) => readonly EncounterSpawnRequest[];
|
|
124
|
+
/** A lifecycle event emitted while stepping an encounter, carrying provenance. */
|
|
125
|
+
export type EncounterEvent = {
|
|
126
|
+
type: "enter";
|
|
127
|
+
phaseId: string;
|
|
128
|
+
iteration: number;
|
|
129
|
+
} | {
|
|
130
|
+
type: "spawn";
|
|
131
|
+
phaseId: string;
|
|
132
|
+
provider: string;
|
|
133
|
+
requests: readonly EncounterSpawnRequest[];
|
|
134
|
+
} | {
|
|
135
|
+
type: "complete";
|
|
136
|
+
phaseId: string;
|
|
137
|
+
iteration: number;
|
|
138
|
+
reason: string;
|
|
139
|
+
} | {
|
|
140
|
+
type: "done";
|
|
141
|
+
};
|
|
142
|
+
/** Result of a step: the (mutated, returned) state and the events emitted this step. */
|
|
143
|
+
export interface EncounterStep<TData = unknown> {
|
|
144
|
+
state: EncounterState<TData>;
|
|
145
|
+
events: EncounterEvent[];
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Non-serializable configuration for an encounter: the authored phase tree plus predicate
|
|
149
|
+
* and spawn-provider registries. Re-supplied alongside a loaded {@link EncounterState}, the
|
|
150
|
+
* way `advanceSpawnDirector` pairs config with state, so the state itself stays pure data.
|
|
151
|
+
*/
|
|
152
|
+
export interface EncounterConfig<TData = unknown> {
|
|
153
|
+
phases: readonly EncounterPhase<TData>[];
|
|
154
|
+
/** Extra predicates, merged over the built-ins (a same-named entry overrides). */
|
|
155
|
+
predicates?: Readonly<Record<string, CompletionPredicate>>;
|
|
156
|
+
/** Extra spawn providers, merged over the built-ins. */
|
|
157
|
+
spawnProviders?: Readonly<Record<string, SpawnProvider>>;
|
|
158
|
+
}
|
|
159
|
+
/** Where to insert an injected phase, relative to an existing node by id. */
|
|
160
|
+
export type PhaseInjectAt = {
|
|
161
|
+
before: string;
|
|
162
|
+
} | {
|
|
163
|
+
after: string;
|
|
164
|
+
} | {
|
|
165
|
+
childOf: string;
|
|
166
|
+
index?: number;
|
|
167
|
+
};
|
|
168
|
+
/**
|
|
169
|
+
* Built-in completion predicates covering the common encounter gates: `immediate` (leaf
|
|
170
|
+
* marker), `manual`/`flag` (external event via a caller flag), `timer` (phase seconds),
|
|
171
|
+
* `cleared` (tagged entity count drained), `metric` (threshold on a live value), `event`
|
|
172
|
+
* (cumulative event count), and `quorum` (at least N of nested predicates met). Merge your
|
|
173
|
+
* own over these through {@link EncounterConfig.predicates}.
|
|
174
|
+
*
|
|
175
|
+
* @capability encounter-predicates gate encounter phase completion on timers, cleared spawns, metrics, events, or a quorum of conditions
|
|
176
|
+
*/
|
|
177
|
+
export declare const BUILTIN_COMPLETION_PREDICATES: Readonly<Record<string, CompletionPredicate>>;
|
|
178
|
+
/**
|
|
179
|
+
* Built-in spawn providers. `points` reads a named authored scene point list from context
|
|
180
|
+
* and cycles it to emit `count` requests, keeping coordinates in the scene rather than the
|
|
181
|
+
* sequence. `list` echoes literal requests authored in `params.requests`. Merge your own
|
|
182
|
+
* catalog- or director-backed providers through {@link EncounterConfig.spawnProviders}.
|
|
183
|
+
*
|
|
184
|
+
* @capability encounter-spawn-providers turn an entered encounter phase into spawn requests from authored scene points or an inline list
|
|
185
|
+
*/
|
|
186
|
+
export declare const BUILTIN_SPAWN_PROVIDERS: Readonly<Record<string, SpawnProvider>>;
|
|
187
|
+
/**
|
|
188
|
+
* Build the initial, serializable state for an encounter from its config. Deep-copies the
|
|
189
|
+
* authored phase tree (so later injection never mutates the config), verifies phase ids are
|
|
190
|
+
* unique, and leaves every node pending. Does not enter the first phase — call
|
|
191
|
+
* {@link startEncounter} for that.
|
|
192
|
+
*
|
|
193
|
+
* @capability encounter-state create the serializable starting state of a hierarchical encounter sequence
|
|
194
|
+
*/
|
|
195
|
+
export declare function createEncounterState<TData>(config: EncounterConfig<TData>): EncounterState<TData>;
|
|
196
|
+
/**
|
|
197
|
+
* Start a created encounter: enter the first root phase, descending to its first leaf, and
|
|
198
|
+
* return the initial enter/spawn events. A no-op (with no events) on an already-started or
|
|
199
|
+
* empty encounter. Mutates and returns `state`.
|
|
200
|
+
*
|
|
201
|
+
* @capability encounter-start enter the first phase of a hierarchical encounter and emit its opening spawn events
|
|
202
|
+
*/
|
|
203
|
+
export declare function startEncounter<TData>(config: EncounterConfig<TData>, state: EncounterState<TData>, ctx?: EncounterContext): EncounterStep<TData>;
|
|
204
|
+
/**
|
|
205
|
+
* Advance an encounter by `dt` seconds against the caller `ctx`. Accumulates time, then
|
|
206
|
+
* repeatedly: evaluates the cursor node's completion predicate; on completion, either
|
|
207
|
+
* re-runs its subtree (`repeat`) or marks it complete and advances to the next sibling —
|
|
208
|
+
* bubbling up to parent groups whose children are exhausted — entering the next chain and
|
|
209
|
+
* emitting enter/spawn/complete events. Emits a final `done` event when the last phase
|
|
210
|
+
* completes. Bounded per call by node count; mutates and returns `state`.
|
|
211
|
+
*
|
|
212
|
+
* @capability encounter-advance step a hierarchical encounter, resolving predicate-gated completion, repeats, and nested advance with lifecycle events
|
|
213
|
+
*/
|
|
214
|
+
export declare function updateEncounter<TData>(config: EncounterConfig<TData>, state: EncounterState<TData>, dt: number, ctx?: EncounterContext): EncounterStep<TData>;
|
|
215
|
+
/**
|
|
216
|
+
* Force the deepest active phase (or a named active phase) to complete now, regardless of
|
|
217
|
+
* its predicate — the escape hatch for external/scripted completion and failure/retry flows.
|
|
218
|
+
* Advances into the next phase and emits the same lifecycle events as a natural completion.
|
|
219
|
+
* Returns no events if the phase is not currently active. Mutates and returns `state`.
|
|
220
|
+
*
|
|
221
|
+
* @capability encounter-force-complete externally complete an active encounter phase to drive scripted or failure-retry transitions
|
|
222
|
+
*/
|
|
223
|
+
export declare function forceCompletePhase<TData>(config: EncounterConfig<TData>, state: EncounterState<TData>, ctx?: EncounterContext, phaseId?: string): EncounterStep<TData>;
|
|
224
|
+
/**
|
|
225
|
+
* Insert a phase into the working tree at runtime — before/after a sibling, or as a child of
|
|
226
|
+
* a group — without disturbing already-completed or active nodes. The injected subtree
|
|
227
|
+
* becomes part of the serializable state (so a mid-encounter save preserves it) and is
|
|
228
|
+
* reached in normal order if it sits ahead of the cursor. Ids must stay tree-unique. Mutates
|
|
229
|
+
* and returns `state`.
|
|
230
|
+
*
|
|
231
|
+
* @capability encounter-inject-phase dynamically insert a phase or branch into a running encounter, e.g. a boss on the final wave
|
|
232
|
+
*/
|
|
233
|
+
export declare function injectPhase<TData>(state: EncounterState<TData>, phase: EncounterPhase<TData>, at: PhaseInjectAt): EncounterState<TData>;
|
|
234
|
+
/**
|
|
235
|
+
* The deepest active phase id — the completion cursor a HUD reads to label the current
|
|
236
|
+
* wave/phase — or null before start and once done.
|
|
237
|
+
*
|
|
238
|
+
* @capability encounter-active-phase read the id of the phase an encounter is currently waiting on
|
|
239
|
+
*/
|
|
240
|
+
export declare function activePhaseId<TData>(state: EncounterState<TData>): string | null;
|
|
241
|
+
/**
|
|
242
|
+
* The runtime status of a phase by id (pending/active/complete), or null if the id is
|
|
243
|
+
* unknown — for driving per-phase HUD ticks and objective checklists.
|
|
244
|
+
*
|
|
245
|
+
* @capability encounter-phase-status read whether a specific encounter phase is pending, active, or complete
|
|
246
|
+
*/
|
|
247
|
+
export declare function phaseStatus<TData>(state: EncounterState<TData>, id: string): PhaseStatus | null;
|
|
248
|
+
/**
|
|
249
|
+
* Progress across the whole tree: how many phases have completed out of the total node
|
|
250
|
+
* count, plus whether the encounter has finished. Counts injected phases.
|
|
251
|
+
*
|
|
252
|
+
* @capability encounter-progress read completed-vs-total progress across a hierarchical encounter for HUD or objective display
|
|
253
|
+
*/
|
|
254
|
+
export declare function encounterProgress<TData>(state: EncounterState<TData>): {
|
|
255
|
+
completed: number;
|
|
256
|
+
total: number;
|
|
257
|
+
done: boolean;
|
|
258
|
+
};
|