@jgengine/core 0.9.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +34 -3
- package/LICENSE +203 -661
- package/README.md +1 -1
- package/dist/ai/crowd.d.ts +55 -0
- package/dist/ai/crowd.js +114 -0
- package/dist/ai/flock.d.ts +5 -2
- package/dist/ai/flock.js +5 -2
- package/dist/ai/groupAssist.d.ts +1 -0
- package/dist/ai/groupAssist.js +1 -0
- package/dist/ai/heatSystem.d.ts +76 -0
- package/dist/ai/heatSystem.js +97 -0
- package/dist/ai/interestScheduler.d.ts +107 -0
- package/dist/ai/interestScheduler.js +118 -0
- package/dist/ai/jobBoard.d.ts +1 -0
- package/dist/ai/jobBoard.js +1 -0
- package/dist/ai/laneSelect.d.ts +5 -2
- package/dist/ai/laneSelect.js +5 -2
- package/dist/ai/mobBrain.d.ts +1 -0
- package/dist/ai/mobBrain.js +1 -0
- package/dist/ai/spawnDirector.d.ts +19 -1
- package/dist/ai/spawnDirector.js +53 -26
- package/dist/ai/spawnPoint.d.ts +7 -0
- package/dist/ai/spawnPoint.js +7 -0
- package/dist/ai/targetAcquisition.d.ts +84 -0
- package/dist/ai/targetAcquisition.js +92 -0
- package/dist/anim/easing.d.ts +19 -0
- package/dist/anim/easing.js +19 -0
- package/dist/anim/oscillator.d.ts +12 -0
- package/dist/anim/oscillator.js +25 -0
- package/dist/area/areaEffectField.d.ts +127 -0
- package/dist/area/areaEffectField.js +175 -0
- package/dist/area/stackPolicy.d.ts +47 -0
- package/dist/area/stackPolicy.js +99 -0
- package/dist/audio/audioFalloff.d.ts +5 -2
- package/dist/audio/music.d.ts +53 -0
- package/dist/audio/music.js +34 -0
- package/dist/audio/synth.d.ts +60 -0
- package/dist/audio/synth.js +8 -0
- package/dist/authoring.d.ts +15 -0
- package/dist/authoring.js +15 -0
- package/dist/board/laneBoard.d.ts +13 -0
- package/dist/board/laneBoard.js +13 -0
- package/dist/board/timelineBoard.d.ts +10 -0
- package/dist/board/timelineBoard.js +10 -0
- package/dist/combat/abilityKit.d.ts +18 -0
- package/dist/combat/abilityKit.js +24 -9
- package/dist/combat/animationState.d.ts +5 -0
- package/dist/combat/animationState.js +5 -0
- package/dist/combat/breakMeters.d.ts +10 -0
- package/dist/combat/breakMeters.js +10 -0
- package/dist/combat/castRunner.d.ts +5 -0
- package/dist/combat/castRunner.js +5 -0
- package/dist/combat/comboPoints.d.ts +5 -0
- package/dist/combat/comboPoints.js +5 -0
- package/dist/combat/comboString.d.ts +5 -0
- package/dist/combat/comboString.js +5 -0
- package/dist/combat/damageInterceptors.d.ts +192 -0
- package/dist/combat/damageInterceptors.js +251 -0
- package/dist/combat/damageMatchup.d.ts +68 -0
- package/dist/combat/damageMatchup.js +42 -0
- package/dist/combat/damageResolution.d.ts +63 -0
- package/dist/combat/damageResolution.js +50 -0
- package/dist/combat/death.d.ts +7 -1
- package/dist/combat/death.js +5 -0
- package/dist/combat/deathReason.d.ts +14 -0
- package/dist/combat/deathReason.js +1 -0
- package/dist/combat/defensiveWindow.d.ts +5 -0
- package/dist/combat/defensiveWindow.js +5 -0
- package/dist/combat/dotField.d.ts +47 -0
- package/dist/combat/dotField.js +52 -0
- package/dist/combat/downed.d.ts +5 -0
- package/dist/combat/downed.js +5 -0
- package/dist/combat/effects.d.ts +5 -0
- package/dist/combat/effects.js +5 -0
- package/dist/combat/encounterSequence.d.ts +258 -0
- package/dist/combat/encounterSequence.js +426 -0
- package/dist/combat/hitReaction.d.ts +57 -1
- package/dist/combat/hitReaction.js +45 -5
- package/dist/combat/magazine.d.ts +54 -0
- package/dist/combat/magazine.js +96 -0
- package/dist/combat/projectiles.d.ts +7 -2
- package/dist/combat/projectiles.js +48 -17
- package/dist/combat/receivedDamage.d.ts +117 -0
- package/dist/combat/receivedDamage.js +92 -0
- package/dist/combat/regenShield.d.ts +39 -0
- package/dist/combat/regenShield.js +49 -0
- package/dist/combat/renderCues.d.ts +51 -0
- package/dist/combat/renderCues.js +44 -0
- package/dist/combat/resourcePool.d.ts +5 -0
- package/dist/combat/resourcePool.js +5 -0
- package/dist/combat/rewardAllocation.d.ts +121 -0
- package/dist/combat/rewardAllocation.js +251 -0
- package/dist/combat/shotOrigin.d.ts +30 -1
- package/dist/combat/shotOrigin.js +70 -2
- package/dist/combat/statusApplication.d.ts +96 -0
- package/dist/combat/statusApplication.js +81 -0
- package/dist/combat/telegraph.d.ts +11 -2
- package/dist/combat/telegraph.js +11 -2
- package/dist/combat/thresholdCrossings.d.ts +85 -0
- package/dist/combat/thresholdCrossings.js +116 -0
- package/dist/combat.d.ts +34 -0
- package/dist/combat.js +34 -0
- package/dist/commands/commandRegistry.d.ts +11 -0
- package/dist/commands/commandRegistry.js +9 -2
- package/dist/crafting/crop.d.ts +18 -0
- package/dist/crafting/crop.js +18 -0
- package/dist/crafting/production.d.ts +5 -0
- package/dist/crafting/production.js +5 -0
- package/dist/devtools/rewriteTunables.d.ts +17 -0
- package/dist/devtools/rewriteTunables.js +276 -0
- package/dist/devtools/saveEndpoint.d.ts +46 -0
- package/dist/devtools/saveEndpoint.js +48 -0
- package/dist/devtools/transformTunables.d.ts +3 -0
- package/dist/devtools/transformTunables.js +3 -0
- package/dist/devtools/tunableSchema.d.ts +31 -0
- package/dist/devtools/tunableSchema.js +31 -0
- package/dist/economy/currency.d.ts +12 -1
- package/dist/economy/currency.js +12 -1
- package/dist/economy/listingBook.d.ts +91 -0
- package/dist/economy/listingBook.js +144 -0
- package/dist/economy/resourceLedger.d.ts +222 -0
- package/dist/economy/resourceLedger.js +353 -0
- package/dist/economy/sharedWallet.d.ts +14 -0
- package/dist/economy/sharedWallet.js +14 -0
- package/dist/economy/techTree.d.ts +12 -0
- package/dist/economy/techTree.js +12 -0
- package/dist/economy/wallet.d.ts +26 -2
- package/dist/economy/wallet.js +35 -6
- package/dist/editor/commands.d.ts +248 -0
- package/dist/editor/commands.js +865 -0
- package/dist/editor/document.d.ts +186 -0
- package/dist/editor/document.js +884 -0
- package/dist/editor/grid.d.ts +229 -0
- package/dist/editor/grid.js +366 -0
- package/dist/editor/gridAdapters.d.ts +80 -0
- package/dist/editor/gridAdapters.js +134 -0
- package/dist/editor/index.d.ts +97 -0
- package/dist/editor/index.js +10 -0
- package/dist/editor/liveSync.d.ts +127 -0
- package/dist/editor/liveSync.js +249 -0
- package/dist/editor/runtimeInspector.d.ts +88 -0
- package/dist/editor/runtimeInspector.js +239 -0
- package/dist/editor/types.d.ts +175 -0
- package/dist/editor/types.js +29 -0
- package/dist/faction/reputation.d.ts +5 -0
- package/dist/faction/reputation.js +5 -0
- package/dist/format/distance.d.ts +17 -0
- package/dist/format/distance.js +18 -0
- package/dist/format/duration.d.ts +27 -0
- package/dist/format/duration.js +45 -0
- package/dist/format/speed.d.ts +17 -0
- package/dist/format/speed.js +25 -0
- package/dist/game/connectedPlayers.d.ts +30 -0
- package/dist/game/connectedPlayers.js +21 -0
- package/dist/game/cosmetics.d.ts +9 -0
- package/dist/game/cosmetics.js +16 -0
- package/dist/game/defineGame.d.ts +141 -2
- package/dist/game/defineGame.js +39 -1
- package/dist/game/defineSystem.d.ts +88 -0
- package/dist/game/defineSystem.js +45 -0
- package/dist/game/dialogue.d.ts +33 -0
- package/dist/game/dialogue.js +21 -0
- package/dist/game/events.d.ts +50 -13
- package/dist/game/events.js +5 -0
- package/dist/game/feed.d.ts +33 -0
- package/dist/game/feed.js +35 -2
- package/dist/game/gamePhase.d.ts +11 -0
- package/dist/game/gamePhase.js +16 -0
- package/dist/game/keyValueStore.d.ts +25 -0
- package/dist/game/keyValueStore.js +61 -0
- package/dist/game/leaderboard.d.ts +5 -0
- package/dist/game/leaderboard.js +5 -0
- package/dist/game/levelSequence.d.ts +24 -2
- package/dist/game/levelSequence.js +51 -2
- package/dist/game/loadout.d.ts +5 -0
- package/dist/game/loadout.js +5 -0
- package/dist/game/lootFilter.d.ts +2 -0
- package/dist/game/lootFilter.js +2 -0
- package/dist/game/lootPipeline.d.ts +164 -0
- package/dist/game/lootPipeline.js +216 -0
- package/dist/game/lootTable.d.ts +21 -0
- package/dist/game/lootTable.js +15 -4
- package/dist/game/modelAnimation.d.ts +8 -0
- package/dist/game/modelAnimation.js +18 -0
- package/dist/game/objectives.d.ts +43 -0
- package/dist/game/objectives.js +36 -0
- package/dist/game/paramLayers.d.ts +148 -0
- package/dist/game/paramLayers.js +185 -0
- package/dist/game/ping.d.ts +5 -0
- package/dist/game/ping.js +5 -0
- package/dist/game/playableGame.d.ts +160 -12
- package/dist/game/quest.d.ts +8 -0
- package/dist/game/quest.js +29 -0
- package/dist/game/race.d.ts +141 -0
- package/dist/game/race.js +169 -0
- package/dist/game/recordBook.d.ts +5 -5
- package/dist/game/recordBook.js +4 -1
- package/dist/game/ruleSelection.d.ts +75 -0
- package/dist/game/ruleSelection.js +127 -0
- package/dist/game/runDraft.d.ts +5 -0
- package/dist/game/runDraft.js +5 -0
- package/dist/game/saveStore.d.ts +111 -0
- package/dist/game/saveStore.js +312 -0
- package/dist/game/snapshotHistory.d.ts +67 -0
- package/dist/game/snapshotHistory.js +95 -0
- package/dist/game/social.d.ts +38 -1
- package/dist/game/social.js +71 -0
- package/dist/game/spawnPoints.d.ts +5 -0
- package/dist/game/spawnPoints.js +5 -0
- package/dist/game/systemRuntime.d.ts +50 -0
- package/dist/game/systemRuntime.js +157 -0
- package/dist/game/systemSchedule.d.ts +72 -0
- package/dist/game/systemSchedule.js +242 -0
- package/dist/game/toasts.d.ts +43 -0
- package/dist/game/toasts.js +44 -0
- package/dist/game/trade.d.ts +10 -0
- package/dist/game/trade.js +10 -0
- package/dist/game/unlocks.d.ts +8 -0
- package/dist/game/unlocks.js +16 -0
- package/dist/game/vfxInstance.d.ts +138 -0
- package/dist/game/vfxInstance.js +96 -0
- package/dist/game/worldItem.d.ts +17 -4
- package/dist/game/worldItem.js +17 -4
- package/dist/gameplay.d.ts +91 -0
- package/dist/gameplay.js +91 -0
- package/dist/index.d.ts +5 -7
- package/dist/index.js +5 -7
- package/dist/input/actionBindings.d.ts +24 -5
- package/dist/input/actionBindings.js +23 -5
- package/dist/input/axisInput.d.ts +13 -1
- package/dist/input/axisInput.js +22 -1
- package/dist/input/controlGroups.d.ts +67 -0
- package/dist/input/controlGroups.js +41 -0
- package/dist/input/touchScheme.d.ts +82 -6
- package/dist/input/touchScheme.js +123 -10
- package/dist/interaction/contextMenu.d.ts +1 -0
- package/dist/interaction/contextMenu.js +1 -0
- package/dist/interaction/lockpick.d.ts +61 -0
- package/dist/interaction/lockpick.js +168 -0
- package/dist/interaction/proximityPrompt.d.ts +5 -1
- package/dist/interaction/proximityPrompt.js +5 -3
- package/dist/interaction/qte.d.ts +5 -0
- package/dist/interaction/qte.js +5 -0
- package/dist/interaction/skillCheck.d.ts +5 -0
- package/dist/interaction/skillCheck.js +5 -0
- package/dist/inventory/inventoryModel.d.ts +12 -0
- package/dist/inventory/inventoryModel.js +12 -0
- package/dist/inventory/shapedGrid.d.ts +16 -0
- package/dist/inventory/shapedGrid.js +16 -0
- package/dist/inventory/slotModel.d.ts +10 -0
- package/dist/inventory/slotModel.js +10 -0
- package/dist/item/durability.d.ts +5 -0
- package/dist/item/durability.js +5 -0
- package/dist/item/itemIdentity.d.ts +171 -0
- package/dist/item/itemIdentity.js +138 -0
- package/dist/item/itemInstanceRegistry.d.ts +32 -0
- package/dist/item/itemInstanceRegistry.js +34 -0
- package/dist/item/itemgen.d.ts +163 -0
- package/dist/item/itemgen.js +151 -0
- package/dist/item/modularItem.d.ts +5 -0
- package/dist/item/modularItem.js +5 -0
- package/dist/item/use.d.ts +5 -0
- package/dist/item/use.js +5 -0
- package/dist/item/useBehavior.d.ts +142 -0
- package/dist/item/useBehavior.js +105 -0
- package/dist/item/weapon.d.ts +5 -0
- package/dist/item/weapon.js +5 -0
- package/dist/math/scalar.d.ts +25 -0
- package/dist/math/scalar.js +47 -0
- package/dist/meta/changelog.d.ts +4 -1
- package/dist/meta/changelog.js +36 -1
- package/dist/movement/avoidance.d.ts +45 -0
- package/dist/movement/avoidance.js +123 -0
- package/dist/movement/cameraRig.d.ts +8 -0
- package/dist/movement/cameraRig.js +8 -0
- package/dist/movement/dash.d.ts +11 -0
- package/dist/movement/dash.js +11 -0
- package/dist/movement/formation.d.ts +135 -0
- package/dist/movement/formation.js +194 -0
- package/dist/movement/glideModel.d.ts +5 -0
- package/dist/movement/glideModel.js +5 -0
- package/dist/movement/grappleSwing.d.ts +5 -0
- package/dist/movement/grappleSwing.js +5 -0
- package/dist/movement/leaderTrail.d.ts +5 -0
- package/dist/movement/leaderTrail.js +5 -0
- package/dist/movement/movementModel.d.ts +38 -7
- package/dist/movement/movementModel.js +54 -13
- package/dist/movement/playerMovement.d.ts +41 -0
- package/dist/movement/playerMovement.js +236 -0
- package/dist/movement/poseState.d.ts +13 -0
- package/dist/movement/poseState.js +16 -0
- package/dist/movement/steering.d.ts +8 -0
- package/dist/movement/steering.js +18 -0
- package/dist/multiplayer/combatSnapshot.d.ts +3 -0
- package/dist/multiplayer/combatSnapshot.js +3 -0
- package/dist/multiplayer/lagCompensation.d.ts +5 -0
- package/dist/multiplayer/lagCompensation.js +5 -0
- package/dist/multiplayer/presenceModel.d.ts +9 -1
- package/dist/multiplayer/presenceModel.js +9 -1
- package/dist/multiplayer/simultaneousCommit.d.ts +3 -0
- package/dist/multiplayer/simultaneousCommit.js +3 -0
- package/dist/multiplayer.d.ts +11 -0
- package/dist/multiplayer.js +11 -0
- package/dist/nav/pathFollow.d.ts +57 -0
- package/dist/nav/pathFollow.js +109 -0
- package/dist/orders/orderKinds.d.ts +156 -0
- package/dist/orders/orderKinds.js +197 -0
- package/dist/orders/orderQueue.d.ts +208 -0
- package/dist/orders/orderQueue.js +211 -0
- package/dist/physics/drivableVehicle.d.ts +29 -0
- package/dist/physics/drivableVehicle.js +16 -0
- package/dist/physics/kinematicVehicle.d.ts +21 -1
- package/dist/physics/kinematicVehicle.js +23 -8
- package/dist/physics/physicsWorld.d.ts +24 -12
- package/dist/physics/physicsWorld.js +11 -5
- package/dist/physics/radialImpulse.d.ts +25 -0
- package/dist/physics/radialImpulse.js +27 -0
- package/dist/procedural.d.ts +3 -0
- package/dist/procedural.js +3 -0
- package/dist/progression/statGraph.d.ts +116 -0
- package/dist/progression/statGraph.js +318 -0
- package/dist/puzzle/cellGrid.d.ts +9 -0
- package/dist/puzzle/cellGrid.js +9 -0
- package/dist/puzzle/fallingPiece.d.ts +9 -0
- package/dist/puzzle/fallingPiece.js +9 -0
- package/dist/puzzle/nonogram.d.ts +39 -0
- package/dist/puzzle/nonogram.js +136 -0
- package/dist/random/nameGen.d.ts +5 -0
- package/dist/random/nameGen.js +5 -0
- package/dist/random/pick.d.ts +8 -0
- package/dist/random/pick.js +31 -0
- package/dist/random/rng.d.ts +24 -0
- package/dist/random/rng.js +30 -8
- package/dist/random/seedLink.d.ts +4 -0
- package/dist/random/seedLink.js +4 -0
- package/dist/relation/keyedValues.d.ts +54 -0
- package/dist/relation/keyedValues.js +115 -0
- package/dist/relation/thresholds.d.ts +62 -0
- package/dist/relation/thresholds.js +62 -0
- package/dist/render/color.d.ts +12 -0
- package/dist/render/color.js +26 -0
- package/dist/render/lookPreset.d.ts +41 -0
- package/dist/render/lookPreset.js +29 -0
- package/dist/render/postProcessing.d.ts +76 -0
- package/dist/render/postProcessing.js +21 -0
- package/dist/rules/predicate.d.ts +53 -0
- package/dist/rules/predicate.js +64 -0
- package/dist/rules/ruleEffects.d.ts +38 -0
- package/dist/rules/ruleEffects.js +37 -0
- package/dist/rules/triggeredRules.d.ts +160 -0
- package/dist/rules/triggeredRules.js +241 -0
- package/dist/runtime/adapter.d.ts +58 -0
- package/dist/runtime/adapter.js +54 -5
- package/dist/runtime/cameraDirector.d.ts +1 -0
- package/dist/runtime/cameraDirector.js +1 -0
- package/dist/runtime/commandRunner.d.ts +1 -0
- package/dist/runtime/commandRunner.js +1 -0
- package/dist/runtime/context/combatFx.d.ts +23 -0
- package/dist/runtime/context/combatFx.js +161 -0
- package/dist/runtime/context/registries.d.ts +13 -0
- package/dist/runtime/context/registries.js +84 -0
- package/dist/runtime/context/worldItems.d.ts +21 -0
- package/dist/runtime/context/worldItems.js +37 -0
- package/dist/runtime/descriptors/baseline.d.ts +48 -0
- package/dist/runtime/descriptors/baseline.js +134 -0
- package/dist/runtime/descriptors/features.d.ts +74 -0
- package/dist/runtime/descriptors/features.js +281 -0
- package/dist/runtime/gameContext.d.ts +163 -19
- package/dist/runtime/gameContext.js +385 -339
- package/dist/runtime/gameRuntime.d.ts +1 -0
- package/dist/runtime/gameRuntime.js +1 -0
- package/dist/runtime/headlessRunner.d.ts +60 -0
- package/dist/runtime/headlessRunner.js +44 -0
- package/dist/runtime/hostPersistence.d.ts +12 -0
- package/dist/runtime/hostPersistence.js +12 -0
- package/dist/runtime/hostedGameRunner.d.ts +54 -0
- package/dist/runtime/hostedGameRunner.js +85 -0
- package/dist/runtime/hostedWorldSession.d.ts +73 -0
- package/dist/runtime/hostedWorldSession.js +64 -0
- package/dist/runtime/inputSnapshot.d.ts +21 -3
- package/dist/runtime/inputSnapshot.js +8 -2
- package/dist/runtime/motionIntents.d.ts +12 -1
- package/dist/runtime/motionIntents.js +26 -1
- package/dist/runtime/perContext.d.ts +15 -0
- package/dist/runtime/perContext.js +21 -0
- package/dist/runtime/runtimeSave.d.ts +79 -0
- package/dist/runtime/runtimeSave.js +105 -0
- package/dist/runtime/save.d.ts +4 -0
- package/dist/runtime/save.js +4 -0
- package/dist/runtime/snapshot.d.ts +7 -0
- package/dist/runtime/snapshot.js +7 -0
- package/dist/runtime/visibility.d.ts +2 -1
- package/dist/runtime/visibility.js +2 -1
- package/dist/runtime/worldChannel.d.ts +62 -0
- package/dist/runtime/worldChannel.js +114 -0
- package/dist/runtime/worldMirror.d.ts +36 -0
- package/dist/runtime/worldMirror.js +44 -0
- package/dist/runtime/worldProjection.d.ts +47 -0
- package/dist/runtime/worldProjection.js +52 -0
- package/dist/runtime/worldReplication.d.ts +69 -0
- package/dist/runtime/worldReplication.js +217 -0
- package/dist/runtime/worldSnapshot.d.ts +44 -0
- package/dist/runtime/worldSnapshot.js +30 -0
- package/dist/scene/assetCatalog.d.ts +22 -0
- package/dist/scene/assetCatalog.js +4 -0
- package/dist/scene/assetDiagnostics.d.ts +69 -0
- package/dist/scene/assetDiagnostics.js +110 -0
- package/dist/scene/assetGenerator.d.ts +65 -0
- package/dist/scene/assetGenerator.js +64 -0
- package/dist/scene/assetSpace.d.ts +137 -0
- package/dist/scene/assetSpace.js +259 -0
- package/dist/scene/authoredTriggers.d.ts +169 -0
- package/dist/scene/authoredTriggers.js +340 -0
- package/dist/scene/behaviorRuntime.d.ts +75 -0
- package/dist/scene/behaviorRuntime.js +217 -0
- package/dist/scene/behaviors.d.ts +14 -2
- package/dist/scene/behaviors.js +7 -2
- package/dist/scene/bodyBind.d.ts +60 -0
- package/dist/scene/bodyBind.js +51 -0
- package/dist/scene/builtinSceneKinds.d.ts +5 -0
- package/dist/scene/builtinSceneKinds.js +62 -0
- package/dist/scene/colliders.d.ts +18 -0
- package/dist/scene/colliders.js +61 -1
- package/dist/scene/entityStats.d.ts +13 -0
- package/dist/scene/entityStats.js +30 -0
- package/dist/scene/entityStore.d.ts +41 -1
- package/dist/scene/entityStore.js +75 -0
- package/dist/scene/facing.d.ts +18 -0
- package/dist/scene/facing.js +26 -0
- package/dist/scene/modelSockets.d.ts +33 -0
- package/dist/scene/modelSockets.js +29 -0
- package/dist/scene/objectQuery.d.ts +2 -0
- package/dist/scene/objectQuery.js +2 -0
- package/dist/scene/objectStore.d.ts +4 -0
- package/dist/scene/objectStore.js +6 -0
- package/dist/scene/possession.d.ts +8 -0
- package/dist/scene/possession.js +14 -0
- package/dist/scene/roster.d.ts +3 -0
- package/dist/scene/roster.js +12 -0
- package/dist/scene/sceneKinds.d.ts +240 -0
- package/dist/scene/sceneKinds.js +214 -0
- package/dist/scene/sceneOwnership.d.ts +169 -0
- package/dist/scene/sceneOwnership.js +179 -0
- package/dist/scene/selectionBookmarks.d.ts +93 -0
- package/dist/scene/selectionBookmarks.js +122 -0
- package/dist/scene/vehicleSeat.d.ts +68 -0
- package/dist/scene/vehicleSeat.js +59 -0
- package/dist/sensor/concealment.d.ts +3 -0
- package/dist/sensor/concealment.js +3 -0
- package/dist/sensor/freezeMonitor.d.ts +1 -0
- package/dist/sensor/freezeMonitor.js +1 -0
- package/dist/sensor/frustumSensor.d.ts +7 -3
- package/dist/sensor/frustumSensor.js +7 -3
- package/dist/sensor/hiddenStateProbe.d.ts +5 -2
- package/dist/sensor/hiddenStateProbe.js +5 -2
- package/dist/sensor/recordingBuffer.d.ts +2 -1
- package/dist/sensor/recordingBuffer.js +2 -1
- package/dist/sensor/replayLoop.d.ts +6 -2
- package/dist/sensor/replayLoop.js +6 -2
- package/dist/sensor/revealQuery.d.ts +2 -1
- package/dist/sensor/revealQuery.js +2 -1
- package/dist/sensor/visionCone.d.ts +10 -3
- package/dist/sensor/visionCone.js +10 -3
- package/dist/session/contestedChannel.d.ts +1 -0
- package/dist/session/contestedChannel.js +1 -0
- package/dist/session/extraction.d.ts +1 -0
- package/dist/session/extraction.js +1 -0
- package/dist/session/roles.d.ts +6 -0
- package/dist/session/roles.js +6 -0
- package/dist/session/roundState.d.ts +8 -0
- package/dist/session/roundState.js +2 -0
- package/dist/settings/settingsModel.d.ts +1 -0
- package/dist/settings/settingsModel.js +1 -0
- package/dist/stats/accumulatorMeter.d.ts +6 -0
- package/dist/stats/accumulatorMeter.js +6 -0
- package/dist/stats/eventMeter.d.ts +5 -0
- package/dist/stats/eventMeter.js +5 -0
- package/dist/stats/rollCheck.d.ts +5 -0
- package/dist/stats/rollCheck.js +5 -0
- package/dist/stats/statModifiers.d.ts +5 -0
- package/dist/stats/statModifiers.js +5 -0
- package/dist/store/defineKeyedStore.d.ts +38 -0
- package/dist/store/defineKeyedStore.js +42 -0
- package/dist/store/defineStore.d.ts +33 -0
- package/dist/store/defineStore.js +35 -0
- package/dist/store/observableKeyedStore.d.ts +9 -0
- package/dist/store/observableKeyedStore.js +43 -2
- package/dist/survival/decayMeter.d.ts +55 -0
- package/dist/survival/decayMeter.js +130 -55
- package/dist/survival/moodle.d.ts +2 -0
- package/dist/survival/regionHealth.d.ts +6 -0
- package/dist/survival/regionHealth.js +5 -0
- package/dist/tactics/fallingGrid.d.ts +6 -4
- package/dist/tactics/fallingGrid.js +6 -4
- package/dist/tactics/predictiveQuery.d.ts +3 -0
- package/dist/tactics/predictiveQuery.js +3 -0
- package/dist/tactics/snapshot.d.ts +2 -0
- package/dist/tactics/snapshot.js +2 -0
- package/dist/tactics/surface.d.ts +1 -0
- package/dist/tactics/surface.js +1 -0
- package/dist/tactics/tacticalGrid.d.ts +1 -0
- package/dist/tactics/tacticalGrid.js +1 -0
- package/dist/time/beatClock.d.ts +14 -4
- package/dist/time/beatClock.js +14 -4
- package/dist/time/calendarClock.d.ts +3 -0
- package/dist/time/calendarClock.js +3 -0
- package/dist/time/idleProgress.d.ts +4 -0
- package/dist/time/idleProgress.js +4 -0
- package/dist/time/simClock.d.ts +2 -0
- package/dist/time/simClock.js +20 -5
- package/dist/ui/actionModel.d.ts +110 -0
- package/dist/ui/actionModel.js +159 -0
- package/dist/ui/gameLayout.d.ts +144 -0
- package/dist/ui/gameLayout.js +148 -0
- package/dist/ui/hudDocument.d.ts +114 -0
- package/dist/ui/hudDocument.js +220 -0
- package/dist/ui/hudLayout.d.ts +33 -1
- package/dist/ui/hudLayout.js +204 -17
- package/dist/ui/orientation.d.ts +39 -0
- package/dist/ui/orientation.js +49 -0
- package/dist/ui/selectionModel.d.ts +92 -0
- package/dist/ui/selectionModel.js +88 -0
- package/dist/ui/swingTimer.d.ts +42 -0
- package/dist/ui/swingTimer.js +38 -0
- package/dist/ui/tooltipModel.d.ts +63 -0
- package/dist/ui/tooltipModel.js +82 -0
- package/dist/ui.d.ts +15 -0
- package/dist/ui.js +15 -0
- package/dist/visibility/bounds.d.ts +8 -1
- package/dist/visibility/bounds.js +8 -1
- package/dist/visibility/frustum.d.ts +12 -3
- package/dist/visibility/frustum.js +12 -3
- package/dist/visibility/spatialIndex.js +34 -20
- package/dist/work/jobQueue.d.ts +201 -0
- package/dist/work/jobQueue.js +253 -0
- package/dist/work/unitTraining.d.ts +58 -0
- package/dist/work/unitTraining.js +52 -0
- package/dist/world/authoredObjects.d.ts +58 -0
- package/dist/world/authoredObjects.js +69 -0
- package/dist/world/buildingGenerator.d.ts +18 -0
- package/dist/world/buildingGenerator.js +62 -0
- package/dist/world/buildings.d.ts +5 -0
- package/dist/world/buildings.js +5 -0
- package/dist/world/catenary.d.ts +22 -0
- package/dist/world/catenary.js +69 -0
- package/dist/world/environmentSummary.d.ts +11 -2
- package/dist/world/environmentSummary.js +11 -1
- package/dist/world/features.d.ts +244 -7
- package/dist/world/features.js +92 -4
- package/dist/world/footprintGrid.d.ts +59 -0
- package/dist/world/footprintGrid.js +141 -0
- package/dist/world/geometry.d.ts +64 -0
- package/dist/world/geometry.js +94 -0
- package/dist/world/grassKind.d.ts +51 -0
- package/dist/world/grassKind.js +101 -0
- package/dist/world/pathInstances.d.ts +27 -0
- package/dist/world/pathInstances.js +27 -0
- package/dist/world/pathTerrain.d.ts +80 -0
- package/dist/world/pathTerrain.js +142 -0
- package/dist/world/placeAsset.d.ts +81 -0
- package/dist/world/placeAsset.js +77 -0
- package/dist/world/placement.d.ts +4 -0
- package/dist/world/placement.js +4 -0
- package/dist/world/placementController.d.ts +6 -0
- package/dist/world/placementController.js +6 -0
- package/dist/world/polyline.d.ts +34 -0
- package/dist/world/polyline.js +81 -0
- package/dist/world/roads.d.ts +55 -0
- package/dist/world/roads.js +184 -0
- package/dist/world/scatterRegion.d.ts +164 -0
- package/dist/world/scatterRegion.js +409 -0
- package/dist/world/sceneShapes.d.ts +43 -0
- package/dist/world/sceneShapes.js +1 -0
- package/dist/world/segment.d.ts +27 -0
- package/dist/world/segment.js +43 -0
- package/dist/world/soilKind.d.ts +48 -0
- package/dist/world/soilKind.js +92 -0
- package/dist/world/spatialSample.d.ts +241 -0
- package/dist/world/spatialSample.js +465 -0
- package/dist/world/streets.d.ts +80 -0
- package/dist/world/streets.js +144 -0
- package/dist/world/terraform.d.ts +213 -1
- package/dist/world/terraform.js +655 -20
- package/dist/world/terrain.d.ts +138 -12
- package/dist/world/terrain.js +346 -28
- package/dist/world/terrainGuides.d.ts +182 -0
- package/dist/world/terrainGuides.js +343 -0
- package/dist/world/vec2.d.ts +81 -0
- package/dist/world/vec2.js +128 -0
- package/dist/world/vec3.d.ts +49 -0
- package/dist/world/vec3.js +76 -0
- package/dist/world/vegetation.d.ts +71 -0
- package/dist/world/vegetation.js +151 -0
- package/dist/world/visibilityField.d.ts +154 -0
- package/dist/world/visibilityField.js +271 -0
- package/dist/world/volumetricClouds.d.ts +52 -0
- package/dist/world/volumetricClouds.js +43 -0
- package/dist/world/walls.d.ts +9 -0
- package/dist/world/walls.js +9 -0
- package/dist/world/waterKind.d.ts +55 -0
- package/dist/world/waterKind.js +99 -0
- package/dist/world.d.ts +132 -0
- package/dist/world.js +132 -0
- package/package.json +32 -8
- package/skills/jgengine/SKILL.md +51 -0
- package/skills/jgengine/api.md +434 -0
- package/skills/jgengine/capabilities.md +29 -0
- package/skills/jgengine/reference-cartridge.md +72 -0
- package/skills/jgengine-combat/SKILL.md +34 -0
- package/skills/jgengine-combat/api.md +549 -0
- package/skills/jgengine-combat/capabilities.md +169 -0
- package/skills/jgengine-combat/reference.md +98 -0
- package/skills/jgengine-gameplay/SKILL.md +39 -0
- package/skills/jgengine-gameplay/api.md +1794 -0
- package/skills/jgengine-gameplay/capabilities.md +378 -0
- package/skills/jgengine-gameplay/reference-systems.md +60 -0
- package/skills/jgengine-world/SKILL.md +38 -0
- package/skills/jgengine-world/api.md +2652 -0
- package/skills/jgengine-world/capabilities.md +370 -0
- package/skills/jgengine-world/reference.md +222 -0
- package/dist/cartridge/runtime.d.ts +0 -15
- package/dist/cartridge/runtime.js +0 -556
- package/dist/cartridge/spec.d.ts +0 -188
- package/dist/cartridge/spec.js +0 -19
- package/dist/cartridge/validate.d.ts +0 -2
- package/dist/cartridge/validate.js +0 -78
- package/dist/store/engineStore.d.ts +0 -22
- package/dist/store/engineStore.js +0 -50
- package/dist/store/features.d.ts +0 -10
- package/dist/store/features.js +0 -23
- package/llms.txt +0 -4983
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import { applyHorizontalImpulses, applyMotionImpulses } from "../runtime/motionIntents.js";
|
|
2
|
+
import { groundFieldFor, hasEnvironmentTerrain, sampleSlope } from "../world/terrain.js";
|
|
3
|
+
import { advancePlayerMotion, constrainStepToAxis, createEmptyMovementKeys, createPlayerMotionState, nearbyObstacles, resolveMovementIntent, resolveObstacleStep, snapPositionToGrid, } from "./movementModel.js";
|
|
4
|
+
import { approachYaw, steerYaw } from "./steering.js";
|
|
5
|
+
import { advanceVoxelPlayer, createVoxelPlayerBody, } from "./voxelController.js";
|
|
6
|
+
const DEFAULT_TURN_SPEED = 2.4;
|
|
7
|
+
const DEFAULT_WALK_SPEED = 2;
|
|
8
|
+
const DEFAULT_SWIM_SPEED_MULTIPLIER = 0.65;
|
|
9
|
+
/** Minimum ground-normal `y` the player can stand on before slope-slide kicks in — cos(50°) ≈ 0.643. */
|
|
10
|
+
const DEFAULT_MAX_CLIMB_NORMAL_Y = Math.cos((50 * Math.PI) / 180);
|
|
11
|
+
/** Downhill slide speed (units/s) per unit of slope steepness while on too-steep ground. */
|
|
12
|
+
const SLOPE_SLIDE_SPEED = 4;
|
|
13
|
+
/**
|
|
14
|
+
* Maps a game's declared `physics` onto the movement controllers' tuning. `PhysicsConfig.gravity` is a signed
|
|
15
|
+
* world acceleration (negative points down), but the controllers integrate `velocityY -= gravityAcceleration * dt`
|
|
16
|
+
* and expect a positive downward magnitude — so gravity is negated here to keep down-pointing gravity pulling down.
|
|
17
|
+
*/
|
|
18
|
+
export function resolvePhysicsTuning(physics) {
|
|
19
|
+
if (physics === undefined)
|
|
20
|
+
return undefined;
|
|
21
|
+
return {
|
|
22
|
+
get gravityAcceleration() {
|
|
23
|
+
return physics.gravity === undefined ? undefined : -physics.gravity;
|
|
24
|
+
},
|
|
25
|
+
get jumpVelocity() {
|
|
26
|
+
return physics.jumpVelocity;
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
/** Gather a game's collision/movement/physics/world config into a {@link PlayerMovementTuning} — call once per world; both the shell and a host pass the result to {@link stepPlayerMovement}. */
|
|
31
|
+
export function resolvePlayerMovementTuning(opts) {
|
|
32
|
+
const physics = resolvePhysicsTuning(opts.physics);
|
|
33
|
+
const backpedal = opts.movement?.backpedalMult;
|
|
34
|
+
const overrides = backpedal === undefined ? physics : { ...(physics ?? {}), backpedalSpeedMultiplier: backpedal };
|
|
35
|
+
return {
|
|
36
|
+
...(opts.collision === undefined ? {} : { collision: opts.collision }),
|
|
37
|
+
...(opts.movement === undefined ? {} : { movement: opts.movement }),
|
|
38
|
+
...(overrides === undefined ? {} : { physics: overrides }),
|
|
39
|
+
ground: groundFieldFor(opts.world),
|
|
40
|
+
hasTerrain: hasEnvironmentTerrain(opts.world),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
const stores = new WeakMap();
|
|
44
|
+
function storeFor(ctx) {
|
|
45
|
+
let store = stores.get(ctx);
|
|
46
|
+
if (store === undefined) {
|
|
47
|
+
store = { players: new Map(), solids: { count: -1, set: new Set() } };
|
|
48
|
+
stores.set(ctx, store);
|
|
49
|
+
}
|
|
50
|
+
return store;
|
|
51
|
+
}
|
|
52
|
+
function stateFor(store, userId) {
|
|
53
|
+
let state = store.players.get(userId);
|
|
54
|
+
if (state === undefined) {
|
|
55
|
+
state = { heading: 0, facing: null, voxelBody: null, motion: null };
|
|
56
|
+
store.players.set(userId, state);
|
|
57
|
+
}
|
|
58
|
+
return state;
|
|
59
|
+
}
|
|
60
|
+
/** One player's current heading (radians), integrated by {@link stepPlayerMovement} — the shell reads it back into its camera/aim yaw. */
|
|
61
|
+
export function playerMovementHeading(ctx, userId) {
|
|
62
|
+
return stores.get(ctx)?.players.get(userId)?.heading ?? 0;
|
|
63
|
+
}
|
|
64
|
+
/** Drop a player's retained movement state (heading + kinematic body) — call on leave so a rejoin starts fresh instead of resuming stale velocity. */
|
|
65
|
+
export function forgetPlayerMovement(ctx, userId) {
|
|
66
|
+
stores.get(ctx)?.players.delete(userId);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Rendered body yaw to commit this frame. With `turnSpeed` unset the body snaps
|
|
70
|
+
* to its movement heading exactly as before (no opt-in, no behavior change); with
|
|
71
|
+
* `turnSpeed` set it rotates toward that heading at `turnSpeed` rad/s along the
|
|
72
|
+
* shortest arc, so strafing and backpedalling read as a turning body rather than
|
|
73
|
+
* an instant flip. Retained per player so the smoothing is continuous across frames.
|
|
74
|
+
*/
|
|
75
|
+
function resolveBodyFacing(state, moving, velocityX, velocityZ, fallbackYaw, turnSpeed, dt) {
|
|
76
|
+
if (turnSpeed === undefined) {
|
|
77
|
+
const snapped = moving ? Math.atan2(velocityX, velocityZ) : fallbackYaw;
|
|
78
|
+
state.facing = snapped;
|
|
79
|
+
return snapped;
|
|
80
|
+
}
|
|
81
|
+
const from = state.facing ?? fallbackYaw;
|
|
82
|
+
const target = moving ? Math.atan2(velocityX, velocityZ) : from;
|
|
83
|
+
const next = approachYaw(from, target, turnSpeed, dt);
|
|
84
|
+
state.facing = next;
|
|
85
|
+
return next;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Integrate one player's movement for a tick from their held-input frame and commit the pose — the single
|
|
89
|
+
* genre-agnostic controller both the shell (its local player) and a host (each connected player in `onTick`) call,
|
|
90
|
+
* so single-player and server-authoritative movement are identical. Reads the player's controlled entity, terrain,
|
|
91
|
+
* scene solids, and pending motion impulses; writes the entity pose via `setPose`. Retains heading + kinematic body
|
|
92
|
+
* per `userId` on the `ctx`. Pass `heading` to override the internally-integrated yaw (the shell owns yaw for its
|
|
93
|
+
* camera); omit it and the controller turns from the frame's `turnLeft`/`turnRight` actions.
|
|
94
|
+
*/
|
|
95
|
+
export function stepPlayerMovement(ctx, userId, input, dt, tuning, heading) {
|
|
96
|
+
const playerId = ctx.player.possession.active(userId);
|
|
97
|
+
const player = ctx.scene.entity.get(playerId);
|
|
98
|
+
if (player === null)
|
|
99
|
+
return;
|
|
100
|
+
const store = storeFor(ctx);
|
|
101
|
+
const state = stateFor(store, userId);
|
|
102
|
+
const held = new Set(input.held);
|
|
103
|
+
const isDown = (action) => held.has(action);
|
|
104
|
+
if (heading !== undefined) {
|
|
105
|
+
state.heading = heading;
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
const turnInput = (isDown("turnRight") ? 1 : 0) - (isDown("turnLeft") ? 1 : 0);
|
|
109
|
+
const turnSpeed = tuning.movement?.turnSpeed ?? DEFAULT_TURN_SPEED;
|
|
110
|
+
if (turnInput !== 0)
|
|
111
|
+
state.heading = steerYaw(state.heading, turnInput, turnSpeed, dt);
|
|
112
|
+
}
|
|
113
|
+
const forwardX = Math.sin(state.heading);
|
|
114
|
+
const forwardZ = Math.cos(state.heading);
|
|
115
|
+
const keys = createEmptyMovementKeys();
|
|
116
|
+
keys.w = isDown("moveForward");
|
|
117
|
+
keys.s = isDown("moveBack");
|
|
118
|
+
keys.a = isDown("moveLeft");
|
|
119
|
+
keys.d = isDown("moveRight");
|
|
120
|
+
keys.shift = isDown("sprint") && (tuning.movement?.canSprint?.(ctx) ?? true);
|
|
121
|
+
keys.space = isDown("jump");
|
|
122
|
+
const intent = resolveMovementIntent(keys, true);
|
|
123
|
+
const motionBatch = ctx.player.motionFor(userId).takePending();
|
|
124
|
+
const walkSpeed = player.movement?.walkSpeed ?? DEFAULT_WALK_SPEED;
|
|
125
|
+
if (tuning.collision?.voxel === true) {
|
|
126
|
+
let body = state.voxelBody;
|
|
127
|
+
if (body === null) {
|
|
128
|
+
body = createVoxelPlayerBody(player.position[0], player.position[1], player.position[2]);
|
|
129
|
+
state.voxelBody = body;
|
|
130
|
+
}
|
|
131
|
+
const objects = ctx.scene.object.list();
|
|
132
|
+
if (store.solids.count !== objects.length) {
|
|
133
|
+
store.solids.set = new Set(objects.map((o) => `${o.position[0]},${o.position[1]},${o.position[2]}`));
|
|
134
|
+
store.solids.count = objects.length;
|
|
135
|
+
}
|
|
136
|
+
const solids = store.solids.set;
|
|
137
|
+
const isSolid = (x, y, z) => solids.has(`${x},${y},${z}`);
|
|
138
|
+
const dims = {
|
|
139
|
+
halfWidth: tuning.collision.halfWidth ?? 0.3,
|
|
140
|
+
height: tuning.collision.height ?? 1.8,
|
|
141
|
+
stepHeight: tuning.collision.stepHeight ?? 0.6,
|
|
142
|
+
};
|
|
143
|
+
body.velocityY = applyMotionImpulses(body.velocityY, motionBatch);
|
|
144
|
+
[body.velocityX, body.velocityZ] = applyHorizontalImpulses(body.velocityX, body.velocityZ, motionBatch);
|
|
145
|
+
advanceVoxelPlayer(body, intent, forwardX, forwardZ, walkSpeed, dt, isSolid, dims, tuning.physics, tuning.hasTerrain ? (x, z) => tuning.ground.sampleHeight(x, z) : undefined);
|
|
146
|
+
if (motionBatch !== null && motionBatch.y !== null)
|
|
147
|
+
body.y = motionBatch.y;
|
|
148
|
+
ctx.scene.entity.setPose(playerId, {
|
|
149
|
+
position: [body.x, body.y, body.z],
|
|
150
|
+
rotationY: resolveBodyFacing(state, intent.moving, body.velocityX, body.velocityZ, player.rotationY, tuning.movement?.turnSpeed, dt),
|
|
151
|
+
dt,
|
|
152
|
+
});
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
let motion = state.motion;
|
|
156
|
+
if (motion === null) {
|
|
157
|
+
motion = createPlayerMotionState();
|
|
158
|
+
state.motion = motion;
|
|
159
|
+
}
|
|
160
|
+
motion.verticalVelocity = applyMotionImpulses(motion.verticalVelocity, motionBatch);
|
|
161
|
+
[motion.horizontalVelocityX, motion.horizontalVelocityZ] = applyHorizontalImpulses(motion.horizontalVelocityX, motion.horizontalVelocityZ, motionBatch);
|
|
162
|
+
const swimCfg = tuning.movement?.swim;
|
|
163
|
+
const swimEnabled = swimCfg === true || (typeof swimCfg === "object" && swimCfg !== null);
|
|
164
|
+
const swimSpeedMultiplier = typeof swimCfg === "object" && swimCfg !== null
|
|
165
|
+
? swimCfg.speedMultiplier ?? DEFAULT_SWIM_SPEED_MULTIPLIER
|
|
166
|
+
: DEFAULT_SWIM_SPEED_MULTIPLIER;
|
|
167
|
+
const waterLevel = tuning.ground.waterLevel;
|
|
168
|
+
const submerged = swimEnabled &&
|
|
169
|
+
waterLevel !== undefined &&
|
|
170
|
+
tuning.ground.sampleHeight(player.position[0], player.position[2]) < waterLevel;
|
|
171
|
+
const motionOptions = submerged
|
|
172
|
+
? { speedScale: swimSpeedMultiplier, floating: true }
|
|
173
|
+
: undefined;
|
|
174
|
+
const step = advancePlayerMotion(motion, intent, forwardX, forwardZ, walkSpeed, dt, tuning.physics, motionOptions);
|
|
175
|
+
let stepX = step.stepX;
|
|
176
|
+
let stepZ = step.stepZ;
|
|
177
|
+
if (tuning.movement?.mode === "axis") {
|
|
178
|
+
const constrained = constrainStepToAxis(stepX, stepZ, tuning.movement.axis ?? "x");
|
|
179
|
+
stepX = constrained.stepX;
|
|
180
|
+
stepZ = constrained.stepZ;
|
|
181
|
+
}
|
|
182
|
+
if (tuning.movement?.collideObjects === true) {
|
|
183
|
+
const obstacles = nearbyObstacles(ctx.scene.object.list(), player.position);
|
|
184
|
+
const resolved = resolveObstacleStep(player.position, stepX, stepZ, obstacles);
|
|
185
|
+
stepX = resolved.stepX;
|
|
186
|
+
stepZ = resolved.stepZ;
|
|
187
|
+
}
|
|
188
|
+
let nextX = player.position[0] + stepX;
|
|
189
|
+
let nextZ = player.position[2] + stepZ;
|
|
190
|
+
if (tuning.movement?.mode === "grid") {
|
|
191
|
+
const snapped = snapPositionToGrid(nextX, nextZ, tuning.movement.cellSize ?? 1);
|
|
192
|
+
nextX = snapped[0];
|
|
193
|
+
nextZ = snapped[1];
|
|
194
|
+
}
|
|
195
|
+
const slideCfg = tuning.movement?.slopeSlide;
|
|
196
|
+
if (slideCfg === true || (typeof slideCfg === "object" && slideCfg !== null)) {
|
|
197
|
+
const maxClimbNormalY = typeof slideCfg === "object" && slideCfg.maxClimbSlope !== undefined
|
|
198
|
+
? slideCfg.maxClimbSlope
|
|
199
|
+
: DEFAULT_MAX_CLIMB_NORMAL_Y;
|
|
200
|
+
if (tuning.ground.sampleNormal(nextX, nextZ)[1] < maxClimbNormalY) {
|
|
201
|
+
const slope = sampleSlope(tuning.ground, nextX, nextZ);
|
|
202
|
+
const slide = SLOPE_SLIDE_SPEED * slope.steepness * dt;
|
|
203
|
+
nextX += slope.downhill[0] * slide;
|
|
204
|
+
nextZ += slope.downhill[1] * slide;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
const groundAtNext = tuning.ground.sampleHeight(nextX, nextZ);
|
|
208
|
+
let nextY = groundAtNext + motion.jumpOffset;
|
|
209
|
+
if (motionBatch !== null && motionBatch.y !== null) {
|
|
210
|
+
nextY = motionBatch.y;
|
|
211
|
+
motion.jumpOffset = motionBatch.y - groundAtNext;
|
|
212
|
+
}
|
|
213
|
+
else if (swimEnabled && waterLevel !== undefined && groundAtNext < waterLevel) {
|
|
214
|
+
nextY = waterLevel;
|
|
215
|
+
}
|
|
216
|
+
if (tuning.movement?.beforeCommit !== undefined) {
|
|
217
|
+
const frame = {
|
|
218
|
+
entityId: playerId,
|
|
219
|
+
current: player.position,
|
|
220
|
+
next: [nextX, nextY, nextZ],
|
|
221
|
+
dt,
|
|
222
|
+
ctx,
|
|
223
|
+
};
|
|
224
|
+
const replacement = tuning.movement.beforeCommit(frame);
|
|
225
|
+
if (replacement !== undefined) {
|
|
226
|
+
nextX = replacement[0];
|
|
227
|
+
nextY = replacement[1];
|
|
228
|
+
nextZ = replacement[2];
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
ctx.scene.entity.setPose(playerId, {
|
|
232
|
+
position: [nextX, nextY, nextZ],
|
|
233
|
+
rotationY: resolveBodyFacing(state, intent.moving, motion.horizontalVelocityX, motion.horizontalVelocityZ, player.rotationY, tuning.movement?.turnSpeed, dt),
|
|
234
|
+
dt,
|
|
235
|
+
});
|
|
236
|
+
}
|
|
@@ -13,11 +13,24 @@ export interface PoseAllowedStates {
|
|
|
13
13
|
export interface PoseRejection {
|
|
14
14
|
reason: string;
|
|
15
15
|
}
|
|
16
|
+
export interface PoseSnapshot {
|
|
17
|
+
poses: Record<string, MovementPose>;
|
|
18
|
+
aims: Record<string, AimMode>;
|
|
19
|
+
}
|
|
16
20
|
export interface PoseState {
|
|
17
21
|
getPose(instanceId: string): MovementPose;
|
|
18
22
|
setPose(instanceId: string, pose: MovementPose): PoseRejection | null;
|
|
19
23
|
getAim(instanceId: string): AimMode;
|
|
20
24
|
setAim(instanceId: string, mode: AimMode): PoseRejection | null;
|
|
21
25
|
clear(instanceId: string): void;
|
|
26
|
+
/** Snapshot every entity's pose and aim for a whole-world save. */
|
|
27
|
+
snapshotAll(): PoseSnapshot;
|
|
28
|
+
/** Restore every entity's pose and aim from a {@link snapshotAll} payload. */
|
|
29
|
+
hydrateAll(state: PoseSnapshot): void;
|
|
22
30
|
}
|
|
31
|
+
/**
|
|
32
|
+
* Stance/pose transitions — stand, crouch, prone — that change the hitbox and movement.
|
|
33
|
+
*
|
|
34
|
+
* @capability crouch-prone stance/pose transitions that change the hitbox
|
|
35
|
+
*/
|
|
23
36
|
export declare function createPoseState(resolveAllowed: (instanceId: string) => PoseAllowedStates | null | undefined): PoseState;
|
|
@@ -23,6 +23,11 @@ export const POSE_HITBOX = {
|
|
|
23
23
|
speedMultiplier: MOVEMENT_TUNING.runSpeedMultiplier,
|
|
24
24
|
},
|
|
25
25
|
};
|
|
26
|
+
/**
|
|
27
|
+
* Stance/pose transitions — stand, crouch, prone — that change the hitbox and movement.
|
|
28
|
+
*
|
|
29
|
+
* @capability crouch-prone stance/pose transitions that change the hitbox
|
|
30
|
+
*/
|
|
26
31
|
export function createPoseState(resolveAllowed) {
|
|
27
32
|
const poses = new Map();
|
|
28
33
|
const aims = new Map();
|
|
@@ -57,5 +62,16 @@ export function createPoseState(resolveAllowed) {
|
|
|
57
62
|
poses.delete(instanceId);
|
|
58
63
|
aims.delete(instanceId);
|
|
59
64
|
},
|
|
65
|
+
snapshotAll() {
|
|
66
|
+
return { poses: Object.fromEntries(poses), aims: Object.fromEntries(aims) };
|
|
67
|
+
},
|
|
68
|
+
hydrateAll(state) {
|
|
69
|
+
poses.clear();
|
|
70
|
+
for (const [id, pose] of Object.entries(state.poses))
|
|
71
|
+
poses.set(id, pose);
|
|
72
|
+
aims.clear();
|
|
73
|
+
for (const [id, aim] of Object.entries(state.aims))
|
|
74
|
+
aims.set(id, aim);
|
|
75
|
+
},
|
|
60
76
|
};
|
|
61
77
|
}
|
|
@@ -25,3 +25,11 @@ export declare function steerYaw(yaw: number, steerRight: number, turnRatePerSec
|
|
|
25
25
|
* it into [-1, 1] at the call site.
|
|
26
26
|
*/
|
|
27
27
|
export declare function steerToward(yaw: number, desiredYaw: number): number;
|
|
28
|
+
/**
|
|
29
|
+
* @internal Rotate `yaw` toward `targetYaw` by at most `turnRatePerSecond * dt`
|
|
30
|
+
* radians, always along the shortest arc, snapping exactly onto the target once
|
|
31
|
+
* within a single step so it converges without overshoot or jitter — the
|
|
32
|
+
* smoothing behind a rendered body-turn (`PlayerMovementConfig.turnSpeed`). A
|
|
33
|
+
* large enough rate (or `dt`) reaches the target in one call, matching a snap.
|
|
34
|
+
*/
|
|
35
|
+
export declare function approachYaw(yaw: number, targetYaw: number, turnRatePerSecond: number, dt: number): number;
|
|
@@ -37,4 +37,22 @@ export function steerToward(yaw, desiredYaw) {
|
|
|
37
37
|
delta += TWO_PI;
|
|
38
38
|
return -delta;
|
|
39
39
|
}
|
|
40
|
+
/**
|
|
41
|
+
* @internal Rotate `yaw` toward `targetYaw` by at most `turnRatePerSecond * dt`
|
|
42
|
+
* radians, always along the shortest arc, snapping exactly onto the target once
|
|
43
|
+
* within a single step so it converges without overshoot or jitter — the
|
|
44
|
+
* smoothing behind a rendered body-turn (`PlayerMovementConfig.turnSpeed`). A
|
|
45
|
+
* large enough rate (or `dt`) reaches the target in one call, matching a snap.
|
|
46
|
+
*/
|
|
47
|
+
export function approachYaw(yaw, targetYaw, turnRatePerSecond, dt) {
|
|
48
|
+
let delta = (targetYaw - yaw) % TWO_PI;
|
|
49
|
+
if (delta > Math.PI)
|
|
50
|
+
delta -= TWO_PI;
|
|
51
|
+
if (delta <= -Math.PI)
|
|
52
|
+
delta += TWO_PI;
|
|
53
|
+
const maxStep = turnRatePerSecond * dt;
|
|
54
|
+
if (maxStep <= 0 || Math.abs(delta) <= maxStep)
|
|
55
|
+
return targetYaw;
|
|
56
|
+
return yaw + Math.sign(delta) * maxStep;
|
|
57
|
+
}
|
|
40
58
|
const TWO_PI = Math.PI * 2;
|
|
@@ -16,7 +16,9 @@ export interface SerializeBoardArgs {
|
|
|
16
16
|
seed?: number;
|
|
17
17
|
capturedAt?: number;
|
|
18
18
|
}
|
|
19
|
+
/** @internal */
|
|
19
20
|
export declare function serializeBoard(args: SerializeBoardArgs): BoardSnapshot;
|
|
21
|
+
/** @internal */
|
|
20
22
|
export declare function cloneSnapshot(snapshot: BoardSnapshot): BoardSnapshot;
|
|
21
23
|
export interface CombatRules {
|
|
22
24
|
attackStat: string;
|
|
@@ -42,4 +44,5 @@ export interface ReplayResult {
|
|
|
42
44
|
survivorsA: readonly string[];
|
|
43
45
|
survivorsB: readonly string[];
|
|
44
46
|
}
|
|
47
|
+
/** @internal */
|
|
45
48
|
export declare function replayCombat(a: BoardSnapshot, b: BoardSnapshot, rules: CombatRules): ReplayResult;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
function cloneStats(stats) {
|
|
2
2
|
return { ...stats };
|
|
3
3
|
}
|
|
4
|
+
/** @internal */
|
|
4
5
|
export function serializeBoard(args) {
|
|
5
6
|
return {
|
|
6
7
|
ownerId: args.ownerId,
|
|
@@ -10,6 +11,7 @@ export function serializeBoard(args) {
|
|
|
10
11
|
capturedAt: args.capturedAt ?? 0,
|
|
11
12
|
};
|
|
12
13
|
}
|
|
14
|
+
/** @internal */
|
|
13
15
|
export function cloneSnapshot(snapshot) {
|
|
14
16
|
return serializeBoard({
|
|
15
17
|
ownerId: snapshot.ownerId,
|
|
@@ -36,6 +38,7 @@ function toLive(snapshot, rules) {
|
|
|
36
38
|
health: unit.stats[rules.healthStat] ?? 0,
|
|
37
39
|
}));
|
|
38
40
|
}
|
|
41
|
+
/** @internal */
|
|
39
42
|
export function replayCombat(a, b, rules) {
|
|
40
43
|
const maxRounds = rules.maxRounds ?? 100;
|
|
41
44
|
const critChance = rules.critChance ?? 0;
|
|
@@ -10,6 +10,7 @@ export interface PositionHistoryConfig {
|
|
|
10
10
|
historyMs: number;
|
|
11
11
|
maxSamples?: number;
|
|
12
12
|
}
|
|
13
|
+
/** @internal */
|
|
13
14
|
export declare class PositionHistory {
|
|
14
15
|
private readonly historyMs;
|
|
15
16
|
private readonly maxSamples;
|
|
@@ -23,7 +24,9 @@ export declare class PositionHistory {
|
|
|
23
24
|
prune(now: number): void;
|
|
24
25
|
forget(entityId: string): void;
|
|
25
26
|
}
|
|
27
|
+
/** @internal */
|
|
26
28
|
export declare function createPositionHistory(config: PositionHistoryConfig): PositionHistory;
|
|
29
|
+
/** @internal */
|
|
27
30
|
export declare function rewindTimestamp(nowMs: number, rttMs: number, interpDelayMs: number): number;
|
|
28
31
|
export interface HitscanRay {
|
|
29
32
|
origin: Vec3;
|
|
@@ -39,5 +42,7 @@ export interface HitscanHit {
|
|
|
39
42
|
distance: number;
|
|
40
43
|
point: Vec3;
|
|
41
44
|
}
|
|
45
|
+
/** @internal */
|
|
42
46
|
export declare function raySphereDistance(ray: HitscanRay, center: Vec3, radius: number): number | null;
|
|
47
|
+
/** @internal */
|
|
43
48
|
export declare function resolveHitscan(history: PositionHistory, targets: readonly HitscanTarget[], ray: HitscanRay, atMs: number): HitscanHit | null;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
const DEFAULT_MAX_SAMPLES = 256;
|
|
2
|
+
/** @internal */
|
|
2
3
|
export class PositionHistory {
|
|
3
4
|
historyMs;
|
|
4
5
|
maxSamples;
|
|
@@ -90,9 +91,11 @@ export class PositionHistory {
|
|
|
90
91
|
this.tracks.delete(entityId);
|
|
91
92
|
}
|
|
92
93
|
}
|
|
94
|
+
/** @internal */
|
|
93
95
|
export function createPositionHistory(config) {
|
|
94
96
|
return new PositionHistory(config);
|
|
95
97
|
}
|
|
98
|
+
/** @internal */
|
|
96
99
|
export function rewindTimestamp(nowMs, rttMs, interpDelayMs) {
|
|
97
100
|
return nowMs - rttMs / 2 - interpDelayMs;
|
|
98
101
|
}
|
|
@@ -102,6 +105,7 @@ function normalize(v) {
|
|
|
102
105
|
return null;
|
|
103
106
|
return { x: v.x / len, y: v.y / len, z: v.z / len };
|
|
104
107
|
}
|
|
108
|
+
/** @internal */
|
|
105
109
|
export function raySphereDistance(ray, center, radius) {
|
|
106
110
|
const dir = normalize(ray.direction);
|
|
107
111
|
if (dir === null)
|
|
@@ -126,6 +130,7 @@ export function raySphereDistance(ray, center, radius) {
|
|
|
126
130
|
return null;
|
|
127
131
|
return t;
|
|
128
132
|
}
|
|
133
|
+
/** @internal */
|
|
129
134
|
export function resolveHitscan(history, targets, ray, atMs) {
|
|
130
135
|
const dir = normalize(ray.direction);
|
|
131
136
|
if (dir === null)
|
|
@@ -51,25 +51,33 @@ export declare const DEFAULT_SPAWN_ORIGIN: {
|
|
|
51
51
|
readonly y: 0;
|
|
52
52
|
readonly z: 0;
|
|
53
53
|
};
|
|
54
|
+
/** @internal */
|
|
54
55
|
export declare function spawnPresenceState(origin: {
|
|
55
56
|
x: number;
|
|
56
57
|
y: number;
|
|
57
58
|
z: number;
|
|
58
59
|
} | undefined, nowMs: number, rules: Pick<PoseSyncRules, "maxElapsedSec">): PresencePoseState;
|
|
60
|
+
/** @internal */
|
|
59
61
|
export declare function decidePoseSync(current: PresencePoseState, incoming: IncomingPose, rules: PoseSyncRules, nowMs: number, floorY?: number): PoseSyncDecision;
|
|
62
|
+
/** @internal */
|
|
60
63
|
export declare function shouldRefreshKeepAlive(lastSeenAtMs: number | undefined, nowMs: number, rules: Pick<PoseSyncRules, "keepAliveRefreshMs">): boolean;
|
|
64
|
+
/** @internal */
|
|
61
65
|
export declare function shouldPersistWorldSnapshot(lastSavedAtMs: number | undefined, nowMs: number, intervalMs: number): boolean;
|
|
62
66
|
export interface ActivePresenceResolution<T> {
|
|
63
67
|
active: T | null;
|
|
64
68
|
/** Other unrevoked rows for the same actor — a session may only have one. */
|
|
65
69
|
extras: T[];
|
|
66
70
|
}
|
|
71
|
+
/** @internal */
|
|
67
72
|
export declare function resolveActivePresence<T extends {
|
|
68
73
|
revokedAt?: number;
|
|
69
74
|
lastSeenAt?: number;
|
|
70
75
|
}>(rows: readonly T[]): ActivePresenceResolution<T>;
|
|
76
|
+
/** @internal */
|
|
71
77
|
export declare function isPresenceExpired(lastSeenAtMs: number, nowMs: number, idleCutoffMs: number): boolean;
|
|
72
|
-
/** Most-recently-seen row across an actor's rows, to reuse instead of inserting a new one.
|
|
78
|
+
/** Most-recently-seen row across an actor's rows, to reuse instead of inserting a new one.
|
|
79
|
+
* @internal
|
|
80
|
+
*/
|
|
73
81
|
export declare function pickReusablePresence<T extends {
|
|
74
82
|
lastSeenAt?: number;
|
|
75
83
|
}>(rows: readonly T[]): T | undefined;
|
|
@@ -10,6 +10,7 @@ function appearanceEqual(a, b) {
|
|
|
10
10
|
return aKeys.every((key) => a[key] === b[key]);
|
|
11
11
|
}
|
|
12
12
|
export const DEFAULT_SPAWN_ORIGIN = { x: 0, y: 0, z: 0 };
|
|
13
|
+
/** @internal */
|
|
13
14
|
export function spawnPresenceState(origin = DEFAULT_SPAWN_ORIGIN, nowMs, rules) {
|
|
14
15
|
return {
|
|
15
16
|
position: { x: origin.x, y: origin.y, z: origin.z },
|
|
@@ -18,6 +19,7 @@ export function spawnPresenceState(origin = DEFAULT_SPAWN_ORIGIN, nowMs, rules)
|
|
|
18
19
|
lastSeenAtMs: nowMs - rules.maxElapsedSec * 1000,
|
|
19
20
|
};
|
|
20
21
|
}
|
|
22
|
+
/** @internal */
|
|
21
23
|
export function decidePoseSync(current, incoming, rules, nowMs, floorY) {
|
|
22
24
|
const rawElapsedSec = Math.max(0, (nowMs - (current.lastSeenAtMs ?? nowMs)) / 1000);
|
|
23
25
|
const elapsedSec = Math.min(rules.maxElapsedSec, rawElapsedSec);
|
|
@@ -55,12 +57,15 @@ export function decidePoseSync(current, incoming, rules, nowMs, floorY) {
|
|
|
55
57
|
refreshKeepAlive: !changed && shouldRefreshKeepAlive(current.lastSeenAtMs, nowMs, rules),
|
|
56
58
|
};
|
|
57
59
|
}
|
|
60
|
+
/** @internal */
|
|
58
61
|
export function shouldRefreshKeepAlive(lastSeenAtMs, nowMs, rules) {
|
|
59
62
|
return nowMs - (lastSeenAtMs ?? 0) >= rules.keepAliveRefreshMs;
|
|
60
63
|
}
|
|
64
|
+
/** @internal */
|
|
61
65
|
export function shouldPersistWorldSnapshot(lastSavedAtMs, nowMs, intervalMs) {
|
|
62
66
|
return lastSavedAtMs === undefined || nowMs - lastSavedAtMs >= intervalMs;
|
|
63
67
|
}
|
|
68
|
+
/** @internal */
|
|
64
69
|
export function resolveActivePresence(rows) {
|
|
65
70
|
const actives = rows.filter((row) => row.revokedAt === undefined);
|
|
66
71
|
if (actives.length === 0)
|
|
@@ -68,10 +73,13 @@ export function resolveActivePresence(rows) {
|
|
|
68
73
|
const sorted = [...actives].sort((a, b) => (b.lastSeenAt ?? 0) - (a.lastSeenAt ?? 0));
|
|
69
74
|
return { active: sorted[0] ?? null, extras: sorted.slice(1) };
|
|
70
75
|
}
|
|
76
|
+
/** @internal */
|
|
71
77
|
export function isPresenceExpired(lastSeenAtMs, nowMs, idleCutoffMs) {
|
|
72
78
|
return nowMs - lastSeenAtMs >= idleCutoffMs;
|
|
73
79
|
}
|
|
74
|
-
/** Most-recently-seen row across an actor's rows, to reuse instead of inserting a new one.
|
|
80
|
+
/** Most-recently-seen row across an actor's rows, to reuse instead of inserting a new one.
|
|
81
|
+
* @internal
|
|
82
|
+
*/
|
|
75
83
|
export function pickReusablePresence(rows) {
|
|
76
84
|
return [...rows].sort((a, b) => (b.lastSeenAt ?? 0) - (a.lastSeenAt ?? 0))[0];
|
|
77
85
|
}
|
|
@@ -15,6 +15,7 @@ export type SealResult = {
|
|
|
15
15
|
ok: false;
|
|
16
16
|
reason: "unknown_participant" | "already_sealed" | "already_revealed";
|
|
17
17
|
};
|
|
18
|
+
/** @internal */
|
|
18
19
|
export declare class CommitRound<TAction> {
|
|
19
20
|
private readonly order;
|
|
20
21
|
private readonly participants;
|
|
@@ -30,5 +31,7 @@ export declare class CommitRound<TAction> {
|
|
|
30
31
|
get phase(): CommitPhase;
|
|
31
32
|
reveal(): readonly SealedCommit<TAction>[] | null;
|
|
32
33
|
}
|
|
34
|
+
/** @internal */
|
|
33
35
|
export declare function createCommitRound<TAction>(config: CommitRoundConfig): CommitRound<TAction>;
|
|
36
|
+
/** @internal */
|
|
34
37
|
export declare function resolveCommits<TAction, TResult>(reveals: readonly SealedCommit<TAction>[], resolver: (ordered: readonly SealedCommit<TAction>[]) => TResult): TResult;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/** @internal */
|
|
1
2
|
export class CommitRound {
|
|
2
3
|
order;
|
|
3
4
|
participants;
|
|
@@ -45,9 +46,11 @@ export class CommitRound {
|
|
|
45
46
|
return this.order.map((id) => this.sealed.get(id));
|
|
46
47
|
}
|
|
47
48
|
}
|
|
49
|
+
/** @internal */
|
|
48
50
|
export function createCommitRound(config) {
|
|
49
51
|
return new CommitRound(config);
|
|
50
52
|
}
|
|
53
|
+
/** @internal */
|
|
51
54
|
export function resolveCommits(reveals, resolver) {
|
|
52
55
|
return resolver(reveals);
|
|
53
56
|
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export { type ChatActions, type ChatSendOutcome, type ChatSync, type ChatTransport, } from "./multiplayer/chatContract.js";
|
|
2
|
+
export { type BoardSnapshot } from "./multiplayer/combatSnapshot.js";
|
|
3
|
+
export { createFeedWriteGate, validateFeedWrite, type FeedWriteGate } from "./multiplayer/feedWriteGate.js";
|
|
4
|
+
export { resolveGuestSession, sessionPlayer, type AuthSession, type PlayerIdentity } from "./multiplayer/identity.js";
|
|
5
|
+
export { type Vec3 } from "./multiplayer/lagCompensation.js";
|
|
6
|
+
export { browseSessions, findByJoinCode, normalizeJoinCode, quickMatch, type MatchFilter, type SessionListing, type SessionVisibility, } from "./multiplayer/matchmaking.js";
|
|
7
|
+
export { createPoseSyncGate, type PlayerPose, type PoseSyncTuning } from "./multiplayer/poseSyncGate.js";
|
|
8
|
+
export { type EnsurePresenceResult, type PresenceActions, type PresenceFeeds, type PresenceSession, type PresenceTransport, } from "./multiplayer/presenceContract.js";
|
|
9
|
+
export { type PoseSyncRules, type PresencePoseState } from "./multiplayer/presenceModel.js";
|
|
10
|
+
export { createLocalVoiceTransport, createPushToTalk, type PushToTalkMode, type PushToTalkStatus, type VoiceParticipant, type VoiceRoute, type VoiceTransport, } from "./multiplayer/voiceContract.js";
|
|
11
|
+
export { type ReplicationPolicy } from "./runtime/worldProjection.js";
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export {} from "./multiplayer/chatContract.js";
|
|
2
|
+
export {} from "./multiplayer/combatSnapshot.js";
|
|
3
|
+
export { createFeedWriteGate, validateFeedWrite } from "./multiplayer/feedWriteGate.js";
|
|
4
|
+
export { resolveGuestSession, sessionPlayer } from "./multiplayer/identity.js";
|
|
5
|
+
export {} from "./multiplayer/lagCompensation.js";
|
|
6
|
+
export { browseSessions, findByJoinCode, normalizeJoinCode, quickMatch, } from "./multiplayer/matchmaking.js";
|
|
7
|
+
export { createPoseSyncGate } from "./multiplayer/poseSyncGate.js";
|
|
8
|
+
export {} from "./multiplayer/presenceContract.js";
|
|
9
|
+
export {} from "./multiplayer/presenceModel.js";
|
|
10
|
+
export { createLocalVoiceTransport, createPushToTalk, } from "./multiplayer/voiceContract.js";
|
|
11
|
+
export {} from "./runtime/worldProjection.js";
|
package/dist/nav/pathFollow.d.ts
CHANGED
|
@@ -21,6 +21,63 @@ export interface HeightSampler {
|
|
|
21
21
|
sampleHeight(x: number, z: number): number;
|
|
22
22
|
}
|
|
23
23
|
export declare function pathFromNav(points: readonly NavPoint[], elevation?: number | HeightSampler, offset?: number): Waypoint[];
|
|
24
|
+
/**
|
|
25
|
+
* Semantic seek target for {@link pathFollowSeek} — the caller-facing progress vocabulary a
|
|
26
|
+
* stateful path behavior restores from, so a follower can start at a distributed phase or resume
|
|
27
|
+
* a serialized route without knowing waypoint internals. `direction` (forward heading) falls out of
|
|
28
|
+
* the resulting {@link PathFollowState.heading}, so it is an output rather than a seek input.
|
|
29
|
+
*/
|
|
30
|
+
export type PathProgress =
|
|
31
|
+
/** Fraction `0..1` of total path length (looping paths wrap; clamped otherwise). */
|
|
32
|
+
{
|
|
33
|
+
readonly kind: "normalized";
|
|
34
|
+
readonly value: number;
|
|
35
|
+
}
|
|
36
|
+
/** World-distance travelled from the first waypoint (looping paths wrap; clamped otherwise). */
|
|
37
|
+
| {
|
|
38
|
+
readonly kind: "distance";
|
|
39
|
+
readonly value: number;
|
|
40
|
+
}
|
|
41
|
+
/** Segment `index` (0-based) plus `fraction` `0..1` along that segment. */
|
|
42
|
+
| {
|
|
43
|
+
readonly kind: "segment";
|
|
44
|
+
readonly index: number;
|
|
45
|
+
readonly fraction: number;
|
|
46
|
+
};
|
|
47
|
+
/** Read-only progress readout for inspection/debug tooling, produced by {@link pathFollowProgress}. */
|
|
48
|
+
export interface PathFollowProgress {
|
|
49
|
+
/** Cumulative world-distance travelled (matches {@link PathFollowState.distanceTravelled}). */
|
|
50
|
+
distance: number;
|
|
51
|
+
/** Fraction `0..1` of total path length at the current position. */
|
|
52
|
+
normalized: number;
|
|
53
|
+
/** 0-based index of the segment the mover is currently on. */
|
|
54
|
+
segment: number;
|
|
55
|
+
/** Fraction `0..1` along the current segment. */
|
|
56
|
+
fraction: number;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Total world-distance of a path — sum of every segment, including the wrap segment back to the
|
|
60
|
+
* first waypoint when `loop` is set. Zero for a degenerate (0- or 1-waypoint) path.
|
|
61
|
+
*
|
|
62
|
+
* @capability path-length total polyline distance for progress math and seeding
|
|
63
|
+
*/
|
|
64
|
+
export declare function pathLength(config: PathFollowConfig): number;
|
|
65
|
+
/**
|
|
66
|
+
* Place a follower at a semantic {@link PathProgress} without simulating from the start — the seek
|
|
67
|
+
* adapter behavior lifecycles use to seed distributed phases and restore serialized routes. Pure;
|
|
68
|
+
* returns a fresh {@link PathFollowState} whose `heading` gives travel direction. Looping paths wrap
|
|
69
|
+
* the distance; non-looping paths clamp to `[0, pathLength]` and report `done` at the end.
|
|
70
|
+
*
|
|
71
|
+
* @capability path-follow-seek jump a path-follower to normalized/distance/segment progress
|
|
72
|
+
*/
|
|
73
|
+
export declare function pathFollowSeek(config: PathFollowConfig, target: PathProgress): PathFollowState;
|
|
74
|
+
/**
|
|
75
|
+
* Read a follower's current progress in every semantic form — the inverse of {@link pathFollowSeek},
|
|
76
|
+
* for editor/debug inspection and progress HUDs. Pure and allocation-light.
|
|
77
|
+
*
|
|
78
|
+
* @capability path-follow-progress read normalized/distance/segment progress from follow state
|
|
79
|
+
*/
|
|
80
|
+
export declare function pathFollowProgress(config: PathFollowConfig, state: PathFollowState): PathFollowProgress;
|
|
24
81
|
export declare function createPathFollow(config: PathFollowConfig): PathFollowState;
|
|
25
82
|
/**
|
|
26
83
|
* Advance a path-follower by `speed * dt` along its authored polyline. Pure — returns
|