@jgengine/core 0.10.0 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +39 -2
- package/LICENSE +203 -661
- package/README.md +1 -1
- package/dist/ai/crowd.d.ts +55 -0
- package/dist/ai/crowd.js +114 -0
- package/dist/ai/flock.d.ts +5 -2
- package/dist/ai/flock.js +5 -2
- package/dist/ai/groupAssist.d.ts +1 -0
- package/dist/ai/groupAssist.js +1 -0
- package/dist/ai/heatSystem.d.ts +76 -0
- package/dist/ai/heatSystem.js +97 -0
- package/dist/ai/interestScheduler.d.ts +107 -0
- package/dist/ai/interestScheduler.js +118 -0
- package/dist/ai/jobBoard.d.ts +1 -0
- package/dist/ai/jobBoard.js +1 -0
- package/dist/ai/laneSelect.d.ts +5 -2
- package/dist/ai/laneSelect.js +5 -2
- package/dist/ai/mobBrain.d.ts +1 -0
- package/dist/ai/mobBrain.js +1 -0
- package/dist/ai/populationDirector.d.ts +103 -0
- package/dist/ai/populationDirector.js +190 -0
- package/dist/ai/pursuit.d.ts +56 -0
- package/dist/ai/pursuit.js +53 -0
- package/dist/ai/spawnDirector.d.ts +7 -2
- package/dist/ai/spawnDirector.js +18 -15
- package/dist/ai/spawnPoint.d.ts +3 -1
- package/dist/ai/spawnPoint.js +3 -1
- package/dist/ai/targetAcquisition.d.ts +84 -0
- package/dist/ai/targetAcquisition.js +92 -0
- package/dist/anim/easing.d.ts +19 -0
- package/dist/anim/easing.js +19 -0
- package/dist/anim/oscillator.d.ts +12 -0
- package/dist/anim/oscillator.js +25 -0
- package/dist/area/areaEffectField.d.ts +127 -0
- package/dist/area/areaEffectField.js +175 -0
- package/dist/area/stackPolicy.d.ts +47 -0
- package/dist/area/stackPolicy.js +99 -0
- package/dist/authoring.d.ts +2 -1
- package/dist/authoring.js +2 -1
- package/dist/board/laneBoard.d.ts +13 -0
- package/dist/board/laneBoard.js +13 -0
- package/dist/board/timelineBoard.d.ts +10 -0
- package/dist/board/timelineBoard.js +10 -0
- package/dist/combat/abilityKit.d.ts +18 -0
- package/dist/combat/abilityKit.js +24 -9
- package/dist/combat/animationState.d.ts +5 -0
- package/dist/combat/animationState.js +5 -0
- package/dist/combat/breakMeters.d.ts +10 -0
- package/dist/combat/breakMeters.js +10 -0
- package/dist/combat/castRunner.d.ts +5 -0
- package/dist/combat/castRunner.js +5 -0
- package/dist/combat/comboPoints.d.ts +5 -0
- package/dist/combat/comboPoints.js +5 -0
- package/dist/combat/comboString.d.ts +5 -0
- package/dist/combat/comboString.js +5 -0
- package/dist/combat/damageInterceptors.d.ts +192 -0
- package/dist/combat/damageInterceptors.js +251 -0
- package/dist/combat/damageMatchup.d.ts +68 -0
- package/dist/combat/damageMatchup.js +42 -0
- package/dist/combat/damageResolution.d.ts +63 -0
- package/dist/combat/damageResolution.js +50 -0
- package/dist/combat/death.d.ts +7 -1
- package/dist/combat/death.js +5 -0
- package/dist/combat/deathReason.d.ts +14 -0
- package/dist/combat/deathReason.js +1 -0
- package/dist/combat/defensiveWindow.d.ts +5 -0
- package/dist/combat/defensiveWindow.js +5 -0
- package/dist/combat/dotField.d.ts +5 -1
- package/dist/combat/dotField.js +5 -1
- package/dist/combat/downed.d.ts +5 -0
- package/dist/combat/downed.js +5 -0
- package/dist/combat/effects.d.ts +5 -0
- package/dist/combat/effects.js +5 -0
- package/dist/combat/encounterSequence.d.ts +258 -0
- package/dist/combat/encounterSequence.js +426 -0
- package/dist/combat/hitReaction.d.ts +57 -1
- package/dist/combat/hitReaction.js +45 -5
- package/dist/combat/magazine.d.ts +54 -0
- package/dist/combat/magazine.js +96 -0
- package/dist/combat/projectiles.d.ts +5 -0
- package/dist/combat/projectiles.js +32 -14
- package/dist/combat/receivedDamage.d.ts +117 -0
- package/dist/combat/receivedDamage.js +92 -0
- package/dist/combat/regenShield.d.ts +5 -1
- package/dist/combat/regenShield.js +5 -1
- package/dist/combat/renderCues.d.ts +51 -0
- package/dist/combat/renderCues.js +44 -0
- package/dist/combat/resourcePool.d.ts +5 -0
- package/dist/combat/resourcePool.js +5 -0
- package/dist/combat/rewardAllocation.d.ts +121 -0
- package/dist/combat/rewardAllocation.js +251 -0
- package/dist/combat/shotOrigin.d.ts +18 -1
- package/dist/combat/shotOrigin.js +39 -0
- package/dist/combat/statusApplication.d.ts +96 -0
- package/dist/combat/statusApplication.js +81 -0
- package/dist/combat/telegraph.d.ts +11 -2
- package/dist/combat/telegraph.js +11 -2
- package/dist/combat/thresholdCrossings.d.ts +85 -0
- package/dist/combat/thresholdCrossings.js +116 -0
- package/dist/combat.d.ts +35 -0
- package/dist/combat.js +35 -0
- package/dist/commands/commandRegistry.d.ts +11 -0
- package/dist/commands/commandRegistry.js +9 -2
- package/dist/crafting/crop.d.ts +18 -0
- package/dist/crafting/crop.js +18 -0
- package/dist/crafting/production.d.ts +5 -0
- package/dist/crafting/production.js +5 -0
- package/dist/devtools/controls.d.ts +38 -0
- package/dist/devtools/controls.js +181 -0
- package/dist/devtools/devtools.d.ts +5 -197
- package/dist/devtools/devtools.js +38 -774
- package/dist/devtools/discover.d.ts +32 -0
- package/dist/devtools/discover.js +240 -0
- package/dist/devtools/fallbackSeams.d.ts +50 -0
- package/dist/devtools/fallbackSeams.js +111 -0
- package/dist/devtools/frame.d.ts +15 -0
- package/dist/devtools/frame.js +247 -0
- package/dist/devtools/logs.d.ts +15 -0
- package/dist/devtools/logs.js +86 -0
- package/dist/devtools/overrides.d.ts +16 -0
- package/dist/devtools/overrides.js +66 -0
- package/dist/devtools/rewriteTunables.d.ts +17 -0
- package/dist/devtools/rewriteTunables.js +276 -0
- package/dist/devtools/saveEndpoint.d.ts +46 -0
- package/dist/devtools/saveEndpoint.js +48 -0
- package/dist/devtools/transformTunables.d.ts +3 -0
- package/dist/devtools/transformTunables.js +3 -0
- package/dist/devtools/tunableSchema.d.ts +31 -0
- package/dist/devtools/tunableSchema.js +31 -0
- package/dist/devtools/types.d.ts +212 -0
- package/dist/devtools/types.js +1 -0
- package/dist/economy/auctionBook.d.ts +122 -0
- package/dist/economy/auctionBook.js +213 -0
- package/dist/economy/currency.d.ts +12 -1
- package/dist/economy/currency.js +12 -1
- package/dist/economy/listingBook.d.ts +91 -0
- package/dist/economy/listingBook.js +144 -0
- package/dist/economy/priceHistory.d.ts +44 -0
- package/dist/economy/priceHistory.js +89 -0
- package/dist/economy/resourceLedger.d.ts +222 -0
- package/dist/economy/resourceLedger.js +353 -0
- package/dist/economy/sharedWallet.d.ts +14 -0
- package/dist/economy/sharedWallet.js +14 -0
- package/dist/economy/techTree.d.ts +12 -0
- package/dist/economy/techTree.js +12 -0
- package/dist/economy/unlockPoints.d.ts +92 -0
- package/dist/economy/unlockPoints.js +103 -0
- package/dist/economy/wallet.d.ts +26 -2
- package/dist/economy/wallet.js +35 -6
- package/dist/editor/commandApply.d.ts +5 -0
- package/dist/editor/commandApply.js +755 -0
- package/dist/editor/commands.d.ts +235 -7
- package/dist/editor/commands.js +82 -124
- package/dist/editor/directives.d.ts +94 -0
- package/dist/editor/directives.js +206 -0
- package/dist/editor/document.d.ts +194 -13
- package/dist/editor/document.js +1166 -19
- package/dist/editor/entityCatalog.d.ts +42 -0
- package/dist/editor/entityCatalog.js +101 -0
- package/dist/editor/environment.d.ts +74 -0
- package/dist/editor/environment.js +169 -0
- package/dist/editor/grid.d.ts +229 -0
- package/dist/editor/grid.js +366 -0
- package/dist/editor/gridAdapters.d.ts +80 -0
- package/dist/editor/gridAdapters.js +134 -0
- package/dist/editor/index.d.ts +98 -6
- package/dist/editor/index.js +13 -2
- package/dist/editor/liveSync.d.ts +127 -0
- package/dist/editor/liveSync.js +249 -0
- package/dist/editor/minimap.d.ts +31 -0
- package/dist/editor/minimap.js +73 -0
- package/dist/editor/runtimeInspector.d.ts +88 -0
- package/dist/editor/runtimeInspector.js +239 -0
- package/dist/editor/streamer.d.ts +66 -0
- package/dist/editor/streamer.js +68 -0
- package/dist/editor/types.d.ts +250 -1
- package/dist/editor/world.d.ts +136 -0
- package/dist/editor/world.js +303 -0
- package/dist/faction/reputation.d.ts +5 -0
- package/dist/faction/reputation.js +5 -0
- package/dist/format/distance.d.ts +17 -0
- package/dist/format/distance.js +18 -0
- package/dist/format/duration.d.ts +27 -0
- package/dist/format/duration.js +45 -0
- package/dist/format/speed.d.ts +17 -0
- package/dist/format/speed.js +25 -0
- package/dist/game/breeding.d.ts +161 -0
- package/dist/game/breeding.js +181 -0
- package/dist/game/cameraConfig.d.ts +451 -0
- package/dist/game/cameraConfig.js +1 -0
- package/dist/game/connectedPlayers.d.ts +6 -4
- package/dist/game/connectedPlayers.js +2 -2
- package/dist/game/cosmetics.d.ts +9 -0
- package/dist/game/cosmetics.js +16 -0
- package/dist/game/defineGame.d.ts +110 -5
- package/dist/game/defineGame.js +49 -4
- package/dist/game/defineSystem.d.ts +90 -0
- package/dist/game/defineSystem.js +47 -0
- package/dist/game/dialogue.d.ts +33 -0
- package/dist/game/dialogue.js +21 -0
- package/dist/game/events.d.ts +63 -13
- package/dist/game/events.js +5 -0
- package/dist/game/feed.d.ts +33 -0
- package/dist/game/feed.js +35 -2
- package/dist/game/gamePhase.d.ts +11 -0
- package/dist/game/gamePhase.js +16 -0
- package/dist/game/leaderboard.d.ts +5 -0
- package/dist/game/leaderboard.js +5 -0
- package/dist/game/loadout.d.ts +5 -0
- package/dist/game/loadout.js +5 -0
- package/dist/game/lootFilter.d.ts +2 -0
- package/dist/game/lootFilter.js +2 -0
- package/dist/game/lootPipeline.d.ts +164 -0
- package/dist/game/lootPipeline.js +216 -0
- package/dist/game/lootTable.d.ts +19 -2
- package/dist/game/lootTable.js +15 -5
- package/dist/game/objectives.d.ts +43 -0
- package/dist/game/objectives.js +36 -0
- package/dist/game/paramLayers.d.ts +148 -0
- package/dist/game/paramLayers.js +185 -0
- package/dist/game/ping.d.ts +5 -0
- package/dist/game/ping.js +5 -0
- package/dist/game/playableGame.d.ts +116 -432
- package/dist/game/playableGame.js +1 -1
- package/dist/game/progression.d.ts +35 -0
- package/dist/game/progression.js +19 -0
- package/dist/game/quest.d.ts +8 -0
- package/dist/game/quest.js +30 -3
- package/dist/game/race.d.ts +141 -0
- package/dist/game/race.js +169 -0
- package/dist/game/recordBook.d.ts +3 -1
- package/dist/game/recordBook.js +4 -1
- package/dist/game/ruleSelection.d.ts +75 -0
- package/dist/game/ruleSelection.js +127 -0
- package/dist/game/runDraft.d.ts +5 -0
- package/dist/game/runDraft.js +5 -0
- package/dist/game/saveStore.d.ts +111 -0
- package/dist/game/saveStore.js +312 -0
- package/dist/game/snapshotHistory.d.ts +67 -0
- package/dist/game/snapshotHistory.js +95 -0
- package/dist/game/social.d.ts +38 -1
- package/dist/game/social.js +71 -0
- package/dist/game/spawnPoints.d.ts +5 -0
- package/dist/game/spawnPoints.js +5 -0
- package/dist/game/systemRuntime.d.ts +50 -0
- package/dist/game/systemRuntime.js +157 -0
- package/dist/game/systemSchedule.d.ts +72 -0
- package/dist/game/systemSchedule.js +242 -0
- package/dist/game/toasts.d.ts +43 -0
- package/dist/game/toasts.js +44 -0
- package/dist/game/trade.d.ts +10 -0
- package/dist/game/trade.js +10 -0
- package/dist/game/tribe.d.ts +184 -0
- package/dist/game/tribe.js +432 -0
- package/dist/game/unlocks.d.ts +8 -0
- package/dist/game/unlocks.js +16 -0
- package/dist/game/vfxInstance.d.ts +138 -0
- package/dist/game/vfxInstance.js +96 -0
- package/dist/game/worldItem.d.ts +17 -4
- package/dist/game/worldItem.js +17 -4
- package/dist/gameplay.d.ts +93 -0
- package/dist/gameplay.js +93 -0
- package/dist/index.d.ts +5 -14
- package/dist/index.js +5 -14
- package/dist/input/actionBindings.d.ts +23 -6
- package/dist/input/actionBindings.js +23 -6
- package/dist/input/axisInput.d.ts +7 -2
- package/dist/input/axisInput.js +7 -2
- package/dist/input/controlGroups.d.ts +67 -0
- package/dist/input/controlGroups.js +41 -0
- package/dist/input/touchScheme.d.ts +82 -6
- package/dist/input/touchScheme.js +123 -10
- package/dist/interaction/lockpick.d.ts +61 -0
- package/dist/interaction/lockpick.js +168 -0
- package/dist/interaction/proximityPrompt.d.ts +2 -0
- package/dist/interaction/proximityPrompt.js +2 -0
- package/dist/interaction/qte.d.ts +5 -0
- package/dist/interaction/qte.js +5 -0
- package/dist/interaction/skillCheck.d.ts +5 -0
- package/dist/interaction/skillCheck.js +5 -0
- package/dist/inventory/encumbrance.d.ts +69 -0
- package/dist/inventory/encumbrance.js +68 -0
- package/dist/inventory/inventoryModel.d.ts +12 -0
- package/dist/inventory/inventoryModel.js +12 -0
- package/dist/inventory/shapedGrid.d.ts +16 -0
- package/dist/inventory/shapedGrid.js +16 -0
- package/dist/inventory/slotModel.d.ts +10 -0
- package/dist/inventory/slotModel.js +10 -0
- package/dist/item/durability.d.ts +5 -0
- package/dist/item/durability.js +6 -3
- package/dist/item/itemIdentity.d.ts +171 -0
- package/dist/item/itemIdentity.js +138 -0
- package/dist/item/itemInstanceRegistry.d.ts +32 -0
- package/dist/item/itemInstanceRegistry.js +34 -0
- package/dist/item/itemgen.d.ts +163 -0
- package/dist/item/itemgen.js +151 -0
- package/dist/item/modularItem.d.ts +5 -0
- package/dist/item/modularItem.js +5 -0
- package/dist/item/use.d.ts +5 -0
- package/dist/item/use.js +5 -0
- package/dist/item/useBehavior.d.ts +142 -0
- package/dist/item/useBehavior.js +105 -0
- package/dist/item/weapon.d.ts +5 -0
- package/dist/item/weapon.js +5 -0
- package/dist/math/scalar.d.ts +25 -0
- package/dist/math/scalar.js +47 -0
- package/dist/meta/changelog.d.ts +4 -1
- package/dist/meta/changelog.js +39 -2
- package/dist/movement/avoidance.d.ts +45 -0
- package/dist/movement/avoidance.js +123 -0
- package/dist/movement/cameraRig.d.ts +8 -0
- package/dist/movement/cameraRig.js +8 -0
- package/dist/movement/dash.d.ts +11 -0
- package/dist/movement/dash.js +11 -0
- package/dist/movement/formation.d.ts +135 -0
- package/dist/movement/formation.js +194 -0
- package/dist/movement/glideModel.d.ts +5 -0
- package/dist/movement/glideModel.js +5 -0
- package/dist/movement/grappleSwing.d.ts +5 -0
- package/dist/movement/grappleSwing.js +5 -0
- package/dist/movement/leaderTrail.d.ts +5 -0
- package/dist/movement/leaderTrail.js +5 -0
- package/dist/movement/movementModel.d.ts +50 -9
- package/dist/movement/movementModel.js +75 -29
- package/dist/movement/playerMovement.js +167 -12
- package/dist/movement/poseState.d.ts +13 -0
- package/dist/movement/poseState.js +16 -0
- package/dist/movement/steering.d.ts +8 -0
- package/dist/movement/steering.js +18 -0
- package/dist/multiplayer/combatSnapshot.d.ts +3 -0
- package/dist/multiplayer/combatSnapshot.js +16 -8
- package/dist/multiplayer/lagCompensation.d.ts +5 -0
- package/dist/multiplayer/lagCompensation.js +5 -0
- package/dist/multiplayer/presenceModel.d.ts +11 -1
- package/dist/multiplayer/presenceModel.js +17 -1
- package/dist/multiplayer/simultaneousCommit.d.ts +3 -0
- package/dist/multiplayer/simultaneousCommit.js +3 -0
- package/dist/multiplayer.d.ts +11 -0
- package/dist/multiplayer.js +11 -0
- package/dist/nav/pathFollow.d.ts +57 -0
- package/dist/nav/pathFollow.js +109 -0
- package/dist/orders/orderKinds.d.ts +156 -0
- package/dist/orders/orderKinds.js +197 -0
- package/dist/orders/orderQueue.d.ts +208 -0
- package/dist/orders/orderQueue.js +211 -0
- package/dist/physics/drivableVehicle.d.ts +31 -0
- package/dist/physics/drivableVehicle.js +16 -0
- package/dist/physics/flightDynamics.d.ts +82 -0
- package/dist/physics/flightDynamics.js +165 -0
- package/dist/physics/gravityField.d.ts +25 -0
- package/dist/physics/gravityField.js +41 -0
- package/dist/physics/kinematicVehicle.d.ts +108 -1
- package/dist/physics/kinematicVehicle.js +212 -15
- package/dist/physics/physicsWorld.d.ts +50 -12
- package/dist/physics/physicsWorld.js +120 -122
- package/dist/physics/radialImpulse.d.ts +25 -0
- package/dist/physics/radialImpulse.js +27 -0
- package/dist/physics/vehicleObstacles.d.ts +44 -0
- package/dist/physics/vehicleObstacles.js +115 -0
- package/dist/procedural.d.ts +3 -0
- package/dist/procedural.js +3 -0
- package/dist/progression/statGraph.d.ts +116 -0
- package/dist/progression/statGraph.js +318 -0
- package/dist/puzzle/cellGrid.d.ts +9 -0
- package/dist/puzzle/cellGrid.js +9 -0
- package/dist/puzzle/fallingPiece.d.ts +9 -0
- package/dist/puzzle/fallingPiece.js +9 -0
- package/dist/puzzle/nonogram.d.ts +39 -0
- package/dist/puzzle/nonogram.js +136 -0
- package/dist/random/nameGen.d.ts +5 -0
- package/dist/random/nameGen.js +5 -0
- package/dist/random/pick.d.ts +8 -0
- package/dist/random/pick.js +31 -0
- package/dist/random/rng.d.ts +26 -1
- package/dist/random/rng.js +32 -9
- package/dist/random/seedLink.d.ts +4 -0
- package/dist/random/seedLink.js +4 -0
- package/dist/relation/keyedValues.d.ts +54 -0
- package/dist/relation/keyedValues.js +115 -0
- package/dist/relation/thresholds.d.ts +62 -0
- package/dist/relation/thresholds.js +62 -0
- package/dist/render/color.d.ts +12 -0
- package/dist/render/color.js +26 -0
- package/dist/render/lookPreset.d.ts +41 -0
- package/dist/render/lookPreset.js +29 -0
- package/dist/render/postProcessing.d.ts +20 -0
- package/dist/render/postProcessing.js +21 -1
- package/dist/rules/predicate.d.ts +53 -0
- package/dist/rules/predicate.js +64 -0
- package/dist/rules/ruleEffects.d.ts +38 -0
- package/dist/rules/ruleEffects.js +37 -0
- package/dist/rules/triggeredRules.d.ts +160 -0
- package/dist/rules/triggeredRules.js +241 -0
- package/dist/runtime/adapter.d.ts +55 -3
- package/dist/runtime/adapter.js +57 -1
- package/dist/runtime/cameraDirector.d.ts +1 -0
- package/dist/runtime/cameraDirector.js +1 -0
- package/dist/runtime/commandRunner.d.ts +1 -0
- package/dist/runtime/commandRunner.js +1 -0
- package/dist/runtime/context/combat.d.ts +51 -0
- package/dist/runtime/context/combat.js +130 -0
- package/dist/runtime/context/combatFx.d.ts +23 -0
- package/dist/runtime/context/combatFx.js +161 -0
- package/dist/runtime/context/deathLoot.d.ts +30 -0
- package/dist/runtime/context/deathLoot.js +39 -0
- package/dist/runtime/context/player.d.ts +48 -0
- package/dist/runtime/context/player.js +125 -0
- package/dist/runtime/context/registries.d.ts +13 -0
- package/dist/runtime/context/registries.js +84 -0
- package/dist/runtime/context/scene.d.ts +59 -0
- package/dist/runtime/context/scene.js +291 -0
- package/dist/runtime/context/snapshotCodecs.d.ts +12 -0
- package/dist/runtime/context/snapshotCodecs.js +26 -0
- package/dist/runtime/context/worldItems.d.ts +21 -0
- package/dist/runtime/context/worldItems.js +37 -0
- package/dist/runtime/descriptors/baseline.d.ts +48 -0
- package/dist/runtime/descriptors/baseline.js +157 -0
- package/dist/runtime/descriptors/features.d.ts +79 -0
- package/dist/runtime/descriptors/features.js +299 -0
- package/dist/runtime/gameContext.d.ts +2 -327
- package/dist/runtime/gameContext.js +273 -778
- package/dist/runtime/gameContextTypes.d.ts +467 -0
- package/dist/runtime/gameContextTypes.js +1 -0
- package/dist/runtime/gameRuntime.d.ts +1 -0
- package/dist/runtime/gameRuntime.js +1 -0
- package/dist/runtime/headlessRunner.d.ts +62 -0
- package/dist/runtime/headlessRunner.js +45 -0
- package/dist/runtime/hostPersistence.d.ts +12 -0
- package/dist/runtime/hostPersistence.js +12 -0
- package/dist/runtime/hostPolicy.d.ts +51 -0
- package/dist/runtime/hostPolicy.js +68 -0
- package/dist/runtime/hostedGameRunner.d.ts +11 -4
- package/dist/runtime/hostedGameRunner.js +27 -3
- package/dist/runtime/hostedWorldSession.d.ts +15 -5
- package/dist/runtime/hostedWorldSession.js +12 -4
- package/dist/runtime/inputSnapshot.d.ts +8 -3
- package/dist/runtime/inputSnapshot.js +6 -2
- package/dist/runtime/motionIntents.d.ts +11 -2
- package/dist/runtime/motionIntents.js +16 -2
- package/dist/runtime/perContext.d.ts +15 -0
- package/dist/runtime/perContext.js +21 -0
- package/dist/runtime/runtimeSave.d.ts +79 -0
- package/dist/runtime/runtimeSave.js +105 -0
- package/dist/runtime/save.d.ts +4 -0
- package/dist/runtime/save.js +4 -0
- package/dist/runtime/snapshot.d.ts +7 -0
- package/dist/runtime/snapshot.js +7 -0
- package/dist/runtime/visibility.d.ts +2 -1
- package/dist/runtime/visibility.js +2 -1
- package/dist/runtime/worldChannel.d.ts +7 -3
- package/dist/runtime/worldChannel.js +51 -6
- package/dist/runtime/worldMirror.d.ts +14 -2
- package/dist/runtime/worldMirror.js +15 -2
- package/dist/runtime/worldProjection.d.ts +47 -0
- package/dist/runtime/worldProjection.js +52 -0
- package/dist/runtime/worldReplication.d.ts +30 -7
- package/dist/runtime/worldReplication.js +41 -9
- package/dist/runtime/worldSnapshot.d.ts +42 -3
- package/dist/runtime/worldSnapshot.js +34 -7
- package/dist/scene/assetCatalog.d.ts +26 -0
- package/dist/scene/assetCatalog.js +4 -0
- package/dist/scene/assetDiagnostics.d.ts +69 -0
- package/dist/scene/assetDiagnostics.js +110 -0
- package/dist/scene/assetGenerator.d.ts +65 -0
- package/dist/scene/assetGenerator.js +64 -0
- package/dist/scene/assetSpace.d.ts +137 -0
- package/dist/scene/assetSpace.js +257 -0
- package/dist/scene/authoredTriggers.d.ts +219 -0
- package/dist/scene/authoredTriggers.js +454 -0
- package/dist/scene/behaviorRuntime.d.ts +75 -0
- package/dist/scene/behaviorRuntime.js +217 -0
- package/dist/scene/behaviors.d.ts +14 -2
- package/dist/scene/behaviors.js +7 -2
- package/dist/scene/bodyBind.d.ts +60 -0
- package/dist/scene/bodyBind.js +51 -0
- package/dist/scene/builtinSceneKinds.d.ts +5 -0
- package/dist/scene/builtinSceneKinds.js +67 -0
- package/dist/scene/colliders.d.ts +71 -1
- package/dist/scene/colliders.js +145 -1
- package/dist/scene/collisionMesh.d.ts +94 -0
- package/dist/scene/collisionMesh.js +699 -0
- package/dist/scene/companion.d.ts +147 -0
- package/dist/scene/companion.js +193 -0
- package/dist/scene/entityStats.d.ts +18 -11
- package/dist/scene/entityStats.js +21 -16
- package/dist/scene/entityStore.d.ts +12 -1
- package/dist/scene/entityStore.js +15 -0
- package/dist/scene/facing.d.ts +18 -0
- package/dist/scene/facing.js +26 -0
- package/dist/scene/modelSockets.d.ts +33 -0
- package/dist/scene/modelSockets.js +29 -0
- package/dist/scene/objectQuery.d.ts +2 -0
- package/dist/scene/objectQuery.js +2 -0
- package/dist/scene/objectStore.d.ts +4 -0
- package/dist/scene/objectStore.js +6 -0
- package/dist/scene/possession.d.ts +8 -0
- package/dist/scene/possession.js +14 -0
- package/dist/scene/roster.d.ts +3 -0
- package/dist/scene/roster.js +12 -0
- package/dist/scene/sceneKinds.d.ts +256 -0
- package/dist/scene/sceneKinds.js +218 -0
- package/dist/scene/sceneOwnership.d.ts +169 -0
- package/dist/scene/sceneOwnership.js +179 -0
- package/dist/scene/sceneRaycast.js +15 -0
- package/dist/scene/selectionBookmarks.d.ts +93 -0
- package/dist/scene/selectionBookmarks.js +122 -0
- package/dist/scene/vehicleSeat.d.ts +68 -0
- package/dist/scene/vehicleSeat.js +59 -0
- package/dist/sensor/concealment.d.ts +3 -0
- package/dist/sensor/concealment.js +3 -0
- package/dist/sensor/freezeMonitor.d.ts +1 -0
- package/dist/sensor/freezeMonitor.js +1 -0
- package/dist/sensor/frustumSensor.d.ts +7 -3
- package/dist/sensor/frustumSensor.js +7 -3
- package/dist/sensor/hiddenStateProbe.d.ts +5 -2
- package/dist/sensor/hiddenStateProbe.js +5 -2
- package/dist/sensor/recordingBuffer.d.ts +2 -1
- package/dist/sensor/recordingBuffer.js +2 -1
- package/dist/sensor/replayLoop.d.ts +6 -2
- package/dist/sensor/replayLoop.js +6 -2
- package/dist/sensor/revealQuery.d.ts +2 -1
- package/dist/sensor/revealQuery.js +2 -1
- package/dist/sensor/visionCone.d.ts +10 -3
- package/dist/sensor/visionCone.js +10 -3
- package/dist/session/contestedChannel.d.ts +1 -0
- package/dist/session/contestedChannel.js +1 -0
- package/dist/session/extraction.d.ts +1 -0
- package/dist/session/extraction.js +1 -0
- package/dist/session/roles.d.ts +6 -0
- package/dist/session/roles.js +6 -0
- package/dist/session/roundState.d.ts +8 -0
- package/dist/session/roundState.js +2 -0
- package/dist/settings/settingsModel.d.ts +1 -0
- package/dist/settings/settingsModel.js +1 -0
- package/dist/stats/accumulatorMeter.d.ts +6 -0
- package/dist/stats/accumulatorMeter.js +6 -0
- package/dist/stats/eventMeter.d.ts +5 -0
- package/dist/stats/eventMeter.js +5 -0
- package/dist/stats/rollCheck.d.ts +5 -0
- package/dist/stats/rollCheck.js +5 -0
- package/dist/stats/spawnLevelStats.d.ts +110 -0
- package/dist/stats/spawnLevelStats.js +140 -0
- package/dist/stats/statModifiers.d.ts +5 -0
- package/dist/stats/statModifiers.js +5 -0
- package/dist/stats/statPool.d.ts +70 -0
- package/dist/stats/statPool.js +59 -0
- package/dist/store/changeSignal.d.ts +3 -0
- package/dist/store/changeSignal.js +2 -0
- package/dist/store/defineKeyedStore.d.ts +38 -0
- package/dist/store/defineKeyedStore.js +42 -0
- package/dist/store/defineStore.d.ts +33 -0
- package/dist/store/defineStore.js +35 -0
- package/dist/store/observableKeyedStore.d.ts +7 -0
- package/dist/store/observableKeyedStore.js +35 -2
- package/dist/survival/decayMeter.d.ts +55 -0
- package/dist/survival/decayMeter.js +130 -57
- package/dist/survival/moodle.d.ts +2 -0
- package/dist/survival/regionHealth.d.ts +6 -0
- package/dist/survival/regionHealth.js +6 -3
- package/dist/tactics/fallingGrid.d.ts +4 -2
- package/dist/tactics/fallingGrid.js +4 -2
- package/dist/tactics/predictiveQuery.d.ts +3 -0
- package/dist/tactics/predictiveQuery.js +3 -0
- package/dist/tactics/snapshot.d.ts +2 -0
- package/dist/tactics/snapshot.js +2 -0
- package/dist/tactics/surface.d.ts +1 -0
- package/dist/tactics/surface.js +1 -0
- package/dist/tactics/tacticalGrid.d.ts +1 -0
- package/dist/tactics/tacticalGrid.js +1 -0
- package/dist/time/beatClock.d.ts +14 -4
- package/dist/time/beatClock.js +14 -4
- package/dist/time/calendarClock.d.ts +3 -0
- package/dist/time/calendarClock.js +3 -0
- package/dist/time/idleProgress.d.ts +4 -0
- package/dist/time/idleProgress.js +4 -0
- package/dist/time/simClock.d.ts +2 -0
- package/dist/time/simClock.js +20 -5
- package/dist/ui/actionModel.d.ts +110 -0
- package/dist/ui/actionModel.js +159 -0
- package/dist/ui/gameLayout.d.ts +30 -11
- package/dist/ui/gameLayout.js +30 -11
- package/dist/ui/hudDocument.d.ts +114 -0
- package/dist/ui/hudDocument.js +220 -0
- package/dist/ui/hudLayout.d.ts +38 -1
- package/dist/ui/hudLayout.js +220 -17
- package/dist/ui/selectionModel.d.ts +92 -0
- package/dist/ui/selectionModel.js +88 -0
- package/dist/ui/tooltipModel.d.ts +63 -0
- package/dist/ui/tooltipModel.js +82 -0
- package/dist/ui.d.ts +15 -0
- package/dist/ui.js +15 -0
- package/dist/visibility/bounds.d.ts +8 -1
- package/dist/visibility/bounds.js +8 -1
- package/dist/visibility/frustum.d.ts +12 -3
- package/dist/visibility/frustum.js +12 -3
- package/dist/work/jobQueue.d.ts +201 -0
- package/dist/work/jobQueue.js +253 -0
- package/dist/work/unitTraining.d.ts +58 -0
- package/dist/work/unitTraining.js +52 -0
- package/dist/world/authoredEntities.d.ts +29 -0
- package/dist/world/authoredEntities.js +29 -0
- package/dist/world/authoredObjects.d.ts +72 -0
- package/dist/world/authoredObjects.js +81 -0
- package/dist/world/authoredSpawn.d.ts +39 -0
- package/dist/world/authoredSpawn.js +37 -0
- package/dist/world/buildSockets.d.ts +152 -0
- package/dist/world/buildSockets.js +188 -0
- package/dist/world/buildingGenerator.d.ts +18 -0
- package/dist/world/buildingGenerator.js +62 -0
- package/dist/world/buildings.d.ts +5 -0
- package/dist/world/buildings.js +5 -0
- package/dist/world/catenary.d.ts +22 -0
- package/dist/world/catenary.js +69 -0
- package/dist/world/cityBlocks.d.ts +152 -0
- package/dist/world/cityBlocks.js +670 -0
- package/dist/world/cityContent.d.ts +77 -0
- package/dist/world/cityContent.js +261 -0
- package/dist/world/cityGeometry.d.ts +114 -0
- package/dist/world/cityGeometry.js +573 -0
- package/dist/world/cityKind.d.ts +314 -0
- package/dist/world/cityKind.js +1578 -0
- package/dist/world/features.d.ts +133 -10
- package/dist/world/features.js +66 -6
- package/dist/world/footprintGrid.d.ts +59 -0
- package/dist/world/footprintGrid.js +141 -0
- package/dist/world/geometry.d.ts +64 -0
- package/dist/world/geometry.js +94 -0
- package/dist/world/grassKind.d.ts +51 -0
- package/dist/world/grassKind.js +101 -0
- package/dist/world/markers.d.ts +50 -4
- package/dist/world/markers.js +49 -0
- package/dist/world/massing.js +1 -1
- package/dist/world/minimapBake.d.ts +78 -0
- package/dist/world/minimapBake.js +208 -0
- package/dist/world/minimapTrack.d.ts +17 -0
- package/dist/world/minimapTrack.js +22 -0
- package/dist/world/pathInstances.d.ts +27 -0
- package/dist/world/pathInstances.js +27 -0
- package/dist/world/pathNetwork.d.ts +159 -0
- package/dist/world/pathNetwork.js +684 -0
- package/dist/world/pathTerrain.d.ts +80 -0
- package/dist/world/pathTerrain.js +142 -0
- package/dist/world/place.d.ts +166 -0
- package/dist/world/place.js +96 -0
- package/dist/world/placeAsset.d.ts +81 -0
- package/dist/world/placeAsset.js +79 -0
- package/dist/world/placement.d.ts +4 -0
- package/dist/world/placement.js +4 -0
- package/dist/world/placementController.d.ts +6 -0
- package/dist/world/placementController.js +6 -0
- package/dist/world/poleLineKind.d.ts +40 -0
- package/dist/world/poleLineKind.js +97 -0
- package/dist/world/polyline.d.ts +34 -0
- package/dist/world/polyline.js +88 -0
- package/dist/world/resourceNode.d.ts +109 -0
- package/dist/world/resourceNode.js +140 -0
- package/dist/world/roads.d.ts +8 -0
- package/dist/world/roads.js +38 -0
- package/dist/world/scatter.js +2 -20
- package/dist/world/scatterRegion.d.ts +164 -0
- package/dist/world/scatterRegion.js +409 -0
- package/dist/world/sceneShapes.d.ts +43 -0
- package/dist/world/sceneShapes.js +1 -0
- package/dist/world/segment.d.ts +27 -0
- package/dist/world/segment.js +43 -0
- package/dist/world/soilKind.d.ts +48 -0
- package/dist/world/soilKind.js +92 -0
- package/dist/world/spatialSample.d.ts +241 -0
- package/dist/world/spatialSample.js +465 -0
- package/dist/world/streets.d.ts +29 -0
- package/dist/world/streets.js +55 -0
- package/dist/world/terraform.d.ts +213 -1
- package/dist/world/terraform.js +627 -22
- package/dist/world/terrain.d.ts +164 -20
- package/dist/world/terrain.js +325 -41
- package/dist/world/terrainGuides.d.ts +182 -0
- package/dist/world/terrainGuides.js +343 -0
- package/dist/world/vec2.d.ts +81 -0
- package/dist/world/vec2.js +128 -0
- package/dist/world/vec3.d.ts +49 -0
- package/dist/world/vec3.js +76 -0
- package/dist/world/vegetation.d.ts +71 -0
- package/dist/world/vegetation.js +151 -0
- package/dist/world/visibilityField.d.ts +154 -0
- package/dist/world/visibilityField.js +271 -0
- package/dist/world/volumetricClouds.d.ts +52 -0
- package/dist/world/volumetricClouds.js +43 -0
- package/dist/world/walls.d.ts +9 -0
- package/dist/world/walls.js +9 -0
- package/dist/world/waterKind.d.ts +55 -0
- package/dist/world/waterKind.js +99 -0
- package/dist/world.d.ts +141 -0
- package/dist/world.js +141 -0
- package/package.json +32 -8
- package/skills/game-design/SKILL.md +28 -0
- package/skills/game-design/agents/openai.yaml +4 -0
- package/skills/game-design/references/application-playbook.md +170 -0
- package/skills/game-design/references/field-guide.md +288 -0
- package/skills/jgengine/SKILL.md +54 -0
- package/skills/jgengine/api.md +527 -0
- package/skills/jgengine/capabilities.md +131 -0
- package/skills/jgengine/recipes/minimal-game.md +88 -0
- package/skills/jgengine-combat/SKILL.md +38 -0
- package/skills/jgengine-combat/api.md +585 -0
- package/skills/jgengine-combat/capabilities.md +213 -0
- package/skills/jgengine-combat/recipes/portable-stat-pools.md +122 -0
- package/skills/jgengine-combat/reference.md +108 -0
- package/skills/jgengine-gameplay/SKILL.md +39 -0
- package/skills/jgengine-gameplay/api.md +1920 -0
- package/skills/jgengine-gameplay/capabilities.md +454 -0
- package/skills/jgengine-gameplay/reference-systems.md +56 -0
- package/skills/jgengine-world/SKILL.md +51 -0
- package/skills/jgengine-world/api.md +3056 -0
- package/skills/jgengine-world/capabilities.md +476 -0
- package/skills/jgengine-world/recipes/commanding-entities.md +128 -0
- package/skills/jgengine-world/reference.md +261 -0
- package/dist/cartridge/runtime.d.ts +0 -15
- package/dist/cartridge/runtime.js +0 -556
- package/dist/cartridge/spec.d.ts +0 -188
- package/dist/cartridge/spec.js +0 -19
- package/dist/cartridge/validate.d.ts +0 -2
- package/dist/cartridge/validate.js +0 -78
- package/dist/store/engineStore.d.ts +0 -22
- package/dist/store/engineStore.js +0 -50
- package/dist/store/features.d.ts +0 -10
- package/dist/store/features.js +0 -23
- package/llms.txt +0 -5389
|
@@ -1,28 +1,45 @@
|
|
|
1
|
+
/** @internal */
|
|
1
2
|
export function createObservableKeyedStore(areEqual) {
|
|
2
3
|
const store = new Map();
|
|
3
4
|
const listeners = new Set();
|
|
5
|
+
const membershipListeners = new Set();
|
|
4
6
|
const EMPTY = [];
|
|
7
|
+
const EMPTY_KEYS = [];
|
|
5
8
|
let arrayCache = EMPTY;
|
|
6
9
|
let arrayDirty = false;
|
|
10
|
+
let keysCache = EMPTY_KEYS;
|
|
11
|
+
let keysDirty = false;
|
|
12
|
+
let mapCache = new Map();
|
|
13
|
+
let mapDirty = false;
|
|
7
14
|
function emit() {
|
|
8
15
|
arrayDirty = true;
|
|
16
|
+
mapDirty = true;
|
|
9
17
|
for (const listener of listeners)
|
|
10
18
|
listener();
|
|
11
19
|
}
|
|
20
|
+
function emitMembership() {
|
|
21
|
+
keysDirty = true;
|
|
22
|
+
for (const listener of membershipListeners)
|
|
23
|
+
listener();
|
|
24
|
+
}
|
|
12
25
|
return {
|
|
13
26
|
set(key, value) {
|
|
27
|
+
const had = store.has(key);
|
|
14
28
|
const previous = store.get(key);
|
|
15
|
-
if (
|
|
29
|
+
if (had && areEqual?.(previous, value))
|
|
16
30
|
return;
|
|
17
31
|
if (previous !== value)
|
|
18
32
|
store.set(key, value);
|
|
19
33
|
emit();
|
|
34
|
+
if (!had)
|
|
35
|
+
emitMembership();
|
|
20
36
|
},
|
|
21
37
|
delete(key) {
|
|
22
38
|
if (!store.has(key))
|
|
23
39
|
return;
|
|
24
40
|
store.delete(key);
|
|
25
41
|
emit();
|
|
42
|
+
emitMembership();
|
|
26
43
|
},
|
|
27
44
|
get(key) {
|
|
28
45
|
return store.get(key);
|
|
@@ -34,8 +51,16 @@ export function createObservableKeyedStore(areEqual) {
|
|
|
34
51
|
listeners.add(listener);
|
|
35
52
|
return () => listeners.delete(listener);
|
|
36
53
|
},
|
|
54
|
+
subscribeMembership(listener) {
|
|
55
|
+
membershipListeners.add(listener);
|
|
56
|
+
return () => membershipListeners.delete(listener);
|
|
57
|
+
},
|
|
37
58
|
mapSnapshot() {
|
|
38
|
-
|
|
59
|
+
if (mapDirty) {
|
|
60
|
+
mapCache = new Map(store);
|
|
61
|
+
mapDirty = false;
|
|
62
|
+
}
|
|
63
|
+
return mapCache;
|
|
39
64
|
},
|
|
40
65
|
arraySnapshot() {
|
|
41
66
|
if (arrayDirty) {
|
|
@@ -44,6 +69,13 @@ export function createObservableKeyedStore(areEqual) {
|
|
|
44
69
|
}
|
|
45
70
|
return arrayCache;
|
|
46
71
|
},
|
|
72
|
+
keysSnapshot() {
|
|
73
|
+
if (keysDirty) {
|
|
74
|
+
keysCache = store.size === 0 ? EMPTY_KEYS : Array.from(store.keys());
|
|
75
|
+
keysDirty = false;
|
|
76
|
+
}
|
|
77
|
+
return keysCache;
|
|
78
|
+
},
|
|
47
79
|
snapshot() {
|
|
48
80
|
return Array.from(store.entries());
|
|
49
81
|
},
|
|
@@ -52,6 +84,7 @@ export function createObservableKeyedStore(areEqual) {
|
|
|
52
84
|
for (const [key, value] of data)
|
|
53
85
|
store.set(key, value);
|
|
54
86
|
emit();
|
|
87
|
+
emitMembership();
|
|
55
88
|
},
|
|
56
89
|
};
|
|
57
90
|
}
|
|
@@ -32,6 +32,7 @@ export interface DecayMeterState {
|
|
|
32
32
|
/** 0..1 fill. */
|
|
33
33
|
fraction: number;
|
|
34
34
|
}
|
|
35
|
+
/** Set of named survival meters (hunger/thirst/…) that drain and refill over game time. */
|
|
35
36
|
export interface DecayMeterSet {
|
|
36
37
|
/** Drain/fill every meter by `rate * rateModifier * dt`. Call once per game tick. */
|
|
37
38
|
tick(dt: number): void;
|
|
@@ -49,11 +50,65 @@ export interface DecayMeterSet {
|
|
|
49
50
|
snapshot(): Record<string, DecayMeterState>;
|
|
50
51
|
ids(): readonly string[];
|
|
51
52
|
}
|
|
53
|
+
/**
|
|
54
|
+
* Plain-data meter values: `meter id → current value`. This is the whole serialized
|
|
55
|
+
* form — it drops straight into a `defineGame` state record and round-trips through
|
|
56
|
+
* save/load and multiplayer sync with no closure to rebuild.
|
|
57
|
+
*/
|
|
58
|
+
export type DecayMeterValues = Record<string, number>;
|
|
59
|
+
/**
|
|
60
|
+
* Rate multiplier for {@link decayMeters}: one scalar applied to every meter (a member's
|
|
61
|
+
* metabolism, a game-mode harshness dial) or a per-meter record (cold biome → warmth only).
|
|
62
|
+
* `1` / omitted leaves the base rates unscaled.
|
|
63
|
+
*/
|
|
64
|
+
export type DecayModifier = number | Record<string, number>;
|
|
65
|
+
/**
|
|
66
|
+
* Starting values for `defs` — each meter's `start ?? max`, clamped to its range. Seed a
|
|
67
|
+
* serialized state record with this instead of holding a {@link createDecayMeterSet} closure.
|
|
68
|
+
*
|
|
69
|
+
* @capability decay-meter survival meters that drain/refill over game time (hunger, water, oxygen, stamina)
|
|
70
|
+
*/
|
|
71
|
+
export declare function initDecayMeters(defs: readonly DecayMeterConfig[]): DecayMeterValues;
|
|
72
|
+
/**
|
|
73
|
+
* Pure per-tick decay over plain data: drain (or fill) every meter by `rate * modifier * dt`,
|
|
74
|
+
* clamped to its range, returning a new `id → value` record. Returns `values` unchanged when
|
|
75
|
+
* `dt <= 0`. The serializable counterpart to {@link DecayMeterSet.tick}.
|
|
76
|
+
*
|
|
77
|
+
* @capability decay-meter survival meters that drain/refill over game time (hunger, water, oxygen, stamina)
|
|
78
|
+
*/
|
|
79
|
+
export declare function decayMeters(values: DecayMeterValues, defs: readonly DecayMeterConfig[], dt: number, modifier?: DecayModifier): DecayMeterValues;
|
|
80
|
+
/**
|
|
81
|
+
* Refill (or drain, if negative) one meter by `amount`, clamped to its range. Returns a new
|
|
82
|
+
* record; throws on an unknown id. The pure counterpart to {@link DecayMeterSet.refill}.
|
|
83
|
+
*
|
|
84
|
+
* @capability decay-meter survival meters that drain/refill over game time (hunger, water, oxygen, stamina)
|
|
85
|
+
*/
|
|
86
|
+
export declare function refillMeter(values: DecayMeterValues, defs: readonly DecayMeterConfig[], id: string, amount: number): DecayMeterValues;
|
|
87
|
+
/**
|
|
88
|
+
* Numeric state (value, bounds, 0..1 fraction) for one meter. Throws on an unknown id.
|
|
89
|
+
*
|
|
90
|
+
* @capability decay-meter survival meters that drain/refill over game time (hunger, water, oxygen, stamina)
|
|
91
|
+
*/
|
|
92
|
+
export declare function decayMeterState(values: DecayMeterValues, defs: readonly DecayMeterConfig[], id: string): DecayMeterState;
|
|
93
|
+
/**
|
|
94
|
+
* Numeric state for every meter, keyed by id — the pure counterpart to {@link DecayMeterSet.snapshot}.
|
|
95
|
+
*
|
|
96
|
+
* @capability decay-meter survival meters that drain/refill over game time (hunger, water, oxygen, stamina)
|
|
97
|
+
*/
|
|
98
|
+
export declare function decayMeterSnapshot(values: DecayMeterValues, defs: readonly DecayMeterConfig[]): Record<string, DecayMeterState>;
|
|
99
|
+
/**
|
|
100
|
+
* Moodles for every crossed threshold, worst-first per meter in declared order.
|
|
101
|
+
*
|
|
102
|
+
* @capability decay-meter survival meters that drain/refill over game time (hunger, water, oxygen, stamina)
|
|
103
|
+
*/
|
|
104
|
+
export declare function decayMeterMoodles(values: DecayMeterValues, defs: readonly DecayMeterConfig[]): Moodle[];
|
|
52
105
|
/**
|
|
53
106
|
* Named decay meters — hunger, thirst, oxygen, sanity, warmth, stamina. Each drains
|
|
54
107
|
* (or recovers) on game-time `dt` at a configurable rate, refills from consumables or
|
|
55
108
|
* actions, and raises moodle statuses at thresholds. Rate modifiers let the environment
|
|
56
109
|
* drive them (colder → faster warmth loss; toxic biome → oxygen drops), so a game reads
|
|
57
110
|
* an environment field then calls `setRateModifier`.
|
|
111
|
+
*
|
|
112
|
+
* @capability decay-meter survival meters that drain/refill over game time (hunger, water, oxygen, stamina)
|
|
58
113
|
*/
|
|
59
114
|
export declare function createDecayMeterSet(configs: readonly DecayMeterConfig[]): DecayMeterSet;
|
|
@@ -1,91 +1,164 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import { clamp } from "../math/scalar.js";
|
|
2
|
+
function meterMin(def) {
|
|
3
|
+
return def.min ?? 0;
|
|
3
4
|
}
|
|
4
|
-
function
|
|
5
|
-
|
|
5
|
+
function initialValue(def) {
|
|
6
|
+
return clamp(def.start ?? def.max, meterMin(def), def.max);
|
|
7
|
+
}
|
|
8
|
+
function valueOf(values, def) {
|
|
9
|
+
const current = values[def.id];
|
|
10
|
+
return current === undefined ? initialValue(def) : current;
|
|
11
|
+
}
|
|
12
|
+
function modifierFor(modifier, id) {
|
|
13
|
+
if (modifier === undefined)
|
|
14
|
+
return 1;
|
|
15
|
+
if (typeof modifier === "number")
|
|
16
|
+
return modifier;
|
|
17
|
+
return modifier[id] ?? 1;
|
|
18
|
+
}
|
|
19
|
+
function findDef(defs, id) {
|
|
20
|
+
const def = defs.find((candidate) => candidate.id === id);
|
|
21
|
+
if (def === undefined)
|
|
22
|
+
throw new Error(`unknown decay meter "${id}"`);
|
|
23
|
+
return def;
|
|
24
|
+
}
|
|
25
|
+
function stateOf(def, value) {
|
|
26
|
+
const min = meterMin(def);
|
|
27
|
+
const span = def.max - min;
|
|
6
28
|
return {
|
|
7
|
-
id:
|
|
8
|
-
value
|
|
9
|
-
max:
|
|
10
|
-
min
|
|
11
|
-
fraction: span > 0 ? (
|
|
29
|
+
id: def.id,
|
|
30
|
+
value,
|
|
31
|
+
max: def.max,
|
|
32
|
+
min,
|
|
33
|
+
fraction: span > 0 ? (value - min) / span : 0,
|
|
12
34
|
};
|
|
13
35
|
}
|
|
14
36
|
function crossed(threshold, value) {
|
|
15
37
|
return threshold.when === "below" ? value < threshold.at : value > threshold.at;
|
|
16
38
|
}
|
|
39
|
+
/**
|
|
40
|
+
* Starting values for `defs` — each meter's `start ?? max`, clamped to its range. Seed a
|
|
41
|
+
* serialized state record with this instead of holding a {@link createDecayMeterSet} closure.
|
|
42
|
+
*
|
|
43
|
+
* @capability decay-meter survival meters that drain/refill over game time (hunger, water, oxygen, stamina)
|
|
44
|
+
*/
|
|
45
|
+
export function initDecayMeters(defs) {
|
|
46
|
+
const out = {};
|
|
47
|
+
for (const def of defs)
|
|
48
|
+
out[def.id] = initialValue(def);
|
|
49
|
+
return out;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Pure per-tick decay over plain data: drain (or fill) every meter by `rate * modifier * dt`,
|
|
53
|
+
* clamped to its range, returning a new `id → value` record. Returns `values` unchanged when
|
|
54
|
+
* `dt <= 0`. The serializable counterpart to {@link DecayMeterSet.tick}.
|
|
55
|
+
*
|
|
56
|
+
* @capability decay-meter survival meters that drain/refill over game time (hunger, water, oxygen, stamina)
|
|
57
|
+
*/
|
|
58
|
+
export function decayMeters(values, defs, dt, modifier) {
|
|
59
|
+
if (dt <= 0)
|
|
60
|
+
return values;
|
|
61
|
+
const out = {};
|
|
62
|
+
for (const def of defs) {
|
|
63
|
+
out[def.id] = clamp(valueOf(values, def) - def.rate * modifierFor(modifier, def.id) * dt, meterMin(def), def.max);
|
|
64
|
+
}
|
|
65
|
+
return out;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Refill (or drain, if negative) one meter by `amount`, clamped to its range. Returns a new
|
|
69
|
+
* record; throws on an unknown id. The pure counterpart to {@link DecayMeterSet.refill}.
|
|
70
|
+
*
|
|
71
|
+
* @capability decay-meter survival meters that drain/refill over game time (hunger, water, oxygen, stamina)
|
|
72
|
+
*/
|
|
73
|
+
export function refillMeter(values, defs, id, amount) {
|
|
74
|
+
const def = findDef(defs, id);
|
|
75
|
+
return { ...values, [id]: clamp(valueOf(values, def) + amount, meterMin(def), def.max) };
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Numeric state (value, bounds, 0..1 fraction) for one meter. Throws on an unknown id.
|
|
79
|
+
*
|
|
80
|
+
* @capability decay-meter survival meters that drain/refill over game time (hunger, water, oxygen, stamina)
|
|
81
|
+
*/
|
|
82
|
+
export function decayMeterState(values, defs, id) {
|
|
83
|
+
const def = findDef(defs, id);
|
|
84
|
+
return stateOf(def, valueOf(values, def));
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Numeric state for every meter, keyed by id — the pure counterpart to {@link DecayMeterSet.snapshot}.
|
|
88
|
+
*
|
|
89
|
+
* @capability decay-meter survival meters that drain/refill over game time (hunger, water, oxygen, stamina)
|
|
90
|
+
*/
|
|
91
|
+
export function decayMeterSnapshot(values, defs) {
|
|
92
|
+
const out = {};
|
|
93
|
+
for (const def of defs)
|
|
94
|
+
out[def.id] = stateOf(def, valueOf(values, def));
|
|
95
|
+
return out;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Moodles for every crossed threshold, worst-first per meter in declared order.
|
|
99
|
+
*
|
|
100
|
+
* @capability decay-meter survival meters that drain/refill over game time (hunger, water, oxygen, stamina)
|
|
101
|
+
*/
|
|
102
|
+
export function decayMeterMoodles(values, defs) {
|
|
103
|
+
const out = [];
|
|
104
|
+
for (const def of defs) {
|
|
105
|
+
const value = valueOf(values, def);
|
|
106
|
+
for (const threshold of def.thresholds ?? []) {
|
|
107
|
+
if (!crossed(threshold, value))
|
|
108
|
+
continue;
|
|
109
|
+
out.push({
|
|
110
|
+
id: threshold.id,
|
|
111
|
+
label: threshold.label,
|
|
112
|
+
severity: threshold.severity ?? "warning",
|
|
113
|
+
source: "meter",
|
|
114
|
+
stacks: 1,
|
|
115
|
+
...(threshold.icon === undefined ? {} : { icon: threshold.icon }),
|
|
116
|
+
fraction: stateOf(def, value).fraction,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return out;
|
|
121
|
+
}
|
|
17
122
|
/**
|
|
18
123
|
* Named decay meters — hunger, thirst, oxygen, sanity, warmth, stamina. Each drains
|
|
19
124
|
* (or recovers) on game-time `dt` at a configurable rate, refills from consumables or
|
|
20
125
|
* actions, and raises moodle statuses at thresholds. Rate modifiers let the environment
|
|
21
126
|
* drive them (colder → faster warmth loss; toxic biome → oxygen drops), so a game reads
|
|
22
127
|
* an environment field then calls `setRateModifier`.
|
|
128
|
+
*
|
|
129
|
+
* @capability decay-meter survival meters that drain/refill over game time (hunger, water, oxygen, stamina)
|
|
23
130
|
*/
|
|
24
131
|
export function createDecayMeterSet(configs) {
|
|
25
|
-
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
const value = clamp(config.start ?? max, min, max);
|
|
31
|
-
meters.set(config.id, { config, min, max, value, rate: config.rate, modifier: 1 });
|
|
32
|
-
order.push(config.id);
|
|
33
|
-
}
|
|
34
|
-
const require = (id) => {
|
|
35
|
-
const runtime = meters.get(id);
|
|
36
|
-
if (runtime === undefined)
|
|
37
|
-
throw new Error(`unknown decay meter "${id}"`);
|
|
38
|
-
return runtime;
|
|
39
|
-
};
|
|
132
|
+
// Mutable copy so setRate can override a meter's base rate without mutating the caller's defs.
|
|
133
|
+
const defs = configs.map((config) => ({ ...config }));
|
|
134
|
+
const order = defs.map((def) => def.id);
|
|
135
|
+
const modifiers = {};
|
|
136
|
+
let values = initDecayMeters(defs);
|
|
40
137
|
return {
|
|
41
138
|
tick(dt) {
|
|
42
|
-
|
|
43
|
-
return;
|
|
44
|
-
for (const runtime of meters.values()) {
|
|
45
|
-
runtime.value = clamp(runtime.value - runtime.rate * runtime.modifier * dt, runtime.min, runtime.max);
|
|
46
|
-
}
|
|
139
|
+
values = decayMeters(values, defs, dt, modifiers);
|
|
47
140
|
},
|
|
48
141
|
value(id) {
|
|
49
|
-
return
|
|
142
|
+
return decayMeterState(values, defs, id).value;
|
|
50
143
|
},
|
|
51
144
|
state(id) {
|
|
52
|
-
return
|
|
145
|
+
return decayMeterState(values, defs, id);
|
|
53
146
|
},
|
|
54
147
|
refill(id, amount) {
|
|
55
|
-
|
|
56
|
-
runtime.value = clamp(runtime.value + amount, runtime.min, runtime.max);
|
|
148
|
+
values = refillMeter(values, defs, id, amount);
|
|
57
149
|
},
|
|
58
150
|
setRate(id, rate) {
|
|
59
|
-
|
|
151
|
+
findDef(defs, id).rate = rate;
|
|
60
152
|
},
|
|
61
153
|
setRateModifier(id, multiplier) {
|
|
62
|
-
|
|
154
|
+
findDef(defs, id);
|
|
155
|
+
modifiers[id] = multiplier;
|
|
63
156
|
},
|
|
64
157
|
moodles() {
|
|
65
|
-
|
|
66
|
-
for (const id of order) {
|
|
67
|
-
const runtime = meters.get(id);
|
|
68
|
-
for (const threshold of runtime.config.thresholds ?? []) {
|
|
69
|
-
if (!crossed(threshold, runtime.value))
|
|
70
|
-
continue;
|
|
71
|
-
out.push({
|
|
72
|
-
id: threshold.id,
|
|
73
|
-
label: threshold.label,
|
|
74
|
-
severity: threshold.severity ?? "warning",
|
|
75
|
-
source: "meter",
|
|
76
|
-
stacks: 1,
|
|
77
|
-
...(threshold.icon === undefined ? {} : { icon: threshold.icon }),
|
|
78
|
-
fraction: toState(runtime).fraction,
|
|
79
|
-
});
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
return out;
|
|
158
|
+
return decayMeterMoodles(values, defs);
|
|
83
159
|
},
|
|
84
160
|
snapshot() {
|
|
85
|
-
|
|
86
|
-
for (const id of order)
|
|
87
|
-
out[id] = toState(meters.get(id));
|
|
88
|
-
return out;
|
|
161
|
+
return decayMeterSnapshot(values, defs);
|
|
89
162
|
},
|
|
90
163
|
ids() {
|
|
91
164
|
return order;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export type MoodleSeverity = "good" | "neutral" | "warning" | "critical";
|
|
2
2
|
export type MoodleSource = "meter" | "ailment" | "buff";
|
|
3
|
+
/** One survival moodle (status icon) — severity, source, and label for HUD chips. */
|
|
3
4
|
export interface Moodle {
|
|
4
5
|
id: string;
|
|
5
6
|
label: string;
|
|
@@ -29,6 +30,7 @@ export interface TimedMoodleInput {
|
|
|
29
30
|
/** Game-seconds until the moodle drops. Omit for a moodle that stays until removed. */
|
|
30
31
|
duration?: number;
|
|
31
32
|
}
|
|
33
|
+
/** Ordered stack of active moodles derived from meters/ailments/buffs. */
|
|
32
34
|
export interface MoodleStack {
|
|
33
35
|
/** Add or refresh a timed moodle (Valheim food buff, a temporary shelter status). */
|
|
34
36
|
add(input: TimedMoodleInput): void;
|
|
@@ -49,6 +49,7 @@ export interface TreatResult {
|
|
|
49
49
|
/** Ailment ids fully or partially cleared by the item. */
|
|
50
50
|
treated: readonly string[];
|
|
51
51
|
}
|
|
52
|
+
/** Per-limb / per-region health track with treat/damage/heal APIs. */
|
|
52
53
|
export interface MultiRegionHealth {
|
|
53
54
|
damage(regionId: string, amount: number): DamageResult;
|
|
54
55
|
heal(regionId: string, amount: number): RegionHealthState;
|
|
@@ -69,4 +70,9 @@ export interface MultiRegionHealth {
|
|
|
69
70
|
ailmentMoodles(): Moodle[];
|
|
70
71
|
readonly dead: boolean;
|
|
71
72
|
}
|
|
73
|
+
/**
|
|
74
|
+
* Per-region/limb health tracked separately, so each body part takes and heals damage on its own.
|
|
75
|
+
*
|
|
76
|
+
* @capability limb-health per-body-part/region health tracked separately
|
|
77
|
+
*/
|
|
72
78
|
export declare function createMultiRegionHealth(config: MultiRegionHealthConfig): MultiRegionHealth;
|
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { clamp } from "../math/scalar.js";
|
|
2
|
+
/**
|
|
3
|
+
* Per-region/limb health tracked separately, so each body part takes and heals damage on its own.
|
|
4
|
+
*
|
|
5
|
+
* @capability limb-health per-body-part/region health tracked separately
|
|
6
|
+
*/
|
|
4
7
|
export function createMultiRegionHealth(config) {
|
|
5
8
|
if (config.regions.length === 0) {
|
|
6
9
|
throw new Error("createMultiRegionHealth: regions must be non-empty");
|
|
@@ -51,12 +51,14 @@ export interface GravityIntervalConfig {
|
|
|
51
51
|
* Gravity tick interval for a given level: linear speed-up with a floor, generalizing
|
|
52
52
|
* a falling-block `gravityInterval` (`max(0.05, 0.8 - level * 0.07)` seconds) to milliseconds
|
|
53
53
|
* with configurable base/step/floor.
|
|
54
|
-
|
|
54
|
+
* @internal
|
|
55
|
+
*/
|
|
55
56
|
export declare function gravityIntervalMs(level: number, config?: GravityIntervalConfig): number;
|
|
56
57
|
/**
|
|
57
58
|
* A game-agnostic cell grid for gravity-driven falling-block mechanics: bounded occupancy,
|
|
58
59
|
* footprint placement/collision, line-clear collapse, column-gravity settle (for match-3/sand
|
|
59
60
|
* style cascades), and a pure lock-delay helper. Extracted from falling-block tetris
|
|
60
61
|
* logic so any falling-block game can adopt it instead of reimplementing the grid.
|
|
61
|
-
|
|
62
|
+
* @internal
|
|
63
|
+
*/
|
|
62
64
|
export declare function createFallingGrid<TCell>(config: FallingGridConfig): FallingGrid<TCell>;
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
* Gravity tick interval for a given level: linear speed-up with a floor, generalizing
|
|
3
3
|
* a falling-block `gravityInterval` (`max(0.05, 0.8 - level * 0.07)` seconds) to milliseconds
|
|
4
4
|
* with configurable base/step/floor.
|
|
5
|
-
|
|
5
|
+
* @internal
|
|
6
|
+
*/
|
|
6
7
|
export function gravityIntervalMs(level, config = {}) {
|
|
7
8
|
const baseMs = config.baseMs ?? 800;
|
|
8
9
|
const perLevel = config.perLevel ?? 70;
|
|
@@ -14,7 +15,8 @@ export function gravityIntervalMs(level, config = {}) {
|
|
|
14
15
|
* footprint placement/collision, line-clear collapse, column-gravity settle (for match-3/sand
|
|
15
16
|
* style cascades), and a pure lock-delay helper. Extracted from falling-block tetris
|
|
16
17
|
* logic so any falling-block game can adopt it instead of reimplementing the grid.
|
|
17
|
-
|
|
18
|
+
* @internal
|
|
19
|
+
*/
|
|
18
20
|
export function createFallingGrid(config) {
|
|
19
21
|
const cols = config.cols;
|
|
20
22
|
const rows = config.rows;
|
|
@@ -23,7 +23,9 @@ export interface ArcPredictInput {
|
|
|
23
23
|
effect?: string;
|
|
24
24
|
requireReceive?: boolean;
|
|
25
25
|
}
|
|
26
|
+
/** @internal */
|
|
26
27
|
export declare function predictAreaEffect(deps: PredictiveDeps, input: AreaPredictInput): PredictedTarget[];
|
|
28
|
+
/** @internal */
|
|
27
29
|
export declare function predictArcEffect(deps: PredictiveDeps, input: ArcPredictInput): PredictedTarget[];
|
|
28
30
|
export interface TilePredictInput {
|
|
29
31
|
at: EntityPosition;
|
|
@@ -31,4 +33,5 @@ export interface TilePredictInput {
|
|
|
31
33
|
originTile: Tile;
|
|
32
34
|
tileSize: number;
|
|
33
35
|
}
|
|
36
|
+
/** @internal */
|
|
34
37
|
export declare function predictTiles(input: TilePredictInput): Tile[];
|
|
@@ -5,10 +5,12 @@ function receiveGate(deps, effect, requireReceive) {
|
|
|
5
5
|
const gate = deps.canReceive;
|
|
6
6
|
return (instanceId) => gate(instanceId, effect) === null;
|
|
7
7
|
}
|
|
8
|
+
/** @internal */
|
|
8
9
|
export function predictAreaEffect(deps, input) {
|
|
9
10
|
const requireReceive = input.requireReceive ?? true;
|
|
10
11
|
return resolveAreaTargets(deps.spatial, input, receiveGate(deps, input.effect, requireReceive));
|
|
11
12
|
}
|
|
13
|
+
/** @internal */
|
|
12
14
|
export function predictArcEffect(deps, input) {
|
|
13
15
|
const requireReceive = input.requireReceive ?? true;
|
|
14
16
|
const gate = receiveGate(deps, input.effect, requireReceive);
|
|
@@ -26,6 +28,7 @@ export function predictArcEffect(deps, input) {
|
|
|
26
28
|
}
|
|
27
29
|
return targets;
|
|
28
30
|
}
|
|
31
|
+
/** @internal */
|
|
29
32
|
export function predictTiles(input) {
|
|
30
33
|
const reach = Math.ceil(input.radius / input.tileSize);
|
|
31
34
|
const tiles = [];
|
package/dist/tactics/snapshot.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/** @internal */
|
|
1
2
|
export function deepClone(value) {
|
|
2
3
|
if (value === null || typeof value !== "object")
|
|
3
4
|
return value;
|
|
@@ -20,6 +21,7 @@ export function deepClone(value) {
|
|
|
20
21
|
clone[k] = deepClone(v);
|
|
21
22
|
return clone;
|
|
22
23
|
}
|
|
24
|
+
/** @internal */
|
|
23
25
|
export function createSnapshotStore() {
|
|
24
26
|
const slices = new Map();
|
|
25
27
|
const stack = [];
|
package/dist/tactics/surface.js
CHANGED
package/dist/time/beatClock.d.ts
CHANGED
|
@@ -21,8 +21,11 @@ export interface BeatClock {
|
|
|
21
21
|
beatDurationSec(): number;
|
|
22
22
|
bpm(): number;
|
|
23
23
|
}
|
|
24
|
+
/** @internal */
|
|
24
25
|
export declare function createBeatClock(config: BeatClockConfig, onBeat?: (beatIndex: number) => void): BeatClock;
|
|
25
|
-
/** Signed offset (game-seconds) from `nowSec` to the nearest beat boundary — negative = early, positive = late (#286.12).
|
|
26
|
+
/** Signed offset (game-seconds) from `nowSec` to the nearest beat boundary — negative = early, positive = late (#286.12).
|
|
27
|
+
* @internal
|
|
28
|
+
*/
|
|
26
29
|
export declare function nearestBeatDelta(nowSec: number, beatDurationSec: number): number;
|
|
27
30
|
export interface BeatAccuracyTier {
|
|
28
31
|
id: string;
|
|
@@ -36,11 +39,17 @@ export interface BeatJudgement {
|
|
|
36
39
|
deltaSec: number;
|
|
37
40
|
}
|
|
38
41
|
export declare const DEFAULT_BEAT_TIERS: readonly BeatAccuracyTier[];
|
|
39
|
-
/** Classify a press against the nearest beat into tiered judgements (perfect/good/miss by default). Tiers must be ordered tightest-first.
|
|
42
|
+
/** Classify a press against the nearest beat into tiered judgements (perfect/good/miss by default). Tiers must be ordered tightest-first.
|
|
43
|
+
* @internal
|
|
44
|
+
*/
|
|
40
45
|
export declare function classifyBeatAccuracy(nowSec: number, beatDurationSec: number, tiers?: readonly BeatAccuracyTier[]): BeatJudgement;
|
|
41
|
-
/** Whether a snapshot sits inside a bar-relative open window `[fromBeat, toBeat)` — e.g. "act on beats 2-4 of every bar" (#286.12).
|
|
46
|
+
/** Whether a snapshot sits inside a bar-relative open window `[fromBeat, toBeat)` — e.g. "act on beats 2-4 of every bar" (#286.12).
|
|
47
|
+
* @internal
|
|
48
|
+
*/
|
|
42
49
|
export declare function inBarWindow(snapshot: BeatSnapshot, fromBeat: number, toBeat: number): boolean;
|
|
43
|
-
/** The absolute beat-time (game-seconds) that a press at `nowSec` quantizes to: the same instant if it lands on a beat boundary, else the next one.
|
|
50
|
+
/** The absolute beat-time (game-seconds) that a press at `nowSec` quantizes to: the same instant if it lands on a beat boundary, else the next one.
|
|
51
|
+
* @internal
|
|
52
|
+
*/
|
|
44
53
|
export declare function nextBeatTime(nowSec: number, beatDurationSec: number, epsilon?: number): number;
|
|
45
54
|
export interface BufferedAction<T> {
|
|
46
55
|
action: T;
|
|
@@ -55,4 +64,5 @@ export interface BeatInputBuffer<T> {
|
|
|
55
64
|
pendingCount(): number;
|
|
56
65
|
clear(): void;
|
|
57
66
|
}
|
|
67
|
+
/** @internal */
|
|
58
68
|
export declare function createBeatInputBuffer<T>(beatDurationSec: number): BeatInputBuffer<T>;
|
package/dist/time/beatClock.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
const MAX_BEAT_FIRES = 10_000;
|
|
2
|
+
/** @internal */
|
|
2
3
|
export function createBeatClock(config, onBeat) {
|
|
3
4
|
const beatsPerBar = config.beatsPerBar !== undefined && config.beatsPerBar > 0 ? config.beatsPerBar : 4;
|
|
4
5
|
const beatDurationSec = 60 / config.bpm;
|
|
@@ -35,7 +36,9 @@ export function createBeatClock(config, onBeat) {
|
|
|
35
36
|
bpm: () => config.bpm,
|
|
36
37
|
};
|
|
37
38
|
}
|
|
38
|
-
/** Signed offset (game-seconds) from `nowSec` to the nearest beat boundary — negative = early, positive = late (#286.12).
|
|
39
|
+
/** Signed offset (game-seconds) from `nowSec` to the nearest beat boundary — negative = early, positive = late (#286.12).
|
|
40
|
+
* @internal
|
|
41
|
+
*/
|
|
39
42
|
export function nearestBeatDelta(nowSec, beatDurationSec) {
|
|
40
43
|
const beatIndex = Math.round(nowSec / beatDurationSec);
|
|
41
44
|
return nowSec - beatIndex * beatDurationSec;
|
|
@@ -44,7 +47,9 @@ export const DEFAULT_BEAT_TIERS = [
|
|
|
44
47
|
{ id: "perfect", windowSec: 0.06 },
|
|
45
48
|
{ id: "good", windowSec: 0.14 },
|
|
46
49
|
];
|
|
47
|
-
/** Classify a press against the nearest beat into tiered judgements (perfect/good/miss by default). Tiers must be ordered tightest-first.
|
|
50
|
+
/** Classify a press against the nearest beat into tiered judgements (perfect/good/miss by default). Tiers must be ordered tightest-first.
|
|
51
|
+
* @internal
|
|
52
|
+
*/
|
|
48
53
|
export function classifyBeatAccuracy(nowSec, beatDurationSec, tiers = DEFAULT_BEAT_TIERS) {
|
|
49
54
|
const deltaSec = nearestBeatDelta(nowSec, beatDurationSec);
|
|
50
55
|
const magnitude = Math.abs(deltaSec);
|
|
@@ -54,13 +59,17 @@ export function classifyBeatAccuracy(nowSec, beatDurationSec, tiers = DEFAULT_BE
|
|
|
54
59
|
}
|
|
55
60
|
return { tier: "miss", deltaSec };
|
|
56
61
|
}
|
|
57
|
-
/** Whether a snapshot sits inside a bar-relative open window `[fromBeat, toBeat)` — e.g. "act on beats 2-4 of every bar" (#286.12).
|
|
62
|
+
/** Whether a snapshot sits inside a bar-relative open window `[fromBeat, toBeat)` — e.g. "act on beats 2-4 of every bar" (#286.12).
|
|
63
|
+
* @internal
|
|
64
|
+
*/
|
|
58
65
|
export function inBarWindow(snapshot, fromBeat, toBeat) {
|
|
59
66
|
const barBeat = snapshot.beatInBar + snapshot.phase;
|
|
60
67
|
return barBeat >= fromBeat && barBeat < toBeat;
|
|
61
68
|
}
|
|
62
69
|
const QUANTIZE_EPSILON = 1e-6;
|
|
63
|
-
/** The absolute beat-time (game-seconds) that a press at `nowSec` quantizes to: the same instant if it lands on a beat boundary, else the next one.
|
|
70
|
+
/** The absolute beat-time (game-seconds) that a press at `nowSec` quantizes to: the same instant if it lands on a beat boundary, else the next one.
|
|
71
|
+
* @internal
|
|
72
|
+
*/
|
|
64
73
|
export function nextBeatTime(nowSec, beatDurationSec, epsilon = QUANTIZE_EPSILON) {
|
|
65
74
|
const beatIndex = nowSec / beatDurationSec;
|
|
66
75
|
const rounded = Math.round(beatIndex);
|
|
@@ -68,6 +77,7 @@ export function nextBeatTime(nowSec, beatDurationSec, epsilon = QUANTIZE_EPSILON
|
|
|
68
77
|
return rounded * beatDurationSec;
|
|
69
78
|
return Math.ceil(beatIndex) * beatDurationSec;
|
|
70
79
|
}
|
|
80
|
+
/** @internal */
|
|
71
81
|
export function createBeatInputBuffer(beatDurationSec) {
|
|
72
82
|
const pending = [];
|
|
73
83
|
return {
|
|
@@ -12,6 +12,9 @@ export interface GameTime {
|
|
|
12
12
|
formattedTime: string;
|
|
13
13
|
formatted: string;
|
|
14
14
|
}
|
|
15
|
+
/** @internal */
|
|
15
16
|
export declare function computeGameTime(gameTimestamp: number): GameTime;
|
|
17
|
+
/** @internal */
|
|
16
18
|
export declare function computeClientServerOffset(serverNow: number, clientNow: number): number;
|
|
19
|
+
/** @internal */
|
|
17
20
|
export declare function getGameClockTimestamp(createdAt: number, serverNow: number, clientNow: number, gameTimeScale?: number): number;
|