@jgengine/core 0.9.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +34 -3
- package/LICENSE +203 -661
- package/README.md +1 -1
- package/dist/ai/crowd.d.ts +55 -0
- package/dist/ai/crowd.js +114 -0
- package/dist/ai/flock.d.ts +5 -2
- package/dist/ai/flock.js +5 -2
- package/dist/ai/groupAssist.d.ts +1 -0
- package/dist/ai/groupAssist.js +1 -0
- package/dist/ai/heatSystem.d.ts +76 -0
- package/dist/ai/heatSystem.js +97 -0
- package/dist/ai/interestScheduler.d.ts +107 -0
- package/dist/ai/interestScheduler.js +118 -0
- package/dist/ai/jobBoard.d.ts +1 -0
- package/dist/ai/jobBoard.js +1 -0
- package/dist/ai/laneSelect.d.ts +5 -2
- package/dist/ai/laneSelect.js +5 -2
- package/dist/ai/mobBrain.d.ts +1 -0
- package/dist/ai/mobBrain.js +1 -0
- package/dist/ai/spawnDirector.d.ts +19 -1
- package/dist/ai/spawnDirector.js +53 -26
- package/dist/ai/spawnPoint.d.ts +7 -0
- package/dist/ai/spawnPoint.js +7 -0
- package/dist/ai/targetAcquisition.d.ts +84 -0
- package/dist/ai/targetAcquisition.js +92 -0
- package/dist/anim/easing.d.ts +19 -0
- package/dist/anim/easing.js +19 -0
- package/dist/anim/oscillator.d.ts +12 -0
- package/dist/anim/oscillator.js +25 -0
- package/dist/area/areaEffectField.d.ts +127 -0
- package/dist/area/areaEffectField.js +175 -0
- package/dist/area/stackPolicy.d.ts +47 -0
- package/dist/area/stackPolicy.js +99 -0
- package/dist/audio/audioFalloff.d.ts +5 -2
- package/dist/audio/music.d.ts +53 -0
- package/dist/audio/music.js +34 -0
- package/dist/audio/synth.d.ts +60 -0
- package/dist/audio/synth.js +8 -0
- package/dist/authoring.d.ts +15 -0
- package/dist/authoring.js +15 -0
- package/dist/board/laneBoard.d.ts +13 -0
- package/dist/board/laneBoard.js +13 -0
- package/dist/board/timelineBoard.d.ts +10 -0
- package/dist/board/timelineBoard.js +10 -0
- package/dist/combat/abilityKit.d.ts +18 -0
- package/dist/combat/abilityKit.js +24 -9
- package/dist/combat/animationState.d.ts +5 -0
- package/dist/combat/animationState.js +5 -0
- package/dist/combat/breakMeters.d.ts +10 -0
- package/dist/combat/breakMeters.js +10 -0
- package/dist/combat/castRunner.d.ts +5 -0
- package/dist/combat/castRunner.js +5 -0
- package/dist/combat/comboPoints.d.ts +5 -0
- package/dist/combat/comboPoints.js +5 -0
- package/dist/combat/comboString.d.ts +5 -0
- package/dist/combat/comboString.js +5 -0
- package/dist/combat/damageInterceptors.d.ts +192 -0
- package/dist/combat/damageInterceptors.js +251 -0
- package/dist/combat/damageMatchup.d.ts +68 -0
- package/dist/combat/damageMatchup.js +42 -0
- package/dist/combat/damageResolution.d.ts +63 -0
- package/dist/combat/damageResolution.js +50 -0
- package/dist/combat/death.d.ts +7 -1
- package/dist/combat/death.js +5 -0
- package/dist/combat/deathReason.d.ts +14 -0
- package/dist/combat/deathReason.js +1 -0
- package/dist/combat/defensiveWindow.d.ts +5 -0
- package/dist/combat/defensiveWindow.js +5 -0
- package/dist/combat/dotField.d.ts +47 -0
- package/dist/combat/dotField.js +52 -0
- package/dist/combat/downed.d.ts +5 -0
- package/dist/combat/downed.js +5 -0
- package/dist/combat/effects.d.ts +5 -0
- package/dist/combat/effects.js +5 -0
- package/dist/combat/encounterSequence.d.ts +258 -0
- package/dist/combat/encounterSequence.js +426 -0
- package/dist/combat/hitReaction.d.ts +57 -1
- package/dist/combat/hitReaction.js +45 -5
- package/dist/combat/magazine.d.ts +54 -0
- package/dist/combat/magazine.js +96 -0
- package/dist/combat/projectiles.d.ts +7 -2
- package/dist/combat/projectiles.js +48 -17
- package/dist/combat/receivedDamage.d.ts +117 -0
- package/dist/combat/receivedDamage.js +92 -0
- package/dist/combat/regenShield.d.ts +39 -0
- package/dist/combat/regenShield.js +49 -0
- package/dist/combat/renderCues.d.ts +51 -0
- package/dist/combat/renderCues.js +44 -0
- package/dist/combat/resourcePool.d.ts +5 -0
- package/dist/combat/resourcePool.js +5 -0
- package/dist/combat/rewardAllocation.d.ts +121 -0
- package/dist/combat/rewardAllocation.js +251 -0
- package/dist/combat/shotOrigin.d.ts +30 -1
- package/dist/combat/shotOrigin.js +70 -2
- package/dist/combat/statusApplication.d.ts +96 -0
- package/dist/combat/statusApplication.js +81 -0
- package/dist/combat/telegraph.d.ts +11 -2
- package/dist/combat/telegraph.js +11 -2
- package/dist/combat/thresholdCrossings.d.ts +85 -0
- package/dist/combat/thresholdCrossings.js +116 -0
- package/dist/combat.d.ts +34 -0
- package/dist/combat.js +34 -0
- package/dist/commands/commandRegistry.d.ts +11 -0
- package/dist/commands/commandRegistry.js +9 -2
- package/dist/crafting/crop.d.ts +18 -0
- package/dist/crafting/crop.js +18 -0
- package/dist/crafting/production.d.ts +5 -0
- package/dist/crafting/production.js +5 -0
- package/dist/devtools/rewriteTunables.d.ts +17 -0
- package/dist/devtools/rewriteTunables.js +276 -0
- package/dist/devtools/saveEndpoint.d.ts +46 -0
- package/dist/devtools/saveEndpoint.js +48 -0
- package/dist/devtools/transformTunables.d.ts +3 -0
- package/dist/devtools/transformTunables.js +3 -0
- package/dist/devtools/tunableSchema.d.ts +31 -0
- package/dist/devtools/tunableSchema.js +31 -0
- package/dist/economy/currency.d.ts +12 -1
- package/dist/economy/currency.js +12 -1
- package/dist/economy/listingBook.d.ts +91 -0
- package/dist/economy/listingBook.js +144 -0
- package/dist/economy/resourceLedger.d.ts +222 -0
- package/dist/economy/resourceLedger.js +353 -0
- package/dist/economy/sharedWallet.d.ts +14 -0
- package/dist/economy/sharedWallet.js +14 -0
- package/dist/economy/techTree.d.ts +12 -0
- package/dist/economy/techTree.js +12 -0
- package/dist/economy/wallet.d.ts +26 -2
- package/dist/economy/wallet.js +35 -6
- package/dist/editor/commands.d.ts +248 -0
- package/dist/editor/commands.js +865 -0
- package/dist/editor/document.d.ts +186 -0
- package/dist/editor/document.js +884 -0
- package/dist/editor/grid.d.ts +229 -0
- package/dist/editor/grid.js +366 -0
- package/dist/editor/gridAdapters.d.ts +80 -0
- package/dist/editor/gridAdapters.js +134 -0
- package/dist/editor/index.d.ts +97 -0
- package/dist/editor/index.js +10 -0
- package/dist/editor/liveSync.d.ts +127 -0
- package/dist/editor/liveSync.js +249 -0
- package/dist/editor/runtimeInspector.d.ts +88 -0
- package/dist/editor/runtimeInspector.js +239 -0
- package/dist/editor/types.d.ts +175 -0
- package/dist/editor/types.js +29 -0
- package/dist/faction/reputation.d.ts +5 -0
- package/dist/faction/reputation.js +5 -0
- package/dist/format/distance.d.ts +17 -0
- package/dist/format/distance.js +18 -0
- package/dist/format/duration.d.ts +27 -0
- package/dist/format/duration.js +45 -0
- package/dist/format/speed.d.ts +17 -0
- package/dist/format/speed.js +25 -0
- package/dist/game/connectedPlayers.d.ts +30 -0
- package/dist/game/connectedPlayers.js +21 -0
- package/dist/game/cosmetics.d.ts +9 -0
- package/dist/game/cosmetics.js +16 -0
- package/dist/game/defineGame.d.ts +141 -2
- package/dist/game/defineGame.js +39 -1
- package/dist/game/defineSystem.d.ts +88 -0
- package/dist/game/defineSystem.js +45 -0
- package/dist/game/dialogue.d.ts +33 -0
- package/dist/game/dialogue.js +21 -0
- package/dist/game/events.d.ts +50 -13
- package/dist/game/events.js +5 -0
- package/dist/game/feed.d.ts +33 -0
- package/dist/game/feed.js +35 -2
- package/dist/game/gamePhase.d.ts +11 -0
- package/dist/game/gamePhase.js +16 -0
- package/dist/game/keyValueStore.d.ts +25 -0
- package/dist/game/keyValueStore.js +61 -0
- package/dist/game/leaderboard.d.ts +5 -0
- package/dist/game/leaderboard.js +5 -0
- package/dist/game/levelSequence.d.ts +24 -2
- package/dist/game/levelSequence.js +51 -2
- package/dist/game/loadout.d.ts +5 -0
- package/dist/game/loadout.js +5 -0
- package/dist/game/lootFilter.d.ts +2 -0
- package/dist/game/lootFilter.js +2 -0
- package/dist/game/lootPipeline.d.ts +164 -0
- package/dist/game/lootPipeline.js +216 -0
- package/dist/game/lootTable.d.ts +21 -0
- package/dist/game/lootTable.js +15 -4
- package/dist/game/modelAnimation.d.ts +8 -0
- package/dist/game/modelAnimation.js +18 -0
- package/dist/game/objectives.d.ts +43 -0
- package/dist/game/objectives.js +36 -0
- package/dist/game/paramLayers.d.ts +148 -0
- package/dist/game/paramLayers.js +185 -0
- package/dist/game/ping.d.ts +5 -0
- package/dist/game/ping.js +5 -0
- package/dist/game/playableGame.d.ts +160 -12
- package/dist/game/quest.d.ts +8 -0
- package/dist/game/quest.js +29 -0
- package/dist/game/race.d.ts +141 -0
- package/dist/game/race.js +169 -0
- package/dist/game/recordBook.d.ts +5 -5
- package/dist/game/recordBook.js +4 -1
- package/dist/game/ruleSelection.d.ts +75 -0
- package/dist/game/ruleSelection.js +127 -0
- package/dist/game/runDraft.d.ts +5 -0
- package/dist/game/runDraft.js +5 -0
- package/dist/game/saveStore.d.ts +111 -0
- package/dist/game/saveStore.js +312 -0
- package/dist/game/snapshotHistory.d.ts +67 -0
- package/dist/game/snapshotHistory.js +95 -0
- package/dist/game/social.d.ts +38 -1
- package/dist/game/social.js +71 -0
- package/dist/game/spawnPoints.d.ts +5 -0
- package/dist/game/spawnPoints.js +5 -0
- package/dist/game/systemRuntime.d.ts +50 -0
- package/dist/game/systemRuntime.js +157 -0
- package/dist/game/systemSchedule.d.ts +72 -0
- package/dist/game/systemSchedule.js +242 -0
- package/dist/game/toasts.d.ts +43 -0
- package/dist/game/toasts.js +44 -0
- package/dist/game/trade.d.ts +10 -0
- package/dist/game/trade.js +10 -0
- package/dist/game/unlocks.d.ts +8 -0
- package/dist/game/unlocks.js +16 -0
- package/dist/game/vfxInstance.d.ts +138 -0
- package/dist/game/vfxInstance.js +96 -0
- package/dist/game/worldItem.d.ts +17 -4
- package/dist/game/worldItem.js +17 -4
- package/dist/gameplay.d.ts +91 -0
- package/dist/gameplay.js +91 -0
- package/dist/index.d.ts +5 -7
- package/dist/index.js +5 -7
- package/dist/input/actionBindings.d.ts +24 -5
- package/dist/input/actionBindings.js +23 -5
- package/dist/input/axisInput.d.ts +13 -1
- package/dist/input/axisInput.js +22 -1
- package/dist/input/controlGroups.d.ts +67 -0
- package/dist/input/controlGroups.js +41 -0
- package/dist/input/touchScheme.d.ts +82 -6
- package/dist/input/touchScheme.js +123 -10
- package/dist/interaction/contextMenu.d.ts +1 -0
- package/dist/interaction/contextMenu.js +1 -0
- package/dist/interaction/lockpick.d.ts +61 -0
- package/dist/interaction/lockpick.js +168 -0
- package/dist/interaction/proximityPrompt.d.ts +5 -1
- package/dist/interaction/proximityPrompt.js +5 -3
- package/dist/interaction/qte.d.ts +5 -0
- package/dist/interaction/qte.js +5 -0
- package/dist/interaction/skillCheck.d.ts +5 -0
- package/dist/interaction/skillCheck.js +5 -0
- package/dist/inventory/inventoryModel.d.ts +12 -0
- package/dist/inventory/inventoryModel.js +12 -0
- package/dist/inventory/shapedGrid.d.ts +16 -0
- package/dist/inventory/shapedGrid.js +16 -0
- package/dist/inventory/slotModel.d.ts +10 -0
- package/dist/inventory/slotModel.js +10 -0
- package/dist/item/durability.d.ts +5 -0
- package/dist/item/durability.js +5 -0
- package/dist/item/itemIdentity.d.ts +171 -0
- package/dist/item/itemIdentity.js +138 -0
- package/dist/item/itemInstanceRegistry.d.ts +32 -0
- package/dist/item/itemInstanceRegistry.js +34 -0
- package/dist/item/itemgen.d.ts +163 -0
- package/dist/item/itemgen.js +151 -0
- package/dist/item/modularItem.d.ts +5 -0
- package/dist/item/modularItem.js +5 -0
- package/dist/item/use.d.ts +5 -0
- package/dist/item/use.js +5 -0
- package/dist/item/useBehavior.d.ts +142 -0
- package/dist/item/useBehavior.js +105 -0
- package/dist/item/weapon.d.ts +5 -0
- package/dist/item/weapon.js +5 -0
- package/dist/math/scalar.d.ts +25 -0
- package/dist/math/scalar.js +47 -0
- package/dist/meta/changelog.d.ts +4 -1
- package/dist/meta/changelog.js +36 -1
- package/dist/movement/avoidance.d.ts +45 -0
- package/dist/movement/avoidance.js +123 -0
- package/dist/movement/cameraRig.d.ts +8 -0
- package/dist/movement/cameraRig.js +8 -0
- package/dist/movement/dash.d.ts +11 -0
- package/dist/movement/dash.js +11 -0
- package/dist/movement/formation.d.ts +135 -0
- package/dist/movement/formation.js +194 -0
- package/dist/movement/glideModel.d.ts +5 -0
- package/dist/movement/glideModel.js +5 -0
- package/dist/movement/grappleSwing.d.ts +5 -0
- package/dist/movement/grappleSwing.js +5 -0
- package/dist/movement/leaderTrail.d.ts +5 -0
- package/dist/movement/leaderTrail.js +5 -0
- package/dist/movement/movementModel.d.ts +38 -7
- package/dist/movement/movementModel.js +54 -13
- package/dist/movement/playerMovement.d.ts +41 -0
- package/dist/movement/playerMovement.js +236 -0
- package/dist/movement/poseState.d.ts +13 -0
- package/dist/movement/poseState.js +16 -0
- package/dist/movement/steering.d.ts +8 -0
- package/dist/movement/steering.js +18 -0
- package/dist/multiplayer/combatSnapshot.d.ts +3 -0
- package/dist/multiplayer/combatSnapshot.js +3 -0
- package/dist/multiplayer/lagCompensation.d.ts +5 -0
- package/dist/multiplayer/lagCompensation.js +5 -0
- package/dist/multiplayer/presenceModel.d.ts +9 -1
- package/dist/multiplayer/presenceModel.js +9 -1
- package/dist/multiplayer/simultaneousCommit.d.ts +3 -0
- package/dist/multiplayer/simultaneousCommit.js +3 -0
- package/dist/multiplayer.d.ts +11 -0
- package/dist/multiplayer.js +11 -0
- package/dist/nav/pathFollow.d.ts +57 -0
- package/dist/nav/pathFollow.js +109 -0
- package/dist/orders/orderKinds.d.ts +156 -0
- package/dist/orders/orderKinds.js +197 -0
- package/dist/orders/orderQueue.d.ts +208 -0
- package/dist/orders/orderQueue.js +211 -0
- package/dist/physics/drivableVehicle.d.ts +29 -0
- package/dist/physics/drivableVehicle.js +16 -0
- package/dist/physics/kinematicVehicle.d.ts +21 -1
- package/dist/physics/kinematicVehicle.js +23 -8
- package/dist/physics/physicsWorld.d.ts +24 -12
- package/dist/physics/physicsWorld.js +11 -5
- package/dist/physics/radialImpulse.d.ts +25 -0
- package/dist/physics/radialImpulse.js +27 -0
- package/dist/procedural.d.ts +3 -0
- package/dist/procedural.js +3 -0
- package/dist/progression/statGraph.d.ts +116 -0
- package/dist/progression/statGraph.js +318 -0
- package/dist/puzzle/cellGrid.d.ts +9 -0
- package/dist/puzzle/cellGrid.js +9 -0
- package/dist/puzzle/fallingPiece.d.ts +9 -0
- package/dist/puzzle/fallingPiece.js +9 -0
- package/dist/puzzle/nonogram.d.ts +39 -0
- package/dist/puzzle/nonogram.js +136 -0
- package/dist/random/nameGen.d.ts +5 -0
- package/dist/random/nameGen.js +5 -0
- package/dist/random/pick.d.ts +8 -0
- package/dist/random/pick.js +31 -0
- package/dist/random/rng.d.ts +24 -0
- package/dist/random/rng.js +30 -8
- package/dist/random/seedLink.d.ts +4 -0
- package/dist/random/seedLink.js +4 -0
- package/dist/relation/keyedValues.d.ts +54 -0
- package/dist/relation/keyedValues.js +115 -0
- package/dist/relation/thresholds.d.ts +62 -0
- package/dist/relation/thresholds.js +62 -0
- package/dist/render/color.d.ts +12 -0
- package/dist/render/color.js +26 -0
- package/dist/render/lookPreset.d.ts +41 -0
- package/dist/render/lookPreset.js +29 -0
- package/dist/render/postProcessing.d.ts +76 -0
- package/dist/render/postProcessing.js +21 -0
- package/dist/rules/predicate.d.ts +53 -0
- package/dist/rules/predicate.js +64 -0
- package/dist/rules/ruleEffects.d.ts +38 -0
- package/dist/rules/ruleEffects.js +37 -0
- package/dist/rules/triggeredRules.d.ts +160 -0
- package/dist/rules/triggeredRules.js +241 -0
- package/dist/runtime/adapter.d.ts +58 -0
- package/dist/runtime/adapter.js +54 -5
- package/dist/runtime/cameraDirector.d.ts +1 -0
- package/dist/runtime/cameraDirector.js +1 -0
- package/dist/runtime/commandRunner.d.ts +1 -0
- package/dist/runtime/commandRunner.js +1 -0
- package/dist/runtime/context/combatFx.d.ts +23 -0
- package/dist/runtime/context/combatFx.js +161 -0
- package/dist/runtime/context/registries.d.ts +13 -0
- package/dist/runtime/context/registries.js +84 -0
- package/dist/runtime/context/worldItems.d.ts +21 -0
- package/dist/runtime/context/worldItems.js +37 -0
- package/dist/runtime/descriptors/baseline.d.ts +48 -0
- package/dist/runtime/descriptors/baseline.js +134 -0
- package/dist/runtime/descriptors/features.d.ts +74 -0
- package/dist/runtime/descriptors/features.js +281 -0
- package/dist/runtime/gameContext.d.ts +163 -19
- package/dist/runtime/gameContext.js +385 -339
- package/dist/runtime/gameRuntime.d.ts +1 -0
- package/dist/runtime/gameRuntime.js +1 -0
- package/dist/runtime/headlessRunner.d.ts +60 -0
- package/dist/runtime/headlessRunner.js +44 -0
- package/dist/runtime/hostPersistence.d.ts +12 -0
- package/dist/runtime/hostPersistence.js +12 -0
- package/dist/runtime/hostedGameRunner.d.ts +54 -0
- package/dist/runtime/hostedGameRunner.js +85 -0
- package/dist/runtime/hostedWorldSession.d.ts +73 -0
- package/dist/runtime/hostedWorldSession.js +64 -0
- package/dist/runtime/inputSnapshot.d.ts +21 -3
- package/dist/runtime/inputSnapshot.js +8 -2
- package/dist/runtime/motionIntents.d.ts +12 -1
- package/dist/runtime/motionIntents.js +26 -1
- package/dist/runtime/perContext.d.ts +15 -0
- package/dist/runtime/perContext.js +21 -0
- package/dist/runtime/runtimeSave.d.ts +79 -0
- package/dist/runtime/runtimeSave.js +105 -0
- package/dist/runtime/save.d.ts +4 -0
- package/dist/runtime/save.js +4 -0
- package/dist/runtime/snapshot.d.ts +7 -0
- package/dist/runtime/snapshot.js +7 -0
- package/dist/runtime/visibility.d.ts +2 -1
- package/dist/runtime/visibility.js +2 -1
- package/dist/runtime/worldChannel.d.ts +62 -0
- package/dist/runtime/worldChannel.js +114 -0
- package/dist/runtime/worldMirror.d.ts +36 -0
- package/dist/runtime/worldMirror.js +44 -0
- package/dist/runtime/worldProjection.d.ts +47 -0
- package/dist/runtime/worldProjection.js +52 -0
- package/dist/runtime/worldReplication.d.ts +69 -0
- package/dist/runtime/worldReplication.js +217 -0
- package/dist/runtime/worldSnapshot.d.ts +44 -0
- package/dist/runtime/worldSnapshot.js +30 -0
- package/dist/scene/assetCatalog.d.ts +22 -0
- package/dist/scene/assetCatalog.js +4 -0
- package/dist/scene/assetDiagnostics.d.ts +69 -0
- package/dist/scene/assetDiagnostics.js +110 -0
- package/dist/scene/assetGenerator.d.ts +65 -0
- package/dist/scene/assetGenerator.js +64 -0
- package/dist/scene/assetSpace.d.ts +137 -0
- package/dist/scene/assetSpace.js +259 -0
- package/dist/scene/authoredTriggers.d.ts +169 -0
- package/dist/scene/authoredTriggers.js +340 -0
- package/dist/scene/behaviorRuntime.d.ts +75 -0
- package/dist/scene/behaviorRuntime.js +217 -0
- package/dist/scene/behaviors.d.ts +14 -2
- package/dist/scene/behaviors.js +7 -2
- package/dist/scene/bodyBind.d.ts +60 -0
- package/dist/scene/bodyBind.js +51 -0
- package/dist/scene/builtinSceneKinds.d.ts +5 -0
- package/dist/scene/builtinSceneKinds.js +62 -0
- package/dist/scene/colliders.d.ts +18 -0
- package/dist/scene/colliders.js +61 -1
- package/dist/scene/entityStats.d.ts +13 -0
- package/dist/scene/entityStats.js +30 -0
- package/dist/scene/entityStore.d.ts +41 -1
- package/dist/scene/entityStore.js +75 -0
- package/dist/scene/facing.d.ts +18 -0
- package/dist/scene/facing.js +26 -0
- package/dist/scene/modelSockets.d.ts +33 -0
- package/dist/scene/modelSockets.js +29 -0
- package/dist/scene/objectQuery.d.ts +2 -0
- package/dist/scene/objectQuery.js +2 -0
- package/dist/scene/objectStore.d.ts +4 -0
- package/dist/scene/objectStore.js +6 -0
- package/dist/scene/possession.d.ts +8 -0
- package/dist/scene/possession.js +14 -0
- package/dist/scene/roster.d.ts +3 -0
- package/dist/scene/roster.js +12 -0
- package/dist/scene/sceneKinds.d.ts +240 -0
- package/dist/scene/sceneKinds.js +214 -0
- package/dist/scene/sceneOwnership.d.ts +169 -0
- package/dist/scene/sceneOwnership.js +179 -0
- package/dist/scene/selectionBookmarks.d.ts +93 -0
- package/dist/scene/selectionBookmarks.js +122 -0
- package/dist/scene/vehicleSeat.d.ts +68 -0
- package/dist/scene/vehicleSeat.js +59 -0
- package/dist/sensor/concealment.d.ts +3 -0
- package/dist/sensor/concealment.js +3 -0
- package/dist/sensor/freezeMonitor.d.ts +1 -0
- package/dist/sensor/freezeMonitor.js +1 -0
- package/dist/sensor/frustumSensor.d.ts +7 -3
- package/dist/sensor/frustumSensor.js +7 -3
- package/dist/sensor/hiddenStateProbe.d.ts +5 -2
- package/dist/sensor/hiddenStateProbe.js +5 -2
- package/dist/sensor/recordingBuffer.d.ts +2 -1
- package/dist/sensor/recordingBuffer.js +2 -1
- package/dist/sensor/replayLoop.d.ts +6 -2
- package/dist/sensor/replayLoop.js +6 -2
- package/dist/sensor/revealQuery.d.ts +2 -1
- package/dist/sensor/revealQuery.js +2 -1
- package/dist/sensor/visionCone.d.ts +10 -3
- package/dist/sensor/visionCone.js +10 -3
- package/dist/session/contestedChannel.d.ts +1 -0
- package/dist/session/contestedChannel.js +1 -0
- package/dist/session/extraction.d.ts +1 -0
- package/dist/session/extraction.js +1 -0
- package/dist/session/roles.d.ts +6 -0
- package/dist/session/roles.js +6 -0
- package/dist/session/roundState.d.ts +8 -0
- package/dist/session/roundState.js +2 -0
- package/dist/settings/settingsModel.d.ts +1 -0
- package/dist/settings/settingsModel.js +1 -0
- package/dist/stats/accumulatorMeter.d.ts +6 -0
- package/dist/stats/accumulatorMeter.js +6 -0
- package/dist/stats/eventMeter.d.ts +5 -0
- package/dist/stats/eventMeter.js +5 -0
- package/dist/stats/rollCheck.d.ts +5 -0
- package/dist/stats/rollCheck.js +5 -0
- package/dist/stats/statModifiers.d.ts +5 -0
- package/dist/stats/statModifiers.js +5 -0
- package/dist/store/defineKeyedStore.d.ts +38 -0
- package/dist/store/defineKeyedStore.js +42 -0
- package/dist/store/defineStore.d.ts +33 -0
- package/dist/store/defineStore.js +35 -0
- package/dist/store/observableKeyedStore.d.ts +9 -0
- package/dist/store/observableKeyedStore.js +43 -2
- package/dist/survival/decayMeter.d.ts +55 -0
- package/dist/survival/decayMeter.js +130 -55
- package/dist/survival/moodle.d.ts +2 -0
- package/dist/survival/regionHealth.d.ts +6 -0
- package/dist/survival/regionHealth.js +5 -0
- package/dist/tactics/fallingGrid.d.ts +6 -4
- package/dist/tactics/fallingGrid.js +6 -4
- package/dist/tactics/predictiveQuery.d.ts +3 -0
- package/dist/tactics/predictiveQuery.js +3 -0
- package/dist/tactics/snapshot.d.ts +2 -0
- package/dist/tactics/snapshot.js +2 -0
- package/dist/tactics/surface.d.ts +1 -0
- package/dist/tactics/surface.js +1 -0
- package/dist/tactics/tacticalGrid.d.ts +1 -0
- package/dist/tactics/tacticalGrid.js +1 -0
- package/dist/time/beatClock.d.ts +14 -4
- package/dist/time/beatClock.js +14 -4
- package/dist/time/calendarClock.d.ts +3 -0
- package/dist/time/calendarClock.js +3 -0
- package/dist/time/idleProgress.d.ts +4 -0
- package/dist/time/idleProgress.js +4 -0
- package/dist/time/simClock.d.ts +2 -0
- package/dist/time/simClock.js +20 -5
- package/dist/ui/actionModel.d.ts +110 -0
- package/dist/ui/actionModel.js +159 -0
- package/dist/ui/gameLayout.d.ts +144 -0
- package/dist/ui/gameLayout.js +148 -0
- package/dist/ui/hudDocument.d.ts +114 -0
- package/dist/ui/hudDocument.js +220 -0
- package/dist/ui/hudLayout.d.ts +33 -1
- package/dist/ui/hudLayout.js +204 -17
- package/dist/ui/orientation.d.ts +39 -0
- package/dist/ui/orientation.js +49 -0
- package/dist/ui/selectionModel.d.ts +92 -0
- package/dist/ui/selectionModel.js +88 -0
- package/dist/ui/swingTimer.d.ts +42 -0
- package/dist/ui/swingTimer.js +38 -0
- package/dist/ui/tooltipModel.d.ts +63 -0
- package/dist/ui/tooltipModel.js +82 -0
- package/dist/ui.d.ts +15 -0
- package/dist/ui.js +15 -0
- package/dist/visibility/bounds.d.ts +8 -1
- package/dist/visibility/bounds.js +8 -1
- package/dist/visibility/frustum.d.ts +12 -3
- package/dist/visibility/frustum.js +12 -3
- package/dist/visibility/spatialIndex.js +34 -20
- package/dist/work/jobQueue.d.ts +201 -0
- package/dist/work/jobQueue.js +253 -0
- package/dist/work/unitTraining.d.ts +58 -0
- package/dist/work/unitTraining.js +52 -0
- package/dist/world/authoredObjects.d.ts +58 -0
- package/dist/world/authoredObjects.js +69 -0
- package/dist/world/buildingGenerator.d.ts +18 -0
- package/dist/world/buildingGenerator.js +62 -0
- package/dist/world/buildings.d.ts +5 -0
- package/dist/world/buildings.js +5 -0
- package/dist/world/catenary.d.ts +22 -0
- package/dist/world/catenary.js +69 -0
- package/dist/world/environmentSummary.d.ts +11 -2
- package/dist/world/environmentSummary.js +11 -1
- package/dist/world/features.d.ts +244 -7
- package/dist/world/features.js +92 -4
- package/dist/world/footprintGrid.d.ts +59 -0
- package/dist/world/footprintGrid.js +141 -0
- package/dist/world/geometry.d.ts +64 -0
- package/dist/world/geometry.js +94 -0
- package/dist/world/grassKind.d.ts +51 -0
- package/dist/world/grassKind.js +101 -0
- package/dist/world/pathInstances.d.ts +27 -0
- package/dist/world/pathInstances.js +27 -0
- package/dist/world/pathTerrain.d.ts +80 -0
- package/dist/world/pathTerrain.js +142 -0
- package/dist/world/placeAsset.d.ts +81 -0
- package/dist/world/placeAsset.js +77 -0
- package/dist/world/placement.d.ts +4 -0
- package/dist/world/placement.js +4 -0
- package/dist/world/placementController.d.ts +6 -0
- package/dist/world/placementController.js +6 -0
- package/dist/world/polyline.d.ts +34 -0
- package/dist/world/polyline.js +81 -0
- package/dist/world/roads.d.ts +55 -0
- package/dist/world/roads.js +184 -0
- package/dist/world/scatterRegion.d.ts +164 -0
- package/dist/world/scatterRegion.js +409 -0
- package/dist/world/sceneShapes.d.ts +43 -0
- package/dist/world/sceneShapes.js +1 -0
- package/dist/world/segment.d.ts +27 -0
- package/dist/world/segment.js +43 -0
- package/dist/world/soilKind.d.ts +48 -0
- package/dist/world/soilKind.js +92 -0
- package/dist/world/spatialSample.d.ts +241 -0
- package/dist/world/spatialSample.js +465 -0
- package/dist/world/streets.d.ts +80 -0
- package/dist/world/streets.js +144 -0
- package/dist/world/terraform.d.ts +213 -1
- package/dist/world/terraform.js +655 -20
- package/dist/world/terrain.d.ts +138 -12
- package/dist/world/terrain.js +346 -28
- package/dist/world/terrainGuides.d.ts +182 -0
- package/dist/world/terrainGuides.js +343 -0
- package/dist/world/vec2.d.ts +81 -0
- package/dist/world/vec2.js +128 -0
- package/dist/world/vec3.d.ts +49 -0
- package/dist/world/vec3.js +76 -0
- package/dist/world/vegetation.d.ts +71 -0
- package/dist/world/vegetation.js +151 -0
- package/dist/world/visibilityField.d.ts +154 -0
- package/dist/world/visibilityField.js +271 -0
- package/dist/world/volumetricClouds.d.ts +52 -0
- package/dist/world/volumetricClouds.js +43 -0
- package/dist/world/walls.d.ts +9 -0
- package/dist/world/walls.js +9 -0
- package/dist/world/waterKind.d.ts +55 -0
- package/dist/world/waterKind.js +99 -0
- package/dist/world.d.ts +132 -0
- package/dist/world.js +132 -0
- package/package.json +32 -8
- package/skills/jgengine/SKILL.md +51 -0
- package/skills/jgengine/api.md +434 -0
- package/skills/jgengine/capabilities.md +29 -0
- package/skills/jgengine/reference-cartridge.md +72 -0
- package/skills/jgengine-combat/SKILL.md +34 -0
- package/skills/jgengine-combat/api.md +549 -0
- package/skills/jgengine-combat/capabilities.md +169 -0
- package/skills/jgengine-combat/reference.md +98 -0
- package/skills/jgengine-gameplay/SKILL.md +39 -0
- package/skills/jgengine-gameplay/api.md +1794 -0
- package/skills/jgengine-gameplay/capabilities.md +378 -0
- package/skills/jgengine-gameplay/reference-systems.md +60 -0
- package/skills/jgengine-world/SKILL.md +38 -0
- package/skills/jgengine-world/api.md +2652 -0
- package/skills/jgengine-world/capabilities.md +370 -0
- package/skills/jgengine-world/reference.md +222 -0
- package/dist/cartridge/runtime.d.ts +0 -15
- package/dist/cartridge/runtime.js +0 -556
- package/dist/cartridge/spec.d.ts +0 -188
- package/dist/cartridge/spec.js +0 -19
- package/dist/cartridge/validate.d.ts +0 -2
- package/dist/cartridge/validate.js +0 -78
- package/dist/store/engineStore.d.ts +0 -22
- package/dist/store/engineStore.js +0 -50
- package/dist/store/features.d.ts +0 -10
- package/dist/store/features.js +0 -23
- package/llms.txt +0 -4983
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>;
|
|
@@ -0,0 +1,197 @@
|
|
|
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
|
+
const RUNNING = { status: "running" };
|
|
12
|
+
const COMPLETED = { status: "completed" };
|
|
13
|
+
const DEFAULT_ARRIVE = 0.6;
|
|
14
|
+
function gone() {
|
|
15
|
+
return { status: "failed", reason: "mover has no position (despawned)" };
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* The plain "go here" verb: step toward a point each tick, complete on arrival,
|
|
19
|
+
* fail if the entity despawns. The completion predicate is arrival within
|
|
20
|
+
* `arriveRadius`.
|
|
21
|
+
*
|
|
22
|
+
* @capability move-order go-to-point order that completes on arrival, composed over a motion adapter
|
|
23
|
+
*/
|
|
24
|
+
export function defineMoveOrder(config = {}) {
|
|
25
|
+
const arriveDefault = config.arriveRadius ?? DEFAULT_ARRIVE;
|
|
26
|
+
return {
|
|
27
|
+
kind: config.kind ?? "move",
|
|
28
|
+
validate: (payload) => (Array.isArray(payload.point) ? null : { reason: "move order requires a point." }),
|
|
29
|
+
start: () => ({ ok: true }),
|
|
30
|
+
update(order, ctx) {
|
|
31
|
+
if (ctx.position() === null)
|
|
32
|
+
return gone();
|
|
33
|
+
const arriveRadius = order.payload.arriveRadius ?? arriveDefault;
|
|
34
|
+
const result = ctx.moveToward(order.payload.point, { arriveRadius, speedScale: order.payload.speedScale });
|
|
35
|
+
return result.arrived ? COMPLETED : RUNNING;
|
|
36
|
+
},
|
|
37
|
+
finish: (_order, ctx) => ctx.halt(),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Stop: halt immediately and complete the same tick — the interrupt that clears
|
|
42
|
+
* a unit's intent to standstill.
|
|
43
|
+
*
|
|
44
|
+
* @capability stop-order halt-and-complete order that brings a unit to an immediate standstill
|
|
45
|
+
*/
|
|
46
|
+
export function defineStopOrder(config = {}) {
|
|
47
|
+
return {
|
|
48
|
+
kind: config.kind ?? "stop",
|
|
49
|
+
start(_order, ctx) {
|
|
50
|
+
ctx.halt();
|
|
51
|
+
return { ok: true };
|
|
52
|
+
},
|
|
53
|
+
update: () => COMPLETED,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Hold position: stand ground indefinitely (never completes on its own) until
|
|
58
|
+
* preempted or canceled — the "guard here" verb.
|
|
59
|
+
*
|
|
60
|
+
* @capability hold-order stand-ground order that holds position until preempted or canceled
|
|
61
|
+
*/
|
|
62
|
+
export function defineHoldOrder(config = {}) {
|
|
63
|
+
return {
|
|
64
|
+
kind: config.kind ?? "hold",
|
|
65
|
+
start(_order, ctx) {
|
|
66
|
+
ctx.halt();
|
|
67
|
+
return { ok: true };
|
|
68
|
+
},
|
|
69
|
+
update(_order, ctx) {
|
|
70
|
+
return ctx.position() === null ? gone() : RUNNING;
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Attack-move: advance toward a destination but break off to engage any hostile
|
|
76
|
+
* acquired within `aggroRadius`, pursuing it to `attackRange` and writing the
|
|
77
|
+
* engagement intent into `order.state` for the game to act on. Completes on
|
|
78
|
+
* reaching the destination with nothing to engage.
|
|
79
|
+
*
|
|
80
|
+
* @capability attack-move-order advance-and-engage order that pursues hostiles en route and completes at its destination
|
|
81
|
+
*/
|
|
82
|
+
export function defineAttackMoveOrder(config = {}) {
|
|
83
|
+
const arriveDefault = config.arriveRadius ?? DEFAULT_ARRIVE;
|
|
84
|
+
const aggroDefault = config.aggroRadius ?? 6;
|
|
85
|
+
const attackDefault = config.attackRange ?? 1.5;
|
|
86
|
+
return {
|
|
87
|
+
kind: config.kind ?? "attack-move",
|
|
88
|
+
validate: (payload) => (Array.isArray(payload.point) ? null : { reason: "attack-move order requires a point." }),
|
|
89
|
+
start(order) {
|
|
90
|
+
order.state = { engaging: null, inRange: false };
|
|
91
|
+
return { ok: true };
|
|
92
|
+
},
|
|
93
|
+
update(order, ctx) {
|
|
94
|
+
const position = ctx.position();
|
|
95
|
+
if (position === null)
|
|
96
|
+
return gone();
|
|
97
|
+
const state = order.state;
|
|
98
|
+
const attackRange = order.payload.attackRange ?? attackDefault;
|
|
99
|
+
// Keep the current target if it is still alive, else re-acquire.
|
|
100
|
+
let targetPos = state.engaging !== null ? ctx.positionOf(state.engaging) : null;
|
|
101
|
+
if (targetPos === null) {
|
|
102
|
+
const acquired = ctx.acquire(order.payload.aggroRadius ?? aggroDefault);
|
|
103
|
+
state.engaging = acquired;
|
|
104
|
+
targetPos = acquired !== null ? ctx.positionOf(acquired) : null;
|
|
105
|
+
}
|
|
106
|
+
if (state.engaging !== null && targetPos !== null) {
|
|
107
|
+
const result = ctx.moveToward(targetPos, { arriveRadius: attackRange, speedScale: order.payload.speedScale });
|
|
108
|
+
state.inRange = result.arrived;
|
|
109
|
+
return RUNNING;
|
|
110
|
+
}
|
|
111
|
+
state.engaging = null;
|
|
112
|
+
state.inRange = false;
|
|
113
|
+
const result = ctx.moveToward(order.payload.point, {
|
|
114
|
+
arriveRadius: order.payload.arriveRadius ?? arriveDefault,
|
|
115
|
+
speedScale: order.payload.speedScale,
|
|
116
|
+
});
|
|
117
|
+
return result.arrived ? COMPLETED : RUNNING;
|
|
118
|
+
},
|
|
119
|
+
finish: (_order, ctx) => ctx.halt(),
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Targeted action: pursue one specific target until within `range`, writing the
|
|
124
|
+
* engagement intent into `order.state`. Completes when the target is gone
|
|
125
|
+
* (despawned/dead), so the game's effect loop runs while `inRange` is true.
|
|
126
|
+
*
|
|
127
|
+
* @capability targeted-order pursue-a-target order with leash/standoff that ends when the target is gone
|
|
128
|
+
*/
|
|
129
|
+
export function defineTargetedOrder(config = {}) {
|
|
130
|
+
const rangeDefault = config.range ?? 1.5;
|
|
131
|
+
return {
|
|
132
|
+
kind: config.kind ?? "targeted",
|
|
133
|
+
validate: (payload) => (typeof payload.targetId === "string" && payload.targetId !== "" ? null : { reason: "targeted order requires a targetId." }),
|
|
134
|
+
start(order) {
|
|
135
|
+
order.state = { engaging: order.payload.targetId, inRange: false };
|
|
136
|
+
return { ok: true };
|
|
137
|
+
},
|
|
138
|
+
update(order, ctx) {
|
|
139
|
+
if (ctx.position() === null)
|
|
140
|
+
return gone();
|
|
141
|
+
const state = order.state;
|
|
142
|
+
const targetPos = ctx.positionOf(order.payload.targetId);
|
|
143
|
+
if (targetPos === null)
|
|
144
|
+
return COMPLETED; // target gone -> objective resolved
|
|
145
|
+
const range = order.payload.range ?? rangeDefault;
|
|
146
|
+
const result = ctx.moveToward(targetPos, { arriveRadius: range, speedScale: order.payload.speedScale });
|
|
147
|
+
state.inRange = result.arrived;
|
|
148
|
+
return RUNNING;
|
|
149
|
+
},
|
|
150
|
+
finish: (_order, ctx) => ctx.halt(),
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Patrol: walk a waypoint route, advancing the serialized `index` as each point
|
|
155
|
+
* is reached. Loops forever by default, or completes at the last waypoint when
|
|
156
|
+
* `loop` is `false`.
|
|
157
|
+
*
|
|
158
|
+
* @capability patrol-order waypoint-route order that cycles a path, looping or completing at the end
|
|
159
|
+
*/
|
|
160
|
+
export function definePatrolOrder(config = {}) {
|
|
161
|
+
const arriveDefault = config.arriveRadius ?? DEFAULT_ARRIVE;
|
|
162
|
+
return {
|
|
163
|
+
kind: config.kind ?? "patrol",
|
|
164
|
+
validate: (payload) => Array.isArray(payload.waypoints) && payload.waypoints.length > 0 ? null : { reason: "patrol order requires at least one waypoint." },
|
|
165
|
+
start(order) {
|
|
166
|
+
order.state = { index: 0 };
|
|
167
|
+
return { ok: true };
|
|
168
|
+
},
|
|
169
|
+
update(order, ctx) {
|
|
170
|
+
if (ctx.position() === null)
|
|
171
|
+
return gone();
|
|
172
|
+
const state = order.state;
|
|
173
|
+
const waypoints = order.payload.waypoints;
|
|
174
|
+
const loop = order.payload.loop ?? true;
|
|
175
|
+
const target = waypoints[state.index];
|
|
176
|
+
if (target === undefined)
|
|
177
|
+
return COMPLETED;
|
|
178
|
+
const result = ctx.moveToward(target, {
|
|
179
|
+
arriveRadius: order.payload.arriveRadius ?? arriveDefault,
|
|
180
|
+
speedScale: order.payload.speedScale,
|
|
181
|
+
});
|
|
182
|
+
if (!result.arrived)
|
|
183
|
+
return RUNNING;
|
|
184
|
+
const next = state.index + 1;
|
|
185
|
+
if (next >= waypoints.length) {
|
|
186
|
+
if (!loop)
|
|
187
|
+
return COMPLETED;
|
|
188
|
+
state.index = 0;
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
state.index = next;
|
|
192
|
+
}
|
|
193
|
+
return RUNNING;
|
|
194
|
+
},
|
|
195
|
+
finish: (_order, ctx) => ctx.halt(),
|
|
196
|
+
};
|
|
197
|
+
}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Composable entity orders: a serializable command queue with lifecycle,
|
|
3
|
+
* preemption, and pluggable order kinds (#912). Player- or AI-issued intent
|
|
4
|
+
* ("move here", "attack that", "patrol this route") becomes reusable data
|
|
5
|
+
* instead of a hard-coded RTS verb kit. The queue owns issue -> activate ->
|
|
6
|
+
* tick -> complete/cancel lifecycle and deterministic preemption policy; each
|
|
7
|
+
* order KIND owns what "running" means, composed over narrow world adapters.
|
|
8
|
+
* Engine code never branches on `move`, `attack`, or any game verb -- kinds are
|
|
9
|
+
* looked up by string in a registry, so a game adds a verb by registering data.
|
|
10
|
+
*/
|
|
11
|
+
/** XZ+Y position triple, matching the engine heading convention used across `movement`/`scene`. */
|
|
12
|
+
export type OrderVec3 = readonly [number, number, number];
|
|
13
|
+
/** Lifecycle phase of a single order. `queued` waits behind the active order; `active` is ticking; `completed`/`canceled` are terminal. */
|
|
14
|
+
export type OrderPhase = "queued" | "active" | "completed" | "canceled";
|
|
15
|
+
/**
|
|
16
|
+
* Why an order left the queue without completing. `replaced`/`preempted` come
|
|
17
|
+
* from a newer order taking over; `requested` from explicit `cancelActive`;
|
|
18
|
+
* `invalid` when the kind's `start` rejects; `failed` when `update` reports
|
|
19
|
+
* failure; `cleared` from a full `clear`/`cancelAll`.
|
|
20
|
+
*/
|
|
21
|
+
export type OrderCancelReason = "replaced" | "preempted" | "requested" | "invalid" | "failed" | "cleared";
|
|
22
|
+
/**
|
|
23
|
+
* One issued order. Fully serializable: `kind` is a registry key (not a
|
|
24
|
+
* closure), `payload` is the caller's plain data, and `state` is the kind's own
|
|
25
|
+
* plain progress scratch (e.g. a patrol waypoint index) written during
|
|
26
|
+
* `start`/`update`. Never holds functions, so the whole queue round-trips
|
|
27
|
+
* through `JSON`/`structuredClone`.
|
|
28
|
+
*/
|
|
29
|
+
export interface Order<TPayload = unknown> {
|
|
30
|
+
/** Stable id, caller-supplied or generated deterministically by the queue. */
|
|
31
|
+
readonly id: string;
|
|
32
|
+
/** Registry key selecting the order kind. */
|
|
33
|
+
readonly kind: string;
|
|
34
|
+
/** Caller data the kind interprets (destination, target id, waypoints, ...). */
|
|
35
|
+
readonly payload: TPayload;
|
|
36
|
+
/** Current lifecycle phase; the queue owns transitions. */
|
|
37
|
+
phase: OrderPhase;
|
|
38
|
+
/** When `true`, preemption policies may not cancel this order mid-flight; a replacing order waits until it finishes. */
|
|
39
|
+
uninterruptible: boolean;
|
|
40
|
+
/** Optional authority tag (which player/AI issued it) carried for replication/audit; the queue does not interpret it. */
|
|
41
|
+
issuer?: string;
|
|
42
|
+
/** Kind-owned serializable progress; `undefined` until the kind activates. */
|
|
43
|
+
state?: unknown;
|
|
44
|
+
/** Set once `phase === "canceled"`. */
|
|
45
|
+
cancelReason?: OrderCancelReason;
|
|
46
|
+
}
|
|
47
|
+
/** A kind's refusal of a payload (from `validate`) — surfaced to the issuer as a rejection reason. */
|
|
48
|
+
export interface OrderRejection {
|
|
49
|
+
reason: string;
|
|
50
|
+
}
|
|
51
|
+
/** Result of a kind's `start`: `ok:false` skips the order and cancels it with reason `invalid`. The kind seeds `order.state` directly when `ok:true`. */
|
|
52
|
+
export type OrderStartResult = {
|
|
53
|
+
ok: true;
|
|
54
|
+
} | {
|
|
55
|
+
ok: false;
|
|
56
|
+
reason: string;
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* Result of a kind's `update` tick. `running` keeps the order active; the
|
|
60
|
+
* completion predicate lives in the kind (returns `completed`); `failed` cancels
|
|
61
|
+
* the order (reason `failed`) so the queue advances to the next one.
|
|
62
|
+
*/
|
|
63
|
+
export type OrderProgress = {
|
|
64
|
+
status: "running";
|
|
65
|
+
} | {
|
|
66
|
+
status: "completed";
|
|
67
|
+
} | {
|
|
68
|
+
status: "failed";
|
|
69
|
+
reason: string;
|
|
70
|
+
};
|
|
71
|
+
/** Terminal outcome handed to a kind's `finish` cleanup hook. */
|
|
72
|
+
export interface OrderOutcome {
|
|
73
|
+
phase: "completed" | "canceled";
|
|
74
|
+
reason?: OrderCancelReason;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* The composition seam for one order verb. `TCtx` is the game's world adapter
|
|
78
|
+
* (movement, targeting, effects) shared by every kind in a registry; `TPayload`
|
|
79
|
+
* is this verb's caller data. `start` seeds `order.state`, `update` advances it
|
|
80
|
+
* and reports lifecycle, and `finish` releases anything the kind held. Kinds are
|
|
81
|
+
* pure over their injected `ctx` -- no globals, no direct scene reach.
|
|
82
|
+
*/
|
|
83
|
+
export interface OrderKind<TCtx, TPayload = unknown> {
|
|
84
|
+
/** The registry key; also the default `Order.kind` for issues of this verb. */
|
|
85
|
+
readonly kind: string;
|
|
86
|
+
/** Reject a malformed payload before it ever queues. */
|
|
87
|
+
validate?(payload: TPayload): OrderRejection | null;
|
|
88
|
+
/** Called once when the order becomes active. Seed `order.state` here; return `ok:false` to skip it. */
|
|
89
|
+
start(order: Order<TPayload>, ctx: TCtx): OrderStartResult;
|
|
90
|
+
/** Advance one tick. Read/write `order.state`; drive the world through `ctx`; report lifecycle. */
|
|
91
|
+
update(order: Order<TPayload>, ctx: TCtx, dt: number): OrderProgress;
|
|
92
|
+
/** Cleanup hook on completion or cancellation (stop movement, drop reservations). */
|
|
93
|
+
finish?(order: Order<TPayload>, ctx: TCtx, outcome: OrderOutcome): void;
|
|
94
|
+
}
|
|
95
|
+
/** Registry of order kinds keyed by verb string; the queue dispatches through it so engine code never switches on a verb. */
|
|
96
|
+
export interface OrderRegistry<TCtx> {
|
|
97
|
+
/** Register a kind under `kind.kind`; throws on a duplicate key. */
|
|
98
|
+
define<TPayload>(kind: OrderKind<TCtx, TPayload>): void;
|
|
99
|
+
has(kind: string): boolean;
|
|
100
|
+
/** Look up a kind, or `null` if unregistered. */
|
|
101
|
+
get(kind: string): OrderKind<TCtx, unknown> | null;
|
|
102
|
+
/** All registered verb keys, in insertion order. */
|
|
103
|
+
kinds(): string[];
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* How a newly issued order interacts with what's already queued.
|
|
107
|
+
* `replace` preempts the active order and clears pending; `append` queues it
|
|
108
|
+
* behind everything (shift-queue); `front` makes it the next to run without
|
|
109
|
+
* touching the active order; `reject` refuses it while anything is queued.
|
|
110
|
+
*/
|
|
111
|
+
export type OrderQueuePolicy = "replace" | "append" | "front" | "reject";
|
|
112
|
+
/** A request to issue an order; `policy` defaults to `replace`, `id` is generated when omitted. */
|
|
113
|
+
export interface OrderRequest<TPayload = unknown> {
|
|
114
|
+
kind: string;
|
|
115
|
+
payload: TPayload;
|
|
116
|
+
id?: string;
|
|
117
|
+
policy?: OrderQueuePolicy;
|
|
118
|
+
uninterruptible?: boolean;
|
|
119
|
+
issuer?: string;
|
|
120
|
+
}
|
|
121
|
+
/** Outcome of `issue`: `accepted` entered the queue, `queued` entered behind an uninterruptible/active order, `rejected` was refused (validation or `reject` policy). */
|
|
122
|
+
export type OrderIssueResult<TPayload = unknown> = {
|
|
123
|
+
status: "accepted";
|
|
124
|
+
order: Order<TPayload>;
|
|
125
|
+
} | {
|
|
126
|
+
status: "queued";
|
|
127
|
+
order: Order<TPayload>;
|
|
128
|
+
} | {
|
|
129
|
+
status: "rejected";
|
|
130
|
+
reason: string;
|
|
131
|
+
};
|
|
132
|
+
/** Serializable snapshot of a queue: the active order plus the pending list, in order. */
|
|
133
|
+
export interface OrderQueueState<TPayload = unknown> {
|
|
134
|
+
active: Order<TPayload> | null;
|
|
135
|
+
pending: Order<TPayload>[];
|
|
136
|
+
}
|
|
137
|
+
/** A lifecycle event emitted synchronously as orders move through the queue. */
|
|
138
|
+
export interface OrderEvent {
|
|
139
|
+
type: "issued" | "activated" | "completed" | "canceled";
|
|
140
|
+
orderId: string;
|
|
141
|
+
kind: string;
|
|
142
|
+
reason?: OrderCancelReason;
|
|
143
|
+
}
|
|
144
|
+
/** What one `tick` did this frame, for tests and game reactions (play a bark on activation, flash on completion). Bounded per tick. */
|
|
145
|
+
export interface OrderTickReport<TPayload = unknown> {
|
|
146
|
+
active: Order<TPayload> | null;
|
|
147
|
+
activated: string[];
|
|
148
|
+
completed: string[];
|
|
149
|
+
canceled: {
|
|
150
|
+
id: string;
|
|
151
|
+
reason: OrderCancelReason;
|
|
152
|
+
}[];
|
|
153
|
+
}
|
|
154
|
+
/** Construction options for a queue. */
|
|
155
|
+
export interface OrderQueueOptions<TPayload = unknown> {
|
|
156
|
+
/** Deterministic id source for orders issued without an `id`; defaults to a monotonic `order-<n>` counter. */
|
|
157
|
+
genId?: () => string;
|
|
158
|
+
/** Synchronous lifecycle observer (analytics, HUD, replication). */
|
|
159
|
+
onEvent?: (event: OrderEvent) => void;
|
|
160
|
+
/** Initial state (e.g. a deserialized snapshot) to load on construction. */
|
|
161
|
+
initial?: OrderQueueState<TPayload>;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* A per-entity order queue: one commandable unit's lifecycle of intent. The
|
|
165
|
+
* game ticks it with its world adapter; it activates, advances, completes, and
|
|
166
|
+
* cancels orders and enforces preemption policy. State is serializable for save
|
|
167
|
+
* and host-authoritative replication.
|
|
168
|
+
*/
|
|
169
|
+
export interface OrderQueue<TCtx, TPayload = unknown> {
|
|
170
|
+
/** Queue or preempt an order per its policy; validates the payload through the kind. */
|
|
171
|
+
issue<T extends TPayload = TPayload>(request: OrderRequest<T>): OrderIssueResult<T>;
|
|
172
|
+
/** Advance the active order one step (activating the next pending order as needed) and report transitions. */
|
|
173
|
+
tick(ctx: TCtx, dt: number): OrderTickReport<TPayload>;
|
|
174
|
+
/** The active order, or `null` when idle. */
|
|
175
|
+
active(): Order<TPayload> | null;
|
|
176
|
+
/** The pending orders, in run order (a copy). */
|
|
177
|
+
pending(): Order<TPayload>[];
|
|
178
|
+
/** No active order and nothing pending. */
|
|
179
|
+
isIdle(): boolean;
|
|
180
|
+
/** Force-cancel the active order (explicit cleanup ignores `uninterruptible`); needs `ctx` to run the kind's `finish`. */
|
|
181
|
+
cancelActive(ctx: TCtx, reason?: OrderCancelReason): void;
|
|
182
|
+
/** Cancel the active order and drop every pending order. */
|
|
183
|
+
cancelAll(ctx: TCtx, reason?: OrderCancelReason): void;
|
|
184
|
+
/** Hard reset: cancel everything with reason `cleared`. */
|
|
185
|
+
clear(ctx: TCtx): void;
|
|
186
|
+
/** Plain-data snapshot for save/replication (deep-cloned; safe to serialize). */
|
|
187
|
+
serialize(): OrderQueueState<TPayload>;
|
|
188
|
+
/** Replace queue contents from a (possibly deserialized) snapshot; the active order keeps its `state`. */
|
|
189
|
+
load(state: OrderQueueState<TPayload>): void;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Build an empty order-kind registry. Register the built-in compositions from
|
|
193
|
+
* `orders/orderKinds` or your own verbs, then hand it to `createOrderQueue`.
|
|
194
|
+
* One registry is shared by many per-entity queues.
|
|
195
|
+
*
|
|
196
|
+
* @capability order-registry register order verbs (move/attack/custom) as data so engine code never branches on a verb
|
|
197
|
+
*/
|
|
198
|
+
export declare function createOrderRegistry<TCtx>(): OrderRegistry<TCtx>;
|
|
199
|
+
/**
|
|
200
|
+
* Create a per-entity order queue over a shared kind registry. The queue owns
|
|
201
|
+
* the deterministic lifecycle and preemption policy; the kinds own behavior.
|
|
202
|
+
* Nothing here is random or unbounded: id generation is injected, activation is
|
|
203
|
+
* bounded by the pending count, and a single `tick` advances at most the active
|
|
204
|
+
* order plus one activation.
|
|
205
|
+
*
|
|
206
|
+
* @capability order-queue serializable per-entity command queue with lifecycle, preemption, and pluggable order kinds
|
|
207
|
+
*/
|
|
208
|
+
export declare function createOrderQueue<TCtx, TPayload = unknown>(registry: OrderRegistry<TCtx>, options?: OrderQueueOptions<TPayload>): OrderQueue<TCtx, TPayload>;
|