@jgengine/core 0.9.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +34 -3
- package/LICENSE +203 -661
- package/README.md +1 -1
- package/dist/ai/crowd.d.ts +55 -0
- package/dist/ai/crowd.js +114 -0
- package/dist/ai/flock.d.ts +5 -2
- package/dist/ai/flock.js +5 -2
- package/dist/ai/groupAssist.d.ts +1 -0
- package/dist/ai/groupAssist.js +1 -0
- package/dist/ai/heatSystem.d.ts +76 -0
- package/dist/ai/heatSystem.js +97 -0
- package/dist/ai/interestScheduler.d.ts +107 -0
- package/dist/ai/interestScheduler.js +118 -0
- package/dist/ai/jobBoard.d.ts +1 -0
- package/dist/ai/jobBoard.js +1 -0
- package/dist/ai/laneSelect.d.ts +5 -2
- package/dist/ai/laneSelect.js +5 -2
- package/dist/ai/mobBrain.d.ts +1 -0
- package/dist/ai/mobBrain.js +1 -0
- package/dist/ai/spawnDirector.d.ts +19 -1
- package/dist/ai/spawnDirector.js +53 -26
- package/dist/ai/spawnPoint.d.ts +7 -0
- package/dist/ai/spawnPoint.js +7 -0
- package/dist/ai/targetAcquisition.d.ts +84 -0
- package/dist/ai/targetAcquisition.js +92 -0
- package/dist/anim/easing.d.ts +19 -0
- package/dist/anim/easing.js +19 -0
- package/dist/anim/oscillator.d.ts +12 -0
- package/dist/anim/oscillator.js +25 -0
- package/dist/area/areaEffectField.d.ts +127 -0
- package/dist/area/areaEffectField.js +175 -0
- package/dist/area/stackPolicy.d.ts +47 -0
- package/dist/area/stackPolicy.js +99 -0
- package/dist/audio/audioFalloff.d.ts +5 -2
- package/dist/audio/music.d.ts +53 -0
- package/dist/audio/music.js +34 -0
- package/dist/audio/synth.d.ts +60 -0
- package/dist/audio/synth.js +8 -0
- package/dist/authoring.d.ts +15 -0
- package/dist/authoring.js +15 -0
- package/dist/board/laneBoard.d.ts +13 -0
- package/dist/board/laneBoard.js +13 -0
- package/dist/board/timelineBoard.d.ts +10 -0
- package/dist/board/timelineBoard.js +10 -0
- package/dist/combat/abilityKit.d.ts +18 -0
- package/dist/combat/abilityKit.js +24 -9
- package/dist/combat/animationState.d.ts +5 -0
- package/dist/combat/animationState.js +5 -0
- package/dist/combat/breakMeters.d.ts +10 -0
- package/dist/combat/breakMeters.js +10 -0
- package/dist/combat/castRunner.d.ts +5 -0
- package/dist/combat/castRunner.js +5 -0
- package/dist/combat/comboPoints.d.ts +5 -0
- package/dist/combat/comboPoints.js +5 -0
- package/dist/combat/comboString.d.ts +5 -0
- package/dist/combat/comboString.js +5 -0
- package/dist/combat/damageInterceptors.d.ts +192 -0
- package/dist/combat/damageInterceptors.js +251 -0
- package/dist/combat/damageMatchup.d.ts +68 -0
- package/dist/combat/damageMatchup.js +42 -0
- package/dist/combat/damageResolution.d.ts +63 -0
- package/dist/combat/damageResolution.js +50 -0
- package/dist/combat/death.d.ts +7 -1
- package/dist/combat/death.js +5 -0
- package/dist/combat/deathReason.d.ts +14 -0
- package/dist/combat/deathReason.js +1 -0
- package/dist/combat/defensiveWindow.d.ts +5 -0
- package/dist/combat/defensiveWindow.js +5 -0
- package/dist/combat/dotField.d.ts +47 -0
- package/dist/combat/dotField.js +52 -0
- package/dist/combat/downed.d.ts +5 -0
- package/dist/combat/downed.js +5 -0
- package/dist/combat/effects.d.ts +5 -0
- package/dist/combat/effects.js +5 -0
- package/dist/combat/encounterSequence.d.ts +258 -0
- package/dist/combat/encounterSequence.js +426 -0
- package/dist/combat/hitReaction.d.ts +57 -1
- package/dist/combat/hitReaction.js +45 -5
- package/dist/combat/magazine.d.ts +54 -0
- package/dist/combat/magazine.js +96 -0
- package/dist/combat/projectiles.d.ts +7 -2
- package/dist/combat/projectiles.js +48 -17
- package/dist/combat/receivedDamage.d.ts +117 -0
- package/dist/combat/receivedDamage.js +92 -0
- package/dist/combat/regenShield.d.ts +39 -0
- package/dist/combat/regenShield.js +49 -0
- package/dist/combat/renderCues.d.ts +51 -0
- package/dist/combat/renderCues.js +44 -0
- package/dist/combat/resourcePool.d.ts +5 -0
- package/dist/combat/resourcePool.js +5 -0
- package/dist/combat/rewardAllocation.d.ts +121 -0
- package/dist/combat/rewardAllocation.js +251 -0
- package/dist/combat/shotOrigin.d.ts +30 -1
- package/dist/combat/shotOrigin.js +70 -2
- package/dist/combat/statusApplication.d.ts +96 -0
- package/dist/combat/statusApplication.js +81 -0
- package/dist/combat/telegraph.d.ts +11 -2
- package/dist/combat/telegraph.js +11 -2
- package/dist/combat/thresholdCrossings.d.ts +85 -0
- package/dist/combat/thresholdCrossings.js +116 -0
- package/dist/combat.d.ts +34 -0
- package/dist/combat.js +34 -0
- package/dist/commands/commandRegistry.d.ts +11 -0
- package/dist/commands/commandRegistry.js +9 -2
- package/dist/crafting/crop.d.ts +18 -0
- package/dist/crafting/crop.js +18 -0
- package/dist/crafting/production.d.ts +5 -0
- package/dist/crafting/production.js +5 -0
- package/dist/devtools/rewriteTunables.d.ts +17 -0
- package/dist/devtools/rewriteTunables.js +276 -0
- package/dist/devtools/saveEndpoint.d.ts +46 -0
- package/dist/devtools/saveEndpoint.js +48 -0
- package/dist/devtools/transformTunables.d.ts +3 -0
- package/dist/devtools/transformTunables.js +3 -0
- package/dist/devtools/tunableSchema.d.ts +31 -0
- package/dist/devtools/tunableSchema.js +31 -0
- package/dist/economy/currency.d.ts +12 -1
- package/dist/economy/currency.js +12 -1
- package/dist/economy/listingBook.d.ts +91 -0
- package/dist/economy/listingBook.js +144 -0
- package/dist/economy/resourceLedger.d.ts +222 -0
- package/dist/economy/resourceLedger.js +353 -0
- package/dist/economy/sharedWallet.d.ts +14 -0
- package/dist/economy/sharedWallet.js +14 -0
- package/dist/economy/techTree.d.ts +12 -0
- package/dist/economy/techTree.js +12 -0
- package/dist/economy/wallet.d.ts +26 -2
- package/dist/economy/wallet.js +35 -6
- package/dist/editor/commands.d.ts +248 -0
- package/dist/editor/commands.js +865 -0
- package/dist/editor/document.d.ts +186 -0
- package/dist/editor/document.js +884 -0
- package/dist/editor/grid.d.ts +229 -0
- package/dist/editor/grid.js +366 -0
- package/dist/editor/gridAdapters.d.ts +80 -0
- package/dist/editor/gridAdapters.js +134 -0
- package/dist/editor/index.d.ts +97 -0
- package/dist/editor/index.js +10 -0
- package/dist/editor/liveSync.d.ts +127 -0
- package/dist/editor/liveSync.js +249 -0
- package/dist/editor/runtimeInspector.d.ts +88 -0
- package/dist/editor/runtimeInspector.js +239 -0
- package/dist/editor/types.d.ts +175 -0
- package/dist/editor/types.js +29 -0
- package/dist/faction/reputation.d.ts +5 -0
- package/dist/faction/reputation.js +5 -0
- package/dist/format/distance.d.ts +17 -0
- package/dist/format/distance.js +18 -0
- package/dist/format/duration.d.ts +27 -0
- package/dist/format/duration.js +45 -0
- package/dist/format/speed.d.ts +17 -0
- package/dist/format/speed.js +25 -0
- package/dist/game/connectedPlayers.d.ts +30 -0
- package/dist/game/connectedPlayers.js +21 -0
- package/dist/game/cosmetics.d.ts +9 -0
- package/dist/game/cosmetics.js +16 -0
- package/dist/game/defineGame.d.ts +141 -2
- package/dist/game/defineGame.js +39 -1
- package/dist/game/defineSystem.d.ts +88 -0
- package/dist/game/defineSystem.js +45 -0
- package/dist/game/dialogue.d.ts +33 -0
- package/dist/game/dialogue.js +21 -0
- package/dist/game/events.d.ts +50 -13
- package/dist/game/events.js +5 -0
- package/dist/game/feed.d.ts +33 -0
- package/dist/game/feed.js +35 -2
- package/dist/game/gamePhase.d.ts +11 -0
- package/dist/game/gamePhase.js +16 -0
- package/dist/game/keyValueStore.d.ts +25 -0
- package/dist/game/keyValueStore.js +61 -0
- package/dist/game/leaderboard.d.ts +5 -0
- package/dist/game/leaderboard.js +5 -0
- package/dist/game/levelSequence.d.ts +24 -2
- package/dist/game/levelSequence.js +51 -2
- package/dist/game/loadout.d.ts +5 -0
- package/dist/game/loadout.js +5 -0
- package/dist/game/lootFilter.d.ts +2 -0
- package/dist/game/lootFilter.js +2 -0
- package/dist/game/lootPipeline.d.ts +164 -0
- package/dist/game/lootPipeline.js +216 -0
- package/dist/game/lootTable.d.ts +21 -0
- package/dist/game/lootTable.js +15 -4
- package/dist/game/modelAnimation.d.ts +8 -0
- package/dist/game/modelAnimation.js +18 -0
- package/dist/game/objectives.d.ts +43 -0
- package/dist/game/objectives.js +36 -0
- package/dist/game/paramLayers.d.ts +148 -0
- package/dist/game/paramLayers.js +185 -0
- package/dist/game/ping.d.ts +5 -0
- package/dist/game/ping.js +5 -0
- package/dist/game/playableGame.d.ts +160 -12
- package/dist/game/quest.d.ts +8 -0
- package/dist/game/quest.js +29 -0
- package/dist/game/race.d.ts +141 -0
- package/dist/game/race.js +169 -0
- package/dist/game/recordBook.d.ts +5 -5
- package/dist/game/recordBook.js +4 -1
- package/dist/game/ruleSelection.d.ts +75 -0
- package/dist/game/ruleSelection.js +127 -0
- package/dist/game/runDraft.d.ts +5 -0
- package/dist/game/runDraft.js +5 -0
- package/dist/game/saveStore.d.ts +111 -0
- package/dist/game/saveStore.js +312 -0
- package/dist/game/snapshotHistory.d.ts +67 -0
- package/dist/game/snapshotHistory.js +95 -0
- package/dist/game/social.d.ts +38 -1
- package/dist/game/social.js +71 -0
- package/dist/game/spawnPoints.d.ts +5 -0
- package/dist/game/spawnPoints.js +5 -0
- package/dist/game/systemRuntime.d.ts +50 -0
- package/dist/game/systemRuntime.js +157 -0
- package/dist/game/systemSchedule.d.ts +72 -0
- package/dist/game/systemSchedule.js +242 -0
- package/dist/game/toasts.d.ts +43 -0
- package/dist/game/toasts.js +44 -0
- package/dist/game/trade.d.ts +10 -0
- package/dist/game/trade.js +10 -0
- package/dist/game/unlocks.d.ts +8 -0
- package/dist/game/unlocks.js +16 -0
- package/dist/game/vfxInstance.d.ts +138 -0
- package/dist/game/vfxInstance.js +96 -0
- package/dist/game/worldItem.d.ts +17 -4
- package/dist/game/worldItem.js +17 -4
- package/dist/gameplay.d.ts +91 -0
- package/dist/gameplay.js +91 -0
- package/dist/index.d.ts +5 -7
- package/dist/index.js +5 -7
- package/dist/input/actionBindings.d.ts +24 -5
- package/dist/input/actionBindings.js +23 -5
- package/dist/input/axisInput.d.ts +13 -1
- package/dist/input/axisInput.js +22 -1
- package/dist/input/controlGroups.d.ts +67 -0
- package/dist/input/controlGroups.js +41 -0
- package/dist/input/touchScheme.d.ts +82 -6
- package/dist/input/touchScheme.js +123 -10
- package/dist/interaction/contextMenu.d.ts +1 -0
- package/dist/interaction/contextMenu.js +1 -0
- package/dist/interaction/lockpick.d.ts +61 -0
- package/dist/interaction/lockpick.js +168 -0
- package/dist/interaction/proximityPrompt.d.ts +5 -1
- package/dist/interaction/proximityPrompt.js +5 -3
- package/dist/interaction/qte.d.ts +5 -0
- package/dist/interaction/qte.js +5 -0
- package/dist/interaction/skillCheck.d.ts +5 -0
- package/dist/interaction/skillCheck.js +5 -0
- package/dist/inventory/inventoryModel.d.ts +12 -0
- package/dist/inventory/inventoryModel.js +12 -0
- package/dist/inventory/shapedGrid.d.ts +16 -0
- package/dist/inventory/shapedGrid.js +16 -0
- package/dist/inventory/slotModel.d.ts +10 -0
- package/dist/inventory/slotModel.js +10 -0
- package/dist/item/durability.d.ts +5 -0
- package/dist/item/durability.js +5 -0
- package/dist/item/itemIdentity.d.ts +171 -0
- package/dist/item/itemIdentity.js +138 -0
- package/dist/item/itemInstanceRegistry.d.ts +32 -0
- package/dist/item/itemInstanceRegistry.js +34 -0
- package/dist/item/itemgen.d.ts +163 -0
- package/dist/item/itemgen.js +151 -0
- package/dist/item/modularItem.d.ts +5 -0
- package/dist/item/modularItem.js +5 -0
- package/dist/item/use.d.ts +5 -0
- package/dist/item/use.js +5 -0
- package/dist/item/useBehavior.d.ts +142 -0
- package/dist/item/useBehavior.js +105 -0
- package/dist/item/weapon.d.ts +5 -0
- package/dist/item/weapon.js +5 -0
- package/dist/math/scalar.d.ts +25 -0
- package/dist/math/scalar.js +47 -0
- package/dist/meta/changelog.d.ts +4 -1
- package/dist/meta/changelog.js +36 -1
- package/dist/movement/avoidance.d.ts +45 -0
- package/dist/movement/avoidance.js +123 -0
- package/dist/movement/cameraRig.d.ts +8 -0
- package/dist/movement/cameraRig.js +8 -0
- package/dist/movement/dash.d.ts +11 -0
- package/dist/movement/dash.js +11 -0
- package/dist/movement/formation.d.ts +135 -0
- package/dist/movement/formation.js +194 -0
- package/dist/movement/glideModel.d.ts +5 -0
- package/dist/movement/glideModel.js +5 -0
- package/dist/movement/grappleSwing.d.ts +5 -0
- package/dist/movement/grappleSwing.js +5 -0
- package/dist/movement/leaderTrail.d.ts +5 -0
- package/dist/movement/leaderTrail.js +5 -0
- package/dist/movement/movementModel.d.ts +38 -7
- package/dist/movement/movementModel.js +54 -13
- package/dist/movement/playerMovement.d.ts +41 -0
- package/dist/movement/playerMovement.js +236 -0
- package/dist/movement/poseState.d.ts +13 -0
- package/dist/movement/poseState.js +16 -0
- package/dist/movement/steering.d.ts +8 -0
- package/dist/movement/steering.js +18 -0
- package/dist/multiplayer/combatSnapshot.d.ts +3 -0
- package/dist/multiplayer/combatSnapshot.js +3 -0
- package/dist/multiplayer/lagCompensation.d.ts +5 -0
- package/dist/multiplayer/lagCompensation.js +5 -0
- package/dist/multiplayer/presenceModel.d.ts +9 -1
- package/dist/multiplayer/presenceModel.js +9 -1
- package/dist/multiplayer/simultaneousCommit.d.ts +3 -0
- package/dist/multiplayer/simultaneousCommit.js +3 -0
- package/dist/multiplayer.d.ts +11 -0
- package/dist/multiplayer.js +11 -0
- package/dist/nav/pathFollow.d.ts +57 -0
- package/dist/nav/pathFollow.js +109 -0
- package/dist/orders/orderKinds.d.ts +156 -0
- package/dist/orders/orderKinds.js +197 -0
- package/dist/orders/orderQueue.d.ts +208 -0
- package/dist/orders/orderQueue.js +211 -0
- package/dist/physics/drivableVehicle.d.ts +29 -0
- package/dist/physics/drivableVehicle.js +16 -0
- package/dist/physics/kinematicVehicle.d.ts +21 -1
- package/dist/physics/kinematicVehicle.js +23 -8
- package/dist/physics/physicsWorld.d.ts +24 -12
- package/dist/physics/physicsWorld.js +11 -5
- package/dist/physics/radialImpulse.d.ts +25 -0
- package/dist/physics/radialImpulse.js +27 -0
- package/dist/procedural.d.ts +3 -0
- package/dist/procedural.js +3 -0
- package/dist/progression/statGraph.d.ts +116 -0
- package/dist/progression/statGraph.js +318 -0
- package/dist/puzzle/cellGrid.d.ts +9 -0
- package/dist/puzzle/cellGrid.js +9 -0
- package/dist/puzzle/fallingPiece.d.ts +9 -0
- package/dist/puzzle/fallingPiece.js +9 -0
- package/dist/puzzle/nonogram.d.ts +39 -0
- package/dist/puzzle/nonogram.js +136 -0
- package/dist/random/nameGen.d.ts +5 -0
- package/dist/random/nameGen.js +5 -0
- package/dist/random/pick.d.ts +8 -0
- package/dist/random/pick.js +31 -0
- package/dist/random/rng.d.ts +24 -0
- package/dist/random/rng.js +30 -8
- package/dist/random/seedLink.d.ts +4 -0
- package/dist/random/seedLink.js +4 -0
- package/dist/relation/keyedValues.d.ts +54 -0
- package/dist/relation/keyedValues.js +115 -0
- package/dist/relation/thresholds.d.ts +62 -0
- package/dist/relation/thresholds.js +62 -0
- package/dist/render/color.d.ts +12 -0
- package/dist/render/color.js +26 -0
- package/dist/render/lookPreset.d.ts +41 -0
- package/dist/render/lookPreset.js +29 -0
- package/dist/render/postProcessing.d.ts +76 -0
- package/dist/render/postProcessing.js +21 -0
- package/dist/rules/predicate.d.ts +53 -0
- package/dist/rules/predicate.js +64 -0
- package/dist/rules/ruleEffects.d.ts +38 -0
- package/dist/rules/ruleEffects.js +37 -0
- package/dist/rules/triggeredRules.d.ts +160 -0
- package/dist/rules/triggeredRules.js +241 -0
- package/dist/runtime/adapter.d.ts +58 -0
- package/dist/runtime/adapter.js +54 -5
- package/dist/runtime/cameraDirector.d.ts +1 -0
- package/dist/runtime/cameraDirector.js +1 -0
- package/dist/runtime/commandRunner.d.ts +1 -0
- package/dist/runtime/commandRunner.js +1 -0
- package/dist/runtime/context/combatFx.d.ts +23 -0
- package/dist/runtime/context/combatFx.js +161 -0
- package/dist/runtime/context/registries.d.ts +13 -0
- package/dist/runtime/context/registries.js +84 -0
- package/dist/runtime/context/worldItems.d.ts +21 -0
- package/dist/runtime/context/worldItems.js +37 -0
- package/dist/runtime/descriptors/baseline.d.ts +48 -0
- package/dist/runtime/descriptors/baseline.js +134 -0
- package/dist/runtime/descriptors/features.d.ts +74 -0
- package/dist/runtime/descriptors/features.js +281 -0
- package/dist/runtime/gameContext.d.ts +163 -19
- package/dist/runtime/gameContext.js +385 -339
- package/dist/runtime/gameRuntime.d.ts +1 -0
- package/dist/runtime/gameRuntime.js +1 -0
- package/dist/runtime/headlessRunner.d.ts +60 -0
- package/dist/runtime/headlessRunner.js +44 -0
- package/dist/runtime/hostPersistence.d.ts +12 -0
- package/dist/runtime/hostPersistence.js +12 -0
- package/dist/runtime/hostedGameRunner.d.ts +54 -0
- package/dist/runtime/hostedGameRunner.js +85 -0
- package/dist/runtime/hostedWorldSession.d.ts +73 -0
- package/dist/runtime/hostedWorldSession.js +64 -0
- package/dist/runtime/inputSnapshot.d.ts +21 -3
- package/dist/runtime/inputSnapshot.js +8 -2
- package/dist/runtime/motionIntents.d.ts +12 -1
- package/dist/runtime/motionIntents.js +26 -1
- package/dist/runtime/perContext.d.ts +15 -0
- package/dist/runtime/perContext.js +21 -0
- package/dist/runtime/runtimeSave.d.ts +79 -0
- package/dist/runtime/runtimeSave.js +105 -0
- package/dist/runtime/save.d.ts +4 -0
- package/dist/runtime/save.js +4 -0
- package/dist/runtime/snapshot.d.ts +7 -0
- package/dist/runtime/snapshot.js +7 -0
- package/dist/runtime/visibility.d.ts +2 -1
- package/dist/runtime/visibility.js +2 -1
- package/dist/runtime/worldChannel.d.ts +62 -0
- package/dist/runtime/worldChannel.js +114 -0
- package/dist/runtime/worldMirror.d.ts +36 -0
- package/dist/runtime/worldMirror.js +44 -0
- package/dist/runtime/worldProjection.d.ts +47 -0
- package/dist/runtime/worldProjection.js +52 -0
- package/dist/runtime/worldReplication.d.ts +69 -0
- package/dist/runtime/worldReplication.js +217 -0
- package/dist/runtime/worldSnapshot.d.ts +44 -0
- package/dist/runtime/worldSnapshot.js +30 -0
- package/dist/scene/assetCatalog.d.ts +22 -0
- package/dist/scene/assetCatalog.js +4 -0
- package/dist/scene/assetDiagnostics.d.ts +69 -0
- package/dist/scene/assetDiagnostics.js +110 -0
- package/dist/scene/assetGenerator.d.ts +65 -0
- package/dist/scene/assetGenerator.js +64 -0
- package/dist/scene/assetSpace.d.ts +137 -0
- package/dist/scene/assetSpace.js +259 -0
- package/dist/scene/authoredTriggers.d.ts +169 -0
- package/dist/scene/authoredTriggers.js +340 -0
- package/dist/scene/behaviorRuntime.d.ts +75 -0
- package/dist/scene/behaviorRuntime.js +217 -0
- package/dist/scene/behaviors.d.ts +14 -2
- package/dist/scene/behaviors.js +7 -2
- package/dist/scene/bodyBind.d.ts +60 -0
- package/dist/scene/bodyBind.js +51 -0
- package/dist/scene/builtinSceneKinds.d.ts +5 -0
- package/dist/scene/builtinSceneKinds.js +62 -0
- package/dist/scene/colliders.d.ts +18 -0
- package/dist/scene/colliders.js +61 -1
- package/dist/scene/entityStats.d.ts +13 -0
- package/dist/scene/entityStats.js +30 -0
- package/dist/scene/entityStore.d.ts +41 -1
- package/dist/scene/entityStore.js +75 -0
- package/dist/scene/facing.d.ts +18 -0
- package/dist/scene/facing.js +26 -0
- package/dist/scene/modelSockets.d.ts +33 -0
- package/dist/scene/modelSockets.js +29 -0
- package/dist/scene/objectQuery.d.ts +2 -0
- package/dist/scene/objectQuery.js +2 -0
- package/dist/scene/objectStore.d.ts +4 -0
- package/dist/scene/objectStore.js +6 -0
- package/dist/scene/possession.d.ts +8 -0
- package/dist/scene/possession.js +14 -0
- package/dist/scene/roster.d.ts +3 -0
- package/dist/scene/roster.js +12 -0
- package/dist/scene/sceneKinds.d.ts +240 -0
- package/dist/scene/sceneKinds.js +214 -0
- package/dist/scene/sceneOwnership.d.ts +169 -0
- package/dist/scene/sceneOwnership.js +179 -0
- package/dist/scene/selectionBookmarks.d.ts +93 -0
- package/dist/scene/selectionBookmarks.js +122 -0
- package/dist/scene/vehicleSeat.d.ts +68 -0
- package/dist/scene/vehicleSeat.js +59 -0
- package/dist/sensor/concealment.d.ts +3 -0
- package/dist/sensor/concealment.js +3 -0
- package/dist/sensor/freezeMonitor.d.ts +1 -0
- package/dist/sensor/freezeMonitor.js +1 -0
- package/dist/sensor/frustumSensor.d.ts +7 -3
- package/dist/sensor/frustumSensor.js +7 -3
- package/dist/sensor/hiddenStateProbe.d.ts +5 -2
- package/dist/sensor/hiddenStateProbe.js +5 -2
- package/dist/sensor/recordingBuffer.d.ts +2 -1
- package/dist/sensor/recordingBuffer.js +2 -1
- package/dist/sensor/replayLoop.d.ts +6 -2
- package/dist/sensor/replayLoop.js +6 -2
- package/dist/sensor/revealQuery.d.ts +2 -1
- package/dist/sensor/revealQuery.js +2 -1
- package/dist/sensor/visionCone.d.ts +10 -3
- package/dist/sensor/visionCone.js +10 -3
- package/dist/session/contestedChannel.d.ts +1 -0
- package/dist/session/contestedChannel.js +1 -0
- package/dist/session/extraction.d.ts +1 -0
- package/dist/session/extraction.js +1 -0
- package/dist/session/roles.d.ts +6 -0
- package/dist/session/roles.js +6 -0
- package/dist/session/roundState.d.ts +8 -0
- package/dist/session/roundState.js +2 -0
- package/dist/settings/settingsModel.d.ts +1 -0
- package/dist/settings/settingsModel.js +1 -0
- package/dist/stats/accumulatorMeter.d.ts +6 -0
- package/dist/stats/accumulatorMeter.js +6 -0
- package/dist/stats/eventMeter.d.ts +5 -0
- package/dist/stats/eventMeter.js +5 -0
- package/dist/stats/rollCheck.d.ts +5 -0
- package/dist/stats/rollCheck.js +5 -0
- package/dist/stats/statModifiers.d.ts +5 -0
- package/dist/stats/statModifiers.js +5 -0
- package/dist/store/defineKeyedStore.d.ts +38 -0
- package/dist/store/defineKeyedStore.js +42 -0
- package/dist/store/defineStore.d.ts +33 -0
- package/dist/store/defineStore.js +35 -0
- package/dist/store/observableKeyedStore.d.ts +9 -0
- package/dist/store/observableKeyedStore.js +43 -2
- package/dist/survival/decayMeter.d.ts +55 -0
- package/dist/survival/decayMeter.js +130 -55
- package/dist/survival/moodle.d.ts +2 -0
- package/dist/survival/regionHealth.d.ts +6 -0
- package/dist/survival/regionHealth.js +5 -0
- package/dist/tactics/fallingGrid.d.ts +6 -4
- package/dist/tactics/fallingGrid.js +6 -4
- package/dist/tactics/predictiveQuery.d.ts +3 -0
- package/dist/tactics/predictiveQuery.js +3 -0
- package/dist/tactics/snapshot.d.ts +2 -0
- package/dist/tactics/snapshot.js +2 -0
- package/dist/tactics/surface.d.ts +1 -0
- package/dist/tactics/surface.js +1 -0
- package/dist/tactics/tacticalGrid.d.ts +1 -0
- package/dist/tactics/tacticalGrid.js +1 -0
- package/dist/time/beatClock.d.ts +14 -4
- package/dist/time/beatClock.js +14 -4
- package/dist/time/calendarClock.d.ts +3 -0
- package/dist/time/calendarClock.js +3 -0
- package/dist/time/idleProgress.d.ts +4 -0
- package/dist/time/idleProgress.js +4 -0
- package/dist/time/simClock.d.ts +2 -0
- package/dist/time/simClock.js +20 -5
- package/dist/ui/actionModel.d.ts +110 -0
- package/dist/ui/actionModel.js +159 -0
- package/dist/ui/gameLayout.d.ts +144 -0
- package/dist/ui/gameLayout.js +148 -0
- package/dist/ui/hudDocument.d.ts +114 -0
- package/dist/ui/hudDocument.js +220 -0
- package/dist/ui/hudLayout.d.ts +33 -1
- package/dist/ui/hudLayout.js +204 -17
- package/dist/ui/orientation.d.ts +39 -0
- package/dist/ui/orientation.js +49 -0
- package/dist/ui/selectionModel.d.ts +92 -0
- package/dist/ui/selectionModel.js +88 -0
- package/dist/ui/swingTimer.d.ts +42 -0
- package/dist/ui/swingTimer.js +38 -0
- package/dist/ui/tooltipModel.d.ts +63 -0
- package/dist/ui/tooltipModel.js +82 -0
- package/dist/ui.d.ts +15 -0
- package/dist/ui.js +15 -0
- package/dist/visibility/bounds.d.ts +8 -1
- package/dist/visibility/bounds.js +8 -1
- package/dist/visibility/frustum.d.ts +12 -3
- package/dist/visibility/frustum.js +12 -3
- package/dist/visibility/spatialIndex.js +34 -20
- package/dist/work/jobQueue.d.ts +201 -0
- package/dist/work/jobQueue.js +253 -0
- package/dist/work/unitTraining.d.ts +58 -0
- package/dist/work/unitTraining.js +52 -0
- package/dist/world/authoredObjects.d.ts +58 -0
- package/dist/world/authoredObjects.js +69 -0
- package/dist/world/buildingGenerator.d.ts +18 -0
- package/dist/world/buildingGenerator.js +62 -0
- package/dist/world/buildings.d.ts +5 -0
- package/dist/world/buildings.js +5 -0
- package/dist/world/catenary.d.ts +22 -0
- package/dist/world/catenary.js +69 -0
- package/dist/world/environmentSummary.d.ts +11 -2
- package/dist/world/environmentSummary.js +11 -1
- package/dist/world/features.d.ts +244 -7
- package/dist/world/features.js +92 -4
- package/dist/world/footprintGrid.d.ts +59 -0
- package/dist/world/footprintGrid.js +141 -0
- package/dist/world/geometry.d.ts +64 -0
- package/dist/world/geometry.js +94 -0
- package/dist/world/grassKind.d.ts +51 -0
- package/dist/world/grassKind.js +101 -0
- package/dist/world/pathInstances.d.ts +27 -0
- package/dist/world/pathInstances.js +27 -0
- package/dist/world/pathTerrain.d.ts +80 -0
- package/dist/world/pathTerrain.js +142 -0
- package/dist/world/placeAsset.d.ts +81 -0
- package/dist/world/placeAsset.js +77 -0
- package/dist/world/placement.d.ts +4 -0
- package/dist/world/placement.js +4 -0
- package/dist/world/placementController.d.ts +6 -0
- package/dist/world/placementController.js +6 -0
- package/dist/world/polyline.d.ts +34 -0
- package/dist/world/polyline.js +81 -0
- package/dist/world/roads.d.ts +55 -0
- package/dist/world/roads.js +184 -0
- package/dist/world/scatterRegion.d.ts +164 -0
- package/dist/world/scatterRegion.js +409 -0
- package/dist/world/sceneShapes.d.ts +43 -0
- package/dist/world/sceneShapes.js +1 -0
- package/dist/world/segment.d.ts +27 -0
- package/dist/world/segment.js +43 -0
- package/dist/world/soilKind.d.ts +48 -0
- package/dist/world/soilKind.js +92 -0
- package/dist/world/spatialSample.d.ts +241 -0
- package/dist/world/spatialSample.js +465 -0
- package/dist/world/streets.d.ts +80 -0
- package/dist/world/streets.js +144 -0
- package/dist/world/terraform.d.ts +213 -1
- package/dist/world/terraform.js +655 -20
- package/dist/world/terrain.d.ts +138 -12
- package/dist/world/terrain.js +346 -28
- package/dist/world/terrainGuides.d.ts +182 -0
- package/dist/world/terrainGuides.js +343 -0
- package/dist/world/vec2.d.ts +81 -0
- package/dist/world/vec2.js +128 -0
- package/dist/world/vec3.d.ts +49 -0
- package/dist/world/vec3.js +76 -0
- package/dist/world/vegetation.d.ts +71 -0
- package/dist/world/vegetation.js +151 -0
- package/dist/world/visibilityField.d.ts +154 -0
- package/dist/world/visibilityField.js +271 -0
- package/dist/world/volumetricClouds.d.ts +52 -0
- package/dist/world/volumetricClouds.js +43 -0
- package/dist/world/walls.d.ts +9 -0
- package/dist/world/walls.js +9 -0
- package/dist/world/waterKind.d.ts +55 -0
- package/dist/world/waterKind.js +99 -0
- package/dist/world.d.ts +132 -0
- package/dist/world.js +132 -0
- package/package.json +32 -8
- package/skills/jgengine/SKILL.md +51 -0
- package/skills/jgengine/api.md +434 -0
- package/skills/jgengine/capabilities.md +29 -0
- package/skills/jgengine/reference-cartridge.md +72 -0
- package/skills/jgengine-combat/SKILL.md +34 -0
- package/skills/jgengine-combat/api.md +549 -0
- package/skills/jgengine-combat/capabilities.md +169 -0
- package/skills/jgengine-combat/reference.md +98 -0
- package/skills/jgengine-gameplay/SKILL.md +39 -0
- package/skills/jgengine-gameplay/api.md +1794 -0
- package/skills/jgengine-gameplay/capabilities.md +378 -0
- package/skills/jgengine-gameplay/reference-systems.md +60 -0
- package/skills/jgengine-world/SKILL.md +38 -0
- package/skills/jgengine-world/api.md +2652 -0
- package/skills/jgengine-world/capabilities.md +370 -0
- package/skills/jgengine-world/reference.md +222 -0
- package/dist/cartridge/runtime.d.ts +0 -15
- package/dist/cartridge/runtime.js +0 -556
- package/dist/cartridge/spec.d.ts +0 -188
- package/dist/cartridge/spec.js +0 -19
- package/dist/cartridge/validate.d.ts +0 -2
- package/dist/cartridge/validate.js +0 -78
- package/dist/store/engineStore.d.ts +0 -22
- package/dist/store/engineStore.js +0 -50
- package/dist/store/features.d.ts +0 -10
- package/dist/store/features.js +0 -23
- package/llms.txt +0 -4983
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
function clamp01(value) {
|
|
2
|
+
return value < 0 ? 0 : value > 1 ? 1 : value;
|
|
3
|
+
}
|
|
4
|
+
function lerp(a, b, t) {
|
|
5
|
+
return a + (b - a) * t;
|
|
6
|
+
}
|
|
7
|
+
function smoothstep01(t) {
|
|
8
|
+
const clamped = clamp01(t);
|
|
9
|
+
return clamped * clamped * (3 - 2 * clamped);
|
|
10
|
+
}
|
|
11
|
+
function buildCorridor(points) {
|
|
12
|
+
const cumulative = [0];
|
|
13
|
+
for (let i = 1; i < points.length; i += 1) {
|
|
14
|
+
const a = points[i - 1];
|
|
15
|
+
const b = points[i];
|
|
16
|
+
cumulative.push(cumulative[i - 1] + Math.hypot(b[0] - a[0], b[1] - a[1]));
|
|
17
|
+
}
|
|
18
|
+
return { points, cumulative, total: cumulative[cumulative.length - 1] ?? 0 };
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Closest point on the corridor to `(x, z)`: unsigned lateral distance and arc-length position. Self-
|
|
22
|
+
* contained (each segment projects independently and the minimum lateral wins) so a vertex always reports
|
|
23
|
+
* a near-zero lateral, regardless of which side of the line the neighbours fall.
|
|
24
|
+
*/
|
|
25
|
+
function nearestOnCorridor(corridor, x, z) {
|
|
26
|
+
let bestLateral = Number.POSITIVE_INFINITY;
|
|
27
|
+
let bestAlong = 0;
|
|
28
|
+
let bestPoint = corridor.points[0] ?? [x, z];
|
|
29
|
+
for (let i = 1; i < corridor.points.length; i += 1) {
|
|
30
|
+
const a = corridor.points[i - 1];
|
|
31
|
+
const b = corridor.points[i];
|
|
32
|
+
const abx = b[0] - a[0];
|
|
33
|
+
const abz = b[1] - a[1];
|
|
34
|
+
const segLenSq = abx * abx + abz * abz;
|
|
35
|
+
const t = segLenSq <= 0 ? 0 : Math.max(0, Math.min(1, ((x - a[0]) * abx + (z - a[1]) * abz) / segLenSq));
|
|
36
|
+
const px = a[0] + abx * t;
|
|
37
|
+
const pz = a[1] + abz * t;
|
|
38
|
+
const lateral = Math.hypot(x - px, z - pz);
|
|
39
|
+
if (lateral < bestLateral) {
|
|
40
|
+
bestLateral = lateral;
|
|
41
|
+
bestAlong = corridor.cumulative[i - 1] + t * Math.sqrt(segLenSq);
|
|
42
|
+
bestPoint = [px, pz];
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return { lateral: bestLateral, along: bestAlong, point: bestPoint };
|
|
46
|
+
}
|
|
47
|
+
function resolveProfile(profile) {
|
|
48
|
+
if (profile.points.length < 2 || profile.width <= 0)
|
|
49
|
+
return null;
|
|
50
|
+
const corridor = buildCorridor(profile.points.map((point) => [point[0], point[1]]));
|
|
51
|
+
if (corridor.total <= 0)
|
|
52
|
+
return null;
|
|
53
|
+
const shoulder = Math.max(0, profile.shoulder ?? profile.width * 0.5);
|
|
54
|
+
return {
|
|
55
|
+
corridor,
|
|
56
|
+
half: profile.width / 2,
|
|
57
|
+
shoulder,
|
|
58
|
+
reach: profile.width / 2 + shoulder,
|
|
59
|
+
height: profile.height ?? { kind: "sample" },
|
|
60
|
+
depth: Math.max(0, profile.depth ?? 0),
|
|
61
|
+
...(profile.maxCut === undefined ? {} : { maxCut: Math.max(0, profile.maxCut) }),
|
|
62
|
+
...(profile.maxFill === undefined ? {} : { maxFill: Math.max(0, profile.maxFill) }),
|
|
63
|
+
wallHeight: Math.max(0, profile.retaining?.wallHeight ?? 0),
|
|
64
|
+
threshold: Math.max(0, profile.retaining?.threshold ?? 0),
|
|
65
|
+
taper: Math.max(0, profile.retaining?.taper ?? profile.retaining?.threshold ?? 0),
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/** Wall strength 0..1: full above `threshold + taper`, none below `threshold`, smooth between. */
|
|
69
|
+
function wallStrength(profile, cutFill) {
|
|
70
|
+
if (profile.wallHeight <= 0)
|
|
71
|
+
return 0;
|
|
72
|
+
if (cutFill < profile.threshold)
|
|
73
|
+
return 0;
|
|
74
|
+
if (profile.taper <= 0)
|
|
75
|
+
return 1;
|
|
76
|
+
return smoothstep01((cutFill - profile.threshold) / profile.taper);
|
|
77
|
+
}
|
|
78
|
+
function clampCutFill(height, base, maxCut, maxFill) {
|
|
79
|
+
let out = height;
|
|
80
|
+
if (maxFill !== undefined && out > base + maxFill)
|
|
81
|
+
out = base + maxFill;
|
|
82
|
+
if (maxCut !== undefined && out < base - maxCut)
|
|
83
|
+
out = base - maxCut;
|
|
84
|
+
return out;
|
|
85
|
+
}
|
|
86
|
+
function centerlineTarget(profile, along, point, base) {
|
|
87
|
+
const policy = profile.height;
|
|
88
|
+
if (policy.kind === "fixed")
|
|
89
|
+
return policy.height;
|
|
90
|
+
if (policy.kind === "grade") {
|
|
91
|
+
const fraction = profile.corridor.total <= 0 ? 0 : clamp01(along / profile.corridor.total);
|
|
92
|
+
return policy.start + (policy.end - policy.start) * fraction;
|
|
93
|
+
}
|
|
94
|
+
return base(point[0], point[1]);
|
|
95
|
+
}
|
|
96
|
+
function applyProfileAt(profile, x, z, surrounding, base) {
|
|
97
|
+
const hit = nearestOnCorridor(profile.corridor, x, z);
|
|
98
|
+
const lateral = hit.lateral;
|
|
99
|
+
if (lateral > profile.reach)
|
|
100
|
+
return surrounding;
|
|
101
|
+
const target = clampCutFill(centerlineTarget(profile, hit.along, hit.point, base), surrounding, profile.maxCut, profile.maxFill);
|
|
102
|
+
// Inside the core: carve a channel below the target, deepest at the centerline, level at the edge.
|
|
103
|
+
if (lateral <= profile.half) {
|
|
104
|
+
const edgeT = profile.half <= 0 ? 0 : lateral / profile.half;
|
|
105
|
+
const carved = target - profile.depth * (1 - edgeT * edgeT);
|
|
106
|
+
return clampCutFill(carved, surrounding, profile.maxCut, profile.maxFill);
|
|
107
|
+
}
|
|
108
|
+
// Shoulder: feather the corridor edge (target) back to the surrounding ground, or hold a retaining wall.
|
|
109
|
+
const shoulderT = clamp01((lateral - profile.half) / profile.shoulder);
|
|
110
|
+
const feathered = lerp(target, surrounding, smoothstep01(shoulderT));
|
|
111
|
+
const strength = wallStrength(profile, Math.abs(target - surrounding));
|
|
112
|
+
if (strength <= 0)
|
|
113
|
+
return feathered;
|
|
114
|
+
const crest = target + profile.wallHeight;
|
|
115
|
+
const walled = shoulderT <= 0.5 ? lerp(target, crest, smoothstep01(shoulderT / 0.5)) : lerp(crest, surrounding, smoothstep01((shoulderT - 0.5) / 0.5));
|
|
116
|
+
return lerp(feathered, walled, strength);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Wraps a height sampler so each authored `TerrainPathProfile` reshapes it. Profiles apply in list order
|
|
120
|
+
* (later profiles compose over earlier ones, so an intersection's last profile wins its core); each reads
|
|
121
|
+
* the running height as its surrounding ground and the original `base` for `sample` centerline heights.
|
|
122
|
+
* The returned sampler is pure and deterministic. Degenerate profiles (fewer than two points, non-positive
|
|
123
|
+
* width or length) are skipped; with no usable profile the original `base` is returned unchanged.
|
|
124
|
+
* @capability path-terrain compose flatten/grade/carve/retaining path profiles onto a height sampler
|
|
125
|
+
*/
|
|
126
|
+
export function withPathProfiles(base, profiles) {
|
|
127
|
+
const resolved = [];
|
|
128
|
+
for (const profile of profiles) {
|
|
129
|
+
const prepared = resolveProfile(profile);
|
|
130
|
+
if (prepared !== null)
|
|
131
|
+
resolved.push(prepared);
|
|
132
|
+
}
|
|
133
|
+
if (resolved.length === 0)
|
|
134
|
+
return base;
|
|
135
|
+
return (x, z) => {
|
|
136
|
+
let height = base(x, z);
|
|
137
|
+
for (const profile of resolved) {
|
|
138
|
+
height = applyProfileAt(profile, x, z, height, base);
|
|
139
|
+
}
|
|
140
|
+
return height;
|
|
141
|
+
};
|
|
142
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { type AssetSpace } from "../scene/assetSpace.js";
|
|
2
|
+
import type { PlacementCommit } from "./placementController.js";
|
|
3
|
+
import type { AddStructureInput, StructureVec3 } from "./placedStructureStore.js";
|
|
4
|
+
/** World-space point shared by structure stores and editor markers. */
|
|
5
|
+
export type PlaceAssetVec3 = {
|
|
6
|
+
x: number;
|
|
7
|
+
y: number;
|
|
8
|
+
z: number;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Shared place-asset verb: one resolved payload for editor `place_asset` and in-game
|
|
12
|
+
* build-mode commits. Convert with {@link toStructureInput} / {@link toEditorMarker}.
|
|
13
|
+
* @capability place-asset resolve a placement commit into a shared asset placement payload
|
|
14
|
+
*/
|
|
15
|
+
export interface PlaceAssetResult {
|
|
16
|
+
id: string;
|
|
17
|
+
assetId: string;
|
|
18
|
+
kind: string;
|
|
19
|
+
label: string;
|
|
20
|
+
position: PlaceAssetVec3;
|
|
21
|
+
rotationY: number;
|
|
22
|
+
color: string;
|
|
23
|
+
meta: Readonly<Record<string, unknown>>;
|
|
24
|
+
}
|
|
25
|
+
/** Inputs to {@link resolvePlaceAsset}: asset id, pose, and optional catalog/known fields. */
|
|
26
|
+
export interface ResolvePlaceAssetInput {
|
|
27
|
+
assetId: string;
|
|
28
|
+
position: PlaceAssetVec3 | StructureVec3;
|
|
29
|
+
kind?: string;
|
|
30
|
+
label?: string;
|
|
31
|
+
rotationY?: number;
|
|
32
|
+
/**
|
|
33
|
+
* Placement heading in degrees (engine north = `0`, clockwise). When set it takes precedence over
|
|
34
|
+
* `rotationY`: the resolved `rotationY` runs through `space.rotation` (the asset's rotation policy)
|
|
35
|
+
* and `space.forwardDegrees` (canonical facing), so the catalog owns the correction instead of games.
|
|
36
|
+
*/
|
|
37
|
+
headingDegrees?: number;
|
|
38
|
+
/** Asset-space metadata driving the heading resolution when `headingDegrees` is set. */
|
|
39
|
+
space?: AssetSpace;
|
|
40
|
+
id?: string;
|
|
41
|
+
color?: string;
|
|
42
|
+
meta?: Readonly<Record<string, unknown>>;
|
|
43
|
+
url?: string;
|
|
44
|
+
knownKind?: string;
|
|
45
|
+
knownLabel?: string;
|
|
46
|
+
knownUrl?: string;
|
|
47
|
+
}
|
|
48
|
+
/** Optional catalog/label overrides for {@link placeAssetFromCommit}. */
|
|
49
|
+
export interface PlaceAssetFromCommitOptions {
|
|
50
|
+
kind?: string;
|
|
51
|
+
label?: string;
|
|
52
|
+
id?: string;
|
|
53
|
+
color?: string;
|
|
54
|
+
meta?: Readonly<Record<string, unknown>>;
|
|
55
|
+
url?: string;
|
|
56
|
+
knownKind?: string;
|
|
57
|
+
knownLabel?: string;
|
|
58
|
+
knownUrl?: string;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Resolve a place-asset intent into a shared payload (editor + games, one verb).
|
|
62
|
+
* @capability place-asset resolve a placement commit into a shared asset placement payload
|
|
63
|
+
*/
|
|
64
|
+
export declare function resolvePlaceAsset(input: ResolvePlaceAssetInput): PlaceAssetResult;
|
|
65
|
+
/**
|
|
66
|
+
* Bridge a {@link PlacementCommit} into the shared place-asset verb.
|
|
67
|
+
* @capability place-asset resolve a placement commit into a shared asset placement payload
|
|
68
|
+
*/
|
|
69
|
+
export declare function placeAssetFromCommit(commit: PlacementCommit, assetId: string, options?: PlaceAssetFromCommitOptions): PlaceAssetResult;
|
|
70
|
+
/** Game-state form: feed {@link createPlacedStructureStore}.add. */
|
|
71
|
+
export declare function toStructureInput(result: PlaceAssetResult): AddStructureInput;
|
|
72
|
+
/** Scene-document form: feed editor `addMarker` / `place_asset` path. */
|
|
73
|
+
export declare function toEditorMarker(result: PlaceAssetResult): {
|
|
74
|
+
id: string;
|
|
75
|
+
kind: string;
|
|
76
|
+
position: PlaceAssetVec3;
|
|
77
|
+
rotationY: number;
|
|
78
|
+
label: string;
|
|
79
|
+
color: string;
|
|
80
|
+
meta: Record<string, unknown>;
|
|
81
|
+
};
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { applyRotationPolicy, resolveFacingRotationY } from "../scene/assetSpace.js";
|
|
2
|
+
function normalizePosition(position) {
|
|
3
|
+
if (typeof position.x === "number") {
|
|
4
|
+
const p = position;
|
|
5
|
+
return { x: p.x, y: p.y, z: p.z };
|
|
6
|
+
}
|
|
7
|
+
const t = position;
|
|
8
|
+
return { x: t[0], y: t[1], z: t[2] };
|
|
9
|
+
}
|
|
10
|
+
function placementId(assetId, explicit) {
|
|
11
|
+
if (explicit !== undefined && explicit.length > 0)
|
|
12
|
+
return explicit;
|
|
13
|
+
return `placed_${assetId}_${Date.now().toString(36)}`;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Resolve a place-asset intent into a shared payload (editor + games, one verb).
|
|
17
|
+
* @capability place-asset resolve a placement commit into a shared asset placement payload
|
|
18
|
+
*/
|
|
19
|
+
export function resolvePlaceAsset(input) {
|
|
20
|
+
const position = normalizePosition(input.position);
|
|
21
|
+
const assetId = input.assetId;
|
|
22
|
+
const kind = input.kind ?? input.knownKind ?? "prop";
|
|
23
|
+
const label = input.label ?? input.knownLabel ?? assetId;
|
|
24
|
+
const url = input.url ?? input.knownUrl;
|
|
25
|
+
const meta = {
|
|
26
|
+
assetId,
|
|
27
|
+
...(url === undefined ? {} : { url }),
|
|
28
|
+
...(input.meta ?? {}),
|
|
29
|
+
};
|
|
30
|
+
const rotationY = input.headingDegrees === undefined
|
|
31
|
+
? (input.rotationY ?? 0)
|
|
32
|
+
: resolveFacingRotationY(applyRotationPolicy(input.headingDegrees, input.space?.rotation), input.space);
|
|
33
|
+
return {
|
|
34
|
+
id: placementId(assetId, input.id),
|
|
35
|
+
assetId,
|
|
36
|
+
kind,
|
|
37
|
+
label,
|
|
38
|
+
position,
|
|
39
|
+
rotationY,
|
|
40
|
+
color: input.color ?? "#e2e8f0",
|
|
41
|
+
meta,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Bridge a {@link PlacementCommit} into the shared place-asset verb.
|
|
46
|
+
* @capability place-asset resolve a placement commit into a shared asset placement payload
|
|
47
|
+
*/
|
|
48
|
+
export function placeAssetFromCommit(commit, assetId, options = {}) {
|
|
49
|
+
return resolvePlaceAsset({
|
|
50
|
+
assetId,
|
|
51
|
+
position: [commit.center[0], commit.y, commit.center[1]],
|
|
52
|
+
rotationY: commit.rotationY,
|
|
53
|
+
...options,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
/** Game-state form: feed {@link createPlacedStructureStore}.add. */
|
|
57
|
+
export function toStructureInput(result) {
|
|
58
|
+
return {
|
|
59
|
+
id: result.id,
|
|
60
|
+
catalogId: result.assetId,
|
|
61
|
+
position: [result.position.x, result.position.y, result.position.z],
|
|
62
|
+
rotationY: result.rotationY,
|
|
63
|
+
data: { ...result.meta, kind: result.kind, label: result.label, color: result.color },
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
/** Scene-document form: feed editor `addMarker` / `place_asset` path. */
|
|
67
|
+
export function toEditorMarker(result) {
|
|
68
|
+
return {
|
|
69
|
+
id: result.id,
|
|
70
|
+
kind: result.kind,
|
|
71
|
+
position: result.position,
|
|
72
|
+
rotationY: result.rotationY,
|
|
73
|
+
label: result.label,
|
|
74
|
+
color: result.color,
|
|
75
|
+
meta: { ...result.meta },
|
|
76
|
+
};
|
|
77
|
+
}
|
|
@@ -26,5 +26,9 @@ export type PlacementResult = {
|
|
|
26
26
|
obstacle: PlacementObstacle;
|
|
27
27
|
index: number;
|
|
28
28
|
};
|
|
29
|
+
/**
|
|
30
|
+
* Footprint validity: bounds + obstacle overlap after optional grid snap.
|
|
31
|
+
* @capability placement-math grid/surface footprint validity for build mode
|
|
32
|
+
*/
|
|
29
33
|
export declare function validatePlacement(request: PlacementRequest, rules?: PlacementRules): PlacementResult;
|
|
30
34
|
export declare function footprintObstacle(request: PlacementRequest, id?: string): PlacementObstacle;
|
package/dist/world/placement.js
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
import { aabbContains, aabbOverlap, footprintAabb, snapToGrid, } from "./geometry.js";
|
|
2
|
+
/**
|
|
3
|
+
* Footprint validity: bounds + obstacle overlap after optional grid snap.
|
|
4
|
+
* @capability placement-math grid/surface footprint validity for build mode
|
|
5
|
+
*/
|
|
2
6
|
export function validatePlacement(request, rules = {}) {
|
|
3
7
|
const center = rules.snap === undefined ? request.center : snapToGrid(request.center, rules.snap);
|
|
4
8
|
const aabb = footprintAabb(center, request.footprint, request.quarterTurns ?? 0);
|
|
@@ -65,5 +65,11 @@ export interface PlacementController {
|
|
|
65
65
|
commit(): PlacementCommit | null;
|
|
66
66
|
reset(): void;
|
|
67
67
|
}
|
|
68
|
+
/** Maps 0–3 quarter turns onto radians for ghost/commit rotation. */
|
|
68
69
|
export declare function quarterTurnsToRotationY(quarterTurns: number): number;
|
|
70
|
+
/**
|
|
71
|
+
* Headless placement ghost: hover → valid/invalid preview, rotate, grid/free/surface snap, commit.
|
|
72
|
+
* Pair with `@jgengine/shell/structures` `PlacementGhost` and {@link placeAssetFromCommit}.
|
|
73
|
+
* @capability placement-controller interactive build-mode ghost preview and commit
|
|
74
|
+
*/
|
|
69
75
|
export declare function createPlacementController(config: PlacementControllerConfig): PlacementController;
|
|
@@ -5,10 +5,16 @@ const DEFAULT_SLOT_RADIUS = 1.5;
|
|
|
5
5
|
function distanceVec3(a, b) {
|
|
6
6
|
return Math.hypot(a[0] - b[0], a[1] - b[1], a[2] - b[2]);
|
|
7
7
|
}
|
|
8
|
+
/** Maps 0–3 quarter turns onto radians for ghost/commit rotation. */
|
|
8
9
|
export function quarterTurnsToRotationY(quarterTurns) {
|
|
9
10
|
const turns = ((quarterTurns % 4) + 4) % 4;
|
|
10
11
|
return turns === 0 ? 0 : -turns * (Math.PI / 2);
|
|
11
12
|
}
|
|
13
|
+
/**
|
|
14
|
+
* Headless placement ghost: hover → valid/invalid preview, rotate, grid/free/surface snap, commit.
|
|
15
|
+
* Pair with `@jgengine/shell/structures` `PlacementGhost` and {@link placeAssetFromCommit}.
|
|
16
|
+
* @capability placement-controller interactive build-mode ghost preview and commit
|
|
17
|
+
*/
|
|
12
18
|
export function createPlacementController(config) {
|
|
13
19
|
let footprint = config.footprint;
|
|
14
20
|
let rules = config.rules ?? {};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { Vec2 } from "./geometry.js";
|
|
2
|
+
/** A polyline prepared for repeated distance/fraction sampling, with cumulative arc-length precomputed. */
|
|
3
|
+
export interface Polyline {
|
|
4
|
+
readonly points: readonly Vec2[];
|
|
5
|
+
readonly cumulative: readonly number[];
|
|
6
|
+
readonly length: number;
|
|
7
|
+
}
|
|
8
|
+
/** The closest point on a polyline to a query point, with where it lands along the line. */
|
|
9
|
+
export interface PolylineHit {
|
|
10
|
+
readonly point: Vec2;
|
|
11
|
+
readonly distanceAlong: number;
|
|
12
|
+
readonly segment: number;
|
|
13
|
+
readonly lateral: number;
|
|
14
|
+
}
|
|
15
|
+
/** Prepare a polyline from ordered points, computing cumulative arc-length once for O(log n) sampling.
|
|
16
|
+
* @internal
|
|
17
|
+
*/
|
|
18
|
+
export declare function polyline(points: readonly Vec2[]): Polyline;
|
|
19
|
+
/** Point at an absolute arc-length distance along the line, clamped to the endpoints.
|
|
20
|
+
* @internal
|
|
21
|
+
*/
|
|
22
|
+
export declare function pointAtDistance(line: Polyline, dist: number): Vec2;
|
|
23
|
+
/** Point at a `[0, 1]` fraction of the line's total length.
|
|
24
|
+
* @internal
|
|
25
|
+
*/
|
|
26
|
+
export declare function pointAtFraction(line: Polyline, fraction: number): Vec2;
|
|
27
|
+
/** Unit tangent (direction of travel) at an absolute distance along the line.
|
|
28
|
+
* @internal
|
|
29
|
+
*/
|
|
30
|
+
export declare function tangentAtDistance(line: Polyline, dist: number): Vec2;
|
|
31
|
+
/** Closest point on the line to `query`, reporting arc-length position, segment index, and signed lateral offset.
|
|
32
|
+
* @internal
|
|
33
|
+
*/
|
|
34
|
+
export declare function closestPoint(line: Polyline, query: Vec2): PolylineHit;
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { distance, lerp, normalize, perp, sub } from "./vec2.js";
|
|
2
|
+
/** Prepare a polyline from ordered points, computing cumulative arc-length once for O(log n) sampling.
|
|
3
|
+
* @internal
|
|
4
|
+
*/
|
|
5
|
+
export function polyline(points) {
|
|
6
|
+
const cumulative = [0];
|
|
7
|
+
for (let i = 1; i < points.length; i += 1) {
|
|
8
|
+
cumulative.push(cumulative[i - 1] + distance(points[i - 1], points[i]));
|
|
9
|
+
}
|
|
10
|
+
return { points, cumulative, length: cumulative[cumulative.length - 1] ?? 0 };
|
|
11
|
+
}
|
|
12
|
+
function segmentAt(line, dist) {
|
|
13
|
+
const { cumulative } = line;
|
|
14
|
+
const clamped = dist < 0 ? 0 : dist > line.length ? line.length : dist;
|
|
15
|
+
let lo = 1;
|
|
16
|
+
let hi = cumulative.length - 1;
|
|
17
|
+
while (lo < hi) {
|
|
18
|
+
const mid = (lo + hi) >> 1;
|
|
19
|
+
if (cumulative[mid] < clamped)
|
|
20
|
+
lo = mid + 1;
|
|
21
|
+
else
|
|
22
|
+
hi = mid;
|
|
23
|
+
}
|
|
24
|
+
const start = cumulative[lo - 1];
|
|
25
|
+
const span = cumulative[lo] - start;
|
|
26
|
+
return { index: lo, t: span <= 0 ? 0 : (clamped - start) / span };
|
|
27
|
+
}
|
|
28
|
+
/** Point at an absolute arc-length distance along the line, clamped to the endpoints.
|
|
29
|
+
* @internal
|
|
30
|
+
*/
|
|
31
|
+
export function pointAtDistance(line, dist) {
|
|
32
|
+
if (line.points.length === 0)
|
|
33
|
+
return [0, 0];
|
|
34
|
+
if (line.points.length === 1)
|
|
35
|
+
return line.points[0];
|
|
36
|
+
const { index, t } = segmentAt(line, dist);
|
|
37
|
+
return lerp(line.points[index - 1], line.points[index], t);
|
|
38
|
+
}
|
|
39
|
+
/** Point at a `[0, 1]` fraction of the line's total length.
|
|
40
|
+
* @internal
|
|
41
|
+
*/
|
|
42
|
+
export function pointAtFraction(line, fraction) {
|
|
43
|
+
return pointAtDistance(line, fraction * line.length);
|
|
44
|
+
}
|
|
45
|
+
/** Unit tangent (direction of travel) at an absolute distance along the line.
|
|
46
|
+
* @internal
|
|
47
|
+
*/
|
|
48
|
+
export function tangentAtDistance(line, dist) {
|
|
49
|
+
if (line.points.length < 2)
|
|
50
|
+
return [0, 1];
|
|
51
|
+
const { index } = segmentAt(line, dist);
|
|
52
|
+
return normalize(sub(line.points[index], line.points[index - 1]));
|
|
53
|
+
}
|
|
54
|
+
/** Closest point on the line to `query`, reporting arc-length position, segment index, and signed lateral offset.
|
|
55
|
+
* @internal
|
|
56
|
+
*/
|
|
57
|
+
export function closestPoint(line, query) {
|
|
58
|
+
const { points, cumulative } = line;
|
|
59
|
+
if (points.length === 0)
|
|
60
|
+
return { point: [0, 0], distanceAlong: 0, segment: 0, lateral: 0 };
|
|
61
|
+
if (points.length === 1) {
|
|
62
|
+
return { point: points[0], distanceAlong: 0, segment: 0, lateral: distance(points[0], query) };
|
|
63
|
+
}
|
|
64
|
+
let best = { point: points[0], distanceAlong: 0, segment: 0, lateral: Infinity };
|
|
65
|
+
for (let i = 1; i < points.length; i += 1) {
|
|
66
|
+
const a = points[i - 1];
|
|
67
|
+
const b = points[i];
|
|
68
|
+
const abx = b[0] - a[0];
|
|
69
|
+
const aby = b[1] - a[1];
|
|
70
|
+
const segLenSq = abx * abx + aby * aby;
|
|
71
|
+
const t = segLenSq <= 0 ? 0 : Math.max(0, Math.min(1, ((query[0] - a[0]) * abx + (query[1] - a[1]) * aby) / segLenSq));
|
|
72
|
+
const point = [a[0] + abx * t, a[1] + aby * t];
|
|
73
|
+
const lateral = distance(point, query);
|
|
74
|
+
if (lateral < best.lateral) {
|
|
75
|
+
const along = cumulative[i - 1] + t * Math.sqrt(segLenSq);
|
|
76
|
+
const side = Math.sign(perp(normalize([abx, aby]))[0] * (query[0] - point[0]) + perp(normalize([abx, aby]))[1] * (query[1] - point[1]));
|
|
77
|
+
best = { point, distanceAlong: along, segment: i - 1, lateral: lateral * (side === 0 ? 1 : side) };
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return best;
|
|
81
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/** A road centerline vertex in world XZ. */
|
|
2
|
+
export type RoadPoint = readonly [number, number];
|
|
3
|
+
/** Renderer-ready triangle ribbon: flat position triples plus triangle indices. */
|
|
4
|
+
export interface RoadRibbon {
|
|
5
|
+
/** Interleaved xyz vertex positions. */
|
|
6
|
+
positions: Float32Array;
|
|
7
|
+
/** Triangle indices into `positions`. */
|
|
8
|
+
indices: Uint32Array;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Fillets sharp corners of a centerline into short arcs so a ribbon built from it reads as a smooth
|
|
12
|
+
* road instead of overlapping/notching rectangles at each bend. Each interior vertex is replaced by a
|
|
13
|
+
* quadratic-bezier arc of `radius` (clamped to half the shorter adjacent segment) sampled at
|
|
14
|
+
* `cornerSegments` steps; endpoints and near-straight vertices pass through unchanged.
|
|
15
|
+
* @internal — the corner-smoothing behind `<AuthoredPaths>`; games get it for free through the render.
|
|
16
|
+
*/
|
|
17
|
+
export declare function roundPathCorners(points: readonly RoadPoint[], radius: number, cornerSegments?: number): RoadPoint[];
|
|
18
|
+
/** Options for {@link buildRoadRibbon}. */
|
|
19
|
+
export interface RoadRibbonOptions {
|
|
20
|
+
/** Lift above the sampled ground so the ribbon never z-fights the terrain. Default 0.08. */
|
|
21
|
+
elevation?: number;
|
|
22
|
+
/** Longest centerline step before the polyline is subdivided to drape over relief. Default 4. */
|
|
23
|
+
maxSegmentLength?: number;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Triangulate a road centerline into a ground-draped ribbon mesh: the polyline is subdivided,
|
|
27
|
+
* each vertex is offset half a `width` along the local perpendicular, and every vertex sits at
|
|
28
|
+
* `sampleHeight(x, z) + elevation`. Pure geometry — the shell (or any renderer) turns the result
|
|
29
|
+
* into a mesh, and tests can assert on it directly.
|
|
30
|
+
*/
|
|
31
|
+
export declare function buildRoadRibbon(path: readonly RoadPoint[], width: number, sampleHeight: (x: number, z: number) => number, options?: RoadRibbonOptions): RoadRibbon;
|
|
32
|
+
/**
|
|
33
|
+
* Split a centerline into dash sub-polylines for lane markings: `dashLength` of painted line,
|
|
34
|
+
* `gapLength` of asphalt, repeated along the path's arc length. Feed each returned sub-path back
|
|
35
|
+
* through {@link buildRoadRibbon} with a thin width to mesh the dashes.
|
|
36
|
+
*/
|
|
37
|
+
export declare function dashSegments(path: readonly RoadPoint[], dashLength?: number, gapLength?: number): readonly (readonly RoadPoint[])[];
|
|
38
|
+
/** Result of {@link nearestOnPath}: closest point on the centerline plus distance and tangent. */
|
|
39
|
+
export interface RoadSample {
|
|
40
|
+
/** Closest point on the centerline. */
|
|
41
|
+
point: RoadPoint;
|
|
42
|
+
/** World distance from the query to `point`. */
|
|
43
|
+
distance: number;
|
|
44
|
+
/** Unit tangent of the centerline at `point`. */
|
|
45
|
+
tangent: readonly [number, number];
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Closest-point query against a road centerline — the seam traffic AI, spawn placement, and
|
|
49
|
+
* "am I on the road" checks share. Returns null for a degenerate path.
|
|
50
|
+
*/
|
|
51
|
+
export declare function nearestOnPath(path: readonly RoadPoint[], x: number, z: number): RoadSample | null;
|
|
52
|
+
/** True when the query point lies within half the road `width` of the centerline. */
|
|
53
|
+
export declare function isOnRoad(path: readonly RoadPoint[], width: number, x: number, z: number): boolean;
|
|
54
|
+
/** Total arc length of a centerline in world units. */
|
|
55
|
+
export declare function pathLength(path: readonly RoadPoint[]): number;
|