@jgengine/core 0.10.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -2
- package/LICENSE +203 -661
- package/README.md +1 -1
- package/dist/ai/crowd.d.ts +55 -0
- package/dist/ai/crowd.js +114 -0
- package/dist/ai/flock.d.ts +5 -2
- package/dist/ai/flock.js +5 -2
- package/dist/ai/groupAssist.d.ts +1 -0
- package/dist/ai/groupAssist.js +1 -0
- package/dist/ai/heatSystem.d.ts +76 -0
- package/dist/ai/heatSystem.js +97 -0
- package/dist/ai/interestScheduler.d.ts +107 -0
- package/dist/ai/interestScheduler.js +118 -0
- package/dist/ai/jobBoard.d.ts +1 -0
- package/dist/ai/jobBoard.js +1 -0
- package/dist/ai/laneSelect.d.ts +5 -2
- package/dist/ai/laneSelect.js +5 -2
- package/dist/ai/mobBrain.d.ts +1 -0
- package/dist/ai/mobBrain.js +1 -0
- package/dist/ai/spawnDirector.d.ts +7 -2
- package/dist/ai/spawnDirector.js +18 -15
- package/dist/ai/spawnPoint.d.ts +3 -1
- package/dist/ai/spawnPoint.js +3 -1
- package/dist/ai/targetAcquisition.d.ts +84 -0
- package/dist/ai/targetAcquisition.js +92 -0
- package/dist/anim/easing.d.ts +19 -0
- package/dist/anim/easing.js +19 -0
- package/dist/anim/oscillator.d.ts +12 -0
- package/dist/anim/oscillator.js +25 -0
- package/dist/area/areaEffectField.d.ts +127 -0
- package/dist/area/areaEffectField.js +175 -0
- package/dist/area/stackPolicy.d.ts +47 -0
- package/dist/area/stackPolicy.js +99 -0
- package/dist/authoring.d.ts +1 -0
- package/dist/authoring.js +1 -0
- package/dist/board/laneBoard.d.ts +13 -0
- package/dist/board/laneBoard.js +13 -0
- package/dist/board/timelineBoard.d.ts +10 -0
- package/dist/board/timelineBoard.js +10 -0
- package/dist/combat/abilityKit.d.ts +18 -0
- package/dist/combat/abilityKit.js +24 -9
- package/dist/combat/animationState.d.ts +5 -0
- package/dist/combat/animationState.js +5 -0
- package/dist/combat/breakMeters.d.ts +10 -0
- package/dist/combat/breakMeters.js +10 -0
- package/dist/combat/castRunner.d.ts +5 -0
- package/dist/combat/castRunner.js +5 -0
- package/dist/combat/comboPoints.d.ts +5 -0
- package/dist/combat/comboPoints.js +5 -0
- package/dist/combat/comboString.d.ts +5 -0
- package/dist/combat/comboString.js +5 -0
- package/dist/combat/damageInterceptors.d.ts +192 -0
- package/dist/combat/damageInterceptors.js +251 -0
- package/dist/combat/damageMatchup.d.ts +68 -0
- package/dist/combat/damageMatchup.js +42 -0
- package/dist/combat/damageResolution.d.ts +63 -0
- package/dist/combat/damageResolution.js +50 -0
- package/dist/combat/death.d.ts +7 -1
- package/dist/combat/death.js +5 -0
- package/dist/combat/deathReason.d.ts +14 -0
- package/dist/combat/deathReason.js +1 -0
- package/dist/combat/defensiveWindow.d.ts +5 -0
- package/dist/combat/defensiveWindow.js +5 -0
- package/dist/combat/dotField.d.ts +5 -1
- package/dist/combat/dotField.js +5 -1
- package/dist/combat/downed.d.ts +5 -0
- package/dist/combat/downed.js +5 -0
- package/dist/combat/effects.d.ts +5 -0
- package/dist/combat/effects.js +5 -0
- package/dist/combat/encounterSequence.d.ts +258 -0
- package/dist/combat/encounterSequence.js +426 -0
- package/dist/combat/hitReaction.d.ts +57 -1
- package/dist/combat/hitReaction.js +45 -5
- package/dist/combat/magazine.d.ts +54 -0
- package/dist/combat/magazine.js +96 -0
- package/dist/combat/projectiles.d.ts +5 -0
- package/dist/combat/projectiles.js +32 -14
- package/dist/combat/receivedDamage.d.ts +117 -0
- package/dist/combat/receivedDamage.js +92 -0
- package/dist/combat/regenShield.d.ts +5 -1
- package/dist/combat/regenShield.js +5 -1
- package/dist/combat/renderCues.d.ts +51 -0
- package/dist/combat/renderCues.js +44 -0
- package/dist/combat/resourcePool.d.ts +5 -0
- package/dist/combat/resourcePool.js +5 -0
- package/dist/combat/rewardAllocation.d.ts +121 -0
- package/dist/combat/rewardAllocation.js +251 -0
- package/dist/combat/shotOrigin.d.ts +18 -1
- package/dist/combat/shotOrigin.js +39 -0
- package/dist/combat/statusApplication.d.ts +96 -0
- package/dist/combat/statusApplication.js +81 -0
- package/dist/combat/telegraph.d.ts +11 -2
- package/dist/combat/telegraph.js +11 -2
- package/dist/combat/thresholdCrossings.d.ts +85 -0
- package/dist/combat/thresholdCrossings.js +116 -0
- package/dist/combat.d.ts +34 -0
- package/dist/combat.js +34 -0
- package/dist/commands/commandRegistry.d.ts +11 -0
- package/dist/commands/commandRegistry.js +9 -2
- package/dist/crafting/crop.d.ts +18 -0
- package/dist/crafting/crop.js +18 -0
- package/dist/crafting/production.d.ts +5 -0
- package/dist/crafting/production.js +5 -0
- package/dist/devtools/rewriteTunables.d.ts +17 -0
- package/dist/devtools/rewriteTunables.js +276 -0
- package/dist/devtools/saveEndpoint.d.ts +46 -0
- package/dist/devtools/saveEndpoint.js +48 -0
- package/dist/devtools/transformTunables.d.ts +3 -0
- package/dist/devtools/transformTunables.js +3 -0
- package/dist/devtools/tunableSchema.d.ts +31 -0
- package/dist/devtools/tunableSchema.js +31 -0
- package/dist/economy/currency.d.ts +12 -1
- package/dist/economy/currency.js +12 -1
- package/dist/economy/listingBook.d.ts +91 -0
- package/dist/economy/listingBook.js +144 -0
- package/dist/economy/resourceLedger.d.ts +222 -0
- package/dist/economy/resourceLedger.js +353 -0
- package/dist/economy/sharedWallet.d.ts +14 -0
- package/dist/economy/sharedWallet.js +14 -0
- package/dist/economy/techTree.d.ts +12 -0
- package/dist/economy/techTree.js +12 -0
- package/dist/economy/wallet.d.ts +26 -2
- package/dist/economy/wallet.js +35 -6
- package/dist/editor/commands.d.ts +190 -7
- package/dist/editor/commands.js +727 -55
- package/dist/editor/document.d.ts +159 -13
- package/dist/editor/document.js +750 -19
- package/dist/editor/grid.d.ts +229 -0
- package/dist/editor/grid.js +366 -0
- package/dist/editor/gridAdapters.d.ts +80 -0
- package/dist/editor/gridAdapters.js +134 -0
- package/dist/editor/index.d.ts +73 -6
- package/dist/editor/index.js +6 -2
- package/dist/editor/liveSync.d.ts +127 -0
- package/dist/editor/liveSync.js +249 -0
- package/dist/editor/runtimeInspector.d.ts +88 -0
- package/dist/editor/runtimeInspector.js +239 -0
- package/dist/editor/types.d.ts +107 -1
- package/dist/faction/reputation.d.ts +5 -0
- package/dist/faction/reputation.js +5 -0
- package/dist/format/distance.d.ts +17 -0
- package/dist/format/distance.js +18 -0
- package/dist/format/duration.d.ts +27 -0
- package/dist/format/duration.js +45 -0
- package/dist/format/speed.d.ts +17 -0
- package/dist/format/speed.js +25 -0
- package/dist/game/connectedPlayers.d.ts +6 -4
- package/dist/game/connectedPlayers.js +2 -2
- package/dist/game/cosmetics.d.ts +9 -0
- package/dist/game/cosmetics.js +16 -0
- package/dist/game/defineGame.d.ts +100 -2
- package/dist/game/defineGame.js +39 -2
- package/dist/game/defineSystem.d.ts +88 -0
- package/dist/game/defineSystem.js +45 -0
- package/dist/game/dialogue.d.ts +33 -0
- package/dist/game/dialogue.js +21 -0
- package/dist/game/events.d.ts +35 -13
- package/dist/game/events.js +5 -0
- package/dist/game/feed.d.ts +33 -0
- package/dist/game/feed.js +35 -2
- package/dist/game/gamePhase.d.ts +11 -0
- package/dist/game/gamePhase.js +16 -0
- package/dist/game/leaderboard.d.ts +5 -0
- package/dist/game/leaderboard.js +5 -0
- package/dist/game/loadout.d.ts +5 -0
- package/dist/game/loadout.js +5 -0
- package/dist/game/lootFilter.d.ts +2 -0
- package/dist/game/lootFilter.js +2 -0
- package/dist/game/lootPipeline.d.ts +164 -0
- package/dist/game/lootPipeline.js +216 -0
- package/dist/game/lootTable.d.ts +19 -2
- package/dist/game/lootTable.js +15 -5
- package/dist/game/objectives.d.ts +43 -0
- package/dist/game/objectives.js +36 -0
- package/dist/game/paramLayers.d.ts +148 -0
- package/dist/game/paramLayers.js +185 -0
- package/dist/game/ping.d.ts +5 -0
- package/dist/game/ping.js +5 -0
- package/dist/game/playableGame.d.ts +92 -7
- package/dist/game/quest.d.ts +8 -0
- package/dist/game/quest.js +29 -0
- package/dist/game/race.d.ts +141 -0
- package/dist/game/race.js +169 -0
- package/dist/game/recordBook.d.ts +3 -1
- package/dist/game/recordBook.js +4 -1
- package/dist/game/ruleSelection.d.ts +75 -0
- package/dist/game/ruleSelection.js +127 -0
- package/dist/game/runDraft.d.ts +5 -0
- package/dist/game/runDraft.js +5 -0
- package/dist/game/saveStore.d.ts +111 -0
- package/dist/game/saveStore.js +312 -0
- package/dist/game/snapshotHistory.d.ts +67 -0
- package/dist/game/snapshotHistory.js +95 -0
- package/dist/game/social.d.ts +38 -1
- package/dist/game/social.js +71 -0
- package/dist/game/spawnPoints.d.ts +5 -0
- package/dist/game/spawnPoints.js +5 -0
- package/dist/game/systemRuntime.d.ts +50 -0
- package/dist/game/systemRuntime.js +157 -0
- package/dist/game/systemSchedule.d.ts +72 -0
- package/dist/game/systemSchedule.js +242 -0
- package/dist/game/toasts.d.ts +43 -0
- package/dist/game/toasts.js +44 -0
- package/dist/game/trade.d.ts +10 -0
- package/dist/game/trade.js +10 -0
- package/dist/game/unlocks.d.ts +8 -0
- package/dist/game/unlocks.js +16 -0
- package/dist/game/vfxInstance.d.ts +138 -0
- package/dist/game/vfxInstance.js +96 -0
- package/dist/game/worldItem.d.ts +17 -4
- package/dist/game/worldItem.js +17 -4
- package/dist/gameplay.d.ts +91 -0
- package/dist/gameplay.js +91 -0
- package/dist/index.d.ts +5 -14
- package/dist/index.js +5 -14
- package/dist/input/actionBindings.d.ts +23 -6
- package/dist/input/actionBindings.js +23 -6
- package/dist/input/axisInput.d.ts +7 -2
- package/dist/input/axisInput.js +7 -2
- package/dist/input/controlGroups.d.ts +67 -0
- package/dist/input/controlGroups.js +41 -0
- package/dist/input/touchScheme.d.ts +82 -6
- package/dist/input/touchScheme.js +123 -10
- package/dist/interaction/lockpick.d.ts +61 -0
- package/dist/interaction/lockpick.js +168 -0
- package/dist/interaction/proximityPrompt.d.ts +2 -0
- package/dist/interaction/proximityPrompt.js +2 -0
- package/dist/interaction/qte.d.ts +5 -0
- package/dist/interaction/qte.js +5 -0
- package/dist/interaction/skillCheck.d.ts +5 -0
- package/dist/interaction/skillCheck.js +5 -0
- package/dist/inventory/inventoryModel.d.ts +12 -0
- package/dist/inventory/inventoryModel.js +12 -0
- package/dist/inventory/shapedGrid.d.ts +16 -0
- package/dist/inventory/shapedGrid.js +16 -0
- package/dist/inventory/slotModel.d.ts +10 -0
- package/dist/inventory/slotModel.js +10 -0
- package/dist/item/durability.d.ts +5 -0
- package/dist/item/durability.js +5 -0
- package/dist/item/itemIdentity.d.ts +171 -0
- package/dist/item/itemIdentity.js +138 -0
- package/dist/item/itemInstanceRegistry.d.ts +32 -0
- package/dist/item/itemInstanceRegistry.js +34 -0
- package/dist/item/itemgen.d.ts +163 -0
- package/dist/item/itemgen.js +151 -0
- package/dist/item/modularItem.d.ts +5 -0
- package/dist/item/modularItem.js +5 -0
- package/dist/item/use.d.ts +5 -0
- package/dist/item/use.js +5 -0
- package/dist/item/useBehavior.d.ts +142 -0
- package/dist/item/useBehavior.js +105 -0
- package/dist/item/weapon.d.ts +5 -0
- package/dist/item/weapon.js +5 -0
- package/dist/math/scalar.d.ts +25 -0
- package/dist/math/scalar.js +47 -0
- package/dist/meta/changelog.d.ts +4 -1
- package/dist/meta/changelog.js +16 -2
- package/dist/movement/avoidance.d.ts +45 -0
- package/dist/movement/avoidance.js +123 -0
- package/dist/movement/cameraRig.d.ts +8 -0
- package/dist/movement/cameraRig.js +8 -0
- package/dist/movement/dash.d.ts +11 -0
- package/dist/movement/dash.js +11 -0
- package/dist/movement/formation.d.ts +135 -0
- package/dist/movement/formation.js +194 -0
- package/dist/movement/glideModel.d.ts +5 -0
- package/dist/movement/glideModel.js +5 -0
- package/dist/movement/grappleSwing.d.ts +5 -0
- package/dist/movement/grappleSwing.js +5 -0
- package/dist/movement/leaderTrail.d.ts +5 -0
- package/dist/movement/leaderTrail.js +5 -0
- package/dist/movement/movementModel.d.ts +35 -8
- package/dist/movement/movementModel.js +42 -14
- package/dist/movement/playerMovement.js +65 -10
- package/dist/movement/poseState.d.ts +13 -0
- package/dist/movement/poseState.js +16 -0
- package/dist/movement/steering.d.ts +8 -0
- package/dist/movement/steering.js +18 -0
- package/dist/multiplayer/combatSnapshot.d.ts +3 -0
- package/dist/multiplayer/combatSnapshot.js +3 -0
- package/dist/multiplayer/lagCompensation.d.ts +5 -0
- package/dist/multiplayer/lagCompensation.js +5 -0
- package/dist/multiplayer/presenceModel.d.ts +9 -1
- package/dist/multiplayer/presenceModel.js +9 -1
- package/dist/multiplayer/simultaneousCommit.d.ts +3 -0
- package/dist/multiplayer/simultaneousCommit.js +3 -0
- package/dist/multiplayer.d.ts +11 -0
- package/dist/multiplayer.js +11 -0
- package/dist/nav/pathFollow.d.ts +57 -0
- package/dist/nav/pathFollow.js +109 -0
- package/dist/orders/orderKinds.d.ts +156 -0
- package/dist/orders/orderKinds.js +197 -0
- package/dist/orders/orderQueue.d.ts +208 -0
- package/dist/orders/orderQueue.js +211 -0
- package/dist/physics/drivableVehicle.d.ts +29 -0
- package/dist/physics/drivableVehicle.js +16 -0
- package/dist/physics/kinematicVehicle.d.ts +21 -1
- package/dist/physics/kinematicVehicle.js +23 -8
- package/dist/physics/physicsWorld.d.ts +24 -12
- package/dist/physics/physicsWorld.js +11 -5
- package/dist/physics/radialImpulse.d.ts +25 -0
- package/dist/physics/radialImpulse.js +27 -0
- package/dist/procedural.d.ts +3 -0
- package/dist/procedural.js +3 -0
- package/dist/progression/statGraph.d.ts +116 -0
- package/dist/progression/statGraph.js +318 -0
- package/dist/puzzle/cellGrid.d.ts +9 -0
- package/dist/puzzle/cellGrid.js +9 -0
- package/dist/puzzle/fallingPiece.d.ts +9 -0
- package/dist/puzzle/fallingPiece.js +9 -0
- package/dist/puzzle/nonogram.d.ts +39 -0
- package/dist/puzzle/nonogram.js +136 -0
- package/dist/random/nameGen.d.ts +5 -0
- package/dist/random/nameGen.js +5 -0
- package/dist/random/pick.d.ts +8 -0
- package/dist/random/pick.js +31 -0
- package/dist/random/rng.d.ts +22 -0
- package/dist/random/rng.js +28 -8
- package/dist/random/seedLink.d.ts +4 -0
- package/dist/random/seedLink.js +4 -0
- package/dist/relation/keyedValues.d.ts +54 -0
- package/dist/relation/keyedValues.js +115 -0
- package/dist/relation/thresholds.d.ts +62 -0
- package/dist/relation/thresholds.js +62 -0
- package/dist/render/color.d.ts +12 -0
- package/dist/render/color.js +26 -0
- package/dist/render/lookPreset.d.ts +41 -0
- package/dist/render/lookPreset.js +29 -0
- package/dist/render/postProcessing.d.ts +20 -0
- package/dist/render/postProcessing.js +21 -1
- package/dist/rules/predicate.d.ts +53 -0
- package/dist/rules/predicate.js +64 -0
- package/dist/rules/ruleEffects.d.ts +38 -0
- package/dist/rules/ruleEffects.js +37 -0
- package/dist/rules/triggeredRules.d.ts +160 -0
- package/dist/rules/triggeredRules.js +241 -0
- package/dist/runtime/adapter.d.ts +42 -3
- package/dist/runtime/adapter.js +44 -1
- package/dist/runtime/cameraDirector.d.ts +1 -0
- package/dist/runtime/cameraDirector.js +1 -0
- package/dist/runtime/commandRunner.d.ts +1 -0
- package/dist/runtime/commandRunner.js +1 -0
- package/dist/runtime/context/combatFx.d.ts +23 -0
- package/dist/runtime/context/combatFx.js +161 -0
- package/dist/runtime/context/registries.d.ts +13 -0
- package/dist/runtime/context/registries.js +84 -0
- package/dist/runtime/context/worldItems.d.ts +21 -0
- package/dist/runtime/context/worldItems.js +37 -0
- package/dist/runtime/descriptors/baseline.d.ts +48 -0
- package/dist/runtime/descriptors/baseline.js +134 -0
- package/dist/runtime/descriptors/features.d.ts +74 -0
- package/dist/runtime/descriptors/features.js +281 -0
- package/dist/runtime/gameContext.d.ts +114 -13
- package/dist/runtime/gameContext.js +303 -395
- package/dist/runtime/gameRuntime.d.ts +1 -0
- package/dist/runtime/gameRuntime.js +1 -0
- package/dist/runtime/headlessRunner.d.ts +60 -0
- package/dist/runtime/headlessRunner.js +44 -0
- package/dist/runtime/hostPersistence.d.ts +12 -0
- package/dist/runtime/hostPersistence.js +12 -0
- package/dist/runtime/hostedGameRunner.d.ts +8 -3
- package/dist/runtime/hostedGameRunner.js +26 -3
- package/dist/runtime/hostedWorldSession.d.ts +12 -4
- package/dist/runtime/hostedWorldSession.js +11 -4
- package/dist/runtime/inputSnapshot.d.ts +8 -3
- package/dist/runtime/inputSnapshot.js +6 -2
- package/dist/runtime/motionIntents.d.ts +11 -2
- package/dist/runtime/motionIntents.js +16 -2
- package/dist/runtime/perContext.d.ts +15 -0
- package/dist/runtime/perContext.js +21 -0
- package/dist/runtime/runtimeSave.d.ts +79 -0
- package/dist/runtime/runtimeSave.js +105 -0
- package/dist/runtime/save.d.ts +4 -0
- package/dist/runtime/save.js +4 -0
- package/dist/runtime/snapshot.d.ts +7 -0
- package/dist/runtime/snapshot.js +7 -0
- package/dist/runtime/visibility.d.ts +2 -1
- package/dist/runtime/visibility.js +2 -1
- package/dist/runtime/worldChannel.d.ts +7 -3
- package/dist/runtime/worldChannel.js +51 -6
- package/dist/runtime/worldMirror.d.ts +14 -2
- package/dist/runtime/worldMirror.js +15 -2
- package/dist/runtime/worldProjection.d.ts +47 -0
- package/dist/runtime/worldProjection.js +52 -0
- package/dist/runtime/worldReplication.d.ts +30 -7
- package/dist/runtime/worldReplication.js +41 -9
- package/dist/runtime/worldSnapshot.d.ts +30 -3
- package/dist/runtime/worldSnapshot.js +20 -5
- package/dist/scene/assetCatalog.d.ts +21 -0
- package/dist/scene/assetCatalog.js +4 -0
- package/dist/scene/assetDiagnostics.d.ts +69 -0
- package/dist/scene/assetDiagnostics.js +110 -0
- package/dist/scene/assetGenerator.d.ts +65 -0
- package/dist/scene/assetGenerator.js +64 -0
- package/dist/scene/assetSpace.d.ts +137 -0
- package/dist/scene/assetSpace.js +259 -0
- package/dist/scene/authoredTriggers.d.ts +169 -0
- package/dist/scene/authoredTriggers.js +340 -0
- package/dist/scene/behaviorRuntime.d.ts +75 -0
- package/dist/scene/behaviorRuntime.js +217 -0
- package/dist/scene/behaviors.d.ts +14 -2
- package/dist/scene/behaviors.js +7 -2
- package/dist/scene/bodyBind.d.ts +60 -0
- package/dist/scene/bodyBind.js +51 -0
- package/dist/scene/builtinSceneKinds.d.ts +5 -0
- package/dist/scene/builtinSceneKinds.js +62 -0
- package/dist/scene/colliders.d.ts +13 -1
- package/dist/scene/colliders.js +37 -1
- package/dist/scene/entityStats.d.ts +11 -2
- package/dist/scene/entityStats.js +11 -2
- package/dist/scene/entityStore.d.ts +12 -1
- package/dist/scene/entityStore.js +15 -0
- package/dist/scene/facing.d.ts +18 -0
- package/dist/scene/facing.js +26 -0
- package/dist/scene/modelSockets.d.ts +33 -0
- package/dist/scene/modelSockets.js +29 -0
- package/dist/scene/objectQuery.d.ts +2 -0
- package/dist/scene/objectQuery.js +2 -0
- package/dist/scene/objectStore.d.ts +4 -0
- package/dist/scene/objectStore.js +6 -0
- package/dist/scene/possession.d.ts +8 -0
- package/dist/scene/possession.js +14 -0
- package/dist/scene/roster.d.ts +3 -0
- package/dist/scene/roster.js +12 -0
- package/dist/scene/sceneKinds.d.ts +240 -0
- package/dist/scene/sceneKinds.js +214 -0
- package/dist/scene/sceneOwnership.d.ts +169 -0
- package/dist/scene/sceneOwnership.js +179 -0
- package/dist/scene/selectionBookmarks.d.ts +93 -0
- package/dist/scene/selectionBookmarks.js +122 -0
- package/dist/scene/vehicleSeat.d.ts +68 -0
- package/dist/scene/vehicleSeat.js +59 -0
- package/dist/sensor/concealment.d.ts +3 -0
- package/dist/sensor/concealment.js +3 -0
- package/dist/sensor/freezeMonitor.d.ts +1 -0
- package/dist/sensor/freezeMonitor.js +1 -0
- package/dist/sensor/frustumSensor.d.ts +7 -3
- package/dist/sensor/frustumSensor.js +7 -3
- package/dist/sensor/hiddenStateProbe.d.ts +5 -2
- package/dist/sensor/hiddenStateProbe.js +5 -2
- package/dist/sensor/recordingBuffer.d.ts +2 -1
- package/dist/sensor/recordingBuffer.js +2 -1
- package/dist/sensor/replayLoop.d.ts +6 -2
- package/dist/sensor/replayLoop.js +6 -2
- package/dist/sensor/revealQuery.d.ts +2 -1
- package/dist/sensor/revealQuery.js +2 -1
- package/dist/sensor/visionCone.d.ts +10 -3
- package/dist/sensor/visionCone.js +10 -3
- package/dist/session/contestedChannel.d.ts +1 -0
- package/dist/session/contestedChannel.js +1 -0
- package/dist/session/extraction.d.ts +1 -0
- package/dist/session/extraction.js +1 -0
- package/dist/session/roles.d.ts +6 -0
- package/dist/session/roles.js +6 -0
- package/dist/session/roundState.d.ts +8 -0
- package/dist/session/roundState.js +2 -0
- package/dist/settings/settingsModel.d.ts +1 -0
- package/dist/settings/settingsModel.js +1 -0
- package/dist/stats/accumulatorMeter.d.ts +6 -0
- package/dist/stats/accumulatorMeter.js +6 -0
- package/dist/stats/eventMeter.d.ts +5 -0
- package/dist/stats/eventMeter.js +5 -0
- package/dist/stats/rollCheck.d.ts +5 -0
- package/dist/stats/rollCheck.js +5 -0
- package/dist/stats/statModifiers.d.ts +5 -0
- package/dist/stats/statModifiers.js +5 -0
- package/dist/store/defineKeyedStore.d.ts +38 -0
- package/dist/store/defineKeyedStore.js +42 -0
- package/dist/store/defineStore.d.ts +33 -0
- package/dist/store/defineStore.js +35 -0
- package/dist/store/observableKeyedStore.d.ts +5 -0
- package/dist/store/observableKeyedStore.js +34 -2
- package/dist/survival/decayMeter.d.ts +55 -0
- package/dist/survival/decayMeter.js +130 -55
- package/dist/survival/moodle.d.ts +2 -0
- package/dist/survival/regionHealth.d.ts +6 -0
- package/dist/survival/regionHealth.js +5 -0
- package/dist/tactics/fallingGrid.d.ts +4 -2
- package/dist/tactics/fallingGrid.js +4 -2
- package/dist/tactics/predictiveQuery.d.ts +3 -0
- package/dist/tactics/predictiveQuery.js +3 -0
- package/dist/tactics/snapshot.d.ts +2 -0
- package/dist/tactics/snapshot.js +2 -0
- package/dist/tactics/surface.d.ts +1 -0
- package/dist/tactics/surface.js +1 -0
- package/dist/tactics/tacticalGrid.d.ts +1 -0
- package/dist/tactics/tacticalGrid.js +1 -0
- package/dist/time/beatClock.d.ts +14 -4
- package/dist/time/beatClock.js +14 -4
- package/dist/time/calendarClock.d.ts +3 -0
- package/dist/time/calendarClock.js +3 -0
- package/dist/time/idleProgress.d.ts +4 -0
- package/dist/time/idleProgress.js +4 -0
- package/dist/time/simClock.d.ts +2 -0
- package/dist/time/simClock.js +20 -5
- package/dist/ui/actionModel.d.ts +110 -0
- package/dist/ui/actionModel.js +159 -0
- package/dist/ui/gameLayout.d.ts +30 -11
- package/dist/ui/gameLayout.js +30 -11
- package/dist/ui/hudDocument.d.ts +114 -0
- package/dist/ui/hudDocument.js +220 -0
- package/dist/ui/hudLayout.d.ts +33 -1
- package/dist/ui/hudLayout.js +204 -17
- package/dist/ui/selectionModel.d.ts +92 -0
- package/dist/ui/selectionModel.js +88 -0
- package/dist/ui/tooltipModel.d.ts +63 -0
- package/dist/ui/tooltipModel.js +82 -0
- package/dist/ui.d.ts +15 -0
- package/dist/ui.js +15 -0
- package/dist/visibility/bounds.d.ts +8 -1
- package/dist/visibility/bounds.js +8 -1
- package/dist/visibility/frustum.d.ts +12 -3
- package/dist/visibility/frustum.js +12 -3
- package/dist/work/jobQueue.d.ts +201 -0
- package/dist/work/jobQueue.js +253 -0
- package/dist/work/unitTraining.d.ts +58 -0
- package/dist/work/unitTraining.js +52 -0
- package/dist/world/authoredObjects.d.ts +58 -0
- package/dist/world/authoredObjects.js +69 -0
- package/dist/world/buildingGenerator.d.ts +18 -0
- package/dist/world/buildingGenerator.js +62 -0
- package/dist/world/buildings.d.ts +5 -0
- package/dist/world/buildings.js +5 -0
- package/dist/world/catenary.d.ts +22 -0
- package/dist/world/catenary.js +69 -0
- package/dist/world/features.d.ts +115 -7
- package/dist/world/features.js +56 -5
- package/dist/world/footprintGrid.d.ts +59 -0
- package/dist/world/footprintGrid.js +141 -0
- package/dist/world/geometry.d.ts +64 -0
- package/dist/world/geometry.js +94 -0
- package/dist/world/grassKind.d.ts +51 -0
- package/dist/world/grassKind.js +101 -0
- package/dist/world/pathInstances.d.ts +27 -0
- package/dist/world/pathInstances.js +27 -0
- package/dist/world/pathTerrain.d.ts +80 -0
- package/dist/world/pathTerrain.js +142 -0
- package/dist/world/placeAsset.d.ts +81 -0
- package/dist/world/placeAsset.js +77 -0
- package/dist/world/placement.d.ts +4 -0
- package/dist/world/placement.js +4 -0
- package/dist/world/placementController.d.ts +6 -0
- package/dist/world/placementController.js +6 -0
- package/dist/world/polyline.d.ts +34 -0
- package/dist/world/polyline.js +81 -0
- package/dist/world/roads.d.ts +8 -0
- package/dist/world/roads.js +38 -0
- package/dist/world/scatterRegion.d.ts +164 -0
- package/dist/world/scatterRegion.js +409 -0
- package/dist/world/sceneShapes.d.ts +43 -0
- package/dist/world/sceneShapes.js +1 -0
- package/dist/world/segment.d.ts +27 -0
- package/dist/world/segment.js +43 -0
- package/dist/world/soilKind.d.ts +48 -0
- package/dist/world/soilKind.js +92 -0
- package/dist/world/spatialSample.d.ts +241 -0
- package/dist/world/spatialSample.js +465 -0
- package/dist/world/terraform.d.ts +213 -1
- package/dist/world/terraform.js +655 -20
- package/dist/world/terrain.d.ts +119 -20
- package/dist/world/terrain.js +247 -41
- package/dist/world/terrainGuides.d.ts +182 -0
- package/dist/world/terrainGuides.js +343 -0
- package/dist/world/vec2.d.ts +81 -0
- package/dist/world/vec2.js +128 -0
- package/dist/world/vec3.d.ts +49 -0
- package/dist/world/vec3.js +76 -0
- package/dist/world/vegetation.d.ts +71 -0
- package/dist/world/vegetation.js +151 -0
- package/dist/world/visibilityField.d.ts +154 -0
- package/dist/world/visibilityField.js +271 -0
- package/dist/world/volumetricClouds.d.ts +52 -0
- package/dist/world/volumetricClouds.js +43 -0
- package/dist/world/walls.d.ts +9 -0
- package/dist/world/walls.js +9 -0
- package/dist/world/waterKind.d.ts +55 -0
- package/dist/world/waterKind.js +99 -0
- package/dist/world.d.ts +132 -0
- package/dist/world.js +132 -0
- package/package.json +32 -8
- package/skills/jgengine/SKILL.md +51 -0
- package/skills/jgengine/api.md +434 -0
- package/skills/jgengine/capabilities.md +29 -0
- package/skills/jgengine/reference-cartridge.md +72 -0
- package/skills/jgengine-combat/SKILL.md +34 -0
- package/skills/jgengine-combat/api.md +549 -0
- package/skills/jgengine-combat/capabilities.md +169 -0
- package/skills/jgengine-combat/reference.md +98 -0
- package/skills/jgengine-gameplay/SKILL.md +39 -0
- package/skills/jgengine-gameplay/api.md +1794 -0
- package/skills/jgengine-gameplay/capabilities.md +378 -0
- package/skills/jgengine-gameplay/reference-systems.md +60 -0
- package/skills/jgengine-world/SKILL.md +38 -0
- package/skills/jgengine-world/api.md +2652 -0
- package/skills/jgengine-world/capabilities.md +370 -0
- package/skills/jgengine-world/reference.md +222 -0
- package/dist/cartridge/runtime.d.ts +0 -15
- package/dist/cartridge/runtime.js +0 -556
- package/dist/cartridge/spec.d.ts +0 -188
- package/dist/cartridge/spec.js +0 -19
- package/dist/cartridge/validate.d.ts +0 -2
- package/dist/cartridge/validate.js +0 -78
- package/dist/store/engineStore.d.ts +0 -22
- package/dist/store/engineStore.js +0 -50
- package/dist/store/features.d.ts +0 -10
- package/dist/store/features.js +0 -23
- package/llms.txt +0 -5389
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import type { Aabb, Footprint, Vec2 } from "../world/geometry.js";
|
|
2
|
+
/**
|
|
3
|
+
* Wrap `degrees` into `[0, 360)` — the canonical heading range every policy and conversion here works
|
|
4
|
+
* in. Non-finite input collapses to `0` so bad metadata never leaks a `NaN` heading downstream.
|
|
5
|
+
* @capability asset-heading normalize a placement heading into the engine's degree convention
|
|
6
|
+
*/
|
|
7
|
+
export declare function normalizeDegrees(degrees: number): number;
|
|
8
|
+
/**
|
|
9
|
+
* Convert a compass heading (degrees, `0` = engine north, increasing clockwise) into the Three.js
|
|
10
|
+
* Y-rotation (radians, wrapped to `(-PI, PI]`) a renderer applies. Sign matches
|
|
11
|
+
* `world/placementController.quarterTurnsToRotationY`, so heading `90` equals one clockwise quarter
|
|
12
|
+
* turn. This is the one place degrees cross into the private radian space Three.js requires.
|
|
13
|
+
* @capability asset-heading turn a north-relative degree heading into a Three.js Y-rotation
|
|
14
|
+
*/
|
|
15
|
+
export declare function headingToRotationY(headingDegrees: number): number;
|
|
16
|
+
/**
|
|
17
|
+
* Inverse of {@link headingToRotationY}: recover the `[0, 360)` compass heading from a Three.js
|
|
18
|
+
* Y-rotation. Lets a gizmo or inspector present radians as the degrees authors edit.
|
|
19
|
+
* @capability asset-heading read a Three.js Y-rotation back as a north-relative degree heading
|
|
20
|
+
*/
|
|
21
|
+
export declare function rotationYToHeading(rotationY: number): number;
|
|
22
|
+
/** Bridge the legacy 0–3 quarter-turn placement model onto degrees (each turn is 90 degrees clockwise). @internal */
|
|
23
|
+
export declare function quarterTurnsToHeading(quarterTurns: number): number;
|
|
24
|
+
/**
|
|
25
|
+
* A per-asset/per-tool rotation constraint, authored as data instead of hardcoded in build code:
|
|
26
|
+
* `locked` pins every placement to one heading, `snap` quantizes to an increment (15, 45, …), and
|
|
27
|
+
* `free` allows any heading. Serializable — this is the shape stored on a catalog entry or a tool.
|
|
28
|
+
*/
|
|
29
|
+
export type PlacementRotationPolicy = {
|
|
30
|
+
readonly mode: "locked";
|
|
31
|
+
readonly degrees?: number;
|
|
32
|
+
} | {
|
|
33
|
+
readonly mode: "snap";
|
|
34
|
+
readonly snapDegrees: number;
|
|
35
|
+
} | {
|
|
36
|
+
readonly mode: "free";
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Quantize `degrees` to the nearest multiple of `increment` (both in the `[0, 360)` convention). A
|
|
40
|
+
* non-positive increment is treated as free rotation and only normalizes. The math behind a
|
|
41
|
+
* `snap`-mode {@link PlacementRotationPolicy}.
|
|
42
|
+
* @capability placement-rotation snap a heading to a fixed degree increment
|
|
43
|
+
*/
|
|
44
|
+
export declare function snapHeading(degrees: number, increment: number): number;
|
|
45
|
+
/**
|
|
46
|
+
* Resolve a raw drag/scroll heading through a {@link PlacementRotationPolicy} into the heading a
|
|
47
|
+
* placement should actually commit: `locked` ignores the input for its fixed heading, `snap` quantizes,
|
|
48
|
+
* `free` (or an absent policy) normalizes. Deterministic — the single interpreter preview, editor
|
|
49
|
+
* placement, and runtime spawning share instead of each re-implementing the modes.
|
|
50
|
+
* @capability placement-rotation apply a rotation policy to a candidate placement heading
|
|
51
|
+
*/
|
|
52
|
+
export declare function applyRotationPolicy(degrees: number, policy: PlacementRotationPolicy | undefined): number;
|
|
53
|
+
/**
|
|
54
|
+
* Where a model's pivot sits within its footprint: `center` (origin at the footprint center),
|
|
55
|
+
* `corner` (origin at the min-X/min-Z corner), or a normalized `{ x, z }` fraction in `[-0.5, 0.5]`.
|
|
56
|
+
*/
|
|
57
|
+
export type AssetAnchor = "center" | "corner" | {
|
|
58
|
+
readonly x: number;
|
|
59
|
+
readonly z: number;
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* Catalog-level asset-space metadata: how a model is authored relative to the engine, owned by the
|
|
63
|
+
* catalog entry rather than re-derived per game. Every field is optional so an unmeasured asset stays
|
|
64
|
+
* valid; {@link resolveFacingRotationY}/{@link assetUnitScale}/{@link resolveAnchorOffset} supply the
|
|
65
|
+
* documented defaults.
|
|
66
|
+
*/
|
|
67
|
+
export interface AssetSpace {
|
|
68
|
+
/** Compass heading (degrees, `0` = north) the model's front visually points at `rotationY = 0`. Default `0`. */
|
|
69
|
+
forwardDegrees?: number;
|
|
70
|
+
/** Multiply source-space lengths by this to reach engine meters (a kit's native tile size correction). Default `1`. */
|
|
71
|
+
unitScale?: number;
|
|
72
|
+
/** Authored footprint in engine meters — the grid/placement extent, independent of the raw mesh bounds. */
|
|
73
|
+
footprint?: Footprint;
|
|
74
|
+
/** Authored grid cell size in engine meters this asset snaps to. */
|
|
75
|
+
gridSize?: number;
|
|
76
|
+
/** Where the model origin sits within {@link footprint}. Default `center`. */
|
|
77
|
+
anchor?: AssetAnchor;
|
|
78
|
+
/** Optional asset-local placement bounds (XZ) a tool clamps a drop position into. */
|
|
79
|
+
bounds?: Aabb;
|
|
80
|
+
/** Default rotation constraint when this asset is placed. Absent means free rotation. */
|
|
81
|
+
rotation?: PlacementRotationPolicy;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* The Three.js Y-rotation that makes a model whose front is authored at `forwardDegrees` visually point
|
|
85
|
+
* `headingDegrees` (engine north = `0`). This is the catalog-owned replacement for per-game corrective
|
|
86
|
+
* yaw: a model authored facing south (`forwardDegrees: 180`) placed toward north resolves to `Math.PI`.
|
|
87
|
+
* @capability asset-facing resolve a placement heading into a Three.js Y-rotation using canonical forward
|
|
88
|
+
*/
|
|
89
|
+
export declare function resolveFacingRotationY(headingDegrees: number, space?: Pick<AssetSpace, "forwardDegrees">): number;
|
|
90
|
+
/** The effective, guarded unit scale for an asset — a finite positive `unitScale`, else `1`. @internal */
|
|
91
|
+
export declare function assetUnitScale(space?: Pick<AssetSpace, "unitScale">): number;
|
|
92
|
+
/**
|
|
93
|
+
* Convert a source-space length to engine meters through the asset's {@link AssetSpace.unitScale} — the
|
|
94
|
+
* data-owned replacement for per-game scale constants (a native ~4-unit kit tile down to a 1-unit grid).
|
|
95
|
+
* @capability asset-units convert a source-space length to engine meters via catalog unit scale
|
|
96
|
+
*/
|
|
97
|
+
export declare function toEngineUnits(sourceValue: number, space?: Pick<AssetSpace, "unitScale">): number;
|
|
98
|
+
/**
|
|
99
|
+
* The pivot's offset from the footprint center, in engine meters, implied by {@link AssetSpace.anchor}
|
|
100
|
+
* and {@link AssetSpace.footprint}. `center` yields `[0, 0]`; `corner` yields the min corner; a
|
|
101
|
+
* normalized `{ x, z }` scales by the footprint. Subtract it to seat a footprint centered on a point.
|
|
102
|
+
* @capability asset-anchor resolve a model's pivot offset from its footprint center
|
|
103
|
+
*/
|
|
104
|
+
export declare function resolveAnchorOffset(space?: Pick<AssetSpace, "anchor" | "footprint">): Vec2;
|
|
105
|
+
/**
|
|
106
|
+
* The axis-aligned footprint extent after rotating a rectangular {@link Footprint} by `headingDegrees`
|
|
107
|
+
* — footprint-aware placement: a 90-degree turn swaps width/depth, and arbitrary headings grow the
|
|
108
|
+
* bounding box so overlap and snap checks see the space the rotated asset truly occupies.
|
|
109
|
+
* @capability asset-footprint rotate a rectangular footprint into its axis-aligned extent
|
|
110
|
+
*/
|
|
111
|
+
export declare function rotatedFootprint(footprint: Footprint, headingDegrees: number): Footprint;
|
|
112
|
+
/** One problem found by {@link validateAssetSpace}: which metadata field and why it is invalid. */
|
|
113
|
+
export interface AssetSpaceIssue {
|
|
114
|
+
field: string;
|
|
115
|
+
message: string;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Report contradictory or malformed asset-space metadata so catalog generation can reject it before it
|
|
119
|
+
* reaches a tool: non-finite headings, non-positive scales/sizes, inverted bounds, unknown anchors, and
|
|
120
|
+
* ill-formed rotation policies (a `snap` with a non-positive increment, an unknown `mode`). An empty
|
|
121
|
+
* array means valid. Validation lives here so tools consume resolved metadata instead of reinterpreting.
|
|
122
|
+
* @capability asset-space validate catalog asset-space metadata during index generation
|
|
123
|
+
*/
|
|
124
|
+
export declare function validateAssetSpace(raw: unknown): AssetSpaceIssue[];
|
|
125
|
+
/**
|
|
126
|
+
* Parse an untrusted rotation policy (from a scene document or catalog JSON) into a valid
|
|
127
|
+
* {@link PlacementRotationPolicy}, defaulting to `free` when absent or malformed. The lenient companion
|
|
128
|
+
* to {@link validateAssetSpace} for the read path.
|
|
129
|
+
* @capability placement-rotation parse a serialized rotation policy, defaulting to free
|
|
130
|
+
*/
|
|
131
|
+
export declare function parseRotationPolicy(raw: unknown): PlacementRotationPolicy;
|
|
132
|
+
/**
|
|
133
|
+
* Parse untrusted JSON into an {@link AssetSpace}, dropping malformed fields, or `undefined` when
|
|
134
|
+
* nothing valid remains — the round-trippable read path for serialized catalog/scene metadata.
|
|
135
|
+
* @capability asset-space parse serialized asset-space metadata into a validated shape
|
|
136
|
+
*/
|
|
137
|
+
export declare function parseAssetSpace(raw: unknown): AssetSpace | undefined;
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Asset-space metadata + placement rotation policy: the catalog-owned description of how a model sits
|
|
3
|
+
* in its source space and how a placement tool may rotate it. Games author scenes against engine north
|
|
4
|
+
* (heading `0` degrees, increasing clockwise) instead of transplanting per-game yaw offsets and magic
|
|
5
|
+
* scales; the catalog entry ({@link "scene/assetCatalog".ModelAssetRef}) is the upstream owner of the
|
|
6
|
+
* correction. Public APIs speak degrees; the only radians here are the private Three.js Y-rotation this
|
|
7
|
+
* module converts to, matching `world/placementController`'s `quarterTurnsToRotationY` sign so a
|
|
8
|
+
* quarter turn still equals 90 degrees clockwise. Pure and serializable — no three.js, no allocation of
|
|
9
|
+
* shared state — so preview, placement, and runtime spawning share one interpretation.
|
|
10
|
+
*/
|
|
11
|
+
const DEG2RAD = Math.PI / 180;
|
|
12
|
+
const RAD2DEG = 180 / Math.PI;
|
|
13
|
+
const FULL_TURN = 360;
|
|
14
|
+
function clamp(value, min, max) {
|
|
15
|
+
return value < min ? min : value > max ? max : value;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Wrap `degrees` into `[0, 360)` — the canonical heading range every policy and conversion here works
|
|
19
|
+
* in. Non-finite input collapses to `0` so bad metadata never leaks a `NaN` heading downstream.
|
|
20
|
+
* @capability asset-heading normalize a placement heading into the engine's degree convention
|
|
21
|
+
*/
|
|
22
|
+
export function normalizeDegrees(degrees) {
|
|
23
|
+
if (!Number.isFinite(degrees))
|
|
24
|
+
return 0;
|
|
25
|
+
const wrapped = degrees % FULL_TURN;
|
|
26
|
+
return wrapped < 0 ? wrapped + FULL_TURN : wrapped;
|
|
27
|
+
}
|
|
28
|
+
function wrapRadians(radians) {
|
|
29
|
+
let r = radians % (2 * Math.PI);
|
|
30
|
+
if (r <= -Math.PI)
|
|
31
|
+
r += 2 * Math.PI;
|
|
32
|
+
if (r > Math.PI)
|
|
33
|
+
r -= 2 * Math.PI;
|
|
34
|
+
return r + 0; // normalize -0 to 0
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Convert a compass heading (degrees, `0` = engine north, increasing clockwise) into the Three.js
|
|
38
|
+
* Y-rotation (radians, wrapped to `(-PI, PI]`) a renderer applies. Sign matches
|
|
39
|
+
* `world/placementController.quarterTurnsToRotationY`, so heading `90` equals one clockwise quarter
|
|
40
|
+
* turn. This is the one place degrees cross into the private radian space Three.js requires.
|
|
41
|
+
* @capability asset-heading turn a north-relative degree heading into a Three.js Y-rotation
|
|
42
|
+
*/
|
|
43
|
+
export function headingToRotationY(headingDegrees) {
|
|
44
|
+
return wrapRadians(-normalizeDegrees(headingDegrees) * DEG2RAD);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Inverse of {@link headingToRotationY}: recover the `[0, 360)` compass heading from a Three.js
|
|
48
|
+
* Y-rotation. Lets a gizmo or inspector present radians as the degrees authors edit.
|
|
49
|
+
* @capability asset-heading read a Three.js Y-rotation back as a north-relative degree heading
|
|
50
|
+
*/
|
|
51
|
+
export function rotationYToHeading(rotationY) {
|
|
52
|
+
return normalizeDegrees(-rotationY * RAD2DEG);
|
|
53
|
+
}
|
|
54
|
+
/** Bridge the legacy 0–3 quarter-turn placement model onto degrees (each turn is 90 degrees clockwise). @internal */
|
|
55
|
+
export function quarterTurnsToHeading(quarterTurns) {
|
|
56
|
+
return normalizeDegrees(Math.round(quarterTurns) * 90);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Quantize `degrees` to the nearest multiple of `increment` (both in the `[0, 360)` convention). A
|
|
60
|
+
* non-positive increment is treated as free rotation and only normalizes. The math behind a
|
|
61
|
+
* `snap`-mode {@link PlacementRotationPolicy}.
|
|
62
|
+
* @capability placement-rotation snap a heading to a fixed degree increment
|
|
63
|
+
*/
|
|
64
|
+
export function snapHeading(degrees, increment) {
|
|
65
|
+
if (!(increment > 0))
|
|
66
|
+
return normalizeDegrees(degrees);
|
|
67
|
+
return normalizeDegrees(Math.round(normalizeDegrees(degrees) / increment) * increment);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Resolve a raw drag/scroll heading through a {@link PlacementRotationPolicy} into the heading a
|
|
71
|
+
* placement should actually commit: `locked` ignores the input for its fixed heading, `snap` quantizes,
|
|
72
|
+
* `free` (or an absent policy) normalizes. Deterministic — the single interpreter preview, editor
|
|
73
|
+
* placement, and runtime spawning share instead of each re-implementing the modes.
|
|
74
|
+
* @capability placement-rotation apply a rotation policy to a candidate placement heading
|
|
75
|
+
*/
|
|
76
|
+
export function applyRotationPolicy(degrees, policy) {
|
|
77
|
+
if (policy === undefined || policy.mode === "free")
|
|
78
|
+
return normalizeDegrees(degrees);
|
|
79
|
+
if (policy.mode === "locked")
|
|
80
|
+
return normalizeDegrees(policy.degrees ?? 0);
|
|
81
|
+
return snapHeading(degrees, policy.snapDegrees);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* The Three.js Y-rotation that makes a model whose front is authored at `forwardDegrees` visually point
|
|
85
|
+
* `headingDegrees` (engine north = `0`). This is the catalog-owned replacement for per-game corrective
|
|
86
|
+
* yaw: a model authored facing south (`forwardDegrees: 180`) placed toward north resolves to `Math.PI`.
|
|
87
|
+
* @capability asset-facing resolve a placement heading into a Three.js Y-rotation using canonical forward
|
|
88
|
+
*/
|
|
89
|
+
export function resolveFacingRotationY(headingDegrees, space) {
|
|
90
|
+
return headingToRotationY(headingDegrees - (space?.forwardDegrees ?? 0));
|
|
91
|
+
}
|
|
92
|
+
/** The effective, guarded unit scale for an asset — a finite positive `unitScale`, else `1`. @internal */
|
|
93
|
+
export function assetUnitScale(space) {
|
|
94
|
+
const s = space?.unitScale;
|
|
95
|
+
return typeof s === "number" && Number.isFinite(s) && s > 0 ? s : 1;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Convert a source-space length to engine meters through the asset's {@link AssetSpace.unitScale} — the
|
|
99
|
+
* data-owned replacement for per-game scale constants (a native ~4-unit kit tile down to a 1-unit grid).
|
|
100
|
+
* @capability asset-units convert a source-space length to engine meters via catalog unit scale
|
|
101
|
+
*/
|
|
102
|
+
export function toEngineUnits(sourceValue, space) {
|
|
103
|
+
return sourceValue * assetUnitScale(space);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* The pivot's offset from the footprint center, in engine meters, implied by {@link AssetSpace.anchor}
|
|
107
|
+
* and {@link AssetSpace.footprint}. `center` yields `[0, 0]`; `corner` yields the min corner; a
|
|
108
|
+
* normalized `{ x, z }` scales by the footprint. Subtract it to seat a footprint centered on a point.
|
|
109
|
+
* @capability asset-anchor resolve a model's pivot offset from its footprint center
|
|
110
|
+
*/
|
|
111
|
+
export function resolveAnchorOffset(space) {
|
|
112
|
+
const w = space?.footprint?.w ?? 0;
|
|
113
|
+
const d = space?.footprint?.d ?? 0;
|
|
114
|
+
const anchor = space?.anchor ?? "center";
|
|
115
|
+
let fx = 0;
|
|
116
|
+
let fz = 0;
|
|
117
|
+
if (anchor === "corner") {
|
|
118
|
+
fx = -0.5;
|
|
119
|
+
fz = -0.5;
|
|
120
|
+
}
|
|
121
|
+
else if (typeof anchor === "object") {
|
|
122
|
+
fx = clamp(anchor.x, -0.5, 0.5);
|
|
123
|
+
fz = clamp(anchor.z, -0.5, 0.5);
|
|
124
|
+
}
|
|
125
|
+
return [fx * w, fz * d];
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* The axis-aligned footprint extent after rotating a rectangular {@link Footprint} by `headingDegrees`
|
|
129
|
+
* — footprint-aware placement: a 90-degree turn swaps width/depth, and arbitrary headings grow the
|
|
130
|
+
* bounding box so overlap and snap checks see the space the rotated asset truly occupies.
|
|
131
|
+
* @capability asset-footprint rotate a rectangular footprint into its axis-aligned extent
|
|
132
|
+
*/
|
|
133
|
+
export function rotatedFootprint(footprint, headingDegrees) {
|
|
134
|
+
const rad = normalizeDegrees(headingDegrees) * DEG2RAD;
|
|
135
|
+
const cos = Math.abs(Math.cos(rad));
|
|
136
|
+
const sin = Math.abs(Math.sin(rad));
|
|
137
|
+
return {
|
|
138
|
+
w: footprint.w * cos + footprint.d * sin,
|
|
139
|
+
d: footprint.w * sin + footprint.d * cos,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
function isRecord(value) {
|
|
143
|
+
return typeof value === "object" && value !== null;
|
|
144
|
+
}
|
|
145
|
+
function finitePositive(value) {
|
|
146
|
+
return typeof value === "number" && Number.isFinite(value) && value > 0;
|
|
147
|
+
}
|
|
148
|
+
function validateRotationPolicy(raw) {
|
|
149
|
+
if (!isRecord(raw))
|
|
150
|
+
return [{ field: "mode", message: "expected an object" }];
|
|
151
|
+
if (raw.mode === "free")
|
|
152
|
+
return [];
|
|
153
|
+
if (raw.mode === "locked") {
|
|
154
|
+
return raw.degrees !== undefined && (typeof raw.degrees !== "number" || !Number.isFinite(raw.degrees))
|
|
155
|
+
? [{ field: "degrees", message: "expected a finite number" }]
|
|
156
|
+
: [];
|
|
157
|
+
}
|
|
158
|
+
if (raw.mode === "snap") {
|
|
159
|
+
return finitePositive(raw.snapDegrees) ? [] : [{ field: "snapDegrees", message: "expected a positive number" }];
|
|
160
|
+
}
|
|
161
|
+
return [{ field: "mode", message: "expected 'locked', 'snap', or 'free'" }];
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Report contradictory or malformed asset-space metadata so catalog generation can reject it before it
|
|
165
|
+
* reaches a tool: non-finite headings, non-positive scales/sizes, inverted bounds, unknown anchors, and
|
|
166
|
+
* ill-formed rotation policies (a `snap` with a non-positive increment, an unknown `mode`). An empty
|
|
167
|
+
* array means valid. Validation lives here so tools consume resolved metadata instead of reinterpreting.
|
|
168
|
+
* @capability asset-space validate catalog asset-space metadata during index generation
|
|
169
|
+
*/
|
|
170
|
+
export function validateAssetSpace(raw) {
|
|
171
|
+
const issues = [];
|
|
172
|
+
if (!isRecord(raw)) {
|
|
173
|
+
issues.push({ field: "", message: "expected an object" });
|
|
174
|
+
return issues;
|
|
175
|
+
}
|
|
176
|
+
if (raw.forwardDegrees !== undefined && (typeof raw.forwardDegrees !== "number" || !Number.isFinite(raw.forwardDegrees))) {
|
|
177
|
+
issues.push({ field: "forwardDegrees", message: "expected a finite number" });
|
|
178
|
+
}
|
|
179
|
+
if (raw.unitScale !== undefined && !finitePositive(raw.unitScale)) {
|
|
180
|
+
issues.push({ field: "unitScale", message: "expected a positive number" });
|
|
181
|
+
}
|
|
182
|
+
if (raw.gridSize !== undefined && !finitePositive(raw.gridSize)) {
|
|
183
|
+
issues.push({ field: "gridSize", message: "expected a positive number" });
|
|
184
|
+
}
|
|
185
|
+
if (raw.footprint !== undefined) {
|
|
186
|
+
const fp = raw.footprint;
|
|
187
|
+
if (!isRecord(fp) || !finitePositive(fp.w) || !finitePositive(fp.d)) {
|
|
188
|
+
issues.push({ field: "footprint", message: "expected { w > 0, d > 0 }" });
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
if (raw.anchor !== undefined) {
|
|
192
|
+
const a = raw.anchor;
|
|
193
|
+
const named = a === "center" || a === "corner";
|
|
194
|
+
const explicit = isRecord(a) && typeof a.x === "number" && typeof a.z === "number";
|
|
195
|
+
if (!named && !explicit)
|
|
196
|
+
issues.push({ field: "anchor", message: "expected 'center', 'corner', or { x, z }" });
|
|
197
|
+
}
|
|
198
|
+
if (raw.bounds !== undefined) {
|
|
199
|
+
const b = raw.bounds;
|
|
200
|
+
if (!isRecord(b) || typeof b.minX !== "number" || typeof b.maxX !== "number" || typeof b.minZ !== "number" || typeof b.maxZ !== "number") {
|
|
201
|
+
issues.push({ field: "bounds", message: "expected an Aabb" });
|
|
202
|
+
}
|
|
203
|
+
else if (b.maxX < b.minX || b.maxZ < b.minZ) {
|
|
204
|
+
issues.push({ field: "bounds", message: "max must be >= min" });
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
if (raw.rotation !== undefined) {
|
|
208
|
+
issues.push(...validateRotationPolicy(raw.rotation).map((m) => ({ field: `rotation.${m.field}`, message: m.message })));
|
|
209
|
+
}
|
|
210
|
+
return issues;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Parse an untrusted rotation policy (from a scene document or catalog JSON) into a valid
|
|
214
|
+
* {@link PlacementRotationPolicy}, defaulting to `free` when absent or malformed. The lenient companion
|
|
215
|
+
* to {@link validateAssetSpace} for the read path.
|
|
216
|
+
* @capability placement-rotation parse a serialized rotation policy, defaulting to free
|
|
217
|
+
*/
|
|
218
|
+
export function parseRotationPolicy(raw) {
|
|
219
|
+
if (isRecord(raw)) {
|
|
220
|
+
if (raw.mode === "locked") {
|
|
221
|
+
return typeof raw.degrees === "number" && Number.isFinite(raw.degrees)
|
|
222
|
+
? { mode: "locked", degrees: normalizeDegrees(raw.degrees) }
|
|
223
|
+
: { mode: "locked" };
|
|
224
|
+
}
|
|
225
|
+
if (raw.mode === "snap" && finitePositive(raw.snapDegrees))
|
|
226
|
+
return { mode: "snap", snapDegrees: raw.snapDegrees };
|
|
227
|
+
}
|
|
228
|
+
return { mode: "free" };
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Parse untrusted JSON into an {@link AssetSpace}, dropping malformed fields, or `undefined` when
|
|
232
|
+
* nothing valid remains — the round-trippable read path for serialized catalog/scene metadata.
|
|
233
|
+
* @capability asset-space parse serialized asset-space metadata into a validated shape
|
|
234
|
+
*/
|
|
235
|
+
export function parseAssetSpace(raw) {
|
|
236
|
+
if (!isRecord(raw))
|
|
237
|
+
return undefined;
|
|
238
|
+
const out = {};
|
|
239
|
+
if (typeof raw.forwardDegrees === "number" && Number.isFinite(raw.forwardDegrees))
|
|
240
|
+
out.forwardDegrees = normalizeDegrees(raw.forwardDegrees);
|
|
241
|
+
if (finitePositive(raw.unitScale))
|
|
242
|
+
out.unitScale = raw.unitScale;
|
|
243
|
+
if (finitePositive(raw.gridSize))
|
|
244
|
+
out.gridSize = raw.gridSize;
|
|
245
|
+
if (isRecord(raw.footprint) && finitePositive(raw.footprint.w) && finitePositive(raw.footprint.d)) {
|
|
246
|
+
out.footprint = { w: raw.footprint.w, d: raw.footprint.d };
|
|
247
|
+
}
|
|
248
|
+
if (raw.anchor === "center" || raw.anchor === "corner")
|
|
249
|
+
out.anchor = raw.anchor;
|
|
250
|
+
else if (isRecord(raw.anchor) && typeof raw.anchor.x === "number" && typeof raw.anchor.z === "number") {
|
|
251
|
+
out.anchor = { x: raw.anchor.x, z: raw.anchor.z };
|
|
252
|
+
}
|
|
253
|
+
if (isRecord(raw.bounds) && typeof raw.bounds.minX === "number" && typeof raw.bounds.maxX === "number" && typeof raw.bounds.minZ === "number" && typeof raw.bounds.maxZ === "number") {
|
|
254
|
+
out.bounds = { minX: raw.bounds.minX, maxX: raw.bounds.maxX, minZ: raw.bounds.minZ, maxZ: raw.bounds.maxZ };
|
|
255
|
+
}
|
|
256
|
+
if (isRecord(raw.rotation))
|
|
257
|
+
out.rotation = parseRotationPolicy(raw.rotation);
|
|
258
|
+
return Object.keys(out).length === 0 ? undefined : out;
|
|
259
|
+
}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authored behavior triggers on editor volumes and markers — a small `on`/`action` meta vocabulary
|
|
3
|
+
* so "when player enters this volume, spawn wave 2" is scene data, not game code. Games declare
|
|
4
|
+
* actions (typed via ParamSchema); the editor inspector renders their fields; a pure runtime
|
|
5
|
+
* watches membership and dispatches to handlers.
|
|
6
|
+
*/
|
|
7
|
+
import type { SceneDocumentLike, SceneMarkerLike, SceneVolumeLike } from "../world/sceneShapes.js";
|
|
8
|
+
import { type ParamSchema, type ParsedParams } from "./sceneKinds.js";
|
|
9
|
+
/** Event edge that can fire an authored trigger. */
|
|
10
|
+
export type TriggerEvent = "enter" | "exit" | "interact";
|
|
11
|
+
/** Document collection a trigger source lives on. */
|
|
12
|
+
export type TriggerSourceKind = "marker" | "volume";
|
|
13
|
+
/** Reserved meta keys for the trigger vocabulary — action params use every other schema field. @internal */
|
|
14
|
+
export declare const TRIGGER_ON_KEY = "on";
|
|
15
|
+
/** @internal */
|
|
16
|
+
export declare const TRIGGER_ACTION_KEY = "action";
|
|
17
|
+
/** @internal */
|
|
18
|
+
export declare const TRIGGER_RADIUS_KEY = "triggerRadius";
|
|
19
|
+
/** @internal */
|
|
20
|
+
export declare const TRIGGER_LIST_KEY = "triggers";
|
|
21
|
+
/** Default proximity radius (m) for marker enter/exit/interact when neither triggerRadius nor radius is set. @internal */
|
|
22
|
+
export declare const DEFAULT_TRIGGER_RADIUS = 2.5;
|
|
23
|
+
/**
|
|
24
|
+
* A game-declared action the editor can assign to a volume/marker trigger. Schema drives the
|
|
25
|
+
* inspector params; `targets`/`events` optionally narrow where it appears.
|
|
26
|
+
*/
|
|
27
|
+
export interface TriggerActionDefinition {
|
|
28
|
+
id: string;
|
|
29
|
+
/** Human label for the inspector action dropdown. */
|
|
30
|
+
label: string;
|
|
31
|
+
/** Param surface for this action — fields land flat on the object's `meta` (alongside `on`/`action`). */
|
|
32
|
+
schema: ParamSchema;
|
|
33
|
+
/** Which document collections accept this action. Default both. */
|
|
34
|
+
targets?: readonly TriggerSourceKind[];
|
|
35
|
+
/** Which events this action accepts. Default all (`enter`/`exit`/`interact`). */
|
|
36
|
+
events?: readonly TriggerEvent[];
|
|
37
|
+
}
|
|
38
|
+
/** One resolved trigger binding from a document object. */
|
|
39
|
+
export interface AuthoredTrigger {
|
|
40
|
+
sourceId: string;
|
|
41
|
+
sourceKind: TriggerSourceKind;
|
|
42
|
+
objectKind: string;
|
|
43
|
+
on: TriggerEvent;
|
|
44
|
+
action: string;
|
|
45
|
+
params: ParsedParams;
|
|
46
|
+
/** Proximity radius for marker sources; unused for volumes (shape owns containment). */
|
|
47
|
+
radius: number;
|
|
48
|
+
}
|
|
49
|
+
/** Fired when a watched actor trips an authored trigger edge. */
|
|
50
|
+
export interface TriggerDispatchEvent {
|
|
51
|
+
on: TriggerEvent;
|
|
52
|
+
action: string;
|
|
53
|
+
sourceId: string;
|
|
54
|
+
sourceKind: TriggerSourceKind;
|
|
55
|
+
objectKind: string;
|
|
56
|
+
actorId: string;
|
|
57
|
+
params: ParsedParams;
|
|
58
|
+
}
|
|
59
|
+
/** Handler map keyed by action id — unknown actions are skipped unless `onDispatch` is set. */
|
|
60
|
+
export type TriggerHandlers = Readonly<Record<string, (event: TriggerDispatchEvent) => void>>;
|
|
61
|
+
/**
|
|
62
|
+
* Declare a game action the editor can assign to volume/marker triggers. Idempotent per `id`
|
|
63
|
+
* (last registration wins). Call at module load next to catalogs.
|
|
64
|
+
*
|
|
65
|
+
* @capability authored-triggers schema'd on/action vocabulary on volumes and markers with runtime dispatch
|
|
66
|
+
*/
|
|
67
|
+
export declare function registerTriggerAction(definition: TriggerActionDefinition): void;
|
|
68
|
+
/** Registered definition for an action id, or undefined when the game never declared it. */
|
|
69
|
+
export declare function getTriggerAction(id: string): TriggerActionDefinition | undefined;
|
|
70
|
+
/** Every registered action, optionally filtered by target collection. */
|
|
71
|
+
export declare function listTriggerActions(target?: TriggerSourceKind): TriggerActionDefinition[];
|
|
72
|
+
/** Clears the action registry — tests only. @internal */
|
|
73
|
+
export declare function clearTriggerActions(): void;
|
|
74
|
+
/** Resolve the proximity radius for a marker trigger from meta. @internal */
|
|
75
|
+
export declare function triggerRadiusOf(meta: Record<string, unknown> | undefined, fallback?: number): number;
|
|
76
|
+
/**
|
|
77
|
+
* Read every valid `on`/`action` binding off a raw meta bag. Unknown events/actions are dropped;
|
|
78
|
+
* params are schema-parsed when the action is registered, else empty.
|
|
79
|
+
* @internal
|
|
80
|
+
*/
|
|
81
|
+
export declare function readTriggerSpecs(meta: Record<string, unknown> | undefined): readonly {
|
|
82
|
+
on: TriggerEvent;
|
|
83
|
+
action: string;
|
|
84
|
+
params: ParsedParams;
|
|
85
|
+
}[];
|
|
86
|
+
/**
|
|
87
|
+
* Collect every authored trigger on a document's markers and volumes. Pure — no runtime state.
|
|
88
|
+
* Action params use the live {@link registerTriggerAction} registry when present.
|
|
89
|
+
*
|
|
90
|
+
* @capability authored-triggers schema'd on/action vocabulary on volumes and markers with runtime dispatch
|
|
91
|
+
*/
|
|
92
|
+
export declare function collectAuthoredTriggers(document: SceneDocumentLike): AuthoredTrigger[];
|
|
93
|
+
/**
|
|
94
|
+
* True when `point` is inside an editor volume (sphere / cylinder / box). Cylinder height defaults
|
|
95
|
+
* to diameter when omitted; sphere ignores y for the common ground-plane case only when the volume
|
|
96
|
+
* radius covers the full vertical span — here y is tested for sphere and box too.
|
|
97
|
+
*/
|
|
98
|
+
export declare function pointInVolume(volume: SceneVolumeLike, point: {
|
|
99
|
+
x: number;
|
|
100
|
+
y: number;
|
|
101
|
+
z: number;
|
|
102
|
+
}): boolean;
|
|
103
|
+
/** True when `point` is within `radius` of a marker's position (sphere for enter/exit/interact). @internal */
|
|
104
|
+
export declare function pointNearMarker(marker: SceneMarkerLike, point: {
|
|
105
|
+
x: number;
|
|
106
|
+
y: number;
|
|
107
|
+
z: number;
|
|
108
|
+
}, radius: number): boolean;
|
|
109
|
+
/** @internal */
|
|
110
|
+
export interface TriggerActor {
|
|
111
|
+
id: string;
|
|
112
|
+
position: readonly [number, number, number] | {
|
|
113
|
+
x: number;
|
|
114
|
+
y: number;
|
|
115
|
+
z: number;
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
/** @internal */
|
|
119
|
+
export interface AuthoredTriggerStepInput {
|
|
120
|
+
actors: readonly TriggerActor[];
|
|
121
|
+
/** Actor ids that pressed interact this frame — fires `on: "interact"` sources in range. */
|
|
122
|
+
interact?: readonly string[];
|
|
123
|
+
}
|
|
124
|
+
/** Runtime handle that watches authored triggers against moving actors each tick. */
|
|
125
|
+
export interface AuthoredTriggerRuntime {
|
|
126
|
+
/** Advance membership one tick; returns every edge fired and invokes handlers. */
|
|
127
|
+
step(input: {
|
|
128
|
+
actors: readonly {
|
|
129
|
+
id: string;
|
|
130
|
+
position: readonly [number, number, number] | {
|
|
131
|
+
x: number;
|
|
132
|
+
y: number;
|
|
133
|
+
z: number;
|
|
134
|
+
};
|
|
135
|
+
}[];
|
|
136
|
+
/** Actor ids that pressed interact this frame — fires `on: "interact"` sources in range. */
|
|
137
|
+
interact?: readonly string[];
|
|
138
|
+
}): readonly TriggerDispatchEvent[];
|
|
139
|
+
/** Drop membership so the next step re-fires enters for still-inside actors. */
|
|
140
|
+
reset(): void;
|
|
141
|
+
/** Snapshot of the triggers this runtime was built from. */
|
|
142
|
+
triggers(): readonly AuthoredTrigger[];
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Build a runtime that watches a document's authored triggers against moving actors and dispatches
|
|
146
|
+
* to per-action handlers (and optional catch-all). Pure membership math; the game supplies actors
|
|
147
|
+
* each tick from its own player/entity poses.
|
|
148
|
+
*
|
|
149
|
+
* @capability authored-triggers schema'd on/action vocabulary on volumes and markers with runtime dispatch
|
|
150
|
+
*/
|
|
151
|
+
export declare function createAuthoredTriggerRuntime(options: {
|
|
152
|
+
document: SceneDocumentLike;
|
|
153
|
+
handlers?: TriggerHandlers;
|
|
154
|
+
/** Invoked for every dispatch after the matching handler (if any). */
|
|
155
|
+
onDispatch?: (event: TriggerDispatchEvent) => void;
|
|
156
|
+
/** Override the collected trigger list (tests / hot-reload). Default: {@link collectAuthoredTriggers}. */
|
|
157
|
+
triggers?: readonly AuthoredTrigger[];
|
|
158
|
+
}): AuthoredTriggerRuntime;
|
|
159
|
+
/**
|
|
160
|
+
* Build a meta patch that sets a single flat trigger (`on` + `action` + optional param fields) and
|
|
161
|
+
* clears a multi-trigger list if present. Used by the editor inspector.
|
|
162
|
+
* @internal
|
|
163
|
+
*/
|
|
164
|
+
export declare function triggerMetaPatch(on: TriggerEvent | "", action: string, params?: Record<string, unknown>): Record<string, unknown>;
|
|
165
|
+
/** Read the single flat trigger (`on`/`action`) from meta for the inspector, ignoring non-empty multi-lists. @internal */
|
|
166
|
+
export declare function readFlatTrigger(meta: Record<string, unknown> | undefined): {
|
|
167
|
+
on: TriggerEvent | "";
|
|
168
|
+
action: string;
|
|
169
|
+
};
|