@jgengine/core 0.10.0 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +39 -2
- package/LICENSE +203 -661
- package/README.md +1 -1
- package/dist/ai/crowd.d.ts +55 -0
- package/dist/ai/crowd.js +114 -0
- package/dist/ai/flock.d.ts +5 -2
- package/dist/ai/flock.js +5 -2
- package/dist/ai/groupAssist.d.ts +1 -0
- package/dist/ai/groupAssist.js +1 -0
- package/dist/ai/heatSystem.d.ts +76 -0
- package/dist/ai/heatSystem.js +97 -0
- package/dist/ai/interestScheduler.d.ts +107 -0
- package/dist/ai/interestScheduler.js +118 -0
- package/dist/ai/jobBoard.d.ts +1 -0
- package/dist/ai/jobBoard.js +1 -0
- package/dist/ai/laneSelect.d.ts +5 -2
- package/dist/ai/laneSelect.js +5 -2
- package/dist/ai/mobBrain.d.ts +1 -0
- package/dist/ai/mobBrain.js +1 -0
- package/dist/ai/populationDirector.d.ts +103 -0
- package/dist/ai/populationDirector.js +190 -0
- package/dist/ai/pursuit.d.ts +56 -0
- package/dist/ai/pursuit.js +53 -0
- package/dist/ai/spawnDirector.d.ts +7 -2
- package/dist/ai/spawnDirector.js +18 -15
- package/dist/ai/spawnPoint.d.ts +3 -1
- package/dist/ai/spawnPoint.js +3 -1
- package/dist/ai/targetAcquisition.d.ts +84 -0
- package/dist/ai/targetAcquisition.js +92 -0
- package/dist/anim/easing.d.ts +19 -0
- package/dist/anim/easing.js +19 -0
- package/dist/anim/oscillator.d.ts +12 -0
- package/dist/anim/oscillator.js +25 -0
- package/dist/area/areaEffectField.d.ts +127 -0
- package/dist/area/areaEffectField.js +175 -0
- package/dist/area/stackPolicy.d.ts +47 -0
- package/dist/area/stackPolicy.js +99 -0
- package/dist/authoring.d.ts +2 -1
- package/dist/authoring.js +2 -1
- package/dist/board/laneBoard.d.ts +13 -0
- package/dist/board/laneBoard.js +13 -0
- package/dist/board/timelineBoard.d.ts +10 -0
- package/dist/board/timelineBoard.js +10 -0
- package/dist/combat/abilityKit.d.ts +18 -0
- package/dist/combat/abilityKit.js +24 -9
- package/dist/combat/animationState.d.ts +5 -0
- package/dist/combat/animationState.js +5 -0
- package/dist/combat/breakMeters.d.ts +10 -0
- package/dist/combat/breakMeters.js +10 -0
- package/dist/combat/castRunner.d.ts +5 -0
- package/dist/combat/castRunner.js +5 -0
- package/dist/combat/comboPoints.d.ts +5 -0
- package/dist/combat/comboPoints.js +5 -0
- package/dist/combat/comboString.d.ts +5 -0
- package/dist/combat/comboString.js +5 -0
- package/dist/combat/damageInterceptors.d.ts +192 -0
- package/dist/combat/damageInterceptors.js +251 -0
- package/dist/combat/damageMatchup.d.ts +68 -0
- package/dist/combat/damageMatchup.js +42 -0
- package/dist/combat/damageResolution.d.ts +63 -0
- package/dist/combat/damageResolution.js +50 -0
- package/dist/combat/death.d.ts +7 -1
- package/dist/combat/death.js +5 -0
- package/dist/combat/deathReason.d.ts +14 -0
- package/dist/combat/deathReason.js +1 -0
- package/dist/combat/defensiveWindow.d.ts +5 -0
- package/dist/combat/defensiveWindow.js +5 -0
- package/dist/combat/dotField.d.ts +5 -1
- package/dist/combat/dotField.js +5 -1
- package/dist/combat/downed.d.ts +5 -0
- package/dist/combat/downed.js +5 -0
- package/dist/combat/effects.d.ts +5 -0
- package/dist/combat/effects.js +5 -0
- package/dist/combat/encounterSequence.d.ts +258 -0
- package/dist/combat/encounterSequence.js +426 -0
- package/dist/combat/hitReaction.d.ts +57 -1
- package/dist/combat/hitReaction.js +45 -5
- package/dist/combat/magazine.d.ts +54 -0
- package/dist/combat/magazine.js +96 -0
- package/dist/combat/projectiles.d.ts +5 -0
- package/dist/combat/projectiles.js +32 -14
- package/dist/combat/receivedDamage.d.ts +117 -0
- package/dist/combat/receivedDamage.js +92 -0
- package/dist/combat/regenShield.d.ts +5 -1
- package/dist/combat/regenShield.js +5 -1
- package/dist/combat/renderCues.d.ts +51 -0
- package/dist/combat/renderCues.js +44 -0
- package/dist/combat/resourcePool.d.ts +5 -0
- package/dist/combat/resourcePool.js +5 -0
- package/dist/combat/rewardAllocation.d.ts +121 -0
- package/dist/combat/rewardAllocation.js +251 -0
- package/dist/combat/shotOrigin.d.ts +18 -1
- package/dist/combat/shotOrigin.js +39 -0
- package/dist/combat/statusApplication.d.ts +96 -0
- package/dist/combat/statusApplication.js +81 -0
- package/dist/combat/telegraph.d.ts +11 -2
- package/dist/combat/telegraph.js +11 -2
- package/dist/combat/thresholdCrossings.d.ts +85 -0
- package/dist/combat/thresholdCrossings.js +116 -0
- package/dist/combat.d.ts +35 -0
- package/dist/combat.js +35 -0
- package/dist/commands/commandRegistry.d.ts +11 -0
- package/dist/commands/commandRegistry.js +9 -2
- package/dist/crafting/crop.d.ts +18 -0
- package/dist/crafting/crop.js +18 -0
- package/dist/crafting/production.d.ts +5 -0
- package/dist/crafting/production.js +5 -0
- package/dist/devtools/controls.d.ts +38 -0
- package/dist/devtools/controls.js +181 -0
- package/dist/devtools/devtools.d.ts +5 -197
- package/dist/devtools/devtools.js +38 -774
- package/dist/devtools/discover.d.ts +32 -0
- package/dist/devtools/discover.js +240 -0
- package/dist/devtools/fallbackSeams.d.ts +50 -0
- package/dist/devtools/fallbackSeams.js +111 -0
- package/dist/devtools/frame.d.ts +15 -0
- package/dist/devtools/frame.js +247 -0
- package/dist/devtools/logs.d.ts +15 -0
- package/dist/devtools/logs.js +86 -0
- package/dist/devtools/overrides.d.ts +16 -0
- package/dist/devtools/overrides.js +66 -0
- package/dist/devtools/rewriteTunables.d.ts +17 -0
- package/dist/devtools/rewriteTunables.js +276 -0
- package/dist/devtools/saveEndpoint.d.ts +46 -0
- package/dist/devtools/saveEndpoint.js +48 -0
- package/dist/devtools/transformTunables.d.ts +3 -0
- package/dist/devtools/transformTunables.js +3 -0
- package/dist/devtools/tunableSchema.d.ts +31 -0
- package/dist/devtools/tunableSchema.js +31 -0
- package/dist/devtools/types.d.ts +212 -0
- package/dist/devtools/types.js +1 -0
- package/dist/economy/auctionBook.d.ts +122 -0
- package/dist/economy/auctionBook.js +213 -0
- package/dist/economy/currency.d.ts +12 -1
- package/dist/economy/currency.js +12 -1
- package/dist/economy/listingBook.d.ts +91 -0
- package/dist/economy/listingBook.js +144 -0
- package/dist/economy/priceHistory.d.ts +44 -0
- package/dist/economy/priceHistory.js +89 -0
- package/dist/economy/resourceLedger.d.ts +222 -0
- package/dist/economy/resourceLedger.js +353 -0
- package/dist/economy/sharedWallet.d.ts +14 -0
- package/dist/economy/sharedWallet.js +14 -0
- package/dist/economy/techTree.d.ts +12 -0
- package/dist/economy/techTree.js +12 -0
- package/dist/economy/unlockPoints.d.ts +92 -0
- package/dist/economy/unlockPoints.js +103 -0
- package/dist/economy/wallet.d.ts +26 -2
- package/dist/economy/wallet.js +35 -6
- package/dist/editor/commandApply.d.ts +5 -0
- package/dist/editor/commandApply.js +755 -0
- package/dist/editor/commands.d.ts +235 -7
- package/dist/editor/commands.js +82 -124
- package/dist/editor/directives.d.ts +94 -0
- package/dist/editor/directives.js +206 -0
- package/dist/editor/document.d.ts +194 -13
- package/dist/editor/document.js +1166 -19
- package/dist/editor/entityCatalog.d.ts +42 -0
- package/dist/editor/entityCatalog.js +101 -0
- package/dist/editor/environment.d.ts +74 -0
- package/dist/editor/environment.js +169 -0
- package/dist/editor/grid.d.ts +229 -0
- package/dist/editor/grid.js +366 -0
- package/dist/editor/gridAdapters.d.ts +80 -0
- package/dist/editor/gridAdapters.js +134 -0
- package/dist/editor/index.d.ts +98 -6
- package/dist/editor/index.js +13 -2
- package/dist/editor/liveSync.d.ts +127 -0
- package/dist/editor/liveSync.js +249 -0
- package/dist/editor/minimap.d.ts +31 -0
- package/dist/editor/minimap.js +73 -0
- package/dist/editor/runtimeInspector.d.ts +88 -0
- package/dist/editor/runtimeInspector.js +239 -0
- package/dist/editor/streamer.d.ts +66 -0
- package/dist/editor/streamer.js +68 -0
- package/dist/editor/types.d.ts +250 -1
- package/dist/editor/world.d.ts +136 -0
- package/dist/editor/world.js +303 -0
- package/dist/faction/reputation.d.ts +5 -0
- package/dist/faction/reputation.js +5 -0
- package/dist/format/distance.d.ts +17 -0
- package/dist/format/distance.js +18 -0
- package/dist/format/duration.d.ts +27 -0
- package/dist/format/duration.js +45 -0
- package/dist/format/speed.d.ts +17 -0
- package/dist/format/speed.js +25 -0
- package/dist/game/breeding.d.ts +161 -0
- package/dist/game/breeding.js +181 -0
- package/dist/game/cameraConfig.d.ts +451 -0
- package/dist/game/cameraConfig.js +1 -0
- package/dist/game/connectedPlayers.d.ts +6 -4
- package/dist/game/connectedPlayers.js +2 -2
- package/dist/game/cosmetics.d.ts +9 -0
- package/dist/game/cosmetics.js +16 -0
- package/dist/game/defineGame.d.ts +110 -5
- package/dist/game/defineGame.js +49 -4
- package/dist/game/defineSystem.d.ts +90 -0
- package/dist/game/defineSystem.js +47 -0
- package/dist/game/dialogue.d.ts +33 -0
- package/dist/game/dialogue.js +21 -0
- package/dist/game/events.d.ts +63 -13
- package/dist/game/events.js +5 -0
- package/dist/game/feed.d.ts +33 -0
- package/dist/game/feed.js +35 -2
- package/dist/game/gamePhase.d.ts +11 -0
- package/dist/game/gamePhase.js +16 -0
- package/dist/game/leaderboard.d.ts +5 -0
- package/dist/game/leaderboard.js +5 -0
- package/dist/game/loadout.d.ts +5 -0
- package/dist/game/loadout.js +5 -0
- package/dist/game/lootFilter.d.ts +2 -0
- package/dist/game/lootFilter.js +2 -0
- package/dist/game/lootPipeline.d.ts +164 -0
- package/dist/game/lootPipeline.js +216 -0
- package/dist/game/lootTable.d.ts +19 -2
- package/dist/game/lootTable.js +15 -5
- package/dist/game/objectives.d.ts +43 -0
- package/dist/game/objectives.js +36 -0
- package/dist/game/paramLayers.d.ts +148 -0
- package/dist/game/paramLayers.js +185 -0
- package/dist/game/ping.d.ts +5 -0
- package/dist/game/ping.js +5 -0
- package/dist/game/playableGame.d.ts +116 -432
- package/dist/game/playableGame.js +1 -1
- package/dist/game/progression.d.ts +35 -0
- package/dist/game/progression.js +19 -0
- package/dist/game/quest.d.ts +8 -0
- package/dist/game/quest.js +30 -3
- package/dist/game/race.d.ts +141 -0
- package/dist/game/race.js +169 -0
- package/dist/game/recordBook.d.ts +3 -1
- package/dist/game/recordBook.js +4 -1
- package/dist/game/ruleSelection.d.ts +75 -0
- package/dist/game/ruleSelection.js +127 -0
- package/dist/game/runDraft.d.ts +5 -0
- package/dist/game/runDraft.js +5 -0
- package/dist/game/saveStore.d.ts +111 -0
- package/dist/game/saveStore.js +312 -0
- package/dist/game/snapshotHistory.d.ts +67 -0
- package/dist/game/snapshotHistory.js +95 -0
- package/dist/game/social.d.ts +38 -1
- package/dist/game/social.js +71 -0
- package/dist/game/spawnPoints.d.ts +5 -0
- package/dist/game/spawnPoints.js +5 -0
- package/dist/game/systemRuntime.d.ts +50 -0
- package/dist/game/systemRuntime.js +157 -0
- package/dist/game/systemSchedule.d.ts +72 -0
- package/dist/game/systemSchedule.js +242 -0
- package/dist/game/toasts.d.ts +43 -0
- package/dist/game/toasts.js +44 -0
- package/dist/game/trade.d.ts +10 -0
- package/dist/game/trade.js +10 -0
- package/dist/game/tribe.d.ts +184 -0
- package/dist/game/tribe.js +432 -0
- package/dist/game/unlocks.d.ts +8 -0
- package/dist/game/unlocks.js +16 -0
- package/dist/game/vfxInstance.d.ts +138 -0
- package/dist/game/vfxInstance.js +96 -0
- package/dist/game/worldItem.d.ts +17 -4
- package/dist/game/worldItem.js +17 -4
- package/dist/gameplay.d.ts +93 -0
- package/dist/gameplay.js +93 -0
- package/dist/index.d.ts +5 -14
- package/dist/index.js +5 -14
- package/dist/input/actionBindings.d.ts +23 -6
- package/dist/input/actionBindings.js +23 -6
- package/dist/input/axisInput.d.ts +7 -2
- package/dist/input/axisInput.js +7 -2
- package/dist/input/controlGroups.d.ts +67 -0
- package/dist/input/controlGroups.js +41 -0
- package/dist/input/touchScheme.d.ts +82 -6
- package/dist/input/touchScheme.js +123 -10
- package/dist/interaction/lockpick.d.ts +61 -0
- package/dist/interaction/lockpick.js +168 -0
- package/dist/interaction/proximityPrompt.d.ts +2 -0
- package/dist/interaction/proximityPrompt.js +2 -0
- package/dist/interaction/qte.d.ts +5 -0
- package/dist/interaction/qte.js +5 -0
- package/dist/interaction/skillCheck.d.ts +5 -0
- package/dist/interaction/skillCheck.js +5 -0
- package/dist/inventory/encumbrance.d.ts +69 -0
- package/dist/inventory/encumbrance.js +68 -0
- package/dist/inventory/inventoryModel.d.ts +12 -0
- package/dist/inventory/inventoryModel.js +12 -0
- package/dist/inventory/shapedGrid.d.ts +16 -0
- package/dist/inventory/shapedGrid.js +16 -0
- package/dist/inventory/slotModel.d.ts +10 -0
- package/dist/inventory/slotModel.js +10 -0
- package/dist/item/durability.d.ts +5 -0
- package/dist/item/durability.js +6 -3
- package/dist/item/itemIdentity.d.ts +171 -0
- package/dist/item/itemIdentity.js +138 -0
- package/dist/item/itemInstanceRegistry.d.ts +32 -0
- package/dist/item/itemInstanceRegistry.js +34 -0
- package/dist/item/itemgen.d.ts +163 -0
- package/dist/item/itemgen.js +151 -0
- package/dist/item/modularItem.d.ts +5 -0
- package/dist/item/modularItem.js +5 -0
- package/dist/item/use.d.ts +5 -0
- package/dist/item/use.js +5 -0
- package/dist/item/useBehavior.d.ts +142 -0
- package/dist/item/useBehavior.js +105 -0
- package/dist/item/weapon.d.ts +5 -0
- package/dist/item/weapon.js +5 -0
- package/dist/math/scalar.d.ts +25 -0
- package/dist/math/scalar.js +47 -0
- package/dist/meta/changelog.d.ts +4 -1
- package/dist/meta/changelog.js +39 -2
- package/dist/movement/avoidance.d.ts +45 -0
- package/dist/movement/avoidance.js +123 -0
- package/dist/movement/cameraRig.d.ts +8 -0
- package/dist/movement/cameraRig.js +8 -0
- package/dist/movement/dash.d.ts +11 -0
- package/dist/movement/dash.js +11 -0
- package/dist/movement/formation.d.ts +135 -0
- package/dist/movement/formation.js +194 -0
- package/dist/movement/glideModel.d.ts +5 -0
- package/dist/movement/glideModel.js +5 -0
- package/dist/movement/grappleSwing.d.ts +5 -0
- package/dist/movement/grappleSwing.js +5 -0
- package/dist/movement/leaderTrail.d.ts +5 -0
- package/dist/movement/leaderTrail.js +5 -0
- package/dist/movement/movementModel.d.ts +50 -9
- package/dist/movement/movementModel.js +75 -29
- package/dist/movement/playerMovement.js +167 -12
- package/dist/movement/poseState.d.ts +13 -0
- package/dist/movement/poseState.js +16 -0
- package/dist/movement/steering.d.ts +8 -0
- package/dist/movement/steering.js +18 -0
- package/dist/multiplayer/combatSnapshot.d.ts +3 -0
- package/dist/multiplayer/combatSnapshot.js +16 -8
- package/dist/multiplayer/lagCompensation.d.ts +5 -0
- package/dist/multiplayer/lagCompensation.js +5 -0
- package/dist/multiplayer/presenceModel.d.ts +11 -1
- package/dist/multiplayer/presenceModel.js +17 -1
- package/dist/multiplayer/simultaneousCommit.d.ts +3 -0
- package/dist/multiplayer/simultaneousCommit.js +3 -0
- package/dist/multiplayer.d.ts +11 -0
- package/dist/multiplayer.js +11 -0
- package/dist/nav/pathFollow.d.ts +57 -0
- package/dist/nav/pathFollow.js +109 -0
- package/dist/orders/orderKinds.d.ts +156 -0
- package/dist/orders/orderKinds.js +197 -0
- package/dist/orders/orderQueue.d.ts +208 -0
- package/dist/orders/orderQueue.js +211 -0
- package/dist/physics/drivableVehicle.d.ts +31 -0
- package/dist/physics/drivableVehicle.js +16 -0
- package/dist/physics/flightDynamics.d.ts +82 -0
- package/dist/physics/flightDynamics.js +165 -0
- package/dist/physics/gravityField.d.ts +25 -0
- package/dist/physics/gravityField.js +41 -0
- package/dist/physics/kinematicVehicle.d.ts +108 -1
- package/dist/physics/kinematicVehicle.js +212 -15
- package/dist/physics/physicsWorld.d.ts +50 -12
- package/dist/physics/physicsWorld.js +120 -122
- package/dist/physics/radialImpulse.d.ts +25 -0
- package/dist/physics/radialImpulse.js +27 -0
- package/dist/physics/vehicleObstacles.d.ts +44 -0
- package/dist/physics/vehicleObstacles.js +115 -0
- package/dist/procedural.d.ts +3 -0
- package/dist/procedural.js +3 -0
- package/dist/progression/statGraph.d.ts +116 -0
- package/dist/progression/statGraph.js +318 -0
- package/dist/puzzle/cellGrid.d.ts +9 -0
- package/dist/puzzle/cellGrid.js +9 -0
- package/dist/puzzle/fallingPiece.d.ts +9 -0
- package/dist/puzzle/fallingPiece.js +9 -0
- package/dist/puzzle/nonogram.d.ts +39 -0
- package/dist/puzzle/nonogram.js +136 -0
- package/dist/random/nameGen.d.ts +5 -0
- package/dist/random/nameGen.js +5 -0
- package/dist/random/pick.d.ts +8 -0
- package/dist/random/pick.js +31 -0
- package/dist/random/rng.d.ts +26 -1
- package/dist/random/rng.js +32 -9
- package/dist/random/seedLink.d.ts +4 -0
- package/dist/random/seedLink.js +4 -0
- package/dist/relation/keyedValues.d.ts +54 -0
- package/dist/relation/keyedValues.js +115 -0
- package/dist/relation/thresholds.d.ts +62 -0
- package/dist/relation/thresholds.js +62 -0
- package/dist/render/color.d.ts +12 -0
- package/dist/render/color.js +26 -0
- package/dist/render/lookPreset.d.ts +41 -0
- package/dist/render/lookPreset.js +29 -0
- package/dist/render/postProcessing.d.ts +20 -0
- package/dist/render/postProcessing.js +21 -1
- package/dist/rules/predicate.d.ts +53 -0
- package/dist/rules/predicate.js +64 -0
- package/dist/rules/ruleEffects.d.ts +38 -0
- package/dist/rules/ruleEffects.js +37 -0
- package/dist/rules/triggeredRules.d.ts +160 -0
- package/dist/rules/triggeredRules.js +241 -0
- package/dist/runtime/adapter.d.ts +55 -3
- package/dist/runtime/adapter.js +57 -1
- package/dist/runtime/cameraDirector.d.ts +1 -0
- package/dist/runtime/cameraDirector.js +1 -0
- package/dist/runtime/commandRunner.d.ts +1 -0
- package/dist/runtime/commandRunner.js +1 -0
- package/dist/runtime/context/combat.d.ts +51 -0
- package/dist/runtime/context/combat.js +130 -0
- package/dist/runtime/context/combatFx.d.ts +23 -0
- package/dist/runtime/context/combatFx.js +161 -0
- package/dist/runtime/context/deathLoot.d.ts +30 -0
- package/dist/runtime/context/deathLoot.js +39 -0
- package/dist/runtime/context/player.d.ts +48 -0
- package/dist/runtime/context/player.js +125 -0
- package/dist/runtime/context/registries.d.ts +13 -0
- package/dist/runtime/context/registries.js +84 -0
- package/dist/runtime/context/scene.d.ts +59 -0
- package/dist/runtime/context/scene.js +291 -0
- package/dist/runtime/context/snapshotCodecs.d.ts +12 -0
- package/dist/runtime/context/snapshotCodecs.js +26 -0
- package/dist/runtime/context/worldItems.d.ts +21 -0
- package/dist/runtime/context/worldItems.js +37 -0
- package/dist/runtime/descriptors/baseline.d.ts +48 -0
- package/dist/runtime/descriptors/baseline.js +157 -0
- package/dist/runtime/descriptors/features.d.ts +79 -0
- package/dist/runtime/descriptors/features.js +299 -0
- package/dist/runtime/gameContext.d.ts +2 -327
- package/dist/runtime/gameContext.js +273 -778
- package/dist/runtime/gameContextTypes.d.ts +467 -0
- package/dist/runtime/gameContextTypes.js +1 -0
- package/dist/runtime/gameRuntime.d.ts +1 -0
- package/dist/runtime/gameRuntime.js +1 -0
- package/dist/runtime/headlessRunner.d.ts +62 -0
- package/dist/runtime/headlessRunner.js +45 -0
- package/dist/runtime/hostPersistence.d.ts +12 -0
- package/dist/runtime/hostPersistence.js +12 -0
- package/dist/runtime/hostPolicy.d.ts +51 -0
- package/dist/runtime/hostPolicy.js +68 -0
- package/dist/runtime/hostedGameRunner.d.ts +11 -4
- package/dist/runtime/hostedGameRunner.js +27 -3
- package/dist/runtime/hostedWorldSession.d.ts +15 -5
- package/dist/runtime/hostedWorldSession.js +12 -4
- package/dist/runtime/inputSnapshot.d.ts +8 -3
- package/dist/runtime/inputSnapshot.js +6 -2
- package/dist/runtime/motionIntents.d.ts +11 -2
- package/dist/runtime/motionIntents.js +16 -2
- package/dist/runtime/perContext.d.ts +15 -0
- package/dist/runtime/perContext.js +21 -0
- package/dist/runtime/runtimeSave.d.ts +79 -0
- package/dist/runtime/runtimeSave.js +105 -0
- package/dist/runtime/save.d.ts +4 -0
- package/dist/runtime/save.js +4 -0
- package/dist/runtime/snapshot.d.ts +7 -0
- package/dist/runtime/snapshot.js +7 -0
- package/dist/runtime/visibility.d.ts +2 -1
- package/dist/runtime/visibility.js +2 -1
- package/dist/runtime/worldChannel.d.ts +7 -3
- package/dist/runtime/worldChannel.js +51 -6
- package/dist/runtime/worldMirror.d.ts +14 -2
- package/dist/runtime/worldMirror.js +15 -2
- package/dist/runtime/worldProjection.d.ts +47 -0
- package/dist/runtime/worldProjection.js +52 -0
- package/dist/runtime/worldReplication.d.ts +30 -7
- package/dist/runtime/worldReplication.js +41 -9
- package/dist/runtime/worldSnapshot.d.ts +42 -3
- package/dist/runtime/worldSnapshot.js +34 -7
- package/dist/scene/assetCatalog.d.ts +26 -0
- package/dist/scene/assetCatalog.js +4 -0
- package/dist/scene/assetDiagnostics.d.ts +69 -0
- package/dist/scene/assetDiagnostics.js +110 -0
- package/dist/scene/assetGenerator.d.ts +65 -0
- package/dist/scene/assetGenerator.js +64 -0
- package/dist/scene/assetSpace.d.ts +137 -0
- package/dist/scene/assetSpace.js +257 -0
- package/dist/scene/authoredTriggers.d.ts +219 -0
- package/dist/scene/authoredTriggers.js +454 -0
- package/dist/scene/behaviorRuntime.d.ts +75 -0
- package/dist/scene/behaviorRuntime.js +217 -0
- package/dist/scene/behaviors.d.ts +14 -2
- package/dist/scene/behaviors.js +7 -2
- package/dist/scene/bodyBind.d.ts +60 -0
- package/dist/scene/bodyBind.js +51 -0
- package/dist/scene/builtinSceneKinds.d.ts +5 -0
- package/dist/scene/builtinSceneKinds.js +67 -0
- package/dist/scene/colliders.d.ts +71 -1
- package/dist/scene/colliders.js +145 -1
- package/dist/scene/collisionMesh.d.ts +94 -0
- package/dist/scene/collisionMesh.js +699 -0
- package/dist/scene/companion.d.ts +147 -0
- package/dist/scene/companion.js +193 -0
- package/dist/scene/entityStats.d.ts +18 -11
- package/dist/scene/entityStats.js +21 -16
- package/dist/scene/entityStore.d.ts +12 -1
- package/dist/scene/entityStore.js +15 -0
- package/dist/scene/facing.d.ts +18 -0
- package/dist/scene/facing.js +26 -0
- package/dist/scene/modelSockets.d.ts +33 -0
- package/dist/scene/modelSockets.js +29 -0
- package/dist/scene/objectQuery.d.ts +2 -0
- package/dist/scene/objectQuery.js +2 -0
- package/dist/scene/objectStore.d.ts +4 -0
- package/dist/scene/objectStore.js +6 -0
- package/dist/scene/possession.d.ts +8 -0
- package/dist/scene/possession.js +14 -0
- package/dist/scene/roster.d.ts +3 -0
- package/dist/scene/roster.js +12 -0
- package/dist/scene/sceneKinds.d.ts +256 -0
- package/dist/scene/sceneKinds.js +218 -0
- package/dist/scene/sceneOwnership.d.ts +169 -0
- package/dist/scene/sceneOwnership.js +179 -0
- package/dist/scene/sceneRaycast.js +15 -0
- package/dist/scene/selectionBookmarks.d.ts +93 -0
- package/dist/scene/selectionBookmarks.js +122 -0
- package/dist/scene/vehicleSeat.d.ts +68 -0
- package/dist/scene/vehicleSeat.js +59 -0
- package/dist/sensor/concealment.d.ts +3 -0
- package/dist/sensor/concealment.js +3 -0
- package/dist/sensor/freezeMonitor.d.ts +1 -0
- package/dist/sensor/freezeMonitor.js +1 -0
- package/dist/sensor/frustumSensor.d.ts +7 -3
- package/dist/sensor/frustumSensor.js +7 -3
- package/dist/sensor/hiddenStateProbe.d.ts +5 -2
- package/dist/sensor/hiddenStateProbe.js +5 -2
- package/dist/sensor/recordingBuffer.d.ts +2 -1
- package/dist/sensor/recordingBuffer.js +2 -1
- package/dist/sensor/replayLoop.d.ts +6 -2
- package/dist/sensor/replayLoop.js +6 -2
- package/dist/sensor/revealQuery.d.ts +2 -1
- package/dist/sensor/revealQuery.js +2 -1
- package/dist/sensor/visionCone.d.ts +10 -3
- package/dist/sensor/visionCone.js +10 -3
- package/dist/session/contestedChannel.d.ts +1 -0
- package/dist/session/contestedChannel.js +1 -0
- package/dist/session/extraction.d.ts +1 -0
- package/dist/session/extraction.js +1 -0
- package/dist/session/roles.d.ts +6 -0
- package/dist/session/roles.js +6 -0
- package/dist/session/roundState.d.ts +8 -0
- package/dist/session/roundState.js +2 -0
- package/dist/settings/settingsModel.d.ts +1 -0
- package/dist/settings/settingsModel.js +1 -0
- package/dist/stats/accumulatorMeter.d.ts +6 -0
- package/dist/stats/accumulatorMeter.js +6 -0
- package/dist/stats/eventMeter.d.ts +5 -0
- package/dist/stats/eventMeter.js +5 -0
- package/dist/stats/rollCheck.d.ts +5 -0
- package/dist/stats/rollCheck.js +5 -0
- package/dist/stats/spawnLevelStats.d.ts +110 -0
- package/dist/stats/spawnLevelStats.js +140 -0
- package/dist/stats/statModifiers.d.ts +5 -0
- package/dist/stats/statModifiers.js +5 -0
- package/dist/stats/statPool.d.ts +70 -0
- package/dist/stats/statPool.js +59 -0
- package/dist/store/changeSignal.d.ts +3 -0
- package/dist/store/changeSignal.js +2 -0
- package/dist/store/defineKeyedStore.d.ts +38 -0
- package/dist/store/defineKeyedStore.js +42 -0
- package/dist/store/defineStore.d.ts +33 -0
- package/dist/store/defineStore.js +35 -0
- package/dist/store/observableKeyedStore.d.ts +7 -0
- package/dist/store/observableKeyedStore.js +35 -2
- package/dist/survival/decayMeter.d.ts +55 -0
- package/dist/survival/decayMeter.js +130 -57
- package/dist/survival/moodle.d.ts +2 -0
- package/dist/survival/regionHealth.d.ts +6 -0
- package/dist/survival/regionHealth.js +6 -3
- package/dist/tactics/fallingGrid.d.ts +4 -2
- package/dist/tactics/fallingGrid.js +4 -2
- package/dist/tactics/predictiveQuery.d.ts +3 -0
- package/dist/tactics/predictiveQuery.js +3 -0
- package/dist/tactics/snapshot.d.ts +2 -0
- package/dist/tactics/snapshot.js +2 -0
- package/dist/tactics/surface.d.ts +1 -0
- package/dist/tactics/surface.js +1 -0
- package/dist/tactics/tacticalGrid.d.ts +1 -0
- package/dist/tactics/tacticalGrid.js +1 -0
- package/dist/time/beatClock.d.ts +14 -4
- package/dist/time/beatClock.js +14 -4
- package/dist/time/calendarClock.d.ts +3 -0
- package/dist/time/calendarClock.js +3 -0
- package/dist/time/idleProgress.d.ts +4 -0
- package/dist/time/idleProgress.js +4 -0
- package/dist/time/simClock.d.ts +2 -0
- package/dist/time/simClock.js +20 -5
- package/dist/ui/actionModel.d.ts +110 -0
- package/dist/ui/actionModel.js +159 -0
- package/dist/ui/gameLayout.d.ts +30 -11
- package/dist/ui/gameLayout.js +30 -11
- package/dist/ui/hudDocument.d.ts +114 -0
- package/dist/ui/hudDocument.js +220 -0
- package/dist/ui/hudLayout.d.ts +38 -1
- package/dist/ui/hudLayout.js +220 -17
- package/dist/ui/selectionModel.d.ts +92 -0
- package/dist/ui/selectionModel.js +88 -0
- package/dist/ui/tooltipModel.d.ts +63 -0
- package/dist/ui/tooltipModel.js +82 -0
- package/dist/ui.d.ts +15 -0
- package/dist/ui.js +15 -0
- package/dist/visibility/bounds.d.ts +8 -1
- package/dist/visibility/bounds.js +8 -1
- package/dist/visibility/frustum.d.ts +12 -3
- package/dist/visibility/frustum.js +12 -3
- package/dist/work/jobQueue.d.ts +201 -0
- package/dist/work/jobQueue.js +253 -0
- package/dist/work/unitTraining.d.ts +58 -0
- package/dist/work/unitTraining.js +52 -0
- package/dist/world/authoredEntities.d.ts +29 -0
- package/dist/world/authoredEntities.js +29 -0
- package/dist/world/authoredObjects.d.ts +72 -0
- package/dist/world/authoredObjects.js +81 -0
- package/dist/world/authoredSpawn.d.ts +39 -0
- package/dist/world/authoredSpawn.js +37 -0
- package/dist/world/buildSockets.d.ts +152 -0
- package/dist/world/buildSockets.js +188 -0
- package/dist/world/buildingGenerator.d.ts +18 -0
- package/dist/world/buildingGenerator.js +62 -0
- package/dist/world/buildings.d.ts +5 -0
- package/dist/world/buildings.js +5 -0
- package/dist/world/catenary.d.ts +22 -0
- package/dist/world/catenary.js +69 -0
- package/dist/world/cityBlocks.d.ts +152 -0
- package/dist/world/cityBlocks.js +670 -0
- package/dist/world/cityContent.d.ts +77 -0
- package/dist/world/cityContent.js +261 -0
- package/dist/world/cityGeometry.d.ts +114 -0
- package/dist/world/cityGeometry.js +573 -0
- package/dist/world/cityKind.d.ts +314 -0
- package/dist/world/cityKind.js +1578 -0
- package/dist/world/features.d.ts +133 -10
- package/dist/world/features.js +66 -6
- package/dist/world/footprintGrid.d.ts +59 -0
- package/dist/world/footprintGrid.js +141 -0
- package/dist/world/geometry.d.ts +64 -0
- package/dist/world/geometry.js +94 -0
- package/dist/world/grassKind.d.ts +51 -0
- package/dist/world/grassKind.js +101 -0
- package/dist/world/markers.d.ts +50 -4
- package/dist/world/markers.js +49 -0
- package/dist/world/massing.js +1 -1
- package/dist/world/minimapBake.d.ts +78 -0
- package/dist/world/minimapBake.js +208 -0
- package/dist/world/minimapTrack.d.ts +17 -0
- package/dist/world/minimapTrack.js +22 -0
- package/dist/world/pathInstances.d.ts +27 -0
- package/dist/world/pathInstances.js +27 -0
- package/dist/world/pathNetwork.d.ts +159 -0
- package/dist/world/pathNetwork.js +684 -0
- package/dist/world/pathTerrain.d.ts +80 -0
- package/dist/world/pathTerrain.js +142 -0
- package/dist/world/place.d.ts +166 -0
- package/dist/world/place.js +96 -0
- package/dist/world/placeAsset.d.ts +81 -0
- package/dist/world/placeAsset.js +79 -0
- package/dist/world/placement.d.ts +4 -0
- package/dist/world/placement.js +4 -0
- package/dist/world/placementController.d.ts +6 -0
- package/dist/world/placementController.js +6 -0
- package/dist/world/poleLineKind.d.ts +40 -0
- package/dist/world/poleLineKind.js +97 -0
- package/dist/world/polyline.d.ts +34 -0
- package/dist/world/polyline.js +88 -0
- package/dist/world/resourceNode.d.ts +109 -0
- package/dist/world/resourceNode.js +140 -0
- package/dist/world/roads.d.ts +8 -0
- package/dist/world/roads.js +38 -0
- package/dist/world/scatter.js +2 -20
- package/dist/world/scatterRegion.d.ts +164 -0
- package/dist/world/scatterRegion.js +409 -0
- package/dist/world/sceneShapes.d.ts +43 -0
- package/dist/world/sceneShapes.js +1 -0
- package/dist/world/segment.d.ts +27 -0
- package/dist/world/segment.js +43 -0
- package/dist/world/soilKind.d.ts +48 -0
- package/dist/world/soilKind.js +92 -0
- package/dist/world/spatialSample.d.ts +241 -0
- package/dist/world/spatialSample.js +465 -0
- package/dist/world/streets.d.ts +29 -0
- package/dist/world/streets.js +55 -0
- package/dist/world/terraform.d.ts +213 -1
- package/dist/world/terraform.js +627 -22
- package/dist/world/terrain.d.ts +164 -20
- package/dist/world/terrain.js +325 -41
- package/dist/world/terrainGuides.d.ts +182 -0
- package/dist/world/terrainGuides.js +343 -0
- package/dist/world/vec2.d.ts +81 -0
- package/dist/world/vec2.js +128 -0
- package/dist/world/vec3.d.ts +49 -0
- package/dist/world/vec3.js +76 -0
- package/dist/world/vegetation.d.ts +71 -0
- package/dist/world/vegetation.js +151 -0
- package/dist/world/visibilityField.d.ts +154 -0
- package/dist/world/visibilityField.js +271 -0
- package/dist/world/volumetricClouds.d.ts +52 -0
- package/dist/world/volumetricClouds.js +43 -0
- package/dist/world/walls.d.ts +9 -0
- package/dist/world/walls.js +9 -0
- package/dist/world/waterKind.d.ts +55 -0
- package/dist/world/waterKind.js +99 -0
- package/dist/world.d.ts +141 -0
- package/dist/world.js +141 -0
- package/package.json +32 -8
- package/skills/game-design/SKILL.md +28 -0
- package/skills/game-design/agents/openai.yaml +4 -0
- package/skills/game-design/references/application-playbook.md +170 -0
- package/skills/game-design/references/field-guide.md +288 -0
- package/skills/jgengine/SKILL.md +54 -0
- package/skills/jgengine/api.md +527 -0
- package/skills/jgengine/capabilities.md +131 -0
- package/skills/jgengine/recipes/minimal-game.md +88 -0
- package/skills/jgengine-combat/SKILL.md +38 -0
- package/skills/jgengine-combat/api.md +585 -0
- package/skills/jgengine-combat/capabilities.md +213 -0
- package/skills/jgengine-combat/recipes/portable-stat-pools.md +122 -0
- package/skills/jgengine-combat/reference.md +108 -0
- package/skills/jgengine-gameplay/SKILL.md +39 -0
- package/skills/jgengine-gameplay/api.md +1920 -0
- package/skills/jgengine-gameplay/capabilities.md +454 -0
- package/skills/jgengine-gameplay/reference-systems.md +56 -0
- package/skills/jgengine-world/SKILL.md +51 -0
- package/skills/jgengine-world/api.md +3056 -0
- package/skills/jgengine-world/capabilities.md +476 -0
- package/skills/jgengine-world/recipes/commanding-entities.md +128 -0
- package/skills/jgengine-world/reference.md +261 -0
- package/dist/cartridge/runtime.d.ts +0 -15
- package/dist/cartridge/runtime.js +0 -556
- package/dist/cartridge/spec.d.ts +0 -188
- package/dist/cartridge/spec.js +0 -19
- package/dist/cartridge/validate.d.ts +0 -2
- package/dist/cartridge/validate.js +0 -78
- package/dist/store/engineStore.d.ts +0 -22
- package/dist/store/engineStore.js +0 -50
- package/dist/store/features.d.ts +0 -10
- package/dist/store/features.js +0 -23
- package/llms.txt +0 -5389
package/dist/world/terrain.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { withPathProfiles } from "./pathTerrain.js";
|
|
1
2
|
import { nearestOnPath } from "./roads.js";
|
|
2
3
|
function clamp01(value) {
|
|
3
4
|
return value < 0 ? 0 : value > 1 ? 1 : value;
|
|
@@ -14,7 +15,9 @@ function hash2(ix, iz, seed) {
|
|
|
14
15
|
h ^= h >>> 12;
|
|
15
16
|
return (h >>> 0) / 4294967295;
|
|
16
17
|
}
|
|
17
|
-
/** Smoothly interpolated 2D value noise in `[-1, 1]` for the given seed.
|
|
18
|
+
/** Smoothly interpolated 2D value noise in `[-1, 1]` for the given seed.
|
|
19
|
+
* @internal
|
|
20
|
+
*/
|
|
18
21
|
export function valueNoise(x, z, seed) {
|
|
19
22
|
const x0 = Math.floor(x);
|
|
20
23
|
const z0 = Math.floor(z);
|
|
@@ -30,7 +33,9 @@ export function valueNoise(x, z, seed) {
|
|
|
30
33
|
const bottom = lerp(v01, v11, sx);
|
|
31
34
|
return lerp(top, bottom, sz) * 2 - 1;
|
|
32
35
|
}
|
|
33
|
-
/** Layers `valueNoise` octaves per `config` into a single normalized noise sample.
|
|
36
|
+
/** Layers `valueNoise` octaves per `config` into a single normalized noise sample.
|
|
37
|
+
* @internal
|
|
38
|
+
*/
|
|
34
39
|
export function fractalNoise(x, z, config) {
|
|
35
40
|
let amplitude = 1;
|
|
36
41
|
let frequency = config.frequency;
|
|
@@ -47,6 +52,7 @@ export function fractalNoise(x, z, config) {
|
|
|
47
52
|
}
|
|
48
53
|
return norm === 0 ? 0 : sum / norm;
|
|
49
54
|
}
|
|
55
|
+
/** @internal */
|
|
50
56
|
export function seedFrom(value, fallback) {
|
|
51
57
|
if (typeof value === "number")
|
|
52
58
|
return value | 0;
|
|
@@ -60,7 +66,9 @@ export function seedFrom(value, fallback) {
|
|
|
60
66
|
}
|
|
61
67
|
return fallback;
|
|
62
68
|
}
|
|
63
|
-
/** Derives a `TerrainField.sampleNormal` from a height sampler via finite-difference gradients.
|
|
69
|
+
/** Derives a `TerrainField.sampleNormal` from a height sampler via finite-difference gradients.
|
|
70
|
+
* @internal
|
|
71
|
+
*/
|
|
64
72
|
export function withNormal(sampleHeight) {
|
|
65
73
|
const epsilon = 0.75;
|
|
66
74
|
return (x, z) => {
|
|
@@ -85,11 +93,15 @@ export const FLAT_FIELD = {
|
|
|
85
93
|
sampleHeight: () => 0,
|
|
86
94
|
sampleNormal: () => [0, 1, 0],
|
|
87
95
|
};
|
|
88
|
-
/** A flat, zero-height `TerrainField` for arenas with no elevation.
|
|
96
|
+
/** A flat, zero-height `TerrainField` for arenas with no elevation.
|
|
97
|
+
* @internal
|
|
98
|
+
*/
|
|
89
99
|
export function flatField() {
|
|
90
100
|
return FLAT_FIELD;
|
|
91
101
|
}
|
|
92
|
-
/** Builds a `TerrainField` whose height is fractal noise shaped by `config`.
|
|
102
|
+
/** Builds a `TerrainField` whose height is fractal noise shaped by `config`.
|
|
103
|
+
* @internal
|
|
104
|
+
*/
|
|
93
105
|
export function noiseField(config = {}) {
|
|
94
106
|
const fractal = {
|
|
95
107
|
seed: seedFrom(config.seed, 1337),
|
|
@@ -106,6 +118,7 @@ export function noiseField(config = {}) {
|
|
|
106
118
|
waterLevel: config.waterLevel,
|
|
107
119
|
});
|
|
108
120
|
}
|
|
121
|
+
/** @internal */
|
|
109
122
|
export function rollingField(config = {}) {
|
|
110
123
|
return noiseField({
|
|
111
124
|
seed: config.seed ?? "rolling",
|
|
@@ -126,7 +139,9 @@ function smoothstep(edge0, edge1, value) {
|
|
|
126
139
|
const t = clamp01((value - edge0) / (edge1 - edge0));
|
|
127
140
|
return t * t * (3 - 2 * t);
|
|
128
141
|
}
|
|
129
|
-
/** Builds a `TerrainField` with a flat spawn plateau, rolling hills, and a basin, for combat arenas.
|
|
142
|
+
/** Builds a `TerrainField` with a flat spawn plateau, rolling hills, and a basin, for combat arenas.
|
|
143
|
+
* @internal
|
|
144
|
+
*/
|
|
130
145
|
export function arenaField(config = {}) {
|
|
131
146
|
const seed = seedFrom(config.seed ?? "arena", 7);
|
|
132
147
|
const rolling = {
|
|
@@ -155,12 +170,19 @@ export function arenaField(config = {}) {
|
|
|
155
170
|
};
|
|
156
171
|
return fieldFromHeight(sampleHeight, { bounds: config.bounds, waterLevel: ARENA_WATER_LEVEL });
|
|
157
172
|
}
|
|
173
|
+
/** @internal */
|
|
158
174
|
export function groundFieldFor(world) {
|
|
159
175
|
if (world !== undefined && world.kind === "environment")
|
|
160
176
|
return resolveEnvironmentField(world);
|
|
177
|
+
// Place worlds (`world()` from world/place) stand on a flat baseline field: flat/board grounds are
|
|
178
|
+
// exactly y=0, while round/voxel grounds keep their sampled shape in the game's own generation
|
|
179
|
+
// systems (the substrate declaration never bakes a heightfield). Editor-authored sculpt still
|
|
180
|
+
// layers through the environment path above.
|
|
161
181
|
return flatField();
|
|
162
182
|
}
|
|
163
|
-
/** Whether a world declares real terrain (base heightfield or islands) rather than a flat plane — gates terrain-floor sampling in the movement controllers.
|
|
183
|
+
/** Whether a world declares real terrain (base heightfield or islands) rather than a flat plane — gates terrain-floor sampling in the movement controllers.
|
|
184
|
+
* @internal
|
|
185
|
+
*/
|
|
164
186
|
export function hasEnvironmentTerrain(world) {
|
|
165
187
|
return world?.kind === "environment" && (world.terrain !== undefined || (world.islands?.length ?? 0) > 0);
|
|
166
188
|
}
|
|
@@ -174,7 +196,8 @@ function islandContains(descriptor, x, z) {
|
|
|
174
196
|
* Composes a base terrain and any number of bounded islands into one world field: inside an island's
|
|
175
197
|
* rect the island's own field (sampled in island-local coordinates) wins, elsewhere the base terrain
|
|
176
198
|
* answers, and with no base the gap is `ISLAND_VOID_HEIGHT` void. Later islands win overlaps.
|
|
177
|
-
|
|
199
|
+
* @internal
|
|
200
|
+
*/
|
|
178
201
|
export function composeIslandFields(base, islands, voidHeight = ISLAND_VOID_HEIGHT) {
|
|
179
202
|
if (islands.length === 0)
|
|
180
203
|
return base ?? flatField();
|
|
@@ -209,14 +232,95 @@ export function composeIslandFields(base, islands, voidHeight = ISLAND_VOID_HEIG
|
|
|
209
232
|
...(base?.waterLevel === undefined ? {} : { waterLevel: base.waterLevel }),
|
|
210
233
|
};
|
|
211
234
|
}
|
|
212
|
-
/**
|
|
235
|
+
/** Bilinear offset sampled from an editor {@link TerraformSnapshot}'s vertex grid at a world point. */
|
|
236
|
+
function sampleSnapshotOffset(snapshot, x, z) {
|
|
237
|
+
const { bounds, cols, rows, offsets } = snapshot;
|
|
238
|
+
const vertsX = cols + 1;
|
|
239
|
+
const spanX = Math.max(bounds.maxX - bounds.minX, snapshot.cellSize);
|
|
240
|
+
const spanZ = Math.max(bounds.maxZ - bounds.minZ, snapshot.cellSize);
|
|
241
|
+
const fx = clamp01((x - bounds.minX) / spanX) * cols;
|
|
242
|
+
const fz = clamp01((z - bounds.minZ) / spanZ) * rows;
|
|
243
|
+
const x0 = Math.min(cols, Math.floor(fx));
|
|
244
|
+
const z0 = Math.min(rows, Math.floor(fz));
|
|
245
|
+
const x1 = Math.min(cols, x0 + 1);
|
|
246
|
+
const z1 = Math.min(rows, z0 + 1);
|
|
247
|
+
const tx = fx - x0;
|
|
248
|
+
const tz = fz - z0;
|
|
249
|
+
const v00 = offsets[z0 * vertsX + x0] ?? 0;
|
|
250
|
+
const v10 = offsets[z0 * vertsX + x1] ?? 0;
|
|
251
|
+
const v01 = offsets[z1 * vertsX + x0] ?? 0;
|
|
252
|
+
const v11 = offsets[z1 * vertsX + x1] ?? 0;
|
|
253
|
+
const top = v00 + (v10 - v00) * tx;
|
|
254
|
+
const bottom = v01 + (v11 - v01) * tx;
|
|
255
|
+
return top + (bottom - top) * tz;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Layers an authored sculpt snapshot's offsets over a base field — the editor-to-runtime ground seam.
|
|
259
|
+
* @internal — reached through `environment({ sculpt })`; not called directly by games.
|
|
260
|
+
*/
|
|
261
|
+
export function sculptedField(base, snapshot) {
|
|
262
|
+
const sampleHeight = (x, z) => base.sampleHeight(x, z) + sampleSnapshotOffset(snapshot, x, z);
|
|
263
|
+
return {
|
|
264
|
+
sampleHeight,
|
|
265
|
+
sampleNormal: withNormal(sampleHeight),
|
|
266
|
+
...(base.bounds === undefined ? {} : { bounds: base.bounds }),
|
|
267
|
+
...(base.waterLevel === undefined ? {} : { waterLevel: base.waterLevel }),
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Levels a base field toward each clearance zone's center height within its radius (feathered) — so
|
|
272
|
+
* spawns, plots, and paths sit on flat ground even when a mound is nearby. The strongest overlapping
|
|
273
|
+
* zone wins. Pairs with scatter's avoid: one clearance zone both flattens ground and repels foliage.
|
|
274
|
+
* @internal — reached through `environment({ clearings })`; not called directly by games.
|
|
275
|
+
*/
|
|
276
|
+
export function flattenFieldAround(base, zones) {
|
|
277
|
+
if (zones.length === 0)
|
|
278
|
+
return base;
|
|
279
|
+
const sampleHeight = (x, z) => {
|
|
280
|
+
let best = 0;
|
|
281
|
+
let target = 0;
|
|
282
|
+
for (const zone of zones) {
|
|
283
|
+
const dist = Math.hypot(x - zone.x, z - zone.z);
|
|
284
|
+
if (dist >= zone.radius)
|
|
285
|
+
continue;
|
|
286
|
+
const feather = Math.max(0, zone.feather ?? 0);
|
|
287
|
+
const inner = zone.radius - feather;
|
|
288
|
+
const t = dist <= inner || feather <= 0 ? 1 : (zone.radius - dist) / feather;
|
|
289
|
+
if (t > best) {
|
|
290
|
+
best = t;
|
|
291
|
+
target = base.sampleHeight(zone.x, zone.z);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
const height = base.sampleHeight(x, z);
|
|
295
|
+
return best > 0 ? height + (target - height) * best : height;
|
|
296
|
+
};
|
|
297
|
+
return {
|
|
298
|
+
sampleHeight,
|
|
299
|
+
sampleNormal: withNormal(sampleHeight),
|
|
300
|
+
...(base.bounds === undefined ? {} : { bounds: base.bounds }),
|
|
301
|
+
...(base.waterLevel === undefined ? {} : { waterLevel: base.waterLevel }),
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* The full ground field for an environment world: base `terrain` composed with any `islands`, then
|
|
306
|
+
* any authored `sculpt` snapshot, then any `clearings` flattened on top — so an editor-sculpted
|
|
307
|
+
* heightfield drives both the rendered mesh and player collision, and gameplay spots stay level,
|
|
308
|
+
* through the one seam every consumer already reads.
|
|
309
|
+
* @internal
|
|
310
|
+
*/
|
|
213
311
|
export function resolveEnvironmentField(feature) {
|
|
214
312
|
const base = feature.terrain === undefined ? null : resolveTerrainField(feature.terrain);
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
313
|
+
const composed = feature.islands === undefined || feature.islands.length === 0
|
|
314
|
+
? base ?? flatField()
|
|
315
|
+
: composeIslandFields(base, feature.islands);
|
|
316
|
+
const sculpted = feature.sculpt === undefined ? composed : sculptedField(composed, feature.sculpt);
|
|
317
|
+
return feature.clearings === undefined || feature.clearings.length === 0
|
|
318
|
+
? sculpted
|
|
319
|
+
: flattenFieldAround(sculpted, feature.clearings);
|
|
320
|
+
}
|
|
321
|
+
/** Local slope from the field's normal — the input for gravity-roll, ski acceleration, and slide checks (#284.6).
|
|
322
|
+
* @internal
|
|
323
|
+
*/
|
|
220
324
|
export function sampleSlope(field, x, z) {
|
|
221
325
|
const [nx, ny, nz] = field.sampleNormal(x, z);
|
|
222
326
|
const horizontal = Math.hypot(nx, nz);
|
|
@@ -230,13 +334,88 @@ export function sampleSlope(field, x, z) {
|
|
|
230
334
|
/**
|
|
231
335
|
* Downhill force/acceleration from the local slope: direction × sin(slope angle) × `scale`.
|
|
232
336
|
* Add it to any integrator's XZ velocity each tick (`scale` ≈ gravity for a free-rolling body).
|
|
233
|
-
|
|
337
|
+
* @internal
|
|
338
|
+
*/
|
|
234
339
|
export function slopeForce(field, x, z, scale = 9.8) {
|
|
235
340
|
const [nx, , nz] = field.sampleNormal(x, z);
|
|
236
341
|
if (Math.hypot(nx, nz) < 1e-9)
|
|
237
342
|
return [0, 0];
|
|
238
343
|
return [nx * scale, nz * scale];
|
|
239
344
|
}
|
|
345
|
+
/**
|
|
346
|
+
* Intersects a ray with a `sampleHeight` field by fixed-step raymarching plus bisection — the
|
|
347
|
+
* O(steps) editor/gameplay picking seam that replaces brute-force triangle raycasts against a
|
|
348
|
+
* tessellated ground mesh (tens of thousands of triangle tests per pick on a sculpt-sized grid).
|
|
349
|
+
* The ray is clipped to `bounds` on XZ first, marched at `step`, and the first above→below
|
|
350
|
+
* crossing is bisected. An origin already under the surface hits immediately at entry. Returns
|
|
351
|
+
* null when the clipped ray never crosses the surface.
|
|
352
|
+
* @capability terrain-raycast pick a point on a heightfield along a camera/pointer ray
|
|
353
|
+
*/
|
|
354
|
+
export function raycastHeightField(sampleHeight, origin, direction, options) {
|
|
355
|
+
const length = Math.hypot(direction[0], direction[1], direction[2]);
|
|
356
|
+
if (length < 1e-12)
|
|
357
|
+
return null;
|
|
358
|
+
const dx = direction[0] / length;
|
|
359
|
+
const dy = direction[1] / length;
|
|
360
|
+
const dz = direction[2] / length;
|
|
361
|
+
const { bounds } = options;
|
|
362
|
+
// Clip [t0, t1] to the XZ slab of bounds.
|
|
363
|
+
let t0 = 0;
|
|
364
|
+
let t1 = options.maxDistance ?? Infinity;
|
|
365
|
+
for (const [o, d, min, max] of [
|
|
366
|
+
[origin[0], dx, bounds.minX, bounds.maxX],
|
|
367
|
+
[origin[2], dz, bounds.minZ, bounds.maxZ],
|
|
368
|
+
]) {
|
|
369
|
+
if (Math.abs(d) < 1e-12) {
|
|
370
|
+
if (o < min || o > max)
|
|
371
|
+
return null;
|
|
372
|
+
continue;
|
|
373
|
+
}
|
|
374
|
+
const ta = (min - o) / d;
|
|
375
|
+
const tb = (max - o) / d;
|
|
376
|
+
const near = Math.min(ta, tb);
|
|
377
|
+
const far = Math.max(ta, tb);
|
|
378
|
+
if (near > t0)
|
|
379
|
+
t0 = near;
|
|
380
|
+
if (far < t1)
|
|
381
|
+
t1 = far;
|
|
382
|
+
}
|
|
383
|
+
if (t1 <= t0)
|
|
384
|
+
return null;
|
|
385
|
+
const spanX = bounds.maxX - bounds.minX;
|
|
386
|
+
const spanZ = bounds.maxZ - bounds.minZ;
|
|
387
|
+
const step = options.step ?? Math.min(4, Math.max(0.25, Math.max(spanX, spanZ) / 256));
|
|
388
|
+
const refine = options.refine ?? 8;
|
|
389
|
+
const maxSteps = options.maxSteps ?? 4096;
|
|
390
|
+
const above = (t) => origin[1] + dy * t - sampleHeight(origin[0] + dx * t, origin[2] + dz * t);
|
|
391
|
+
let prevT = t0;
|
|
392
|
+
if (above(t0) <= 0) {
|
|
393
|
+
return { x: origin[0] + dx * t0, y: origin[1] + dy * t0, z: origin[2] + dz * t0, distance: t0 };
|
|
394
|
+
}
|
|
395
|
+
let steps = 0;
|
|
396
|
+
while (prevT < t1 && steps < maxSteps) {
|
|
397
|
+
steps += 1;
|
|
398
|
+
const t = Math.min(prevT + step, t1);
|
|
399
|
+
if (above(t) <= 0) {
|
|
400
|
+
let lo = prevT;
|
|
401
|
+
let hi = t;
|
|
402
|
+
for (let i = 0; i < refine; i += 1) {
|
|
403
|
+
const mid = (lo + hi) / 2;
|
|
404
|
+
if (above(mid) <= 0)
|
|
405
|
+
hi = mid;
|
|
406
|
+
else
|
|
407
|
+
lo = mid;
|
|
408
|
+
}
|
|
409
|
+
const x = origin[0] + dx * hi;
|
|
410
|
+
const z = origin[2] + dz * hi;
|
|
411
|
+
return { x, y: sampleHeight(x, z), z, distance: hi };
|
|
412
|
+
}
|
|
413
|
+
if (t >= t1)
|
|
414
|
+
break;
|
|
415
|
+
prevT = t;
|
|
416
|
+
}
|
|
417
|
+
return null;
|
|
418
|
+
}
|
|
240
419
|
export const DEFAULT_TERRAIN_MATERIAL = "grass";
|
|
241
420
|
export const TERRAIN_MATERIAL_PALETTES = {
|
|
242
421
|
grass: { low: "#30402c", high: "#7f8b50", waterline: "#1d4c6e" },
|
|
@@ -258,7 +437,11 @@ const DEFAULT_TERRAIN_DETAIL = {
|
|
|
258
437
|
roughness: 0.9,
|
|
259
438
|
strength: 1,
|
|
260
439
|
};
|
|
261
|
-
|
|
440
|
+
const DEFAULT_TERRAIN_MATERIAL_REPEAT = 4;
|
|
441
|
+
const DEFAULT_TERRAIN_MATERIAL_STRENGTH = 1;
|
|
442
|
+
/** Fill a `TerrainDetailConfig` with defaults; `waterLevel` falls back to the terrain's own water level.
|
|
443
|
+
* @internal
|
|
444
|
+
*/
|
|
262
445
|
export function resolveTerrainDetail(config, terrainWaterLevel = 0) {
|
|
263
446
|
return {
|
|
264
447
|
rockColor: config.rockColor ?? DEFAULT_TERRAIN_DETAIL.rockColor,
|
|
@@ -269,10 +452,20 @@ export function resolveTerrainDetail(config, terrainWaterLevel = 0) {
|
|
|
269
452
|
detailScale: config.detailScale ?? DEFAULT_TERRAIN_DETAIL.detailScale,
|
|
270
453
|
macroScale: config.macroScale ?? DEFAULT_TERRAIN_DETAIL.macroScale,
|
|
271
454
|
roughness: config.roughness ?? DEFAULT_TERRAIN_DETAIL.roughness,
|
|
272
|
-
strength: config.strength ?? DEFAULT_TERRAIN_DETAIL.strength,
|
|
455
|
+
strength: clamp01(config.strength ?? DEFAULT_TERRAIN_DETAIL.strength),
|
|
273
456
|
waterLevel: config.waterLevel ?? terrainWaterLevel,
|
|
457
|
+
...(config.material === undefined
|
|
458
|
+
? {}
|
|
459
|
+
: {
|
|
460
|
+
material: {
|
|
461
|
+
maps: config.material.maps,
|
|
462
|
+
repeat: config.material.repeat ?? DEFAULT_TERRAIN_MATERIAL_REPEAT,
|
|
463
|
+
strength: clamp01(config.material.strength ?? DEFAULT_TERRAIN_MATERIAL_STRENGTH),
|
|
464
|
+
},
|
|
465
|
+
}),
|
|
274
466
|
};
|
|
275
467
|
}
|
|
468
|
+
/** @internal */
|
|
276
469
|
export function resolveTerrainPalette(descriptor = {}) {
|
|
277
470
|
const material = descriptor.material ?? DEFAULT_TERRAIN_MATERIAL;
|
|
278
471
|
const preset = TERRAIN_MATERIAL_PALETTES[material];
|
|
@@ -314,25 +507,19 @@ function mixPalette(from, to, t) {
|
|
|
314
507
|
waterline: mixHex(from.waterline, to.waterline, t),
|
|
315
508
|
};
|
|
316
509
|
}
|
|
317
|
-
|
|
318
|
-
* Per-z palette sampler over a descriptor's `biomeBands` — ordered zones that cross-fade their
|
|
319
|
-
* ground palette across a `fade`-wide window centered on the midpoint z between adjacent centers.
|
|
320
|
-
* Below the first / above the last band clamps to that band's palette. Returns `fallback` when no
|
|
321
|
-
* bands are declared. Pure math, unit-testable independent of rendering.
|
|
322
|
-
*/
|
|
323
|
-
export function createBiomeBandSampler(bands, fallback) {
|
|
510
|
+
function createBandValueSampler(bands, fallback, resolve, mix) {
|
|
324
511
|
if (bands.length === 0)
|
|
325
512
|
return () => fallback;
|
|
326
513
|
const resolved = bands
|
|
327
|
-
.map((band) => ({ z: band.z, fade: band.fade ?? 64,
|
|
514
|
+
.map((band) => ({ z: band.z, fade: band.fade ?? 64, value: resolve(band) }))
|
|
328
515
|
.sort((a, b) => a.z - b.z);
|
|
329
516
|
const first = resolved[0];
|
|
330
517
|
const last = resolved[resolved.length - 1];
|
|
331
518
|
return (z) => {
|
|
332
519
|
if (z <= first.z)
|
|
333
|
-
return first.
|
|
520
|
+
return first.value;
|
|
334
521
|
if (z >= last.z)
|
|
335
|
-
return last.
|
|
522
|
+
return last.value;
|
|
336
523
|
for (let i = 0; i < resolved.length - 1; i += 1) {
|
|
337
524
|
const lower = resolved[i];
|
|
338
525
|
const upper = resolved[i + 1];
|
|
@@ -341,19 +528,86 @@ export function createBiomeBandSampler(bands, fallback) {
|
|
|
341
528
|
const boundary = (lower.z + upper.z) / 2;
|
|
342
529
|
const half = Math.min(lower.fade, upper.fade) / 2;
|
|
343
530
|
if (z <= boundary - half)
|
|
344
|
-
return lower.
|
|
531
|
+
return lower.value;
|
|
345
532
|
if (z >= boundary + half)
|
|
346
|
-
return upper.
|
|
347
|
-
return
|
|
533
|
+
return upper.value;
|
|
534
|
+
return mix(lower.value, upper.value, smoothstep(boundary - half, boundary + half, z));
|
|
348
535
|
}
|
|
349
536
|
return fallback;
|
|
350
537
|
};
|
|
351
538
|
}
|
|
539
|
+
/**
|
|
540
|
+
* Per-z palette sampler over a descriptor's `biomeBands` — ordered zones that cross-fade their
|
|
541
|
+
* ground palette across a `fade`-wide window centered on the midpoint z between adjacent centers.
|
|
542
|
+
* Below the first / above the last band clamps to that band's palette. Returns `fallback` when no
|
|
543
|
+
* bands are declared. Pure math, unit-testable independent of rendering.
|
|
544
|
+
* @internal
|
|
545
|
+
*/
|
|
546
|
+
export function createBiomeBandSampler(bands, fallback) {
|
|
547
|
+
return createBandValueSampler(bands, fallback, resolveTerrainPalette, mixPalette);
|
|
548
|
+
}
|
|
549
|
+
function mixBiomeFog(from, to, t) {
|
|
550
|
+
if (t <= 0)
|
|
551
|
+
return from;
|
|
552
|
+
if (t >= 1)
|
|
553
|
+
return to;
|
|
554
|
+
return {
|
|
555
|
+
color: mixHex(from.color, to.color, t),
|
|
556
|
+
near: lerp(from.near, to.near, t),
|
|
557
|
+
far: lerp(from.far, to.far, t),
|
|
558
|
+
density: lerp(from.density, to.density, t),
|
|
559
|
+
};
|
|
560
|
+
}
|
|
561
|
+
/**
|
|
562
|
+
* Per-z fog sampler over a descriptor's `biomeBands` — cross-fades each band's `fog` (unset fields
|
|
563
|
+
* falling through to `fallback`) across the same `fade` window as the ground sampler, so fog color and
|
|
564
|
+
* range track the camera's z. Bands with no `fog` resolve to `fallback`. Pure math, unit-testable.
|
|
565
|
+
* @internal
|
|
566
|
+
*/
|
|
567
|
+
export function createBiomeFogSampler(bands, fallback) {
|
|
568
|
+
return createBandValueSampler(bands, fallback, (band) => band.fog === undefined
|
|
569
|
+
? fallback
|
|
570
|
+
: {
|
|
571
|
+
color: band.fog.color ?? fallback.color,
|
|
572
|
+
near: band.fog.near ?? fallback.near,
|
|
573
|
+
far: band.fog.far ?? fallback.far,
|
|
574
|
+
density: band.fog.density ?? fallback.density,
|
|
575
|
+
}, mixBiomeFog);
|
|
576
|
+
}
|
|
577
|
+
function mixBiomeSky(from, to, t) {
|
|
578
|
+
if (t <= 0)
|
|
579
|
+
return from;
|
|
580
|
+
if (t >= 1)
|
|
581
|
+
return to;
|
|
582
|
+
return {
|
|
583
|
+
horizonColor: mixHex(from.horizonColor, to.horizonColor, t),
|
|
584
|
+
zenithColor: mixHex(from.zenithColor, to.zenithColor, t),
|
|
585
|
+
sunIntensity: lerp(from.sunIntensity, to.sunIntensity, t),
|
|
586
|
+
ambientIntensity: lerp(from.ambientIntensity, to.ambientIntensity, t),
|
|
587
|
+
};
|
|
588
|
+
}
|
|
589
|
+
/**
|
|
590
|
+
* Per-z sky sampler over a descriptor's `biomeBands` — cross-fades each band's `sky` (unset fields
|
|
591
|
+
* falling through to `fallback`) across the same `fade` window as the ground sampler, so horizon/zenith
|
|
592
|
+
* colors and sun/ambient intensity track the camera's z. Bands with no `sky` resolve to `fallback`.
|
|
593
|
+
* @internal
|
|
594
|
+
*/
|
|
595
|
+
export function createBiomeSkySampler(bands, fallback) {
|
|
596
|
+
return createBandValueSampler(bands, fallback, (band) => band.sky === undefined
|
|
597
|
+
? fallback
|
|
598
|
+
: {
|
|
599
|
+
horizonColor: band.sky.horizonColor ?? fallback.horizonColor,
|
|
600
|
+
zenithColor: band.sky.zenithColor ?? fallback.zenithColor,
|
|
601
|
+
sunIntensity: band.sky.sunIntensity ?? fallback.sunIntensity,
|
|
602
|
+
ambientIntensity: band.sky.ambientIntensity ?? fallback.ambientIntensity,
|
|
603
|
+
}, mixBiomeSky);
|
|
604
|
+
}
|
|
352
605
|
/**
|
|
353
606
|
* Per-position palette sampler over the descriptor's base `material`/`colors` plus its z-ordered
|
|
354
607
|
* `biomeBands` (painted first) and radial `materialRegions` (painted over) — the multi-biome coloring
|
|
355
608
|
* seam. Regions paint fully inside `radius` and blend back across `falloff`; later regions win overlaps.
|
|
356
|
-
|
|
609
|
+
* @internal
|
|
610
|
+
*/
|
|
357
611
|
export function createTerrainPaletteSampler(descriptor) {
|
|
358
612
|
const base = resolveTerrainPalette(descriptor);
|
|
359
613
|
const bandSampler = descriptor.biomeBands === undefined || descriptor.biomeBands.length === 0
|
|
@@ -440,6 +694,7 @@ function withFlattenMasks(sampleHeight, masks) {
|
|
|
440
694
|
return height;
|
|
441
695
|
};
|
|
442
696
|
}
|
|
697
|
+
/** @internal */
|
|
443
698
|
export function heightMapField(config) {
|
|
444
699
|
const { columns, rows, samples } = config;
|
|
445
700
|
if (columns <= 0 || rows <= 0)
|
|
@@ -476,7 +731,9 @@ export function heightMapField(config) {
|
|
|
476
731
|
...(config.waterLevel === undefined ? {} : { waterLevel: config.waterLevel }),
|
|
477
732
|
});
|
|
478
733
|
}
|
|
479
|
-
/** Resolves a `TerrainEnvironmentDescriptor` into a concrete `TerrainField`, applying flatten masks.
|
|
734
|
+
/** Resolves a `TerrainEnvironmentDescriptor` into a concrete `TerrainField`, applying flatten masks.
|
|
735
|
+
* @internal
|
|
736
|
+
*/
|
|
480
737
|
export function resolveTerrainField(descriptor) {
|
|
481
738
|
if (descriptor === undefined)
|
|
482
739
|
return flatField();
|
|
@@ -498,19 +755,44 @@ export function resolveTerrainField(descriptor) {
|
|
|
498
755
|
waterLevel: descriptor.waterLevel,
|
|
499
756
|
bounds: descriptor.bounds,
|
|
500
757
|
});
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
758
|
+
const flattened = descriptor.flatten === undefined || descriptor.flatten.length === 0
|
|
759
|
+
? base
|
|
760
|
+
: fieldFromHeight(withFlattenMasks(base.sampleHeight, descriptor.flatten), {
|
|
761
|
+
bounds: base.bounds,
|
|
762
|
+
waterLevel: base.waterLevel,
|
|
763
|
+
});
|
|
764
|
+
if (descriptor.pathProfiles === undefined || descriptor.pathProfiles.length === 0)
|
|
765
|
+
return flattened;
|
|
766
|
+
return applyPathProfiles(flattened, descriptor.pathProfiles);
|
|
507
767
|
}
|
|
508
|
-
/**
|
|
768
|
+
/**
|
|
769
|
+
* Composes authored path profiles onto a field — the shared seam that turns a scene road/river/ramp path
|
|
770
|
+
* into flattened, graded, carved, or retained ground. Applies after `flatten` masks in `resolveTerrainField`
|
|
771
|
+
* so a corridor grades over already-leveled pads; call it directly to layer profiles onto any field a game
|
|
772
|
+
* builds by hand. Returns the field unchanged when no profile is given.
|
|
773
|
+
* @capability path-terrain apply flatten/grade/carve/retaining path profiles to a terrain field
|
|
774
|
+
*/
|
|
775
|
+
export function applyPathProfiles(field, profiles) {
|
|
776
|
+
if (profiles.length === 0)
|
|
777
|
+
return field;
|
|
778
|
+
const sampleHeight = withPathProfiles((x, z) => field.sampleHeight(x, z), profiles);
|
|
779
|
+
return {
|
|
780
|
+
sampleHeight,
|
|
781
|
+
sampleNormal: withNormal(sampleHeight),
|
|
782
|
+
...(field.bounds === undefined ? {} : { bounds: field.bounds }),
|
|
783
|
+
...(field.waterLevel === undefined ? {} : { waterLevel: field.waterLevel }),
|
|
784
|
+
};
|
|
785
|
+
}
|
|
786
|
+
/** Returns `position` with `y` replaced by the field's ground height (plus `offset`) at its `x`/`z`.
|
|
787
|
+
* @internal
|
|
788
|
+
*/
|
|
509
789
|
export function snapToGround(field, position, offset = 0) {
|
|
510
790
|
const [x, , z] = position;
|
|
511
791
|
return [x, field.sampleHeight(x, z) + offset, z];
|
|
512
792
|
}
|
|
513
|
-
/** Ground-snaps an already-spawned entity in place; returns false when `id` is unknown.
|
|
793
|
+
/** Ground-snaps an already-spawned entity in place; returns false when `id` is unknown.
|
|
794
|
+
* @internal
|
|
795
|
+
*/
|
|
514
796
|
export function snapEntityToGround(entities, id, field, offset = 0) {
|
|
515
797
|
const entity = entities.get(id);
|
|
516
798
|
if (entity === null)
|
|
@@ -518,7 +800,9 @@ export function snapEntityToGround(entities, id, field, offset = 0) {
|
|
|
518
800
|
return entities.setPose(id, { position: snapToGround(field, entity.position, offset) });
|
|
519
801
|
}
|
|
520
802
|
export const DEFAULT_MAX_WALK_SLOPE = 0.6;
|
|
521
|
-
/** Zeroes out a movement step's x or z component where it would climb steeper than `maxSlope`.
|
|
803
|
+
/** Zeroes out a movement step's x or z component where it would climb steeper than `maxSlope`.
|
|
804
|
+
* @internal
|
|
805
|
+
*/
|
|
522
806
|
export function resolveGroundStep(field, x, z, stepX, stepZ, maxSlope = DEFAULT_MAX_WALK_SLOPE) {
|
|
523
807
|
const baseHeight = field.sampleHeight(x, z);
|
|
524
808
|
const tooSteep = (dx, dz) => {
|