@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,47 @@
|
|
|
1
|
+
export { lerp, clamp01, smoothstep } from "../anim/easing.js";
|
|
2
|
+
/** Constrain a value to the inclusive `[min, max]` range.
|
|
3
|
+
* @internal
|
|
4
|
+
*/
|
|
5
|
+
export function clamp(value, min, max) {
|
|
6
|
+
return value < min ? min : value > max ? max : value;
|
|
7
|
+
}
|
|
8
|
+
/** Fraction of the way `value` sits between `from` and `to`; inverse of `lerp`. Returns 0 when the span is empty.
|
|
9
|
+
* @internal
|
|
10
|
+
*/
|
|
11
|
+
export function inverseLerp(from, to, value) {
|
|
12
|
+
return from === to ? 0 : (value - from) / (to - from);
|
|
13
|
+
}
|
|
14
|
+
/** Map `value` from the `[inMin, inMax]` range onto `[outMin, outMax]`, optionally clamped to the output range.
|
|
15
|
+
* @internal
|
|
16
|
+
*/
|
|
17
|
+
export function remap(value, inMin, inMax, outMin, outMax, clamped = false) {
|
|
18
|
+
const t = inMin === inMax ? 0 : (value - inMin) / (inMax - inMin);
|
|
19
|
+
const mapped = outMin + (outMax - outMin) * t;
|
|
20
|
+
if (!clamped)
|
|
21
|
+
return mapped;
|
|
22
|
+
const lo = Math.min(outMin, outMax);
|
|
23
|
+
const hi = Math.max(outMin, outMax);
|
|
24
|
+
return mapped < lo ? lo : mapped > hi ? hi : mapped;
|
|
25
|
+
}
|
|
26
|
+
/** Euclidean modulo that always returns a non-negative result in `[0, modulus)`, unlike the `%` operator.
|
|
27
|
+
* @internal
|
|
28
|
+
*/
|
|
29
|
+
export function mod(value, modulus) {
|
|
30
|
+
return ((value % modulus) + modulus) % modulus;
|
|
31
|
+
}
|
|
32
|
+
/** Step `current` toward `target` by at most `maxDelta`, without overshooting.
|
|
33
|
+
* @internal
|
|
34
|
+
*/
|
|
35
|
+
export function moveTowards(current, target, maxDelta) {
|
|
36
|
+
const diff = target - current;
|
|
37
|
+
if (Math.abs(diff) <= maxDelta)
|
|
38
|
+
return target;
|
|
39
|
+
return current + Math.sign(diff) * maxDelta;
|
|
40
|
+
}
|
|
41
|
+
/** Wrap `value` into the half-open range `[min, max)`, cycling past either edge.
|
|
42
|
+
* @internal
|
|
43
|
+
*/
|
|
44
|
+
export function wrap(value, min, max) {
|
|
45
|
+
const span = max - min;
|
|
46
|
+
return span <= 0 ? min : min + mod(value - min, span);
|
|
47
|
+
}
|
package/dist/meta/changelog.d.ts
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
/** Installed `@jgengine/core` semver — compare against {@link CHANGELOG} keys when migrating. */
|
|
2
|
+
export declare const VERSION = "0.11.0";
|
|
3
|
+
/** One release's migrate steps plus added/changed/removed notes (typed mirror of CHANGELOG.md). */
|
|
2
4
|
export interface ChangelogEntry {
|
|
3
5
|
migrate: readonly string[];
|
|
4
6
|
added: readonly string[];
|
|
5
7
|
changed: readonly string[];
|
|
6
8
|
removed: readonly string[];
|
|
7
9
|
}
|
|
10
|
+
/** Per-version engine changelog keyed by semver string (e.g. `"0.10.0"`). */
|
|
8
11
|
export declare const CHANGELOG: Record<string, ChangelogEntry>;
|
package/dist/meta/changelog.js
CHANGED
|
@@ -1,5 +1,40 @@
|
|
|
1
|
-
|
|
1
|
+
/** Installed `@jgengine/core` semver — compare against {@link CHANGELOG} keys when migrating. */
|
|
2
|
+
export const VERSION = "0.11.0";
|
|
3
|
+
/** Per-version engine changelog keyed by semver string (e.g. `"0.10.0"`). */
|
|
2
4
|
export const CHANGELOG = {
|
|
5
|
+
"0.11.0": {
|
|
6
|
+
migrate: [
|
|
7
|
+
"Bump lockstep SDK packages to ^0.11.0: @jgengine/{core,react,ws,node,sql,convex,shell,editor,assets}. CLI jgengine and @jgengine/github may lag on their own version lines.",
|
|
8
|
+
"Nothing required — classic loop.onTick fan-out still runs after systems. Prefer moving per-frame work into defineGame({ systems: [...] }) with defineSystem (@jgengine/core/game/defineSystem); install a system with feature: \"quest\" (etc.) instead of a redundant features flag.",
|
|
9
|
+
],
|
|
10
|
+
added: [
|
|
11
|
+
"Composable game systems (#842) — defineSystem / compileSystemSchedule / composeGameLoop / installSystems. defineGame({ systems }) is the single authoring path: fixed / frame / interval / event-only / manual ticks, multi-subscribe channels, deterministic stage order + optional before/after/dependsOn, system-owned save / replicate / reset / dispose. Installing a system activates its feature without a separate flag. GameLoop gains optional onReset / onDispose. ctx.game.registerSave / registerReplicate for system modules. Adopters: tower-guard, claudecraft (runtime without a giant tick fan-out).",
|
|
12
|
+
],
|
|
13
|
+
changed: [],
|
|
14
|
+
removed: [],
|
|
15
|
+
},
|
|
16
|
+
"0.10.0": {
|
|
17
|
+
migrate: [
|
|
18
|
+
"Bump lockstep SDK packages to ^0.10.0: @jgengine/{core,react,ws,node,sql,convex,shell,editor,assets}. CLI jgengine and @jgengine/github may lag on their own version lines.",
|
|
19
|
+
"Nothing to change for existing games — the shared mobile-composition system (viewport allocation, region collision, --jg-* viewport vars) is wired automatically by the shell; HudPanels inside a HudCanvas register themselves. Legacy orientation: \"landscape\" | \"portrait\" keeps its advisory dismissible-hint behavior.",
|
|
20
|
+
"Opt a driving/landscape game into the strict gate: replace advisory orientation with the contract form orientation: { mobile: \"landscape-required\" } (rules: any · portrait/landscape advisory · portrait-required/landscape-required · unsupported). In portrait the engine shows a polished RotateDeviceScreen, suppresses input, freezes the sim, and unmounts the HUD/controls until the device is landscape.",
|
|
21
|
+
"Declare HUD intent where useful: HudPanel gains priority (critical/secondary/tertiary), mobileBehavior (hidden unmounts on phones, transient softens collision), allowOverlapWith, and collisionGroup — all optional; omitting them keeps prior behavior.",
|
|
22
|
+
"Mobile validation now also fails on overlap: bun run shoot <game> --device mobile|mobile-landscape|both exits non-zero on forbidden inter-element collisions, naming both regions.",
|
|
23
|
+
],
|
|
24
|
+
added: [
|
|
25
|
+
"Authored behavior triggers — schema'd `on`/`action` meta vocabulary on editor volumes and markers (`registerTriggerAction`, `collectAuthoredTriggers`, `createAuthoredTriggerRuntime`, `pointInVolume` in `@jgengine/core/scene/authoredTriggers` / `@jgengine/core/world`). Games declare typed actions via ParamSchema; the editor inspector renders trigger fields; runtime watches enter/exit/interact and dispatches to handlers. studio-showcase adopts with an announce zone.",
|
|
26
|
+
"Shared mobile layout composition — @jgengine/core/ui/gameLayout (resolveLayoutMode, intersects, overlapArea, detectLayoutCollisions, computeGameplayRect, LayoutRegion, GameViewportLayout) and @jgengine/core/ui/orientation (resolveOrientationRequirement, orientationGateActive, MobileOrientationRule); @jgengine/react adds GameViewportProvider (mounted by the shell), hooks (useGameViewportLayout, useGameLayoutMode, useGameOrientation, useReservedControlZones, useLayoutCollisions, useRegisterLayoutRegion), and a headless RotateDeviceScreen. The provider tracks window.visualViewport, publishes --jg-viewport-*/--jg-visual-viewport-*/--jg-safe-* CSS vars, resolves the explicit layout mode, and detects forbidden region overlaps.",
|
|
27
|
+
"Mandatory orientation contract — PlayableGame.orientation accepts { mobile: <rule> }; landscape-required/portrait-required render an engine-owned rotate gate that blocks gameplay (input suppressed, simulation frozen, HUD/controls unmounted), self-correcting when the device is turned. Reduced-motion and safe-area respected; visualViewport-sized for mobile Safari/PWA.",
|
|
28
|
+
"Reserved touch-control zones — the touch dock registers its joystick / action-cluster / utility rectangles (runtime-measured) as control regions, so HUD placement and collision validation know exactly where controls sit.",
|
|
29
|
+
"HUD placement metadata — HudPanel gains priority, mobileBehavior, allowOverlapWith, collisionGroup, and registers as a collision-tracked layout region.",
|
|
30
|
+
"Mobile-landscape shoot device — bun run shoot --device mobile-landscape (844×390) plus collision-gate reads that fail mobile validation on forbidden overlaps.",
|
|
31
|
+
"Canyon Chase migrated as the reference landscape-required game — declares orientation: { mobile: \"landscape-required\" } and composes its HUD through coordinated HudPanel regions instead of independent fixed corners.",
|
|
32
|
+
],
|
|
33
|
+
changed: [
|
|
34
|
+
"First-person projectile tracers now originate from the weapon muzzle instead of the camera/eye centerline; hit detection is unchanged (still crosshair-accurate), and non-viewmodel games and enemy tracers are unaffected.",
|
|
35
|
+
],
|
|
36
|
+
removed: [],
|
|
37
|
+
},
|
|
3
38
|
"0.9.0": {
|
|
4
39
|
migrate: [
|
|
5
40
|
"Bump every @jgengine/* dependency to ^0.9.0 (the eight packages version in lockstep).",
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local collision avoidance: nudge a set of circular agents apart so they stop
|
|
3
|
+
* overlapping, kept deliberately separate from route planning so a game can
|
|
4
|
+
* pair it with nav paths, flow fields, direct seek, or vehicle steering. It is a
|
|
5
|
+
* short symmetric relaxation (Jacobi position correction) over a bounded uniform
|
|
6
|
+
* hash grid — each agent only tests the 3×3 cells around it, so cost scales with
|
|
7
|
+
* local density, never O(n²) across the whole world. Corrections are summed per
|
|
8
|
+
* agent and applied after each pass, so the result is order-independent and
|
|
9
|
+
* deterministic for a given agent list. Different radii and per-agent weights
|
|
10
|
+
* (inverse mass; `0` = immovable anchor/obstacle) are honored.
|
|
11
|
+
*/
|
|
12
|
+
import type { Vec2 } from "./formation.js";
|
|
13
|
+
/** A circular agent that avoidance may push on the XZ plane. */
|
|
14
|
+
export interface AvoidanceAgent {
|
|
15
|
+
/** Current XZ position; reassigned in place by {@link resolveLocalAvoidance}. */
|
|
16
|
+
position: Vec2;
|
|
17
|
+
/** Collision radius (world units). */
|
|
18
|
+
radius: number;
|
|
19
|
+
}
|
|
20
|
+
/** Tuning for {@link resolveLocalAvoidance}. */
|
|
21
|
+
export interface LocalAvoidanceOptions {
|
|
22
|
+
/** Relaxation passes; more converges denser packs. Default `2`. */
|
|
23
|
+
iterations?: number;
|
|
24
|
+
/** Fraction of each overlap resolved per pass, `0..1`. Lower is softer/less jittery. Default `1`. */
|
|
25
|
+
strength?: number;
|
|
26
|
+
/** Extra gap enforced beyond the two radii (world units). Default `0`. */
|
|
27
|
+
padding?: number;
|
|
28
|
+
/**
|
|
29
|
+
* Per-agent inverse mass, parallel to the agent list. `0` pins an agent
|
|
30
|
+
* (obstacle/leader); a heavier agent (smaller value) yields less. Omitted or
|
|
31
|
+
* negative entries default to `1`. Two pinned agents never push each other.
|
|
32
|
+
*/
|
|
33
|
+
weights?: readonly number[];
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Resolve overlaps in `agents` in place and return how many overlapping pairs
|
|
37
|
+
* remained on the final pass (`0` = fully separated). Uses a bounded uniform
|
|
38
|
+
* hash grid sized to the largest agent, so only nearby agents are ever compared.
|
|
39
|
+
* Deterministic: corrections are accumulated then applied per pass, independent
|
|
40
|
+
* of agent order. Pass `weights` to pin or differentially push agents.
|
|
41
|
+
*
|
|
42
|
+
* @capability local-avoidance bounded deterministic local collision avoidance for moving agents
|
|
43
|
+
* @consumer squad/crowd movement — keep grouped agents from overlapping without a whole-world scan
|
|
44
|
+
*/
|
|
45
|
+
export declare function resolveLocalAvoidance(agents: AvoidanceAgent[], options?: LocalAvoidanceOptions): number;
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local collision avoidance: nudge a set of circular agents apart so they stop
|
|
3
|
+
* overlapping, kept deliberately separate from route planning so a game can
|
|
4
|
+
* pair it with nav paths, flow fields, direct seek, or vehicle steering. It is a
|
|
5
|
+
* short symmetric relaxation (Jacobi position correction) over a bounded uniform
|
|
6
|
+
* hash grid — each agent only tests the 3×3 cells around it, so cost scales with
|
|
7
|
+
* local density, never O(n²) across the whole world. Corrections are summed per
|
|
8
|
+
* agent and applied after each pass, so the result is order-independent and
|
|
9
|
+
* deterministic for a given agent list. Different radii and per-agent weights
|
|
10
|
+
* (inverse mass; `0` = immovable anchor/obstacle) are honored.
|
|
11
|
+
*/
|
|
12
|
+
const CELL_KEY_STRIDE = 0x40000000;
|
|
13
|
+
function cellKey(cx, cz) {
|
|
14
|
+
return cx * CELL_KEY_STRIDE + cz;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Resolve overlaps in `agents` in place and return how many overlapping pairs
|
|
18
|
+
* remained on the final pass (`0` = fully separated). Uses a bounded uniform
|
|
19
|
+
* hash grid sized to the largest agent, so only nearby agents are ever compared.
|
|
20
|
+
* Deterministic: corrections are accumulated then applied per pass, independent
|
|
21
|
+
* of agent order. Pass `weights` to pin or differentially push agents.
|
|
22
|
+
*
|
|
23
|
+
* @capability local-avoidance bounded deterministic local collision avoidance for moving agents
|
|
24
|
+
* @consumer squad/crowd movement — keep grouped agents from overlapping without a whole-world scan
|
|
25
|
+
*/
|
|
26
|
+
export function resolveLocalAvoidance(agents, options = {}) {
|
|
27
|
+
const count = agents.length;
|
|
28
|
+
if (count < 2)
|
|
29
|
+
return 0;
|
|
30
|
+
const iterations = Math.max(1, Math.floor(options.iterations ?? 2));
|
|
31
|
+
const strength = options.strength ?? 1;
|
|
32
|
+
const padding = options.padding ?? 0;
|
|
33
|
+
const weights = options.weights;
|
|
34
|
+
let maxRadius = 0;
|
|
35
|
+
for (let i = 0; i < count; i += 1) {
|
|
36
|
+
if (agents[i].radius > maxRadius)
|
|
37
|
+
maxRadius = agents[i].radius;
|
|
38
|
+
}
|
|
39
|
+
const cell = Math.max(2 * maxRadius + padding, 1e-6);
|
|
40
|
+
const invCell = 1 / cell;
|
|
41
|
+
const corrX = new Float64Array(count);
|
|
42
|
+
const corrZ = new Float64Array(count);
|
|
43
|
+
const grid = new Map();
|
|
44
|
+
let overlaps = 0;
|
|
45
|
+
for (let pass = 0; pass < iterations; pass += 1) {
|
|
46
|
+
grid.clear();
|
|
47
|
+
for (let i = 0; i < count; i += 1) {
|
|
48
|
+
const p = agents[i].position;
|
|
49
|
+
const key = cellKey(Math.floor(p[0] * invCell), Math.floor(p[1] * invCell));
|
|
50
|
+
let bucket = grid.get(key);
|
|
51
|
+
if (bucket === undefined) {
|
|
52
|
+
bucket = [];
|
|
53
|
+
grid.set(key, bucket);
|
|
54
|
+
}
|
|
55
|
+
bucket.push(i);
|
|
56
|
+
}
|
|
57
|
+
corrX.fill(0);
|
|
58
|
+
corrZ.fill(0);
|
|
59
|
+
overlaps = 0;
|
|
60
|
+
for (let i = 0; i < count; i += 1) {
|
|
61
|
+
const a = agents[i];
|
|
62
|
+
const cx = Math.floor(a.position[0] * invCell);
|
|
63
|
+
const cz = Math.floor(a.position[1] * invCell);
|
|
64
|
+
const wi = weightOf(weights, i);
|
|
65
|
+
for (let dz = -1; dz <= 1; dz += 1) {
|
|
66
|
+
for (let dx = -1; dx <= 1; dx += 1) {
|
|
67
|
+
const bucket = grid.get(cellKey(cx + dx, cz + dz));
|
|
68
|
+
if (bucket === undefined)
|
|
69
|
+
continue;
|
|
70
|
+
for (let b = 0; b < bucket.length; b += 1) {
|
|
71
|
+
const j = bucket[b];
|
|
72
|
+
if (j <= i)
|
|
73
|
+
continue;
|
|
74
|
+
const wj = weightOf(weights, j);
|
|
75
|
+
const totalWeight = wi + wj;
|
|
76
|
+
if (totalWeight <= 0)
|
|
77
|
+
continue;
|
|
78
|
+
const bAgent = agents[j];
|
|
79
|
+
const minDist = a.radius + bAgent.radius + padding;
|
|
80
|
+
let ndx = bAgent.position[0] - a.position[0];
|
|
81
|
+
let ndz = bAgent.position[1] - a.position[1];
|
|
82
|
+
let dist = Math.hypot(ndx, ndz);
|
|
83
|
+
if (dist >= minDist)
|
|
84
|
+
continue;
|
|
85
|
+
overlaps += 1;
|
|
86
|
+
if (dist < 1e-9) {
|
|
87
|
+
// Coincident: separate along a deterministic axis by index order.
|
|
88
|
+
ndx = 1;
|
|
89
|
+
ndz = 0;
|
|
90
|
+
dist = 0;
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
ndx /= dist;
|
|
94
|
+
ndz /= dist;
|
|
95
|
+
}
|
|
96
|
+
const penetration = (minDist - dist) * strength;
|
|
97
|
+
const shareA = (wi / totalWeight) * penetration;
|
|
98
|
+
const shareB = (wj / totalWeight) * penetration;
|
|
99
|
+
corrX[i] -= ndx * shareA;
|
|
100
|
+
corrZ[i] -= ndz * shareA;
|
|
101
|
+
corrX[j] += ndx * shareB;
|
|
102
|
+
corrZ[j] += ndz * shareB;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
for (let i = 0; i < count; i += 1) {
|
|
108
|
+
const cxi = corrX[i];
|
|
109
|
+
const czi = corrZ[i];
|
|
110
|
+
if (cxi === 0 && czi === 0)
|
|
111
|
+
continue;
|
|
112
|
+
const p = agents[i].position;
|
|
113
|
+
agents[i].position = [p[0] + cxi, p[1] + czi];
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return overlaps;
|
|
117
|
+
}
|
|
118
|
+
function weightOf(weights, index) {
|
|
119
|
+
if (weights === undefined)
|
|
120
|
+
return 1;
|
|
121
|
+
const w = weights[index];
|
|
122
|
+
return w === undefined || w < 0 ? 1 : w;
|
|
123
|
+
}
|
|
@@ -5,11 +5,19 @@
|
|
|
5
5
|
* apply the results to its own three.js camera/vectors without owning the math.
|
|
6
6
|
*/
|
|
7
7
|
export declare const CAMERA_PITCH_LIMIT = 1.45;
|
|
8
|
+
/** @internal */
|
|
8
9
|
export declare function clampCameraPitch(pitch: number): number;
|
|
10
|
+
/** @internal */
|
|
9
11
|
export declare function resolveTargetEyeHeight(crouching: boolean, grounded: boolean): number;
|
|
12
|
+
/** @internal */
|
|
10
13
|
export declare function advanceEyeHeight(currentEyeHeight: number, targetEyeHeight: number, deltaSeconds: number): number;
|
|
14
|
+
/** @internal */
|
|
11
15
|
export declare function resolveHeadBobRate(crouching: boolean, running: boolean): number;
|
|
16
|
+
/** @internal */
|
|
12
17
|
export declare function resolveHeadBobAmplitude(crouching: boolean, running: boolean, grounded: boolean): number;
|
|
18
|
+
/** @internal */
|
|
13
19
|
export declare function advanceHeadBobTime(currentHeadBobTime: number, moving: boolean, grounded: boolean, bobRate: number, deltaSeconds: number): number;
|
|
20
|
+
/** @internal */
|
|
14
21
|
export declare function resolveHeadBobOffset(headBobTime: number, bobAmplitude: number): number;
|
|
22
|
+
/** @internal */
|
|
15
23
|
export declare function resolveCameraTrackingBlend(deltaSeconds: number): number;
|
|
@@ -6,16 +6,20 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { MOVEMENT_TUNING } from "./movementModel.js";
|
|
8
8
|
export const CAMERA_PITCH_LIMIT = 1.45;
|
|
9
|
+
/** @internal */
|
|
9
10
|
export function clampCameraPitch(pitch) {
|
|
10
11
|
return Math.max(-CAMERA_PITCH_LIMIT, Math.min(CAMERA_PITCH_LIMIT, pitch));
|
|
11
12
|
}
|
|
13
|
+
/** @internal */
|
|
12
14
|
export function resolveTargetEyeHeight(crouching, grounded) {
|
|
13
15
|
return crouching && grounded ? MOVEMENT_TUNING.crouchEyeHeight : MOVEMENT_TUNING.standEyeHeight;
|
|
14
16
|
}
|
|
17
|
+
/** @internal */
|
|
15
18
|
export function advanceEyeHeight(currentEyeHeight, targetEyeHeight, deltaSeconds) {
|
|
16
19
|
const blend = 1 - Math.exp(-MOVEMENT_TUNING.crouchTransitionSpeed * deltaSeconds);
|
|
17
20
|
return currentEyeHeight + (targetEyeHeight - currentEyeHeight) * blend;
|
|
18
21
|
}
|
|
22
|
+
/** @internal */
|
|
19
23
|
export function resolveHeadBobRate(crouching, running) {
|
|
20
24
|
return crouching
|
|
21
25
|
? MOVEMENT_TUNING.crouchBobRate
|
|
@@ -23,6 +27,7 @@ export function resolveHeadBobRate(crouching, running) {
|
|
|
23
27
|
? MOVEMENT_TUNING.runBobRate
|
|
24
28
|
: MOVEMENT_TUNING.walkBobRate;
|
|
25
29
|
}
|
|
30
|
+
/** @internal */
|
|
26
31
|
export function resolveHeadBobAmplitude(crouching, running, grounded) {
|
|
27
32
|
if (!grounded)
|
|
28
33
|
return 0;
|
|
@@ -32,12 +37,15 @@ export function resolveHeadBobAmplitude(crouching, running, grounded) {
|
|
|
32
37
|
? MOVEMENT_TUNING.runBobAmplitude
|
|
33
38
|
: MOVEMENT_TUNING.walkBobAmplitude;
|
|
34
39
|
}
|
|
40
|
+
/** @internal */
|
|
35
41
|
export function advanceHeadBobTime(currentHeadBobTime, moving, grounded, bobRate, deltaSeconds) {
|
|
36
42
|
return moving && grounded ? currentHeadBobTime + deltaSeconds * bobRate : 0;
|
|
37
43
|
}
|
|
44
|
+
/** @internal */
|
|
38
45
|
export function resolveHeadBobOffset(headBobTime, bobAmplitude) {
|
|
39
46
|
return Math.sin(headBobTime * Math.PI * 2) * bobAmplitude;
|
|
40
47
|
}
|
|
48
|
+
/** @internal */
|
|
41
49
|
export function resolveCameraTrackingBlend(deltaSeconds) {
|
|
42
50
|
return 1 - Math.exp(-MOVEMENT_TUNING.cameraTrackingSpeed * deltaSeconds);
|
|
43
51
|
}
|
package/dist/movement/dash.d.ts
CHANGED
|
@@ -22,10 +22,20 @@ export interface DashBurst {
|
|
|
22
22
|
durationMs: number;
|
|
23
23
|
distance: number;
|
|
24
24
|
}
|
|
25
|
+
/** @internal */
|
|
25
26
|
export declare function iframeActive(config: DashConfig, elapsedMs: number): boolean;
|
|
27
|
+
/** @internal */
|
|
26
28
|
export declare function dashEase(t: number): number;
|
|
29
|
+
/**
|
|
30
|
+
* Compute a dash/dodge burst's displacement over its window, with i-frame timing for dodges.
|
|
31
|
+
*
|
|
32
|
+
* @capability dash-move a dash/dodge burst with i-frames and cooldown
|
|
33
|
+
* @internal
|
|
34
|
+
*/
|
|
27
35
|
export declare function dashDisplacement(config: DashConfig, dir: DashDirection, elapsedMs: number): [number, number, number];
|
|
36
|
+
/** @internal */
|
|
28
37
|
export declare function dashOffset(config: DashConfig, dir: DashDirection, elapsedMs: number): [number, number, number];
|
|
38
|
+
/** @internal */
|
|
29
39
|
export declare function dashFrameDelta(config: DashConfig, dir: DashDirection, previousElapsedMs: number, elapsedMs: number): [number, number, number];
|
|
30
40
|
export interface DashState {
|
|
31
41
|
tryDash(direction: DashDirection, nowMs: number): DashRejection | DashBurst;
|
|
@@ -37,4 +47,5 @@ export interface DashState {
|
|
|
37
47
|
displacement(nowMs: number): [number, number, number];
|
|
38
48
|
offset(nowMs: number): [number, number, number];
|
|
39
49
|
}
|
|
50
|
+
/** @internal */
|
|
40
51
|
export declare function createDashState(config: DashConfig): DashState;
|
package/dist/movement/dash.js
CHANGED
|
@@ -1,10 +1,18 @@
|
|
|
1
|
+
/** @internal */
|
|
1
2
|
export function iframeActive(config, elapsedMs) {
|
|
2
3
|
return elapsedMs >= config.iframes.fromMs && elapsedMs < config.iframes.toMs;
|
|
3
4
|
}
|
|
5
|
+
/** @internal */
|
|
4
6
|
export function dashEase(t) {
|
|
5
7
|
const clamped = Math.max(0, Math.min(1, t));
|
|
6
8
|
return 1 - (1 - clamped) * (1 - clamped);
|
|
7
9
|
}
|
|
10
|
+
/**
|
|
11
|
+
* Compute a dash/dodge burst's displacement over its window, with i-frame timing for dodges.
|
|
12
|
+
*
|
|
13
|
+
* @capability dash-move a dash/dodge burst with i-frames and cooldown
|
|
14
|
+
* @internal
|
|
15
|
+
*/
|
|
8
16
|
export function dashDisplacement(config, dir, elapsedMs) {
|
|
9
17
|
const traveled = dashEase(elapsedMs / config.durationMs) * config.distance;
|
|
10
18
|
const len = Math.hypot(dir.x, dir.z);
|
|
@@ -12,14 +20,17 @@ export function dashDisplacement(config, dir, elapsedMs) {
|
|
|
12
20
|
return [0, 0, 0];
|
|
13
21
|
return [(dir.x / len) * traveled, 0, (dir.z / len) * traveled];
|
|
14
22
|
}
|
|
23
|
+
/** @internal */
|
|
15
24
|
export function dashOffset(config, dir, elapsedMs) {
|
|
16
25
|
return dashDisplacement(config, dir, elapsedMs);
|
|
17
26
|
}
|
|
27
|
+
/** @internal */
|
|
18
28
|
export function dashFrameDelta(config, dir, previousElapsedMs, elapsedMs) {
|
|
19
29
|
const previous = dashDisplacement(config, dir, previousElapsedMs);
|
|
20
30
|
const current = dashDisplacement(config, dir, elapsedMs);
|
|
21
31
|
return [current[0] - previous[0], current[1] - previous[1], current[2] - previous[2]];
|
|
22
32
|
}
|
|
33
|
+
/** @internal */
|
|
23
34
|
export function createDashState(config) {
|
|
24
35
|
let stamina = config.staminaMax;
|
|
25
36
|
let dashStartMs = null;
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Group destination assignment: slot a moving group into a formation around a
|
|
3
|
+
* target point, then match members to slots. Shape is caller data — a
|
|
4
|
+
* {@link FormationSlotGenerator} emits slot offsets in the group's local frame
|
|
5
|
+
* ("right" = +x, "forward" = +y) and the engine ships line/box/wedge/circle
|
|
6
|
+
* only as samples; a custom generator needs no engine change. Placement and
|
|
7
|
+
* matching are pure and deterministic so the same inputs always yield the same
|
|
8
|
+
* world slots and the same assignment, which keeps them replay- and
|
|
9
|
+
* network-safe. Route planning and local collision avoidance are deliberately
|
|
10
|
+
* separate seams (`movement/avoidance`, `nav/pathFollow`): this module answers
|
|
11
|
+
* only "where should each member stand", not "how does it get there".
|
|
12
|
+
*/
|
|
13
|
+
/** A point or offset on the XZ ground plane: `[x, z]`. */
|
|
14
|
+
export type Vec2 = readonly [number, number];
|
|
15
|
+
/**
|
|
16
|
+
* Produces `count` slot offsets in the group's local frame — `[right, forward]`
|
|
17
|
+
* where `+forward` points where the group faces. Index order is the slot order;
|
|
18
|
+
* a generator must be pure (same `count` → same offsets) so placement stays
|
|
19
|
+
* deterministic. Sample generators below cover common shapes; games pass their
|
|
20
|
+
* own for anything else (crowds, convoys, sports positions) with no engine edit.
|
|
21
|
+
*/
|
|
22
|
+
export type FormationSlotGenerator = (count: number) => Vec2[];
|
|
23
|
+
/**
|
|
24
|
+
* Engine yaw (`rotationY`, radians) that faces from `from` toward `to` on the
|
|
25
|
+
* XZ plane, matching the `forward = (sin yaw, cos yaw)` convention. Feed the
|
|
26
|
+
* result as the `facing` of {@link placeFormation} to orient a formation along
|
|
27
|
+
* its travel direction. Returns `0` when the points coincide.
|
|
28
|
+
*
|
|
29
|
+
* @capability formation-facing group facing yaw from a travel direction on the XZ plane
|
|
30
|
+
* @consumer squad and crowd movement — orient a destination formation along its heading
|
|
31
|
+
*/
|
|
32
|
+
export declare function facingYaw(from: Vec2, to: Vec2): number;
|
|
33
|
+
/**
|
|
34
|
+
* Transform a generator's local slot offsets into world XZ positions around a
|
|
35
|
+
* `destination`, rotated by `facing` (engine yaw). Slot `i` in the returned
|
|
36
|
+
* array is `generator(count)[i]` mapped through the group frame, so it stays
|
|
37
|
+
* aligned with {@link assignFormationSlots}' slot indices. Pure and allocation-
|
|
38
|
+
* light: one array of `count` points, no per-call closures retained.
|
|
39
|
+
*
|
|
40
|
+
* @capability formation-placement place a group formation's world slots around a destination
|
|
41
|
+
* @consumer squad/party/convoy movement — generate per-member destination slots around a target
|
|
42
|
+
*/
|
|
43
|
+
export declare function placeFormation(destination: Vec2, facing: number, count: number, generator: FormationSlotGenerator): Vec2[];
|
|
44
|
+
/** Tuning for {@link assignFormationSlots}' stable, low-churn matching. */
|
|
45
|
+
export interface SlotAssignmentOptions {
|
|
46
|
+
/**
|
|
47
|
+
* Last tick's result (`previous[member] = slot`). When supplied, a member is
|
|
48
|
+
* biased toward keeping its previous slot so the formation does not reshuffle
|
|
49
|
+
* every frame. Entries out of range for the current slot count are ignored.
|
|
50
|
+
*/
|
|
51
|
+
previous?: readonly number[];
|
|
52
|
+
/**
|
|
53
|
+
* Squared-distance bonus (world units²) for keeping the previous slot; higher
|
|
54
|
+
* values reduce churn at the cost of tighter travel. Default `0` (pure
|
|
55
|
+
* nearest matching). Ignored without `previous`.
|
|
56
|
+
*/
|
|
57
|
+
stickiness?: number;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Match `members` to `slots` by a deterministic greedy nearest assignment:
|
|
61
|
+
* every (member, slot) pair is ranked by squared travel distance (minus a
|
|
62
|
+
* stickiness bonus for a member's previous slot) and assigned in order while
|
|
63
|
+
* both ends are free. Returns `assignment[member] = slot`, or `-1` for members
|
|
64
|
+
* left unmatched when there are fewer slots than members. Ties break by member
|
|
65
|
+
* then slot index, so the result is stable across runs and independent of input
|
|
66
|
+
* ordering — the property replay and lockstep multiplayer rely on. Groups are
|
|
67
|
+
* bounded, so the `O(members·slots·log)` sort is fine; this is not a per-frame
|
|
68
|
+
* whole-world pass.
|
|
69
|
+
*
|
|
70
|
+
* @capability formation-assignment stable deterministic member-to-slot matching for a group formation
|
|
71
|
+
* @consumer squad/party movement — assign each member a destination slot with low reshuffle churn
|
|
72
|
+
*/
|
|
73
|
+
export declare function assignFormationSlots(members: readonly Vec2[], slots: readonly Vec2[], options?: SlotAssignmentOptions): number[];
|
|
74
|
+
/** Options for {@link lineFormation}. */
|
|
75
|
+
export interface LineFormationOptions {
|
|
76
|
+
/** Gap between adjacent members (world units). */
|
|
77
|
+
spacing: number;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* A single rank abreast, centered on the destination and facing forward — a
|
|
81
|
+
* skirmish line or a chorus row. Slots run left→right along the group's right
|
|
82
|
+
* axis.
|
|
83
|
+
*
|
|
84
|
+
* @capability formation-line line (abreast) slot generator for group destinations
|
|
85
|
+
* @consumer squad movement — line formation sample policy for {@link placeFormation}
|
|
86
|
+
*/
|
|
87
|
+
export declare function lineFormation(options: LineFormationOptions): FormationSlotGenerator;
|
|
88
|
+
/** Options for {@link boxFormation}. */
|
|
89
|
+
export interface BoxFormationOptions {
|
|
90
|
+
/** Gap between adjacent members along both axes (world units). */
|
|
91
|
+
spacing: number;
|
|
92
|
+
/** Members per row; defaults to a near-square `ceil(sqrt(count))`. */
|
|
93
|
+
columns?: number;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* A rectangular grid centered on the destination, front row toward `+forward` —
|
|
97
|
+
* a marching block or a phalanx. Rows fill front-to-back, left-to-right.
|
|
98
|
+
*
|
|
99
|
+
* @capability formation-box box/grid slot generator for group destinations
|
|
100
|
+
* @consumer squad movement — box formation sample policy for {@link placeFormation}
|
|
101
|
+
*/
|
|
102
|
+
export declare function boxFormation(options: BoxFormationOptions): FormationSlotGenerator;
|
|
103
|
+
/** Options for {@link wedgeFormation}. */
|
|
104
|
+
export interface WedgeFormationOptions {
|
|
105
|
+
/** Gap between successive ranks along each arm (world units). */
|
|
106
|
+
spacing: number;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* A "V"/arrowhead with the apex at the destination and arms trailing back — a
|
|
110
|
+
* flying-wedge charge or a goose skein. Slot 0 is the tip; later slots alternate
|
|
111
|
+
* right then left, each rank stepping one `spacing` outward and backward.
|
|
112
|
+
*
|
|
113
|
+
* @capability formation-wedge wedge/arrowhead slot generator for group destinations
|
|
114
|
+
* @consumer squad movement — wedge formation sample policy for {@link placeFormation}
|
|
115
|
+
*/
|
|
116
|
+
export declare function wedgeFormation(options: WedgeFormationOptions): FormationSlotGenerator;
|
|
117
|
+
/** Options for {@link circleFormation}. */
|
|
118
|
+
export interface CircleFormationOptions {
|
|
119
|
+
/** Ring radius from the destination center (world units). */
|
|
120
|
+
radius: number;
|
|
121
|
+
/**
|
|
122
|
+
* Start angle offset (radians) around the ring; default `0` places slot 0
|
|
123
|
+
* directly forward. Angles advance counterclockwise.
|
|
124
|
+
*/
|
|
125
|
+
startAngle?: number;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* An evenly spaced ring around the destination — a guard cordon, a huddle, or a
|
|
129
|
+
* surround. Slot 0 sits `startAngle` from forward; slots advance evenly around
|
|
130
|
+
* the circle.
|
|
131
|
+
*
|
|
132
|
+
* @capability formation-circle ring/cordon slot generator for group destinations
|
|
133
|
+
* @consumer squad/crowd movement — circle formation sample policy for {@link placeFormation}
|
|
134
|
+
*/
|
|
135
|
+
export declare function circleFormation(options: CircleFormationOptions): FormationSlotGenerator;
|