@jgengine/core 0.9.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +34 -3
- package/LICENSE +203 -661
- package/README.md +1 -1
- package/dist/ai/crowd.d.ts +55 -0
- package/dist/ai/crowd.js +114 -0
- package/dist/ai/flock.d.ts +5 -2
- package/dist/ai/flock.js +5 -2
- package/dist/ai/groupAssist.d.ts +1 -0
- package/dist/ai/groupAssist.js +1 -0
- package/dist/ai/heatSystem.d.ts +76 -0
- package/dist/ai/heatSystem.js +97 -0
- package/dist/ai/interestScheduler.d.ts +107 -0
- package/dist/ai/interestScheduler.js +118 -0
- package/dist/ai/jobBoard.d.ts +1 -0
- package/dist/ai/jobBoard.js +1 -0
- package/dist/ai/laneSelect.d.ts +5 -2
- package/dist/ai/laneSelect.js +5 -2
- package/dist/ai/mobBrain.d.ts +1 -0
- package/dist/ai/mobBrain.js +1 -0
- package/dist/ai/spawnDirector.d.ts +19 -1
- package/dist/ai/spawnDirector.js +53 -26
- package/dist/ai/spawnPoint.d.ts +7 -0
- package/dist/ai/spawnPoint.js +7 -0
- package/dist/ai/targetAcquisition.d.ts +84 -0
- package/dist/ai/targetAcquisition.js +92 -0
- package/dist/anim/easing.d.ts +19 -0
- package/dist/anim/easing.js +19 -0
- package/dist/anim/oscillator.d.ts +12 -0
- package/dist/anim/oscillator.js +25 -0
- package/dist/area/areaEffectField.d.ts +127 -0
- package/dist/area/areaEffectField.js +175 -0
- package/dist/area/stackPolicy.d.ts +47 -0
- package/dist/area/stackPolicy.js +99 -0
- package/dist/audio/audioFalloff.d.ts +5 -2
- package/dist/audio/music.d.ts +53 -0
- package/dist/audio/music.js +34 -0
- package/dist/audio/synth.d.ts +60 -0
- package/dist/audio/synth.js +8 -0
- package/dist/authoring.d.ts +15 -0
- package/dist/authoring.js +15 -0
- package/dist/board/laneBoard.d.ts +13 -0
- package/dist/board/laneBoard.js +13 -0
- package/dist/board/timelineBoard.d.ts +10 -0
- package/dist/board/timelineBoard.js +10 -0
- package/dist/combat/abilityKit.d.ts +18 -0
- package/dist/combat/abilityKit.js +24 -9
- package/dist/combat/animationState.d.ts +5 -0
- package/dist/combat/animationState.js +5 -0
- package/dist/combat/breakMeters.d.ts +10 -0
- package/dist/combat/breakMeters.js +10 -0
- package/dist/combat/castRunner.d.ts +5 -0
- package/dist/combat/castRunner.js +5 -0
- package/dist/combat/comboPoints.d.ts +5 -0
- package/dist/combat/comboPoints.js +5 -0
- package/dist/combat/comboString.d.ts +5 -0
- package/dist/combat/comboString.js +5 -0
- package/dist/combat/damageInterceptors.d.ts +192 -0
- package/dist/combat/damageInterceptors.js +251 -0
- package/dist/combat/damageMatchup.d.ts +68 -0
- package/dist/combat/damageMatchup.js +42 -0
- package/dist/combat/damageResolution.d.ts +63 -0
- package/dist/combat/damageResolution.js +50 -0
- package/dist/combat/death.d.ts +7 -1
- package/dist/combat/death.js +5 -0
- package/dist/combat/deathReason.d.ts +14 -0
- package/dist/combat/deathReason.js +1 -0
- package/dist/combat/defensiveWindow.d.ts +5 -0
- package/dist/combat/defensiveWindow.js +5 -0
- package/dist/combat/dotField.d.ts +47 -0
- package/dist/combat/dotField.js +52 -0
- package/dist/combat/downed.d.ts +5 -0
- package/dist/combat/downed.js +5 -0
- package/dist/combat/effects.d.ts +5 -0
- package/dist/combat/effects.js +5 -0
- package/dist/combat/encounterSequence.d.ts +258 -0
- package/dist/combat/encounterSequence.js +426 -0
- package/dist/combat/hitReaction.d.ts +57 -1
- package/dist/combat/hitReaction.js +45 -5
- package/dist/combat/magazine.d.ts +54 -0
- package/dist/combat/magazine.js +96 -0
- package/dist/combat/projectiles.d.ts +7 -2
- package/dist/combat/projectiles.js +48 -17
- package/dist/combat/receivedDamage.d.ts +117 -0
- package/dist/combat/receivedDamage.js +92 -0
- package/dist/combat/regenShield.d.ts +39 -0
- package/dist/combat/regenShield.js +49 -0
- package/dist/combat/renderCues.d.ts +51 -0
- package/dist/combat/renderCues.js +44 -0
- package/dist/combat/resourcePool.d.ts +5 -0
- package/dist/combat/resourcePool.js +5 -0
- package/dist/combat/rewardAllocation.d.ts +121 -0
- package/dist/combat/rewardAllocation.js +251 -0
- package/dist/combat/shotOrigin.d.ts +30 -1
- package/dist/combat/shotOrigin.js +70 -2
- package/dist/combat/statusApplication.d.ts +96 -0
- package/dist/combat/statusApplication.js +81 -0
- package/dist/combat/telegraph.d.ts +11 -2
- package/dist/combat/telegraph.js +11 -2
- package/dist/combat/thresholdCrossings.d.ts +85 -0
- package/dist/combat/thresholdCrossings.js +116 -0
- package/dist/combat.d.ts +34 -0
- package/dist/combat.js +34 -0
- package/dist/commands/commandRegistry.d.ts +11 -0
- package/dist/commands/commandRegistry.js +9 -2
- package/dist/crafting/crop.d.ts +18 -0
- package/dist/crafting/crop.js +18 -0
- package/dist/crafting/production.d.ts +5 -0
- package/dist/crafting/production.js +5 -0
- package/dist/devtools/rewriteTunables.d.ts +17 -0
- package/dist/devtools/rewriteTunables.js +276 -0
- package/dist/devtools/saveEndpoint.d.ts +46 -0
- package/dist/devtools/saveEndpoint.js +48 -0
- package/dist/devtools/transformTunables.d.ts +3 -0
- package/dist/devtools/transformTunables.js +3 -0
- package/dist/devtools/tunableSchema.d.ts +31 -0
- package/dist/devtools/tunableSchema.js +31 -0
- package/dist/economy/currency.d.ts +12 -1
- package/dist/economy/currency.js +12 -1
- package/dist/economy/listingBook.d.ts +91 -0
- package/dist/economy/listingBook.js +144 -0
- package/dist/economy/resourceLedger.d.ts +222 -0
- package/dist/economy/resourceLedger.js +353 -0
- package/dist/economy/sharedWallet.d.ts +14 -0
- package/dist/economy/sharedWallet.js +14 -0
- package/dist/economy/techTree.d.ts +12 -0
- package/dist/economy/techTree.js +12 -0
- package/dist/economy/wallet.d.ts +26 -2
- package/dist/economy/wallet.js +35 -6
- package/dist/editor/commands.d.ts +248 -0
- package/dist/editor/commands.js +865 -0
- package/dist/editor/document.d.ts +186 -0
- package/dist/editor/document.js +884 -0
- package/dist/editor/grid.d.ts +229 -0
- package/dist/editor/grid.js +366 -0
- package/dist/editor/gridAdapters.d.ts +80 -0
- package/dist/editor/gridAdapters.js +134 -0
- package/dist/editor/index.d.ts +97 -0
- package/dist/editor/index.js +10 -0
- package/dist/editor/liveSync.d.ts +127 -0
- package/dist/editor/liveSync.js +249 -0
- package/dist/editor/runtimeInspector.d.ts +88 -0
- package/dist/editor/runtimeInspector.js +239 -0
- package/dist/editor/types.d.ts +175 -0
- package/dist/editor/types.js +29 -0
- package/dist/faction/reputation.d.ts +5 -0
- package/dist/faction/reputation.js +5 -0
- package/dist/format/distance.d.ts +17 -0
- package/dist/format/distance.js +18 -0
- package/dist/format/duration.d.ts +27 -0
- package/dist/format/duration.js +45 -0
- package/dist/format/speed.d.ts +17 -0
- package/dist/format/speed.js +25 -0
- package/dist/game/connectedPlayers.d.ts +30 -0
- package/dist/game/connectedPlayers.js +21 -0
- package/dist/game/cosmetics.d.ts +9 -0
- package/dist/game/cosmetics.js +16 -0
- package/dist/game/defineGame.d.ts +141 -2
- package/dist/game/defineGame.js +39 -1
- package/dist/game/defineSystem.d.ts +88 -0
- package/dist/game/defineSystem.js +45 -0
- package/dist/game/dialogue.d.ts +33 -0
- package/dist/game/dialogue.js +21 -0
- package/dist/game/events.d.ts +50 -13
- package/dist/game/events.js +5 -0
- package/dist/game/feed.d.ts +33 -0
- package/dist/game/feed.js +35 -2
- package/dist/game/gamePhase.d.ts +11 -0
- package/dist/game/gamePhase.js +16 -0
- package/dist/game/keyValueStore.d.ts +25 -0
- package/dist/game/keyValueStore.js +61 -0
- package/dist/game/leaderboard.d.ts +5 -0
- package/dist/game/leaderboard.js +5 -0
- package/dist/game/levelSequence.d.ts +24 -2
- package/dist/game/levelSequence.js +51 -2
- package/dist/game/loadout.d.ts +5 -0
- package/dist/game/loadout.js +5 -0
- package/dist/game/lootFilter.d.ts +2 -0
- package/dist/game/lootFilter.js +2 -0
- package/dist/game/lootPipeline.d.ts +164 -0
- package/dist/game/lootPipeline.js +216 -0
- package/dist/game/lootTable.d.ts +21 -0
- package/dist/game/lootTable.js +15 -4
- package/dist/game/modelAnimation.d.ts +8 -0
- package/dist/game/modelAnimation.js +18 -0
- package/dist/game/objectives.d.ts +43 -0
- package/dist/game/objectives.js +36 -0
- package/dist/game/paramLayers.d.ts +148 -0
- package/dist/game/paramLayers.js +185 -0
- package/dist/game/ping.d.ts +5 -0
- package/dist/game/ping.js +5 -0
- package/dist/game/playableGame.d.ts +160 -12
- package/dist/game/quest.d.ts +8 -0
- package/dist/game/quest.js +29 -0
- package/dist/game/race.d.ts +141 -0
- package/dist/game/race.js +169 -0
- package/dist/game/recordBook.d.ts +5 -5
- package/dist/game/recordBook.js +4 -1
- package/dist/game/ruleSelection.d.ts +75 -0
- package/dist/game/ruleSelection.js +127 -0
- package/dist/game/runDraft.d.ts +5 -0
- package/dist/game/runDraft.js +5 -0
- package/dist/game/saveStore.d.ts +111 -0
- package/dist/game/saveStore.js +312 -0
- package/dist/game/snapshotHistory.d.ts +67 -0
- package/dist/game/snapshotHistory.js +95 -0
- package/dist/game/social.d.ts +38 -1
- package/dist/game/social.js +71 -0
- package/dist/game/spawnPoints.d.ts +5 -0
- package/dist/game/spawnPoints.js +5 -0
- package/dist/game/systemRuntime.d.ts +50 -0
- package/dist/game/systemRuntime.js +157 -0
- package/dist/game/systemSchedule.d.ts +72 -0
- package/dist/game/systemSchedule.js +242 -0
- package/dist/game/toasts.d.ts +43 -0
- package/dist/game/toasts.js +44 -0
- package/dist/game/trade.d.ts +10 -0
- package/dist/game/trade.js +10 -0
- package/dist/game/unlocks.d.ts +8 -0
- package/dist/game/unlocks.js +16 -0
- package/dist/game/vfxInstance.d.ts +138 -0
- package/dist/game/vfxInstance.js +96 -0
- package/dist/game/worldItem.d.ts +17 -4
- package/dist/game/worldItem.js +17 -4
- package/dist/gameplay.d.ts +91 -0
- package/dist/gameplay.js +91 -0
- package/dist/index.d.ts +5 -7
- package/dist/index.js +5 -7
- package/dist/input/actionBindings.d.ts +24 -5
- package/dist/input/actionBindings.js +23 -5
- package/dist/input/axisInput.d.ts +13 -1
- package/dist/input/axisInput.js +22 -1
- package/dist/input/controlGroups.d.ts +67 -0
- package/dist/input/controlGroups.js +41 -0
- package/dist/input/touchScheme.d.ts +82 -6
- package/dist/input/touchScheme.js +123 -10
- package/dist/interaction/contextMenu.d.ts +1 -0
- package/dist/interaction/contextMenu.js +1 -0
- package/dist/interaction/lockpick.d.ts +61 -0
- package/dist/interaction/lockpick.js +168 -0
- package/dist/interaction/proximityPrompt.d.ts +5 -1
- package/dist/interaction/proximityPrompt.js +5 -3
- package/dist/interaction/qte.d.ts +5 -0
- package/dist/interaction/qte.js +5 -0
- package/dist/interaction/skillCheck.d.ts +5 -0
- package/dist/interaction/skillCheck.js +5 -0
- package/dist/inventory/inventoryModel.d.ts +12 -0
- package/dist/inventory/inventoryModel.js +12 -0
- package/dist/inventory/shapedGrid.d.ts +16 -0
- package/dist/inventory/shapedGrid.js +16 -0
- package/dist/inventory/slotModel.d.ts +10 -0
- package/dist/inventory/slotModel.js +10 -0
- package/dist/item/durability.d.ts +5 -0
- package/dist/item/durability.js +5 -0
- package/dist/item/itemIdentity.d.ts +171 -0
- package/dist/item/itemIdentity.js +138 -0
- package/dist/item/itemInstanceRegistry.d.ts +32 -0
- package/dist/item/itemInstanceRegistry.js +34 -0
- package/dist/item/itemgen.d.ts +163 -0
- package/dist/item/itemgen.js +151 -0
- package/dist/item/modularItem.d.ts +5 -0
- package/dist/item/modularItem.js +5 -0
- package/dist/item/use.d.ts +5 -0
- package/dist/item/use.js +5 -0
- package/dist/item/useBehavior.d.ts +142 -0
- package/dist/item/useBehavior.js +105 -0
- package/dist/item/weapon.d.ts +5 -0
- package/dist/item/weapon.js +5 -0
- package/dist/math/scalar.d.ts +25 -0
- package/dist/math/scalar.js +47 -0
- package/dist/meta/changelog.d.ts +4 -1
- package/dist/meta/changelog.js +36 -1
- package/dist/movement/avoidance.d.ts +45 -0
- package/dist/movement/avoidance.js +123 -0
- package/dist/movement/cameraRig.d.ts +8 -0
- package/dist/movement/cameraRig.js +8 -0
- package/dist/movement/dash.d.ts +11 -0
- package/dist/movement/dash.js +11 -0
- package/dist/movement/formation.d.ts +135 -0
- package/dist/movement/formation.js +194 -0
- package/dist/movement/glideModel.d.ts +5 -0
- package/dist/movement/glideModel.js +5 -0
- package/dist/movement/grappleSwing.d.ts +5 -0
- package/dist/movement/grappleSwing.js +5 -0
- package/dist/movement/leaderTrail.d.ts +5 -0
- package/dist/movement/leaderTrail.js +5 -0
- package/dist/movement/movementModel.d.ts +38 -7
- package/dist/movement/movementModel.js +54 -13
- package/dist/movement/playerMovement.d.ts +41 -0
- package/dist/movement/playerMovement.js +236 -0
- package/dist/movement/poseState.d.ts +13 -0
- package/dist/movement/poseState.js +16 -0
- package/dist/movement/steering.d.ts +8 -0
- package/dist/movement/steering.js +18 -0
- package/dist/multiplayer/combatSnapshot.d.ts +3 -0
- package/dist/multiplayer/combatSnapshot.js +3 -0
- package/dist/multiplayer/lagCompensation.d.ts +5 -0
- package/dist/multiplayer/lagCompensation.js +5 -0
- package/dist/multiplayer/presenceModel.d.ts +9 -1
- package/dist/multiplayer/presenceModel.js +9 -1
- package/dist/multiplayer/simultaneousCommit.d.ts +3 -0
- package/dist/multiplayer/simultaneousCommit.js +3 -0
- package/dist/multiplayer.d.ts +11 -0
- package/dist/multiplayer.js +11 -0
- package/dist/nav/pathFollow.d.ts +57 -0
- package/dist/nav/pathFollow.js +109 -0
- package/dist/orders/orderKinds.d.ts +156 -0
- package/dist/orders/orderKinds.js +197 -0
- package/dist/orders/orderQueue.d.ts +208 -0
- package/dist/orders/orderQueue.js +211 -0
- package/dist/physics/drivableVehicle.d.ts +29 -0
- package/dist/physics/drivableVehicle.js +16 -0
- package/dist/physics/kinematicVehicle.d.ts +21 -1
- package/dist/physics/kinematicVehicle.js +23 -8
- package/dist/physics/physicsWorld.d.ts +24 -12
- package/dist/physics/physicsWorld.js +11 -5
- package/dist/physics/radialImpulse.d.ts +25 -0
- package/dist/physics/radialImpulse.js +27 -0
- package/dist/procedural.d.ts +3 -0
- package/dist/procedural.js +3 -0
- package/dist/progression/statGraph.d.ts +116 -0
- package/dist/progression/statGraph.js +318 -0
- package/dist/puzzle/cellGrid.d.ts +9 -0
- package/dist/puzzle/cellGrid.js +9 -0
- package/dist/puzzle/fallingPiece.d.ts +9 -0
- package/dist/puzzle/fallingPiece.js +9 -0
- package/dist/puzzle/nonogram.d.ts +39 -0
- package/dist/puzzle/nonogram.js +136 -0
- package/dist/random/nameGen.d.ts +5 -0
- package/dist/random/nameGen.js +5 -0
- package/dist/random/pick.d.ts +8 -0
- package/dist/random/pick.js +31 -0
- package/dist/random/rng.d.ts +24 -0
- package/dist/random/rng.js +30 -8
- package/dist/random/seedLink.d.ts +4 -0
- package/dist/random/seedLink.js +4 -0
- package/dist/relation/keyedValues.d.ts +54 -0
- package/dist/relation/keyedValues.js +115 -0
- package/dist/relation/thresholds.d.ts +62 -0
- package/dist/relation/thresholds.js +62 -0
- package/dist/render/color.d.ts +12 -0
- package/dist/render/color.js +26 -0
- package/dist/render/lookPreset.d.ts +41 -0
- package/dist/render/lookPreset.js +29 -0
- package/dist/render/postProcessing.d.ts +76 -0
- package/dist/render/postProcessing.js +21 -0
- package/dist/rules/predicate.d.ts +53 -0
- package/dist/rules/predicate.js +64 -0
- package/dist/rules/ruleEffects.d.ts +38 -0
- package/dist/rules/ruleEffects.js +37 -0
- package/dist/rules/triggeredRules.d.ts +160 -0
- package/dist/rules/triggeredRules.js +241 -0
- package/dist/runtime/adapter.d.ts +58 -0
- package/dist/runtime/adapter.js +54 -5
- package/dist/runtime/cameraDirector.d.ts +1 -0
- package/dist/runtime/cameraDirector.js +1 -0
- package/dist/runtime/commandRunner.d.ts +1 -0
- package/dist/runtime/commandRunner.js +1 -0
- package/dist/runtime/context/combatFx.d.ts +23 -0
- package/dist/runtime/context/combatFx.js +161 -0
- package/dist/runtime/context/registries.d.ts +13 -0
- package/dist/runtime/context/registries.js +84 -0
- package/dist/runtime/context/worldItems.d.ts +21 -0
- package/dist/runtime/context/worldItems.js +37 -0
- package/dist/runtime/descriptors/baseline.d.ts +48 -0
- package/dist/runtime/descriptors/baseline.js +134 -0
- package/dist/runtime/descriptors/features.d.ts +74 -0
- package/dist/runtime/descriptors/features.js +281 -0
- package/dist/runtime/gameContext.d.ts +163 -19
- package/dist/runtime/gameContext.js +385 -339
- package/dist/runtime/gameRuntime.d.ts +1 -0
- package/dist/runtime/gameRuntime.js +1 -0
- package/dist/runtime/headlessRunner.d.ts +60 -0
- package/dist/runtime/headlessRunner.js +44 -0
- package/dist/runtime/hostPersistence.d.ts +12 -0
- package/dist/runtime/hostPersistence.js +12 -0
- package/dist/runtime/hostedGameRunner.d.ts +54 -0
- package/dist/runtime/hostedGameRunner.js +85 -0
- package/dist/runtime/hostedWorldSession.d.ts +73 -0
- package/dist/runtime/hostedWorldSession.js +64 -0
- package/dist/runtime/inputSnapshot.d.ts +21 -3
- package/dist/runtime/inputSnapshot.js +8 -2
- package/dist/runtime/motionIntents.d.ts +12 -1
- package/dist/runtime/motionIntents.js +26 -1
- package/dist/runtime/perContext.d.ts +15 -0
- package/dist/runtime/perContext.js +21 -0
- package/dist/runtime/runtimeSave.d.ts +79 -0
- package/dist/runtime/runtimeSave.js +105 -0
- package/dist/runtime/save.d.ts +4 -0
- package/dist/runtime/save.js +4 -0
- package/dist/runtime/snapshot.d.ts +7 -0
- package/dist/runtime/snapshot.js +7 -0
- package/dist/runtime/visibility.d.ts +2 -1
- package/dist/runtime/visibility.js +2 -1
- package/dist/runtime/worldChannel.d.ts +62 -0
- package/dist/runtime/worldChannel.js +114 -0
- package/dist/runtime/worldMirror.d.ts +36 -0
- package/dist/runtime/worldMirror.js +44 -0
- package/dist/runtime/worldProjection.d.ts +47 -0
- package/dist/runtime/worldProjection.js +52 -0
- package/dist/runtime/worldReplication.d.ts +69 -0
- package/dist/runtime/worldReplication.js +217 -0
- package/dist/runtime/worldSnapshot.d.ts +44 -0
- package/dist/runtime/worldSnapshot.js +30 -0
- package/dist/scene/assetCatalog.d.ts +22 -0
- package/dist/scene/assetCatalog.js +4 -0
- package/dist/scene/assetDiagnostics.d.ts +69 -0
- package/dist/scene/assetDiagnostics.js +110 -0
- package/dist/scene/assetGenerator.d.ts +65 -0
- package/dist/scene/assetGenerator.js +64 -0
- package/dist/scene/assetSpace.d.ts +137 -0
- package/dist/scene/assetSpace.js +259 -0
- package/dist/scene/authoredTriggers.d.ts +169 -0
- package/dist/scene/authoredTriggers.js +340 -0
- package/dist/scene/behaviorRuntime.d.ts +75 -0
- package/dist/scene/behaviorRuntime.js +217 -0
- package/dist/scene/behaviors.d.ts +14 -2
- package/dist/scene/behaviors.js +7 -2
- package/dist/scene/bodyBind.d.ts +60 -0
- package/dist/scene/bodyBind.js +51 -0
- package/dist/scene/builtinSceneKinds.d.ts +5 -0
- package/dist/scene/builtinSceneKinds.js +62 -0
- package/dist/scene/colliders.d.ts +18 -0
- package/dist/scene/colliders.js +61 -1
- package/dist/scene/entityStats.d.ts +13 -0
- package/dist/scene/entityStats.js +30 -0
- package/dist/scene/entityStore.d.ts +41 -1
- package/dist/scene/entityStore.js +75 -0
- package/dist/scene/facing.d.ts +18 -0
- package/dist/scene/facing.js +26 -0
- package/dist/scene/modelSockets.d.ts +33 -0
- package/dist/scene/modelSockets.js +29 -0
- package/dist/scene/objectQuery.d.ts +2 -0
- package/dist/scene/objectQuery.js +2 -0
- package/dist/scene/objectStore.d.ts +4 -0
- package/dist/scene/objectStore.js +6 -0
- package/dist/scene/possession.d.ts +8 -0
- package/dist/scene/possession.js +14 -0
- package/dist/scene/roster.d.ts +3 -0
- package/dist/scene/roster.js +12 -0
- package/dist/scene/sceneKinds.d.ts +240 -0
- package/dist/scene/sceneKinds.js +214 -0
- package/dist/scene/sceneOwnership.d.ts +169 -0
- package/dist/scene/sceneOwnership.js +179 -0
- package/dist/scene/selectionBookmarks.d.ts +93 -0
- package/dist/scene/selectionBookmarks.js +122 -0
- package/dist/scene/vehicleSeat.d.ts +68 -0
- package/dist/scene/vehicleSeat.js +59 -0
- package/dist/sensor/concealment.d.ts +3 -0
- package/dist/sensor/concealment.js +3 -0
- package/dist/sensor/freezeMonitor.d.ts +1 -0
- package/dist/sensor/freezeMonitor.js +1 -0
- package/dist/sensor/frustumSensor.d.ts +7 -3
- package/dist/sensor/frustumSensor.js +7 -3
- package/dist/sensor/hiddenStateProbe.d.ts +5 -2
- package/dist/sensor/hiddenStateProbe.js +5 -2
- package/dist/sensor/recordingBuffer.d.ts +2 -1
- package/dist/sensor/recordingBuffer.js +2 -1
- package/dist/sensor/replayLoop.d.ts +6 -2
- package/dist/sensor/replayLoop.js +6 -2
- package/dist/sensor/revealQuery.d.ts +2 -1
- package/dist/sensor/revealQuery.js +2 -1
- package/dist/sensor/visionCone.d.ts +10 -3
- package/dist/sensor/visionCone.js +10 -3
- package/dist/session/contestedChannel.d.ts +1 -0
- package/dist/session/contestedChannel.js +1 -0
- package/dist/session/extraction.d.ts +1 -0
- package/dist/session/extraction.js +1 -0
- package/dist/session/roles.d.ts +6 -0
- package/dist/session/roles.js +6 -0
- package/dist/session/roundState.d.ts +8 -0
- package/dist/session/roundState.js +2 -0
- package/dist/settings/settingsModel.d.ts +1 -0
- package/dist/settings/settingsModel.js +1 -0
- package/dist/stats/accumulatorMeter.d.ts +6 -0
- package/dist/stats/accumulatorMeter.js +6 -0
- package/dist/stats/eventMeter.d.ts +5 -0
- package/dist/stats/eventMeter.js +5 -0
- package/dist/stats/rollCheck.d.ts +5 -0
- package/dist/stats/rollCheck.js +5 -0
- package/dist/stats/statModifiers.d.ts +5 -0
- package/dist/stats/statModifiers.js +5 -0
- package/dist/store/defineKeyedStore.d.ts +38 -0
- package/dist/store/defineKeyedStore.js +42 -0
- package/dist/store/defineStore.d.ts +33 -0
- package/dist/store/defineStore.js +35 -0
- package/dist/store/observableKeyedStore.d.ts +9 -0
- package/dist/store/observableKeyedStore.js +43 -2
- package/dist/survival/decayMeter.d.ts +55 -0
- package/dist/survival/decayMeter.js +130 -55
- package/dist/survival/moodle.d.ts +2 -0
- package/dist/survival/regionHealth.d.ts +6 -0
- package/dist/survival/regionHealth.js +5 -0
- package/dist/tactics/fallingGrid.d.ts +6 -4
- package/dist/tactics/fallingGrid.js +6 -4
- package/dist/tactics/predictiveQuery.d.ts +3 -0
- package/dist/tactics/predictiveQuery.js +3 -0
- package/dist/tactics/snapshot.d.ts +2 -0
- package/dist/tactics/snapshot.js +2 -0
- package/dist/tactics/surface.d.ts +1 -0
- package/dist/tactics/surface.js +1 -0
- package/dist/tactics/tacticalGrid.d.ts +1 -0
- package/dist/tactics/tacticalGrid.js +1 -0
- package/dist/time/beatClock.d.ts +14 -4
- package/dist/time/beatClock.js +14 -4
- package/dist/time/calendarClock.d.ts +3 -0
- package/dist/time/calendarClock.js +3 -0
- package/dist/time/idleProgress.d.ts +4 -0
- package/dist/time/idleProgress.js +4 -0
- package/dist/time/simClock.d.ts +2 -0
- package/dist/time/simClock.js +20 -5
- package/dist/ui/actionModel.d.ts +110 -0
- package/dist/ui/actionModel.js +159 -0
- package/dist/ui/gameLayout.d.ts +144 -0
- package/dist/ui/gameLayout.js +148 -0
- package/dist/ui/hudDocument.d.ts +114 -0
- package/dist/ui/hudDocument.js +220 -0
- package/dist/ui/hudLayout.d.ts +33 -1
- package/dist/ui/hudLayout.js +204 -17
- package/dist/ui/orientation.d.ts +39 -0
- package/dist/ui/orientation.js +49 -0
- package/dist/ui/selectionModel.d.ts +92 -0
- package/dist/ui/selectionModel.js +88 -0
- package/dist/ui/swingTimer.d.ts +42 -0
- package/dist/ui/swingTimer.js +38 -0
- package/dist/ui/tooltipModel.d.ts +63 -0
- package/dist/ui/tooltipModel.js +82 -0
- package/dist/ui.d.ts +15 -0
- package/dist/ui.js +15 -0
- package/dist/visibility/bounds.d.ts +8 -1
- package/dist/visibility/bounds.js +8 -1
- package/dist/visibility/frustum.d.ts +12 -3
- package/dist/visibility/frustum.js +12 -3
- package/dist/visibility/spatialIndex.js +34 -20
- package/dist/work/jobQueue.d.ts +201 -0
- package/dist/work/jobQueue.js +253 -0
- package/dist/work/unitTraining.d.ts +58 -0
- package/dist/work/unitTraining.js +52 -0
- package/dist/world/authoredObjects.d.ts +58 -0
- package/dist/world/authoredObjects.js +69 -0
- package/dist/world/buildingGenerator.d.ts +18 -0
- package/dist/world/buildingGenerator.js +62 -0
- package/dist/world/buildings.d.ts +5 -0
- package/dist/world/buildings.js +5 -0
- package/dist/world/catenary.d.ts +22 -0
- package/dist/world/catenary.js +69 -0
- package/dist/world/environmentSummary.d.ts +11 -2
- package/dist/world/environmentSummary.js +11 -1
- package/dist/world/features.d.ts +244 -7
- package/dist/world/features.js +92 -4
- package/dist/world/footprintGrid.d.ts +59 -0
- package/dist/world/footprintGrid.js +141 -0
- package/dist/world/geometry.d.ts +64 -0
- package/dist/world/geometry.js +94 -0
- package/dist/world/grassKind.d.ts +51 -0
- package/dist/world/grassKind.js +101 -0
- package/dist/world/pathInstances.d.ts +27 -0
- package/dist/world/pathInstances.js +27 -0
- package/dist/world/pathTerrain.d.ts +80 -0
- package/dist/world/pathTerrain.js +142 -0
- package/dist/world/placeAsset.d.ts +81 -0
- package/dist/world/placeAsset.js +77 -0
- package/dist/world/placement.d.ts +4 -0
- package/dist/world/placement.js +4 -0
- package/dist/world/placementController.d.ts +6 -0
- package/dist/world/placementController.js +6 -0
- package/dist/world/polyline.d.ts +34 -0
- package/dist/world/polyline.js +81 -0
- package/dist/world/roads.d.ts +55 -0
- package/dist/world/roads.js +184 -0
- package/dist/world/scatterRegion.d.ts +164 -0
- package/dist/world/scatterRegion.js +409 -0
- package/dist/world/sceneShapes.d.ts +43 -0
- package/dist/world/sceneShapes.js +1 -0
- package/dist/world/segment.d.ts +27 -0
- package/dist/world/segment.js +43 -0
- package/dist/world/soilKind.d.ts +48 -0
- package/dist/world/soilKind.js +92 -0
- package/dist/world/spatialSample.d.ts +241 -0
- package/dist/world/spatialSample.js +465 -0
- package/dist/world/streets.d.ts +80 -0
- package/dist/world/streets.js +144 -0
- package/dist/world/terraform.d.ts +213 -1
- package/dist/world/terraform.js +655 -20
- package/dist/world/terrain.d.ts +138 -12
- package/dist/world/terrain.js +346 -28
- package/dist/world/terrainGuides.d.ts +182 -0
- package/dist/world/terrainGuides.js +343 -0
- package/dist/world/vec2.d.ts +81 -0
- package/dist/world/vec2.js +128 -0
- package/dist/world/vec3.d.ts +49 -0
- package/dist/world/vec3.js +76 -0
- package/dist/world/vegetation.d.ts +71 -0
- package/dist/world/vegetation.js +151 -0
- package/dist/world/visibilityField.d.ts +154 -0
- package/dist/world/visibilityField.js +271 -0
- package/dist/world/volumetricClouds.d.ts +52 -0
- package/dist/world/volumetricClouds.js +43 -0
- package/dist/world/walls.d.ts +9 -0
- package/dist/world/walls.js +9 -0
- package/dist/world/waterKind.d.ts +55 -0
- package/dist/world/waterKind.js +99 -0
- package/dist/world.d.ts +132 -0
- package/dist/world.js +132 -0
- package/package.json +32 -8
- package/skills/jgengine/SKILL.md +51 -0
- package/skills/jgengine/api.md +434 -0
- package/skills/jgengine/capabilities.md +29 -0
- package/skills/jgengine/reference-cartridge.md +72 -0
- package/skills/jgengine-combat/SKILL.md +34 -0
- package/skills/jgengine-combat/api.md +549 -0
- package/skills/jgengine-combat/capabilities.md +169 -0
- package/skills/jgengine-combat/reference.md +98 -0
- package/skills/jgengine-gameplay/SKILL.md +39 -0
- package/skills/jgengine-gameplay/api.md +1794 -0
- package/skills/jgengine-gameplay/capabilities.md +378 -0
- package/skills/jgengine-gameplay/reference-systems.md +60 -0
- package/skills/jgengine-world/SKILL.md +38 -0
- package/skills/jgengine-world/api.md +2652 -0
- package/skills/jgengine-world/capabilities.md +370 -0
- package/skills/jgengine-world/reference.md +222 -0
- package/dist/cartridge/runtime.d.ts +0 -15
- package/dist/cartridge/runtime.js +0 -556
- package/dist/cartridge/spec.d.ts +0 -188
- package/dist/cartridge/spec.js +0 -19
- package/dist/cartridge/validate.d.ts +0 -2
- package/dist/cartridge/validate.js +0 -78
- package/dist/store/engineStore.d.ts +0 -22
- package/dist/store/engineStore.js +0 -50
- package/dist/store/features.d.ts +0 -10
- package/dist/store/features.js +0 -23
- package/llms.txt +0 -4983
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic timed work queue — a pure-data model for discrete jobs that reserve
|
|
3
|
+
* inputs, advance over game time, can be paused/cancelled, and emit an output on
|
|
4
|
+
* completion. It backs unit training, crafting jobs, construction, research,
|
|
5
|
+
* respawns, downloads, and fabrication without any of them re-implementing the
|
|
6
|
+
* reservation → progress → completion → output-routing loop.
|
|
7
|
+
*
|
|
8
|
+
* The state ({@link WorkQueueState}) is plain serializable data; all policy —
|
|
9
|
+
* duration, ordering, capacity, concurrency, input reservation, refund, and
|
|
10
|
+
* output mapping — lives in {@link WorkQueueConfig}, which is supplied by the
|
|
11
|
+
* caller and is never serialized. Side effects (charging a wallet, spawning an
|
|
12
|
+
* entity) are the caller's: reservations and refunds are returned as data, and
|
|
13
|
+
* completion emits a typed event carrying a pure output payload for an external
|
|
14
|
+
* completion adapter to route.
|
|
15
|
+
*/
|
|
16
|
+
export type JobId = string;
|
|
17
|
+
/** Lifecycle phase of a single queued job. Terminal jobs are removed from state. */
|
|
18
|
+
export type JobStatus = "queued" | "active" | "paused";
|
|
19
|
+
/** One unit of timed work. Plain serializable data (given serializable `TSpec`/`TReserve`). */
|
|
20
|
+
export interface Job<TSpec, TReserve = undefined> {
|
|
21
|
+
/** Stable id, unique within the queue for its lifetime. */
|
|
22
|
+
readonly id: JobId;
|
|
23
|
+
/** Caller-owned description of the work (e.g. `{ unitId }`). */
|
|
24
|
+
readonly spec: TSpec;
|
|
25
|
+
/** Reserved inputs computed at enqueue time (e.g. resource cost, population). */
|
|
26
|
+
readonly reservation: TReserve;
|
|
27
|
+
readonly status: JobStatus;
|
|
28
|
+
/** Seconds of work the job requires. */
|
|
29
|
+
readonly duration: number;
|
|
30
|
+
/** Seconds of work completed so far (0…duration). */
|
|
31
|
+
readonly elapsed: number;
|
|
32
|
+
/** Higher runs sooner under priority ordering; FIFO within equal priority. */
|
|
33
|
+
readonly priority: number;
|
|
34
|
+
/** Monotonic enqueue index — the FIFO tiebreak. */
|
|
35
|
+
readonly seq: number;
|
|
36
|
+
}
|
|
37
|
+
/** Serializable queue state. Holds only non-terminal jobs, so it stays bounded. */
|
|
38
|
+
export interface WorkQueueState<TSpec, TReserve = undefined> {
|
|
39
|
+
readonly jobs: readonly Job<TSpec, TReserve>[];
|
|
40
|
+
readonly nextId: number;
|
|
41
|
+
readonly seq: number;
|
|
42
|
+
}
|
|
43
|
+
/** Comparator over jobs; negative means the first job runs sooner. */
|
|
44
|
+
export type JobOrdering<TSpec, TReserve = undefined> = (a: Job<TSpec, TReserve>, b: Job<TSpec, TReserve>) => number;
|
|
45
|
+
/** Result of pre-enqueue validation (population caps, prerequisites, affordability). */
|
|
46
|
+
export interface JobValidation {
|
|
47
|
+
readonly ok: boolean;
|
|
48
|
+
readonly reason?: string;
|
|
49
|
+
}
|
|
50
|
+
/** Optional per-enqueue overrides. */
|
|
51
|
+
export interface EnqueueOptions {
|
|
52
|
+
/** Higher runs sooner under priority ordering. Defaults to 0. */
|
|
53
|
+
readonly priority?: number;
|
|
54
|
+
/** Explicit id; defaults to a queue-assigned `job-<n>`. */
|
|
55
|
+
readonly id?: string;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Injected policy for a queue. Never serialized — pass the same config to every
|
|
59
|
+
* {@link enqueue}/{@link tick}/{@link cancelJob} call for a given queue.
|
|
60
|
+
*/
|
|
61
|
+
export interface WorkQueueConfig<TSpec, TReserve = undefined, TOutput = undefined> {
|
|
62
|
+
/** Seconds of work a spec requires. Negative values clamp to 0 (instant). */
|
|
63
|
+
duration: (spec: TSpec) => number;
|
|
64
|
+
/** Max concurrent active jobs (multi-server queue). Defaults to 1. */
|
|
65
|
+
concurrency?: number;
|
|
66
|
+
/** Max non-terminal jobs; further enqueues are rejected with `"capacity"`. */
|
|
67
|
+
capacity?: number;
|
|
68
|
+
/** Selection order for queued jobs. Defaults to {@link priorityOrdering}. */
|
|
69
|
+
ordering?: JobOrdering<TSpec, TReserve>;
|
|
70
|
+
/** Compute the reservation stored on the job (charge-now is the caller's job). */
|
|
71
|
+
reserve?: (spec: TSpec) => TReserve;
|
|
72
|
+
/** Validate before enqueue; a non-ok result rejects with its reason. */
|
|
73
|
+
validate?: (spec: TSpec, state: WorkQueueState<TSpec, TReserve>) => JobValidation;
|
|
74
|
+
/** Map a completed job to its output payload for a completion adapter to route. */
|
|
75
|
+
output?: (job: Job<TSpec, TReserve>) => TOutput;
|
|
76
|
+
/** Compute a refund on cancellation from the reservation and progress (0…1). */
|
|
77
|
+
refund?: (job: Job<TSpec, TReserve>, progress: number) => TReserve | null;
|
|
78
|
+
}
|
|
79
|
+
/** Typed lifecycle event emitted from {@link tick}. */
|
|
80
|
+
export type WorkQueueEvent<TSpec, TReserve = undefined, TOutput = undefined> = {
|
|
81
|
+
readonly type: "started";
|
|
82
|
+
readonly job: Job<TSpec, TReserve>;
|
|
83
|
+
} | {
|
|
84
|
+
readonly type: "completed";
|
|
85
|
+
readonly job: Job<TSpec, TReserve>;
|
|
86
|
+
readonly output: TOutput;
|
|
87
|
+
};
|
|
88
|
+
/** Outcome of {@link tick}: advanced state plus the events produced. */
|
|
89
|
+
export interface TickResult<TSpec, TReserve = undefined, TOutput = undefined> {
|
|
90
|
+
readonly state: WorkQueueState<TSpec, TReserve>;
|
|
91
|
+
readonly events: readonly WorkQueueEvent<TSpec, TReserve, TOutput>[];
|
|
92
|
+
}
|
|
93
|
+
/** Outcome of {@link enqueue}. On rejection the state is returned unchanged. */
|
|
94
|
+
export type EnqueueResult<TSpec, TReserve = undefined> = {
|
|
95
|
+
readonly ok: true;
|
|
96
|
+
readonly state: WorkQueueState<TSpec, TReserve>;
|
|
97
|
+
readonly job: Job<TSpec, TReserve>;
|
|
98
|
+
} | {
|
|
99
|
+
readonly ok: false;
|
|
100
|
+
readonly state: WorkQueueState<TSpec, TReserve>;
|
|
101
|
+
readonly reason: string;
|
|
102
|
+
};
|
|
103
|
+
/** Outcome of {@link cancelJob}, carrying the removed job and its computed refund. */
|
|
104
|
+
export type CancelResult<TSpec, TReserve = undefined> = {
|
|
105
|
+
readonly ok: true;
|
|
106
|
+
readonly state: WorkQueueState<TSpec, TReserve>;
|
|
107
|
+
readonly job: Job<TSpec, TReserve>;
|
|
108
|
+
readonly refund: TReserve | null;
|
|
109
|
+
} | {
|
|
110
|
+
readonly ok: false;
|
|
111
|
+
readonly state: WorkQueueState<TSpec, TReserve>;
|
|
112
|
+
readonly reason: string;
|
|
113
|
+
};
|
|
114
|
+
/**
|
|
115
|
+
* Pure FIFO ordering by enqueue sequence.
|
|
116
|
+
*
|
|
117
|
+
* @capability work-order-fifo order queued jobs by enqueue sequence
|
|
118
|
+
*/
|
|
119
|
+
export declare function fifoOrdering<TSpec, TReserve = undefined>(a: Job<TSpec, TReserve>, b: Job<TSpec, TReserve>): number;
|
|
120
|
+
/**
|
|
121
|
+
* Priority-first ordering (higher priority sooner), FIFO within equal priority.
|
|
122
|
+
*
|
|
123
|
+
* @capability work-order-priority order queued jobs by priority, then FIFO within equal priority
|
|
124
|
+
*/
|
|
125
|
+
export declare function priorityOrdering<TSpec, TReserve = undefined>(a: Job<TSpec, TReserve>, b: Job<TSpec, TReserve>): number;
|
|
126
|
+
/**
|
|
127
|
+
* Create an empty timed work queue.
|
|
128
|
+
*
|
|
129
|
+
* @capability work-queue a serializable timed job queue with reservation, cancellation, completion, and output routing
|
|
130
|
+
*/
|
|
131
|
+
export declare function createWorkQueue<TSpec, TReserve = undefined>(): WorkQueueState<TSpec, TReserve>;
|
|
132
|
+
/**
|
|
133
|
+
* Non-terminal job count (queued + active + paused).
|
|
134
|
+
*
|
|
135
|
+
* @capability work-queue-size count non-terminal jobs in a work queue
|
|
136
|
+
*/
|
|
137
|
+
export declare function queueSize<TSpec, TReserve>(state: WorkQueueState<TSpec, TReserve>): number;
|
|
138
|
+
/**
|
|
139
|
+
* Look up a job by id, or `null` if absent/terminal.
|
|
140
|
+
*
|
|
141
|
+
* @capability work-job-by-id look up a queued job by id
|
|
142
|
+
*/
|
|
143
|
+
export declare function jobById<TSpec, TReserve>(state: WorkQueueState<TSpec, TReserve>, id: JobId): Job<TSpec, TReserve> | null;
|
|
144
|
+
/**
|
|
145
|
+
* Jobs waiting for a slot, in selection order.
|
|
146
|
+
*
|
|
147
|
+
* @capability work-queued-jobs list jobs waiting for a slot, in selection order
|
|
148
|
+
*/
|
|
149
|
+
export declare function queuedJobs<TSpec, TReserve>(state: WorkQueueState<TSpec, TReserve>, ordering?: JobOrdering<TSpec, TReserve>): Job<TSpec, TReserve>[];
|
|
150
|
+
/**
|
|
151
|
+
* Jobs currently progressing.
|
|
152
|
+
*
|
|
153
|
+
* @capability work-active-jobs list jobs currently progressing in a work queue
|
|
154
|
+
*/
|
|
155
|
+
export declare function activeJobs<TSpec, TReserve>(state: WorkQueueState<TSpec, TReserve>): Job<TSpec, TReserve>[];
|
|
156
|
+
/**
|
|
157
|
+
* Fractional progress of a job (0…1); a zero-duration job reads as complete.
|
|
158
|
+
*
|
|
159
|
+
* @capability work-job-progress compute a job's fractional progress
|
|
160
|
+
*/
|
|
161
|
+
export declare function jobProgress<TSpec, TReserve>(job: Job<TSpec, TReserve>): number;
|
|
162
|
+
/**
|
|
163
|
+
* Enqueue a new job. Validates capacity and the injected `validate` policy, then
|
|
164
|
+
* computes and stores the reservation. Charging the reservation (now or later) is
|
|
165
|
+
* the caller's responsibility using {@link EnqueueResult.job}'s `reservation`.
|
|
166
|
+
*
|
|
167
|
+
* @capability enqueue-work reserve inputs and add a timed job, honoring capacity and validation policy
|
|
168
|
+
*/
|
|
169
|
+
export declare function enqueue<TSpec, TReserve, TOutput>(state: WorkQueueState<TSpec, TReserve>, config: WorkQueueConfig<TSpec, TReserve, TOutput>, spec: TSpec, options?: EnqueueOptions): EnqueueResult<TSpec, TReserve>;
|
|
170
|
+
/**
|
|
171
|
+
* Cancel a job and compute its refund. Removes the job from the queue and returns
|
|
172
|
+
* a refund payload (full reservation by default, or `config.refund` applied to the
|
|
173
|
+
* job's progress for partial/no refund). Applying the refund is the caller's job.
|
|
174
|
+
*
|
|
175
|
+
* @capability cancel-work remove a job and compute its refund from reservation and progress
|
|
176
|
+
*/
|
|
177
|
+
export declare function cancelJob<TSpec, TReserve, TOutput>(state: WorkQueueState<TSpec, TReserve>, config: WorkQueueConfig<TSpec, TReserve, TOutput>, id: JobId): CancelResult<TSpec, TReserve>;
|
|
178
|
+
/**
|
|
179
|
+
* Pause a queued or active job in place; a paused job keeps its progress and yields its slot.
|
|
180
|
+
*
|
|
181
|
+
* @capability pause-work pause a queued or active job in place, retaining its progress
|
|
182
|
+
*/
|
|
183
|
+
export declare function pauseJob<TSpec, TReserve>(state: WorkQueueState<TSpec, TReserve>, id: JobId): WorkQueueState<TSpec, TReserve>;
|
|
184
|
+
/**
|
|
185
|
+
* Resume a paused job; it re-enters the queue and competes for a slot by ordering.
|
|
186
|
+
*
|
|
187
|
+
* @capability resume-work resume a paused job back into the queue's slot competition
|
|
188
|
+
*/
|
|
189
|
+
export declare function resumeJob<TSpec, TReserve>(state: WorkQueueState<TSpec, TReserve>, id: JobId): WorkQueueState<TSpec, TReserve>;
|
|
190
|
+
/**
|
|
191
|
+
* Advance the queue by `dt` seconds. Promotes queued jobs into up to `concurrency`
|
|
192
|
+
* active slots, advances active jobs, and completes those that reach their
|
|
193
|
+
* duration — emitting `started`/`completed` events in deterministic order. A large
|
|
194
|
+
* `dt` catches up across many jobs in one call: when a job completes with leftover
|
|
195
|
+
* time, the freed slot promotes the next queued job and applies the remainder, so a
|
|
196
|
+
* reconnect or save/load gap resolves in a single bounded pass. Completed jobs are
|
|
197
|
+
* removed from the returned state.
|
|
198
|
+
*
|
|
199
|
+
* @capability tick-work advance jobs over time, completing work and emitting typed lifecycle events
|
|
200
|
+
*/
|
|
201
|
+
export declare function tick<TSpec, TReserve, TOutput>(state: WorkQueueState<TSpec, TReserve>, config: WorkQueueConfig<TSpec, TReserve, TOutput>, dt: number): TickResult<TSpec, TReserve, TOutput>;
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic timed work queue — a pure-data model for discrete jobs that reserve
|
|
3
|
+
* inputs, advance over game time, can be paused/cancelled, and emit an output on
|
|
4
|
+
* completion. It backs unit training, crafting jobs, construction, research,
|
|
5
|
+
* respawns, downloads, and fabrication without any of them re-implementing the
|
|
6
|
+
* reservation → progress → completion → output-routing loop.
|
|
7
|
+
*
|
|
8
|
+
* The state ({@link WorkQueueState}) is plain serializable data; all policy —
|
|
9
|
+
* duration, ordering, capacity, concurrency, input reservation, refund, and
|
|
10
|
+
* output mapping — lives in {@link WorkQueueConfig}, which is supplied by the
|
|
11
|
+
* caller and is never serialized. Side effects (charging a wallet, spawning an
|
|
12
|
+
* entity) are the caller's: reservations and refunds are returned as data, and
|
|
13
|
+
* completion emits a typed event carrying a pure output payload for an external
|
|
14
|
+
* completion adapter to route.
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Pure FIFO ordering by enqueue sequence.
|
|
18
|
+
*
|
|
19
|
+
* @capability work-order-fifo order queued jobs by enqueue sequence
|
|
20
|
+
*/
|
|
21
|
+
export function fifoOrdering(a, b) {
|
|
22
|
+
return a.seq - b.seq;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Priority-first ordering (higher priority sooner), FIFO within equal priority.
|
|
26
|
+
*
|
|
27
|
+
* @capability work-order-priority order queued jobs by priority, then FIFO within equal priority
|
|
28
|
+
*/
|
|
29
|
+
export function priorityOrdering(a, b) {
|
|
30
|
+
return b.priority - a.priority || a.seq - b.seq;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Create an empty timed work queue.
|
|
34
|
+
*
|
|
35
|
+
* @capability work-queue a serializable timed job queue with reservation, cancellation, completion, and output routing
|
|
36
|
+
*/
|
|
37
|
+
export function createWorkQueue() {
|
|
38
|
+
return { jobs: [], nextId: 1, seq: 0 };
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Non-terminal job count (queued + active + paused).
|
|
42
|
+
*
|
|
43
|
+
* @capability work-queue-size count non-terminal jobs in a work queue
|
|
44
|
+
*/
|
|
45
|
+
export function queueSize(state) {
|
|
46
|
+
return state.jobs.length;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Look up a job by id, or `null` if absent/terminal.
|
|
50
|
+
*
|
|
51
|
+
* @capability work-job-by-id look up a queued job by id
|
|
52
|
+
*/
|
|
53
|
+
export function jobById(state, id) {
|
|
54
|
+
return state.jobs.find((job) => job.id === id) ?? null;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Jobs waiting for a slot, in selection order.
|
|
58
|
+
*
|
|
59
|
+
* @capability work-queued-jobs list jobs waiting for a slot, in selection order
|
|
60
|
+
*/
|
|
61
|
+
export function queuedJobs(state, ordering = priorityOrdering) {
|
|
62
|
+
return state.jobs.filter((job) => job.status === "queued").sort(ordering);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Jobs currently progressing.
|
|
66
|
+
*
|
|
67
|
+
* @capability work-active-jobs list jobs currently progressing in a work queue
|
|
68
|
+
*/
|
|
69
|
+
export function activeJobs(state) {
|
|
70
|
+
return state.jobs.filter((job) => job.status === "active");
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Fractional progress of a job (0…1); a zero-duration job reads as complete.
|
|
74
|
+
*
|
|
75
|
+
* @capability work-job-progress compute a job's fractional progress
|
|
76
|
+
*/
|
|
77
|
+
export function jobProgress(job) {
|
|
78
|
+
if (job.duration <= 0)
|
|
79
|
+
return 1;
|
|
80
|
+
return Math.min(1, Math.max(0, job.elapsed / job.duration));
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Enqueue a new job. Validates capacity and the injected `validate` policy, then
|
|
84
|
+
* computes and stores the reservation. Charging the reservation (now or later) is
|
|
85
|
+
* the caller's responsibility using {@link EnqueueResult.job}'s `reservation`.
|
|
86
|
+
*
|
|
87
|
+
* @capability enqueue-work reserve inputs and add a timed job, honoring capacity and validation policy
|
|
88
|
+
*/
|
|
89
|
+
export function enqueue(state, config, spec, options) {
|
|
90
|
+
if (config.capacity !== undefined && state.jobs.length >= config.capacity) {
|
|
91
|
+
return { ok: false, state, reason: "capacity" };
|
|
92
|
+
}
|
|
93
|
+
const validation = config.validate?.(spec, state);
|
|
94
|
+
if (validation !== undefined && !validation.ok) {
|
|
95
|
+
return { ok: false, state, reason: validation.reason ?? "invalid" };
|
|
96
|
+
}
|
|
97
|
+
const reservation = (config.reserve ? config.reserve(spec) : undefined);
|
|
98
|
+
const job = {
|
|
99
|
+
id: options?.id ?? `job-${state.nextId}`,
|
|
100
|
+
spec,
|
|
101
|
+
reservation,
|
|
102
|
+
status: "queued",
|
|
103
|
+
duration: Math.max(0, config.duration(spec)),
|
|
104
|
+
elapsed: 0,
|
|
105
|
+
priority: options?.priority ?? 0,
|
|
106
|
+
seq: state.seq,
|
|
107
|
+
};
|
|
108
|
+
return {
|
|
109
|
+
ok: true,
|
|
110
|
+
job,
|
|
111
|
+
state: { jobs: [...state.jobs, job], nextId: state.nextId + 1, seq: state.seq + 1 },
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Cancel a job and compute its refund. Removes the job from the queue and returns
|
|
116
|
+
* a refund payload (full reservation by default, or `config.refund` applied to the
|
|
117
|
+
* job's progress for partial/no refund). Applying the refund is the caller's job.
|
|
118
|
+
*
|
|
119
|
+
* @capability cancel-work remove a job and compute its refund from reservation and progress
|
|
120
|
+
*/
|
|
121
|
+
export function cancelJob(state, config, id) {
|
|
122
|
+
const job = state.jobs.find((entry) => entry.id === id);
|
|
123
|
+
if (job === undefined)
|
|
124
|
+
return { ok: false, state, reason: "not-found" };
|
|
125
|
+
const refund = config.refund
|
|
126
|
+
? config.refund(job, jobProgress(job))
|
|
127
|
+
: (job.reservation ?? null);
|
|
128
|
+
return { ok: true, state: { ...state, jobs: state.jobs.filter((entry) => entry.id !== id) }, job, refund };
|
|
129
|
+
}
|
|
130
|
+
function setStatus(state, id, from, to) {
|
|
131
|
+
let changed = false;
|
|
132
|
+
const jobs = state.jobs.map((job) => {
|
|
133
|
+
if (job.id === id && job.status === from) {
|
|
134
|
+
changed = true;
|
|
135
|
+
return { ...job, status: to };
|
|
136
|
+
}
|
|
137
|
+
return job;
|
|
138
|
+
});
|
|
139
|
+
return changed ? { ...state, jobs } : state;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Pause a queued or active job in place; a paused job keeps its progress and yields its slot.
|
|
143
|
+
*
|
|
144
|
+
* @capability pause-work pause a queued or active job in place, retaining its progress
|
|
145
|
+
*/
|
|
146
|
+
export function pauseJob(state, id) {
|
|
147
|
+
const active = setStatus(state, id, "active", "paused");
|
|
148
|
+
return active !== state ? active : setStatus(state, id, "queued", "paused");
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Resume a paused job; it re-enters the queue and competes for a slot by ordering.
|
|
152
|
+
*
|
|
153
|
+
* @capability resume-work resume a paused job back into the queue's slot competition
|
|
154
|
+
*/
|
|
155
|
+
export function resumeJob(state, id) {
|
|
156
|
+
return setStatus(state, id, "paused", "queued");
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Advance the queue by `dt` seconds. Promotes queued jobs into up to `concurrency`
|
|
160
|
+
* active slots, advances active jobs, and completes those that reach their
|
|
161
|
+
* duration — emitting `started`/`completed` events in deterministic order. A large
|
|
162
|
+
* `dt` catches up across many jobs in one call: when a job completes with leftover
|
|
163
|
+
* time, the freed slot promotes the next queued job and applies the remainder, so a
|
|
164
|
+
* reconnect or save/load gap resolves in a single bounded pass. Completed jobs are
|
|
165
|
+
* removed from the returned state.
|
|
166
|
+
*
|
|
167
|
+
* @capability tick-work advance jobs over time, completing work and emitting typed lifecycle events
|
|
168
|
+
*/
|
|
169
|
+
export function tick(state, config, dt) {
|
|
170
|
+
if (dt <= 0 || state.jobs.length === 0)
|
|
171
|
+
return { state, events: [] };
|
|
172
|
+
const concurrency = Math.max(1, Math.floor(config.concurrency ?? 1));
|
|
173
|
+
const ordering = config.ordering ?? priorityOrdering;
|
|
174
|
+
const jobs = state.jobs.map((job) => ({ ...job }));
|
|
175
|
+
const events = [];
|
|
176
|
+
const budget = new Map();
|
|
177
|
+
const completedIds = new Set();
|
|
178
|
+
const activeCount = () => jobs.reduce((n, job) => (job.status === "active" ? n + 1 : n), 0);
|
|
179
|
+
const nextQueued = () => {
|
|
180
|
+
let best;
|
|
181
|
+
for (const job of jobs) {
|
|
182
|
+
if (job.status !== "queued")
|
|
183
|
+
continue;
|
|
184
|
+
if (best === undefined || ordering(job, best) < 0)
|
|
185
|
+
best = job;
|
|
186
|
+
}
|
|
187
|
+
return best;
|
|
188
|
+
};
|
|
189
|
+
const promote = (job, slotBudget) => {
|
|
190
|
+
job.status = "active";
|
|
191
|
+
budget.set(job.id, Math.max(0, slotBudget));
|
|
192
|
+
events.push({ type: "started", job: { ...job } });
|
|
193
|
+
};
|
|
194
|
+
// Jobs already active from a prior tick get a fresh full budget this tick.
|
|
195
|
+
for (const job of jobs) {
|
|
196
|
+
if (job.status === "active")
|
|
197
|
+
budget.set(job.id, dt);
|
|
198
|
+
}
|
|
199
|
+
// Fill idle slots up to concurrency with a full tick budget each.
|
|
200
|
+
while (activeCount() < concurrency) {
|
|
201
|
+
const next = nextQueued();
|
|
202
|
+
if (next === undefined)
|
|
203
|
+
break;
|
|
204
|
+
promote(next, dt);
|
|
205
|
+
}
|
|
206
|
+
// Step through completions in time order; each freed slot pulls the next queued
|
|
207
|
+
// job forward with the leftover time. Bounded by the job count.
|
|
208
|
+
const guardMax = jobs.length * 2 + concurrency + 8;
|
|
209
|
+
for (let guard = 0; guard <= guardMax; guard += 1) {
|
|
210
|
+
let chosen;
|
|
211
|
+
let chosenRemaining = Infinity;
|
|
212
|
+
for (const job of jobs) {
|
|
213
|
+
if (job.status !== "active")
|
|
214
|
+
continue;
|
|
215
|
+
const available = budget.get(job.id) ?? 0;
|
|
216
|
+
if (available <= 0)
|
|
217
|
+
continue;
|
|
218
|
+
const remaining = job.duration - job.elapsed;
|
|
219
|
+
if (remaining > available)
|
|
220
|
+
continue;
|
|
221
|
+
if (chosen === undefined ||
|
|
222
|
+
remaining < chosenRemaining ||
|
|
223
|
+
(remaining === chosenRemaining && ordering(job, chosen) < 0)) {
|
|
224
|
+
chosen = job;
|
|
225
|
+
chosenRemaining = remaining;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
if (chosen === undefined)
|
|
229
|
+
break;
|
|
230
|
+
const leftover = (budget.get(chosen.id) ?? 0) - Math.max(0, chosenRemaining);
|
|
231
|
+
chosen.elapsed = chosen.duration;
|
|
232
|
+
budget.delete(chosen.id);
|
|
233
|
+
completedIds.add(chosen.id);
|
|
234
|
+
const finished = { ...chosen, status: "active" };
|
|
235
|
+
const output = (config.output ? config.output(finished) : undefined);
|
|
236
|
+
events.push({ type: "completed", job: finished, output });
|
|
237
|
+
const next = nextQueued();
|
|
238
|
+
if (next !== undefined)
|
|
239
|
+
promote(next, leftover);
|
|
240
|
+
}
|
|
241
|
+
// Advance any active job that still holds budget but did not complete.
|
|
242
|
+
for (const job of jobs) {
|
|
243
|
+
if (job.status !== "active" || completedIds.has(job.id))
|
|
244
|
+
continue;
|
|
245
|
+
const available = budget.get(job.id) ?? 0;
|
|
246
|
+
if (available > 0)
|
|
247
|
+
job.elapsed = Math.min(job.duration, job.elapsed + available);
|
|
248
|
+
}
|
|
249
|
+
const remaining = jobs
|
|
250
|
+
.filter((job) => !completedIds.has(job.id))
|
|
251
|
+
.map((job) => ({ ...job }));
|
|
252
|
+
return { state: { ...state, jobs: remaining }, events };
|
|
253
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thin unit-training composition over the generic {@link WorkQueueConfig}. Turns a
|
|
3
|
+
* catalog of trainable units into a queue config whose reservation is the unit's
|
|
4
|
+
* cost/population, whose duration is its train time, and whose completion output is
|
|
5
|
+
* a plain spawn descriptor. The queue never spawns or moves anything: routing the
|
|
6
|
+
* descriptor to a spawn primitive (and rally movement) is the caller's completion
|
|
7
|
+
* adapter, keeping this genre-agnostic across RTS producers, respawn bays, and any
|
|
8
|
+
* "make one of X after T seconds" flow.
|
|
9
|
+
*/
|
|
10
|
+
import type { JobValidation, WorkQueueConfig, WorkQueueState } from "./jobQueue.js";
|
|
11
|
+
/** Resource costs keyed by currency/resource id. */
|
|
12
|
+
export type ResourceCost = Readonly<Record<string, number>>;
|
|
13
|
+
/** A unit the producer can train. */
|
|
14
|
+
export interface TrainableUnitDef {
|
|
15
|
+
/** Catalog id of the produced unit. */
|
|
16
|
+
readonly id: string;
|
|
17
|
+
/** Seconds to train. */
|
|
18
|
+
readonly trainSeconds: number;
|
|
19
|
+
/** Resources reserved at enqueue. */
|
|
20
|
+
readonly cost?: ResourceCost;
|
|
21
|
+
/** Population/supply reserved at enqueue. */
|
|
22
|
+
readonly population?: number;
|
|
23
|
+
}
|
|
24
|
+
/** What the caller asks the queue to build. */
|
|
25
|
+
export interface UnitTrainingSpec {
|
|
26
|
+
readonly unitId: string;
|
|
27
|
+
}
|
|
28
|
+
/** Reservation stored on a training job — the inputs to charge and refund. */
|
|
29
|
+
export interface UnitReservation {
|
|
30
|
+
readonly cost: ResourceCost;
|
|
31
|
+
readonly population: number;
|
|
32
|
+
}
|
|
33
|
+
/** Completion payload: everything a spawn/rally adapter needs, and nothing it doesn't. */
|
|
34
|
+
export interface UnitSpawnOrder {
|
|
35
|
+
readonly unitId: string;
|
|
36
|
+
readonly reservation: UnitReservation;
|
|
37
|
+
}
|
|
38
|
+
/** Config knobs for {@link unitTrainingConfig}. */
|
|
39
|
+
export interface UnitTrainingOptions {
|
|
40
|
+
/** Trainable units by id. */
|
|
41
|
+
readonly units: Record<string, TrainableUnitDef>;
|
|
42
|
+
/** Producers building at once (default 1 — a classic single build queue). */
|
|
43
|
+
readonly concurrency?: number;
|
|
44
|
+
/** Max queued+building units. */
|
|
45
|
+
readonly capacity?: number;
|
|
46
|
+
/** Refund fraction of cost on cancel (0 = none, 1 = full). Defaults to 1. */
|
|
47
|
+
readonly refundFraction?: number;
|
|
48
|
+
/** Extra pre-enqueue gate (affordability, tech, population cap). */
|
|
49
|
+
readonly canEnqueue?: (spec: UnitTrainingSpec, state: WorkQueueState<UnitTrainingSpec, UnitReservation>) => JobValidation;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Build a {@link WorkQueueConfig} for training units from a catalog. Reservation is
|
|
53
|
+
* the unit's cost + population; duration is its train time; completion output is a
|
|
54
|
+
* {@link UnitSpawnOrder} for the caller to route to its spawn primitive.
|
|
55
|
+
*
|
|
56
|
+
* @capability unit-training compose a timed work queue that trains catalog units into spawn orders
|
|
57
|
+
*/
|
|
58
|
+
export declare function unitTrainingConfig(options: UnitTrainingOptions): WorkQueueConfig<UnitTrainingSpec, UnitReservation, UnitSpawnOrder>;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thin unit-training composition over the generic {@link WorkQueueConfig}. Turns a
|
|
3
|
+
* catalog of trainable units into a queue config whose reservation is the unit's
|
|
4
|
+
* cost/population, whose duration is its train time, and whose completion output is
|
|
5
|
+
* a plain spawn descriptor. The queue never spawns or moves anything: routing the
|
|
6
|
+
* descriptor to a spawn primitive (and rally movement) is the caller's completion
|
|
7
|
+
* adapter, keeping this genre-agnostic across RTS producers, respawn bays, and any
|
|
8
|
+
* "make one of X after T seconds" flow.
|
|
9
|
+
*/
|
|
10
|
+
function scaleCost(cost, fraction) {
|
|
11
|
+
if (fraction >= 1)
|
|
12
|
+
return cost;
|
|
13
|
+
if (fraction <= 0)
|
|
14
|
+
return {};
|
|
15
|
+
const out = {};
|
|
16
|
+
for (const [resource, amount] of Object.entries(cost))
|
|
17
|
+
out[resource] = Math.floor(amount * fraction);
|
|
18
|
+
return out;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Build a {@link WorkQueueConfig} for training units from a catalog. Reservation is
|
|
22
|
+
* the unit's cost + population; duration is its train time; completion output is a
|
|
23
|
+
* {@link UnitSpawnOrder} for the caller to route to its spawn primitive.
|
|
24
|
+
*
|
|
25
|
+
* @capability unit-training compose a timed work queue that trains catalog units into spawn orders
|
|
26
|
+
*/
|
|
27
|
+
export function unitTrainingConfig(options) {
|
|
28
|
+
const refundFraction = options.refundFraction ?? 1;
|
|
29
|
+
const unitFor = (unitId) => options.units[unitId];
|
|
30
|
+
return {
|
|
31
|
+
concurrency: options.concurrency,
|
|
32
|
+
capacity: options.capacity,
|
|
33
|
+
duration: (spec) => Math.max(0, unitFor(spec.unitId)?.trainSeconds ?? 0),
|
|
34
|
+
reserve: (spec) => {
|
|
35
|
+
const def = unitFor(spec.unitId);
|
|
36
|
+
return { cost: def?.cost ?? {}, population: def?.population ?? 0 };
|
|
37
|
+
},
|
|
38
|
+
validate: (spec, state) => {
|
|
39
|
+
if (unitFor(spec.unitId) === undefined)
|
|
40
|
+
return { ok: false, reason: "unknown-unit" };
|
|
41
|
+
return options.canEnqueue?.(spec, state) ?? { ok: true };
|
|
42
|
+
},
|
|
43
|
+
output: (job) => ({
|
|
44
|
+
unitId: job.spec.unitId,
|
|
45
|
+
reservation: job.reservation,
|
|
46
|
+
}),
|
|
47
|
+
refund: (job) => ({
|
|
48
|
+
cost: scaleCost(job.reservation.cost, refundFraction),
|
|
49
|
+
population: job.reservation.population,
|
|
50
|
+
}),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { SceneMarkerLike } from "./sceneShapes.js";
|
|
2
|
+
/**
|
|
3
|
+
* One authored catalog prop resolved from an editor marker — grounded at `x`/`z` with yaw, ready
|
|
4
|
+
* for `ctx.scene.object.place` or {@link placeAuthoredObjects}.
|
|
5
|
+
*/
|
|
6
|
+
export interface AuthoredObject {
|
|
7
|
+
catalogId: string;
|
|
8
|
+
x: number;
|
|
9
|
+
z: number;
|
|
10
|
+
rotationY: number;
|
|
11
|
+
instanceId: string;
|
|
12
|
+
/** Extra lift in meters from the marker (`catalogId` field / meta), applied on top of terrain height. */
|
|
13
|
+
verticalOffset: number;
|
|
14
|
+
}
|
|
15
|
+
/** Minimal marker shape {@link resolveAuthoredObjects} reads; any `EditorMarker` satisfies it. */
|
|
16
|
+
export interface AuthoredObjectMarkerLike extends SceneMarkerLike {
|
|
17
|
+
catalogId?: string;
|
|
18
|
+
rotationY?: number;
|
|
19
|
+
}
|
|
20
|
+
/** Minimal document shape {@link resolveAuthoredObjects} walks; any `EditorDocument` satisfies it. */
|
|
21
|
+
export interface AuthoredObjectsDocumentLike {
|
|
22
|
+
markers: readonly AuthoredObjectMarkerLike[];
|
|
23
|
+
}
|
|
24
|
+
/** Structural place target — any `ObjectStore` satisfies it. */
|
|
25
|
+
export interface AuthoredObjectPlaceTarget {
|
|
26
|
+
place(catalogId: string, x: number, y: number, z: number, options?: {
|
|
27
|
+
instanceId?: string;
|
|
28
|
+
rotation?: number;
|
|
29
|
+
onExisting?: "throw" | "replace" | "keep";
|
|
30
|
+
}): string;
|
|
31
|
+
}
|
|
32
|
+
/** Options for {@link placeAuthoredObjects}. */
|
|
33
|
+
export interface PlaceAuthoredObjectsOptions {
|
|
34
|
+
/** Extra lift in meters applied to every placement after terrain height + per-object offset. */
|
|
35
|
+
verticalOffset?: number;
|
|
36
|
+
/** How to treat instance ids already in the store. Default `"throw"` (ObjectStore default). */
|
|
37
|
+
onExisting?: "throw" | "replace" | "keep";
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Catalog id for a marker: first-class `catalogId` field, else `meta.catalogId` migration alias.
|
|
41
|
+
* Returns null when the marker is not an authored catalog prop (spawn, mob, generator, …).
|
|
42
|
+
* @capability authored-objects place catalog mesh props from an editor document
|
|
43
|
+
*/
|
|
44
|
+
export declare function markerCatalogId(marker: AuthoredObjectMarkerLike): string | null;
|
|
45
|
+
/**
|
|
46
|
+
* Every marker carrying a catalog id, as placeable props — pure, no terrain sample. Parallel to
|
|
47
|
+
* {@link resolveScatter}: games and headless tests read the same list `<AuthoredObjects>` places.
|
|
48
|
+
* @capability authored-objects place catalog mesh props from an editor document
|
|
49
|
+
*/
|
|
50
|
+
export declare function resolveAuthoredObjects(document: AuthoredObjectsDocumentLike): AuthoredObject[];
|
|
51
|
+
/**
|
|
52
|
+
* Places resolved authored objects into an object store, grounding each on `sampleHeight(x,z)` plus
|
|
53
|
+
* per-object and options vertical offsets. Returns the instance ids that were placed (or kept).
|
|
54
|
+
* @capability authored-objects place catalog mesh props from an editor document
|
|
55
|
+
*/
|
|
56
|
+
export declare function placeAuthoredObjects(store: AuthoredObjectPlaceTarget, objects: readonly AuthoredObject[], sampleHeight: (x: number, z: number) => number, options?: PlaceAuthoredObjectsOptions): string[];
|
|
57
|
+
/** Convenience: resolve a document then place every authored catalog prop. */
|
|
58
|
+
export declare function placeAuthoredObjectsFromDocument(store: AuthoredObjectPlaceTarget, document: AuthoredObjectsDocumentLike, sampleHeight: (x: number, z: number) => number, options?: PlaceAuthoredObjectsOptions): string[];
|