@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
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
function clamp01(value) {
|
|
2
|
+
return value < 0 ? 0 : value > 1 ? 1 : value;
|
|
3
|
+
}
|
|
4
|
+
/**
|
|
5
|
+
* Evaluate a single live-metric objective: is `value` at least (or at most) the target, and how far along.
|
|
6
|
+
* Unlike an event counter, this reads a continuously-changing metric — population, approval, pollution —
|
|
7
|
+
* the objective shape city-builders and management sims track every tick.
|
|
8
|
+
*
|
|
9
|
+
* @capability objectives check progress of a threshold objective against a live metric
|
|
10
|
+
*/
|
|
11
|
+
export function evaluateObjective(objective, value) {
|
|
12
|
+
const direction = objective.direction ?? "atLeast";
|
|
13
|
+
const target = objective.target;
|
|
14
|
+
let met;
|
|
15
|
+
let progress;
|
|
16
|
+
if (direction === "atMost") {
|
|
17
|
+
met = value <= target;
|
|
18
|
+
progress = met ? 1 : target <= 0 ? 0 : clamp01(target / value);
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
met = value >= target;
|
|
22
|
+
progress = met ? 1 : target <= 0 ? 1 : clamp01(value / target);
|
|
23
|
+
}
|
|
24
|
+
return { id: objective.id, value, target, direction, met, progress };
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Evaluate every objective against current metric values (a lookup map or function) and roll them up into
|
|
28
|
+
* a met-count, completion flag, and mean progress — the brief/charter panel every sim renders.
|
|
29
|
+
*/
|
|
30
|
+
export function evaluateObjectives(objectives, values) {
|
|
31
|
+
const lookup = typeof values === "function" ? values : (id) => values[id] ?? 0;
|
|
32
|
+
const statuses = objectives.map((objective) => evaluateObjective(objective, lookup(objective.id)));
|
|
33
|
+
const met = statuses.filter((status) => status.met).length;
|
|
34
|
+
const progress = statuses.length === 0 ? 1 : statuses.reduce((sum, s) => sum + s.progress, 0) / statuses.length;
|
|
35
|
+
return { statuses, met, total: statuses.length, complete: met === statuses.length, progress };
|
|
36
|
+
}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Layered numeric parameter modifiers over a caller-owned schema.
|
|
3
|
+
*
|
|
4
|
+
* A {@link ParamLayer} is a named, serializable bundle of transforms ({@link ParamOp}) keyed by
|
|
5
|
+
* parameter name. {@link resolveParams} folds an ordered stack of layers over a base value map and
|
|
6
|
+
* returns a deterministic {@link ParamSnapshot} — the effective values plus a full provenance trace
|
|
7
|
+
* of every op that touched each parameter. Layers order by ascending `priority` (ties broken by
|
|
8
|
+
* active-list index, a stable sort), and within a layer a parameter's ops fold left-to-right, so the
|
|
9
|
+
* stacking order is fully well-defined and reproducible.
|
|
10
|
+
*
|
|
11
|
+
* The primitive is genre-agnostic: difficulty tiers, game modes, mutators, accessibility presets,
|
|
12
|
+
* events, NG+, server rules, and challenge runs are all just ordered layers over different schemas.
|
|
13
|
+
* Save files store a {@link LayerSelection} (ordered layer ids); a {@link LayerRegistry} resolves
|
|
14
|
+
* those ids back to layers and reports unknown ids so migration and unknown saved content degrade
|
|
15
|
+
* gracefully rather than throwing.
|
|
16
|
+
*/
|
|
17
|
+
import { type Curve } from "./progression.js";
|
|
18
|
+
/**
|
|
19
|
+
* A single transform applied to one numeric parameter. `set` overrides, `add`/`multiply` accumulate,
|
|
20
|
+
* `clamp` bounds, and `curve` remaps the running value through a {@link Curve} (the same curve
|
|
21
|
+
* primitive progression tracks use), so a caller can reshape a value non-linearly mid-stack.
|
|
22
|
+
*/
|
|
23
|
+
export type ParamOp = {
|
|
24
|
+
readonly kind: "set";
|
|
25
|
+
readonly value: number;
|
|
26
|
+
} | {
|
|
27
|
+
readonly kind: "add";
|
|
28
|
+
readonly value: number;
|
|
29
|
+
} | {
|
|
30
|
+
readonly kind: "multiply";
|
|
31
|
+
readonly value: number;
|
|
32
|
+
} | {
|
|
33
|
+
readonly kind: "clamp";
|
|
34
|
+
readonly min?: number;
|
|
35
|
+
readonly max?: number;
|
|
36
|
+
} | {
|
|
37
|
+
readonly kind: "curve";
|
|
38
|
+
readonly curve: Curve;
|
|
39
|
+
};
|
|
40
|
+
/** Per-parameter ops contributed by one layer — a single op or an ordered list folded in sequence. */
|
|
41
|
+
export type LayerOps = Readonly<Record<string, ParamOp | readonly ParamOp[]>>;
|
|
42
|
+
/**
|
|
43
|
+
* A named, serializable bundle of parameter transforms with a stable id and precedence. `label` is an
|
|
44
|
+
* optional display name that may intentionally differ from the applied ops (e.g. a tier shown as
|
|
45
|
+
* "Mayhem 4" whose real multipliers are data). Higher `priority` applies later — on top — and ties
|
|
46
|
+
* break by the layer's index in the active list, so ordering is deterministic.
|
|
47
|
+
*/
|
|
48
|
+
export interface ParamLayer {
|
|
49
|
+
readonly id: string;
|
|
50
|
+
readonly label?: string;
|
|
51
|
+
/** Higher applies later (stacks on top). Ties break by active-list index. Default `0`. */
|
|
52
|
+
readonly priority?: number;
|
|
53
|
+
readonly ops: LayerOps;
|
|
54
|
+
}
|
|
55
|
+
/** One recorded fold step — which layer's op ran and the value before/after. Contribution provenance. */
|
|
56
|
+
export interface ParamContribution {
|
|
57
|
+
readonly layerId: string;
|
|
58
|
+
readonly op: ParamOp;
|
|
59
|
+
readonly from: number;
|
|
60
|
+
readonly to: number;
|
|
61
|
+
}
|
|
62
|
+
/** A resolved effective-parameter snapshot: final `values` plus the ordered op trace per parameter. */
|
|
63
|
+
export interface ParamSnapshot {
|
|
64
|
+
readonly values: Readonly<Record<string, number>>;
|
|
65
|
+
readonly contributions: Readonly<Record<string, readonly ParamContribution[]>>;
|
|
66
|
+
}
|
|
67
|
+
/** A serializable, ordered reference to layers by stable id — what a save file or session setup stores. */
|
|
68
|
+
export type LayerSelection = readonly string[];
|
|
69
|
+
/** A single conflict surfaced by {@link validateLayers}. */
|
|
70
|
+
export interface LayerConflict {
|
|
71
|
+
readonly kind: "duplicate-id" | "set-conflict";
|
|
72
|
+
/** The affected parameter, for `set-conflict`. */
|
|
73
|
+
readonly param?: string;
|
|
74
|
+
readonly layerIds: readonly string[];
|
|
75
|
+
}
|
|
76
|
+
/** One parameter's change between two value maps, for preview/diff surfaces. */
|
|
77
|
+
export interface ParamDelta {
|
|
78
|
+
readonly param: string;
|
|
79
|
+
readonly from: number;
|
|
80
|
+
readonly to: number;
|
|
81
|
+
readonly delta: number;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Order layers into their well-defined application sequence: ascending `priority`, ties broken by the
|
|
85
|
+
* layer's index in `layers` (a stable sort). Same input, same order, on every platform.
|
|
86
|
+
*
|
|
87
|
+
* @capability param-layers order active parameter layers into their deterministic application sequence
|
|
88
|
+
*/
|
|
89
|
+
export declare function orderLayers(layers: readonly ParamLayer[]): readonly ParamLayer[];
|
|
90
|
+
/**
|
|
91
|
+
* Fold an ordered stack of layers over `base` and return the effective {@link ParamSnapshot}. Layers
|
|
92
|
+
* apply in {@link orderLayers} sequence; within a layer each parameter's ops fold left-to-right. Every
|
|
93
|
+
* op is recorded in `contributions` for provenance/preview. Parameters a layer introduces but `base`
|
|
94
|
+
* omits start from `0`. Pure and deterministic — no ambient randomness or time.
|
|
95
|
+
*
|
|
96
|
+
* @capability param-layers resolve base values plus ordered layers into an effective parameter snapshot
|
|
97
|
+
*/
|
|
98
|
+
export declare function resolveParams(base: Readonly<Record<string, number>>, layers: readonly ParamLayer[]): ParamSnapshot;
|
|
99
|
+
/**
|
|
100
|
+
* Detect design conflicts in a layer set before resolving: duplicate ids, and competing `set` ops on
|
|
101
|
+
* the same parameter at the same priority (order-dependent, so worth surfacing). Returns an empty
|
|
102
|
+
* array when the set is clean, so callers can gate a difficulty/session build on it.
|
|
103
|
+
*
|
|
104
|
+
* @capability param-layers validate a layer set for duplicate ids and competing set-op conflicts
|
|
105
|
+
*/
|
|
106
|
+
export declare function validateLayers(layers: readonly ParamLayer[]): readonly LayerConflict[];
|
|
107
|
+
/**
|
|
108
|
+
* Compute the per-parameter deltas between two value maps — the preview/diff of applying a change,
|
|
109
|
+
* for showing a player what a difficulty tier or mutator will do before they commit.
|
|
110
|
+
*
|
|
111
|
+
* @capability param-layers diff two parameter value maps into per-parameter deltas for preview
|
|
112
|
+
*/
|
|
113
|
+
export declare function diffParams(before: Readonly<Record<string, number>>, after: Readonly<Record<string, number>>): readonly ParamDelta[];
|
|
114
|
+
/** Registered lookup of {@link ParamLayer}s by stable id, resolving serialized selections and unknowns. */
|
|
115
|
+
export interface LayerRegistry {
|
|
116
|
+
register(layer: ParamLayer): void;
|
|
117
|
+
has(id: string): boolean;
|
|
118
|
+
get(id: string): ParamLayer | undefined;
|
|
119
|
+
all(): readonly ParamLayer[];
|
|
120
|
+
/**
|
|
121
|
+
* Resolve a saved {@link LayerSelection} to concrete layers in the given order, collecting any ids
|
|
122
|
+
* with no registered layer into `unknown` (dropped, never thrown) so migration and stale saves
|
|
123
|
+
* degrade gracefully.
|
|
124
|
+
*/
|
|
125
|
+
resolve(ids: LayerSelection): {
|
|
126
|
+
readonly layers: readonly ParamLayer[];
|
|
127
|
+
readonly unknown: readonly string[];
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Create a {@link LayerRegistry} — the registration seam difficulty tiers, mutators, and presets
|
|
132
|
+
* install into. Duplicate ids throw at registration; unknown ids at resolve time are reported, not
|
|
133
|
+
* fatal, which is what keeps saved sessions reproducible across content/version drift.
|
|
134
|
+
*
|
|
135
|
+
* @capability param-layers register parameter layers by stable id and resolve serialized selections
|
|
136
|
+
*/
|
|
137
|
+
export declare function createLayerRegistry(initial?: readonly ParamLayer[]): LayerRegistry;
|
|
138
|
+
/**
|
|
139
|
+
* Reproducible session setup in one call: resolve a saved {@link LayerSelection} through a registry,
|
|
140
|
+
* fold the found layers over `base`, and return the snapshot alongside any unknown ids. The same
|
|
141
|
+
* base + registry + selection always yields the same snapshot.
|
|
142
|
+
*
|
|
143
|
+
* @capability param-layers resolve a saved layer selection into an effective snapshot with unknown-id report
|
|
144
|
+
*/
|
|
145
|
+
export declare function resolveSelection(base: Readonly<Record<string, number>>, registry: LayerRegistry, ids: LayerSelection): {
|
|
146
|
+
readonly snapshot: ParamSnapshot;
|
|
147
|
+
readonly unknown: readonly string[];
|
|
148
|
+
};
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Layered numeric parameter modifiers over a caller-owned schema.
|
|
3
|
+
*
|
|
4
|
+
* A {@link ParamLayer} is a named, serializable bundle of transforms ({@link ParamOp}) keyed by
|
|
5
|
+
* parameter name. {@link resolveParams} folds an ordered stack of layers over a base value map and
|
|
6
|
+
* returns a deterministic {@link ParamSnapshot} — the effective values plus a full provenance trace
|
|
7
|
+
* of every op that touched each parameter. Layers order by ascending `priority` (ties broken by
|
|
8
|
+
* active-list index, a stable sort), and within a layer a parameter's ops fold left-to-right, so the
|
|
9
|
+
* stacking order is fully well-defined and reproducible.
|
|
10
|
+
*
|
|
11
|
+
* The primitive is genre-agnostic: difficulty tiers, game modes, mutators, accessibility presets,
|
|
12
|
+
* events, NG+, server rules, and challenge runs are all just ordered layers over different schemas.
|
|
13
|
+
* Save files store a {@link LayerSelection} (ordered layer ids); a {@link LayerRegistry} resolves
|
|
14
|
+
* those ids back to layers and reports unknown ids so migration and unknown saved content degrade
|
|
15
|
+
* gracefully rather than throwing.
|
|
16
|
+
*/
|
|
17
|
+
import { evalCurve } from "./progression.js";
|
|
18
|
+
function applyOp(value, op) {
|
|
19
|
+
switch (op.kind) {
|
|
20
|
+
case "set":
|
|
21
|
+
return op.value;
|
|
22
|
+
case "add":
|
|
23
|
+
return value + op.value;
|
|
24
|
+
case "multiply":
|
|
25
|
+
return value * op.value;
|
|
26
|
+
case "clamp": {
|
|
27
|
+
let next = value;
|
|
28
|
+
if (op.min !== undefined)
|
|
29
|
+
next = Math.max(op.min, next);
|
|
30
|
+
if (op.max !== undefined)
|
|
31
|
+
next = Math.min(op.max, next);
|
|
32
|
+
return next;
|
|
33
|
+
}
|
|
34
|
+
case "curve":
|
|
35
|
+
return evalCurve(op.curve, value);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Order layers into their well-defined application sequence: ascending `priority`, ties broken by the
|
|
40
|
+
* layer's index in `layers` (a stable sort). Same input, same order, on every platform.
|
|
41
|
+
*
|
|
42
|
+
* @capability param-layers order active parameter layers into their deterministic application sequence
|
|
43
|
+
*/
|
|
44
|
+
export function orderLayers(layers) {
|
|
45
|
+
return layers
|
|
46
|
+
.map((layer, index) => ({ layer, index }))
|
|
47
|
+
.sort((a, b) => (a.layer.priority ?? 0) - (b.layer.priority ?? 0) || a.index - b.index)
|
|
48
|
+
.map((entry) => entry.layer);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Fold an ordered stack of layers over `base` and return the effective {@link ParamSnapshot}. Layers
|
|
52
|
+
* apply in {@link orderLayers} sequence; within a layer each parameter's ops fold left-to-right. Every
|
|
53
|
+
* op is recorded in `contributions` for provenance/preview. Parameters a layer introduces but `base`
|
|
54
|
+
* omits start from `0`. Pure and deterministic — no ambient randomness or time.
|
|
55
|
+
*
|
|
56
|
+
* @capability param-layers resolve base values plus ordered layers into an effective parameter snapshot
|
|
57
|
+
*/
|
|
58
|
+
export function resolveParams(base, layers) {
|
|
59
|
+
const values = { ...base };
|
|
60
|
+
const contributions = {};
|
|
61
|
+
for (const layer of orderLayers(layers)) {
|
|
62
|
+
for (const [param, opOrList] of Object.entries(layer.ops)) {
|
|
63
|
+
const ops = Array.isArray(opOrList) ? opOrList : [opOrList];
|
|
64
|
+
let current = values[param] ?? 0;
|
|
65
|
+
const trace = (contributions[param] ??= []);
|
|
66
|
+
for (const op of ops) {
|
|
67
|
+
const next = applyOp(current, op);
|
|
68
|
+
trace.push({ layerId: layer.id, op, from: current, to: next });
|
|
69
|
+
current = next;
|
|
70
|
+
}
|
|
71
|
+
values[param] = current;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return { values, contributions };
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Detect design conflicts in a layer set before resolving: duplicate ids, and competing `set` ops on
|
|
78
|
+
* the same parameter at the same priority (order-dependent, so worth surfacing). Returns an empty
|
|
79
|
+
* array when the set is clean, so callers can gate a difficulty/session build on it.
|
|
80
|
+
*
|
|
81
|
+
* @capability param-layers validate a layer set for duplicate ids and competing set-op conflicts
|
|
82
|
+
*/
|
|
83
|
+
export function validateLayers(layers) {
|
|
84
|
+
const conflicts = [];
|
|
85
|
+
const counts = new Map();
|
|
86
|
+
for (const layer of layers)
|
|
87
|
+
counts.set(layer.id, (counts.get(layer.id) ?? 0) + 1);
|
|
88
|
+
for (const [id, count] of counts) {
|
|
89
|
+
if (count > 1)
|
|
90
|
+
conflicts.push({ kind: "duplicate-id", layerIds: [id] });
|
|
91
|
+
}
|
|
92
|
+
const setters = new Map();
|
|
93
|
+
for (const layer of layers) {
|
|
94
|
+
const priority = layer.priority ?? 0;
|
|
95
|
+
for (const [param, opOrList] of Object.entries(layer.ops)) {
|
|
96
|
+
const ops = Array.isArray(opOrList) ? opOrList : [opOrList];
|
|
97
|
+
if (!ops.some((op) => op.kind === "set"))
|
|
98
|
+
continue;
|
|
99
|
+
const existing = setters.get(param);
|
|
100
|
+
if (existing)
|
|
101
|
+
existing.push({ layerId: layer.id, priority });
|
|
102
|
+
else
|
|
103
|
+
setters.set(param, [{ layerId: layer.id, priority }]);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
for (const [param, entries] of setters) {
|
|
107
|
+
const byPriority = new Map();
|
|
108
|
+
for (const entry of entries) {
|
|
109
|
+
const bucket = byPriority.get(entry.priority);
|
|
110
|
+
if (bucket)
|
|
111
|
+
bucket.add(entry.layerId);
|
|
112
|
+
else
|
|
113
|
+
byPriority.set(entry.priority, new Set([entry.layerId]));
|
|
114
|
+
}
|
|
115
|
+
for (const ids of byPriority.values()) {
|
|
116
|
+
if (ids.size > 1)
|
|
117
|
+
conflicts.push({ kind: "set-conflict", param, layerIds: [...ids] });
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return conflicts;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Compute the per-parameter deltas between two value maps — the preview/diff of applying a change,
|
|
124
|
+
* for showing a player what a difficulty tier or mutator will do before they commit.
|
|
125
|
+
*
|
|
126
|
+
* @capability param-layers diff two parameter value maps into per-parameter deltas for preview
|
|
127
|
+
*/
|
|
128
|
+
export function diffParams(before, after) {
|
|
129
|
+
const params = new Set([...Object.keys(before), ...Object.keys(after)]);
|
|
130
|
+
const deltas = [];
|
|
131
|
+
for (const param of [...params].sort()) {
|
|
132
|
+
const from = before[param] ?? 0;
|
|
133
|
+
const to = after[param] ?? 0;
|
|
134
|
+
if (from !== to)
|
|
135
|
+
deltas.push({ param, from, to, delta: to - from });
|
|
136
|
+
}
|
|
137
|
+
return deltas;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Create a {@link LayerRegistry} — the registration seam difficulty tiers, mutators, and presets
|
|
141
|
+
* install into. Duplicate ids throw at registration; unknown ids at resolve time are reported, not
|
|
142
|
+
* fatal, which is what keeps saved sessions reproducible across content/version drift.
|
|
143
|
+
*
|
|
144
|
+
* @capability param-layers register parameter layers by stable id and resolve serialized selections
|
|
145
|
+
*/
|
|
146
|
+
export function createLayerRegistry(initial) {
|
|
147
|
+
const layers = new Map();
|
|
148
|
+
const register = (layer) => {
|
|
149
|
+
if (layers.has(layer.id))
|
|
150
|
+
throw new Error(`param layer "${layer.id}" is already registered`);
|
|
151
|
+
layers.set(layer.id, layer);
|
|
152
|
+
};
|
|
153
|
+
if (initial)
|
|
154
|
+
for (const layer of initial)
|
|
155
|
+
register(layer);
|
|
156
|
+
return {
|
|
157
|
+
register,
|
|
158
|
+
has: (id) => layers.has(id),
|
|
159
|
+
get: (id) => layers.get(id),
|
|
160
|
+
all: () => [...layers.values()],
|
|
161
|
+
resolve(ids) {
|
|
162
|
+
const resolved = [];
|
|
163
|
+
const unknown = [];
|
|
164
|
+
for (const id of ids) {
|
|
165
|
+
const layer = layers.get(id);
|
|
166
|
+
if (layer)
|
|
167
|
+
resolved.push(layer);
|
|
168
|
+
else
|
|
169
|
+
unknown.push(id);
|
|
170
|
+
}
|
|
171
|
+
return { layers: resolved, unknown };
|
|
172
|
+
},
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Reproducible session setup in one call: resolve a saved {@link LayerSelection} through a registry,
|
|
177
|
+
* fold the found layers over `base`, and return the snapshot alongside any unknown ids. The same
|
|
178
|
+
* base + registry + selection always yields the same snapshot.
|
|
179
|
+
*
|
|
180
|
+
* @capability param-layers resolve a saved layer selection into an effective snapshot with unknown-id report
|
|
181
|
+
*/
|
|
182
|
+
export function resolveSelection(base, registry, ids) {
|
|
183
|
+
const { layers, unknown } = registry.resolve(ids);
|
|
184
|
+
return { snapshot: resolveParams(base, layers), unknown };
|
|
185
|
+
}
|
package/dist/game/ping.d.ts
CHANGED
|
@@ -64,4 +64,9 @@ export interface PingSystem {
|
|
|
64
64
|
/** Classify → build → broadcast in one call; the ping verb. */
|
|
65
65
|
ping(from: string, hit: PointerHit, category?: PingCategory): PingPayload;
|
|
66
66
|
}
|
|
67
|
+
/**
|
|
68
|
+
* Contextual ping/marker communication between teammates, classified by what was pinged.
|
|
69
|
+
*
|
|
70
|
+
* @capability ping-wheel contextual ping/marker communication between teammates
|
|
71
|
+
*/
|
|
67
72
|
export declare function createPingSystem(deps: PingSystemDeps): PingSystem;
|
package/dist/game/ping.js
CHANGED
|
@@ -33,6 +33,11 @@ export function classifyPing(hit, deps = {}, options = {}) {
|
|
|
33
33
|
function categoryDef(categories, category) {
|
|
34
34
|
return categories[category] ?? { id: category, markerKind: category, label: category, callout: category };
|
|
35
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* Contextual ping/marker communication between teammates, classified by what was pinged.
|
|
38
|
+
*
|
|
39
|
+
* @capability ping-wheel contextual ping/marker communication between teammates
|
|
40
|
+
*/
|
|
36
41
|
export function createPingSystem(deps) {
|
|
37
42
|
const now = deps.now ?? Date.now;
|
|
38
43
|
const categories = deps.categories ?? DEFAULT_PING_CATEGORIES;
|