@jgengine/core 0.10.0 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +39 -2
- package/LICENSE +203 -661
- package/README.md +1 -1
- package/dist/ai/crowd.d.ts +55 -0
- package/dist/ai/crowd.js +114 -0
- package/dist/ai/flock.d.ts +5 -2
- package/dist/ai/flock.js +5 -2
- package/dist/ai/groupAssist.d.ts +1 -0
- package/dist/ai/groupAssist.js +1 -0
- package/dist/ai/heatSystem.d.ts +76 -0
- package/dist/ai/heatSystem.js +97 -0
- package/dist/ai/interestScheduler.d.ts +107 -0
- package/dist/ai/interestScheduler.js +118 -0
- package/dist/ai/jobBoard.d.ts +1 -0
- package/dist/ai/jobBoard.js +1 -0
- package/dist/ai/laneSelect.d.ts +5 -2
- package/dist/ai/laneSelect.js +5 -2
- package/dist/ai/mobBrain.d.ts +1 -0
- package/dist/ai/mobBrain.js +1 -0
- package/dist/ai/populationDirector.d.ts +103 -0
- package/dist/ai/populationDirector.js +190 -0
- package/dist/ai/pursuit.d.ts +56 -0
- package/dist/ai/pursuit.js +53 -0
- package/dist/ai/spawnDirector.d.ts +7 -2
- package/dist/ai/spawnDirector.js +18 -15
- package/dist/ai/spawnPoint.d.ts +3 -1
- package/dist/ai/spawnPoint.js +3 -1
- package/dist/ai/targetAcquisition.d.ts +84 -0
- package/dist/ai/targetAcquisition.js +92 -0
- package/dist/anim/easing.d.ts +19 -0
- package/dist/anim/easing.js +19 -0
- package/dist/anim/oscillator.d.ts +12 -0
- package/dist/anim/oscillator.js +25 -0
- package/dist/area/areaEffectField.d.ts +127 -0
- package/dist/area/areaEffectField.js +175 -0
- package/dist/area/stackPolicy.d.ts +47 -0
- package/dist/area/stackPolicy.js +99 -0
- package/dist/authoring.d.ts +2 -1
- package/dist/authoring.js +2 -1
- package/dist/board/laneBoard.d.ts +13 -0
- package/dist/board/laneBoard.js +13 -0
- package/dist/board/timelineBoard.d.ts +10 -0
- package/dist/board/timelineBoard.js +10 -0
- package/dist/combat/abilityKit.d.ts +18 -0
- package/dist/combat/abilityKit.js +24 -9
- package/dist/combat/animationState.d.ts +5 -0
- package/dist/combat/animationState.js +5 -0
- package/dist/combat/breakMeters.d.ts +10 -0
- package/dist/combat/breakMeters.js +10 -0
- package/dist/combat/castRunner.d.ts +5 -0
- package/dist/combat/castRunner.js +5 -0
- package/dist/combat/comboPoints.d.ts +5 -0
- package/dist/combat/comboPoints.js +5 -0
- package/dist/combat/comboString.d.ts +5 -0
- package/dist/combat/comboString.js +5 -0
- package/dist/combat/damageInterceptors.d.ts +192 -0
- package/dist/combat/damageInterceptors.js +251 -0
- package/dist/combat/damageMatchup.d.ts +68 -0
- package/dist/combat/damageMatchup.js +42 -0
- package/dist/combat/damageResolution.d.ts +63 -0
- package/dist/combat/damageResolution.js +50 -0
- package/dist/combat/death.d.ts +7 -1
- package/dist/combat/death.js +5 -0
- package/dist/combat/deathReason.d.ts +14 -0
- package/dist/combat/deathReason.js +1 -0
- package/dist/combat/defensiveWindow.d.ts +5 -0
- package/dist/combat/defensiveWindow.js +5 -0
- package/dist/combat/dotField.d.ts +5 -1
- package/dist/combat/dotField.js +5 -1
- package/dist/combat/downed.d.ts +5 -0
- package/dist/combat/downed.js +5 -0
- package/dist/combat/effects.d.ts +5 -0
- package/dist/combat/effects.js +5 -0
- package/dist/combat/encounterSequence.d.ts +258 -0
- package/dist/combat/encounterSequence.js +426 -0
- package/dist/combat/hitReaction.d.ts +57 -1
- package/dist/combat/hitReaction.js +45 -5
- package/dist/combat/magazine.d.ts +54 -0
- package/dist/combat/magazine.js +96 -0
- package/dist/combat/projectiles.d.ts +5 -0
- package/dist/combat/projectiles.js +32 -14
- package/dist/combat/receivedDamage.d.ts +117 -0
- package/dist/combat/receivedDamage.js +92 -0
- package/dist/combat/regenShield.d.ts +5 -1
- package/dist/combat/regenShield.js +5 -1
- package/dist/combat/renderCues.d.ts +51 -0
- package/dist/combat/renderCues.js +44 -0
- package/dist/combat/resourcePool.d.ts +5 -0
- package/dist/combat/resourcePool.js +5 -0
- package/dist/combat/rewardAllocation.d.ts +121 -0
- package/dist/combat/rewardAllocation.js +251 -0
- package/dist/combat/shotOrigin.d.ts +18 -1
- package/dist/combat/shotOrigin.js +39 -0
- package/dist/combat/statusApplication.d.ts +96 -0
- package/dist/combat/statusApplication.js +81 -0
- package/dist/combat/telegraph.d.ts +11 -2
- package/dist/combat/telegraph.js +11 -2
- package/dist/combat/thresholdCrossings.d.ts +85 -0
- package/dist/combat/thresholdCrossings.js +116 -0
- package/dist/combat.d.ts +35 -0
- package/dist/combat.js +35 -0
- package/dist/commands/commandRegistry.d.ts +11 -0
- package/dist/commands/commandRegistry.js +9 -2
- package/dist/crafting/crop.d.ts +18 -0
- package/dist/crafting/crop.js +18 -0
- package/dist/crafting/production.d.ts +5 -0
- package/dist/crafting/production.js +5 -0
- package/dist/devtools/controls.d.ts +38 -0
- package/dist/devtools/controls.js +181 -0
- package/dist/devtools/devtools.d.ts +5 -197
- package/dist/devtools/devtools.js +38 -774
- package/dist/devtools/discover.d.ts +32 -0
- package/dist/devtools/discover.js +240 -0
- package/dist/devtools/fallbackSeams.d.ts +50 -0
- package/dist/devtools/fallbackSeams.js +111 -0
- package/dist/devtools/frame.d.ts +15 -0
- package/dist/devtools/frame.js +247 -0
- package/dist/devtools/logs.d.ts +15 -0
- package/dist/devtools/logs.js +86 -0
- package/dist/devtools/overrides.d.ts +16 -0
- package/dist/devtools/overrides.js +66 -0
- package/dist/devtools/rewriteTunables.d.ts +17 -0
- package/dist/devtools/rewriteTunables.js +276 -0
- package/dist/devtools/saveEndpoint.d.ts +46 -0
- package/dist/devtools/saveEndpoint.js +48 -0
- package/dist/devtools/transformTunables.d.ts +3 -0
- package/dist/devtools/transformTunables.js +3 -0
- package/dist/devtools/tunableSchema.d.ts +31 -0
- package/dist/devtools/tunableSchema.js +31 -0
- package/dist/devtools/types.d.ts +212 -0
- package/dist/devtools/types.js +1 -0
- package/dist/economy/auctionBook.d.ts +122 -0
- package/dist/economy/auctionBook.js +213 -0
- package/dist/economy/currency.d.ts +12 -1
- package/dist/economy/currency.js +12 -1
- package/dist/economy/listingBook.d.ts +91 -0
- package/dist/economy/listingBook.js +144 -0
- package/dist/economy/priceHistory.d.ts +44 -0
- package/dist/economy/priceHistory.js +89 -0
- package/dist/economy/resourceLedger.d.ts +222 -0
- package/dist/economy/resourceLedger.js +353 -0
- package/dist/economy/sharedWallet.d.ts +14 -0
- package/dist/economy/sharedWallet.js +14 -0
- package/dist/economy/techTree.d.ts +12 -0
- package/dist/economy/techTree.js +12 -0
- package/dist/economy/unlockPoints.d.ts +92 -0
- package/dist/economy/unlockPoints.js +103 -0
- package/dist/economy/wallet.d.ts +26 -2
- package/dist/economy/wallet.js +35 -6
- package/dist/editor/commandApply.d.ts +5 -0
- package/dist/editor/commandApply.js +755 -0
- package/dist/editor/commands.d.ts +235 -7
- package/dist/editor/commands.js +82 -124
- package/dist/editor/directives.d.ts +94 -0
- package/dist/editor/directives.js +206 -0
- package/dist/editor/document.d.ts +194 -13
- package/dist/editor/document.js +1166 -19
- package/dist/editor/entityCatalog.d.ts +42 -0
- package/dist/editor/entityCatalog.js +101 -0
- package/dist/editor/environment.d.ts +74 -0
- package/dist/editor/environment.js +169 -0
- package/dist/editor/grid.d.ts +229 -0
- package/dist/editor/grid.js +366 -0
- package/dist/editor/gridAdapters.d.ts +80 -0
- package/dist/editor/gridAdapters.js +134 -0
- package/dist/editor/index.d.ts +98 -6
- package/dist/editor/index.js +13 -2
- package/dist/editor/liveSync.d.ts +127 -0
- package/dist/editor/liveSync.js +249 -0
- package/dist/editor/minimap.d.ts +31 -0
- package/dist/editor/minimap.js +73 -0
- package/dist/editor/runtimeInspector.d.ts +88 -0
- package/dist/editor/runtimeInspector.js +239 -0
- package/dist/editor/streamer.d.ts +66 -0
- package/dist/editor/streamer.js +68 -0
- package/dist/editor/types.d.ts +250 -1
- package/dist/editor/world.d.ts +136 -0
- package/dist/editor/world.js +303 -0
- package/dist/faction/reputation.d.ts +5 -0
- package/dist/faction/reputation.js +5 -0
- package/dist/format/distance.d.ts +17 -0
- package/dist/format/distance.js +18 -0
- package/dist/format/duration.d.ts +27 -0
- package/dist/format/duration.js +45 -0
- package/dist/format/speed.d.ts +17 -0
- package/dist/format/speed.js +25 -0
- package/dist/game/breeding.d.ts +161 -0
- package/dist/game/breeding.js +181 -0
- package/dist/game/cameraConfig.d.ts +451 -0
- package/dist/game/cameraConfig.js +1 -0
- package/dist/game/connectedPlayers.d.ts +6 -4
- package/dist/game/connectedPlayers.js +2 -2
- package/dist/game/cosmetics.d.ts +9 -0
- package/dist/game/cosmetics.js +16 -0
- package/dist/game/defineGame.d.ts +110 -5
- package/dist/game/defineGame.js +49 -4
- package/dist/game/defineSystem.d.ts +90 -0
- package/dist/game/defineSystem.js +47 -0
- package/dist/game/dialogue.d.ts +33 -0
- package/dist/game/dialogue.js +21 -0
- package/dist/game/events.d.ts +63 -13
- package/dist/game/events.js +5 -0
- package/dist/game/feed.d.ts +33 -0
- package/dist/game/feed.js +35 -2
- package/dist/game/gamePhase.d.ts +11 -0
- package/dist/game/gamePhase.js +16 -0
- package/dist/game/leaderboard.d.ts +5 -0
- package/dist/game/leaderboard.js +5 -0
- package/dist/game/loadout.d.ts +5 -0
- package/dist/game/loadout.js +5 -0
- package/dist/game/lootFilter.d.ts +2 -0
- package/dist/game/lootFilter.js +2 -0
- package/dist/game/lootPipeline.d.ts +164 -0
- package/dist/game/lootPipeline.js +216 -0
- package/dist/game/lootTable.d.ts +19 -2
- package/dist/game/lootTable.js +15 -5
- package/dist/game/objectives.d.ts +43 -0
- package/dist/game/objectives.js +36 -0
- package/dist/game/paramLayers.d.ts +148 -0
- package/dist/game/paramLayers.js +185 -0
- package/dist/game/ping.d.ts +5 -0
- package/dist/game/ping.js +5 -0
- package/dist/game/playableGame.d.ts +116 -432
- package/dist/game/playableGame.js +1 -1
- package/dist/game/progression.d.ts +35 -0
- package/dist/game/progression.js +19 -0
- package/dist/game/quest.d.ts +8 -0
- package/dist/game/quest.js +30 -3
- package/dist/game/race.d.ts +141 -0
- package/dist/game/race.js +169 -0
- package/dist/game/recordBook.d.ts +3 -1
- package/dist/game/recordBook.js +4 -1
- package/dist/game/ruleSelection.d.ts +75 -0
- package/dist/game/ruleSelection.js +127 -0
- package/dist/game/runDraft.d.ts +5 -0
- package/dist/game/runDraft.js +5 -0
- package/dist/game/saveStore.d.ts +111 -0
- package/dist/game/saveStore.js +312 -0
- package/dist/game/snapshotHistory.d.ts +67 -0
- package/dist/game/snapshotHistory.js +95 -0
- package/dist/game/social.d.ts +38 -1
- package/dist/game/social.js +71 -0
- package/dist/game/spawnPoints.d.ts +5 -0
- package/dist/game/spawnPoints.js +5 -0
- package/dist/game/systemRuntime.d.ts +50 -0
- package/dist/game/systemRuntime.js +157 -0
- package/dist/game/systemSchedule.d.ts +72 -0
- package/dist/game/systemSchedule.js +242 -0
- package/dist/game/toasts.d.ts +43 -0
- package/dist/game/toasts.js +44 -0
- package/dist/game/trade.d.ts +10 -0
- package/dist/game/trade.js +10 -0
- package/dist/game/tribe.d.ts +184 -0
- package/dist/game/tribe.js +432 -0
- package/dist/game/unlocks.d.ts +8 -0
- package/dist/game/unlocks.js +16 -0
- package/dist/game/vfxInstance.d.ts +138 -0
- package/dist/game/vfxInstance.js +96 -0
- package/dist/game/worldItem.d.ts +17 -4
- package/dist/game/worldItem.js +17 -4
- package/dist/gameplay.d.ts +93 -0
- package/dist/gameplay.js +93 -0
- package/dist/index.d.ts +5 -14
- package/dist/index.js +5 -14
- package/dist/input/actionBindings.d.ts +23 -6
- package/dist/input/actionBindings.js +23 -6
- package/dist/input/axisInput.d.ts +7 -2
- package/dist/input/axisInput.js +7 -2
- package/dist/input/controlGroups.d.ts +67 -0
- package/dist/input/controlGroups.js +41 -0
- package/dist/input/touchScheme.d.ts +82 -6
- package/dist/input/touchScheme.js +123 -10
- package/dist/interaction/lockpick.d.ts +61 -0
- package/dist/interaction/lockpick.js +168 -0
- package/dist/interaction/proximityPrompt.d.ts +2 -0
- package/dist/interaction/proximityPrompt.js +2 -0
- package/dist/interaction/qte.d.ts +5 -0
- package/dist/interaction/qte.js +5 -0
- package/dist/interaction/skillCheck.d.ts +5 -0
- package/dist/interaction/skillCheck.js +5 -0
- package/dist/inventory/encumbrance.d.ts +69 -0
- package/dist/inventory/encumbrance.js +68 -0
- package/dist/inventory/inventoryModel.d.ts +12 -0
- package/dist/inventory/inventoryModel.js +12 -0
- package/dist/inventory/shapedGrid.d.ts +16 -0
- package/dist/inventory/shapedGrid.js +16 -0
- package/dist/inventory/slotModel.d.ts +10 -0
- package/dist/inventory/slotModel.js +10 -0
- package/dist/item/durability.d.ts +5 -0
- package/dist/item/durability.js +6 -3
- package/dist/item/itemIdentity.d.ts +171 -0
- package/dist/item/itemIdentity.js +138 -0
- package/dist/item/itemInstanceRegistry.d.ts +32 -0
- package/dist/item/itemInstanceRegistry.js +34 -0
- package/dist/item/itemgen.d.ts +163 -0
- package/dist/item/itemgen.js +151 -0
- package/dist/item/modularItem.d.ts +5 -0
- package/dist/item/modularItem.js +5 -0
- package/dist/item/use.d.ts +5 -0
- package/dist/item/use.js +5 -0
- package/dist/item/useBehavior.d.ts +142 -0
- package/dist/item/useBehavior.js +105 -0
- package/dist/item/weapon.d.ts +5 -0
- package/dist/item/weapon.js +5 -0
- package/dist/math/scalar.d.ts +25 -0
- package/dist/math/scalar.js +47 -0
- package/dist/meta/changelog.d.ts +4 -1
- package/dist/meta/changelog.js +39 -2
- package/dist/movement/avoidance.d.ts +45 -0
- package/dist/movement/avoidance.js +123 -0
- package/dist/movement/cameraRig.d.ts +8 -0
- package/dist/movement/cameraRig.js +8 -0
- package/dist/movement/dash.d.ts +11 -0
- package/dist/movement/dash.js +11 -0
- package/dist/movement/formation.d.ts +135 -0
- package/dist/movement/formation.js +194 -0
- package/dist/movement/glideModel.d.ts +5 -0
- package/dist/movement/glideModel.js +5 -0
- package/dist/movement/grappleSwing.d.ts +5 -0
- package/dist/movement/grappleSwing.js +5 -0
- package/dist/movement/leaderTrail.d.ts +5 -0
- package/dist/movement/leaderTrail.js +5 -0
- package/dist/movement/movementModel.d.ts +50 -9
- package/dist/movement/movementModel.js +75 -29
- package/dist/movement/playerMovement.js +167 -12
- package/dist/movement/poseState.d.ts +13 -0
- package/dist/movement/poseState.js +16 -0
- package/dist/movement/steering.d.ts +8 -0
- package/dist/movement/steering.js +18 -0
- package/dist/multiplayer/combatSnapshot.d.ts +3 -0
- package/dist/multiplayer/combatSnapshot.js +16 -8
- package/dist/multiplayer/lagCompensation.d.ts +5 -0
- package/dist/multiplayer/lagCompensation.js +5 -0
- package/dist/multiplayer/presenceModel.d.ts +11 -1
- package/dist/multiplayer/presenceModel.js +17 -1
- package/dist/multiplayer/simultaneousCommit.d.ts +3 -0
- package/dist/multiplayer/simultaneousCommit.js +3 -0
- package/dist/multiplayer.d.ts +11 -0
- package/dist/multiplayer.js +11 -0
- package/dist/nav/pathFollow.d.ts +57 -0
- package/dist/nav/pathFollow.js +109 -0
- package/dist/orders/orderKinds.d.ts +156 -0
- package/dist/orders/orderKinds.js +197 -0
- package/dist/orders/orderQueue.d.ts +208 -0
- package/dist/orders/orderQueue.js +211 -0
- package/dist/physics/drivableVehicle.d.ts +31 -0
- package/dist/physics/drivableVehicle.js +16 -0
- package/dist/physics/flightDynamics.d.ts +82 -0
- package/dist/physics/flightDynamics.js +165 -0
- package/dist/physics/gravityField.d.ts +25 -0
- package/dist/physics/gravityField.js +41 -0
- package/dist/physics/kinematicVehicle.d.ts +108 -1
- package/dist/physics/kinematicVehicle.js +212 -15
- package/dist/physics/physicsWorld.d.ts +50 -12
- package/dist/physics/physicsWorld.js +120 -122
- package/dist/physics/radialImpulse.d.ts +25 -0
- package/dist/physics/radialImpulse.js +27 -0
- package/dist/physics/vehicleObstacles.d.ts +44 -0
- package/dist/physics/vehicleObstacles.js +115 -0
- package/dist/procedural.d.ts +3 -0
- package/dist/procedural.js +3 -0
- package/dist/progression/statGraph.d.ts +116 -0
- package/dist/progression/statGraph.js +318 -0
- package/dist/puzzle/cellGrid.d.ts +9 -0
- package/dist/puzzle/cellGrid.js +9 -0
- package/dist/puzzle/fallingPiece.d.ts +9 -0
- package/dist/puzzle/fallingPiece.js +9 -0
- package/dist/puzzle/nonogram.d.ts +39 -0
- package/dist/puzzle/nonogram.js +136 -0
- package/dist/random/nameGen.d.ts +5 -0
- package/dist/random/nameGen.js +5 -0
- package/dist/random/pick.d.ts +8 -0
- package/dist/random/pick.js +31 -0
- package/dist/random/rng.d.ts +26 -1
- package/dist/random/rng.js +32 -9
- package/dist/random/seedLink.d.ts +4 -0
- package/dist/random/seedLink.js +4 -0
- package/dist/relation/keyedValues.d.ts +54 -0
- package/dist/relation/keyedValues.js +115 -0
- package/dist/relation/thresholds.d.ts +62 -0
- package/dist/relation/thresholds.js +62 -0
- package/dist/render/color.d.ts +12 -0
- package/dist/render/color.js +26 -0
- package/dist/render/lookPreset.d.ts +41 -0
- package/dist/render/lookPreset.js +29 -0
- package/dist/render/postProcessing.d.ts +20 -0
- package/dist/render/postProcessing.js +21 -1
- package/dist/rules/predicate.d.ts +53 -0
- package/dist/rules/predicate.js +64 -0
- package/dist/rules/ruleEffects.d.ts +38 -0
- package/dist/rules/ruleEffects.js +37 -0
- package/dist/rules/triggeredRules.d.ts +160 -0
- package/dist/rules/triggeredRules.js +241 -0
- package/dist/runtime/adapter.d.ts +55 -3
- package/dist/runtime/adapter.js +57 -1
- package/dist/runtime/cameraDirector.d.ts +1 -0
- package/dist/runtime/cameraDirector.js +1 -0
- package/dist/runtime/commandRunner.d.ts +1 -0
- package/dist/runtime/commandRunner.js +1 -0
- package/dist/runtime/context/combat.d.ts +51 -0
- package/dist/runtime/context/combat.js +130 -0
- package/dist/runtime/context/combatFx.d.ts +23 -0
- package/dist/runtime/context/combatFx.js +161 -0
- package/dist/runtime/context/deathLoot.d.ts +30 -0
- package/dist/runtime/context/deathLoot.js +39 -0
- package/dist/runtime/context/player.d.ts +48 -0
- package/dist/runtime/context/player.js +125 -0
- package/dist/runtime/context/registries.d.ts +13 -0
- package/dist/runtime/context/registries.js +84 -0
- package/dist/runtime/context/scene.d.ts +59 -0
- package/dist/runtime/context/scene.js +291 -0
- package/dist/runtime/context/snapshotCodecs.d.ts +12 -0
- package/dist/runtime/context/snapshotCodecs.js +26 -0
- package/dist/runtime/context/worldItems.d.ts +21 -0
- package/dist/runtime/context/worldItems.js +37 -0
- package/dist/runtime/descriptors/baseline.d.ts +48 -0
- package/dist/runtime/descriptors/baseline.js +157 -0
- package/dist/runtime/descriptors/features.d.ts +79 -0
- package/dist/runtime/descriptors/features.js +299 -0
- package/dist/runtime/gameContext.d.ts +2 -327
- package/dist/runtime/gameContext.js +273 -778
- package/dist/runtime/gameContextTypes.d.ts +467 -0
- package/dist/runtime/gameContextTypes.js +1 -0
- package/dist/runtime/gameRuntime.d.ts +1 -0
- package/dist/runtime/gameRuntime.js +1 -0
- package/dist/runtime/headlessRunner.d.ts +62 -0
- package/dist/runtime/headlessRunner.js +45 -0
- package/dist/runtime/hostPersistence.d.ts +12 -0
- package/dist/runtime/hostPersistence.js +12 -0
- package/dist/runtime/hostPolicy.d.ts +51 -0
- package/dist/runtime/hostPolicy.js +68 -0
- package/dist/runtime/hostedGameRunner.d.ts +11 -4
- package/dist/runtime/hostedGameRunner.js +27 -3
- package/dist/runtime/hostedWorldSession.d.ts +15 -5
- package/dist/runtime/hostedWorldSession.js +12 -4
- package/dist/runtime/inputSnapshot.d.ts +8 -3
- package/dist/runtime/inputSnapshot.js +6 -2
- package/dist/runtime/motionIntents.d.ts +11 -2
- package/dist/runtime/motionIntents.js +16 -2
- package/dist/runtime/perContext.d.ts +15 -0
- package/dist/runtime/perContext.js +21 -0
- package/dist/runtime/runtimeSave.d.ts +79 -0
- package/dist/runtime/runtimeSave.js +105 -0
- package/dist/runtime/save.d.ts +4 -0
- package/dist/runtime/save.js +4 -0
- package/dist/runtime/snapshot.d.ts +7 -0
- package/dist/runtime/snapshot.js +7 -0
- package/dist/runtime/visibility.d.ts +2 -1
- package/dist/runtime/visibility.js +2 -1
- package/dist/runtime/worldChannel.d.ts +7 -3
- package/dist/runtime/worldChannel.js +51 -6
- package/dist/runtime/worldMirror.d.ts +14 -2
- package/dist/runtime/worldMirror.js +15 -2
- package/dist/runtime/worldProjection.d.ts +47 -0
- package/dist/runtime/worldProjection.js +52 -0
- package/dist/runtime/worldReplication.d.ts +30 -7
- package/dist/runtime/worldReplication.js +41 -9
- package/dist/runtime/worldSnapshot.d.ts +42 -3
- package/dist/runtime/worldSnapshot.js +34 -7
- package/dist/scene/assetCatalog.d.ts +26 -0
- package/dist/scene/assetCatalog.js +4 -0
- package/dist/scene/assetDiagnostics.d.ts +69 -0
- package/dist/scene/assetDiagnostics.js +110 -0
- package/dist/scene/assetGenerator.d.ts +65 -0
- package/dist/scene/assetGenerator.js +64 -0
- package/dist/scene/assetSpace.d.ts +137 -0
- package/dist/scene/assetSpace.js +257 -0
- package/dist/scene/authoredTriggers.d.ts +219 -0
- package/dist/scene/authoredTriggers.js +454 -0
- package/dist/scene/behaviorRuntime.d.ts +75 -0
- package/dist/scene/behaviorRuntime.js +217 -0
- package/dist/scene/behaviors.d.ts +14 -2
- package/dist/scene/behaviors.js +7 -2
- package/dist/scene/bodyBind.d.ts +60 -0
- package/dist/scene/bodyBind.js +51 -0
- package/dist/scene/builtinSceneKinds.d.ts +5 -0
- package/dist/scene/builtinSceneKinds.js +67 -0
- package/dist/scene/colliders.d.ts +71 -1
- package/dist/scene/colliders.js +145 -1
- package/dist/scene/collisionMesh.d.ts +94 -0
- package/dist/scene/collisionMesh.js +699 -0
- package/dist/scene/companion.d.ts +147 -0
- package/dist/scene/companion.js +193 -0
- package/dist/scene/entityStats.d.ts +18 -11
- package/dist/scene/entityStats.js +21 -16
- package/dist/scene/entityStore.d.ts +12 -1
- package/dist/scene/entityStore.js +15 -0
- package/dist/scene/facing.d.ts +18 -0
- package/dist/scene/facing.js +26 -0
- package/dist/scene/modelSockets.d.ts +33 -0
- package/dist/scene/modelSockets.js +29 -0
- package/dist/scene/objectQuery.d.ts +2 -0
- package/dist/scene/objectQuery.js +2 -0
- package/dist/scene/objectStore.d.ts +4 -0
- package/dist/scene/objectStore.js +6 -0
- package/dist/scene/possession.d.ts +8 -0
- package/dist/scene/possession.js +14 -0
- package/dist/scene/roster.d.ts +3 -0
- package/dist/scene/roster.js +12 -0
- package/dist/scene/sceneKinds.d.ts +256 -0
- package/dist/scene/sceneKinds.js +218 -0
- package/dist/scene/sceneOwnership.d.ts +169 -0
- package/dist/scene/sceneOwnership.js +179 -0
- package/dist/scene/sceneRaycast.js +15 -0
- package/dist/scene/selectionBookmarks.d.ts +93 -0
- package/dist/scene/selectionBookmarks.js +122 -0
- package/dist/scene/vehicleSeat.d.ts +68 -0
- package/dist/scene/vehicleSeat.js +59 -0
- package/dist/sensor/concealment.d.ts +3 -0
- package/dist/sensor/concealment.js +3 -0
- package/dist/sensor/freezeMonitor.d.ts +1 -0
- package/dist/sensor/freezeMonitor.js +1 -0
- package/dist/sensor/frustumSensor.d.ts +7 -3
- package/dist/sensor/frustumSensor.js +7 -3
- package/dist/sensor/hiddenStateProbe.d.ts +5 -2
- package/dist/sensor/hiddenStateProbe.js +5 -2
- package/dist/sensor/recordingBuffer.d.ts +2 -1
- package/dist/sensor/recordingBuffer.js +2 -1
- package/dist/sensor/replayLoop.d.ts +6 -2
- package/dist/sensor/replayLoop.js +6 -2
- package/dist/sensor/revealQuery.d.ts +2 -1
- package/dist/sensor/revealQuery.js +2 -1
- package/dist/sensor/visionCone.d.ts +10 -3
- package/dist/sensor/visionCone.js +10 -3
- package/dist/session/contestedChannel.d.ts +1 -0
- package/dist/session/contestedChannel.js +1 -0
- package/dist/session/extraction.d.ts +1 -0
- package/dist/session/extraction.js +1 -0
- package/dist/session/roles.d.ts +6 -0
- package/dist/session/roles.js +6 -0
- package/dist/session/roundState.d.ts +8 -0
- package/dist/session/roundState.js +2 -0
- package/dist/settings/settingsModel.d.ts +1 -0
- package/dist/settings/settingsModel.js +1 -0
- package/dist/stats/accumulatorMeter.d.ts +6 -0
- package/dist/stats/accumulatorMeter.js +6 -0
- package/dist/stats/eventMeter.d.ts +5 -0
- package/dist/stats/eventMeter.js +5 -0
- package/dist/stats/rollCheck.d.ts +5 -0
- package/dist/stats/rollCheck.js +5 -0
- package/dist/stats/spawnLevelStats.d.ts +110 -0
- package/dist/stats/spawnLevelStats.js +140 -0
- package/dist/stats/statModifiers.d.ts +5 -0
- package/dist/stats/statModifiers.js +5 -0
- package/dist/stats/statPool.d.ts +70 -0
- package/dist/stats/statPool.js +59 -0
- package/dist/store/changeSignal.d.ts +3 -0
- package/dist/store/changeSignal.js +2 -0
- package/dist/store/defineKeyedStore.d.ts +38 -0
- package/dist/store/defineKeyedStore.js +42 -0
- package/dist/store/defineStore.d.ts +33 -0
- package/dist/store/defineStore.js +35 -0
- package/dist/store/observableKeyedStore.d.ts +7 -0
- package/dist/store/observableKeyedStore.js +35 -2
- package/dist/survival/decayMeter.d.ts +55 -0
- package/dist/survival/decayMeter.js +130 -57
- package/dist/survival/moodle.d.ts +2 -0
- package/dist/survival/regionHealth.d.ts +6 -0
- package/dist/survival/regionHealth.js +6 -3
- package/dist/tactics/fallingGrid.d.ts +4 -2
- package/dist/tactics/fallingGrid.js +4 -2
- package/dist/tactics/predictiveQuery.d.ts +3 -0
- package/dist/tactics/predictiveQuery.js +3 -0
- package/dist/tactics/snapshot.d.ts +2 -0
- package/dist/tactics/snapshot.js +2 -0
- package/dist/tactics/surface.d.ts +1 -0
- package/dist/tactics/surface.js +1 -0
- package/dist/tactics/tacticalGrid.d.ts +1 -0
- package/dist/tactics/tacticalGrid.js +1 -0
- package/dist/time/beatClock.d.ts +14 -4
- package/dist/time/beatClock.js +14 -4
- package/dist/time/calendarClock.d.ts +3 -0
- package/dist/time/calendarClock.js +3 -0
- package/dist/time/idleProgress.d.ts +4 -0
- package/dist/time/idleProgress.js +4 -0
- package/dist/time/simClock.d.ts +2 -0
- package/dist/time/simClock.js +20 -5
- package/dist/ui/actionModel.d.ts +110 -0
- package/dist/ui/actionModel.js +159 -0
- package/dist/ui/gameLayout.d.ts +30 -11
- package/dist/ui/gameLayout.js +30 -11
- package/dist/ui/hudDocument.d.ts +114 -0
- package/dist/ui/hudDocument.js +220 -0
- package/dist/ui/hudLayout.d.ts +38 -1
- package/dist/ui/hudLayout.js +220 -17
- package/dist/ui/selectionModel.d.ts +92 -0
- package/dist/ui/selectionModel.js +88 -0
- package/dist/ui/tooltipModel.d.ts +63 -0
- package/dist/ui/tooltipModel.js +82 -0
- package/dist/ui.d.ts +15 -0
- package/dist/ui.js +15 -0
- package/dist/visibility/bounds.d.ts +8 -1
- package/dist/visibility/bounds.js +8 -1
- package/dist/visibility/frustum.d.ts +12 -3
- package/dist/visibility/frustum.js +12 -3
- package/dist/work/jobQueue.d.ts +201 -0
- package/dist/work/jobQueue.js +253 -0
- package/dist/work/unitTraining.d.ts +58 -0
- package/dist/work/unitTraining.js +52 -0
- package/dist/world/authoredEntities.d.ts +29 -0
- package/dist/world/authoredEntities.js +29 -0
- package/dist/world/authoredObjects.d.ts +72 -0
- package/dist/world/authoredObjects.js +81 -0
- package/dist/world/authoredSpawn.d.ts +39 -0
- package/dist/world/authoredSpawn.js +37 -0
- package/dist/world/buildSockets.d.ts +152 -0
- package/dist/world/buildSockets.js +188 -0
- package/dist/world/buildingGenerator.d.ts +18 -0
- package/dist/world/buildingGenerator.js +62 -0
- package/dist/world/buildings.d.ts +5 -0
- package/dist/world/buildings.js +5 -0
- package/dist/world/catenary.d.ts +22 -0
- package/dist/world/catenary.js +69 -0
- package/dist/world/cityBlocks.d.ts +152 -0
- package/dist/world/cityBlocks.js +670 -0
- package/dist/world/cityContent.d.ts +77 -0
- package/dist/world/cityContent.js +261 -0
- package/dist/world/cityGeometry.d.ts +114 -0
- package/dist/world/cityGeometry.js +573 -0
- package/dist/world/cityKind.d.ts +314 -0
- package/dist/world/cityKind.js +1578 -0
- package/dist/world/features.d.ts +133 -10
- package/dist/world/features.js +66 -6
- package/dist/world/footprintGrid.d.ts +59 -0
- package/dist/world/footprintGrid.js +141 -0
- package/dist/world/geometry.d.ts +64 -0
- package/dist/world/geometry.js +94 -0
- package/dist/world/grassKind.d.ts +51 -0
- package/dist/world/grassKind.js +101 -0
- package/dist/world/markers.d.ts +50 -4
- package/dist/world/markers.js +49 -0
- package/dist/world/massing.js +1 -1
- package/dist/world/minimapBake.d.ts +78 -0
- package/dist/world/minimapBake.js +208 -0
- package/dist/world/minimapTrack.d.ts +17 -0
- package/dist/world/minimapTrack.js +22 -0
- package/dist/world/pathInstances.d.ts +27 -0
- package/dist/world/pathInstances.js +27 -0
- package/dist/world/pathNetwork.d.ts +159 -0
- package/dist/world/pathNetwork.js +684 -0
- package/dist/world/pathTerrain.d.ts +80 -0
- package/dist/world/pathTerrain.js +142 -0
- package/dist/world/place.d.ts +166 -0
- package/dist/world/place.js +96 -0
- package/dist/world/placeAsset.d.ts +81 -0
- package/dist/world/placeAsset.js +79 -0
- package/dist/world/placement.d.ts +4 -0
- package/dist/world/placement.js +4 -0
- package/dist/world/placementController.d.ts +6 -0
- package/dist/world/placementController.js +6 -0
- package/dist/world/poleLineKind.d.ts +40 -0
- package/dist/world/poleLineKind.js +97 -0
- package/dist/world/polyline.d.ts +34 -0
- package/dist/world/polyline.js +88 -0
- package/dist/world/resourceNode.d.ts +109 -0
- package/dist/world/resourceNode.js +140 -0
- package/dist/world/roads.d.ts +8 -0
- package/dist/world/roads.js +38 -0
- package/dist/world/scatter.js +2 -20
- package/dist/world/scatterRegion.d.ts +164 -0
- package/dist/world/scatterRegion.js +409 -0
- package/dist/world/sceneShapes.d.ts +43 -0
- package/dist/world/sceneShapes.js +1 -0
- package/dist/world/segment.d.ts +27 -0
- package/dist/world/segment.js +43 -0
- package/dist/world/soilKind.d.ts +48 -0
- package/dist/world/soilKind.js +92 -0
- package/dist/world/spatialSample.d.ts +241 -0
- package/dist/world/spatialSample.js +465 -0
- package/dist/world/streets.d.ts +29 -0
- package/dist/world/streets.js +55 -0
- package/dist/world/terraform.d.ts +213 -1
- package/dist/world/terraform.js +627 -22
- package/dist/world/terrain.d.ts +164 -20
- package/dist/world/terrain.js +325 -41
- package/dist/world/terrainGuides.d.ts +182 -0
- package/dist/world/terrainGuides.js +343 -0
- package/dist/world/vec2.d.ts +81 -0
- package/dist/world/vec2.js +128 -0
- package/dist/world/vec3.d.ts +49 -0
- package/dist/world/vec3.js +76 -0
- package/dist/world/vegetation.d.ts +71 -0
- package/dist/world/vegetation.js +151 -0
- package/dist/world/visibilityField.d.ts +154 -0
- package/dist/world/visibilityField.js +271 -0
- package/dist/world/volumetricClouds.d.ts +52 -0
- package/dist/world/volumetricClouds.js +43 -0
- package/dist/world/walls.d.ts +9 -0
- package/dist/world/walls.js +9 -0
- package/dist/world/waterKind.d.ts +55 -0
- package/dist/world/waterKind.js +99 -0
- package/dist/world.d.ts +141 -0
- package/dist/world.js +141 -0
- package/package.json +32 -8
- package/skills/game-design/SKILL.md +28 -0
- package/skills/game-design/agents/openai.yaml +4 -0
- package/skills/game-design/references/application-playbook.md +170 -0
- package/skills/game-design/references/field-guide.md +288 -0
- package/skills/jgengine/SKILL.md +54 -0
- package/skills/jgengine/api.md +527 -0
- package/skills/jgengine/capabilities.md +131 -0
- package/skills/jgengine/recipes/minimal-game.md +88 -0
- package/skills/jgengine-combat/SKILL.md +38 -0
- package/skills/jgengine-combat/api.md +585 -0
- package/skills/jgengine-combat/capabilities.md +213 -0
- package/skills/jgengine-combat/recipes/portable-stat-pools.md +122 -0
- package/skills/jgengine-combat/reference.md +108 -0
- package/skills/jgengine-gameplay/SKILL.md +39 -0
- package/skills/jgengine-gameplay/api.md +1920 -0
- package/skills/jgengine-gameplay/capabilities.md +454 -0
- package/skills/jgengine-gameplay/reference-systems.md +56 -0
- package/skills/jgengine-world/SKILL.md +51 -0
- package/skills/jgengine-world/api.md +3056 -0
- package/skills/jgengine-world/capabilities.md +476 -0
- package/skills/jgengine-world/recipes/commanding-entities.md +128 -0
- package/skills/jgengine-world/reference.md +261 -0
- package/dist/cartridge/runtime.d.ts +0 -15
- package/dist/cartridge/runtime.js +0 -556
- package/dist/cartridge/spec.d.ts +0 -188
- package/dist/cartridge/spec.js +0 -19
- package/dist/cartridge/validate.d.ts +0 -2
- package/dist/cartridge/validate.js +0 -78
- package/dist/store/engineStore.d.ts +0 -22
- package/dist/store/engineStore.js +0 -50
- package/dist/store/features.d.ts +0 -10
- package/dist/store/features.js +0 -23
- package/llms.txt +0 -5389
|
@@ -0,0 +1,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;
|
|
@@ -0,0 +1,194 @@
|
|
|
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
|
+
import { yawForward, yawRight } from "./steering.js";
|
|
14
|
+
/**
|
|
15
|
+
* Engine yaw (`rotationY`, radians) that faces from `from` toward `to` on the
|
|
16
|
+
* XZ plane, matching the `forward = (sin yaw, cos yaw)` convention. Feed the
|
|
17
|
+
* result as the `facing` of {@link placeFormation} to orient a formation along
|
|
18
|
+
* its travel direction. Returns `0` when the points coincide.
|
|
19
|
+
*
|
|
20
|
+
* @capability formation-facing group facing yaw from a travel direction on the XZ plane
|
|
21
|
+
* @consumer squad and crowd movement — orient a destination formation along its heading
|
|
22
|
+
*/
|
|
23
|
+
export function facingYaw(from, to) {
|
|
24
|
+
const dx = to[0] - from[0];
|
|
25
|
+
const dz = to[1] - from[1];
|
|
26
|
+
if (dx * dx + dz * dz <= 1e-18)
|
|
27
|
+
return 0;
|
|
28
|
+
return Math.atan2(dx, dz);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Transform a generator's local slot offsets into world XZ positions around a
|
|
32
|
+
* `destination`, rotated by `facing` (engine yaw). Slot `i` in the returned
|
|
33
|
+
* array is `generator(count)[i]` mapped through the group frame, so it stays
|
|
34
|
+
* aligned with {@link assignFormationSlots}' slot indices. Pure and allocation-
|
|
35
|
+
* light: one array of `count` points, no per-call closures retained.
|
|
36
|
+
*
|
|
37
|
+
* @capability formation-placement place a group formation's world slots around a destination
|
|
38
|
+
* @consumer squad/party/convoy movement — generate per-member destination slots around a target
|
|
39
|
+
*/
|
|
40
|
+
export function placeFormation(destination, facing, count, generator) {
|
|
41
|
+
if (count <= 0)
|
|
42
|
+
return [];
|
|
43
|
+
const forward = yawForward(facing);
|
|
44
|
+
const right = yawRight(facing);
|
|
45
|
+
const local = generator(count);
|
|
46
|
+
const slots = [];
|
|
47
|
+
for (let i = 0; i < count; i += 1) {
|
|
48
|
+
const offset = local[i] ?? ZERO;
|
|
49
|
+
const r = offset[0];
|
|
50
|
+
const f = offset[1];
|
|
51
|
+
slots.push([
|
|
52
|
+
destination[0] + right[0] * r + forward[0] * f,
|
|
53
|
+
destination[1] + right[1] * r + forward[1] * f,
|
|
54
|
+
]);
|
|
55
|
+
}
|
|
56
|
+
return slots;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Match `members` to `slots` by a deterministic greedy nearest assignment:
|
|
60
|
+
* every (member, slot) pair is ranked by squared travel distance (minus a
|
|
61
|
+
* stickiness bonus for a member's previous slot) and assigned in order while
|
|
62
|
+
* both ends are free. Returns `assignment[member] = slot`, or `-1` for members
|
|
63
|
+
* left unmatched when there are fewer slots than members. Ties break by member
|
|
64
|
+
* then slot index, so the result is stable across runs and independent of input
|
|
65
|
+
* ordering — the property replay and lockstep multiplayer rely on. Groups are
|
|
66
|
+
* bounded, so the `O(members·slots·log)` sort is fine; this is not a per-frame
|
|
67
|
+
* whole-world pass.
|
|
68
|
+
*
|
|
69
|
+
* @capability formation-assignment stable deterministic member-to-slot matching for a group formation
|
|
70
|
+
* @consumer squad/party movement — assign each member a destination slot with low reshuffle churn
|
|
71
|
+
*/
|
|
72
|
+
export function assignFormationSlots(members, slots, options = {}) {
|
|
73
|
+
const memberCount = members.length;
|
|
74
|
+
const slotCount = slots.length;
|
|
75
|
+
const assignment = new Array(memberCount).fill(-1);
|
|
76
|
+
if (memberCount === 0 || slotCount === 0)
|
|
77
|
+
return assignment;
|
|
78
|
+
const previous = options.previous;
|
|
79
|
+
const stickiness = options.stickiness ?? 0;
|
|
80
|
+
const pairs = [];
|
|
81
|
+
for (let m = 0; m < memberCount; m += 1) {
|
|
82
|
+
const member = members[m];
|
|
83
|
+
const keepSlot = previous?.[m];
|
|
84
|
+
for (let s = 0; s < slotCount; s += 1) {
|
|
85
|
+
const slot = slots[s];
|
|
86
|
+
const dx = slot[0] - member[0];
|
|
87
|
+
const dz = slot[1] - member[1];
|
|
88
|
+
let cost = dx * dx + dz * dz;
|
|
89
|
+
if (stickiness > 0 && keepSlot === s)
|
|
90
|
+
cost -= stickiness;
|
|
91
|
+
pairs.push({ member: m, slot: s, cost });
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
pairs.sort((a, b) => a.cost !== b.cost ? a.cost - b.cost : a.member !== b.member ? a.member - b.member : a.slot - b.slot);
|
|
95
|
+
const slotTaken = new Array(slotCount).fill(false);
|
|
96
|
+
let filled = 0;
|
|
97
|
+
const need = Math.min(memberCount, slotCount);
|
|
98
|
+
for (let p = 0; p < pairs.length && filled < need; p += 1) {
|
|
99
|
+
const pair = pairs[p];
|
|
100
|
+
if (assignment[pair.member] !== -1 || slotTaken[pair.slot])
|
|
101
|
+
continue;
|
|
102
|
+
assignment[pair.member] = pair.slot;
|
|
103
|
+
slotTaken[pair.slot] = true;
|
|
104
|
+
filled += 1;
|
|
105
|
+
}
|
|
106
|
+
return assignment;
|
|
107
|
+
}
|
|
108
|
+
const ZERO = [0, 0];
|
|
109
|
+
/**
|
|
110
|
+
* A single rank abreast, centered on the destination and facing forward — a
|
|
111
|
+
* skirmish line or a chorus row. Slots run left→right along the group's right
|
|
112
|
+
* axis.
|
|
113
|
+
*
|
|
114
|
+
* @capability formation-line line (abreast) slot generator for group destinations
|
|
115
|
+
* @consumer squad movement — line formation sample policy for {@link placeFormation}
|
|
116
|
+
*/
|
|
117
|
+
export function lineFormation(options) {
|
|
118
|
+
const spacing = options.spacing;
|
|
119
|
+
return (count) => {
|
|
120
|
+
const slots = [];
|
|
121
|
+
const mid = (count - 1) / 2;
|
|
122
|
+
for (let i = 0; i < count; i += 1)
|
|
123
|
+
slots.push([(i - mid) * spacing, 0]);
|
|
124
|
+
return slots;
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* A rectangular grid centered on the destination, front row toward `+forward` —
|
|
129
|
+
* a marching block or a phalanx. Rows fill front-to-back, left-to-right.
|
|
130
|
+
*
|
|
131
|
+
* @capability formation-box box/grid slot generator for group destinations
|
|
132
|
+
* @consumer squad movement — box formation sample policy for {@link placeFormation}
|
|
133
|
+
*/
|
|
134
|
+
export function boxFormation(options) {
|
|
135
|
+
const spacing = options.spacing;
|
|
136
|
+
const fixedColumns = options.columns;
|
|
137
|
+
return (count) => {
|
|
138
|
+
const columns = Math.max(1, fixedColumns ?? Math.ceil(Math.sqrt(count)));
|
|
139
|
+
const rows = Math.ceil(count / columns);
|
|
140
|
+
const midCol = (columns - 1) / 2;
|
|
141
|
+
const midRow = (rows - 1) / 2;
|
|
142
|
+
const slots = [];
|
|
143
|
+
for (let i = 0; i < count; i += 1) {
|
|
144
|
+
const row = Math.floor(i / columns);
|
|
145
|
+
const col = i % columns;
|
|
146
|
+
slots.push([(col - midCol) * spacing, (midRow - row) * spacing]);
|
|
147
|
+
}
|
|
148
|
+
return slots;
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* A "V"/arrowhead with the apex at the destination and arms trailing back — a
|
|
153
|
+
* flying-wedge charge or a goose skein. Slot 0 is the tip; later slots alternate
|
|
154
|
+
* right then left, each rank stepping one `spacing` outward and backward.
|
|
155
|
+
*
|
|
156
|
+
* @capability formation-wedge wedge/arrowhead slot generator for group destinations
|
|
157
|
+
* @consumer squad movement — wedge formation sample policy for {@link placeFormation}
|
|
158
|
+
*/
|
|
159
|
+
export function wedgeFormation(options) {
|
|
160
|
+
const spacing = options.spacing;
|
|
161
|
+
return (count) => {
|
|
162
|
+
const slots = [];
|
|
163
|
+
for (let i = 0; i < count; i += 1) {
|
|
164
|
+
if (i === 0) {
|
|
165
|
+
slots.push([0, 0]);
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
const rank = Math.ceil(i / 2);
|
|
169
|
+
const side = i % 2 === 1 ? 1 : -1;
|
|
170
|
+
slots.push([side * rank * spacing, -rank * spacing]);
|
|
171
|
+
}
|
|
172
|
+
return slots;
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* An evenly spaced ring around the destination — a guard cordon, a huddle, or a
|
|
177
|
+
* surround. Slot 0 sits `startAngle` from forward; slots advance evenly around
|
|
178
|
+
* the circle.
|
|
179
|
+
*
|
|
180
|
+
* @capability formation-circle ring/cordon slot generator for group destinations
|
|
181
|
+
* @consumer squad/crowd movement — circle formation sample policy for {@link placeFormation}
|
|
182
|
+
*/
|
|
183
|
+
export function circleFormation(options) {
|
|
184
|
+
const radius = options.radius;
|
|
185
|
+
const startAngle = options.startAngle ?? 0;
|
|
186
|
+
return (count) => {
|
|
187
|
+
const slots = [];
|
|
188
|
+
for (let i = 0; i < count; i += 1) {
|
|
189
|
+
const angle = startAngle + (2 * Math.PI * i) / count;
|
|
190
|
+
slots.push([radius * Math.sin(angle), radius * Math.cos(angle)]);
|
|
191
|
+
}
|
|
192
|
+
return slots;
|
|
193
|
+
};
|
|
194
|
+
}
|
|
@@ -41,4 +41,9 @@ export interface GlideModel {
|
|
|
41
41
|
pose(): GlideStep;
|
|
42
42
|
launch(position: GlideVec3, heading: number, initialSpeed?: number): void;
|
|
43
43
|
}
|
|
44
|
+
/**
|
|
45
|
+
* Gliding/wingsuit descent control — lift, drag, and steering from a launch.
|
|
46
|
+
*
|
|
47
|
+
* @capability glide gliding/wingsuit descent control from a launch
|
|
48
|
+
*/
|
|
44
49
|
export declare function createGlideModel(config?: GlideModelConfig): GlideModel;
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gliding/wingsuit descent control — lift, drag, and steering from a launch.
|
|
3
|
+
*
|
|
4
|
+
* @capability glide gliding/wingsuit descent control from a launch
|
|
5
|
+
*/
|
|
1
6
|
export function createGlideModel(config = {}) {
|
|
2
7
|
const gravity = (config.gravity ?? 20) * (config.gravityScale ?? 0.25);
|
|
3
8
|
const thrustAccel = config.thrustAccel ?? 10;
|
|
@@ -31,4 +31,9 @@ export interface GrappleSwing {
|
|
|
31
31
|
/** Constrain one frame. `reeling` shortens the rope; returns the corrected position/velocity. */
|
|
32
32
|
step(position: SwingVec3, velocity: SwingVec3, dt: number, reeling?: boolean): GrappleSwingStep;
|
|
33
33
|
}
|
|
34
|
+
/**
|
|
35
|
+
* Grappling-hook rope swing physics with anchor, pendulum motion, and reel-in.
|
|
36
|
+
*
|
|
37
|
+
* @capability grapple-swing grappling-hook rope swing physics with reel-in
|
|
38
|
+
*/
|
|
34
39
|
export declare function createGrappleSwing(config?: GrappleSwingConfig): GrappleSwing;
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Grappling-hook rope swing physics with anchor, pendulum motion, and reel-in.
|
|
3
|
+
*
|
|
4
|
+
* @capability grapple-swing grappling-hook rope swing physics with reel-in
|
|
5
|
+
*/
|
|
1
6
|
export function createGrappleSwing(config = {}) {
|
|
2
7
|
const reelSpeed = config.reelSpeed ?? 0;
|
|
3
8
|
const minLength = config.minLength ?? 1;
|
|
@@ -26,4 +26,9 @@ export interface LeaderTrail {
|
|
|
26
26
|
/** Drop all history (teleport, respawn) and optionally restart from a position. */
|
|
27
27
|
reset(position?: TrailPoint): void;
|
|
28
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* A trailing follower formation that chases a leader along its past path — snake/convoy trails.
|
|
31
|
+
*
|
|
32
|
+
* @capability follow-trail trailing follower/snake formation that chases a leader
|
|
33
|
+
*/
|
|
29
34
|
export declare function createLeaderTrail(config: LeaderTrailConfig): LeaderTrail;
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A trailing follower formation that chases a leader along its past path — snake/convoy trails.
|
|
3
|
+
*
|
|
4
|
+
* @capability follow-trail trailing follower/snake formation that chases a leader
|
|
5
|
+
*/
|
|
1
6
|
export function createLeaderTrail(config) {
|
|
2
7
|
if (!(config.spacing > 0))
|
|
3
8
|
throw new Error(`leader trail spacing must be positive, got ${config.spacing}`);
|