@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,59 @@
|
|
|
1
|
+
import { createMountController, MountController } from "./mount.js";
|
|
2
|
+
/**
|
|
3
|
+
* Composes `scene/mount`'s control-transfer bookkeeping with the seat/camera/movement-mode transition
|
|
4
|
+
* every enter/exit-vehicle flow needs (#533.2): boarding resolves a free seat and reports the camera
|
|
5
|
+
* target, drive target, and rider movement-lock patch in one call; leaving computes a side-door
|
|
6
|
+
* placement next to the vehicle and reports the same triad in reverse. Pure — no entity/camera side
|
|
7
|
+
* effects — the caller applies `riderMovementPatch`/`placement`/`cameraTarget` via its own `ctx`.
|
|
8
|
+
*/
|
|
9
|
+
export class VehicleSeats {
|
|
10
|
+
controller;
|
|
11
|
+
constructor(controller) {
|
|
12
|
+
this.controller = controller ?? createMountController();
|
|
13
|
+
}
|
|
14
|
+
register(config) {
|
|
15
|
+
this.controller.register(config);
|
|
16
|
+
}
|
|
17
|
+
enter(riderId, vehicleId, options = {}) {
|
|
18
|
+
const result = this.controller.mount(riderId, vehicleId, options.seatId);
|
|
19
|
+
if (!result.ok)
|
|
20
|
+
return { ok: false, reason: result.reason };
|
|
21
|
+
return {
|
|
22
|
+
ok: true,
|
|
23
|
+
seat: result.seat,
|
|
24
|
+
cameraTarget: this.controller.cameraTarget(riderId),
|
|
25
|
+
driveTarget: this.controller.driveTarget(riderId),
|
|
26
|
+
riderMovementPatch: { frozen: true },
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
exit(riderId, vehiclePose, offset = {}) {
|
|
30
|
+
const vehicleId = this.controller.dismount(riderId);
|
|
31
|
+
if (vehicleId === null)
|
|
32
|
+
return { ok: false, reason: "not_seated" };
|
|
33
|
+
const distance = offset.distance ?? 2.2;
|
|
34
|
+
const sign = offset.side === "left" ? -1 : 1;
|
|
35
|
+
const side = vehiclePose.rotationY + (Math.PI / 2) * sign;
|
|
36
|
+
const x = vehiclePose.position[0] + Math.sin(side) * distance;
|
|
37
|
+
const z = vehiclePose.position[2] + Math.cos(side) * distance;
|
|
38
|
+
return {
|
|
39
|
+
ok: true,
|
|
40
|
+
vehicleId,
|
|
41
|
+
placement: { position: [x, vehiclePose.position[1], z], rotationY: vehiclePose.rotationY },
|
|
42
|
+
cameraTarget: riderId,
|
|
43
|
+
riderMovementPatch: { frozen: false },
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
isSeated(riderId) {
|
|
47
|
+
return this.controller.isSeated(riderId);
|
|
48
|
+
}
|
|
49
|
+
driverOf(vehicleId) {
|
|
50
|
+
return this.controller.driver(vehicleId);
|
|
51
|
+
}
|
|
52
|
+
get mounts() {
|
|
53
|
+
return this.controller;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/** Builds a {@link VehicleSeats}, optionally over an existing `MountController` to share its occupancy. */
|
|
57
|
+
export function createVehicleSeats(controller) {
|
|
58
|
+
return new VehicleSeats(controller);
|
|
59
|
+
}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
export type ColorHex = string;
|
|
2
|
+
/** @internal */
|
|
2
3
|
export declare function colorDistance(a: ColorHex, b: ColorHex): number;
|
|
4
|
+
/** @internal */
|
|
3
5
|
export declare function concealmentScore(entityColors: readonly ColorHex[], backgroundColors: readonly ColorHex[]): number;
|
|
4
6
|
export interface ConcealmentTarget {
|
|
5
7
|
id: string;
|
|
@@ -16,6 +18,7 @@ export interface ConcealmentSensor {
|
|
|
16
18
|
tick(targets: readonly ConcealmentTarget[], dt: number): ConcealmentSample[];
|
|
17
19
|
reset(id?: string): void;
|
|
18
20
|
}
|
|
21
|
+
/** @internal */
|
|
19
22
|
export declare function createConcealmentSensor(config?: {
|
|
20
23
|
threshold?: number;
|
|
21
24
|
}): ConcealmentSensor;
|
|
@@ -13,10 +13,12 @@ function redmean(a, b) {
|
|
|
13
13
|
return Math.sqrt((2 + rmean / 256) * dr * dr + 4 * dg * dg + (2 + (255 - rmean) / 256) * db * db);
|
|
14
14
|
}
|
|
15
15
|
const REDMEAN_MAX = redmean([0, 0, 0], [255, 255, 255]);
|
|
16
|
+
/** @internal */
|
|
16
17
|
export function colorDistance(a, b) {
|
|
17
18
|
const distance = redmean(parseHex(a), parseHex(b));
|
|
18
19
|
return REDMEAN_MAX === 0 ? 0 : Math.min(1, distance / REDMEAN_MAX);
|
|
19
20
|
}
|
|
21
|
+
/** @internal */
|
|
20
22
|
export function concealmentScore(entityColors, backgroundColors) {
|
|
21
23
|
if (entityColors.length === 0 || backgroundColors.length === 0)
|
|
22
24
|
return 0;
|
|
@@ -32,6 +34,7 @@ export function concealmentScore(entityColors, backgroundColors) {
|
|
|
32
34
|
}
|
|
33
35
|
return 1 - total / entityColors.length;
|
|
34
36
|
}
|
|
37
|
+
/** @internal */
|
|
35
38
|
export function createConcealmentSensor(config) {
|
|
36
39
|
const threshold = config?.threshold ?? 0.7;
|
|
37
40
|
const dwell = new Map();
|
|
@@ -11,6 +11,7 @@ export interface FreezeMonitor {
|
|
|
11
11
|
tick(subjects: readonly FreezeSubject[], frozenIds: ReadonlySet<string>, dt: number): FreezeViolation[];
|
|
12
12
|
reset(id?: string): void;
|
|
13
13
|
}
|
|
14
|
+
/** @internal */
|
|
14
15
|
export declare function createFreezeMonitor(config?: {
|
|
15
16
|
toleranceSpeed?: number;
|
|
16
17
|
graceSeconds?: number;
|
|
@@ -26,7 +26,8 @@ export interface FrustumProjection {
|
|
|
26
26
|
* Project a world point into the camera's view. Pure geometry — no three.js —
|
|
27
27
|
* so a game can run "is this framed?" checks headlessly (photo-mode scoring,
|
|
28
28
|
* server-side kill-cam validation) as well as from the live render camera.
|
|
29
|
-
|
|
29
|
+
* @internal
|
|
30
|
+
*/
|
|
30
31
|
export declare function projectToView(camera: FrustumCamera, point: EntityPosition): FrustumProjection;
|
|
31
32
|
export interface FramingConfig {
|
|
32
33
|
/** World-unit distance from camera that reads as "ideally framed" size. Default 6. */
|
|
@@ -36,7 +37,9 @@ export interface FramingConfig {
|
|
|
36
37
|
/** Weight of subject size (distance-to-ideal) in the framing score. Default 0.4. */
|
|
37
38
|
sizeWeight?: number;
|
|
38
39
|
}
|
|
39
|
-
/** 0 (not framed) .. 1 (dead-center, ideal distance) framing quality for an in-view projection.
|
|
40
|
+
/** 0 (not framed) .. 1 (dead-center, ideal distance) framing quality for an in-view projection.
|
|
41
|
+
* @internal
|
|
42
|
+
*/
|
|
40
43
|
export declare function framingScore(projection: FrustumProjection, config?: FramingConfig): number;
|
|
41
44
|
export interface FrustumSample {
|
|
42
45
|
id: string;
|
|
@@ -56,5 +59,6 @@ export interface FrustumSensor {
|
|
|
56
59
|
* A view-frustum sensor on a held camera object: which entities are in frame,
|
|
57
60
|
* how well framed they are, and how long they've stayed on-screen (photo-mode
|
|
58
61
|
* "is this subject framed", Content Warning-style monster-filming scoring).
|
|
59
|
-
|
|
62
|
+
* @internal
|
|
63
|
+
*/
|
|
60
64
|
export declare function createFrustumSensor(config?: FramingConfig): FrustumSensor;
|
|
@@ -19,7 +19,8 @@ const WORLD_UP = [0, 1, 0];
|
|
|
19
19
|
* Project a world point into the camera's view. Pure geometry — no three.js —
|
|
20
20
|
* so a game can run "is this framed?" checks headlessly (photo-mode scoring,
|
|
21
21
|
* server-side kill-cam validation) as well as from the live render camera.
|
|
22
|
-
|
|
22
|
+
* @internal
|
|
23
|
+
*/
|
|
23
24
|
export function projectToView(camera, point) {
|
|
24
25
|
const forward = normalize(subtract(camera.lookAt, camera.position));
|
|
25
26
|
const relative = subtract(point, camera.position);
|
|
@@ -47,7 +48,9 @@ export function projectToView(camera, point) {
|
|
|
47
48
|
const inView = Math.abs(screenX) <= 1 && Math.abs(screenY) <= 1;
|
|
48
49
|
return { inView, distance, screenX, screenY };
|
|
49
50
|
}
|
|
50
|
-
/** 0 (not framed) .. 1 (dead-center, ideal distance) framing quality for an in-view projection.
|
|
51
|
+
/** 0 (not framed) .. 1 (dead-center, ideal distance) framing quality for an in-view projection.
|
|
52
|
+
* @internal
|
|
53
|
+
*/
|
|
51
54
|
export function framingScore(projection, config) {
|
|
52
55
|
if (!projection.inView)
|
|
53
56
|
return 0;
|
|
@@ -65,7 +68,8 @@ export function framingScore(projection, config) {
|
|
|
65
68
|
* A view-frustum sensor on a held camera object: which entities are in frame,
|
|
66
69
|
* how well framed they are, and how long they've stayed on-screen (photo-mode
|
|
67
70
|
* "is this subject framed", Content Warning-style monster-filming scoring).
|
|
68
|
-
|
|
71
|
+
* @internal
|
|
72
|
+
*/
|
|
69
73
|
export function createFrustumSensor(config) {
|
|
70
74
|
const dwell = new Map();
|
|
71
75
|
return {
|
|
@@ -25,7 +25,10 @@ export interface SensorReading {
|
|
|
25
25
|
* `proximityPrompt` (a UI affordance), this reads world state the player has no
|
|
26
26
|
* other way to see — the strongest in-range reading wins, mirroring how a real
|
|
27
27
|
* handheld sensor needle settles on the loudest nearby source.
|
|
28
|
-
|
|
28
|
+
* @internal
|
|
29
|
+
*/
|
|
29
30
|
export declare function probeHiddenState(origin: EntityPosition, sources: readonly HiddenStateSource[], options: SensorProbeOptions): SensorReading | null;
|
|
30
|
-
/** All in-range readings for `variableId`, strongest first.
|
|
31
|
+
/** All in-range readings for `variableId`, strongest first.
|
|
32
|
+
* @internal
|
|
33
|
+
*/
|
|
31
34
|
export declare function probeHiddenStateAll(origin: EntityPosition, sources: readonly HiddenStateSource[], options: SensorProbeOptions): SensorReading[];
|
|
@@ -12,12 +12,15 @@ function strengthAt(distance, range, falloff) {
|
|
|
12
12
|
* `proximityPrompt` (a UI affordance), this reads world state the player has no
|
|
13
13
|
* other way to see — the strongest in-range reading wins, mirroring how a real
|
|
14
14
|
* handheld sensor needle settles on the loudest nearby source.
|
|
15
|
-
|
|
15
|
+
* @internal
|
|
16
|
+
*/
|
|
16
17
|
export function probeHiddenState(origin, sources, options) {
|
|
17
18
|
const readings = probeHiddenStateAll(origin, sources, options);
|
|
18
19
|
return readings.length === 0 ? null : readings[0];
|
|
19
20
|
}
|
|
20
|
-
/** All in-range readings for `variableId`, strongest first.
|
|
21
|
+
/** All in-range readings for `variableId`, strongest first.
|
|
22
|
+
* @internal
|
|
23
|
+
*/
|
|
21
24
|
export function probeHiddenStateAll(origin, sources, options) {
|
|
22
25
|
const { range, variableId, falloff = "linear" } = options;
|
|
23
26
|
const readings = [];
|
|
@@ -31,5 +31,6 @@ export interface RecordingBuffer<T> {
|
|
|
31
31
|
* then seek/scrub the recording independent of the live sim. Frames are
|
|
32
32
|
* expected in non-decreasing `t` order (one push per tick); `seek`/`range`
|
|
33
33
|
* binary-search on that assumption.
|
|
34
|
-
|
|
34
|
+
* @internal
|
|
35
|
+
*/
|
|
35
36
|
export declare function createRecordingBuffer<T>(options?: RecordingBufferOptions): RecordingBuffer<T>;
|
|
@@ -17,7 +17,8 @@ function evict(frames, options) {
|
|
|
17
17
|
* then seek/scrub the recording independent of the live sim. Frames are
|
|
18
18
|
* expected in non-decreasing `t` order (one push per tick); `seek`/`range`
|
|
19
19
|
* binary-search on that assumption.
|
|
20
|
-
|
|
20
|
+
* @internal
|
|
21
|
+
*/
|
|
21
22
|
export function createRecordingBuffer(options = {}) {
|
|
22
23
|
const frames = [];
|
|
23
24
|
function floorIndex(t) {
|
|
@@ -14,6 +14,7 @@ export interface ReplayLoop<T> {
|
|
|
14
14
|
duration(): number;
|
|
15
15
|
sample(t: number): T | null;
|
|
16
16
|
}
|
|
17
|
+
/** @internal */
|
|
17
18
|
export declare function createReplayLoop<T>(buffer: RecordingBuffer<T>, options?: ReplayLoopOptions<T>): ReplayLoop<T>;
|
|
18
19
|
export interface ReplayEntityDeps {
|
|
19
20
|
has(id: string): boolean;
|
|
@@ -29,11 +30,14 @@ export interface RecordedPoseLike {
|
|
|
29
30
|
position: readonly [number, number, number];
|
|
30
31
|
rotationY?: number;
|
|
31
32
|
}
|
|
32
|
-
/** Linear pose blend for `ReplayLoopOptions.interpolate` — position lerp plus shortest-arc yaw.
|
|
33
|
+
/** Linear pose blend for `ReplayLoopOptions.interpolate` — position lerp plus shortest-arc yaw.
|
|
34
|
+
* @internal
|
|
35
|
+
*/
|
|
33
36
|
export declare function interpolateRecordedPose<T extends RecordedPoseLike>(before: T, after: T, alpha: number): T;
|
|
34
37
|
/**
|
|
35
38
|
* Reconcile a replayed pose against an entity store: spawns the ghost on the first non-null sample,
|
|
36
39
|
* poses it while samples flow, despawns it through grace gaps or after the recording empties.
|
|
37
40
|
* `deps` matches `ctx.scene.entity` structurally — pass `{ has: (id) => ctx.scene.entity.get(id) !== null, spawn, setPose, despawn }`.
|
|
38
|
-
|
|
41
|
+
* @internal
|
|
42
|
+
*/
|
|
39
43
|
export declare function syncReplayEntity(deps: ReplayEntityDeps, id: string, pose: RecordedPoseLike | null, dt?: number): void;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/** @internal */
|
|
1
2
|
export function createReplayLoop(buffer, options = {}) {
|
|
2
3
|
const grace = Math.max(0, options.spawnGraceSeconds ?? 0);
|
|
3
4
|
const interpolate = options.interpolate;
|
|
@@ -26,7 +27,9 @@ export function createReplayLoop(buffer, options = {}) {
|
|
|
26
27
|
},
|
|
27
28
|
};
|
|
28
29
|
}
|
|
29
|
-
/** Linear pose blend for `ReplayLoopOptions.interpolate` — position lerp plus shortest-arc yaw.
|
|
30
|
+
/** Linear pose blend for `ReplayLoopOptions.interpolate` — position lerp plus shortest-arc yaw.
|
|
31
|
+
* @internal
|
|
32
|
+
*/
|
|
30
33
|
export function interpolateRecordedPose(before, after, alpha) {
|
|
31
34
|
let yawDelta = (after.rotationY ?? 0) - (before.rotationY ?? 0);
|
|
32
35
|
while (yawDelta > Math.PI)
|
|
@@ -47,7 +50,8 @@ export function interpolateRecordedPose(before, after, alpha) {
|
|
|
47
50
|
* Reconcile a replayed pose against an entity store: spawns the ghost on the first non-null sample,
|
|
48
51
|
* poses it while samples flow, despawns it through grace gaps or after the recording empties.
|
|
49
52
|
* `deps` matches `ctx.scene.entity` structurally — pass `{ has: (id) => ctx.scene.entity.get(id) !== null, spawn, setPose, despawn }`.
|
|
50
|
-
|
|
53
|
+
* @internal
|
|
54
|
+
*/
|
|
51
55
|
export function syncReplayEntity(deps, id, pose, dt) {
|
|
52
56
|
if (pose === null) {
|
|
53
57
|
if (deps.has(id))
|
|
@@ -18,5 +18,6 @@ export interface RevealQuery {
|
|
|
18
18
|
* the same unfiltered radius query, scoped to catalog-declared tags and shaped
|
|
19
19
|
* for a vision readout (Dark Sight / detective-vision reveal) instead of damage
|
|
20
20
|
* resolution — it never consults an occluder, by design.
|
|
21
|
-
|
|
21
|
+
* @internal
|
|
22
|
+
*/
|
|
22
23
|
export declare function createRevealQuery(options: RevealQueryOptions): RevealQuery;
|
|
@@ -5,7 +5,8 @@ import { distanceBetween } from "../scene/spatial.js";
|
|
|
5
5
|
* the same unfiltered radius query, scoped to catalog-declared tags and shaped
|
|
6
6
|
* for a vision readout (Dark Sight / detective-vision reveal) instead of damage
|
|
7
7
|
* resolution — it never consults an occluder, by design.
|
|
8
|
-
|
|
8
|
+
* @internal
|
|
9
|
+
*/
|
|
9
10
|
export function createRevealQuery(options) {
|
|
10
11
|
const { resolvePosition, resolveTags, candidates } = options;
|
|
11
12
|
return {
|
|
@@ -9,11 +9,17 @@ export interface VisionConeConfig {
|
|
|
9
9
|
/** Full cone opening angle in radians (matches `TelegraphShape`'s cone `angle`). */
|
|
10
10
|
angle: number;
|
|
11
11
|
}
|
|
12
|
-
/** 2D segment intersection on the XZ plane (collinear overlaps count) — the LoS building block `revealQuery`/`frustumSensor` never shipped (#286.5).
|
|
12
|
+
/** 2D segment intersection on the XZ plane (collinear overlaps count) — the LoS building block `revealQuery`/`frustumSensor` never shipped (#286.5).
|
|
13
|
+
* @internal
|
|
14
|
+
*/
|
|
13
15
|
export declare function segmentsIntersect(a1: VisionPoint, a2: VisionPoint, b1: VisionPoint, b2: VisionPoint): boolean;
|
|
14
|
-
/** True when no wall segment crosses the sight line.
|
|
16
|
+
/** True when no wall segment crosses the sight line.
|
|
17
|
+
* @internal
|
|
18
|
+
*/
|
|
15
19
|
export declare function hasWallLineOfSight(from: VisionPoint, to: VisionPoint, walls: readonly VisionWall[]): boolean;
|
|
16
|
-
/** Angle + range test only — no occlusion. `heading` is engine yaw (radians, `atan2(dx, dz)`).
|
|
20
|
+
/** Angle + range test only — no occlusion. `heading` is engine yaw (radians, `atan2(dx, dz)`).
|
|
21
|
+
* @internal
|
|
22
|
+
*/
|
|
17
23
|
export declare function pointInCone(origin: VisionPoint, heading: number, config: VisionConeConfig, point: VisionPoint): boolean;
|
|
18
24
|
export interface VisionTarget<TId extends string = string> {
|
|
19
25
|
id: TId;
|
|
@@ -28,4 +34,5 @@ export interface VisionCone {
|
|
|
28
34
|
canSee(origin: VisionPoint, heading: number, target: VisionPoint): boolean;
|
|
29
35
|
visibleTargets<TId extends string>(origin: VisionPoint, heading: number, targets: readonly VisionTarget<TId>[]): TId[];
|
|
30
36
|
}
|
|
37
|
+
/** @internal */
|
|
31
38
|
export declare function createVisionCone(config: VisionConeConfig, walls?: readonly VisionWall[]): VisionCone;
|
|
@@ -12,7 +12,9 @@ function onSegment(ax, az, bx, bz, cx, cz) {
|
|
|
12
12
|
Math.min(az, bz) - 1e-9 <= cz &&
|
|
13
13
|
cz <= Math.max(az, bz) + 1e-9);
|
|
14
14
|
}
|
|
15
|
-
/** 2D segment intersection on the XZ plane (collinear overlaps count) — the LoS building block `revealQuery`/`frustumSensor` never shipped (#286.5).
|
|
15
|
+
/** 2D segment intersection on the XZ plane (collinear overlaps count) — the LoS building block `revealQuery`/`frustumSensor` never shipped (#286.5).
|
|
16
|
+
* @internal
|
|
17
|
+
*/
|
|
16
18
|
export function segmentsIntersect(a1, a2, b1, b2) {
|
|
17
19
|
const o1 = orientation(a1[0], a1[1], a2[0], a2[1], b1[0], b1[1]);
|
|
18
20
|
const o2 = orientation(a1[0], a1[1], a2[0], a2[1], b2[0], b2[1]);
|
|
@@ -30,7 +32,9 @@ export function segmentsIntersect(a1, a2, b1, b2) {
|
|
|
30
32
|
return true;
|
|
31
33
|
return false;
|
|
32
34
|
}
|
|
33
|
-
/** True when no wall segment crosses the sight line.
|
|
35
|
+
/** True when no wall segment crosses the sight line.
|
|
36
|
+
* @internal
|
|
37
|
+
*/
|
|
34
38
|
export function hasWallLineOfSight(from, to, walls) {
|
|
35
39
|
for (const wall of walls) {
|
|
36
40
|
if (segmentsIntersect(from, to, wall.from, wall.to))
|
|
@@ -38,7 +42,9 @@ export function hasWallLineOfSight(from, to, walls) {
|
|
|
38
42
|
}
|
|
39
43
|
return true;
|
|
40
44
|
}
|
|
41
|
-
/** Angle + range test only — no occlusion. `heading` is engine yaw (radians, `atan2(dx, dz)`).
|
|
45
|
+
/** Angle + range test only — no occlusion. `heading` is engine yaw (radians, `atan2(dx, dz)`).
|
|
46
|
+
* @internal
|
|
47
|
+
*/
|
|
42
48
|
export function pointInCone(origin, heading, config, point) {
|
|
43
49
|
const dx = point[0] - origin[0];
|
|
44
50
|
const dz = point[1] - origin[1];
|
|
@@ -54,6 +60,7 @@ export function pointInCone(origin, heading, config, point) {
|
|
|
54
60
|
delta += Math.PI * 2;
|
|
55
61
|
return Math.abs(delta) <= config.angle / 2;
|
|
56
62
|
}
|
|
63
|
+
/** @internal */
|
|
57
64
|
export function createVisionCone(config, walls = []) {
|
|
58
65
|
function canSee(origin, heading, target) {
|
|
59
66
|
return pointInCone(origin, heading, config, target) && hasWallLineOfSight(origin, target, walls);
|
|
@@ -10,6 +10,7 @@ function anyContester(occupants, owner) {
|
|
|
10
10
|
}
|
|
11
11
|
return false;
|
|
12
12
|
}
|
|
13
|
+
/** @internal */
|
|
13
14
|
export function createContestedChannel(config) {
|
|
14
15
|
const duration = config.duration > 0 ? config.duration : Number.EPSILON;
|
|
15
16
|
const interruptOnDamage = config.interruptOnDamage ?? true;
|
package/dist/session/roles.d.ts
CHANGED
|
@@ -3,4 +3,10 @@ export interface RoleSpec {
|
|
|
3
3
|
count?: number;
|
|
4
4
|
ratio?: number;
|
|
5
5
|
}
|
|
6
|
+
/**
|
|
7
|
+
* Assign hidden or team roles across players by ratio — social-deduction and team-shuffle setups.
|
|
8
|
+
*
|
|
9
|
+
* @capability role-assign assign hidden or team roles to players by ratio
|
|
10
|
+
* @internal
|
|
11
|
+
*/
|
|
6
12
|
export declare function assignRoles(userIds: readonly string[], roles: readonly RoleSpec[], rng?: () => number): Record<string, string>;
|
package/dist/session/roles.js
CHANGED
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
import { shuffleWithRng } from "../cards/cardPile.js";
|
|
2
|
+
/**
|
|
3
|
+
* Assign hidden or team roles across players by ratio — social-deduction and team-shuffle setups.
|
|
4
|
+
*
|
|
5
|
+
* @capability role-assign assign hidden or team roles to players by ratio
|
|
6
|
+
* @internal
|
|
7
|
+
*/
|
|
2
8
|
export function assignRoles(userIds, roles, rng = Math.random) {
|
|
3
9
|
if (roles.length === 0)
|
|
4
10
|
throw new Error("assignRoles needs at least one role");
|
|
@@ -72,8 +72,16 @@ export interface RoundState<TPhase extends string = RoundPhase> {
|
|
|
72
72
|
roleOf(team: string): string | undefined;
|
|
73
73
|
snapshot(): RoundSnapshot<TPhase>;
|
|
74
74
|
}
|
|
75
|
+
/** @internal */
|
|
75
76
|
export declare function lossBonusFor(rule: LossBonusRule | undefined, streak: number): number;
|
|
77
|
+
/**
|
|
78
|
+
* Run a match as repeating buy/action/end round phases with per-round win rewards and loss-streak economy.
|
|
79
|
+
*
|
|
80
|
+
* @capability match-rounds run buy/action/end round phases with per-round economy
|
|
81
|
+
* @internal
|
|
82
|
+
*/
|
|
76
83
|
export declare function createRoundState(config: RoundConfig<RoundPhase>): RoundState<RoundPhase>;
|
|
84
|
+
/** @internal */
|
|
77
85
|
export declare function createRoundState<TPhase extends string>(config: RoundConfig<TPhase> & {
|
|
78
86
|
phaseOrder: readonly TPhase[];
|
|
79
87
|
}): RoundState<TPhase>;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
const DEFAULT_PHASE_ORDER = ["buy", "live", "end"];
|
|
2
|
+
/** @internal */
|
|
2
3
|
export function lossBonusFor(rule, streak) {
|
|
3
4
|
if (rule === undefined)
|
|
4
5
|
return 0;
|
|
@@ -17,6 +18,7 @@ function isConcludable(order, phase) {
|
|
|
17
18
|
const idx = order.indexOf(phase);
|
|
18
19
|
return idx > 0 && idx < order.length - 1;
|
|
19
20
|
}
|
|
21
|
+
/** @internal */
|
|
20
22
|
export function createRoundState(config) {
|
|
21
23
|
const order = config.phaseOrder ?? DEFAULT_PHASE_ORDER;
|
|
22
24
|
const durations = config.phases;
|
|
@@ -67,6 +67,7 @@ export declare const SETTING_IDS: {
|
|
|
67
67
|
readonly graphicsQuality: "graphics.quality";
|
|
68
68
|
readonly graphicsShadows: "graphics.shadows";
|
|
69
69
|
readonly graphicsUiScale: "graphics.uiScale";
|
|
70
|
+
readonly touchStyle: "controls.touchStyle";
|
|
70
71
|
};
|
|
71
72
|
export type GraphicsQuality = "low" | "medium" | "high";
|
|
72
73
|
export declare const GRAPHICS_QUALITY_OPTIONS: readonly SettingOption[];
|
|
@@ -11,6 +11,7 @@ export const SETTING_IDS = {
|
|
|
11
11
|
graphicsQuality: "graphics.quality",
|
|
12
12
|
graphicsShadows: "graphics.shadows",
|
|
13
13
|
graphicsUiScale: "graphics.uiScale",
|
|
14
|
+
touchStyle: "controls.touchStyle",
|
|
14
15
|
};
|
|
15
16
|
export const GRAPHICS_QUALITY_OPTIONS = [
|
|
16
17
|
{ value: "low", label: "Low" },
|
|
@@ -27,5 +27,11 @@ export interface AccumulatorMeter {
|
|
|
27
27
|
reset(): void;
|
|
28
28
|
tick(dtSeconds: number): void;
|
|
29
29
|
}
|
|
30
|
+
/** The highest tier id whose `at` threshold `value` has reached, or `null` below every tier — the pure lookup `createAccumulatorMeter`/`createEventMeter` call on every `add`/`tick`. */
|
|
30
31
|
export declare function tierAt(value: number, tiers: readonly MeterTier[]): string | null;
|
|
32
|
+
/**
|
|
33
|
+
* A raw accumulating gauge that crosses named tier thresholds as a value builds, with optional decay — the primitive under charge, rage, and combo meters.
|
|
34
|
+
*
|
|
35
|
+
* @capability charge-meter fill a gauge toward named tier thresholds as a value accumulates
|
|
36
|
+
*/
|
|
31
37
|
export declare function createAccumulatorMeter(config: AccumulatorMeterConfig): AccumulatorMeter;
|
|
@@ -3,6 +3,7 @@ function sortedTiers(tiers) {
|
|
|
3
3
|
return [];
|
|
4
4
|
return [...tiers].sort((a, b) => a.at - b.at);
|
|
5
5
|
}
|
|
6
|
+
/** The highest tier id whose `at` threshold `value` has reached, or `null` below every tier — the pure lookup `createAccumulatorMeter`/`createEventMeter` call on every `add`/`tick`. */
|
|
6
7
|
export function tierAt(value, tiers) {
|
|
7
8
|
let current = null;
|
|
8
9
|
for (const tier of tiers) {
|
|
@@ -13,6 +14,11 @@ export function tierAt(value, tiers) {
|
|
|
13
14
|
}
|
|
14
15
|
return current;
|
|
15
16
|
}
|
|
17
|
+
/**
|
|
18
|
+
* A raw accumulating gauge that crosses named tier thresholds as a value builds, with optional decay — the primitive under charge, rage, and combo meters.
|
|
19
|
+
*
|
|
20
|
+
* @capability charge-meter fill a gauge toward named tier thresholds as a value accumulates
|
|
21
|
+
*/
|
|
16
22
|
export function createAccumulatorMeter(config) {
|
|
17
23
|
const mode = config.mode ?? "hold";
|
|
18
24
|
const tiers = sortedTiers(config.tiers);
|
|
@@ -31,4 +31,9 @@ export interface EventMeter {
|
|
|
31
31
|
reset(): void;
|
|
32
32
|
tick(dtSeconds: number): void;
|
|
33
33
|
}
|
|
34
|
+
/**
|
|
35
|
+
* A heat/hype gauge that rises as tagged events land and cools between them, firing when it fills or breaks — the streak/overdrive meter shooters and fighters hand-roll.
|
|
36
|
+
*
|
|
37
|
+
* @capability event-meter a heat/streak gauge that builds from repeated hits and cools down over time
|
|
38
|
+
*/
|
|
34
39
|
export declare function createEventMeter(config: EventMeterConfig): EventMeter;
|
package/dist/stats/eventMeter.js
CHANGED
|
@@ -2,6 +2,11 @@ import { createAccumulatorMeter, } from "./accumulatorMeter.js";
|
|
|
2
2
|
function readyOf(meter, mode) {
|
|
3
3
|
return mode === "hold" ? meter.broke() : meter.value() >= 0 && meter.fraction() >= 1;
|
|
4
4
|
}
|
|
5
|
+
/**
|
|
6
|
+
* A heat/hype gauge that rises as tagged events land and cools between them, firing when it fills or breaks — the streak/overdrive meter shooters and fighters hand-roll.
|
|
7
|
+
*
|
|
8
|
+
* @capability event-meter a heat/streak gauge that builds from repeated hits and cools down over time
|
|
9
|
+
*/
|
|
5
10
|
export function createEventMeter(config) {
|
|
6
11
|
const mode = config.mode ?? "hold";
|
|
7
12
|
const resets = new Set(config.resets ?? []);
|
|
@@ -12,4 +12,9 @@ export interface CheckResult {
|
|
|
12
12
|
success: boolean;
|
|
13
13
|
critical: "success" | "failure" | null;
|
|
14
14
|
}
|
|
15
|
+
/**
|
|
16
|
+
* Resolve a tabletop-style pass/fail roll against a target number with modifiers and crit/fumble bands.
|
|
17
|
+
*
|
|
18
|
+
* @capability dice-check resolve a pass/fail roll against a target number with modifiers and crits
|
|
19
|
+
*/
|
|
15
20
|
export declare function rollCheck(input: CheckInput, rng?: () => number): CheckResult;
|
package/dist/stats/rollCheck.js
CHANGED
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve a tabletop-style pass/fail roll against a target number with modifiers and crit/fumble bands.
|
|
3
|
+
*
|
|
4
|
+
* @capability dice-check resolve a pass/fail roll against a target number with modifiers and crits
|
|
5
|
+
*/
|
|
1
6
|
export function rollCheck(input, rng = Math.random) {
|
|
2
7
|
const sides = input.diceSides ?? 20;
|
|
3
8
|
const advantage = input.advantage ?? "normal";
|