@jgengine/core 0.10.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -2
- package/LICENSE +203 -661
- package/README.md +1 -1
- package/dist/ai/crowd.d.ts +55 -0
- package/dist/ai/crowd.js +114 -0
- package/dist/ai/flock.d.ts +5 -2
- package/dist/ai/flock.js +5 -2
- package/dist/ai/groupAssist.d.ts +1 -0
- package/dist/ai/groupAssist.js +1 -0
- package/dist/ai/heatSystem.d.ts +76 -0
- package/dist/ai/heatSystem.js +97 -0
- package/dist/ai/interestScheduler.d.ts +107 -0
- package/dist/ai/interestScheduler.js +118 -0
- package/dist/ai/jobBoard.d.ts +1 -0
- package/dist/ai/jobBoard.js +1 -0
- package/dist/ai/laneSelect.d.ts +5 -2
- package/dist/ai/laneSelect.js +5 -2
- package/dist/ai/mobBrain.d.ts +1 -0
- package/dist/ai/mobBrain.js +1 -0
- package/dist/ai/spawnDirector.d.ts +7 -2
- package/dist/ai/spawnDirector.js +18 -15
- package/dist/ai/spawnPoint.d.ts +3 -1
- package/dist/ai/spawnPoint.js +3 -1
- package/dist/ai/targetAcquisition.d.ts +84 -0
- package/dist/ai/targetAcquisition.js +92 -0
- package/dist/anim/easing.d.ts +19 -0
- package/dist/anim/easing.js +19 -0
- package/dist/anim/oscillator.d.ts +12 -0
- package/dist/anim/oscillator.js +25 -0
- package/dist/area/areaEffectField.d.ts +127 -0
- package/dist/area/areaEffectField.js +175 -0
- package/dist/area/stackPolicy.d.ts +47 -0
- package/dist/area/stackPolicy.js +99 -0
- package/dist/authoring.d.ts +1 -0
- package/dist/authoring.js +1 -0
- package/dist/board/laneBoard.d.ts +13 -0
- package/dist/board/laneBoard.js +13 -0
- package/dist/board/timelineBoard.d.ts +10 -0
- package/dist/board/timelineBoard.js +10 -0
- package/dist/combat/abilityKit.d.ts +18 -0
- package/dist/combat/abilityKit.js +24 -9
- package/dist/combat/animationState.d.ts +5 -0
- package/dist/combat/animationState.js +5 -0
- package/dist/combat/breakMeters.d.ts +10 -0
- package/dist/combat/breakMeters.js +10 -0
- package/dist/combat/castRunner.d.ts +5 -0
- package/dist/combat/castRunner.js +5 -0
- package/dist/combat/comboPoints.d.ts +5 -0
- package/dist/combat/comboPoints.js +5 -0
- package/dist/combat/comboString.d.ts +5 -0
- package/dist/combat/comboString.js +5 -0
- package/dist/combat/damageInterceptors.d.ts +192 -0
- package/dist/combat/damageInterceptors.js +251 -0
- package/dist/combat/damageMatchup.d.ts +68 -0
- package/dist/combat/damageMatchup.js +42 -0
- package/dist/combat/damageResolution.d.ts +63 -0
- package/dist/combat/damageResolution.js +50 -0
- package/dist/combat/death.d.ts +7 -1
- package/dist/combat/death.js +5 -0
- package/dist/combat/deathReason.d.ts +14 -0
- package/dist/combat/deathReason.js +1 -0
- package/dist/combat/defensiveWindow.d.ts +5 -0
- package/dist/combat/defensiveWindow.js +5 -0
- package/dist/combat/dotField.d.ts +5 -1
- package/dist/combat/dotField.js +5 -1
- package/dist/combat/downed.d.ts +5 -0
- package/dist/combat/downed.js +5 -0
- package/dist/combat/effects.d.ts +5 -0
- package/dist/combat/effects.js +5 -0
- package/dist/combat/encounterSequence.d.ts +258 -0
- package/dist/combat/encounterSequence.js +426 -0
- package/dist/combat/hitReaction.d.ts +57 -1
- package/dist/combat/hitReaction.js +45 -5
- package/dist/combat/magazine.d.ts +54 -0
- package/dist/combat/magazine.js +96 -0
- package/dist/combat/projectiles.d.ts +5 -0
- package/dist/combat/projectiles.js +32 -14
- package/dist/combat/receivedDamage.d.ts +117 -0
- package/dist/combat/receivedDamage.js +92 -0
- package/dist/combat/regenShield.d.ts +5 -1
- package/dist/combat/regenShield.js +5 -1
- package/dist/combat/renderCues.d.ts +51 -0
- package/dist/combat/renderCues.js +44 -0
- package/dist/combat/resourcePool.d.ts +5 -0
- package/dist/combat/resourcePool.js +5 -0
- package/dist/combat/rewardAllocation.d.ts +121 -0
- package/dist/combat/rewardAllocation.js +251 -0
- package/dist/combat/shotOrigin.d.ts +18 -1
- package/dist/combat/shotOrigin.js +39 -0
- package/dist/combat/statusApplication.d.ts +96 -0
- package/dist/combat/statusApplication.js +81 -0
- package/dist/combat/telegraph.d.ts +11 -2
- package/dist/combat/telegraph.js +11 -2
- package/dist/combat/thresholdCrossings.d.ts +85 -0
- package/dist/combat/thresholdCrossings.js +116 -0
- package/dist/combat.d.ts +34 -0
- package/dist/combat.js +34 -0
- package/dist/commands/commandRegistry.d.ts +11 -0
- package/dist/commands/commandRegistry.js +9 -2
- package/dist/crafting/crop.d.ts +18 -0
- package/dist/crafting/crop.js +18 -0
- package/dist/crafting/production.d.ts +5 -0
- package/dist/crafting/production.js +5 -0
- package/dist/devtools/rewriteTunables.d.ts +17 -0
- package/dist/devtools/rewriteTunables.js +276 -0
- package/dist/devtools/saveEndpoint.d.ts +46 -0
- package/dist/devtools/saveEndpoint.js +48 -0
- package/dist/devtools/transformTunables.d.ts +3 -0
- package/dist/devtools/transformTunables.js +3 -0
- package/dist/devtools/tunableSchema.d.ts +31 -0
- package/dist/devtools/tunableSchema.js +31 -0
- package/dist/economy/currency.d.ts +12 -1
- package/dist/economy/currency.js +12 -1
- package/dist/economy/listingBook.d.ts +91 -0
- package/dist/economy/listingBook.js +144 -0
- package/dist/economy/resourceLedger.d.ts +222 -0
- package/dist/economy/resourceLedger.js +353 -0
- package/dist/economy/sharedWallet.d.ts +14 -0
- package/dist/economy/sharedWallet.js +14 -0
- package/dist/economy/techTree.d.ts +12 -0
- package/dist/economy/techTree.js +12 -0
- package/dist/economy/wallet.d.ts +26 -2
- package/dist/economy/wallet.js +35 -6
- package/dist/editor/commands.d.ts +190 -7
- package/dist/editor/commands.js +727 -55
- package/dist/editor/document.d.ts +159 -13
- package/dist/editor/document.js +750 -19
- package/dist/editor/grid.d.ts +229 -0
- package/dist/editor/grid.js +366 -0
- package/dist/editor/gridAdapters.d.ts +80 -0
- package/dist/editor/gridAdapters.js +134 -0
- package/dist/editor/index.d.ts +73 -6
- package/dist/editor/index.js +6 -2
- package/dist/editor/liveSync.d.ts +127 -0
- package/dist/editor/liveSync.js +249 -0
- package/dist/editor/runtimeInspector.d.ts +88 -0
- package/dist/editor/runtimeInspector.js +239 -0
- package/dist/editor/types.d.ts +107 -1
- package/dist/faction/reputation.d.ts +5 -0
- package/dist/faction/reputation.js +5 -0
- package/dist/format/distance.d.ts +17 -0
- package/dist/format/distance.js +18 -0
- package/dist/format/duration.d.ts +27 -0
- package/dist/format/duration.js +45 -0
- package/dist/format/speed.d.ts +17 -0
- package/dist/format/speed.js +25 -0
- package/dist/game/connectedPlayers.d.ts +6 -4
- package/dist/game/connectedPlayers.js +2 -2
- package/dist/game/cosmetics.d.ts +9 -0
- package/dist/game/cosmetics.js +16 -0
- package/dist/game/defineGame.d.ts +100 -2
- package/dist/game/defineGame.js +39 -2
- package/dist/game/defineSystem.d.ts +88 -0
- package/dist/game/defineSystem.js +45 -0
- package/dist/game/dialogue.d.ts +33 -0
- package/dist/game/dialogue.js +21 -0
- package/dist/game/events.d.ts +35 -13
- package/dist/game/events.js +5 -0
- package/dist/game/feed.d.ts +33 -0
- package/dist/game/feed.js +35 -2
- package/dist/game/gamePhase.d.ts +11 -0
- package/dist/game/gamePhase.js +16 -0
- package/dist/game/leaderboard.d.ts +5 -0
- package/dist/game/leaderboard.js +5 -0
- package/dist/game/loadout.d.ts +5 -0
- package/dist/game/loadout.js +5 -0
- package/dist/game/lootFilter.d.ts +2 -0
- package/dist/game/lootFilter.js +2 -0
- package/dist/game/lootPipeline.d.ts +164 -0
- package/dist/game/lootPipeline.js +216 -0
- package/dist/game/lootTable.d.ts +19 -2
- package/dist/game/lootTable.js +15 -5
- package/dist/game/objectives.d.ts +43 -0
- package/dist/game/objectives.js +36 -0
- package/dist/game/paramLayers.d.ts +148 -0
- package/dist/game/paramLayers.js +185 -0
- package/dist/game/ping.d.ts +5 -0
- package/dist/game/ping.js +5 -0
- package/dist/game/playableGame.d.ts +92 -7
- package/dist/game/quest.d.ts +8 -0
- package/dist/game/quest.js +29 -0
- package/dist/game/race.d.ts +141 -0
- package/dist/game/race.js +169 -0
- package/dist/game/recordBook.d.ts +3 -1
- package/dist/game/recordBook.js +4 -1
- package/dist/game/ruleSelection.d.ts +75 -0
- package/dist/game/ruleSelection.js +127 -0
- package/dist/game/runDraft.d.ts +5 -0
- package/dist/game/runDraft.js +5 -0
- package/dist/game/saveStore.d.ts +111 -0
- package/dist/game/saveStore.js +312 -0
- package/dist/game/snapshotHistory.d.ts +67 -0
- package/dist/game/snapshotHistory.js +95 -0
- package/dist/game/social.d.ts +38 -1
- package/dist/game/social.js +71 -0
- package/dist/game/spawnPoints.d.ts +5 -0
- package/dist/game/spawnPoints.js +5 -0
- package/dist/game/systemRuntime.d.ts +50 -0
- package/dist/game/systemRuntime.js +157 -0
- package/dist/game/systemSchedule.d.ts +72 -0
- package/dist/game/systemSchedule.js +242 -0
- package/dist/game/toasts.d.ts +43 -0
- package/dist/game/toasts.js +44 -0
- package/dist/game/trade.d.ts +10 -0
- package/dist/game/trade.js +10 -0
- package/dist/game/unlocks.d.ts +8 -0
- package/dist/game/unlocks.js +16 -0
- package/dist/game/vfxInstance.d.ts +138 -0
- package/dist/game/vfxInstance.js +96 -0
- package/dist/game/worldItem.d.ts +17 -4
- package/dist/game/worldItem.js +17 -4
- package/dist/gameplay.d.ts +91 -0
- package/dist/gameplay.js +91 -0
- package/dist/index.d.ts +5 -14
- package/dist/index.js +5 -14
- package/dist/input/actionBindings.d.ts +23 -6
- package/dist/input/actionBindings.js +23 -6
- package/dist/input/axisInput.d.ts +7 -2
- package/dist/input/axisInput.js +7 -2
- package/dist/input/controlGroups.d.ts +67 -0
- package/dist/input/controlGroups.js +41 -0
- package/dist/input/touchScheme.d.ts +82 -6
- package/dist/input/touchScheme.js +123 -10
- package/dist/interaction/lockpick.d.ts +61 -0
- package/dist/interaction/lockpick.js +168 -0
- package/dist/interaction/proximityPrompt.d.ts +2 -0
- package/dist/interaction/proximityPrompt.js +2 -0
- package/dist/interaction/qte.d.ts +5 -0
- package/dist/interaction/qte.js +5 -0
- package/dist/interaction/skillCheck.d.ts +5 -0
- package/dist/interaction/skillCheck.js +5 -0
- package/dist/inventory/inventoryModel.d.ts +12 -0
- package/dist/inventory/inventoryModel.js +12 -0
- package/dist/inventory/shapedGrid.d.ts +16 -0
- package/dist/inventory/shapedGrid.js +16 -0
- package/dist/inventory/slotModel.d.ts +10 -0
- package/dist/inventory/slotModel.js +10 -0
- package/dist/item/durability.d.ts +5 -0
- package/dist/item/durability.js +5 -0
- package/dist/item/itemIdentity.d.ts +171 -0
- package/dist/item/itemIdentity.js +138 -0
- package/dist/item/itemInstanceRegistry.d.ts +32 -0
- package/dist/item/itemInstanceRegistry.js +34 -0
- package/dist/item/itemgen.d.ts +163 -0
- package/dist/item/itemgen.js +151 -0
- package/dist/item/modularItem.d.ts +5 -0
- package/dist/item/modularItem.js +5 -0
- package/dist/item/use.d.ts +5 -0
- package/dist/item/use.js +5 -0
- package/dist/item/useBehavior.d.ts +142 -0
- package/dist/item/useBehavior.js +105 -0
- package/dist/item/weapon.d.ts +5 -0
- package/dist/item/weapon.js +5 -0
- package/dist/math/scalar.d.ts +25 -0
- package/dist/math/scalar.js +47 -0
- package/dist/meta/changelog.d.ts +4 -1
- package/dist/meta/changelog.js +16 -2
- package/dist/movement/avoidance.d.ts +45 -0
- package/dist/movement/avoidance.js +123 -0
- package/dist/movement/cameraRig.d.ts +8 -0
- package/dist/movement/cameraRig.js +8 -0
- package/dist/movement/dash.d.ts +11 -0
- package/dist/movement/dash.js +11 -0
- package/dist/movement/formation.d.ts +135 -0
- package/dist/movement/formation.js +194 -0
- package/dist/movement/glideModel.d.ts +5 -0
- package/dist/movement/glideModel.js +5 -0
- package/dist/movement/grappleSwing.d.ts +5 -0
- package/dist/movement/grappleSwing.js +5 -0
- package/dist/movement/leaderTrail.d.ts +5 -0
- package/dist/movement/leaderTrail.js +5 -0
- package/dist/movement/movementModel.d.ts +35 -8
- package/dist/movement/movementModel.js +42 -14
- package/dist/movement/playerMovement.js +65 -10
- package/dist/movement/poseState.d.ts +13 -0
- package/dist/movement/poseState.js +16 -0
- package/dist/movement/steering.d.ts +8 -0
- package/dist/movement/steering.js +18 -0
- package/dist/multiplayer/combatSnapshot.d.ts +3 -0
- package/dist/multiplayer/combatSnapshot.js +3 -0
- package/dist/multiplayer/lagCompensation.d.ts +5 -0
- package/dist/multiplayer/lagCompensation.js +5 -0
- package/dist/multiplayer/presenceModel.d.ts +9 -1
- package/dist/multiplayer/presenceModel.js +9 -1
- package/dist/multiplayer/simultaneousCommit.d.ts +3 -0
- package/dist/multiplayer/simultaneousCommit.js +3 -0
- package/dist/multiplayer.d.ts +11 -0
- package/dist/multiplayer.js +11 -0
- package/dist/nav/pathFollow.d.ts +57 -0
- package/dist/nav/pathFollow.js +109 -0
- package/dist/orders/orderKinds.d.ts +156 -0
- package/dist/orders/orderKinds.js +197 -0
- package/dist/orders/orderQueue.d.ts +208 -0
- package/dist/orders/orderQueue.js +211 -0
- package/dist/physics/drivableVehicle.d.ts +29 -0
- package/dist/physics/drivableVehicle.js +16 -0
- package/dist/physics/kinematicVehicle.d.ts +21 -1
- package/dist/physics/kinematicVehicle.js +23 -8
- package/dist/physics/physicsWorld.d.ts +24 -12
- package/dist/physics/physicsWorld.js +11 -5
- package/dist/physics/radialImpulse.d.ts +25 -0
- package/dist/physics/radialImpulse.js +27 -0
- package/dist/procedural.d.ts +3 -0
- package/dist/procedural.js +3 -0
- package/dist/progression/statGraph.d.ts +116 -0
- package/dist/progression/statGraph.js +318 -0
- package/dist/puzzle/cellGrid.d.ts +9 -0
- package/dist/puzzle/cellGrid.js +9 -0
- package/dist/puzzle/fallingPiece.d.ts +9 -0
- package/dist/puzzle/fallingPiece.js +9 -0
- package/dist/puzzle/nonogram.d.ts +39 -0
- package/dist/puzzle/nonogram.js +136 -0
- package/dist/random/nameGen.d.ts +5 -0
- package/dist/random/nameGen.js +5 -0
- package/dist/random/pick.d.ts +8 -0
- package/dist/random/pick.js +31 -0
- package/dist/random/rng.d.ts +22 -0
- package/dist/random/rng.js +28 -8
- package/dist/random/seedLink.d.ts +4 -0
- package/dist/random/seedLink.js +4 -0
- package/dist/relation/keyedValues.d.ts +54 -0
- package/dist/relation/keyedValues.js +115 -0
- package/dist/relation/thresholds.d.ts +62 -0
- package/dist/relation/thresholds.js +62 -0
- package/dist/render/color.d.ts +12 -0
- package/dist/render/color.js +26 -0
- package/dist/render/lookPreset.d.ts +41 -0
- package/dist/render/lookPreset.js +29 -0
- package/dist/render/postProcessing.d.ts +20 -0
- package/dist/render/postProcessing.js +21 -1
- package/dist/rules/predicate.d.ts +53 -0
- package/dist/rules/predicate.js +64 -0
- package/dist/rules/ruleEffects.d.ts +38 -0
- package/dist/rules/ruleEffects.js +37 -0
- package/dist/rules/triggeredRules.d.ts +160 -0
- package/dist/rules/triggeredRules.js +241 -0
- package/dist/runtime/adapter.d.ts +42 -3
- package/dist/runtime/adapter.js +44 -1
- package/dist/runtime/cameraDirector.d.ts +1 -0
- package/dist/runtime/cameraDirector.js +1 -0
- package/dist/runtime/commandRunner.d.ts +1 -0
- package/dist/runtime/commandRunner.js +1 -0
- package/dist/runtime/context/combatFx.d.ts +23 -0
- package/dist/runtime/context/combatFx.js +161 -0
- package/dist/runtime/context/registries.d.ts +13 -0
- package/dist/runtime/context/registries.js +84 -0
- package/dist/runtime/context/worldItems.d.ts +21 -0
- package/dist/runtime/context/worldItems.js +37 -0
- package/dist/runtime/descriptors/baseline.d.ts +48 -0
- package/dist/runtime/descriptors/baseline.js +134 -0
- package/dist/runtime/descriptors/features.d.ts +74 -0
- package/dist/runtime/descriptors/features.js +281 -0
- package/dist/runtime/gameContext.d.ts +114 -13
- package/dist/runtime/gameContext.js +303 -395
- package/dist/runtime/gameRuntime.d.ts +1 -0
- package/dist/runtime/gameRuntime.js +1 -0
- package/dist/runtime/headlessRunner.d.ts +60 -0
- package/dist/runtime/headlessRunner.js +44 -0
- package/dist/runtime/hostPersistence.d.ts +12 -0
- package/dist/runtime/hostPersistence.js +12 -0
- package/dist/runtime/hostedGameRunner.d.ts +8 -3
- package/dist/runtime/hostedGameRunner.js +26 -3
- package/dist/runtime/hostedWorldSession.d.ts +12 -4
- package/dist/runtime/hostedWorldSession.js +11 -4
- package/dist/runtime/inputSnapshot.d.ts +8 -3
- package/dist/runtime/inputSnapshot.js +6 -2
- package/dist/runtime/motionIntents.d.ts +11 -2
- package/dist/runtime/motionIntents.js +16 -2
- package/dist/runtime/perContext.d.ts +15 -0
- package/dist/runtime/perContext.js +21 -0
- package/dist/runtime/runtimeSave.d.ts +79 -0
- package/dist/runtime/runtimeSave.js +105 -0
- package/dist/runtime/save.d.ts +4 -0
- package/dist/runtime/save.js +4 -0
- package/dist/runtime/snapshot.d.ts +7 -0
- package/dist/runtime/snapshot.js +7 -0
- package/dist/runtime/visibility.d.ts +2 -1
- package/dist/runtime/visibility.js +2 -1
- package/dist/runtime/worldChannel.d.ts +7 -3
- package/dist/runtime/worldChannel.js +51 -6
- package/dist/runtime/worldMirror.d.ts +14 -2
- package/dist/runtime/worldMirror.js +15 -2
- package/dist/runtime/worldProjection.d.ts +47 -0
- package/dist/runtime/worldProjection.js +52 -0
- package/dist/runtime/worldReplication.d.ts +30 -7
- package/dist/runtime/worldReplication.js +41 -9
- package/dist/runtime/worldSnapshot.d.ts +30 -3
- package/dist/runtime/worldSnapshot.js +20 -5
- package/dist/scene/assetCatalog.d.ts +21 -0
- package/dist/scene/assetCatalog.js +4 -0
- package/dist/scene/assetDiagnostics.d.ts +69 -0
- package/dist/scene/assetDiagnostics.js +110 -0
- package/dist/scene/assetGenerator.d.ts +65 -0
- package/dist/scene/assetGenerator.js +64 -0
- package/dist/scene/assetSpace.d.ts +137 -0
- package/dist/scene/assetSpace.js +259 -0
- package/dist/scene/authoredTriggers.d.ts +169 -0
- package/dist/scene/authoredTriggers.js +340 -0
- package/dist/scene/behaviorRuntime.d.ts +75 -0
- package/dist/scene/behaviorRuntime.js +217 -0
- package/dist/scene/behaviors.d.ts +14 -2
- package/dist/scene/behaviors.js +7 -2
- package/dist/scene/bodyBind.d.ts +60 -0
- package/dist/scene/bodyBind.js +51 -0
- package/dist/scene/builtinSceneKinds.d.ts +5 -0
- package/dist/scene/builtinSceneKinds.js +62 -0
- package/dist/scene/colliders.d.ts +13 -1
- package/dist/scene/colliders.js +37 -1
- package/dist/scene/entityStats.d.ts +11 -2
- package/dist/scene/entityStats.js +11 -2
- package/dist/scene/entityStore.d.ts +12 -1
- package/dist/scene/entityStore.js +15 -0
- package/dist/scene/facing.d.ts +18 -0
- package/dist/scene/facing.js +26 -0
- package/dist/scene/modelSockets.d.ts +33 -0
- package/dist/scene/modelSockets.js +29 -0
- package/dist/scene/objectQuery.d.ts +2 -0
- package/dist/scene/objectQuery.js +2 -0
- package/dist/scene/objectStore.d.ts +4 -0
- package/dist/scene/objectStore.js +6 -0
- package/dist/scene/possession.d.ts +8 -0
- package/dist/scene/possession.js +14 -0
- package/dist/scene/roster.d.ts +3 -0
- package/dist/scene/roster.js +12 -0
- package/dist/scene/sceneKinds.d.ts +240 -0
- package/dist/scene/sceneKinds.js +214 -0
- package/dist/scene/sceneOwnership.d.ts +169 -0
- package/dist/scene/sceneOwnership.js +179 -0
- package/dist/scene/selectionBookmarks.d.ts +93 -0
- package/dist/scene/selectionBookmarks.js +122 -0
- package/dist/scene/vehicleSeat.d.ts +68 -0
- package/dist/scene/vehicleSeat.js +59 -0
- package/dist/sensor/concealment.d.ts +3 -0
- package/dist/sensor/concealment.js +3 -0
- package/dist/sensor/freezeMonitor.d.ts +1 -0
- package/dist/sensor/freezeMonitor.js +1 -0
- package/dist/sensor/frustumSensor.d.ts +7 -3
- package/dist/sensor/frustumSensor.js +7 -3
- package/dist/sensor/hiddenStateProbe.d.ts +5 -2
- package/dist/sensor/hiddenStateProbe.js +5 -2
- package/dist/sensor/recordingBuffer.d.ts +2 -1
- package/dist/sensor/recordingBuffer.js +2 -1
- package/dist/sensor/replayLoop.d.ts +6 -2
- package/dist/sensor/replayLoop.js +6 -2
- package/dist/sensor/revealQuery.d.ts +2 -1
- package/dist/sensor/revealQuery.js +2 -1
- package/dist/sensor/visionCone.d.ts +10 -3
- package/dist/sensor/visionCone.js +10 -3
- package/dist/session/contestedChannel.d.ts +1 -0
- package/dist/session/contestedChannel.js +1 -0
- package/dist/session/extraction.d.ts +1 -0
- package/dist/session/extraction.js +1 -0
- package/dist/session/roles.d.ts +6 -0
- package/dist/session/roles.js +6 -0
- package/dist/session/roundState.d.ts +8 -0
- package/dist/session/roundState.js +2 -0
- package/dist/settings/settingsModel.d.ts +1 -0
- package/dist/settings/settingsModel.js +1 -0
- package/dist/stats/accumulatorMeter.d.ts +6 -0
- package/dist/stats/accumulatorMeter.js +6 -0
- package/dist/stats/eventMeter.d.ts +5 -0
- package/dist/stats/eventMeter.js +5 -0
- package/dist/stats/rollCheck.d.ts +5 -0
- package/dist/stats/rollCheck.js +5 -0
- package/dist/stats/statModifiers.d.ts +5 -0
- package/dist/stats/statModifiers.js +5 -0
- package/dist/store/defineKeyedStore.d.ts +38 -0
- package/dist/store/defineKeyedStore.js +42 -0
- package/dist/store/defineStore.d.ts +33 -0
- package/dist/store/defineStore.js +35 -0
- package/dist/store/observableKeyedStore.d.ts +5 -0
- package/dist/store/observableKeyedStore.js +34 -2
- package/dist/survival/decayMeter.d.ts +55 -0
- package/dist/survival/decayMeter.js +130 -55
- package/dist/survival/moodle.d.ts +2 -0
- package/dist/survival/regionHealth.d.ts +6 -0
- package/dist/survival/regionHealth.js +5 -0
- package/dist/tactics/fallingGrid.d.ts +4 -2
- package/dist/tactics/fallingGrid.js +4 -2
- package/dist/tactics/predictiveQuery.d.ts +3 -0
- package/dist/tactics/predictiveQuery.js +3 -0
- package/dist/tactics/snapshot.d.ts +2 -0
- package/dist/tactics/snapshot.js +2 -0
- package/dist/tactics/surface.d.ts +1 -0
- package/dist/tactics/surface.js +1 -0
- package/dist/tactics/tacticalGrid.d.ts +1 -0
- package/dist/tactics/tacticalGrid.js +1 -0
- package/dist/time/beatClock.d.ts +14 -4
- package/dist/time/beatClock.js +14 -4
- package/dist/time/calendarClock.d.ts +3 -0
- package/dist/time/calendarClock.js +3 -0
- package/dist/time/idleProgress.d.ts +4 -0
- package/dist/time/idleProgress.js +4 -0
- package/dist/time/simClock.d.ts +2 -0
- package/dist/time/simClock.js +20 -5
- package/dist/ui/actionModel.d.ts +110 -0
- package/dist/ui/actionModel.js +159 -0
- package/dist/ui/gameLayout.d.ts +30 -11
- package/dist/ui/gameLayout.js +30 -11
- package/dist/ui/hudDocument.d.ts +114 -0
- package/dist/ui/hudDocument.js +220 -0
- package/dist/ui/hudLayout.d.ts +33 -1
- package/dist/ui/hudLayout.js +204 -17
- package/dist/ui/selectionModel.d.ts +92 -0
- package/dist/ui/selectionModel.js +88 -0
- package/dist/ui/tooltipModel.d.ts +63 -0
- package/dist/ui/tooltipModel.js +82 -0
- package/dist/ui.d.ts +15 -0
- package/dist/ui.js +15 -0
- package/dist/visibility/bounds.d.ts +8 -1
- package/dist/visibility/bounds.js +8 -1
- package/dist/visibility/frustum.d.ts +12 -3
- package/dist/visibility/frustum.js +12 -3
- package/dist/work/jobQueue.d.ts +201 -0
- package/dist/work/jobQueue.js +253 -0
- package/dist/work/unitTraining.d.ts +58 -0
- package/dist/work/unitTraining.js +52 -0
- package/dist/world/authoredObjects.d.ts +58 -0
- package/dist/world/authoredObjects.js +69 -0
- package/dist/world/buildingGenerator.d.ts +18 -0
- package/dist/world/buildingGenerator.js +62 -0
- package/dist/world/buildings.d.ts +5 -0
- package/dist/world/buildings.js +5 -0
- package/dist/world/catenary.d.ts +22 -0
- package/dist/world/catenary.js +69 -0
- package/dist/world/features.d.ts +115 -7
- package/dist/world/features.js +56 -5
- package/dist/world/footprintGrid.d.ts +59 -0
- package/dist/world/footprintGrid.js +141 -0
- package/dist/world/geometry.d.ts +64 -0
- package/dist/world/geometry.js +94 -0
- package/dist/world/grassKind.d.ts +51 -0
- package/dist/world/grassKind.js +101 -0
- package/dist/world/pathInstances.d.ts +27 -0
- package/dist/world/pathInstances.js +27 -0
- package/dist/world/pathTerrain.d.ts +80 -0
- package/dist/world/pathTerrain.js +142 -0
- package/dist/world/placeAsset.d.ts +81 -0
- package/dist/world/placeAsset.js +77 -0
- package/dist/world/placement.d.ts +4 -0
- package/dist/world/placement.js +4 -0
- package/dist/world/placementController.d.ts +6 -0
- package/dist/world/placementController.js +6 -0
- package/dist/world/polyline.d.ts +34 -0
- package/dist/world/polyline.js +81 -0
- package/dist/world/roads.d.ts +8 -0
- package/dist/world/roads.js +38 -0
- package/dist/world/scatterRegion.d.ts +164 -0
- package/dist/world/scatterRegion.js +409 -0
- package/dist/world/sceneShapes.d.ts +43 -0
- package/dist/world/sceneShapes.js +1 -0
- package/dist/world/segment.d.ts +27 -0
- package/dist/world/segment.js +43 -0
- package/dist/world/soilKind.d.ts +48 -0
- package/dist/world/soilKind.js +92 -0
- package/dist/world/spatialSample.d.ts +241 -0
- package/dist/world/spatialSample.js +465 -0
- package/dist/world/terraform.d.ts +213 -1
- package/dist/world/terraform.js +655 -20
- package/dist/world/terrain.d.ts +119 -20
- package/dist/world/terrain.js +247 -41
- package/dist/world/terrainGuides.d.ts +182 -0
- package/dist/world/terrainGuides.js +343 -0
- package/dist/world/vec2.d.ts +81 -0
- package/dist/world/vec2.js +128 -0
- package/dist/world/vec3.d.ts +49 -0
- package/dist/world/vec3.js +76 -0
- package/dist/world/vegetation.d.ts +71 -0
- package/dist/world/vegetation.js +151 -0
- package/dist/world/visibilityField.d.ts +154 -0
- package/dist/world/visibilityField.js +271 -0
- package/dist/world/volumetricClouds.d.ts +52 -0
- package/dist/world/volumetricClouds.js +43 -0
- package/dist/world/walls.d.ts +9 -0
- package/dist/world/walls.js +9 -0
- package/dist/world/waterKind.d.ts +55 -0
- package/dist/world/waterKind.js +99 -0
- package/dist/world.d.ts +132 -0
- package/dist/world.js +132 -0
- package/package.json +32 -8
- package/skills/jgengine/SKILL.md +51 -0
- package/skills/jgengine/api.md +434 -0
- package/skills/jgengine/capabilities.md +29 -0
- package/skills/jgengine/reference-cartridge.md +72 -0
- package/skills/jgengine-combat/SKILL.md +34 -0
- package/skills/jgengine-combat/api.md +549 -0
- package/skills/jgengine-combat/capabilities.md +169 -0
- package/skills/jgengine-combat/reference.md +98 -0
- package/skills/jgengine-gameplay/SKILL.md +39 -0
- package/skills/jgengine-gameplay/api.md +1794 -0
- package/skills/jgengine-gameplay/capabilities.md +378 -0
- package/skills/jgengine-gameplay/reference-systems.md +60 -0
- package/skills/jgengine-world/SKILL.md +38 -0
- package/skills/jgengine-world/api.md +2652 -0
- package/skills/jgengine-world/capabilities.md +370 -0
- package/skills/jgengine-world/reference.md +222 -0
- package/dist/cartridge/runtime.d.ts +0 -15
- package/dist/cartridge/runtime.js +0 -556
- package/dist/cartridge/spec.d.ts +0 -188
- package/dist/cartridge/spec.js +0 -19
- package/dist/cartridge/validate.d.ts +0 -2
- package/dist/cartridge/validate.js +0 -78
- package/dist/store/engineStore.d.ts +0 -22
- package/dist/store/engineStore.js +0 -50
- package/dist/store/features.d.ts +0 -10
- package/dist/store/features.js +0 -23
- package/llms.txt +0 -5389
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/** Closest point on the segment `a`→`b` to point `p`, with the clamped parameter `t` (0 at `a`, 1 at `b`). */
|
|
2
|
+
export function closestPointOnSegment(p, a, b) {
|
|
3
|
+
const abx = b[0] - a[0];
|
|
4
|
+
const aby = b[1] - a[1];
|
|
5
|
+
const l2 = abx * abx + aby * aby;
|
|
6
|
+
const raw = l2 > 0 ? ((p[0] - a[0]) * abx + (p[1] - a[1]) * aby) / l2 : 0;
|
|
7
|
+
const t = raw < 0 ? 0 : raw > 1 ? 1 : raw;
|
|
8
|
+
return { point: [a[0] + t * abx, a[1] + t * aby], t };
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Circle (center + `radius`) against a capsule segment `a`→`b` of half-thickness `thickness` (0 for a thin
|
|
12
|
+
* wall). Returns the contact — surface normal, penetration depth, contact point, and the separated center —
|
|
13
|
+
* or `null` when they do not overlap. Endpoints are rounded (the segment is a capsule), so a ball never
|
|
14
|
+
* catches on a corner. Reflect the velocity across `normal` for the bounce; the pure geometry every 2D
|
|
15
|
+
* ball game (pinball, breakout, air hockey) reimplemented per wall, bumper, and paddle.
|
|
16
|
+
*/
|
|
17
|
+
export function circleVsSegment(center, radius, a, b, thickness = 0) {
|
|
18
|
+
const { point } = closestPointOnSegment(center, a, b);
|
|
19
|
+
const dx = center[0] - point[0];
|
|
20
|
+
const dy = center[1] - point[1];
|
|
21
|
+
const dist = Math.hypot(dx, dy);
|
|
22
|
+
const reach = radius + thickness;
|
|
23
|
+
if (dist >= reach)
|
|
24
|
+
return null;
|
|
25
|
+
let nx;
|
|
26
|
+
let ny;
|
|
27
|
+
if (dist > 1e-6) {
|
|
28
|
+
nx = dx / dist;
|
|
29
|
+
ny = dy / dist;
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
const segLen = Math.hypot(b[0] - a[0], b[1] - a[1]);
|
|
33
|
+
nx = segLen > 1e-6 ? -(b[1] - a[1]) / segLen : 0;
|
|
34
|
+
ny = segLen > 1e-6 ? (b[0] - a[0]) / segLen : 1;
|
|
35
|
+
}
|
|
36
|
+
const depth = reach - dist;
|
|
37
|
+
return {
|
|
38
|
+
normal: [nx, ny],
|
|
39
|
+
depth,
|
|
40
|
+
contact: point,
|
|
41
|
+
resolved: [point[0] + nx * reach, point[1] + ny * reach],
|
|
42
|
+
};
|
|
43
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `soil` studio: a crack/moss ground-variation patch authored as a box volume — its XZ footprint is
|
|
3
|
+
* the patch area, its top the ground height (same footprint convention as `grass_field`). Pure config
|
|
4
|
+
* here (crack scale/intensity/color, moss coverage/color, seed + a footprint resolver); the Worley
|
|
5
|
+
* (cellular) crack mask and FBM moss mask, injected via `onBeforeCompile` into a soil-patch material
|
|
6
|
+
* built from the same noise machinery as the terrain detail material, live in the `shell` renderer. An
|
|
7
|
+
* engine environment kind (like water/grass_field) so cracked, mossy ground is slider-authorable in
|
|
8
|
+
* the editor and persisted in `editor.scene.json` — the #815 soil studio.
|
|
9
|
+
*/
|
|
10
|
+
import { type ParamSchema, type SceneKindObject } from "../scene/sceneKinds.js";
|
|
11
|
+
/**
|
|
12
|
+
* The editor volume kind marking a box as a soil crack/moss patch.
|
|
13
|
+
* @capability soil-patch editor-authorable terrain crack/moss material variation
|
|
14
|
+
*/
|
|
15
|
+
export declare const SOIL_KIND = "soil";
|
|
16
|
+
/** Fully-defaulted soil params parsed from a volume's `meta`. */
|
|
17
|
+
export interface SoilRules {
|
|
18
|
+
/** Underlying dirt/soil base tint, hex. */
|
|
19
|
+
baseColor: string;
|
|
20
|
+
/** Worley cell size in meters — larger cells read as bigger cracked-earth plates. */
|
|
21
|
+
crackScale: number;
|
|
22
|
+
/** Crack-line color blended into the cell boundaries, hex. */
|
|
23
|
+
crackColor: string;
|
|
24
|
+
/** Crack blend strength, 0..1. */
|
|
25
|
+
crackIntensity: number;
|
|
26
|
+
/** Moss patch color, hex. */
|
|
27
|
+
mossColor: string;
|
|
28
|
+
/** Fraction of the patch covered by moss, 0..1. */
|
|
29
|
+
mossCoverage: number;
|
|
30
|
+
/** Seed string; same seed reproduces the same crack/moss layout. */
|
|
31
|
+
seed: string;
|
|
32
|
+
}
|
|
33
|
+
/** Soil defaults: sun-cracked dirt with light moss creep. */
|
|
34
|
+
export declare const SOIL_DEFAULTS: SoilRules;
|
|
35
|
+
/** The soil parameter schema — drives the inspector and `meta` parse via the studio seam. */
|
|
36
|
+
export declare const SOIL_SCHEMA: ParamSchema;
|
|
37
|
+
/** Parse a volume's `meta` into fully-defaulted soil rules. @internal */
|
|
38
|
+
export declare function readSoilRules(meta: Record<string, unknown> | undefined): SoilRules;
|
|
39
|
+
/** A resolved soil patch: world-space area center at ground height, footprint size (XZ), and rules. */
|
|
40
|
+
export interface ResolvedSoil {
|
|
41
|
+
center: readonly [number, number, number];
|
|
42
|
+
size: readonly [number, number];
|
|
43
|
+
rules: SoilRules;
|
|
44
|
+
}
|
|
45
|
+
/** Resolve a soil volume into an area footprint (from box half-extents / radius) at the box base. @internal */
|
|
46
|
+
export declare function resolveSoilObject(object: SceneKindObject): ResolvedSoil | null;
|
|
47
|
+
/** Registers the `soil` scene kind (schema + resolver). Called by {@link registerBuiltinSceneKinds}. @internal */
|
|
48
|
+
export declare function registerSoilKind(): void;
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `soil` studio: a crack/moss ground-variation patch authored as a box volume — its XZ footprint is
|
|
3
|
+
* the patch area, its top the ground height (same footprint convention as `grass_field`). Pure config
|
|
4
|
+
* here (crack scale/intensity/color, moss coverage/color, seed + a footprint resolver); the Worley
|
|
5
|
+
* (cellular) crack mask and FBM moss mask, injected via `onBeforeCompile` into a soil-patch material
|
|
6
|
+
* built from the same noise machinery as the terrain detail material, live in the `shell` renderer. An
|
|
7
|
+
* engine environment kind (like water/grass_field) so cracked, mossy ground is slider-authorable in
|
|
8
|
+
* the editor and persisted in `editor.scene.json` — the #815 soil studio.
|
|
9
|
+
*/
|
|
10
|
+
import { registerSceneKind } from "../scene/sceneKinds.js";
|
|
11
|
+
/**
|
|
12
|
+
* The editor volume kind marking a box as a soil crack/moss patch.
|
|
13
|
+
* @capability soil-patch editor-authorable terrain crack/moss material variation
|
|
14
|
+
*/
|
|
15
|
+
export const SOIL_KIND = "soil";
|
|
16
|
+
/** Soil defaults: sun-cracked dirt with light moss creep. */
|
|
17
|
+
export const SOIL_DEFAULTS = {
|
|
18
|
+
baseColor: "#8a7256",
|
|
19
|
+
crackScale: 3,
|
|
20
|
+
crackColor: "#42301f",
|
|
21
|
+
crackIntensity: 0.65,
|
|
22
|
+
mossColor: "#5c7a3a",
|
|
23
|
+
mossCoverage: 0.22,
|
|
24
|
+
seed: "",
|
|
25
|
+
};
|
|
26
|
+
/** The soil parameter schema — drives the inspector and `meta` parse via the studio seam. */
|
|
27
|
+
export const SOIL_SCHEMA = {
|
|
28
|
+
fields: [
|
|
29
|
+
{ type: "color", key: "baseColor", label: "base color", default: SOIL_DEFAULTS.baseColor },
|
|
30
|
+
{ type: "range", key: "crackScale", label: "crack scale", min: 0.5, max: 12, step: 0.25, default: SOIL_DEFAULTS.crackScale, unit: "m" },
|
|
31
|
+
{ type: "color", key: "crackColor", label: "crack color", default: SOIL_DEFAULTS.crackColor },
|
|
32
|
+
{ type: "range", key: "crackIntensity", label: "crack intensity", min: 0, max: 1, step: 0.02, default: SOIL_DEFAULTS.crackIntensity },
|
|
33
|
+
{ type: "color", key: "mossColor", label: "moss color", default: SOIL_DEFAULTS.mossColor },
|
|
34
|
+
{ type: "range", key: "mossCoverage", label: "moss coverage", min: 0, max: 1, step: 0.02, default: SOIL_DEFAULTS.mossCoverage },
|
|
35
|
+
{ type: "seed", key: "seed", label: "seed", default: "" },
|
|
36
|
+
],
|
|
37
|
+
};
|
|
38
|
+
function metaNumber(meta, key, fallback) {
|
|
39
|
+
const value = meta?.[key];
|
|
40
|
+
return typeof value === "number" && Number.isFinite(value) ? value : fallback;
|
|
41
|
+
}
|
|
42
|
+
function metaString(meta, key, fallback) {
|
|
43
|
+
const value = meta?.[key];
|
|
44
|
+
return typeof value === "string" ? value : fallback;
|
|
45
|
+
}
|
|
46
|
+
/** Parse a volume's `meta` into fully-defaulted soil rules. @internal */
|
|
47
|
+
export function readSoilRules(meta) {
|
|
48
|
+
return {
|
|
49
|
+
baseColor: metaString(meta, "baseColor", SOIL_DEFAULTS.baseColor),
|
|
50
|
+
crackScale: Math.max(0.1, metaNumber(meta, "crackScale", SOIL_DEFAULTS.crackScale)),
|
|
51
|
+
crackColor: metaString(meta, "crackColor", SOIL_DEFAULTS.crackColor),
|
|
52
|
+
crackIntensity: Math.min(1, Math.max(0, metaNumber(meta, "crackIntensity", SOIL_DEFAULTS.crackIntensity))),
|
|
53
|
+
mossColor: metaString(meta, "mossColor", SOIL_DEFAULTS.mossColor),
|
|
54
|
+
mossCoverage: Math.min(1, Math.max(0, metaNumber(meta, "mossCoverage", SOIL_DEFAULTS.mossCoverage))),
|
|
55
|
+
seed: metaString(meta, "seed", SOIL_DEFAULTS.seed),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
function axis(value) {
|
|
59
|
+
return typeof value === "number" && Number.isFinite(value) ? value : undefined;
|
|
60
|
+
}
|
|
61
|
+
/** Resolve a soil volume into an area footprint (from box half-extents / radius) at the box base. @internal */
|
|
62
|
+
export function resolveSoilObject(object) {
|
|
63
|
+
const center = object.center ?? object.position;
|
|
64
|
+
if (center === undefined)
|
|
65
|
+
return null;
|
|
66
|
+
const he = object.halfExtents;
|
|
67
|
+
const radius = object.radius;
|
|
68
|
+
const halfX = axis(he?.x) ?? radius ?? 6;
|
|
69
|
+
const halfZ = axis(he?.z) ?? radius ?? 6;
|
|
70
|
+
const halfY = axis(he?.y) ?? 0;
|
|
71
|
+
return {
|
|
72
|
+
center: [center.x, center.y - halfY, center.z],
|
|
73
|
+
size: [Math.max(0.5, halfX * 2), Math.max(0.5, halfZ * 2)],
|
|
74
|
+
rules: readSoilRules(object.meta),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/** Registers the `soil` scene kind (schema + resolver). Called by {@link registerBuiltinSceneKinds}. @internal */
|
|
78
|
+
export function registerSoilKind() {
|
|
79
|
+
registerSceneKind({
|
|
80
|
+
kind: SOIL_KIND,
|
|
81
|
+
target: "volume",
|
|
82
|
+
label: "Soil patch",
|
|
83
|
+
addCategory: "Studios",
|
|
84
|
+
accent: "#8a6d4a",
|
|
85
|
+
schema: SOIL_SCHEMA,
|
|
86
|
+
resolve: (object) => resolveSoilObject(object),
|
|
87
|
+
note: (object) => {
|
|
88
|
+
const resolved = resolveSoilObject(object);
|
|
89
|
+
return resolved === null ? "Give the volume a box footprint." : `${Math.round(resolved.size[0])}×${Math.round(resolved.size[1])} m patch`;
|
|
90
|
+
},
|
|
91
|
+
});
|
|
92
|
+
}
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
import { type Aabb, type Vec2 } from "./geometry.js";
|
|
2
|
+
/**
|
|
3
|
+
* Deterministic spatial sampling — draw one or many positions from a geometric region under
|
|
4
|
+
* explicit constraints, with an injected RNG, bounded attempts, and a structured pass/fail result.
|
|
5
|
+
*
|
|
6
|
+
* The three concerns stay separate on purpose (issue #940): a {@link SampleRegion} owns *where and
|
|
7
|
+
* how* candidates are drawn (its distribution policy — area- vs radial-uniform, edge-biased, weighted
|
|
8
|
+
* subregions); {@link SampleConstraints} own *which* candidates survive (include/exclude regions,
|
|
9
|
+
* keep-out distance via disc/sphere exclusions, caller predicates, surface projection, minimum
|
|
10
|
+
* separation); and {@link samplePoint}/{@link sampleBatch} own *how hard we try* (attempt budget and
|
|
11
|
+
* fallback policy). Nothing silently accepts an invalid point — exhaustion is reported, not hidden.
|
|
12
|
+
*/
|
|
13
|
+
/** A 3D point `[x, y, z]` — the volume/surface counterpart to {@link Vec2}. */
|
|
14
|
+
export type Point3 = readonly [number, number, number];
|
|
15
|
+
/** A sampled point: 2D `[x, z]` or 3D `[x, y, z]`. Every point in one run shares its dimensionality. */
|
|
16
|
+
export type SamplePoint = readonly number[];
|
|
17
|
+
/**
|
|
18
|
+
* A geometric region a sampler can draw from. Built-ins cover point sets, rect/box, circle/sphere,
|
|
19
|
+
* annulus/shell, polygon, and weighted composites; {@link customRegion} wraps a caller-defined
|
|
20
|
+
* sampler + bounds. `sample` draws one raw candidate under the region's own distribution policy;
|
|
21
|
+
* `contains` is the membership test reused for include/exclude constraints and rejection.
|
|
22
|
+
*/
|
|
23
|
+
export interface SampleRegion<P extends SamplePoint = SamplePoint> {
|
|
24
|
+
/** 2 for planar regions (`[x, z]`), 3 for volumetric/surface regions (`[x, y, z]`). */
|
|
25
|
+
readonly dimensions: 2 | 3;
|
|
26
|
+
/** True when the region can never yield a point (degenerate size, empty set) — reported, not sampled. */
|
|
27
|
+
readonly isEmpty: boolean;
|
|
28
|
+
/** Draw one raw candidate using `rng` (may still fail constraints). Consumes a fixed number of draws. */
|
|
29
|
+
sample(rng: () => number): P;
|
|
30
|
+
/** Membership test on the XZ (or XYZ) footprint — powers include gates and exclude keep-outs. */
|
|
31
|
+
contains(point: P): boolean;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Post-draw gates a candidate must clear. All are optional; an empty constraint set accepts every
|
|
35
|
+
* in-region draw. `exclude` discs/spheres are the keep-out distance primitive ("no closer than R to
|
|
36
|
+
* this center"); `accept` is a free-form caller predicate (biome, slope, ownership); `project` snaps
|
|
37
|
+
* a candidate onto a surface/navmesh before validation and may reject by returning `null`.
|
|
38
|
+
*/
|
|
39
|
+
export interface SampleConstraints<P extends SamplePoint = SamplePoint> {
|
|
40
|
+
/** Candidate must lie inside *every* listed region (intersection); omit for no inclusion gate. */
|
|
41
|
+
include?: readonly SampleRegion<P>[];
|
|
42
|
+
/** Candidate must lie outside *every* listed region — the keep-out/exclusion set. */
|
|
43
|
+
exclude?: readonly SampleRegion<P>[];
|
|
44
|
+
/** Extra caller acceptance test applied last; `false` rejects the candidate. */
|
|
45
|
+
accept?: (point: P) => boolean;
|
|
46
|
+
/** Optional surface/navmesh projection applied before validation; `null` rejects the candidate. */
|
|
47
|
+
project?: (point: P) => P | null;
|
|
48
|
+
/** Reject a candidate within this Euclidean distance of an already-accepted point in the same run. */
|
|
49
|
+
minSeparation?: number;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* What to return when the attempt budget is exhausted. `"none"` yields no point (honest failure);
|
|
53
|
+
* `"last-candidate"` returns the final rejected draw (post-projection); `{ point }` returns a caller
|
|
54
|
+
* fixed fallback (a hand-placed safe spot). Explicit, so a caller never mistakes a fallback for a hit.
|
|
55
|
+
*/
|
|
56
|
+
export type FallbackPolicy<P extends SamplePoint = SamplePoint> = "none" | "last-candidate" | {
|
|
57
|
+
readonly point: P;
|
|
58
|
+
};
|
|
59
|
+
/** Why a sample ended: a clean hit, budget exhausted, or the region was degenerate. */
|
|
60
|
+
export type SampleReason = "accepted" | "exhausted" | "empty-region";
|
|
61
|
+
/** Structured single-sample outcome — never a bare point, so failure and fallback are visible. */
|
|
62
|
+
export interface SampleResult<P extends SamplePoint = SamplePoint> {
|
|
63
|
+
/** True only for `"accepted"` — a genuine in-constraints hit (fallbacks are never `ok`). */
|
|
64
|
+
readonly ok: boolean;
|
|
65
|
+
/** The accepted point, or the fallback point, or `null` when no fallback applied. */
|
|
66
|
+
readonly point: P | null;
|
|
67
|
+
/** How many candidates were drawn (0 for an empty region). */
|
|
68
|
+
readonly attempts: number;
|
|
69
|
+
/** Outcome classification. */
|
|
70
|
+
readonly reason: SampleReason;
|
|
71
|
+
/** True when `point` came from the fallback policy rather than a passing draw. */
|
|
72
|
+
readonly usedFallback: boolean;
|
|
73
|
+
}
|
|
74
|
+
/** Inputs for a single {@link samplePoint} draw. */
|
|
75
|
+
export interface SamplePointOptions<P extends SamplePoint = SamplePoint> {
|
|
76
|
+
region: SampleRegion<P>;
|
|
77
|
+
/** Injected deterministic RNG in `[0, 1)`; same stream → same result. */
|
|
78
|
+
rng: () => number;
|
|
79
|
+
constraints?: SampleConstraints<P>;
|
|
80
|
+
/** Maximum candidates to draw before giving up. Default 30. Bounds the work. */
|
|
81
|
+
maxAttempts?: number;
|
|
82
|
+
/** What to return on exhaustion. Default `"none"`. */
|
|
83
|
+
fallback?: FallbackPolicy<P>;
|
|
84
|
+
/** Already-placed points the new point must respect `minSeparation` against (batch threads this). */
|
|
85
|
+
placed?: readonly P[];
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Draw one point from `region` that clears every constraint, retrying up to `maxAttempts` times with
|
|
89
|
+
* the injected `rng`, then apply the `fallback` policy. Returns a structured {@link SampleResult} —
|
|
90
|
+
* a clean hit is `ok: true`; exhaustion or a degenerate region is reported with the attempt count and
|
|
91
|
+
* an explicit fallback flag, never a silently-accepted bad point.
|
|
92
|
+
*
|
|
93
|
+
* @capability spatial-sample draw one deterministic position from a region under include/exclude/distance constraints
|
|
94
|
+
*/
|
|
95
|
+
export declare function samplePoint<P extends SamplePoint>(options: SamplePointOptions<P>): SampleResult<P>;
|
|
96
|
+
/** Inputs for a {@link sampleBatch} draw of many spaced points. */
|
|
97
|
+
export interface SampleBatchOptions<P extends SamplePoint = SamplePoint> {
|
|
98
|
+
region: SampleRegion<P>;
|
|
99
|
+
rng: () => number;
|
|
100
|
+
/** How many points to place. */
|
|
101
|
+
count: number;
|
|
102
|
+
constraints?: SampleConstraints<P>;
|
|
103
|
+
/** Attempt budget **per point**. Default 30. */
|
|
104
|
+
maxAttempts?: number;
|
|
105
|
+
}
|
|
106
|
+
/** Structured batch outcome: the placed points plus whether the full count was met. */
|
|
107
|
+
export interface SampleBatchResult<P extends SamplePoint = SamplePoint> {
|
|
108
|
+
/** Accepted points in deterministic draw order. */
|
|
109
|
+
readonly points: readonly P[];
|
|
110
|
+
/** The requested count. */
|
|
111
|
+
readonly requested: number;
|
|
112
|
+
/** How many were actually placed (`<= requested`). */
|
|
113
|
+
readonly placed: number;
|
|
114
|
+
/** True when `placed === requested`. */
|
|
115
|
+
readonly complete: boolean;
|
|
116
|
+
/** Total candidates drawn across all points. */
|
|
117
|
+
readonly attempts: number;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Place up to `count` points from `region`, each clearing the shared constraints and honoring
|
|
121
|
+
* `minSeparation` against every point already placed in this batch (via a spatial hash, not an
|
|
122
|
+
* O(n²) scan). Order is deterministic for a given `rng` stream. Batches never silently under-fill:
|
|
123
|
+
* the result reports `placed`, `complete`, and the total attempt count.
|
|
124
|
+
*
|
|
125
|
+
* @capability spatial-sample-batch place many deterministic spaced points from a region with minimum separation
|
|
126
|
+
*/
|
|
127
|
+
export declare function sampleBatch<P extends SamplePoint>(options: SampleBatchOptions<P>): SampleBatchResult<P>;
|
|
128
|
+
/** Fill policy for a circle/ring: `"area"` = area-uniform (even density); `"radial"` = radius-uniform (clumps toward center). */
|
|
129
|
+
export type RadialDistribution = "area" | "radial";
|
|
130
|
+
/** Fill policy for a sphere/shell: `"volume"` = volume-uniform (even density); `"radial"` = radius-uniform. */
|
|
131
|
+
export type VolumeDistribution = "volume" | "radial";
|
|
132
|
+
/** Fill policy for a rect/box: `"uniform"` = even coverage; `"edge"` = biased to a boundary band. */
|
|
133
|
+
export type AreaDistribution = "uniform" | "edge";
|
|
134
|
+
/** A weighted member of a {@link weightedRegion} composite. */
|
|
135
|
+
export interface WeightedRegionEntry<P extends SamplePoint = SamplePoint> {
|
|
136
|
+
region: SampleRegion<P>;
|
|
137
|
+
/** Relative selection weight; non-positive entries are never chosen. */
|
|
138
|
+
weight: number;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* A fixed set of candidate points sampled by (optionally weighted) selection — the "spawn point
|
|
142
|
+
* table" region. `contains` is exact membership. Empty when the set is empty.
|
|
143
|
+
*
|
|
144
|
+
* @capability spatial-region-point-set sample from a fixed, optionally weighted candidate point table
|
|
145
|
+
*/
|
|
146
|
+
export declare function pointSetRegion(points: readonly Vec2[], options?: {
|
|
147
|
+
weights?: readonly number[];
|
|
148
|
+
}): SampleRegion<Vec2>;
|
|
149
|
+
/**
|
|
150
|
+
* An axis-aligned rectangle on the XZ plane. `"uniform"` spreads evenly (draws x then z);
|
|
151
|
+
* `"edge"` biases onto a boundary band of `edgeThickness` meters (perimeter-weighted side, then
|
|
152
|
+
* inward depth) — the two are never conflated, the caller opts in.
|
|
153
|
+
*/
|
|
154
|
+
export declare function rectRegion(area: Aabb, options?: {
|
|
155
|
+
distribution?: AreaDistribution;
|
|
156
|
+
edgeThickness?: number;
|
|
157
|
+
}): SampleRegion<Vec2>;
|
|
158
|
+
/**
|
|
159
|
+
* A filled circle. `"area"` is area-uniform (√-corrected radius, even density); `"radial"` is
|
|
160
|
+
* radius-uniform (clumps toward the center). Angle is drawn first, then radius — matching the common
|
|
161
|
+
* `angle = rng()·2π; r = rng()·R` idiom so migrations keep their stream.
|
|
162
|
+
*/
|
|
163
|
+
export declare function discRegion(center: Vec2, radius: number, options?: {
|
|
164
|
+
distribution?: RadialDistribution;
|
|
165
|
+
}): SampleRegion<Vec2>;
|
|
166
|
+
/**
|
|
167
|
+
* A ring (annulus) between `innerRadius` and `outerRadius`. `"area"` fills the band with even
|
|
168
|
+
* density; `"radial"` spreads uniformly in radius. Angle first, then radius.
|
|
169
|
+
*/
|
|
170
|
+
export declare function annulusRegion(center: Vec2, innerRadius: number, outerRadius: number, options?: {
|
|
171
|
+
distribution?: RadialDistribution;
|
|
172
|
+
}): SampleRegion<Vec2>;
|
|
173
|
+
/**
|
|
174
|
+
* An arbitrary closed polygon on the XZ plane. Candidates are drawn uniformly from the polygon's
|
|
175
|
+
* bounding box and gated by point-in-polygon `contains`, so a run's draw count stays fixed (the
|
|
176
|
+
* sampler's attempt budget bounds the rejection, not a hidden inner loop).
|
|
177
|
+
*
|
|
178
|
+
* @capability spatial-region-polygon sample within an arbitrary closed polygon on the XZ plane
|
|
179
|
+
*/
|
|
180
|
+
export declare function polygonRegion(polygon: readonly Vec2[]): SampleRegion<Vec2>;
|
|
181
|
+
/**
|
|
182
|
+
* A composite that first picks one member by weight, then delegates to its sampler — the
|
|
183
|
+
* "weighted subregions" distribution policy. `contains` is true when any member contains the point.
|
|
184
|
+
*
|
|
185
|
+
* @capability spatial-region-weighted compose sub-regions behind a weighted selection policy
|
|
186
|
+
*/
|
|
187
|
+
export declare function weightedRegion<P extends SamplePoint>(entries: readonly WeightedRegionEntry<P>[]): SampleRegion<P>;
|
|
188
|
+
/**
|
|
189
|
+
* Wrap a caller-defined sampler and bounds test as a {@link SampleRegion} — the escape hatch for
|
|
190
|
+
* regions the built-ins do not cover (a navmesh cell, a heightfield mask, a spline tube).
|
|
191
|
+
*
|
|
192
|
+
* @capability spatial-region-custom wrap a caller-defined sampler and bounds test as a region
|
|
193
|
+
*/
|
|
194
|
+
export declare function customRegion<P extends SamplePoint>(spec: {
|
|
195
|
+
dimensions: 2 | 3;
|
|
196
|
+
sample: (rng: () => number) => P;
|
|
197
|
+
contains: (point: P) => boolean;
|
|
198
|
+
isEmpty?: boolean;
|
|
199
|
+
}): SampleRegion<P>;
|
|
200
|
+
/**
|
|
201
|
+
* An axis-aligned box `[min..max]` in 3D. Uniform density; draws x, y, z in order.
|
|
202
|
+
*
|
|
203
|
+
* @capability spatial-region-box sample uniformly within an axis-aligned 3D box
|
|
204
|
+
*/
|
|
205
|
+
export declare function boxRegion(min: Point3, max: Point3): SampleRegion<Point3>;
|
|
206
|
+
/**
|
|
207
|
+
* A filled ball. `"volume"` is volume-uniform (∛-corrected radius); `"radial"` is radius-uniform.
|
|
208
|
+
* Direction is drawn first (two draws), then radius.
|
|
209
|
+
*
|
|
210
|
+
* @capability spatial-region-sphere sample within a filled 3D ball, volume- or radius-uniform
|
|
211
|
+
*/
|
|
212
|
+
export declare function sphereRegion(center: Point3, radius: number, options?: {
|
|
213
|
+
distribution?: VolumeDistribution;
|
|
214
|
+
}): SampleRegion<Point3>;
|
|
215
|
+
/**
|
|
216
|
+
* A spherical shell between `innerRadius` and `outerRadius`. `"volume"` fills the shell with even
|
|
217
|
+
* density; `"radial"` spreads uniformly in radius. Direction first, then radius.
|
|
218
|
+
*
|
|
219
|
+
* @capability spatial-region-shell sample within a 3D spherical shell, volume- or radius-uniform
|
|
220
|
+
*/
|
|
221
|
+
export declare function shellRegion(center: Point3, innerRadius: number, outerRadius: number, options?: {
|
|
222
|
+
distribution?: VolumeDistribution;
|
|
223
|
+
}): SampleRegion<Point3>;
|
|
224
|
+
/** Inputs for {@link sampleStratified}: a grid over `area` with one jittered point per cell. */
|
|
225
|
+
export interface StratifiedOptions {
|
|
226
|
+
area: Aabb;
|
|
227
|
+
rng: () => number;
|
|
228
|
+
/** Grid columns (X) and rows (Z). */
|
|
229
|
+
cols: number;
|
|
230
|
+
rows: number;
|
|
231
|
+
/** Cell jitter 0..1 — 0 is a rigid lattice, 1 fills the whole cell. Default 1. */
|
|
232
|
+
jitter?: number;
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Stratified 2D sampling: one jittered point per grid cell over `area`, in deterministic row-major
|
|
236
|
+
* order. Unlike pure rejection sampling this guarantees even coverage (no clumps, no gaps) — the
|
|
237
|
+
* distinct "stratified" distribution policy, kept separate from area-uniform draws.
|
|
238
|
+
*
|
|
239
|
+
* @capability spatial-sample-stratified evenly cover an area with one jittered point per grid cell, deterministic
|
|
240
|
+
*/
|
|
241
|
+
export declare function sampleStratified(options: StratifiedOptions): Vec2[];
|