@jgengine/core 0.10.0 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +39 -2
- package/LICENSE +203 -661
- package/README.md +1 -1
- package/dist/ai/crowd.d.ts +55 -0
- package/dist/ai/crowd.js +114 -0
- package/dist/ai/flock.d.ts +5 -2
- package/dist/ai/flock.js +5 -2
- package/dist/ai/groupAssist.d.ts +1 -0
- package/dist/ai/groupAssist.js +1 -0
- package/dist/ai/heatSystem.d.ts +76 -0
- package/dist/ai/heatSystem.js +97 -0
- package/dist/ai/interestScheduler.d.ts +107 -0
- package/dist/ai/interestScheduler.js +118 -0
- package/dist/ai/jobBoard.d.ts +1 -0
- package/dist/ai/jobBoard.js +1 -0
- package/dist/ai/laneSelect.d.ts +5 -2
- package/dist/ai/laneSelect.js +5 -2
- package/dist/ai/mobBrain.d.ts +1 -0
- package/dist/ai/mobBrain.js +1 -0
- package/dist/ai/populationDirector.d.ts +103 -0
- package/dist/ai/populationDirector.js +190 -0
- package/dist/ai/pursuit.d.ts +56 -0
- package/dist/ai/pursuit.js +53 -0
- package/dist/ai/spawnDirector.d.ts +7 -2
- package/dist/ai/spawnDirector.js +18 -15
- package/dist/ai/spawnPoint.d.ts +3 -1
- package/dist/ai/spawnPoint.js +3 -1
- package/dist/ai/targetAcquisition.d.ts +84 -0
- package/dist/ai/targetAcquisition.js +92 -0
- package/dist/anim/easing.d.ts +19 -0
- package/dist/anim/easing.js +19 -0
- package/dist/anim/oscillator.d.ts +12 -0
- package/dist/anim/oscillator.js +25 -0
- package/dist/area/areaEffectField.d.ts +127 -0
- package/dist/area/areaEffectField.js +175 -0
- package/dist/area/stackPolicy.d.ts +47 -0
- package/dist/area/stackPolicy.js +99 -0
- package/dist/authoring.d.ts +2 -1
- package/dist/authoring.js +2 -1
- package/dist/board/laneBoard.d.ts +13 -0
- package/dist/board/laneBoard.js +13 -0
- package/dist/board/timelineBoard.d.ts +10 -0
- package/dist/board/timelineBoard.js +10 -0
- package/dist/combat/abilityKit.d.ts +18 -0
- package/dist/combat/abilityKit.js +24 -9
- package/dist/combat/animationState.d.ts +5 -0
- package/dist/combat/animationState.js +5 -0
- package/dist/combat/breakMeters.d.ts +10 -0
- package/dist/combat/breakMeters.js +10 -0
- package/dist/combat/castRunner.d.ts +5 -0
- package/dist/combat/castRunner.js +5 -0
- package/dist/combat/comboPoints.d.ts +5 -0
- package/dist/combat/comboPoints.js +5 -0
- package/dist/combat/comboString.d.ts +5 -0
- package/dist/combat/comboString.js +5 -0
- package/dist/combat/damageInterceptors.d.ts +192 -0
- package/dist/combat/damageInterceptors.js +251 -0
- package/dist/combat/damageMatchup.d.ts +68 -0
- package/dist/combat/damageMatchup.js +42 -0
- package/dist/combat/damageResolution.d.ts +63 -0
- package/dist/combat/damageResolution.js +50 -0
- package/dist/combat/death.d.ts +7 -1
- package/dist/combat/death.js +5 -0
- package/dist/combat/deathReason.d.ts +14 -0
- package/dist/combat/deathReason.js +1 -0
- package/dist/combat/defensiveWindow.d.ts +5 -0
- package/dist/combat/defensiveWindow.js +5 -0
- package/dist/combat/dotField.d.ts +5 -1
- package/dist/combat/dotField.js +5 -1
- package/dist/combat/downed.d.ts +5 -0
- package/dist/combat/downed.js +5 -0
- package/dist/combat/effects.d.ts +5 -0
- package/dist/combat/effects.js +5 -0
- package/dist/combat/encounterSequence.d.ts +258 -0
- package/dist/combat/encounterSequence.js +426 -0
- package/dist/combat/hitReaction.d.ts +57 -1
- package/dist/combat/hitReaction.js +45 -5
- package/dist/combat/magazine.d.ts +54 -0
- package/dist/combat/magazine.js +96 -0
- package/dist/combat/projectiles.d.ts +5 -0
- package/dist/combat/projectiles.js +32 -14
- package/dist/combat/receivedDamage.d.ts +117 -0
- package/dist/combat/receivedDamage.js +92 -0
- package/dist/combat/regenShield.d.ts +5 -1
- package/dist/combat/regenShield.js +5 -1
- package/dist/combat/renderCues.d.ts +51 -0
- package/dist/combat/renderCues.js +44 -0
- package/dist/combat/resourcePool.d.ts +5 -0
- package/dist/combat/resourcePool.js +5 -0
- package/dist/combat/rewardAllocation.d.ts +121 -0
- package/dist/combat/rewardAllocation.js +251 -0
- package/dist/combat/shotOrigin.d.ts +18 -1
- package/dist/combat/shotOrigin.js +39 -0
- package/dist/combat/statusApplication.d.ts +96 -0
- package/dist/combat/statusApplication.js +81 -0
- package/dist/combat/telegraph.d.ts +11 -2
- package/dist/combat/telegraph.js +11 -2
- package/dist/combat/thresholdCrossings.d.ts +85 -0
- package/dist/combat/thresholdCrossings.js +116 -0
- package/dist/combat.d.ts +35 -0
- package/dist/combat.js +35 -0
- package/dist/commands/commandRegistry.d.ts +11 -0
- package/dist/commands/commandRegistry.js +9 -2
- package/dist/crafting/crop.d.ts +18 -0
- package/dist/crafting/crop.js +18 -0
- package/dist/crafting/production.d.ts +5 -0
- package/dist/crafting/production.js +5 -0
- package/dist/devtools/controls.d.ts +38 -0
- package/dist/devtools/controls.js +181 -0
- package/dist/devtools/devtools.d.ts +5 -197
- package/dist/devtools/devtools.js +38 -774
- package/dist/devtools/discover.d.ts +32 -0
- package/dist/devtools/discover.js +240 -0
- package/dist/devtools/fallbackSeams.d.ts +50 -0
- package/dist/devtools/fallbackSeams.js +111 -0
- package/dist/devtools/frame.d.ts +15 -0
- package/dist/devtools/frame.js +247 -0
- package/dist/devtools/logs.d.ts +15 -0
- package/dist/devtools/logs.js +86 -0
- package/dist/devtools/overrides.d.ts +16 -0
- package/dist/devtools/overrides.js +66 -0
- package/dist/devtools/rewriteTunables.d.ts +17 -0
- package/dist/devtools/rewriteTunables.js +276 -0
- package/dist/devtools/saveEndpoint.d.ts +46 -0
- package/dist/devtools/saveEndpoint.js +48 -0
- package/dist/devtools/transformTunables.d.ts +3 -0
- package/dist/devtools/transformTunables.js +3 -0
- package/dist/devtools/tunableSchema.d.ts +31 -0
- package/dist/devtools/tunableSchema.js +31 -0
- package/dist/devtools/types.d.ts +212 -0
- package/dist/devtools/types.js +1 -0
- package/dist/economy/auctionBook.d.ts +122 -0
- package/dist/economy/auctionBook.js +213 -0
- package/dist/economy/currency.d.ts +12 -1
- package/dist/economy/currency.js +12 -1
- package/dist/economy/listingBook.d.ts +91 -0
- package/dist/economy/listingBook.js +144 -0
- package/dist/economy/priceHistory.d.ts +44 -0
- package/dist/economy/priceHistory.js +89 -0
- package/dist/economy/resourceLedger.d.ts +222 -0
- package/dist/economy/resourceLedger.js +353 -0
- package/dist/economy/sharedWallet.d.ts +14 -0
- package/dist/economy/sharedWallet.js +14 -0
- package/dist/economy/techTree.d.ts +12 -0
- package/dist/economy/techTree.js +12 -0
- package/dist/economy/unlockPoints.d.ts +92 -0
- package/dist/economy/unlockPoints.js +103 -0
- package/dist/economy/wallet.d.ts +26 -2
- package/dist/economy/wallet.js +35 -6
- package/dist/editor/commandApply.d.ts +5 -0
- package/dist/editor/commandApply.js +755 -0
- package/dist/editor/commands.d.ts +235 -7
- package/dist/editor/commands.js +82 -124
- package/dist/editor/directives.d.ts +94 -0
- package/dist/editor/directives.js +206 -0
- package/dist/editor/document.d.ts +194 -13
- package/dist/editor/document.js +1166 -19
- package/dist/editor/entityCatalog.d.ts +42 -0
- package/dist/editor/entityCatalog.js +101 -0
- package/dist/editor/environment.d.ts +74 -0
- package/dist/editor/environment.js +169 -0
- package/dist/editor/grid.d.ts +229 -0
- package/dist/editor/grid.js +366 -0
- package/dist/editor/gridAdapters.d.ts +80 -0
- package/dist/editor/gridAdapters.js +134 -0
- package/dist/editor/index.d.ts +98 -6
- package/dist/editor/index.js +13 -2
- package/dist/editor/liveSync.d.ts +127 -0
- package/dist/editor/liveSync.js +249 -0
- package/dist/editor/minimap.d.ts +31 -0
- package/dist/editor/minimap.js +73 -0
- package/dist/editor/runtimeInspector.d.ts +88 -0
- package/dist/editor/runtimeInspector.js +239 -0
- package/dist/editor/streamer.d.ts +66 -0
- package/dist/editor/streamer.js +68 -0
- package/dist/editor/types.d.ts +250 -1
- package/dist/editor/world.d.ts +136 -0
- package/dist/editor/world.js +303 -0
- package/dist/faction/reputation.d.ts +5 -0
- package/dist/faction/reputation.js +5 -0
- package/dist/format/distance.d.ts +17 -0
- package/dist/format/distance.js +18 -0
- package/dist/format/duration.d.ts +27 -0
- package/dist/format/duration.js +45 -0
- package/dist/format/speed.d.ts +17 -0
- package/dist/format/speed.js +25 -0
- package/dist/game/breeding.d.ts +161 -0
- package/dist/game/breeding.js +181 -0
- package/dist/game/cameraConfig.d.ts +451 -0
- package/dist/game/cameraConfig.js +1 -0
- package/dist/game/connectedPlayers.d.ts +6 -4
- package/dist/game/connectedPlayers.js +2 -2
- package/dist/game/cosmetics.d.ts +9 -0
- package/dist/game/cosmetics.js +16 -0
- package/dist/game/defineGame.d.ts +110 -5
- package/dist/game/defineGame.js +49 -4
- package/dist/game/defineSystem.d.ts +90 -0
- package/dist/game/defineSystem.js +47 -0
- package/dist/game/dialogue.d.ts +33 -0
- package/dist/game/dialogue.js +21 -0
- package/dist/game/events.d.ts +63 -13
- package/dist/game/events.js +5 -0
- package/dist/game/feed.d.ts +33 -0
- package/dist/game/feed.js +35 -2
- package/dist/game/gamePhase.d.ts +11 -0
- package/dist/game/gamePhase.js +16 -0
- package/dist/game/leaderboard.d.ts +5 -0
- package/dist/game/leaderboard.js +5 -0
- package/dist/game/loadout.d.ts +5 -0
- package/dist/game/loadout.js +5 -0
- package/dist/game/lootFilter.d.ts +2 -0
- package/dist/game/lootFilter.js +2 -0
- package/dist/game/lootPipeline.d.ts +164 -0
- package/dist/game/lootPipeline.js +216 -0
- package/dist/game/lootTable.d.ts +19 -2
- package/dist/game/lootTable.js +15 -5
- package/dist/game/objectives.d.ts +43 -0
- package/dist/game/objectives.js +36 -0
- package/dist/game/paramLayers.d.ts +148 -0
- package/dist/game/paramLayers.js +185 -0
- package/dist/game/ping.d.ts +5 -0
- package/dist/game/ping.js +5 -0
- package/dist/game/playableGame.d.ts +116 -432
- package/dist/game/playableGame.js +1 -1
- package/dist/game/progression.d.ts +35 -0
- package/dist/game/progression.js +19 -0
- package/dist/game/quest.d.ts +8 -0
- package/dist/game/quest.js +30 -3
- package/dist/game/race.d.ts +141 -0
- package/dist/game/race.js +169 -0
- package/dist/game/recordBook.d.ts +3 -1
- package/dist/game/recordBook.js +4 -1
- package/dist/game/ruleSelection.d.ts +75 -0
- package/dist/game/ruleSelection.js +127 -0
- package/dist/game/runDraft.d.ts +5 -0
- package/dist/game/runDraft.js +5 -0
- package/dist/game/saveStore.d.ts +111 -0
- package/dist/game/saveStore.js +312 -0
- package/dist/game/snapshotHistory.d.ts +67 -0
- package/dist/game/snapshotHistory.js +95 -0
- package/dist/game/social.d.ts +38 -1
- package/dist/game/social.js +71 -0
- package/dist/game/spawnPoints.d.ts +5 -0
- package/dist/game/spawnPoints.js +5 -0
- package/dist/game/systemRuntime.d.ts +50 -0
- package/dist/game/systemRuntime.js +157 -0
- package/dist/game/systemSchedule.d.ts +72 -0
- package/dist/game/systemSchedule.js +242 -0
- package/dist/game/toasts.d.ts +43 -0
- package/dist/game/toasts.js +44 -0
- package/dist/game/trade.d.ts +10 -0
- package/dist/game/trade.js +10 -0
- package/dist/game/tribe.d.ts +184 -0
- package/dist/game/tribe.js +432 -0
- package/dist/game/unlocks.d.ts +8 -0
- package/dist/game/unlocks.js +16 -0
- package/dist/game/vfxInstance.d.ts +138 -0
- package/dist/game/vfxInstance.js +96 -0
- package/dist/game/worldItem.d.ts +17 -4
- package/dist/game/worldItem.js +17 -4
- package/dist/gameplay.d.ts +93 -0
- package/dist/gameplay.js +93 -0
- package/dist/index.d.ts +5 -14
- package/dist/index.js +5 -14
- package/dist/input/actionBindings.d.ts +23 -6
- package/dist/input/actionBindings.js +23 -6
- package/dist/input/axisInput.d.ts +7 -2
- package/dist/input/axisInput.js +7 -2
- package/dist/input/controlGroups.d.ts +67 -0
- package/dist/input/controlGroups.js +41 -0
- package/dist/input/touchScheme.d.ts +82 -6
- package/dist/input/touchScheme.js +123 -10
- package/dist/interaction/lockpick.d.ts +61 -0
- package/dist/interaction/lockpick.js +168 -0
- package/dist/interaction/proximityPrompt.d.ts +2 -0
- package/dist/interaction/proximityPrompt.js +2 -0
- package/dist/interaction/qte.d.ts +5 -0
- package/dist/interaction/qte.js +5 -0
- package/dist/interaction/skillCheck.d.ts +5 -0
- package/dist/interaction/skillCheck.js +5 -0
- package/dist/inventory/encumbrance.d.ts +69 -0
- package/dist/inventory/encumbrance.js +68 -0
- package/dist/inventory/inventoryModel.d.ts +12 -0
- package/dist/inventory/inventoryModel.js +12 -0
- package/dist/inventory/shapedGrid.d.ts +16 -0
- package/dist/inventory/shapedGrid.js +16 -0
- package/dist/inventory/slotModel.d.ts +10 -0
- package/dist/inventory/slotModel.js +10 -0
- package/dist/item/durability.d.ts +5 -0
- package/dist/item/durability.js +6 -3
- package/dist/item/itemIdentity.d.ts +171 -0
- package/dist/item/itemIdentity.js +138 -0
- package/dist/item/itemInstanceRegistry.d.ts +32 -0
- package/dist/item/itemInstanceRegistry.js +34 -0
- package/dist/item/itemgen.d.ts +163 -0
- package/dist/item/itemgen.js +151 -0
- package/dist/item/modularItem.d.ts +5 -0
- package/dist/item/modularItem.js +5 -0
- package/dist/item/use.d.ts +5 -0
- package/dist/item/use.js +5 -0
- package/dist/item/useBehavior.d.ts +142 -0
- package/dist/item/useBehavior.js +105 -0
- package/dist/item/weapon.d.ts +5 -0
- package/dist/item/weapon.js +5 -0
- package/dist/math/scalar.d.ts +25 -0
- package/dist/math/scalar.js +47 -0
- package/dist/meta/changelog.d.ts +4 -1
- package/dist/meta/changelog.js +39 -2
- package/dist/movement/avoidance.d.ts +45 -0
- package/dist/movement/avoidance.js +123 -0
- package/dist/movement/cameraRig.d.ts +8 -0
- package/dist/movement/cameraRig.js +8 -0
- package/dist/movement/dash.d.ts +11 -0
- package/dist/movement/dash.js +11 -0
- package/dist/movement/formation.d.ts +135 -0
- package/dist/movement/formation.js +194 -0
- package/dist/movement/glideModel.d.ts +5 -0
- package/dist/movement/glideModel.js +5 -0
- package/dist/movement/grappleSwing.d.ts +5 -0
- package/dist/movement/grappleSwing.js +5 -0
- package/dist/movement/leaderTrail.d.ts +5 -0
- package/dist/movement/leaderTrail.js +5 -0
- package/dist/movement/movementModel.d.ts +50 -9
- package/dist/movement/movementModel.js +75 -29
- package/dist/movement/playerMovement.js +167 -12
- package/dist/movement/poseState.d.ts +13 -0
- package/dist/movement/poseState.js +16 -0
- package/dist/movement/steering.d.ts +8 -0
- package/dist/movement/steering.js +18 -0
- package/dist/multiplayer/combatSnapshot.d.ts +3 -0
- package/dist/multiplayer/combatSnapshot.js +16 -8
- package/dist/multiplayer/lagCompensation.d.ts +5 -0
- package/dist/multiplayer/lagCompensation.js +5 -0
- package/dist/multiplayer/presenceModel.d.ts +11 -1
- package/dist/multiplayer/presenceModel.js +17 -1
- package/dist/multiplayer/simultaneousCommit.d.ts +3 -0
- package/dist/multiplayer/simultaneousCommit.js +3 -0
- package/dist/multiplayer.d.ts +11 -0
- package/dist/multiplayer.js +11 -0
- package/dist/nav/pathFollow.d.ts +57 -0
- package/dist/nav/pathFollow.js +109 -0
- package/dist/orders/orderKinds.d.ts +156 -0
- package/dist/orders/orderKinds.js +197 -0
- package/dist/orders/orderQueue.d.ts +208 -0
- package/dist/orders/orderQueue.js +211 -0
- package/dist/physics/drivableVehicle.d.ts +31 -0
- package/dist/physics/drivableVehicle.js +16 -0
- package/dist/physics/flightDynamics.d.ts +82 -0
- package/dist/physics/flightDynamics.js +165 -0
- package/dist/physics/gravityField.d.ts +25 -0
- package/dist/physics/gravityField.js +41 -0
- package/dist/physics/kinematicVehicle.d.ts +108 -1
- package/dist/physics/kinematicVehicle.js +212 -15
- package/dist/physics/physicsWorld.d.ts +50 -12
- package/dist/physics/physicsWorld.js +120 -122
- package/dist/physics/radialImpulse.d.ts +25 -0
- package/dist/physics/radialImpulse.js +27 -0
- package/dist/physics/vehicleObstacles.d.ts +44 -0
- package/dist/physics/vehicleObstacles.js +115 -0
- package/dist/procedural.d.ts +3 -0
- package/dist/procedural.js +3 -0
- package/dist/progression/statGraph.d.ts +116 -0
- package/dist/progression/statGraph.js +318 -0
- package/dist/puzzle/cellGrid.d.ts +9 -0
- package/dist/puzzle/cellGrid.js +9 -0
- package/dist/puzzle/fallingPiece.d.ts +9 -0
- package/dist/puzzle/fallingPiece.js +9 -0
- package/dist/puzzle/nonogram.d.ts +39 -0
- package/dist/puzzle/nonogram.js +136 -0
- package/dist/random/nameGen.d.ts +5 -0
- package/dist/random/nameGen.js +5 -0
- package/dist/random/pick.d.ts +8 -0
- package/dist/random/pick.js +31 -0
- package/dist/random/rng.d.ts +26 -1
- package/dist/random/rng.js +32 -9
- package/dist/random/seedLink.d.ts +4 -0
- package/dist/random/seedLink.js +4 -0
- package/dist/relation/keyedValues.d.ts +54 -0
- package/dist/relation/keyedValues.js +115 -0
- package/dist/relation/thresholds.d.ts +62 -0
- package/dist/relation/thresholds.js +62 -0
- package/dist/render/color.d.ts +12 -0
- package/dist/render/color.js +26 -0
- package/dist/render/lookPreset.d.ts +41 -0
- package/dist/render/lookPreset.js +29 -0
- package/dist/render/postProcessing.d.ts +20 -0
- package/dist/render/postProcessing.js +21 -1
- package/dist/rules/predicate.d.ts +53 -0
- package/dist/rules/predicate.js +64 -0
- package/dist/rules/ruleEffects.d.ts +38 -0
- package/dist/rules/ruleEffects.js +37 -0
- package/dist/rules/triggeredRules.d.ts +160 -0
- package/dist/rules/triggeredRules.js +241 -0
- package/dist/runtime/adapter.d.ts +55 -3
- package/dist/runtime/adapter.js +57 -1
- package/dist/runtime/cameraDirector.d.ts +1 -0
- package/dist/runtime/cameraDirector.js +1 -0
- package/dist/runtime/commandRunner.d.ts +1 -0
- package/dist/runtime/commandRunner.js +1 -0
- package/dist/runtime/context/combat.d.ts +51 -0
- package/dist/runtime/context/combat.js +130 -0
- package/dist/runtime/context/combatFx.d.ts +23 -0
- package/dist/runtime/context/combatFx.js +161 -0
- package/dist/runtime/context/deathLoot.d.ts +30 -0
- package/dist/runtime/context/deathLoot.js +39 -0
- package/dist/runtime/context/player.d.ts +48 -0
- package/dist/runtime/context/player.js +125 -0
- package/dist/runtime/context/registries.d.ts +13 -0
- package/dist/runtime/context/registries.js +84 -0
- package/dist/runtime/context/scene.d.ts +59 -0
- package/dist/runtime/context/scene.js +291 -0
- package/dist/runtime/context/snapshotCodecs.d.ts +12 -0
- package/dist/runtime/context/snapshotCodecs.js +26 -0
- package/dist/runtime/context/worldItems.d.ts +21 -0
- package/dist/runtime/context/worldItems.js +37 -0
- package/dist/runtime/descriptors/baseline.d.ts +48 -0
- package/dist/runtime/descriptors/baseline.js +157 -0
- package/dist/runtime/descriptors/features.d.ts +79 -0
- package/dist/runtime/descriptors/features.js +299 -0
- package/dist/runtime/gameContext.d.ts +2 -327
- package/dist/runtime/gameContext.js +273 -778
- package/dist/runtime/gameContextTypes.d.ts +467 -0
- package/dist/runtime/gameContextTypes.js +1 -0
- package/dist/runtime/gameRuntime.d.ts +1 -0
- package/dist/runtime/gameRuntime.js +1 -0
- package/dist/runtime/headlessRunner.d.ts +62 -0
- package/dist/runtime/headlessRunner.js +45 -0
- package/dist/runtime/hostPersistence.d.ts +12 -0
- package/dist/runtime/hostPersistence.js +12 -0
- package/dist/runtime/hostPolicy.d.ts +51 -0
- package/dist/runtime/hostPolicy.js +68 -0
- package/dist/runtime/hostedGameRunner.d.ts +11 -4
- package/dist/runtime/hostedGameRunner.js +27 -3
- package/dist/runtime/hostedWorldSession.d.ts +15 -5
- package/dist/runtime/hostedWorldSession.js +12 -4
- package/dist/runtime/inputSnapshot.d.ts +8 -3
- package/dist/runtime/inputSnapshot.js +6 -2
- package/dist/runtime/motionIntents.d.ts +11 -2
- package/dist/runtime/motionIntents.js +16 -2
- package/dist/runtime/perContext.d.ts +15 -0
- package/dist/runtime/perContext.js +21 -0
- package/dist/runtime/runtimeSave.d.ts +79 -0
- package/dist/runtime/runtimeSave.js +105 -0
- package/dist/runtime/save.d.ts +4 -0
- package/dist/runtime/save.js +4 -0
- package/dist/runtime/snapshot.d.ts +7 -0
- package/dist/runtime/snapshot.js +7 -0
- package/dist/runtime/visibility.d.ts +2 -1
- package/dist/runtime/visibility.js +2 -1
- package/dist/runtime/worldChannel.d.ts +7 -3
- package/dist/runtime/worldChannel.js +51 -6
- package/dist/runtime/worldMirror.d.ts +14 -2
- package/dist/runtime/worldMirror.js +15 -2
- package/dist/runtime/worldProjection.d.ts +47 -0
- package/dist/runtime/worldProjection.js +52 -0
- package/dist/runtime/worldReplication.d.ts +30 -7
- package/dist/runtime/worldReplication.js +41 -9
- package/dist/runtime/worldSnapshot.d.ts +42 -3
- package/dist/runtime/worldSnapshot.js +34 -7
- package/dist/scene/assetCatalog.d.ts +26 -0
- package/dist/scene/assetCatalog.js +4 -0
- package/dist/scene/assetDiagnostics.d.ts +69 -0
- package/dist/scene/assetDiagnostics.js +110 -0
- package/dist/scene/assetGenerator.d.ts +65 -0
- package/dist/scene/assetGenerator.js +64 -0
- package/dist/scene/assetSpace.d.ts +137 -0
- package/dist/scene/assetSpace.js +257 -0
- package/dist/scene/authoredTriggers.d.ts +219 -0
- package/dist/scene/authoredTriggers.js +454 -0
- package/dist/scene/behaviorRuntime.d.ts +75 -0
- package/dist/scene/behaviorRuntime.js +217 -0
- package/dist/scene/behaviors.d.ts +14 -2
- package/dist/scene/behaviors.js +7 -2
- package/dist/scene/bodyBind.d.ts +60 -0
- package/dist/scene/bodyBind.js +51 -0
- package/dist/scene/builtinSceneKinds.d.ts +5 -0
- package/dist/scene/builtinSceneKinds.js +67 -0
- package/dist/scene/colliders.d.ts +71 -1
- package/dist/scene/colliders.js +145 -1
- package/dist/scene/collisionMesh.d.ts +94 -0
- package/dist/scene/collisionMesh.js +699 -0
- package/dist/scene/companion.d.ts +147 -0
- package/dist/scene/companion.js +193 -0
- package/dist/scene/entityStats.d.ts +18 -11
- package/dist/scene/entityStats.js +21 -16
- package/dist/scene/entityStore.d.ts +12 -1
- package/dist/scene/entityStore.js +15 -0
- package/dist/scene/facing.d.ts +18 -0
- package/dist/scene/facing.js +26 -0
- package/dist/scene/modelSockets.d.ts +33 -0
- package/dist/scene/modelSockets.js +29 -0
- package/dist/scene/objectQuery.d.ts +2 -0
- package/dist/scene/objectQuery.js +2 -0
- package/dist/scene/objectStore.d.ts +4 -0
- package/dist/scene/objectStore.js +6 -0
- package/dist/scene/possession.d.ts +8 -0
- package/dist/scene/possession.js +14 -0
- package/dist/scene/roster.d.ts +3 -0
- package/dist/scene/roster.js +12 -0
- package/dist/scene/sceneKinds.d.ts +256 -0
- package/dist/scene/sceneKinds.js +218 -0
- package/dist/scene/sceneOwnership.d.ts +169 -0
- package/dist/scene/sceneOwnership.js +179 -0
- package/dist/scene/sceneRaycast.js +15 -0
- package/dist/scene/selectionBookmarks.d.ts +93 -0
- package/dist/scene/selectionBookmarks.js +122 -0
- package/dist/scene/vehicleSeat.d.ts +68 -0
- package/dist/scene/vehicleSeat.js +59 -0
- package/dist/sensor/concealment.d.ts +3 -0
- package/dist/sensor/concealment.js +3 -0
- package/dist/sensor/freezeMonitor.d.ts +1 -0
- package/dist/sensor/freezeMonitor.js +1 -0
- package/dist/sensor/frustumSensor.d.ts +7 -3
- package/dist/sensor/frustumSensor.js +7 -3
- package/dist/sensor/hiddenStateProbe.d.ts +5 -2
- package/dist/sensor/hiddenStateProbe.js +5 -2
- package/dist/sensor/recordingBuffer.d.ts +2 -1
- package/dist/sensor/recordingBuffer.js +2 -1
- package/dist/sensor/replayLoop.d.ts +6 -2
- package/dist/sensor/replayLoop.js +6 -2
- package/dist/sensor/revealQuery.d.ts +2 -1
- package/dist/sensor/revealQuery.js +2 -1
- package/dist/sensor/visionCone.d.ts +10 -3
- package/dist/sensor/visionCone.js +10 -3
- package/dist/session/contestedChannel.d.ts +1 -0
- package/dist/session/contestedChannel.js +1 -0
- package/dist/session/extraction.d.ts +1 -0
- package/dist/session/extraction.js +1 -0
- package/dist/session/roles.d.ts +6 -0
- package/dist/session/roles.js +6 -0
- package/dist/session/roundState.d.ts +8 -0
- package/dist/session/roundState.js +2 -0
- package/dist/settings/settingsModel.d.ts +1 -0
- package/dist/settings/settingsModel.js +1 -0
- package/dist/stats/accumulatorMeter.d.ts +6 -0
- package/dist/stats/accumulatorMeter.js +6 -0
- package/dist/stats/eventMeter.d.ts +5 -0
- package/dist/stats/eventMeter.js +5 -0
- package/dist/stats/rollCheck.d.ts +5 -0
- package/dist/stats/rollCheck.js +5 -0
- package/dist/stats/spawnLevelStats.d.ts +110 -0
- package/dist/stats/spawnLevelStats.js +140 -0
- package/dist/stats/statModifiers.d.ts +5 -0
- package/dist/stats/statModifiers.js +5 -0
- package/dist/stats/statPool.d.ts +70 -0
- package/dist/stats/statPool.js +59 -0
- package/dist/store/changeSignal.d.ts +3 -0
- package/dist/store/changeSignal.js +2 -0
- package/dist/store/defineKeyedStore.d.ts +38 -0
- package/dist/store/defineKeyedStore.js +42 -0
- package/dist/store/defineStore.d.ts +33 -0
- package/dist/store/defineStore.js +35 -0
- package/dist/store/observableKeyedStore.d.ts +7 -0
- package/dist/store/observableKeyedStore.js +35 -2
- package/dist/survival/decayMeter.d.ts +55 -0
- package/dist/survival/decayMeter.js +130 -57
- package/dist/survival/moodle.d.ts +2 -0
- package/dist/survival/regionHealth.d.ts +6 -0
- package/dist/survival/regionHealth.js +6 -3
- package/dist/tactics/fallingGrid.d.ts +4 -2
- package/dist/tactics/fallingGrid.js +4 -2
- package/dist/tactics/predictiveQuery.d.ts +3 -0
- package/dist/tactics/predictiveQuery.js +3 -0
- package/dist/tactics/snapshot.d.ts +2 -0
- package/dist/tactics/snapshot.js +2 -0
- package/dist/tactics/surface.d.ts +1 -0
- package/dist/tactics/surface.js +1 -0
- package/dist/tactics/tacticalGrid.d.ts +1 -0
- package/dist/tactics/tacticalGrid.js +1 -0
- package/dist/time/beatClock.d.ts +14 -4
- package/dist/time/beatClock.js +14 -4
- package/dist/time/calendarClock.d.ts +3 -0
- package/dist/time/calendarClock.js +3 -0
- package/dist/time/idleProgress.d.ts +4 -0
- package/dist/time/idleProgress.js +4 -0
- package/dist/time/simClock.d.ts +2 -0
- package/dist/time/simClock.js +20 -5
- package/dist/ui/actionModel.d.ts +110 -0
- package/dist/ui/actionModel.js +159 -0
- package/dist/ui/gameLayout.d.ts +30 -11
- package/dist/ui/gameLayout.js +30 -11
- package/dist/ui/hudDocument.d.ts +114 -0
- package/dist/ui/hudDocument.js +220 -0
- package/dist/ui/hudLayout.d.ts +38 -1
- package/dist/ui/hudLayout.js +220 -17
- package/dist/ui/selectionModel.d.ts +92 -0
- package/dist/ui/selectionModel.js +88 -0
- package/dist/ui/tooltipModel.d.ts +63 -0
- package/dist/ui/tooltipModel.js +82 -0
- package/dist/ui.d.ts +15 -0
- package/dist/ui.js +15 -0
- package/dist/visibility/bounds.d.ts +8 -1
- package/dist/visibility/bounds.js +8 -1
- package/dist/visibility/frustum.d.ts +12 -3
- package/dist/visibility/frustum.js +12 -3
- package/dist/work/jobQueue.d.ts +201 -0
- package/dist/work/jobQueue.js +253 -0
- package/dist/work/unitTraining.d.ts +58 -0
- package/dist/work/unitTraining.js +52 -0
- package/dist/world/authoredEntities.d.ts +29 -0
- package/dist/world/authoredEntities.js +29 -0
- package/dist/world/authoredObjects.d.ts +72 -0
- package/dist/world/authoredObjects.js +81 -0
- package/dist/world/authoredSpawn.d.ts +39 -0
- package/dist/world/authoredSpawn.js +37 -0
- package/dist/world/buildSockets.d.ts +152 -0
- package/dist/world/buildSockets.js +188 -0
- package/dist/world/buildingGenerator.d.ts +18 -0
- package/dist/world/buildingGenerator.js +62 -0
- package/dist/world/buildings.d.ts +5 -0
- package/dist/world/buildings.js +5 -0
- package/dist/world/catenary.d.ts +22 -0
- package/dist/world/catenary.js +69 -0
- package/dist/world/cityBlocks.d.ts +152 -0
- package/dist/world/cityBlocks.js +670 -0
- package/dist/world/cityContent.d.ts +77 -0
- package/dist/world/cityContent.js +261 -0
- package/dist/world/cityGeometry.d.ts +114 -0
- package/dist/world/cityGeometry.js +573 -0
- package/dist/world/cityKind.d.ts +314 -0
- package/dist/world/cityKind.js +1578 -0
- package/dist/world/features.d.ts +133 -10
- package/dist/world/features.js +66 -6
- package/dist/world/footprintGrid.d.ts +59 -0
- package/dist/world/footprintGrid.js +141 -0
- package/dist/world/geometry.d.ts +64 -0
- package/dist/world/geometry.js +94 -0
- package/dist/world/grassKind.d.ts +51 -0
- package/dist/world/grassKind.js +101 -0
- package/dist/world/markers.d.ts +50 -4
- package/dist/world/markers.js +49 -0
- package/dist/world/massing.js +1 -1
- package/dist/world/minimapBake.d.ts +78 -0
- package/dist/world/minimapBake.js +208 -0
- package/dist/world/minimapTrack.d.ts +17 -0
- package/dist/world/minimapTrack.js +22 -0
- package/dist/world/pathInstances.d.ts +27 -0
- package/dist/world/pathInstances.js +27 -0
- package/dist/world/pathNetwork.d.ts +159 -0
- package/dist/world/pathNetwork.js +684 -0
- package/dist/world/pathTerrain.d.ts +80 -0
- package/dist/world/pathTerrain.js +142 -0
- package/dist/world/place.d.ts +166 -0
- package/dist/world/place.js +96 -0
- package/dist/world/placeAsset.d.ts +81 -0
- package/dist/world/placeAsset.js +79 -0
- package/dist/world/placement.d.ts +4 -0
- package/dist/world/placement.js +4 -0
- package/dist/world/placementController.d.ts +6 -0
- package/dist/world/placementController.js +6 -0
- package/dist/world/poleLineKind.d.ts +40 -0
- package/dist/world/poleLineKind.js +97 -0
- package/dist/world/polyline.d.ts +34 -0
- package/dist/world/polyline.js +88 -0
- package/dist/world/resourceNode.d.ts +109 -0
- package/dist/world/resourceNode.js +140 -0
- package/dist/world/roads.d.ts +8 -0
- package/dist/world/roads.js +38 -0
- package/dist/world/scatter.js +2 -20
- package/dist/world/scatterRegion.d.ts +164 -0
- package/dist/world/scatterRegion.js +409 -0
- package/dist/world/sceneShapes.d.ts +43 -0
- package/dist/world/sceneShapes.js +1 -0
- package/dist/world/segment.d.ts +27 -0
- package/dist/world/segment.js +43 -0
- package/dist/world/soilKind.d.ts +48 -0
- package/dist/world/soilKind.js +92 -0
- package/dist/world/spatialSample.d.ts +241 -0
- package/dist/world/spatialSample.js +465 -0
- package/dist/world/streets.d.ts +29 -0
- package/dist/world/streets.js +55 -0
- package/dist/world/terraform.d.ts +213 -1
- package/dist/world/terraform.js +627 -22
- package/dist/world/terrain.d.ts +164 -20
- package/dist/world/terrain.js +325 -41
- package/dist/world/terrainGuides.d.ts +182 -0
- package/dist/world/terrainGuides.js +343 -0
- package/dist/world/vec2.d.ts +81 -0
- package/dist/world/vec2.js +128 -0
- package/dist/world/vec3.d.ts +49 -0
- package/dist/world/vec3.js +76 -0
- package/dist/world/vegetation.d.ts +71 -0
- package/dist/world/vegetation.js +151 -0
- package/dist/world/visibilityField.d.ts +154 -0
- package/dist/world/visibilityField.js +271 -0
- package/dist/world/volumetricClouds.d.ts +52 -0
- package/dist/world/volumetricClouds.js +43 -0
- package/dist/world/walls.d.ts +9 -0
- package/dist/world/walls.js +9 -0
- package/dist/world/waterKind.d.ts +55 -0
- package/dist/world/waterKind.js +99 -0
- package/dist/world.d.ts +141 -0
- package/dist/world.js +141 -0
- package/package.json +32 -8
- package/skills/game-design/SKILL.md +28 -0
- package/skills/game-design/agents/openai.yaml +4 -0
- package/skills/game-design/references/application-playbook.md +170 -0
- package/skills/game-design/references/field-guide.md +288 -0
- package/skills/jgengine/SKILL.md +54 -0
- package/skills/jgengine/api.md +527 -0
- package/skills/jgengine/capabilities.md +131 -0
- package/skills/jgengine/recipes/minimal-game.md +88 -0
- package/skills/jgengine-combat/SKILL.md +38 -0
- package/skills/jgengine-combat/api.md +585 -0
- package/skills/jgengine-combat/capabilities.md +213 -0
- package/skills/jgengine-combat/recipes/portable-stat-pools.md +122 -0
- package/skills/jgengine-combat/reference.md +108 -0
- package/skills/jgengine-gameplay/SKILL.md +39 -0
- package/skills/jgengine-gameplay/api.md +1920 -0
- package/skills/jgengine-gameplay/capabilities.md +454 -0
- package/skills/jgengine-gameplay/reference-systems.md +56 -0
- package/skills/jgengine-world/SKILL.md +51 -0
- package/skills/jgengine-world/api.md +3056 -0
- package/skills/jgengine-world/capabilities.md +476 -0
- package/skills/jgengine-world/recipes/commanding-entities.md +128 -0
- package/skills/jgengine-world/reference.md +261 -0
- package/dist/cartridge/runtime.d.ts +0 -15
- package/dist/cartridge/runtime.js +0 -556
- package/dist/cartridge/spec.d.ts +0 -188
- package/dist/cartridge/spec.js +0 -19
- package/dist/cartridge/validate.d.ts +0 -2
- package/dist/cartridge/validate.js +0 -78
- package/dist/store/engineStore.d.ts +0 -22
- package/dist/store/engineStore.js +0 -50
- package/dist/store/features.d.ts +0 -10
- package/dist/store/features.js +0 -23
- package/llms.txt +0 -5389
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import type { EditorCommand } from "./commands.js";
|
|
2
|
+
import type { EditorDocument } from "./types.js";
|
|
3
|
+
import { type RuntimeEntityState, type RuntimeStateSnapshot } from "./liveSync.js";
|
|
4
|
+
/** Play-mode sim gate held by the editor host — pause freezes ticks; step runs N frames then re-pauses. */
|
|
5
|
+
export interface RuntimePlayControl {
|
|
6
|
+
paused: boolean;
|
|
7
|
+
pendingSteps: number;
|
|
8
|
+
}
|
|
9
|
+
/** Compact reverse-channel view for the play-mode inspector and `runtime_summary` RPC. */
|
|
10
|
+
export interface RuntimeInspectorSummary {
|
|
11
|
+
seq: number;
|
|
12
|
+
entityCount: number;
|
|
13
|
+
entities: readonly {
|
|
14
|
+
id: string;
|
|
15
|
+
hasPosition: boolean;
|
|
16
|
+
rotationY?: number;
|
|
17
|
+
valueKeys: readonly string[];
|
|
18
|
+
}[];
|
|
19
|
+
tunableKeys: readonly string[];
|
|
20
|
+
overrideIds: readonly string[];
|
|
21
|
+
play: RuntimePlayControl;
|
|
22
|
+
}
|
|
23
|
+
/** One resolved runtime field returned by `runtime_get`. */
|
|
24
|
+
export interface RuntimeInspectorGetResult {
|
|
25
|
+
id: string;
|
|
26
|
+
kind: "entity" | "tunable" | "missing";
|
|
27
|
+
entity?: RuntimeEntityState;
|
|
28
|
+
path?: string;
|
|
29
|
+
value?: unknown;
|
|
30
|
+
override?: RuntimeEntityState;
|
|
31
|
+
}
|
|
32
|
+
/** Desired mutation from `runtime_set` before the host applies it. */
|
|
33
|
+
export interface RuntimeInspectorSetPlan {
|
|
34
|
+
entity?: RuntimeEntityState;
|
|
35
|
+
tunable?: {
|
|
36
|
+
key: string;
|
|
37
|
+
value: unknown;
|
|
38
|
+
};
|
|
39
|
+
writeBackCommands: readonly EditorCommand[];
|
|
40
|
+
error?: string;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Builds the compact reverse-channel summary used by the play-mode inspector panel and the
|
|
44
|
+
* `runtime_summary` bridge RPC.
|
|
45
|
+
* @capability editor-runtime-inspector summarize live runtime entities and tunables for play mode
|
|
46
|
+
*/
|
|
47
|
+
export declare function summarizeRuntimeInspector(snapshot: RuntimeStateSnapshot, overrides: Readonly<Record<string, RuntimeEntityState>>, play: RuntimePlayControl): RuntimeInspectorSummary;
|
|
48
|
+
/**
|
|
49
|
+
* Resolves one entity, entity field, or tunable from the reverse-channel snapshot (with overrides
|
|
50
|
+
* layered on top for entity rows).
|
|
51
|
+
* @capability editor-runtime-inspector read one live runtime entity field or tunable
|
|
52
|
+
*/
|
|
53
|
+
export declare function getRuntimeInspectorValue(snapshot: RuntimeStateSnapshot, overrides: Readonly<Record<string, RuntimeEntityState>>, id: string, path?: string): RuntimeInspectorGetResult;
|
|
54
|
+
/**
|
|
55
|
+
* Plans a play-mode poke: builds the ephemeral entity/tunable override and, when `writeBack` is
|
|
56
|
+
* true, the undoable document commands that promote it into the scene document.
|
|
57
|
+
* @capability editor-runtime-inspector plan a play-mode runtime_set with optional document write-back
|
|
58
|
+
*/
|
|
59
|
+
export declare function planRuntimeInspectorSet(document: EditorDocument, input: {
|
|
60
|
+
id: string;
|
|
61
|
+
path?: string;
|
|
62
|
+
value?: unknown;
|
|
63
|
+
position?: {
|
|
64
|
+
x: number;
|
|
65
|
+
y: number;
|
|
66
|
+
z: number;
|
|
67
|
+
};
|
|
68
|
+
rotationY?: number;
|
|
69
|
+
values?: Record<string, unknown>;
|
|
70
|
+
writeBack?: boolean;
|
|
71
|
+
}): RuntimeInspectorSetPlan;
|
|
72
|
+
/**
|
|
73
|
+
* Promotes ephemeral runtime `values` into an undoable meta patch on a document-linked object.
|
|
74
|
+
* Returns null when the id is not in the document or there are no values.
|
|
75
|
+
* @capability editor-runtime-inspector promote runtime entity values into a document meta write-back
|
|
76
|
+
*/
|
|
77
|
+
export declare function runtimeEntityMetaWriteBackCommand(document: EditorDocument, entity: RuntimeEntityState): EditorCommand | null;
|
|
78
|
+
/**
|
|
79
|
+
* Advances the play-control step counter: when paused with pending steps, consumes one and reports
|
|
80
|
+
* whether the sim should run this frame. When not paused, always runs.
|
|
81
|
+
* @capability editor-runtime-inspector gate a play-mode frame against pause/step control
|
|
82
|
+
*/
|
|
83
|
+
export declare function consumeRuntimePlayStep(play: RuntimePlayControl): {
|
|
84
|
+
runFrame: boolean;
|
|
85
|
+
next: RuntimePlayControl;
|
|
86
|
+
};
|
|
87
|
+
/** Default play-control state when entering play mode (running). */
|
|
88
|
+
export declare function createRuntimePlayControl(paused?: boolean): RuntimePlayControl;
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
import { runtimeEntityWriteBackCommand, } from "./liveSync.js";
|
|
2
|
+
/**
|
|
3
|
+
* Builds the compact reverse-channel summary used by the play-mode inspector panel and the
|
|
4
|
+
* `runtime_summary` bridge RPC.
|
|
5
|
+
* @capability editor-runtime-inspector summarize live runtime entities and tunables for play mode
|
|
6
|
+
*/
|
|
7
|
+
export function summarizeRuntimeInspector(snapshot, overrides, play) {
|
|
8
|
+
const entities = Object.values(snapshot.entities)
|
|
9
|
+
.map((entity) => ({
|
|
10
|
+
id: entity.id,
|
|
11
|
+
hasPosition: entity.position !== undefined,
|
|
12
|
+
...(entity.rotationY === undefined ? {} : { rotationY: entity.rotationY }),
|
|
13
|
+
valueKeys: entity.values === undefined ? [] : Object.keys(entity.values).sort(),
|
|
14
|
+
}))
|
|
15
|
+
.sort((a, b) => a.id.localeCompare(b.id));
|
|
16
|
+
return {
|
|
17
|
+
seq: snapshot.seq,
|
|
18
|
+
entityCount: entities.length,
|
|
19
|
+
entities,
|
|
20
|
+
tunableKeys: Object.keys(snapshot.tunables).sort(),
|
|
21
|
+
overrideIds: Object.keys(overrides).sort(),
|
|
22
|
+
play: { paused: play.paused, pendingSteps: play.pendingSteps },
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Resolves one entity, entity field, or tunable from the reverse-channel snapshot (with overrides
|
|
27
|
+
* layered on top for entity rows).
|
|
28
|
+
* @capability editor-runtime-inspector read one live runtime entity field or tunable
|
|
29
|
+
*/
|
|
30
|
+
export function getRuntimeInspectorValue(snapshot, overrides, id, path) {
|
|
31
|
+
if (id.startsWith("tunable:")) {
|
|
32
|
+
const key = id.slice("tunable:".length);
|
|
33
|
+
if (key.length === 0)
|
|
34
|
+
return { id, kind: "missing" };
|
|
35
|
+
if (!(key in snapshot.tunables) && path === undefined)
|
|
36
|
+
return { id, kind: "missing", path: key };
|
|
37
|
+
return {
|
|
38
|
+
id,
|
|
39
|
+
kind: "tunable",
|
|
40
|
+
path: key,
|
|
41
|
+
value: snapshot.tunables[key],
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
const base = snapshot.entities[id];
|
|
45
|
+
const override = overrides[id];
|
|
46
|
+
if (base === undefined && override === undefined) {
|
|
47
|
+
if (path !== undefined && path in snapshot.tunables) {
|
|
48
|
+
return { id: `tunable:${path}`, kind: "tunable", path, value: snapshot.tunables[path] };
|
|
49
|
+
}
|
|
50
|
+
return { id, kind: "missing", path };
|
|
51
|
+
}
|
|
52
|
+
const entity = {
|
|
53
|
+
id,
|
|
54
|
+
position: override?.position ?? base?.position,
|
|
55
|
+
rotationY: override?.rotationY ?? base?.rotationY,
|
|
56
|
+
values: override?.values === undefined && base?.values === undefined
|
|
57
|
+
? undefined
|
|
58
|
+
: { ...base?.values, ...override?.values },
|
|
59
|
+
};
|
|
60
|
+
if (path === undefined || path === "") {
|
|
61
|
+
return { id, kind: "entity", entity, ...(override === undefined ? {} : { override }) };
|
|
62
|
+
}
|
|
63
|
+
if (path === "position") {
|
|
64
|
+
return { id, kind: "entity", entity, path, value: entity.position, ...(override === undefined ? {} : { override }) };
|
|
65
|
+
}
|
|
66
|
+
if (path === "rotationY") {
|
|
67
|
+
return { id, kind: "entity", entity, path, value: entity.rotationY, ...(override === undefined ? {} : { override }) };
|
|
68
|
+
}
|
|
69
|
+
if (path.startsWith("values.")) {
|
|
70
|
+
const key = path.slice("values.".length);
|
|
71
|
+
return {
|
|
72
|
+
id,
|
|
73
|
+
kind: "entity",
|
|
74
|
+
entity,
|
|
75
|
+
path,
|
|
76
|
+
value: entity.values?.[key],
|
|
77
|
+
...(override === undefined ? {} : { override }),
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
return {
|
|
81
|
+
id,
|
|
82
|
+
kind: "entity",
|
|
83
|
+
entity,
|
|
84
|
+
path,
|
|
85
|
+
value: entity.values?.[path],
|
|
86
|
+
...(override === undefined ? {} : { override }),
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
function isFiniteNumber(value) {
|
|
90
|
+
return typeof value === "number" && Number.isFinite(value);
|
|
91
|
+
}
|
|
92
|
+
function asPosition(value) {
|
|
93
|
+
if (value === null || typeof value !== "object" || Array.isArray(value))
|
|
94
|
+
return null;
|
|
95
|
+
const record = value;
|
|
96
|
+
if (!isFiniteNumber(record.x) || !isFiniteNumber(record.y) || !isFiniteNumber(record.z))
|
|
97
|
+
return null;
|
|
98
|
+
return { x: record.x, y: record.y, z: record.z };
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Plans a play-mode poke: builds the ephemeral entity/tunable override and, when `writeBack` is
|
|
102
|
+
* true, the undoable document commands that promote it into the scene document.
|
|
103
|
+
* @capability editor-runtime-inspector plan a play-mode runtime_set with optional document write-back
|
|
104
|
+
*/
|
|
105
|
+
export function planRuntimeInspectorSet(document, input) {
|
|
106
|
+
const writeBack = input.writeBack !== false;
|
|
107
|
+
const writeBackCommands = [];
|
|
108
|
+
if (input.id.startsWith("tunable:")) {
|
|
109
|
+
const key = input.id.slice("tunable:".length);
|
|
110
|
+
if (key.length === 0)
|
|
111
|
+
return { writeBackCommands, error: "tunable id is empty" };
|
|
112
|
+
if (input.value === undefined)
|
|
113
|
+
return { writeBackCommands, error: "tunable set requires value" };
|
|
114
|
+
return { tunable: { key, value: input.value }, writeBackCommands };
|
|
115
|
+
}
|
|
116
|
+
if (input.path !== undefined && input.path.startsWith("tunable:")) {
|
|
117
|
+
const key = input.path.slice("tunable:".length);
|
|
118
|
+
if (key.length === 0)
|
|
119
|
+
return { writeBackCommands, error: "tunable path is empty" };
|
|
120
|
+
if (input.value === undefined)
|
|
121
|
+
return { writeBackCommands, error: "tunable set requires value" };
|
|
122
|
+
return { tunable: { key, value: input.value }, writeBackCommands };
|
|
123
|
+
}
|
|
124
|
+
const entity = { id: input.id };
|
|
125
|
+
let touched = false;
|
|
126
|
+
if (input.position !== undefined) {
|
|
127
|
+
entity.position = { ...input.position };
|
|
128
|
+
touched = true;
|
|
129
|
+
}
|
|
130
|
+
if (input.rotationY !== undefined) {
|
|
131
|
+
if (!isFiniteNumber(input.rotationY))
|
|
132
|
+
return { writeBackCommands, error: "rotationY must be finite" };
|
|
133
|
+
entity.rotationY = input.rotationY;
|
|
134
|
+
touched = true;
|
|
135
|
+
}
|
|
136
|
+
if (input.values !== undefined) {
|
|
137
|
+
entity.values = { ...input.values };
|
|
138
|
+
touched = true;
|
|
139
|
+
}
|
|
140
|
+
if (input.path === "position") {
|
|
141
|
+
const position = asPosition(input.value);
|
|
142
|
+
if (position === null)
|
|
143
|
+
return { writeBackCommands, error: "position value must be {x,y,z}" };
|
|
144
|
+
entity.position = position;
|
|
145
|
+
touched = true;
|
|
146
|
+
}
|
|
147
|
+
else if (input.path === "rotationY") {
|
|
148
|
+
if (!isFiniteNumber(input.value))
|
|
149
|
+
return { writeBackCommands, error: "rotationY value must be finite" };
|
|
150
|
+
entity.rotationY = input.value;
|
|
151
|
+
touched = true;
|
|
152
|
+
}
|
|
153
|
+
else if (input.path !== undefined && input.path.startsWith("values.")) {
|
|
154
|
+
const key = input.path.slice("values.".length);
|
|
155
|
+
if (key.length === 0)
|
|
156
|
+
return { writeBackCommands, error: "values path is empty" };
|
|
157
|
+
entity.values = { [key]: input.value };
|
|
158
|
+
touched = true;
|
|
159
|
+
}
|
|
160
|
+
else if (input.path !== undefined && input.path.length > 0 && input.value !== undefined) {
|
|
161
|
+
entity.values = { [input.path]: input.value };
|
|
162
|
+
touched = true;
|
|
163
|
+
}
|
|
164
|
+
if (!touched) {
|
|
165
|
+
return { writeBackCommands, error: `runtime_set "${input.id}" has no position, rotationY, values, or path` };
|
|
166
|
+
}
|
|
167
|
+
if (writeBack) {
|
|
168
|
+
const transform = runtimeEntityWriteBackCommand(document, entity);
|
|
169
|
+
if (transform !== null)
|
|
170
|
+
writeBackCommands.push(transform);
|
|
171
|
+
if (entity.values !== undefined) {
|
|
172
|
+
const metaCommand = runtimeEntityMetaWriteBackCommand(document, entity);
|
|
173
|
+
if (metaCommand !== null)
|
|
174
|
+
writeBackCommands.push(metaCommand);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return { entity, writeBackCommands };
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Promotes ephemeral runtime `values` into an undoable meta patch on a document-linked object.
|
|
181
|
+
* Returns null when the id is not in the document or there are no values.
|
|
182
|
+
* @capability editor-runtime-inspector promote runtime entity values into a document meta write-back
|
|
183
|
+
*/
|
|
184
|
+
export function runtimeEntityMetaWriteBackCommand(document, entity) {
|
|
185
|
+
if (entity.values === undefined || Object.keys(entity.values).length === 0)
|
|
186
|
+
return null;
|
|
187
|
+
const marker = document.markers.find((entry) => entry.id === entity.id);
|
|
188
|
+
if (marker !== undefined) {
|
|
189
|
+
return {
|
|
190
|
+
type: "setMarker",
|
|
191
|
+
id: entity.id,
|
|
192
|
+
patch: { meta: { ...marker.meta, ...entity.values } },
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
const volume = document.volumes.find((entry) => entry.id === entity.id);
|
|
196
|
+
if (volume !== undefined) {
|
|
197
|
+
return {
|
|
198
|
+
type: "setVolume",
|
|
199
|
+
id: entity.id,
|
|
200
|
+
patch: { meta: { ...volume.meta, ...entity.values } },
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
const path = document.paths.find((entry) => entry.id === entity.id);
|
|
204
|
+
if (path !== undefined) {
|
|
205
|
+
return {
|
|
206
|
+
type: "setPath",
|
|
207
|
+
id: entity.id,
|
|
208
|
+
patch: { meta: { ...path.meta, ...entity.values } },
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
const note = document.annotations.find((entry) => entry.id === entity.id);
|
|
212
|
+
if (note !== undefined) {
|
|
213
|
+
return {
|
|
214
|
+
type: "setNote",
|
|
215
|
+
id: entity.id,
|
|
216
|
+
patch: { meta: { ...note.meta, ...entity.values } },
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
return null;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Advances the play-control step counter: when paused with pending steps, consumes one and reports
|
|
223
|
+
* whether the sim should run this frame. When not paused, always runs.
|
|
224
|
+
* @capability editor-runtime-inspector gate a play-mode frame against pause/step control
|
|
225
|
+
*/
|
|
226
|
+
export function consumeRuntimePlayStep(play) {
|
|
227
|
+
if (!play.paused)
|
|
228
|
+
return { runFrame: true, next: play };
|
|
229
|
+
if (play.pendingSteps <= 0)
|
|
230
|
+
return { runFrame: false, next: play };
|
|
231
|
+
return {
|
|
232
|
+
runFrame: true,
|
|
233
|
+
next: { paused: true, pendingSteps: play.pendingSteps - 1 },
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
/** Default play-control state when entering play mode (running). */
|
|
237
|
+
export function createRuntimePlayControl(paused = false) {
|
|
238
|
+
return { paused, pendingSteps: 0 };
|
|
239
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The proximity streamer for a sharded world (#985 stage 3): a stateful scheduler that decides,
|
|
3
|
+
* as the camera moves, which shards enter and leave residency. It is pure scheduling — actually
|
|
4
|
+
* reading/merging the shard documents stays the caller's job (compose with
|
|
5
|
+
* `@jgengine/core/editor/world`'s `loadWorldDocument` on each returned delta) — so the streamer has
|
|
6
|
+
* no I/O and stays deterministic and testable. Hysteresis (`loadRadius` < `keepRadius`) stops a
|
|
7
|
+
* shard on a boundary from thrashing load/unload every frame.
|
|
8
|
+
*/
|
|
9
|
+
/** The minimal shard shape the streamer schedules on — any world-manifest shard satisfies it. */
|
|
10
|
+
export interface StreamerShard {
|
|
11
|
+
/** Stable shard id (the load/unload unit). */
|
|
12
|
+
id: string;
|
|
13
|
+
/** XZ footprint `[minX, minZ]`..`[maxX, maxZ]`; absent = always resident. */
|
|
14
|
+
bounds?: {
|
|
15
|
+
min: [number, number];
|
|
16
|
+
max: [number, number];
|
|
17
|
+
};
|
|
18
|
+
/** `"always"` keeps the shard resident regardless of distance; default `"streamed"` when bounded. */
|
|
19
|
+
residency?: "always" | "streamed";
|
|
20
|
+
}
|
|
21
|
+
/** Configuration for {@link createWorldStreamer}. */
|
|
22
|
+
export interface WorldStreamerConfig {
|
|
23
|
+
shards: readonly StreamerShard[];
|
|
24
|
+
/** Load a shard when the camera comes within this distance (m) of its footprint. */
|
|
25
|
+
loadRadius: number;
|
|
26
|
+
/** Keep a loaded shard resident until the camera is farther than this (m) — hysteresis band. */
|
|
27
|
+
keepRadius: number;
|
|
28
|
+
}
|
|
29
|
+
/** The residency change produced by one {@link WorldStreamer.update}. */
|
|
30
|
+
export interface StreamUpdate {
|
|
31
|
+
/** Shard ids that became resident on this update. */
|
|
32
|
+
load: string[];
|
|
33
|
+
/** Shard ids that left residency on this update. */
|
|
34
|
+
unload: string[];
|
|
35
|
+
/** The full resident shard-id set after this update (sorted, stable order). */
|
|
36
|
+
resident: string[];
|
|
37
|
+
}
|
|
38
|
+
/** A stateful proximity streamer over a fixed shard set. */
|
|
39
|
+
export interface WorldStreamer {
|
|
40
|
+
/** Advances the streamer to a new camera position, returning the residency delta. */
|
|
41
|
+
update(center: {
|
|
42
|
+
x: number;
|
|
43
|
+
z: number;
|
|
44
|
+
}): StreamUpdate;
|
|
45
|
+
/** The current resident shard-id set (sorted). */
|
|
46
|
+
resident(): string[];
|
|
47
|
+
/** Clears all residency (next update reloads from scratch). */
|
|
48
|
+
reset(): void;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Distance from a point to a shard's XZ footprint (0 when inside), or 0 for an always-resident shard.
|
|
52
|
+
* @capability world-streaming distance from a camera to a shard footprint
|
|
53
|
+
*/
|
|
54
|
+
export declare function shardDistance(shard: StreamerShard, center: {
|
|
55
|
+
x: number;
|
|
56
|
+
z: number;
|
|
57
|
+
}): number;
|
|
58
|
+
/**
|
|
59
|
+
* Creates a proximity streamer over a world's shards. Always-resident shards are resident from the
|
|
60
|
+
* first update onward; each bounded shard loads when the camera comes within `loadRadius` of its
|
|
61
|
+
* footprint and unloads only once the camera passes `keepRadius` (≥ `loadRadius`, clamped up),
|
|
62
|
+
* giving a hysteresis band that prevents boundary thrash. Purely spatial and deterministic; the
|
|
63
|
+
* caller wires each delta to `loadWorldDocument`.
|
|
64
|
+
* @capability world-streaming schedule shard load/unload by camera proximity
|
|
65
|
+
*/
|
|
66
|
+
export declare function createWorldStreamer(config: WorldStreamerConfig): WorldStreamer;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The proximity streamer for a sharded world (#985 stage 3): a stateful scheduler that decides,
|
|
3
|
+
* as the camera moves, which shards enter and leave residency. It is pure scheduling — actually
|
|
4
|
+
* reading/merging the shard documents stays the caller's job (compose with
|
|
5
|
+
* `@jgengine/core/editor/world`'s `loadWorldDocument` on each returned delta) — so the streamer has
|
|
6
|
+
* no I/O and stays deterministic and testable. Hysteresis (`loadRadius` < `keepRadius`) stops a
|
|
7
|
+
* shard on a boundary from thrashing load/unload every frame.
|
|
8
|
+
*/
|
|
9
|
+
function isAlwaysResident(shard) {
|
|
10
|
+
return shard.residency === "always" || shard.bounds === undefined;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Distance from a point to a shard's XZ footprint (0 when inside), or 0 for an always-resident shard.
|
|
14
|
+
* @capability world-streaming distance from a camera to a shard footprint
|
|
15
|
+
*/
|
|
16
|
+
export function shardDistance(shard, center) {
|
|
17
|
+
if (shard.bounds === undefined)
|
|
18
|
+
return 0;
|
|
19
|
+
const { min, max } = shard.bounds;
|
|
20
|
+
const qx = Math.max(min[0], Math.min(center.x, max[0]));
|
|
21
|
+
const qz = Math.max(min[1], Math.min(center.z, max[1]));
|
|
22
|
+
return Math.hypot(center.x - qx, center.z - qz);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Creates a proximity streamer over a world's shards. Always-resident shards are resident from the
|
|
26
|
+
* first update onward; each bounded shard loads when the camera comes within `loadRadius` of its
|
|
27
|
+
* footprint and unloads only once the camera passes `keepRadius` (≥ `loadRadius`, clamped up),
|
|
28
|
+
* giving a hysteresis band that prevents boundary thrash. Purely spatial and deterministic; the
|
|
29
|
+
* caller wires each delta to `loadWorldDocument`.
|
|
30
|
+
* @capability world-streaming schedule shard load/unload by camera proximity
|
|
31
|
+
*/
|
|
32
|
+
export function createWorldStreamer(config) {
|
|
33
|
+
const loadRadius = Math.max(0, config.loadRadius);
|
|
34
|
+
const keepRadius = Math.max(loadRadius, config.keepRadius);
|
|
35
|
+
const shards = [...config.shards];
|
|
36
|
+
const resident = new Set();
|
|
37
|
+
const residentSorted = () => [...resident].sort();
|
|
38
|
+
return {
|
|
39
|
+
update(center) {
|
|
40
|
+
const load = [];
|
|
41
|
+
const unload = [];
|
|
42
|
+
for (const shard of shards) {
|
|
43
|
+
if (isAlwaysResident(shard)) {
|
|
44
|
+
if (!resident.has(shard.id)) {
|
|
45
|
+
resident.add(shard.id);
|
|
46
|
+
load.push(shard.id);
|
|
47
|
+
}
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
const distance = shardDistance(shard, center);
|
|
51
|
+
const isResident = resident.has(shard.id);
|
|
52
|
+
if (!isResident && distance <= loadRadius) {
|
|
53
|
+
resident.add(shard.id);
|
|
54
|
+
load.push(shard.id);
|
|
55
|
+
}
|
|
56
|
+
else if (isResident && distance > keepRadius) {
|
|
57
|
+
resident.delete(shard.id);
|
|
58
|
+
unload.push(shard.id);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return { load: load.sort(), unload: unload.sort(), resident: residentSorted() };
|
|
62
|
+
},
|
|
63
|
+
resident: residentSorted,
|
|
64
|
+
reset() {
|
|
65
|
+
resident.clear();
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
}
|