@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,69 @@
|
|
|
1
|
+
function metaString(meta, key) {
|
|
2
|
+
const value = meta?.[key];
|
|
3
|
+
return typeof value === "string" && value.length > 0 ? value : null;
|
|
4
|
+
}
|
|
5
|
+
function metaNumber(meta, key) {
|
|
6
|
+
const value = meta?.[key];
|
|
7
|
+
return typeof value === "number" && Number.isFinite(value) ? value : null;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Catalog id for a marker: first-class `catalogId` field, else `meta.catalogId` migration alias.
|
|
11
|
+
* Returns null when the marker is not an authored catalog prop (spawn, mob, generator, …).
|
|
12
|
+
* @capability authored-objects place catalog mesh props from an editor document
|
|
13
|
+
*/
|
|
14
|
+
export function markerCatalogId(marker) {
|
|
15
|
+
if (typeof marker.catalogId === "string" && marker.catalogId.length > 0)
|
|
16
|
+
return marker.catalogId;
|
|
17
|
+
return metaString(marker.meta, "catalogId");
|
|
18
|
+
}
|
|
19
|
+
function markerVerticalOffset(marker) {
|
|
20
|
+
const fromMeta = metaNumber(marker.meta, "verticalOffset") ??
|
|
21
|
+
metaNumber(marker.meta, "offsetY") ??
|
|
22
|
+
metaNumber(marker.meta, "yOffset");
|
|
23
|
+
return fromMeta ?? 0;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Every marker carrying a catalog id, as placeable props — pure, no terrain sample. Parallel to
|
|
27
|
+
* {@link resolveScatter}: games and headless tests read the same list `<AuthoredObjects>` places.
|
|
28
|
+
* @capability authored-objects place catalog mesh props from an editor document
|
|
29
|
+
*/
|
|
30
|
+
export function resolveAuthoredObjects(document) {
|
|
31
|
+
const out = [];
|
|
32
|
+
for (const marker of document.markers) {
|
|
33
|
+
const catalogId = markerCatalogId(marker);
|
|
34
|
+
if (catalogId === null)
|
|
35
|
+
continue;
|
|
36
|
+
out.push({
|
|
37
|
+
catalogId,
|
|
38
|
+
x: marker.position.x,
|
|
39
|
+
z: marker.position.z,
|
|
40
|
+
rotationY: marker.rotationY ?? 0,
|
|
41
|
+
instanceId: marker.id,
|
|
42
|
+
verticalOffset: markerVerticalOffset(marker),
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
return out;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Places resolved authored objects into an object store, grounding each on `sampleHeight(x,z)` plus
|
|
49
|
+
* per-object and options vertical offsets. Returns the instance ids that were placed (or kept).
|
|
50
|
+
* @capability authored-objects place catalog mesh props from an editor document
|
|
51
|
+
*/
|
|
52
|
+
export function placeAuthoredObjects(store, objects, sampleHeight, options = {}) {
|
|
53
|
+
const lift = options.verticalOffset ?? 0;
|
|
54
|
+
const onExisting = options.onExisting;
|
|
55
|
+
const ids = [];
|
|
56
|
+
for (const object of objects) {
|
|
57
|
+
const y = sampleHeight(object.x, object.z) + object.verticalOffset + lift;
|
|
58
|
+
ids.push(store.place(object.catalogId, object.x, y, object.z, {
|
|
59
|
+
instanceId: object.instanceId,
|
|
60
|
+
rotation: object.rotationY,
|
|
61
|
+
...(onExisting === undefined ? {} : { onExisting }),
|
|
62
|
+
}));
|
|
63
|
+
}
|
|
64
|
+
return ids;
|
|
65
|
+
}
|
|
66
|
+
/** Convenience: resolve a document then place every authored catalog prop. */
|
|
67
|
+
export function placeAuthoredObjectsFromDocument(store, document, sampleHeight, options = {}) {
|
|
68
|
+
return placeAuthoredObjects(store, resolveAuthoredObjects(document), sampleHeight, options);
|
|
69
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The building generator registered against the {@link registerAssetGenerator} seam — the one engine
|
|
3
|
+
* adopter, proving the seeded config→parts building generator ({@link generateBuilding}) drops into
|
|
4
|
+
* the parametric-asset catalog with a slider schema and nothing bespoke. Domain generators (bookcase,
|
|
5
|
+
* …) register the same way from example/game code.
|
|
6
|
+
*
|
|
7
|
+
* @capability building-generator seeded building as a placeable parametric asset
|
|
8
|
+
*/
|
|
9
|
+
import { type GeneratedAsset } from "../scene/assetGenerator.js";
|
|
10
|
+
import type { ParamSchema, ParsedParams } from "../scene/sceneKinds.js";
|
|
11
|
+
/** The generator id a catalog entry / placed marker references. */
|
|
12
|
+
export declare const BUILDING_GENERATOR_ID = "building";
|
|
13
|
+
/** The building generator's slider schema — drives the inspector via #809. */
|
|
14
|
+
export declare const BUILDING_GENERATOR_SCHEMA: ParamSchema;
|
|
15
|
+
/** Generate a building's parts from validated params + seed — the {@link registerAssetGenerator} hook. @internal */
|
|
16
|
+
export declare function generateBuildingAsset(params: ParsedParams, seed: string): GeneratedAsset;
|
|
17
|
+
/** Register the building generator asset. Called by {@link registerBuiltinSceneKinds}. @internal */
|
|
18
|
+
export declare function registerBuildingGenerator(): void;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The building generator registered against the {@link registerAssetGenerator} seam — the one engine
|
|
3
|
+
* adopter, proving the seeded config→parts building generator ({@link generateBuilding}) drops into
|
|
4
|
+
* the parametric-asset catalog with a slider schema and nothing bespoke. Domain generators (bookcase,
|
|
5
|
+
* …) register the same way from example/game code.
|
|
6
|
+
*
|
|
7
|
+
* @capability building-generator seeded building as a placeable parametric asset
|
|
8
|
+
*/
|
|
9
|
+
import { registerAssetGenerator, partsBounds } from "../scene/assetGenerator.js";
|
|
10
|
+
import { BUILDING_STYLE_PALETTES, DEFAULT_BUILDING_CONFIG, generateBuilding, resolveBuildingPalette } from "./buildings.js";
|
|
11
|
+
/** The generator id a catalog entry / placed marker references. */
|
|
12
|
+
export const BUILDING_GENERATOR_ID = "building";
|
|
13
|
+
/** The building generator's slider schema — drives the inspector via #809. */
|
|
14
|
+
export const BUILDING_GENERATOR_SCHEMA = {
|
|
15
|
+
fields: [
|
|
16
|
+
{ type: "range", key: "floors", label: "floors", min: 1, max: 20, step: 1, default: DEFAULT_BUILDING_CONFIG.floors },
|
|
17
|
+
{ type: "range", key: "baysWide", label: "bays wide", min: 1, max: 12, step: 1, default: DEFAULT_BUILDING_CONFIG.baysWide },
|
|
18
|
+
{ type: "range", key: "baysDeep", label: "bays deep", min: 1, max: 12, step: 1, default: DEFAULT_BUILDING_CONFIG.baysDeep },
|
|
19
|
+
{ type: "range", key: "bayWidth", label: "bay width", min: 1, max: 5, step: 0.1, default: DEFAULT_BUILDING_CONFIG.bayWidth, unit: "m" },
|
|
20
|
+
{ type: "range", key: "floorHeight", label: "floor height", min: 2, max: 5, step: 0.1, default: DEFAULT_BUILDING_CONFIG.floorHeight, unit: "m" },
|
|
21
|
+
{
|
|
22
|
+
type: "select",
|
|
23
|
+
key: "style",
|
|
24
|
+
label: "style",
|
|
25
|
+
default: "generic",
|
|
26
|
+
options: Object.keys(BUILDING_STYLE_PALETTES).map((style) => ({ value: style })),
|
|
27
|
+
},
|
|
28
|
+
{ type: "seed", key: "seed", label: "seed", default: "" },
|
|
29
|
+
],
|
|
30
|
+
};
|
|
31
|
+
/** Generate a building's parts from validated params + seed — the {@link registerAssetGenerator} hook. @internal */
|
|
32
|
+
export function generateBuildingAsset(params, seed) {
|
|
33
|
+
const style = params["style"];
|
|
34
|
+
const palette = resolveBuildingPalette(style);
|
|
35
|
+
const building = generateBuilding({
|
|
36
|
+
seed,
|
|
37
|
+
center: [0, 0],
|
|
38
|
+
floors: params["floors"],
|
|
39
|
+
baysWide: params["baysWide"],
|
|
40
|
+
baysDeep: params["baysDeep"],
|
|
41
|
+
bayWidth: params["bayWidth"],
|
|
42
|
+
floorHeight: params["floorHeight"],
|
|
43
|
+
});
|
|
44
|
+
const parts = building.parts.map((part) => ({
|
|
45
|
+
id: part.id,
|
|
46
|
+
kind: part.kind,
|
|
47
|
+
position: part.position,
|
|
48
|
+
size: part.scale,
|
|
49
|
+
rotationY: part.rotationY,
|
|
50
|
+
color: palette[part.kind],
|
|
51
|
+
}));
|
|
52
|
+
return { parts, bounds: partsBounds(parts) };
|
|
53
|
+
}
|
|
54
|
+
/** Register the building generator asset. Called by {@link registerBuiltinSceneKinds}. @internal */
|
|
55
|
+
export function registerBuildingGenerator() {
|
|
56
|
+
registerAssetGenerator({
|
|
57
|
+
id: BUILDING_GENERATOR_ID,
|
|
58
|
+
label: "Building",
|
|
59
|
+
schema: BUILDING_GENERATOR_SCHEMA,
|
|
60
|
+
generate: generateBuildingAsset,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
@@ -97,8 +97,13 @@ export type BuildingPaletteOverrides = Partial<BuildingPalette>;
|
|
|
97
97
|
export type BuildingStyle = "generic" | "capital" | "village" | "desert" | "industrial" | "coastal" | "neon" | "ruin" | "frontier" | "aerial";
|
|
98
98
|
export declare const DEFAULT_BUILDING_STYLE: BuildingStyle;
|
|
99
99
|
export declare const BUILDING_STYLE_PALETTES: Record<BuildingStyle, BuildingPalette>;
|
|
100
|
+
/** @internal */
|
|
100
101
|
export declare function resolveBuildingPalette(style?: BuildingStyle, overrides?: BuildingPaletteOverrides): BuildingPalette;
|
|
102
|
+
/** @internal */
|
|
101
103
|
export declare function createBuildingConfig(input?: BuildingConfigInput): BuildingConfig;
|
|
104
|
+
/** @internal */
|
|
102
105
|
export declare function generateBuilding(input?: BuildingConfigInput): GeneratedBuilding;
|
|
106
|
+
/** @internal */
|
|
103
107
|
export declare function createBuildingGrid(config: BuildingGridConfig): BuildingLot[];
|
|
108
|
+
/** @internal */
|
|
104
109
|
export declare function generateBuildingDistrict(config: BuildingGridConfig): GeneratedBuilding[];
|
package/dist/world/buildings.js
CHANGED
|
@@ -176,6 +176,7 @@ export const BUILDING_STYLE_PALETTES = {
|
|
|
176
176
|
corner: "#c3d0d7",
|
|
177
177
|
},
|
|
178
178
|
};
|
|
179
|
+
/** @internal */
|
|
179
180
|
export function resolveBuildingPalette(style = DEFAULT_BUILDING_STYLE, overrides) {
|
|
180
181
|
const preset = BUILDING_STYLE_PALETTES[style];
|
|
181
182
|
if (preset === undefined) {
|
|
@@ -228,6 +229,7 @@ function rangeInt(seed, key, min, max) {
|
|
|
228
229
|
const hi = Math.max(min, max);
|
|
229
230
|
return lo + Math.floor(hash01(seed, key) * (hi - lo + 1));
|
|
230
231
|
}
|
|
232
|
+
/** @internal */
|
|
231
233
|
export function createBuildingConfig(input = {}) {
|
|
232
234
|
return {
|
|
233
235
|
id: input.id ?? DEFAULT_BUILDING_CONFIG.id,
|
|
@@ -406,6 +408,7 @@ function pushCorners(parts, config, width, depth) {
|
|
|
406
408
|
parts.push(part(config, "corner", index < 2 ? "back" : "front", position, [config.facadeDepth * 1.35, height, config.facadeDepth * 1.35], `corner:${index}`, undefined, ["structure"]));
|
|
407
409
|
});
|
|
408
410
|
}
|
|
411
|
+
/** @internal */
|
|
409
412
|
export function generateBuilding(input = {}) {
|
|
410
413
|
const config = createBuildingConfig(input);
|
|
411
414
|
const width = config.baysWide * config.bayWidth;
|
|
@@ -429,6 +432,7 @@ export function generateBuilding(input = {}) {
|
|
|
429
432
|
parts,
|
|
430
433
|
};
|
|
431
434
|
}
|
|
435
|
+
/** @internal */
|
|
432
436
|
export function createBuildingGrid(config) {
|
|
433
437
|
const rows = positiveInt(config.rows, 1);
|
|
434
438
|
const columns = positiveInt(config.columns, 1);
|
|
@@ -467,6 +471,7 @@ export function createBuildingGrid(config) {
|
|
|
467
471
|
}
|
|
468
472
|
return lots;
|
|
469
473
|
}
|
|
474
|
+
/** @internal */
|
|
470
475
|
export function generateBuildingDistrict(config) {
|
|
471
476
|
return createBuildingGrid(config).map((lot) => generateBuilding(lot.config));
|
|
472
477
|
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic sag/catenary curve → point string, ready to loft into a tube. Genre-agnostic — power lines,
|
|
3
|
+
* suspension-bridge cables, ziplines, ropes, hanging chains, festoon lights all hang the same way.
|
|
4
|
+
* `sagCurve` is a cheap quadratic-Bézier droop; `catenaryCurve` is the true cosh hyperbolic cable.
|
|
5
|
+
*
|
|
6
|
+
* @capability catenary sagging cable curve between two anchors
|
|
7
|
+
*/
|
|
8
|
+
export type { Vec3 } from "./geometry.js";
|
|
9
|
+
import type { Vec3 } from "./geometry.js";
|
|
10
|
+
/**
|
|
11
|
+
* Quadratic-Bézier sag between two anchors: the control point is pulled straight down so the mid-span
|
|
12
|
+
* lowest point droops by exactly `sag` meters below the chord. Cheap and stable; the go-to for cables
|
|
13
|
+
* where exact catenary physics don't matter. Returns `segments + 1` points.
|
|
14
|
+
*/
|
|
15
|
+
export declare function sagCurve(a: Vec3, b: Vec3, sag: number, segments: number): Vec3[];
|
|
16
|
+
/**
|
|
17
|
+
* True hyperbolic catenary between two anchors — the shape a uniform cable actually takes under
|
|
18
|
+
* gravity. `slack` is the extra length beyond the straight-line distance, as a fraction (0.1 = 10%
|
|
19
|
+
* longer than taut); larger slack droops deeper. Falls back to {@link sagCurve} for a near-taut cable.
|
|
20
|
+
* Returns `segments + 1` points. Anchors may differ in height; the curve interpolates the chord.
|
|
21
|
+
*/
|
|
22
|
+
export declare function catenaryCurve(a: Vec3, b: Vec3, slack: number, segments: number): Vec3[];
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic sag/catenary curve → point string, ready to loft into a tube. Genre-agnostic — power lines,
|
|
3
|
+
* suspension-bridge cables, ziplines, ropes, hanging chains, festoon lights all hang the same way.
|
|
4
|
+
* `sagCurve` is a cheap quadratic-Bézier droop; `catenaryCurve` is the true cosh hyperbolic cable.
|
|
5
|
+
*
|
|
6
|
+
* @capability catenary sagging cable curve between two anchors
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Quadratic-Bézier sag between two anchors: the control point is pulled straight down so the mid-span
|
|
10
|
+
* lowest point droops by exactly `sag` meters below the chord. Cheap and stable; the go-to for cables
|
|
11
|
+
* where exact catenary physics don't matter. Returns `segments + 1` points.
|
|
12
|
+
*/
|
|
13
|
+
export function sagCurve(a, b, sag, segments) {
|
|
14
|
+
const steps = Math.max(2, Math.round(segments));
|
|
15
|
+
const cx = (a[0] + b[0]) / 2;
|
|
16
|
+
const cy = (a[1] + b[1]) / 2 - 2 * sag;
|
|
17
|
+
const cz = (a[2] + b[2]) / 2;
|
|
18
|
+
const points = [];
|
|
19
|
+
for (let i = 0; i <= steps; i += 1) {
|
|
20
|
+
const t = i / steps;
|
|
21
|
+
const u = 1 - t;
|
|
22
|
+
const w0 = u * u;
|
|
23
|
+
const w1 = 2 * u * t;
|
|
24
|
+
const w2 = t * t;
|
|
25
|
+
points.push([w0 * a[0] + w1 * cx + w2 * b[0], w0 * a[1] + w1 * cy + w2 * b[1], w0 * a[2] + w1 * cz + w2 * b[2]]);
|
|
26
|
+
}
|
|
27
|
+
return points;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* True hyperbolic catenary between two anchors — the shape a uniform cable actually takes under
|
|
31
|
+
* gravity. `slack` is the extra length beyond the straight-line distance, as a fraction (0.1 = 10%
|
|
32
|
+
* longer than taut); larger slack droops deeper. Falls back to {@link sagCurve} for a near-taut cable.
|
|
33
|
+
* Returns `segments + 1` points. Anchors may differ in height; the curve interpolates the chord.
|
|
34
|
+
*/
|
|
35
|
+
export function catenaryCurve(a, b, slack, segments) {
|
|
36
|
+
const steps = Math.max(2, Math.round(segments));
|
|
37
|
+
const dx = b[0] - a[0];
|
|
38
|
+
const dz = b[2] - a[2];
|
|
39
|
+
const horizontal = Math.hypot(dx, dz);
|
|
40
|
+
if (horizontal < 1e-4 || slack <= 0)
|
|
41
|
+
return sagCurve(a, b, Math.max(0, slack) * horizontal * 0.5, steps);
|
|
42
|
+
const length = horizontal * (1 + slack);
|
|
43
|
+
// Solve the catenary parameter `p` (= a in y=p·cosh(x/p)) for the required arc length via bisection.
|
|
44
|
+
const targetRatio = length / horizontal;
|
|
45
|
+
let lo = 1e-3;
|
|
46
|
+
let hi = 1e6;
|
|
47
|
+
for (let i = 0; i < 48; i += 1) {
|
|
48
|
+
const mid = (lo + hi) / 2;
|
|
49
|
+
const ratio = (2 * mid * Math.sinh(horizontal / (2 * mid))) / horizontal;
|
|
50
|
+
if (ratio > targetRatio)
|
|
51
|
+
lo = mid;
|
|
52
|
+
else
|
|
53
|
+
hi = mid;
|
|
54
|
+
}
|
|
55
|
+
const p = (lo + hi) / 2;
|
|
56
|
+
const edge = p * Math.cosh(horizontal / (2 * p));
|
|
57
|
+
const points = [];
|
|
58
|
+
for (let i = 0; i <= steps; i += 1) {
|
|
59
|
+
const t = i / steps;
|
|
60
|
+
const x = a[0] + dx * t;
|
|
61
|
+
const z = a[2] + dz * t;
|
|
62
|
+
// Local horizontal coordinate centered at mid-span → catenary drop below the chord (0 at ends).
|
|
63
|
+
const local = (t - 0.5) * horizontal;
|
|
64
|
+
const drop = p * Math.cosh(local / p) - edge;
|
|
65
|
+
const chordY = a[1] + (b[1] - a[1]) * t;
|
|
66
|
+
points.push([x, chordY + drop, z]);
|
|
67
|
+
}
|
|
68
|
+
return points;
|
|
69
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type BuildingPalette, type BuildingStyle, type GeneratedBuilding } from "./buildings.js";
|
|
2
|
-
import type { BuildingEnvironmentDescriptor, EnvironmentWorldFeature, WorldBounds } from "./features.js";
|
|
2
|
+
import type { BuildingEnvironmentDescriptor, EnvironmentArea, EnvironmentWorldFeature, WorldBounds } from "./features.js";
|
|
3
3
|
import type { Aabb } from "./geometry.js";
|
|
4
4
|
import { type TerrainPalette } from "./terrain.js";
|
|
5
5
|
export declare function resolveStructureBuildings(descriptor: BuildingEnvironmentDescriptor): GeneratedBuilding[];
|
|
@@ -24,7 +24,7 @@ export interface StructureSummary {
|
|
|
24
24
|
bounds: Aabb;
|
|
25
25
|
}
|
|
26
26
|
export interface VegetationSummary {
|
|
27
|
-
area:
|
|
27
|
+
area: EnvironmentArea;
|
|
28
28
|
density: number;
|
|
29
29
|
}
|
|
30
30
|
export interface WaterSummary {
|
|
@@ -33,8 +33,15 @@ export interface WaterSummary {
|
|
|
33
33
|
}
|
|
34
34
|
export interface WeatherSummary {
|
|
35
35
|
kind: "rain" | "snow";
|
|
36
|
+
area: EnvironmentArea;
|
|
36
37
|
density: number;
|
|
37
38
|
}
|
|
39
|
+
/** One road descriptor's resolved footprint: vertex count, width, and total centerline length. */
|
|
40
|
+
export interface RoadSummary {
|
|
41
|
+
points: number;
|
|
42
|
+
width: number;
|
|
43
|
+
length: number;
|
|
44
|
+
}
|
|
38
45
|
export interface EnvironmentCounts {
|
|
39
46
|
terrain: number;
|
|
40
47
|
islands: number;
|
|
@@ -44,6 +51,7 @@ export interface EnvironmentCounts {
|
|
|
44
51
|
vegetationFields: number;
|
|
45
52
|
waterBodies: number;
|
|
46
53
|
weatherSystems: number;
|
|
54
|
+
roads: number;
|
|
47
55
|
}
|
|
48
56
|
export interface IslandSummary extends TerrainSummary {
|
|
49
57
|
origin: readonly [number, number];
|
|
@@ -55,6 +63,7 @@ export interface EnvironmentSummary {
|
|
|
55
63
|
vegetation: readonly VegetationSummary[];
|
|
56
64
|
water: readonly WaterSummary[];
|
|
57
65
|
weather: readonly WeatherSummary[];
|
|
66
|
+
roads: readonly RoadSummary[];
|
|
58
67
|
counts: EnvironmentCounts;
|
|
59
68
|
isEmpty: boolean;
|
|
60
69
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { generateBuildingDistrict, resolveBuildingPalette, } from "./buildings.js";
|
|
2
|
+
import { pathLength } from "./roads.js";
|
|
2
3
|
import { resolveTerrainField, resolveTerrainPalette } from "./terrain.js";
|
|
3
4
|
export function resolveStructureBuildings(descriptor) {
|
|
4
5
|
const columns = Math.max(1, Math.ceil(Math.sqrt(descriptor.count)));
|
|
@@ -106,8 +107,14 @@ export function summarizeEnvironment(feature) {
|
|
|
106
107
|
}));
|
|
107
108
|
const weather = (feature.weather ?? []).map((entry) => ({
|
|
108
109
|
kind: entry.kind,
|
|
110
|
+
area: entry.area,
|
|
109
111
|
density: entry.density,
|
|
110
112
|
}));
|
|
113
|
+
const roads = (feature.roads ?? []).map((entry) => ({
|
|
114
|
+
points: entry.path.length,
|
|
115
|
+
width: entry.width,
|
|
116
|
+
length: pathLength(entry.path),
|
|
117
|
+
}));
|
|
111
118
|
const buildings = structures.reduce((sum, entry) => sum + entry.buildings, 0);
|
|
112
119
|
const counts = {
|
|
113
120
|
terrain: terrain === undefined ? 0 : 1,
|
|
@@ -118,13 +125,15 @@ export function summarizeEnvironment(feature) {
|
|
|
118
125
|
vegetationFields: vegetation.length,
|
|
119
126
|
waterBodies: water.length,
|
|
120
127
|
weatherSystems: weather.length,
|
|
128
|
+
roads: roads.length,
|
|
121
129
|
};
|
|
122
130
|
const isEmpty = counts.terrain === 0 &&
|
|
123
131
|
counts.islands === 0 &&
|
|
124
132
|
buildings === 0 &&
|
|
125
133
|
counts.vegetationFields === 0 &&
|
|
126
134
|
counts.waterBodies === 0 &&
|
|
127
|
-
counts.weatherSystems === 0
|
|
135
|
+
counts.weatherSystems === 0 &&
|
|
136
|
+
counts.roads === 0;
|
|
128
137
|
return {
|
|
129
138
|
...(terrain === undefined ? {} : { terrain }),
|
|
130
139
|
islands,
|
|
@@ -132,6 +141,7 @@ export function summarizeEnvironment(feature) {
|
|
|
132
141
|
vegetation,
|
|
133
142
|
water,
|
|
134
143
|
weather,
|
|
144
|
+
roads,
|
|
135
145
|
counts,
|
|
136
146
|
isEmpty,
|
|
137
147
|
};
|