@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,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,29 @@
|
|
|
1
|
+
import { ENTITY_MARKER_KINDS, type AuthoredObjectMarkerLike } from "./authoredObjects.js";
|
|
2
|
+
/** Marker kinds {@link authoredEntitySpawns} treats as spawnable entities by default. Re-exported from `authoredObjects` as the single source of truth (the same kinds `resolveAuthoredObjects` skips). */
|
|
3
|
+
export { ENTITY_MARKER_KINDS };
|
|
4
|
+
/** The minimal marker shape entity spawns read; any `EditorMarker` satisfies it. */
|
|
5
|
+
export type AuthoredEntityMarkerLike = AuthoredObjectMarkerLike;
|
|
6
|
+
/** The minimal document shape {@link authoredEntitySpawns} walks; any `EditorDocument` satisfies it. */
|
|
7
|
+
export interface AuthoredEntityDocumentLike {
|
|
8
|
+
markers: readonly AuthoredEntityMarkerLike[];
|
|
9
|
+
}
|
|
10
|
+
/** One resolved entity to spawn from the authored scene — its marker id, catalog id, and pose. */
|
|
11
|
+
export interface AuthoredEntitySpawn {
|
|
12
|
+
/** The marker's id — a stable spawn id, so re-spawning the same marker is idempotent. */
|
|
13
|
+
markerId: string;
|
|
14
|
+
/** The entity catalog id to spawn (join key into `content.entityById`). */
|
|
15
|
+
catalogId: string;
|
|
16
|
+
/** World-space spawn position as a spawn-ready `[x, y, z]` tuple. */
|
|
17
|
+
position: [number, number, number];
|
|
18
|
+
/** Facing (yaw radians), 0 when the marker has none. */
|
|
19
|
+
rotationY: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Every authored entity marker (`mob`/`boss` by default) that carries a `catalogId`, as a spawn plan
|
|
23
|
+
* the runtime feeds to `ctx.scene.entity.spawn(catalogId, { id, position })`. Reads the same document
|
|
24
|
+
* the editor authors, so placing a mob and setting its catalog id in the editor is all it takes to
|
|
25
|
+
* spawn it — no coordinates or spawn tables copied into game code. Markers without a catalog id are
|
|
26
|
+
* skipped (they are placement-only, e.g. a boss arena marker a game handles specially).
|
|
27
|
+
* @capability authored-entities spawn authored mob/boss markers from the editor document at runtime
|
|
28
|
+
*/
|
|
29
|
+
export declare function authoredEntitySpawns(document: AuthoredEntityDocumentLike, kinds?: readonly string[]): AuthoredEntitySpawn[];
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { ENTITY_MARKER_KINDS, markerCatalogId } from "./authoredObjects.js";
|
|
2
|
+
/** Marker kinds {@link authoredEntitySpawns} treats as spawnable entities by default. Re-exported from `authoredObjects` as the single source of truth (the same kinds `resolveAuthoredObjects` skips). */
|
|
3
|
+
export { ENTITY_MARKER_KINDS };
|
|
4
|
+
/**
|
|
5
|
+
* Every authored entity marker (`mob`/`boss` by default) that carries a `catalogId`, as a spawn plan
|
|
6
|
+
* the runtime feeds to `ctx.scene.entity.spawn(catalogId, { id, position })`. Reads the same document
|
|
7
|
+
* the editor authors, so placing a mob and setting its catalog id in the editor is all it takes to
|
|
8
|
+
* spawn it — no coordinates or spawn tables copied into game code. Markers without a catalog id are
|
|
9
|
+
* skipped (they are placement-only, e.g. a boss arena marker a game handles specially).
|
|
10
|
+
* @capability authored-entities spawn authored mob/boss markers from the editor document at runtime
|
|
11
|
+
*/
|
|
12
|
+
export function authoredEntitySpawns(document, kinds = ENTITY_MARKER_KINDS) {
|
|
13
|
+
const wanted = new Set(kinds);
|
|
14
|
+
const spawns = [];
|
|
15
|
+
for (const marker of document.markers) {
|
|
16
|
+
if (!wanted.has(marker.kind))
|
|
17
|
+
continue;
|
|
18
|
+
const catalogId = markerCatalogId(marker);
|
|
19
|
+
if (catalogId === null)
|
|
20
|
+
continue;
|
|
21
|
+
spawns.push({
|
|
22
|
+
markerId: marker.id,
|
|
23
|
+
catalogId,
|
|
24
|
+
position: [marker.position.x, marker.position.y, marker.position.z],
|
|
25
|
+
rotationY: marker.rotationY ?? 0,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
return spawns;
|
|
29
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
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
|
+
* Marker kinds that are spawnable entities (materialized by `authoredEntitySpawns`), not static
|
|
47
|
+
* catalog props. {@link resolveAuthoredObjects} skips them by default so a placed `mob`/`boss` is
|
|
48
|
+
* spawned once as an entity and never also placed as a static mesh.
|
|
49
|
+
* @capability authored-objects marker kinds resolved as entity spawns, not static props
|
|
50
|
+
*/
|
|
51
|
+
export declare const ENTITY_MARKER_KINDS: readonly string[];
|
|
52
|
+
/** Options for {@link resolveAuthoredObjects}. */
|
|
53
|
+
export interface ResolveAuthoredObjectsOptions {
|
|
54
|
+
/** Marker kinds to skip (they are handled elsewhere). Default {@link ENTITY_MARKER_KINDS}. */
|
|
55
|
+
excludeKinds?: readonly string[];
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Every marker carrying a catalog id, as placeable props — pure, no terrain sample. Parallel to
|
|
59
|
+
* {@link resolveScatter}: games and headless tests read the same list `<AuthoredObjects>` places.
|
|
60
|
+
* Entity-spawn kinds (`mob`/`boss`) are skipped by default — they carry a `catalogId` for their
|
|
61
|
+
* entity definition, but are spawned via `authoredEntitySpawns`, not placed as static meshes.
|
|
62
|
+
* @capability authored-objects place catalog mesh props from an editor document
|
|
63
|
+
*/
|
|
64
|
+
export declare function resolveAuthoredObjects(document: AuthoredObjectsDocumentLike, options?: ResolveAuthoredObjectsOptions): AuthoredObject[];
|
|
65
|
+
/**
|
|
66
|
+
* Places resolved authored objects into an object store, grounding each on `sampleHeight(x,z)` plus
|
|
67
|
+
* per-object and options vertical offsets. Returns the instance ids that were placed (or kept).
|
|
68
|
+
* @capability authored-objects place catalog mesh props from an editor document
|
|
69
|
+
*/
|
|
70
|
+
export declare function placeAuthoredObjects(store: AuthoredObjectPlaceTarget, objects: readonly AuthoredObject[], sampleHeight: (x: number, z: number) => number, options?: PlaceAuthoredObjectsOptions): string[];
|
|
71
|
+
/** Convenience: resolve a document then place every authored catalog prop. */
|
|
72
|
+
export declare function placeAuthoredObjectsFromDocument(store: AuthoredObjectPlaceTarget, document: AuthoredObjectsDocumentLike, sampleHeight: (x: number, z: number) => number, options?: PlaceAuthoredObjectsOptions): string[];
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
function metaString(meta, key) {
|
|
2
|
+
const value = meta?.[key];
|
|
3
|
+
return typeof value === "string" && value.length > 0 ? value : null;
|
|
4
|
+
}
|
|
5
|
+
function metaNumber(meta, key) {
|
|
6
|
+
const value = meta?.[key];
|
|
7
|
+
return typeof value === "number" && Number.isFinite(value) ? value : null;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Catalog id for a marker: first-class `catalogId` field, else `meta.catalogId` migration alias.
|
|
11
|
+
* Returns null when the marker is not an authored catalog prop (spawn, mob, generator, …).
|
|
12
|
+
* @capability authored-objects place catalog mesh props from an editor document
|
|
13
|
+
*/
|
|
14
|
+
export function markerCatalogId(marker) {
|
|
15
|
+
if (typeof marker.catalogId === "string" && marker.catalogId.length > 0)
|
|
16
|
+
return marker.catalogId;
|
|
17
|
+
return metaString(marker.meta, "catalogId");
|
|
18
|
+
}
|
|
19
|
+
function markerVerticalOffset(marker) {
|
|
20
|
+
const fromMeta = metaNumber(marker.meta, "verticalOffset") ??
|
|
21
|
+
metaNumber(marker.meta, "offsetY") ??
|
|
22
|
+
metaNumber(marker.meta, "yOffset");
|
|
23
|
+
return fromMeta ?? 0;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Marker kinds that are spawnable entities (materialized by `authoredEntitySpawns`), not static
|
|
27
|
+
* catalog props. {@link resolveAuthoredObjects} skips them by default so a placed `mob`/`boss` is
|
|
28
|
+
* spawned once as an entity and never also placed as a static mesh.
|
|
29
|
+
* @capability authored-objects marker kinds resolved as entity spawns, not static props
|
|
30
|
+
*/
|
|
31
|
+
export const ENTITY_MARKER_KINDS = ["mob", "boss"];
|
|
32
|
+
/**
|
|
33
|
+
* Every marker carrying a catalog id, as placeable props — pure, no terrain sample. Parallel to
|
|
34
|
+
* {@link resolveScatter}: games and headless tests read the same list `<AuthoredObjects>` places.
|
|
35
|
+
* Entity-spawn kinds (`mob`/`boss`) are skipped by default — they carry a `catalogId` for their
|
|
36
|
+
* entity definition, but are spawned via `authoredEntitySpawns`, not placed as static meshes.
|
|
37
|
+
* @capability authored-objects place catalog mesh props from an editor document
|
|
38
|
+
*/
|
|
39
|
+
export function resolveAuthoredObjects(document, options = {}) {
|
|
40
|
+
const excluded = new Set(options.excludeKinds ?? ENTITY_MARKER_KINDS);
|
|
41
|
+
const out = [];
|
|
42
|
+
for (const marker of document.markers) {
|
|
43
|
+
if (excluded.has(marker.kind))
|
|
44
|
+
continue;
|
|
45
|
+
const catalogId = markerCatalogId(marker);
|
|
46
|
+
if (catalogId === null)
|
|
47
|
+
continue;
|
|
48
|
+
out.push({
|
|
49
|
+
catalogId,
|
|
50
|
+
x: marker.position.x,
|
|
51
|
+
z: marker.position.z,
|
|
52
|
+
rotationY: marker.rotationY ?? 0,
|
|
53
|
+
instanceId: marker.id,
|
|
54
|
+
verticalOffset: markerVerticalOffset(marker),
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
return out;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Places resolved authored objects into an object store, grounding each on `sampleHeight(x,z)` plus
|
|
61
|
+
* per-object and options vertical offsets. Returns the instance ids that were placed (or kept).
|
|
62
|
+
* @capability authored-objects place catalog mesh props from an editor document
|
|
63
|
+
*/
|
|
64
|
+
export function placeAuthoredObjects(store, objects, sampleHeight, options = {}) {
|
|
65
|
+
const lift = options.verticalOffset ?? 0;
|
|
66
|
+
const onExisting = options.onExisting;
|
|
67
|
+
const ids = [];
|
|
68
|
+
for (const object of objects) {
|
|
69
|
+
const y = sampleHeight(object.x, object.z) + object.verticalOffset + lift;
|
|
70
|
+
ids.push(store.place(object.catalogId, object.x, y, object.z, {
|
|
71
|
+
instanceId: object.instanceId,
|
|
72
|
+
rotation: object.rotationY,
|
|
73
|
+
...(onExisting === undefined ? {} : { onExisting }),
|
|
74
|
+
}));
|
|
75
|
+
}
|
|
76
|
+
return ids;
|
|
77
|
+
}
|
|
78
|
+
/** Convenience: resolve a document then place every authored catalog prop. */
|
|
79
|
+
export function placeAuthoredObjectsFromDocument(store, document, sampleHeight, options = {}) {
|
|
80
|
+
return placeAuthoredObjects(store, resolveAuthoredObjects(document), sampleHeight, options);
|
|
81
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { SceneMarkerLike } from "./sceneShapes.js";
|
|
2
|
+
/** Minimal marker shape spawn queries read; any `EditorMarker` satisfies it. */
|
|
3
|
+
export interface AuthoredSpawnMarkerLike extends SceneMarkerLike {
|
|
4
|
+
rotationY?: number;
|
|
5
|
+
}
|
|
6
|
+
/** Minimal document shape spawn queries walk; any `EditorDocument` satisfies it. */
|
|
7
|
+
export interface AuthoredSpawnDocumentLike {
|
|
8
|
+
markers: readonly AuthoredSpawnMarkerLike[];
|
|
9
|
+
}
|
|
10
|
+
/** Marker kind {@link authoredSpawnPosition} resolves by default. */
|
|
11
|
+
export declare const PLAYER_SPAWN_KIND = "player_spawn";
|
|
12
|
+
/**
|
|
13
|
+
* Every marker of `kind`, in document order — the generic query behind gameplay that references
|
|
14
|
+
* authored markers by kind instead of copying coordinates into code.
|
|
15
|
+
* @capability authored-spawn read spawn points and markers from the editor document
|
|
16
|
+
*/
|
|
17
|
+
export declare function markersOfKind<TMarker extends AuthoredSpawnMarkerLike>(document: {
|
|
18
|
+
markers: readonly TMarker[];
|
|
19
|
+
}, kind: string): TMarker[];
|
|
20
|
+
/** Options for {@link authoredSpawnPosition}: pick a specific marker id or a non-default kind. */
|
|
21
|
+
export interface AuthoredSpawnOptions {
|
|
22
|
+
/** Marker kind to resolve. Default {@link PLAYER_SPAWN_KIND}. */
|
|
23
|
+
kind?: string;
|
|
24
|
+
/** Exact marker id; when set, kind only filters among markers with this id's kind. */
|
|
25
|
+
id?: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Position of the authored spawn marker as a spawn-ready `[x, y, z]` tuple, or null when the
|
|
29
|
+
* document has none. Reads the first `player_spawn` marker by default, so dragging the marker in
|
|
30
|
+
* the editor moves where players spawn — no coordinates copied into game code.
|
|
31
|
+
* @capability authored-spawn read spawn points and markers from the editor document
|
|
32
|
+
*/
|
|
33
|
+
export declare function authoredSpawnPosition(document: AuthoredSpawnDocumentLike, options?: AuthoredSpawnOptions): [number, number, number] | null;
|
|
34
|
+
/**
|
|
35
|
+
* Facing (yaw radians) of the authored spawn marker, or 0 when the document has none — pair with
|
|
36
|
+
* {@link authoredSpawnPosition} to spawn players where and how the editor placed them.
|
|
37
|
+
* @capability authored-spawn read spawn points and markers from the editor document
|
|
38
|
+
*/
|
|
39
|
+
export declare function authoredSpawnRotation(document: AuthoredSpawnDocumentLike, options?: AuthoredSpawnOptions): number;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/** Marker kind {@link authoredSpawnPosition} resolves by default. */
|
|
2
|
+
export const PLAYER_SPAWN_KIND = "player_spawn";
|
|
3
|
+
/**
|
|
4
|
+
* Every marker of `kind`, in document order — the generic query behind gameplay that references
|
|
5
|
+
* authored markers by kind instead of copying coordinates into code.
|
|
6
|
+
* @capability authored-spawn read spawn points and markers from the editor document
|
|
7
|
+
*/
|
|
8
|
+
export function markersOfKind(document, kind) {
|
|
9
|
+
return document.markers.filter((marker) => marker.kind === kind);
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Position of the authored spawn marker as a spawn-ready `[x, y, z]` tuple, or null when the
|
|
13
|
+
* document has none. Reads the first `player_spawn` marker by default, so dragging the marker in
|
|
14
|
+
* the editor moves where players spawn — no coordinates copied into game code.
|
|
15
|
+
* @capability authored-spawn read spawn points and markers from the editor document
|
|
16
|
+
*/
|
|
17
|
+
export function authoredSpawnPosition(document, options = {}) {
|
|
18
|
+
const kind = options.kind ?? PLAYER_SPAWN_KIND;
|
|
19
|
+
const marker = options.id === undefined
|
|
20
|
+
? document.markers.find((entry) => entry.kind === kind)
|
|
21
|
+
: document.markers.find((entry) => entry.id === options.id && entry.kind === kind);
|
|
22
|
+
if (marker === undefined)
|
|
23
|
+
return null;
|
|
24
|
+
return [marker.position.x, marker.position.y, marker.position.z];
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Facing (yaw radians) of the authored spawn marker, or 0 when the document has none — pair with
|
|
28
|
+
* {@link authoredSpawnPosition} to spawn players where and how the editor placed them.
|
|
29
|
+
* @capability authored-spawn read spawn points and markers from the editor document
|
|
30
|
+
*/
|
|
31
|
+
export function authoredSpawnRotation(document, options = {}) {
|
|
32
|
+
const kind = options.kind ?? PLAYER_SPAWN_KIND;
|
|
33
|
+
const marker = options.id === undefined
|
|
34
|
+
? document.markers.find((entry) => entry.kind === kind)
|
|
35
|
+
: document.markers.find((entry) => entry.id === options.id && entry.kind === kind);
|
|
36
|
+
return marker?.rotationY ?? 0;
|
|
37
|
+
}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Data-driven modular build-piece snap system: a catalog of piece types, each declaring named
|
|
3
|
+
* sockets (local position + outward facing + a generic "kind"), plus a connection-rule table saying
|
|
4
|
+
* which socket kinds may mate. Given a placed piece and a candidate type it resolves every valid
|
|
5
|
+
* snap — the world transform that lands the candidate's socket exactly on the placed piece's socket,
|
|
6
|
+
* facing back into it. Genre-agnostic: foundation/wall/ceiling/pillar/edge snapping falls out of the
|
|
7
|
+
* catalog data, with no game-specific piece names baked in. Pure and serializable; composes with
|
|
8
|
+
* `world/footprintGrid` occupancy (via an injected `isFree` predicate — never imported) and with
|
|
9
|
+
* `scene/modelSockets` named attach points (via {@link pieceSocketsFromModel}).
|
|
10
|
+
*/
|
|
11
|
+
/** A local- or world-space position/offset, matching the `[x, y, z]` triple used across core. */
|
|
12
|
+
export type SocketVec3 = readonly [number, number, number];
|
|
13
|
+
/** One named socket on a piece: where it sits and which horizontal direction it faces (yaw about Y). */
|
|
14
|
+
export interface SocketDef {
|
|
15
|
+
/** Stable socket name, unique within its piece. */
|
|
16
|
+
name: string;
|
|
17
|
+
/** Generic connection kind — e.g. "top", "bottom", "edge", "side". Matched by the rule table. */
|
|
18
|
+
kind: string;
|
|
19
|
+
/** Local offset from the piece origin. */
|
|
20
|
+
position: SocketVec3;
|
|
21
|
+
/** Outward-facing yaw in radians (rotation about +Y), local to the piece. Default `0`. */
|
|
22
|
+
yaw?: number;
|
|
23
|
+
}
|
|
24
|
+
/** A rectangular footprint (world units) a piece occupies on the build grid — the occupancy bridge. */
|
|
25
|
+
export interface BuildFootprint {
|
|
26
|
+
w: number;
|
|
27
|
+
d: number;
|
|
28
|
+
}
|
|
29
|
+
/** A registered piece type: its named sockets and, optionally, the footprint it claims when placed. */
|
|
30
|
+
export interface BuildPieceDef {
|
|
31
|
+
/** Stable piece-type id, unique within the catalog. */
|
|
32
|
+
type: string;
|
|
33
|
+
sockets: readonly SocketDef[];
|
|
34
|
+
/** Grid footprint for occupancy checks; omit for pieces that don't reserve cells. */
|
|
35
|
+
footprint?: BuildFootprint;
|
|
36
|
+
}
|
|
37
|
+
/** Declares that two socket kinds may snap together; `mutual` (default `true`) also allows `b`→`a`. */
|
|
38
|
+
export interface ConnectionRule {
|
|
39
|
+
a: string;
|
|
40
|
+
b: string;
|
|
41
|
+
/** When `false` the rule is directional: an `a`-kind candidate socket may mate onto a `b`-kind placed socket, but not the reverse. */
|
|
42
|
+
mutual?: boolean;
|
|
43
|
+
}
|
|
44
|
+
/** World transform of a placed piece: position plus a yaw about +Y. */
|
|
45
|
+
export interface PieceTransform {
|
|
46
|
+
position: SocketVec3;
|
|
47
|
+
/** Rotation about +Y in radians. Default `0`. */
|
|
48
|
+
yaw?: number;
|
|
49
|
+
}
|
|
50
|
+
/** An already-placed piece the resolver snaps candidates against. */
|
|
51
|
+
export interface PlacedPiece {
|
|
52
|
+
type: string;
|
|
53
|
+
transform: PieceTransform;
|
|
54
|
+
}
|
|
55
|
+
/** A piece's socket resolved into world space. */
|
|
56
|
+
export interface PlacedSocket {
|
|
57
|
+
name: string;
|
|
58
|
+
kind: string;
|
|
59
|
+
/** World-space socket position. */
|
|
60
|
+
position: SocketVec3;
|
|
61
|
+
/** World-space outward facing yaw (radians). */
|
|
62
|
+
yaw: number;
|
|
63
|
+
}
|
|
64
|
+
/** One integer grid cell — structurally the `GridCell` of `world/footprintGrid` (no import needed). */
|
|
65
|
+
export interface BuildCell {
|
|
66
|
+
col: number;
|
|
67
|
+
row: number;
|
|
68
|
+
}
|
|
69
|
+
/** A resolved snap: which sockets mate and the world transform that lands the candidate onto the target. */
|
|
70
|
+
export interface SnapCandidate {
|
|
71
|
+
candidateType: string;
|
|
72
|
+
/** Name of the socket on the already-placed piece. */
|
|
73
|
+
targetSocket: string;
|
|
74
|
+
/** Name of the candidate's socket that mates onto it. */
|
|
75
|
+
candidateSocket: string;
|
|
76
|
+
/** Where to place the candidate so its socket aligns onto the target socket. */
|
|
77
|
+
transform: {
|
|
78
|
+
position: SocketVec3;
|
|
79
|
+
yaw: number;
|
|
80
|
+
};
|
|
81
|
+
/** Shared world position of the mated sockets. */
|
|
82
|
+
point: SocketVec3;
|
|
83
|
+
/** Distance from the resolve `cursor` to `point`, or `0` when no cursor was given. */
|
|
84
|
+
distance: number;
|
|
85
|
+
}
|
|
86
|
+
/** Options for {@link BuildSocketCatalog.resolveSnaps}. */
|
|
87
|
+
export interface ResolveSnapsOptions {
|
|
88
|
+
/** Cursor point; when given, candidates are ordered nearest-first by mate-point distance. */
|
|
89
|
+
cursor?: SocketVec3;
|
|
90
|
+
/**
|
|
91
|
+
* Occupancy predicate — return `false` to reject a snap whose target cells are taken. Only applied
|
|
92
|
+
* to candidate pieces that declare a `footprint`. Compose with `world/footprintGrid` via
|
|
93
|
+
* `(cell) => grid.isFree([cell])`; the catalog never imports the grid.
|
|
94
|
+
*/
|
|
95
|
+
isFree?: (cell: BuildCell) => boolean;
|
|
96
|
+
}
|
|
97
|
+
/** Serializable catalog config; also the shape returned by {@link BuildSocketCatalog.toJSON}. */
|
|
98
|
+
export interface BuildSocketCatalogConfig {
|
|
99
|
+
pieces: readonly BuildPieceDef[];
|
|
100
|
+
rules: readonly ConnectionRule[];
|
|
101
|
+
/** World units per grid cell for footprint occupancy. Default `1`. */
|
|
102
|
+
cellSize?: number;
|
|
103
|
+
}
|
|
104
|
+
/** Handle returned by {@link createBuildSocketCatalog}. */
|
|
105
|
+
export interface BuildSocketCatalog {
|
|
106
|
+
readonly cellSize: number;
|
|
107
|
+
has(type: string): boolean;
|
|
108
|
+
piece(type: string): BuildPieceDef | null;
|
|
109
|
+
/** Registered piece-type ids, in declaration order. */
|
|
110
|
+
types(): readonly string[];
|
|
111
|
+
/** True when a `candidateKind` socket may mate onto a `placedKind` socket. */
|
|
112
|
+
canConnect(candidateKind: string, placedKind: string): boolean;
|
|
113
|
+
/** Every socket of `placed` resolved into world space. */
|
|
114
|
+
worldSockets(placed: PlacedPiece): PlacedSocket[];
|
|
115
|
+
/** Every valid snap of `candidateType` onto `placed`, ordered deterministically. */
|
|
116
|
+
resolveSnaps(placed: PlacedPiece, candidateType: string, options?: ResolveSnapsOptions): SnapCandidate[];
|
|
117
|
+
/** Plain, serializable snapshot — feed straight back into {@link createBuildSocketCatalog}. */
|
|
118
|
+
toJSON(): BuildSocketCatalogConfig;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* The grid cells a piece `footprint` centered on `position` (world units) covers, honoring `yaw`
|
|
122
|
+
* (snapped to the nearest quarter turn). Mirrors `world/footprintGrid`'s `cellsFor` so a game can
|
|
123
|
+
* feed the result straight into `grid.isFree`/`grid.reserve` after committing a resolved snap —
|
|
124
|
+
* without this module importing the grid.
|
|
125
|
+
*
|
|
126
|
+
* @capability build-footprint-cells grid cells a snapped build piece footprint covers (footprintGrid occupancy bridge)
|
|
127
|
+
*/
|
|
128
|
+
export declare function footprintCells(position: SocketVec3, footprint: BuildFootprint, yaw?: number, cellSize?: number): BuildCell[];
|
|
129
|
+
/** A `{ name, offset }` attach point — structurally the `ModelSocket` of `scene/modelSockets`. */
|
|
130
|
+
export interface ModelSocketLike {
|
|
131
|
+
name: string;
|
|
132
|
+
offset: SocketVec3;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Turn a model's named attach points (from `scene/modelSockets`' `readNamedSockets`) into
|
|
136
|
+
* {@link SocketDef}s, classifying each into a connection `kind` via `kindOf` and, optionally, an
|
|
137
|
+
* outward `yaw` via `yawOf`. Lets an artist author snap sockets as empties in a GLB instead of by
|
|
138
|
+
* hand in the catalog. Pure and structural — no three.js or scene import.
|
|
139
|
+
*
|
|
140
|
+
* @capability piece-sockets-from-model derive build-piece snap sockets from a model's named attach points
|
|
141
|
+
*/
|
|
142
|
+
export declare function pieceSocketsFromModel(sockets: readonly ModelSocketLike[], kindOf: (name: string) => string, yawOf?: (name: string) => number): SocketDef[];
|
|
143
|
+
/**
|
|
144
|
+
* Build a modular snap catalog from piece definitions and a connection-rule table. Resolves the set
|
|
145
|
+
* of valid snap transforms when hovering a candidate piece near a placed one: for every compatible
|
|
146
|
+
* socket pair it computes the world transform that seats the candidate's socket onto the placed
|
|
147
|
+
* socket, oriented to face back into it. Deterministic ordering (nearest a cursor when given, else
|
|
148
|
+
* declaration order) and an optional occupancy predicate keep it drop-in for a build-mode controller.
|
|
149
|
+
*
|
|
150
|
+
* @capability build-socket-catalog data-driven named-socket snap catalog for modular base building
|
|
151
|
+
*/
|
|
152
|
+
export declare function createBuildSocketCatalog(config: BuildSocketCatalogConfig): BuildSocketCatalog;
|