@jgengine/core 0.10.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 +13 -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/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 +1 -0
- package/dist/authoring.js +1 -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 +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 +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 +190 -7
- package/dist/editor/commands.js +727 -55
- package/dist/editor/document.d.ts +159 -13
- package/dist/editor/document.js +750 -19
- 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 +73 -6
- package/dist/editor/index.js +6 -2
- 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 +107 -1
- 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 +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 +100 -2
- package/dist/game/defineGame.js +39 -2
- 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 +35 -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 +92 -7
- 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 +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/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 -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/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 +16 -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 +35 -8
- package/dist/movement/movementModel.js +42 -14
- package/dist/movement/playerMovement.js +65 -10
- 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 +22 -0
- package/dist/random/rng.js +28 -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 +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 +42 -3
- package/dist/runtime/adapter.js +44 -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/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 +114 -13
- package/dist/runtime/gameContext.js +303 -395
- 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 +8 -3
- package/dist/runtime/hostedGameRunner.js +26 -3
- package/dist/runtime/hostedWorldSession.d.ts +12 -4
- package/dist/runtime/hostedWorldSession.js +11 -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 +30 -3
- package/dist/runtime/worldSnapshot.js +20 -5
- package/dist/scene/assetCatalog.d.ts +21 -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 +13 -1
- package/dist/scene/colliders.js +37 -1
- package/dist/scene/entityStats.d.ts +11 -2
- package/dist/scene/entityStats.js +11 -2
- 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 +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 +5 -0
- package/dist/store/observableKeyedStore.js +34 -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 +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 +33 -1
- package/dist/ui/hudLayout.js +204 -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/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/features.d.ts +115 -7
- package/dist/world/features.js +56 -5
- 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 +8 -0
- package/dist/world/roads.js +38 -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/terraform.d.ts +213 -1
- package/dist/world/terraform.js +655 -20
- package/dist/world/terrain.d.ts +119 -20
- package/dist/world/terrain.js +247 -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 +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 -5389
|
@@ -23,6 +23,11 @@ export const POSE_HITBOX = {
|
|
|
23
23
|
speedMultiplier: MOVEMENT_TUNING.runSpeedMultiplier,
|
|
24
24
|
},
|
|
25
25
|
};
|
|
26
|
+
/**
|
|
27
|
+
* Stance/pose transitions — stand, crouch, prone — that change the hitbox and movement.
|
|
28
|
+
*
|
|
29
|
+
* @capability crouch-prone stance/pose transitions that change the hitbox
|
|
30
|
+
*/
|
|
26
31
|
export function createPoseState(resolveAllowed) {
|
|
27
32
|
const poses = new Map();
|
|
28
33
|
const aims = new Map();
|
|
@@ -57,5 +62,16 @@ export function createPoseState(resolveAllowed) {
|
|
|
57
62
|
poses.delete(instanceId);
|
|
58
63
|
aims.delete(instanceId);
|
|
59
64
|
},
|
|
65
|
+
snapshotAll() {
|
|
66
|
+
return { poses: Object.fromEntries(poses), aims: Object.fromEntries(aims) };
|
|
67
|
+
},
|
|
68
|
+
hydrateAll(state) {
|
|
69
|
+
poses.clear();
|
|
70
|
+
for (const [id, pose] of Object.entries(state.poses))
|
|
71
|
+
poses.set(id, pose);
|
|
72
|
+
aims.clear();
|
|
73
|
+
for (const [id, aim] of Object.entries(state.aims))
|
|
74
|
+
aims.set(id, aim);
|
|
75
|
+
},
|
|
60
76
|
};
|
|
61
77
|
}
|
|
@@ -25,3 +25,11 @@ export declare function steerYaw(yaw: number, steerRight: number, turnRatePerSec
|
|
|
25
25
|
* it into [-1, 1] at the call site.
|
|
26
26
|
*/
|
|
27
27
|
export declare function steerToward(yaw: number, desiredYaw: number): number;
|
|
28
|
+
/**
|
|
29
|
+
* @internal Rotate `yaw` toward `targetYaw` by at most `turnRatePerSecond * dt`
|
|
30
|
+
* radians, always along the shortest arc, snapping exactly onto the target once
|
|
31
|
+
* within a single step so it converges without overshoot or jitter — the
|
|
32
|
+
* smoothing behind a rendered body-turn (`PlayerMovementConfig.turnSpeed`). A
|
|
33
|
+
* large enough rate (or `dt`) reaches the target in one call, matching a snap.
|
|
34
|
+
*/
|
|
35
|
+
export declare function approachYaw(yaw: number, targetYaw: number, turnRatePerSecond: number, dt: number): number;
|
|
@@ -37,4 +37,22 @@ export function steerToward(yaw, desiredYaw) {
|
|
|
37
37
|
delta += TWO_PI;
|
|
38
38
|
return -delta;
|
|
39
39
|
}
|
|
40
|
+
/**
|
|
41
|
+
* @internal Rotate `yaw` toward `targetYaw` by at most `turnRatePerSecond * dt`
|
|
42
|
+
* radians, always along the shortest arc, snapping exactly onto the target once
|
|
43
|
+
* within a single step so it converges without overshoot or jitter — the
|
|
44
|
+
* smoothing behind a rendered body-turn (`PlayerMovementConfig.turnSpeed`). A
|
|
45
|
+
* large enough rate (or `dt`) reaches the target in one call, matching a snap.
|
|
46
|
+
*/
|
|
47
|
+
export function approachYaw(yaw, targetYaw, turnRatePerSecond, dt) {
|
|
48
|
+
let delta = (targetYaw - yaw) % TWO_PI;
|
|
49
|
+
if (delta > Math.PI)
|
|
50
|
+
delta -= TWO_PI;
|
|
51
|
+
if (delta <= -Math.PI)
|
|
52
|
+
delta += TWO_PI;
|
|
53
|
+
const maxStep = turnRatePerSecond * dt;
|
|
54
|
+
if (maxStep <= 0 || Math.abs(delta) <= maxStep)
|
|
55
|
+
return targetYaw;
|
|
56
|
+
return yaw + Math.sign(delta) * maxStep;
|
|
57
|
+
}
|
|
40
58
|
const TWO_PI = Math.PI * 2;
|
|
@@ -16,7 +16,9 @@ export interface SerializeBoardArgs {
|
|
|
16
16
|
seed?: number;
|
|
17
17
|
capturedAt?: number;
|
|
18
18
|
}
|
|
19
|
+
/** @internal */
|
|
19
20
|
export declare function serializeBoard(args: SerializeBoardArgs): BoardSnapshot;
|
|
21
|
+
/** @internal */
|
|
20
22
|
export declare function cloneSnapshot(snapshot: BoardSnapshot): BoardSnapshot;
|
|
21
23
|
export interface CombatRules {
|
|
22
24
|
attackStat: string;
|
|
@@ -42,4 +44,5 @@ export interface ReplayResult {
|
|
|
42
44
|
survivorsA: readonly string[];
|
|
43
45
|
survivorsB: readonly string[];
|
|
44
46
|
}
|
|
47
|
+
/** @internal */
|
|
45
48
|
export declare function replayCombat(a: BoardSnapshot, b: BoardSnapshot, rules: CombatRules): ReplayResult;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
function cloneStats(stats) {
|
|
2
2
|
return { ...stats };
|
|
3
3
|
}
|
|
4
|
+
/** @internal */
|
|
4
5
|
export function serializeBoard(args) {
|
|
5
6
|
return {
|
|
6
7
|
ownerId: args.ownerId,
|
|
@@ -10,6 +11,7 @@ export function serializeBoard(args) {
|
|
|
10
11
|
capturedAt: args.capturedAt ?? 0,
|
|
11
12
|
};
|
|
12
13
|
}
|
|
14
|
+
/** @internal */
|
|
13
15
|
export function cloneSnapshot(snapshot) {
|
|
14
16
|
return serializeBoard({
|
|
15
17
|
ownerId: snapshot.ownerId,
|
|
@@ -36,6 +38,7 @@ function toLive(snapshot, rules) {
|
|
|
36
38
|
health: unit.stats[rules.healthStat] ?? 0,
|
|
37
39
|
}));
|
|
38
40
|
}
|
|
41
|
+
/** @internal */
|
|
39
42
|
export function replayCombat(a, b, rules) {
|
|
40
43
|
const maxRounds = rules.maxRounds ?? 100;
|
|
41
44
|
const critChance = rules.critChance ?? 0;
|
|
@@ -10,6 +10,7 @@ export interface PositionHistoryConfig {
|
|
|
10
10
|
historyMs: number;
|
|
11
11
|
maxSamples?: number;
|
|
12
12
|
}
|
|
13
|
+
/** @internal */
|
|
13
14
|
export declare class PositionHistory {
|
|
14
15
|
private readonly historyMs;
|
|
15
16
|
private readonly maxSamples;
|
|
@@ -23,7 +24,9 @@ export declare class PositionHistory {
|
|
|
23
24
|
prune(now: number): void;
|
|
24
25
|
forget(entityId: string): void;
|
|
25
26
|
}
|
|
27
|
+
/** @internal */
|
|
26
28
|
export declare function createPositionHistory(config: PositionHistoryConfig): PositionHistory;
|
|
29
|
+
/** @internal */
|
|
27
30
|
export declare function rewindTimestamp(nowMs: number, rttMs: number, interpDelayMs: number): number;
|
|
28
31
|
export interface HitscanRay {
|
|
29
32
|
origin: Vec3;
|
|
@@ -39,5 +42,7 @@ export interface HitscanHit {
|
|
|
39
42
|
distance: number;
|
|
40
43
|
point: Vec3;
|
|
41
44
|
}
|
|
45
|
+
/** @internal */
|
|
42
46
|
export declare function raySphereDistance(ray: HitscanRay, center: Vec3, radius: number): number | null;
|
|
47
|
+
/** @internal */
|
|
43
48
|
export declare function resolveHitscan(history: PositionHistory, targets: readonly HitscanTarget[], ray: HitscanRay, atMs: number): HitscanHit | null;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
const DEFAULT_MAX_SAMPLES = 256;
|
|
2
|
+
/** @internal */
|
|
2
3
|
export class PositionHistory {
|
|
3
4
|
historyMs;
|
|
4
5
|
maxSamples;
|
|
@@ -90,9 +91,11 @@ export class PositionHistory {
|
|
|
90
91
|
this.tracks.delete(entityId);
|
|
91
92
|
}
|
|
92
93
|
}
|
|
94
|
+
/** @internal */
|
|
93
95
|
export function createPositionHistory(config) {
|
|
94
96
|
return new PositionHistory(config);
|
|
95
97
|
}
|
|
98
|
+
/** @internal */
|
|
96
99
|
export function rewindTimestamp(nowMs, rttMs, interpDelayMs) {
|
|
97
100
|
return nowMs - rttMs / 2 - interpDelayMs;
|
|
98
101
|
}
|
|
@@ -102,6 +105,7 @@ function normalize(v) {
|
|
|
102
105
|
return null;
|
|
103
106
|
return { x: v.x / len, y: v.y / len, z: v.z / len };
|
|
104
107
|
}
|
|
108
|
+
/** @internal */
|
|
105
109
|
export function raySphereDistance(ray, center, radius) {
|
|
106
110
|
const dir = normalize(ray.direction);
|
|
107
111
|
if (dir === null)
|
|
@@ -126,6 +130,7 @@ export function raySphereDistance(ray, center, radius) {
|
|
|
126
130
|
return null;
|
|
127
131
|
return t;
|
|
128
132
|
}
|
|
133
|
+
/** @internal */
|
|
129
134
|
export function resolveHitscan(history, targets, ray, atMs) {
|
|
130
135
|
const dir = normalize(ray.direction);
|
|
131
136
|
if (dir === null)
|
|
@@ -51,25 +51,33 @@ export declare const DEFAULT_SPAWN_ORIGIN: {
|
|
|
51
51
|
readonly y: 0;
|
|
52
52
|
readonly z: 0;
|
|
53
53
|
};
|
|
54
|
+
/** @internal */
|
|
54
55
|
export declare function spawnPresenceState(origin: {
|
|
55
56
|
x: number;
|
|
56
57
|
y: number;
|
|
57
58
|
z: number;
|
|
58
59
|
} | undefined, nowMs: number, rules: Pick<PoseSyncRules, "maxElapsedSec">): PresencePoseState;
|
|
60
|
+
/** @internal */
|
|
59
61
|
export declare function decidePoseSync(current: PresencePoseState, incoming: IncomingPose, rules: PoseSyncRules, nowMs: number, floorY?: number): PoseSyncDecision;
|
|
62
|
+
/** @internal */
|
|
60
63
|
export declare function shouldRefreshKeepAlive(lastSeenAtMs: number | undefined, nowMs: number, rules: Pick<PoseSyncRules, "keepAliveRefreshMs">): boolean;
|
|
64
|
+
/** @internal */
|
|
61
65
|
export declare function shouldPersistWorldSnapshot(lastSavedAtMs: number | undefined, nowMs: number, intervalMs: number): boolean;
|
|
62
66
|
export interface ActivePresenceResolution<T> {
|
|
63
67
|
active: T | null;
|
|
64
68
|
/** Other unrevoked rows for the same actor — a session may only have one. */
|
|
65
69
|
extras: T[];
|
|
66
70
|
}
|
|
71
|
+
/** @internal */
|
|
67
72
|
export declare function resolveActivePresence<T extends {
|
|
68
73
|
revokedAt?: number;
|
|
69
74
|
lastSeenAt?: number;
|
|
70
75
|
}>(rows: readonly T[]): ActivePresenceResolution<T>;
|
|
76
|
+
/** @internal */
|
|
71
77
|
export declare function isPresenceExpired(lastSeenAtMs: number, nowMs: number, idleCutoffMs: number): boolean;
|
|
72
|
-
/** Most-recently-seen row across an actor's rows, to reuse instead of inserting a new one.
|
|
78
|
+
/** Most-recently-seen row across an actor's rows, to reuse instead of inserting a new one.
|
|
79
|
+
* @internal
|
|
80
|
+
*/
|
|
73
81
|
export declare function pickReusablePresence<T extends {
|
|
74
82
|
lastSeenAt?: number;
|
|
75
83
|
}>(rows: readonly T[]): T | undefined;
|
|
@@ -10,6 +10,7 @@ function appearanceEqual(a, b) {
|
|
|
10
10
|
return aKeys.every((key) => a[key] === b[key]);
|
|
11
11
|
}
|
|
12
12
|
export const DEFAULT_SPAWN_ORIGIN = { x: 0, y: 0, z: 0 };
|
|
13
|
+
/** @internal */
|
|
13
14
|
export function spawnPresenceState(origin = DEFAULT_SPAWN_ORIGIN, nowMs, rules) {
|
|
14
15
|
return {
|
|
15
16
|
position: { x: origin.x, y: origin.y, z: origin.z },
|
|
@@ -18,6 +19,7 @@ export function spawnPresenceState(origin = DEFAULT_SPAWN_ORIGIN, nowMs, rules)
|
|
|
18
19
|
lastSeenAtMs: nowMs - rules.maxElapsedSec * 1000,
|
|
19
20
|
};
|
|
20
21
|
}
|
|
22
|
+
/** @internal */
|
|
21
23
|
export function decidePoseSync(current, incoming, rules, nowMs, floorY) {
|
|
22
24
|
const rawElapsedSec = Math.max(0, (nowMs - (current.lastSeenAtMs ?? nowMs)) / 1000);
|
|
23
25
|
const elapsedSec = Math.min(rules.maxElapsedSec, rawElapsedSec);
|
|
@@ -55,12 +57,15 @@ export function decidePoseSync(current, incoming, rules, nowMs, floorY) {
|
|
|
55
57
|
refreshKeepAlive: !changed && shouldRefreshKeepAlive(current.lastSeenAtMs, nowMs, rules),
|
|
56
58
|
};
|
|
57
59
|
}
|
|
60
|
+
/** @internal */
|
|
58
61
|
export function shouldRefreshKeepAlive(lastSeenAtMs, nowMs, rules) {
|
|
59
62
|
return nowMs - (lastSeenAtMs ?? 0) >= rules.keepAliveRefreshMs;
|
|
60
63
|
}
|
|
64
|
+
/** @internal */
|
|
61
65
|
export function shouldPersistWorldSnapshot(lastSavedAtMs, nowMs, intervalMs) {
|
|
62
66
|
return lastSavedAtMs === undefined || nowMs - lastSavedAtMs >= intervalMs;
|
|
63
67
|
}
|
|
68
|
+
/** @internal */
|
|
64
69
|
export function resolveActivePresence(rows) {
|
|
65
70
|
const actives = rows.filter((row) => row.revokedAt === undefined);
|
|
66
71
|
if (actives.length === 0)
|
|
@@ -68,10 +73,13 @@ export function resolveActivePresence(rows) {
|
|
|
68
73
|
const sorted = [...actives].sort((a, b) => (b.lastSeenAt ?? 0) - (a.lastSeenAt ?? 0));
|
|
69
74
|
return { active: sorted[0] ?? null, extras: sorted.slice(1) };
|
|
70
75
|
}
|
|
76
|
+
/** @internal */
|
|
71
77
|
export function isPresenceExpired(lastSeenAtMs, nowMs, idleCutoffMs) {
|
|
72
78
|
return nowMs - lastSeenAtMs >= idleCutoffMs;
|
|
73
79
|
}
|
|
74
|
-
/** Most-recently-seen row across an actor's rows, to reuse instead of inserting a new one.
|
|
80
|
+
/** Most-recently-seen row across an actor's rows, to reuse instead of inserting a new one.
|
|
81
|
+
* @internal
|
|
82
|
+
*/
|
|
75
83
|
export function pickReusablePresence(rows) {
|
|
76
84
|
return [...rows].sort((a, b) => (b.lastSeenAt ?? 0) - (a.lastSeenAt ?? 0))[0];
|
|
77
85
|
}
|
|
@@ -15,6 +15,7 @@ export type SealResult = {
|
|
|
15
15
|
ok: false;
|
|
16
16
|
reason: "unknown_participant" | "already_sealed" | "already_revealed";
|
|
17
17
|
};
|
|
18
|
+
/** @internal */
|
|
18
19
|
export declare class CommitRound<TAction> {
|
|
19
20
|
private readonly order;
|
|
20
21
|
private readonly participants;
|
|
@@ -30,5 +31,7 @@ export declare class CommitRound<TAction> {
|
|
|
30
31
|
get phase(): CommitPhase;
|
|
31
32
|
reveal(): readonly SealedCommit<TAction>[] | null;
|
|
32
33
|
}
|
|
34
|
+
/** @internal */
|
|
33
35
|
export declare function createCommitRound<TAction>(config: CommitRoundConfig): CommitRound<TAction>;
|
|
36
|
+
/** @internal */
|
|
34
37
|
export declare function resolveCommits<TAction, TResult>(reveals: readonly SealedCommit<TAction>[], resolver: (ordered: readonly SealedCommit<TAction>[]) => TResult): TResult;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/** @internal */
|
|
1
2
|
export class CommitRound {
|
|
2
3
|
order;
|
|
3
4
|
participants;
|
|
@@ -45,9 +46,11 @@ export class CommitRound {
|
|
|
45
46
|
return this.order.map((id) => this.sealed.get(id));
|
|
46
47
|
}
|
|
47
48
|
}
|
|
49
|
+
/** @internal */
|
|
48
50
|
export function createCommitRound(config) {
|
|
49
51
|
return new CommitRound(config);
|
|
50
52
|
}
|
|
53
|
+
/** @internal */
|
|
51
54
|
export function resolveCommits(reveals, resolver) {
|
|
52
55
|
return resolver(reveals);
|
|
53
56
|
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export { type ChatActions, type ChatSendOutcome, type ChatSync, type ChatTransport, } from "./multiplayer/chatContract.js";
|
|
2
|
+
export { type BoardSnapshot } from "./multiplayer/combatSnapshot.js";
|
|
3
|
+
export { createFeedWriteGate, validateFeedWrite, type FeedWriteGate } from "./multiplayer/feedWriteGate.js";
|
|
4
|
+
export { resolveGuestSession, sessionPlayer, type AuthSession, type PlayerIdentity } from "./multiplayer/identity.js";
|
|
5
|
+
export { type Vec3 } from "./multiplayer/lagCompensation.js";
|
|
6
|
+
export { browseSessions, findByJoinCode, normalizeJoinCode, quickMatch, type MatchFilter, type SessionListing, type SessionVisibility, } from "./multiplayer/matchmaking.js";
|
|
7
|
+
export { createPoseSyncGate, type PlayerPose, type PoseSyncTuning } from "./multiplayer/poseSyncGate.js";
|
|
8
|
+
export { type EnsurePresenceResult, type PresenceActions, type PresenceFeeds, type PresenceSession, type PresenceTransport, } from "./multiplayer/presenceContract.js";
|
|
9
|
+
export { type PoseSyncRules, type PresencePoseState } from "./multiplayer/presenceModel.js";
|
|
10
|
+
export { createLocalVoiceTransport, createPushToTalk, type PushToTalkMode, type PushToTalkStatus, type VoiceParticipant, type VoiceRoute, type VoiceTransport, } from "./multiplayer/voiceContract.js";
|
|
11
|
+
export { type ReplicationPolicy } from "./runtime/worldProjection.js";
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export {} from "./multiplayer/chatContract.js";
|
|
2
|
+
export {} from "./multiplayer/combatSnapshot.js";
|
|
3
|
+
export { createFeedWriteGate, validateFeedWrite } from "./multiplayer/feedWriteGate.js";
|
|
4
|
+
export { resolveGuestSession, sessionPlayer } from "./multiplayer/identity.js";
|
|
5
|
+
export {} from "./multiplayer/lagCompensation.js";
|
|
6
|
+
export { browseSessions, findByJoinCode, normalizeJoinCode, quickMatch, } from "./multiplayer/matchmaking.js";
|
|
7
|
+
export { createPoseSyncGate } from "./multiplayer/poseSyncGate.js";
|
|
8
|
+
export {} from "./multiplayer/presenceContract.js";
|
|
9
|
+
export {} from "./multiplayer/presenceModel.js";
|
|
10
|
+
export { createLocalVoiceTransport, createPushToTalk, } from "./multiplayer/voiceContract.js";
|
|
11
|
+
export {} from "./runtime/worldProjection.js";
|
package/dist/nav/pathFollow.d.ts
CHANGED
|
@@ -21,6 +21,63 @@ export interface HeightSampler {
|
|
|
21
21
|
sampleHeight(x: number, z: number): number;
|
|
22
22
|
}
|
|
23
23
|
export declare function pathFromNav(points: readonly NavPoint[], elevation?: number | HeightSampler, offset?: number): Waypoint[];
|
|
24
|
+
/**
|
|
25
|
+
* Semantic seek target for {@link pathFollowSeek} — the caller-facing progress vocabulary a
|
|
26
|
+
* stateful path behavior restores from, so a follower can start at a distributed phase or resume
|
|
27
|
+
* a serialized route without knowing waypoint internals. `direction` (forward heading) falls out of
|
|
28
|
+
* the resulting {@link PathFollowState.heading}, so it is an output rather than a seek input.
|
|
29
|
+
*/
|
|
30
|
+
export type PathProgress =
|
|
31
|
+
/** Fraction `0..1` of total path length (looping paths wrap; clamped otherwise). */
|
|
32
|
+
{
|
|
33
|
+
readonly kind: "normalized";
|
|
34
|
+
readonly value: number;
|
|
35
|
+
}
|
|
36
|
+
/** World-distance travelled from the first waypoint (looping paths wrap; clamped otherwise). */
|
|
37
|
+
| {
|
|
38
|
+
readonly kind: "distance";
|
|
39
|
+
readonly value: number;
|
|
40
|
+
}
|
|
41
|
+
/** Segment `index` (0-based) plus `fraction` `0..1` along that segment. */
|
|
42
|
+
| {
|
|
43
|
+
readonly kind: "segment";
|
|
44
|
+
readonly index: number;
|
|
45
|
+
readonly fraction: number;
|
|
46
|
+
};
|
|
47
|
+
/** Read-only progress readout for inspection/debug tooling, produced by {@link pathFollowProgress}. */
|
|
48
|
+
export interface PathFollowProgress {
|
|
49
|
+
/** Cumulative world-distance travelled (matches {@link PathFollowState.distanceTravelled}). */
|
|
50
|
+
distance: number;
|
|
51
|
+
/** Fraction `0..1` of total path length at the current position. */
|
|
52
|
+
normalized: number;
|
|
53
|
+
/** 0-based index of the segment the mover is currently on. */
|
|
54
|
+
segment: number;
|
|
55
|
+
/** Fraction `0..1` along the current segment. */
|
|
56
|
+
fraction: number;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Total world-distance of a path — sum of every segment, including the wrap segment back to the
|
|
60
|
+
* first waypoint when `loop` is set. Zero for a degenerate (0- or 1-waypoint) path.
|
|
61
|
+
*
|
|
62
|
+
* @capability path-length total polyline distance for progress math and seeding
|
|
63
|
+
*/
|
|
64
|
+
export declare function pathLength(config: PathFollowConfig): number;
|
|
65
|
+
/**
|
|
66
|
+
* Place a follower at a semantic {@link PathProgress} without simulating from the start — the seek
|
|
67
|
+
* adapter behavior lifecycles use to seed distributed phases and restore serialized routes. Pure;
|
|
68
|
+
* returns a fresh {@link PathFollowState} whose `heading` gives travel direction. Looping paths wrap
|
|
69
|
+
* the distance; non-looping paths clamp to `[0, pathLength]` and report `done` at the end.
|
|
70
|
+
*
|
|
71
|
+
* @capability path-follow-seek jump a path-follower to normalized/distance/segment progress
|
|
72
|
+
*/
|
|
73
|
+
export declare function pathFollowSeek(config: PathFollowConfig, target: PathProgress): PathFollowState;
|
|
74
|
+
/**
|
|
75
|
+
* Read a follower's current progress in every semantic form — the inverse of {@link pathFollowSeek},
|
|
76
|
+
* for editor/debug inspection and progress HUDs. Pure and allocation-light.
|
|
77
|
+
*
|
|
78
|
+
* @capability path-follow-progress read normalized/distance/segment progress from follow state
|
|
79
|
+
*/
|
|
80
|
+
export declare function pathFollowProgress(config: PathFollowConfig, state: PathFollowState): PathFollowProgress;
|
|
24
81
|
export declare function createPathFollow(config: PathFollowConfig): PathFollowState;
|
|
25
82
|
/**
|
|
26
83
|
* Advance a path-follower by `speed * dt` along its authored polyline. Pure — returns
|
package/dist/nav/pathFollow.js
CHANGED
|
@@ -4,6 +4,115 @@ export function pathFromNav(points, elevation = 0, offset = 0) {
|
|
|
4
4
|
}
|
|
5
5
|
return points.map((point) => [point[0], elevation.sampleHeight(point[0], point[1]) + offset, point[1]]);
|
|
6
6
|
}
|
|
7
|
+
function pathSegments(waypoints, loop) {
|
|
8
|
+
const count = waypoints.length;
|
|
9
|
+
const segments = [];
|
|
10
|
+
const limit = loop ? count : count - 1;
|
|
11
|
+
for (let i = 0; i < limit; i += 1) {
|
|
12
|
+
const from = waypoints[i];
|
|
13
|
+
const dest = (i + 1) % count;
|
|
14
|
+
const to = waypoints[dest];
|
|
15
|
+
segments.push({ from, to, len: Math.hypot(to[0] - from[0], to[1] - from[1], to[2] - from[2]), dest });
|
|
16
|
+
}
|
|
17
|
+
return segments;
|
|
18
|
+
}
|
|
19
|
+
function distanceForProgress(target, total, segments) {
|
|
20
|
+
if (target.kind === "distance")
|
|
21
|
+
return target.value;
|
|
22
|
+
if (target.kind === "normalized")
|
|
23
|
+
return target.value * total;
|
|
24
|
+
let distance = 0;
|
|
25
|
+
for (let i = 0; i < target.index && i < segments.length; i += 1)
|
|
26
|
+
distance += segments[i].len;
|
|
27
|
+
const seg = segments[target.index];
|
|
28
|
+
if (seg !== undefined)
|
|
29
|
+
distance += seg.len * target.fraction;
|
|
30
|
+
return distance;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Total world-distance of a path — sum of every segment, including the wrap segment back to the
|
|
34
|
+
* first waypoint when `loop` is set. Zero for a degenerate (0- or 1-waypoint) path.
|
|
35
|
+
*
|
|
36
|
+
* @capability path-length total polyline distance for progress math and seeding
|
|
37
|
+
*/
|
|
38
|
+
export function pathLength(config) {
|
|
39
|
+
return pathSegments(config.waypoints, config.loop ?? false).reduce((sum, seg) => sum + seg.len, 0);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Place a follower at a semantic {@link PathProgress} without simulating from the start — the seek
|
|
43
|
+
* adapter behavior lifecycles use to seed distributed phases and restore serialized routes. Pure;
|
|
44
|
+
* returns a fresh {@link PathFollowState} whose `heading` gives travel direction. Looping paths wrap
|
|
45
|
+
* the distance; non-looping paths clamp to `[0, pathLength]` and report `done` at the end.
|
|
46
|
+
*
|
|
47
|
+
* @capability path-follow-seek jump a path-follower to normalized/distance/segment progress
|
|
48
|
+
*/
|
|
49
|
+
export function pathFollowSeek(config, target) {
|
|
50
|
+
const { waypoints } = config;
|
|
51
|
+
const loop = config.loop ?? false;
|
|
52
|
+
const count = waypoints.length;
|
|
53
|
+
if (count <= 1)
|
|
54
|
+
return createPathFollow(config);
|
|
55
|
+
const segments = pathSegments(waypoints, loop);
|
|
56
|
+
const total = segments.reduce((sum, seg) => sum + seg.len, 0);
|
|
57
|
+
if (total <= EPSILON)
|
|
58
|
+
return createPathFollow(config);
|
|
59
|
+
const requested = distanceForProgress(target, total, segments);
|
|
60
|
+
const positioned = loop ? ((requested % total) + total) % total : Math.max(0, Math.min(total, requested));
|
|
61
|
+
let acc = 0;
|
|
62
|
+
for (let i = 0; i < segments.length; i += 1) {
|
|
63
|
+
const seg = segments[i];
|
|
64
|
+
const last = i === segments.length - 1;
|
|
65
|
+
if (positioned < acc + seg.len || last) {
|
|
66
|
+
const along = Math.max(0, Math.min(seg.len, positioned - acc));
|
|
67
|
+
const t = seg.len > EPSILON ? along / seg.len : 0;
|
|
68
|
+
const position = [
|
|
69
|
+
seg.from[0] + (seg.to[0] - seg.from[0]) * t,
|
|
70
|
+
seg.from[1] + (seg.to[1] - seg.from[1]) * t,
|
|
71
|
+
seg.from[2] + (seg.to[2] - seg.from[2]) * t,
|
|
72
|
+
];
|
|
73
|
+
const heading = Math.atan2(seg.to[0] - seg.from[0], seg.to[2] - seg.from[2]);
|
|
74
|
+
const done = !loop && positioned >= total - EPSILON;
|
|
75
|
+
return {
|
|
76
|
+
position,
|
|
77
|
+
target: done ? count - 1 : seg.dest,
|
|
78
|
+
heading,
|
|
79
|
+
done,
|
|
80
|
+
distanceTravelled: loop ? requested : positioned,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
acc += seg.len;
|
|
84
|
+
}
|
|
85
|
+
return createPathFollow(config);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Read a follower's current progress in every semantic form — the inverse of {@link pathFollowSeek},
|
|
89
|
+
* for editor/debug inspection and progress HUDs. Pure and allocation-light.
|
|
90
|
+
*
|
|
91
|
+
* @capability path-follow-progress read normalized/distance/segment progress from follow state
|
|
92
|
+
*/
|
|
93
|
+
export function pathFollowProgress(config, state) {
|
|
94
|
+
const loop = config.loop ?? false;
|
|
95
|
+
const segments = pathSegments(config.waypoints, loop);
|
|
96
|
+
const total = segments.reduce((sum, seg) => sum + seg.len, 0);
|
|
97
|
+
let segment = segments.findIndex((seg) => seg.dest === state.target);
|
|
98
|
+
if (segment < 0)
|
|
99
|
+
segment = 0;
|
|
100
|
+
const seg = segments[segment];
|
|
101
|
+
let fraction = 0;
|
|
102
|
+
if (seg !== undefined && seg.len > EPSILON) {
|
|
103
|
+
const along = Math.hypot(state.position[0] - seg.from[0], state.position[1] - seg.from[1], state.position[2] - seg.from[2]);
|
|
104
|
+
fraction = Math.max(0, Math.min(1, along / seg.len));
|
|
105
|
+
}
|
|
106
|
+
let traversed = fraction * (seg?.len ?? 0);
|
|
107
|
+
for (let i = 0; i < segment; i += 1)
|
|
108
|
+
traversed += segments[i].len;
|
|
109
|
+
return {
|
|
110
|
+
distance: state.distanceTravelled,
|
|
111
|
+
normalized: total > EPSILON ? traversed / total : 0,
|
|
112
|
+
segment,
|
|
113
|
+
fraction,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
7
116
|
export function createPathFollow(config) {
|
|
8
117
|
const first = config.waypoints[0];
|
|
9
118
|
const start = first ?? [0, 0, 0];
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The reusable order verbs every commandable game re-derives -- move, stop,
|
|
3
|
+
* hold, attack-move, targeted action, patrol -- built as ordinary
|
|
4
|
+
* `OrderKind`s over two narrow world adapters, not baked into the queue (#912).
|
|
5
|
+
* Each factory takes a configurable `kind` string, so a game re-skins a verb
|
|
6
|
+
* ("harvest", "board") without the engine ever knowing the name. Movement,
|
|
7
|
+
* target acquisition, pursuit/leash, and completion predicates compose here;
|
|
8
|
+
* effect execution stays game-side, driven off the intent each kind writes into
|
|
9
|
+
* `order.state`.
|
|
10
|
+
*/
|
|
11
|
+
import type { OrderKind, OrderVec3 } from "./orderQueue.js";
|
|
12
|
+
/** Result of one movement step, from the game's motion adapter. */
|
|
13
|
+
export interface OrderMoveResult {
|
|
14
|
+
/** The mover reached the point within its arrive radius this step. */
|
|
15
|
+
arrived: boolean;
|
|
16
|
+
/** Remaining distance to the point after the step. */
|
|
17
|
+
distance: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Narrow motion adapter an order kind drives. The game implements it over its
|
|
21
|
+
* own controller/motor (`scene.moveToward`, a nav follower, physics) for one
|
|
22
|
+
* entity; the kind never touches the scene directly.
|
|
23
|
+
*/
|
|
24
|
+
export interface OrderMover {
|
|
25
|
+
/** Current position, or `null` if the entity is gone (despawned) -- the kind then fails cleanly. */
|
|
26
|
+
position(): OrderVec3 | null;
|
|
27
|
+
/** Step toward `point` this tick and report arrival/remaining distance. */
|
|
28
|
+
moveToward(point: OrderVec3, options?: {
|
|
29
|
+
speedScale?: number;
|
|
30
|
+
arriveRadius?: number;
|
|
31
|
+
}): OrderMoveResult;
|
|
32
|
+
/** Stop moving (release throttle / clear steering) — used by stop/hold and on cancel. */
|
|
33
|
+
halt(): void;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Narrow targeting adapter for engagement verbs. `acquire` returns the id of a
|
|
37
|
+
* hostile within `radius` (nearest, or whatever policy the game injects), and
|
|
38
|
+
* `positionOf` locates a known target. Actual damage/effects stay game-side.
|
|
39
|
+
*/
|
|
40
|
+
export interface OrderTargeting {
|
|
41
|
+
/** Acquire a hostile within `radius`, or `null` if none. */
|
|
42
|
+
acquire(radius: number): string | null;
|
|
43
|
+
/** Current position of a target id, or `null` if it is gone. */
|
|
44
|
+
positionOf(targetId: string): OrderVec3 | null;
|
|
45
|
+
}
|
|
46
|
+
/** Payload for a move order: go to a point and complete on arrival. */
|
|
47
|
+
export interface MoveOrderPayload {
|
|
48
|
+
point: OrderVec3;
|
|
49
|
+
/** Distance that counts as arrived; falls back to the factory default. */
|
|
50
|
+
arriveRadius?: number;
|
|
51
|
+
/** Per-order speed multiplier passed to the mover. */
|
|
52
|
+
speedScale?: number;
|
|
53
|
+
}
|
|
54
|
+
/** Payload for stop/hold orders — no data; the verb is the intent. */
|
|
55
|
+
export type EmptyOrderPayload = Record<string, never>;
|
|
56
|
+
/** Payload for an attack-move: advance toward `point`, engaging hostiles encountered en route. */
|
|
57
|
+
export interface AttackMoveOrderPayload {
|
|
58
|
+
point: OrderVec3;
|
|
59
|
+
/** Radius scanned for hostiles each tick; falls back to the factory default. */
|
|
60
|
+
aggroRadius?: number;
|
|
61
|
+
/** Distance at which an acquired target is "in range" to attack; falls back to the factory default. */
|
|
62
|
+
attackRange?: number;
|
|
63
|
+
/** Arrive radius for the destination when no hostile is engaged. */
|
|
64
|
+
arriveRadius?: number;
|
|
65
|
+
speedScale?: number;
|
|
66
|
+
}
|
|
67
|
+
/** Live intent an attack-move/targeted order writes into `Order.state`; the game reads it to run the actual attack. Serializable. */
|
|
68
|
+
export interface EngagementOrderState {
|
|
69
|
+
/** Target currently pursued/engaged, or `null` while travelling. */
|
|
70
|
+
engaging: string | null;
|
|
71
|
+
/** The engaged target is within attack range this tick — the swing/cast window. */
|
|
72
|
+
inRange: boolean;
|
|
73
|
+
}
|
|
74
|
+
/** Payload for a targeted action: pursue one target until in range, holding within a leash. */
|
|
75
|
+
export interface TargetedOrderPayload {
|
|
76
|
+
targetId: string;
|
|
77
|
+
/** Distance at which the target is "in range"; falls back to the factory default. */
|
|
78
|
+
range?: number;
|
|
79
|
+
speedScale?: number;
|
|
80
|
+
}
|
|
81
|
+
/** Serializable patrol progress. */
|
|
82
|
+
export interface PatrolOrderState {
|
|
83
|
+
/** Index of the waypoint currently being approached. */
|
|
84
|
+
index: number;
|
|
85
|
+
}
|
|
86
|
+
/** Payload for a patrol: walk a waypoint route, optionally looping forever. */
|
|
87
|
+
export interface PatrolOrderPayload {
|
|
88
|
+
waypoints: OrderVec3[];
|
|
89
|
+
/** Loop back to the first waypoint after the last; otherwise complete at the end. Default `true`. */
|
|
90
|
+
loop?: boolean;
|
|
91
|
+
arriveRadius?: number;
|
|
92
|
+
speedScale?: number;
|
|
93
|
+
}
|
|
94
|
+
/** Shared factory config: override the verb key so a game can register the composition under its own name. */
|
|
95
|
+
export interface OrderKindConfig {
|
|
96
|
+
/** Registry key / `Order.kind`; defaults to the natural verb name. */
|
|
97
|
+
kind?: string;
|
|
98
|
+
}
|
|
99
|
+
/** Move + engagement config carrying the default radii the payload may override. */
|
|
100
|
+
export interface EngagementKindConfig extends OrderKindConfig {
|
|
101
|
+
arriveRadius?: number;
|
|
102
|
+
aggroRadius?: number;
|
|
103
|
+
attackRange?: number;
|
|
104
|
+
range?: number;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* The plain "go here" verb: step toward a point each tick, complete on arrival,
|
|
108
|
+
* fail if the entity despawns. The completion predicate is arrival within
|
|
109
|
+
* `arriveRadius`.
|
|
110
|
+
*
|
|
111
|
+
* @capability move-order go-to-point order that completes on arrival, composed over a motion adapter
|
|
112
|
+
*/
|
|
113
|
+
export declare function defineMoveOrder<TCtx extends OrderMover>(config?: OrderKindConfig & {
|
|
114
|
+
arriveRadius?: number;
|
|
115
|
+
}): OrderKind<TCtx, MoveOrderPayload>;
|
|
116
|
+
/**
|
|
117
|
+
* Stop: halt immediately and complete the same tick — the interrupt that clears
|
|
118
|
+
* a unit's intent to standstill.
|
|
119
|
+
*
|
|
120
|
+
* @capability stop-order halt-and-complete order that brings a unit to an immediate standstill
|
|
121
|
+
*/
|
|
122
|
+
export declare function defineStopOrder<TCtx extends OrderMover>(config?: OrderKindConfig): OrderKind<TCtx, EmptyOrderPayload>;
|
|
123
|
+
/**
|
|
124
|
+
* Hold position: stand ground indefinitely (never completes on its own) until
|
|
125
|
+
* preempted or canceled — the "guard here" verb.
|
|
126
|
+
*
|
|
127
|
+
* @capability hold-order stand-ground order that holds position until preempted or canceled
|
|
128
|
+
*/
|
|
129
|
+
export declare function defineHoldOrder<TCtx extends OrderMover>(config?: OrderKindConfig): OrderKind<TCtx, EmptyOrderPayload>;
|
|
130
|
+
/**
|
|
131
|
+
* Attack-move: advance toward a destination but break off to engage any hostile
|
|
132
|
+
* acquired within `aggroRadius`, pursuing it to `attackRange` and writing the
|
|
133
|
+
* engagement intent into `order.state` for the game to act on. Completes on
|
|
134
|
+
* reaching the destination with nothing to engage.
|
|
135
|
+
*
|
|
136
|
+
* @capability attack-move-order advance-and-engage order that pursues hostiles en route and completes at its destination
|
|
137
|
+
*/
|
|
138
|
+
export declare function defineAttackMoveOrder<TCtx extends OrderMover & OrderTargeting>(config?: EngagementKindConfig): OrderKind<TCtx, AttackMoveOrderPayload>;
|
|
139
|
+
/**
|
|
140
|
+
* Targeted action: pursue one specific target until within `range`, writing the
|
|
141
|
+
* engagement intent into `order.state`. Completes when the target is gone
|
|
142
|
+
* (despawned/dead), so the game's effect loop runs while `inRange` is true.
|
|
143
|
+
*
|
|
144
|
+
* @capability targeted-order pursue-a-target order with leash/standoff that ends when the target is gone
|
|
145
|
+
*/
|
|
146
|
+
export declare function defineTargetedOrder<TCtx extends OrderMover & OrderTargeting>(config?: EngagementKindConfig): OrderKind<TCtx, TargetedOrderPayload>;
|
|
147
|
+
/**
|
|
148
|
+
* Patrol: walk a waypoint route, advancing the serialized `index` as each point
|
|
149
|
+
* is reached. Loops forever by default, or completes at the last waypoint when
|
|
150
|
+
* `loop` is `false`.
|
|
151
|
+
*
|
|
152
|
+
* @capability patrol-order waypoint-route order that cycles a path, looping or completing at the end
|
|
153
|
+
*/
|
|
154
|
+
export declare function definePatrolOrder<TCtx extends OrderMover>(config?: OrderKindConfig & {
|
|
155
|
+
arriveRadius?: number;
|
|
156
|
+
}): OrderKind<TCtx, PatrolOrderPayload>;
|