@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,220 @@
|
|
|
1
|
+
import { isHudAnchor } from "./hudLayout.js";
|
|
2
|
+
const panelTypes = new Map();
|
|
3
|
+
/** Register a HUD panel type so the editor can list/add/configure it and canvas resize knows axes. */
|
|
4
|
+
export function registerHudPanelType(def) {
|
|
5
|
+
panelTypes.set(def.id, def);
|
|
6
|
+
}
|
|
7
|
+
/** @internal Look up a registered panel type by id. */
|
|
8
|
+
export function getHudPanelType(id) {
|
|
9
|
+
return panelTypes.get(id);
|
|
10
|
+
}
|
|
11
|
+
/** Every registered panel type, sorted by id — editor palette / agent listing. */
|
|
12
|
+
export function listHudPanelTypes() {
|
|
13
|
+
return [...panelTypes.values()].sort((a, b) => a.id.localeCompare(b.id));
|
|
14
|
+
}
|
|
15
|
+
/** @internal Test seam — clear the registry between tests. */
|
|
16
|
+
export function clearHudPanelTypes() {
|
|
17
|
+
panelTypes.clear();
|
|
18
|
+
}
|
|
19
|
+
/** @internal Convert a document panel layout into a runtime placement. */
|
|
20
|
+
export function placementFromUiPanel(panel) {
|
|
21
|
+
return { anchor: panel.anchor, dx: panel.dx, dy: panel.dy };
|
|
22
|
+
}
|
|
23
|
+
/** @internal Build a document panel layout from a runtime placement plus optional size/visibility. */
|
|
24
|
+
export function uiPanelFromPlacement(placement, options) {
|
|
25
|
+
const panel = {
|
|
26
|
+
anchor: placement.anchor,
|
|
27
|
+
dx: placement.dx,
|
|
28
|
+
dy: placement.dy,
|
|
29
|
+
};
|
|
30
|
+
if (options?.width !== undefined)
|
|
31
|
+
panel.width = options.width;
|
|
32
|
+
if (options?.height !== undefined)
|
|
33
|
+
panel.height = options.height;
|
|
34
|
+
if (options?.visible !== undefined)
|
|
35
|
+
panel.visible = options.visible;
|
|
36
|
+
if (options?.type !== undefined)
|
|
37
|
+
panel.type = options.type;
|
|
38
|
+
return panel;
|
|
39
|
+
}
|
|
40
|
+
function fallbackPlacement(fallback) {
|
|
41
|
+
const inset = fallback.inset ?? { x: 16, y: 16 };
|
|
42
|
+
const { anchor } = fallback;
|
|
43
|
+
const edgeX = anchor.endsWith("right") || anchor === "right";
|
|
44
|
+
const edgeY = anchor.startsWith("bottom") || anchor === "bottom";
|
|
45
|
+
return {
|
|
46
|
+
anchor,
|
|
47
|
+
dx: edgeX ? -inset.x : inset.x,
|
|
48
|
+
dy: edgeY ? -inset.y : inset.y,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Resolve a panel's layout: document entry wins field-by-field over TSX fallback.
|
|
53
|
+
* TSX props are fallback-only — the scene document is the source of truth once authored.
|
|
54
|
+
*/
|
|
55
|
+
export function resolveHudPanelLayout(docPanel, fallback) {
|
|
56
|
+
if (docPanel === undefined) {
|
|
57
|
+
return {
|
|
58
|
+
placement: fallbackPlacement(fallback),
|
|
59
|
+
width: fallback.width,
|
|
60
|
+
height: fallback.height,
|
|
61
|
+
visible: fallback.visible !== false,
|
|
62
|
+
type: fallback.type,
|
|
63
|
+
fromDocument: false,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
placement: placementFromUiPanel(docPanel),
|
|
68
|
+
width: docPanel.width ?? fallback.width,
|
|
69
|
+
height: docPanel.height ?? fallback.height,
|
|
70
|
+
visible: docPanel.visible ?? fallback.visible !== false,
|
|
71
|
+
type: docPanel.type ?? fallback.type,
|
|
72
|
+
fromDocument: true,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/** @internal Read a panel layout from a document ui section, or undefined when absent. */
|
|
76
|
+
export function findUiPanel(ui, id) {
|
|
77
|
+
return ui?.panels[id];
|
|
78
|
+
}
|
|
79
|
+
/** @internal Immutable patch of one panel into a ui section (creates the section when missing). */
|
|
80
|
+
export function patchUiPanel(ui, id, patch) {
|
|
81
|
+
const existing = ui?.panels[id];
|
|
82
|
+
const base = existing !== undefined
|
|
83
|
+
? { ...existing }
|
|
84
|
+
: {
|
|
85
|
+
anchor: isHudAnchor(patch.anchor) ? patch.anchor : "top-left",
|
|
86
|
+
dx: typeof patch.dx === "number" ? patch.dx : 0,
|
|
87
|
+
dy: typeof patch.dy === "number" ? patch.dy : 0,
|
|
88
|
+
};
|
|
89
|
+
const next = { ...base };
|
|
90
|
+
if (patch.anchor !== undefined && isHudAnchor(patch.anchor))
|
|
91
|
+
next.anchor = patch.anchor;
|
|
92
|
+
if (typeof patch.dx === "number" && Number.isFinite(patch.dx))
|
|
93
|
+
next.dx = patch.dx;
|
|
94
|
+
if (typeof patch.dy === "number" && Number.isFinite(patch.dy))
|
|
95
|
+
next.dy = patch.dy;
|
|
96
|
+
if (typeof patch.width === "number" && Number.isFinite(patch.width))
|
|
97
|
+
next.width = patch.width;
|
|
98
|
+
if (typeof patch.height === "number" && Number.isFinite(patch.height))
|
|
99
|
+
next.height = patch.height;
|
|
100
|
+
if (typeof patch.visible === "boolean")
|
|
101
|
+
next.visible = patch.visible;
|
|
102
|
+
if (typeof patch.type === "string")
|
|
103
|
+
next.type = patch.type;
|
|
104
|
+
return {
|
|
105
|
+
panels: {
|
|
106
|
+
...(ui?.panels ?? {}),
|
|
107
|
+
[id]: next,
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
/** @internal Remove a panel entry from the ui section; returns undefined when the section empties. */
|
|
112
|
+
export function removeUiPanel(ui, id) {
|
|
113
|
+
if (ui === undefined || ui.panels[id] === undefined)
|
|
114
|
+
return ui;
|
|
115
|
+
const panels = { ...ui.panels };
|
|
116
|
+
delete panels[id];
|
|
117
|
+
return Object.keys(panels).length === 0 ? undefined : { panels };
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Semantic resize: apply pixel deltas only on growable axes, clamped to min/max.
|
|
121
|
+
* Never scales content — callers reflow layout size (track length, list rows).
|
|
122
|
+
*/
|
|
123
|
+
export function resizePanelSize(current, delta, axes, limits) {
|
|
124
|
+
if (axes === "none")
|
|
125
|
+
return { ...current };
|
|
126
|
+
let width = current.width;
|
|
127
|
+
let height = current.height;
|
|
128
|
+
if (axes === "x" || axes === "both")
|
|
129
|
+
width = current.width + delta.dw;
|
|
130
|
+
if (axes === "y" || axes === "both")
|
|
131
|
+
height = current.height + delta.dh;
|
|
132
|
+
const minW = limits?.minWidth ?? 1;
|
|
133
|
+
const minH = limits?.minHeight ?? 1;
|
|
134
|
+
const maxW = limits?.maxWidth ?? Number.POSITIVE_INFINITY;
|
|
135
|
+
const maxH = limits?.maxHeight ?? Number.POSITIVE_INFINITY;
|
|
136
|
+
return {
|
|
137
|
+
width: Math.max(minW, Math.min(maxW, Math.round(width))),
|
|
138
|
+
height: Math.max(minH, Math.min(maxH, Math.round(height))),
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
/** @internal Resolve resize axes + limits for a panel type id (defaults to none when unregistered). */
|
|
142
|
+
export function resolvePanelResize(typeId) {
|
|
143
|
+
if (typeId === undefined)
|
|
144
|
+
return { axes: "none" };
|
|
145
|
+
const def = panelTypes.get(typeId);
|
|
146
|
+
if (def === undefined)
|
|
147
|
+
return { axes: "none" };
|
|
148
|
+
return {
|
|
149
|
+
axes: def.resize,
|
|
150
|
+
minWidth: def.minWidth,
|
|
151
|
+
maxWidth: def.maxWidth,
|
|
152
|
+
minHeight: def.minHeight,
|
|
153
|
+
maxHeight: def.maxHeight,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
function isFiniteNumber(value) {
|
|
157
|
+
return typeof value === "number" && Number.isFinite(value);
|
|
158
|
+
}
|
|
159
|
+
/** @internal Decode a single panel layout from untrusted JSON; null when invalid. */
|
|
160
|
+
export function decodeUiPanelLayout(raw) {
|
|
161
|
+
if (typeof raw !== "object" || raw === null || Array.isArray(raw))
|
|
162
|
+
return null;
|
|
163
|
+
const value = raw;
|
|
164
|
+
if (!isHudAnchor(value.anchor))
|
|
165
|
+
return null;
|
|
166
|
+
if (!isFiniteNumber(value.dx) || !isFiniteNumber(value.dy))
|
|
167
|
+
return null;
|
|
168
|
+
const panel = {
|
|
169
|
+
anchor: value.anchor,
|
|
170
|
+
dx: value.dx,
|
|
171
|
+
dy: value.dy,
|
|
172
|
+
};
|
|
173
|
+
if (isFiniteNumber(value.width))
|
|
174
|
+
panel.width = value.width;
|
|
175
|
+
if (isFiniteNumber(value.height))
|
|
176
|
+
panel.height = value.height;
|
|
177
|
+
if (typeof value.visible === "boolean")
|
|
178
|
+
panel.visible = value.visible;
|
|
179
|
+
if (typeof value.type === "string" && value.type.length > 0)
|
|
180
|
+
panel.type = value.type;
|
|
181
|
+
return panel;
|
|
182
|
+
}
|
|
183
|
+
/** @internal Decode a ui section from untrusted JSON; undefined when absent, empty object when empty panels. */
|
|
184
|
+
export function decodeEditorUiDocument(raw) {
|
|
185
|
+
if (raw === undefined || raw === null)
|
|
186
|
+
return undefined;
|
|
187
|
+
if (typeof raw !== "object" || Array.isArray(raw))
|
|
188
|
+
return undefined;
|
|
189
|
+
const panelsRaw = raw.panels;
|
|
190
|
+
if (typeof panelsRaw !== "object" || panelsRaw === null || Array.isArray(panelsRaw)) {
|
|
191
|
+
return { panels: {} };
|
|
192
|
+
}
|
|
193
|
+
const panels = {};
|
|
194
|
+
for (const [id, entry] of Object.entries(panelsRaw)) {
|
|
195
|
+
if (id.length === 0)
|
|
196
|
+
continue;
|
|
197
|
+
const decoded = decodeUiPanelLayout(entry);
|
|
198
|
+
if (decoded !== null)
|
|
199
|
+
panels[id] = decoded;
|
|
200
|
+
}
|
|
201
|
+
return { panels };
|
|
202
|
+
}
|
|
203
|
+
/** @internal Deep-clone a ui section for document history snapshots. */
|
|
204
|
+
export function cloneEditorUiDocument(ui) {
|
|
205
|
+
if (ui === undefined)
|
|
206
|
+
return undefined;
|
|
207
|
+
const panels = {};
|
|
208
|
+
for (const [id, panel] of Object.entries(ui.panels)) {
|
|
209
|
+
panels[id] = { ...panel };
|
|
210
|
+
}
|
|
211
|
+
return { panels };
|
|
212
|
+
}
|
|
213
|
+
/** @internal Convert a layout store-style placement map into a document ui section. */
|
|
214
|
+
export function uiDocumentFromPlacements(panels) {
|
|
215
|
+
const out = {};
|
|
216
|
+
for (const [id, panel] of Object.entries(panels)) {
|
|
217
|
+
out[id] = { ...panel };
|
|
218
|
+
}
|
|
219
|
+
return { panels: out };
|
|
220
|
+
}
|
package/dist/ui/hudLayout.d.ts
CHANGED
|
@@ -19,6 +19,10 @@ export interface HudPanelState {
|
|
|
19
19
|
placement: HudPlacement;
|
|
20
20
|
z: number;
|
|
21
21
|
moved: boolean;
|
|
22
|
+
width?: number;
|
|
23
|
+
height?: number;
|
|
24
|
+
visible: boolean;
|
|
25
|
+
type?: string;
|
|
22
26
|
}
|
|
23
27
|
export interface HudLayoutState {
|
|
24
28
|
panels: Record<string, HudPanelState>;
|
|
@@ -28,31 +32,59 @@ export interface HudLayoutState {
|
|
|
28
32
|
export interface HudLayoutOptions {
|
|
29
33
|
snap?: number;
|
|
30
34
|
locked?: boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Called after a panel placement/size is authored (move, resize, hydrate from document).
|
|
37
|
+
* Canvas mode + agent RPCs use this to write undoable scene-document patches.
|
|
38
|
+
*/
|
|
39
|
+
onDocumentPatch?: (id: string, panel: import("./hudDocument.js").EditorUiPanelLayout) => void;
|
|
31
40
|
}
|
|
41
|
+
/** @internal */
|
|
32
42
|
export declare function isPanelDraggable(state: HudLayoutState, id: string): boolean;
|
|
33
43
|
export interface HudLayoutStore {
|
|
34
44
|
getState(): HudLayoutState;
|
|
35
45
|
subscribe(listener: (state: HudLayoutState) => void): () => void;
|
|
36
|
-
register(id: string, placement: HudPlacement
|
|
46
|
+
register(id: string, placement: HudPlacement, options?: {
|
|
47
|
+
width?: number;
|
|
48
|
+
height?: number;
|
|
49
|
+
visible?: boolean;
|
|
50
|
+
type?: string;
|
|
51
|
+
}): void;
|
|
37
52
|
move(id: string, rect: HudRect, viewport: HudSize): void;
|
|
53
|
+
resize(id: string, size: HudSize): void;
|
|
54
|
+
setVisible(id: string, visible: boolean): void;
|
|
38
55
|
bringToFront(id: string): void;
|
|
39
56
|
setLocked(locked: boolean): void;
|
|
40
57
|
setEditing(editing: boolean): void;
|
|
41
58
|
reset(id?: string): void;
|
|
42
59
|
serialize(): string;
|
|
43
60
|
hydrate(raw: string | null | undefined): void;
|
|
61
|
+
/** Apply scene-document `ui` section as the source of truth for registered/pending panels. */
|
|
62
|
+
applyDocumentUi(ui: import("./hudDocument.js").EditorUiDocument | undefined): void;
|
|
63
|
+
/** Snapshot moved/resized panels as a document ui section. */
|
|
64
|
+
toDocumentUi(): import("./hudDocument.js").EditorUiDocument;
|
|
44
65
|
}
|
|
45
66
|
export declare const HUD_ANCHOR_FRACTIONS: Record<HudAnchor, {
|
|
46
67
|
fx: number;
|
|
47
68
|
fy: number;
|
|
48
69
|
}>;
|
|
70
|
+
/** @internal */
|
|
49
71
|
export declare function isHudAnchor(value: unknown): value is HudAnchor;
|
|
72
|
+
/** @internal */
|
|
50
73
|
export declare function anchoredPlacement(anchor: HudAnchor, inset: {
|
|
51
74
|
x: number;
|
|
52
75
|
y: number;
|
|
53
76
|
}): HudPlacement;
|
|
77
|
+
/** @internal */
|
|
54
78
|
export declare function nearestAnchor(rect: HudRect, viewport: HudSize): HudAnchor;
|
|
79
|
+
/** @internal */
|
|
55
80
|
export declare function clampRect(rect: HudRect, viewport: HudSize): HudRect;
|
|
81
|
+
/** @internal */
|
|
56
82
|
export declare function placementFromRect(rect: HudRect, viewport: HudSize, snap?: number): HudPlacement;
|
|
83
|
+
/** @internal */
|
|
57
84
|
export declare function rectFromPlacement(placement: HudPlacement, size: HudSize, viewport: HudSize): HudRect;
|
|
85
|
+
/** @internal Agent bridge seam — HudCanvas registers its store while mounted so headless drivers can reach canvas mode. */
|
|
86
|
+
export declare function registerActiveHudLayout(store: HudLayoutStore): () => void;
|
|
87
|
+
/** @internal */
|
|
88
|
+
export declare function listActiveHudLayouts(): HudLayoutStore[];
|
|
89
|
+
/** @internal */
|
|
58
90
|
export declare function createHudLayout(options?: HudLayoutOptions): HudLayoutStore;
|
package/dist/ui/hudLayout.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/** @internal */
|
|
1
2
|
export function isPanelDraggable(state, id) {
|
|
2
3
|
return state.panels[id] !== undefined && (state.editing || !state.locked);
|
|
3
4
|
}
|
|
@@ -13,9 +14,11 @@ export const HUD_ANCHOR_FRACTIONS = {
|
|
|
13
14
|
"bottom-right": { fx: 1, fy: 1 },
|
|
14
15
|
};
|
|
15
16
|
const HUD_ANCHORS = Object.keys(HUD_ANCHOR_FRACTIONS);
|
|
17
|
+
/** @internal */
|
|
16
18
|
export function isHudAnchor(value) {
|
|
17
19
|
return typeof value === "string" && value in HUD_ANCHOR_FRACTIONS;
|
|
18
20
|
}
|
|
21
|
+
/** @internal */
|
|
19
22
|
export function anchoredPlacement(anchor, inset) {
|
|
20
23
|
const { fx, fy } = HUD_ANCHOR_FRACTIONS[anchor];
|
|
21
24
|
return {
|
|
@@ -24,6 +27,7 @@ export function anchoredPlacement(anchor, inset) {
|
|
|
24
27
|
dy: fy === 1 ? -inset.y : inset.y,
|
|
25
28
|
};
|
|
26
29
|
}
|
|
30
|
+
/** @internal */
|
|
27
31
|
export function nearestAnchor(rect, viewport) {
|
|
28
32
|
const cx = viewport.width > 0 ? (rect.x + rect.width / 2) / viewport.width : 0.5;
|
|
29
33
|
const cy = viewport.height > 0 ? (rect.y + rect.height / 2) / viewport.height : 0.5;
|
|
@@ -39,6 +43,7 @@ export function nearestAnchor(rect, viewport) {
|
|
|
39
43
|
}
|
|
40
44
|
return best;
|
|
41
45
|
}
|
|
46
|
+
/** @internal */
|
|
42
47
|
export function clampRect(rect, viewport) {
|
|
43
48
|
return {
|
|
44
49
|
x: Math.max(0, Math.min(rect.x, viewport.width - rect.width)),
|
|
@@ -47,6 +52,7 @@ export function clampRect(rect, viewport) {
|
|
|
47
52
|
height: rect.height,
|
|
48
53
|
};
|
|
49
54
|
}
|
|
55
|
+
/** @internal */
|
|
50
56
|
export function placementFromRect(rect, viewport, snap = 1) {
|
|
51
57
|
const clamped = clampRect(rect, viewport);
|
|
52
58
|
const anchor = nearestAnchor(clamped, viewport);
|
|
@@ -60,6 +66,7 @@ export function placementFromRect(rect, viewport, snap = 1) {
|
|
|
60
66
|
dy: Math.round(dy / step) * step,
|
|
61
67
|
};
|
|
62
68
|
}
|
|
69
|
+
/** @internal */
|
|
63
70
|
export function rectFromPlacement(placement, size, viewport) {
|
|
64
71
|
const { fx, fy } = HUD_ANCHOR_FRACTIONS[placement.anchor];
|
|
65
72
|
return {
|
|
@@ -86,19 +93,77 @@ function parseSerialized(raw) {
|
|
|
86
93
|
for (const [id, value] of Object.entries(panels)) {
|
|
87
94
|
if (typeof value !== "object" || value === null)
|
|
88
95
|
continue;
|
|
89
|
-
const
|
|
96
|
+
const record = value;
|
|
97
|
+
const placementSource = record.placement ?? record;
|
|
98
|
+
const { anchor, dx, dy } = placementSource;
|
|
90
99
|
if (!isHudAnchor(anchor))
|
|
91
100
|
continue;
|
|
92
101
|
if (typeof dx !== "number" || !Number.isFinite(dx))
|
|
93
102
|
continue;
|
|
94
103
|
if (typeof dy !== "number" || !Number.isFinite(dy))
|
|
95
104
|
continue;
|
|
96
|
-
|
|
105
|
+
const override = { placement: { anchor, dx, dy } };
|
|
106
|
+
if (typeof record.width === "number" && Number.isFinite(record.width))
|
|
107
|
+
override.width = record.width;
|
|
108
|
+
if (typeof record.height === "number" && Number.isFinite(record.height))
|
|
109
|
+
override.height = record.height;
|
|
110
|
+
if (typeof record.visible === "boolean")
|
|
111
|
+
override.visible = record.visible;
|
|
112
|
+
if (typeof record.type === "string")
|
|
113
|
+
override.type = record.type;
|
|
114
|
+
out.set(id, override);
|
|
97
115
|
}
|
|
98
116
|
return out;
|
|
99
117
|
}
|
|
118
|
+
const activeHudLayouts = new Set();
|
|
119
|
+
/** @internal Agent bridge seam — HudCanvas registers its store while mounted so headless drivers can reach canvas mode. */
|
|
120
|
+
export function registerActiveHudLayout(store) {
|
|
121
|
+
activeHudLayouts.add(store);
|
|
122
|
+
return () => {
|
|
123
|
+
activeHudLayouts.delete(store);
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
/** @internal */
|
|
127
|
+
export function listActiveHudLayouts() {
|
|
128
|
+
return [...activeHudLayouts];
|
|
129
|
+
}
|
|
130
|
+
function panelToUi(panel) {
|
|
131
|
+
const layout = {
|
|
132
|
+
anchor: panel.placement.anchor,
|
|
133
|
+
dx: panel.placement.dx,
|
|
134
|
+
dy: panel.placement.dy,
|
|
135
|
+
};
|
|
136
|
+
if (panel.width !== undefined)
|
|
137
|
+
layout.width = panel.width;
|
|
138
|
+
if (panel.height !== undefined)
|
|
139
|
+
layout.height = panel.height;
|
|
140
|
+
if (panel.visible === false)
|
|
141
|
+
layout.visible = false;
|
|
142
|
+
if (panel.type !== undefined)
|
|
143
|
+
layout.type = panel.type;
|
|
144
|
+
return layout;
|
|
145
|
+
}
|
|
146
|
+
function overrideToUi(id, override) {
|
|
147
|
+
const layout = {
|
|
148
|
+
anchor: override.placement.anchor,
|
|
149
|
+
dx: override.placement.dx,
|
|
150
|
+
dy: override.placement.dy,
|
|
151
|
+
};
|
|
152
|
+
if (override.width !== undefined)
|
|
153
|
+
layout.width = override.width;
|
|
154
|
+
if (override.height !== undefined)
|
|
155
|
+
layout.height = override.height;
|
|
156
|
+
if (override.visible !== undefined)
|
|
157
|
+
layout.visible = override.visible;
|
|
158
|
+
if (override.type !== undefined)
|
|
159
|
+
layout.type = override.type;
|
|
160
|
+
void id;
|
|
161
|
+
return layout;
|
|
162
|
+
}
|
|
163
|
+
/** @internal */
|
|
100
164
|
export function createHudLayout(options) {
|
|
101
165
|
const snap = options?.snap ?? 1;
|
|
166
|
+
const onDocumentPatch = options?.onDocumentPatch;
|
|
102
167
|
const defaults = new Map();
|
|
103
168
|
const pending = new Map();
|
|
104
169
|
let topZ = 0;
|
|
@@ -111,22 +176,37 @@ export function createHudLayout(options) {
|
|
|
111
176
|
const setPanel = (panel) => {
|
|
112
177
|
state = { ...state, panels: { ...state.panels, [panel.id]: panel } };
|
|
113
178
|
};
|
|
179
|
+
const notifyDocument = (panel) => {
|
|
180
|
+
onDocumentPatch?.(panel.id, panelToUi(panel));
|
|
181
|
+
};
|
|
114
182
|
return {
|
|
115
183
|
getState: () => state,
|
|
116
184
|
subscribe(listener) {
|
|
117
185
|
listeners.add(listener);
|
|
118
186
|
return () => listeners.delete(listener);
|
|
119
187
|
},
|
|
120
|
-
register(id, placement) {
|
|
121
|
-
|
|
188
|
+
register(id, placement, registerOptions) {
|
|
189
|
+
const fallback = {
|
|
190
|
+
placement,
|
|
191
|
+
width: registerOptions?.width,
|
|
192
|
+
height: registerOptions?.height,
|
|
193
|
+
visible: registerOptions?.visible,
|
|
194
|
+
type: registerOptions?.type,
|
|
195
|
+
};
|
|
196
|
+
defaults.set(id, fallback);
|
|
122
197
|
if (state.panels[id] !== undefined)
|
|
123
198
|
return;
|
|
124
199
|
const override = pending.get(id);
|
|
200
|
+
const source = override ?? fallback;
|
|
125
201
|
setPanel({
|
|
126
202
|
id,
|
|
127
|
-
placement:
|
|
203
|
+
placement: source.placement,
|
|
128
204
|
z: ++topZ,
|
|
129
205
|
moved: override !== undefined,
|
|
206
|
+
width: source.width ?? fallback.width,
|
|
207
|
+
height: source.height ?? fallback.height,
|
|
208
|
+
visible: source.visible ?? fallback.visible !== false,
|
|
209
|
+
type: source.type ?? fallback.type,
|
|
130
210
|
});
|
|
131
211
|
},
|
|
132
212
|
move(id, rect, viewport) {
|
|
@@ -134,8 +214,32 @@ export function createHudLayout(options) {
|
|
|
134
214
|
if (panel === undefined)
|
|
135
215
|
return;
|
|
136
216
|
const placement = placementFromRect(rect, viewport, snap);
|
|
137
|
-
|
|
217
|
+
const next = { ...panel, placement, moved: true };
|
|
218
|
+
setPanel(next);
|
|
138
219
|
emit();
|
|
220
|
+
notifyDocument(next);
|
|
221
|
+
},
|
|
222
|
+
resize(id, size) {
|
|
223
|
+
const panel = state.panels[id];
|
|
224
|
+
if (panel === undefined)
|
|
225
|
+
return;
|
|
226
|
+
const width = Math.max(1, Math.round(size.width));
|
|
227
|
+
const height = Math.max(1, Math.round(size.height));
|
|
228
|
+
if (panel.width === width && panel.height === height)
|
|
229
|
+
return;
|
|
230
|
+
const next = { ...panel, width, height, moved: true };
|
|
231
|
+
setPanel(next);
|
|
232
|
+
emit();
|
|
233
|
+
notifyDocument(next);
|
|
234
|
+
},
|
|
235
|
+
setVisible(id, visible) {
|
|
236
|
+
const panel = state.panels[id];
|
|
237
|
+
if (panel === undefined || panel.visible === visible)
|
|
238
|
+
return;
|
|
239
|
+
const next = { ...panel, visible, moved: true };
|
|
240
|
+
setPanel(next);
|
|
241
|
+
emit();
|
|
242
|
+
notifyDocument(next);
|
|
139
243
|
},
|
|
140
244
|
bringToFront(id) {
|
|
141
245
|
const panel = state.panels[id];
|
|
@@ -163,9 +267,23 @@ export function createHudLayout(options) {
|
|
|
163
267
|
pending.delete(panelId);
|
|
164
268
|
const panel = state.panels[panelId];
|
|
165
269
|
const fallback = defaults.get(panelId);
|
|
166
|
-
if (panel === undefined || fallback === undefined
|
|
270
|
+
if (panel === undefined || fallback === undefined)
|
|
271
|
+
continue;
|
|
272
|
+
const hasAuthored = panel.moved ||
|
|
273
|
+
panel.width !== fallback.width ||
|
|
274
|
+
panel.height !== fallback.height ||
|
|
275
|
+
panel.visible !== (fallback.visible !== false);
|
|
276
|
+
if (!hasAuthored)
|
|
167
277
|
continue;
|
|
168
|
-
setPanel({
|
|
278
|
+
setPanel({
|
|
279
|
+
...panel,
|
|
280
|
+
placement: fallback.placement,
|
|
281
|
+
width: fallback.width,
|
|
282
|
+
height: fallback.height,
|
|
283
|
+
visible: fallback.visible !== false,
|
|
284
|
+
type: fallback.type,
|
|
285
|
+
moved: false,
|
|
286
|
+
});
|
|
169
287
|
changed = true;
|
|
170
288
|
}
|
|
171
289
|
if (changed)
|
|
@@ -174,14 +292,32 @@ export function createHudLayout(options) {
|
|
|
174
292
|
serialize() {
|
|
175
293
|
const panels = {};
|
|
176
294
|
for (const panel of Object.values(state.panels)) {
|
|
177
|
-
if (panel.moved)
|
|
178
|
-
|
|
295
|
+
if (!panel.moved)
|
|
296
|
+
continue;
|
|
297
|
+
panels[panel.id] = {
|
|
298
|
+
anchor: panel.placement.anchor,
|
|
299
|
+
dx: panel.placement.dx,
|
|
300
|
+
dy: panel.placement.dy,
|
|
301
|
+
...(panel.width === undefined ? {} : { width: panel.width }),
|
|
302
|
+
...(panel.height === undefined ? {} : { height: panel.height }),
|
|
303
|
+
...(panel.visible === false ? { visible: false } : {}),
|
|
304
|
+
...(panel.type === undefined ? {} : { type: panel.type }),
|
|
305
|
+
};
|
|
179
306
|
}
|
|
180
|
-
for (const [id,
|
|
181
|
-
if (state.panels[id]
|
|
182
|
-
|
|
307
|
+
for (const [id, override] of pending) {
|
|
308
|
+
if (state.panels[id] !== undefined)
|
|
309
|
+
continue;
|
|
310
|
+
panels[id] = {
|
|
311
|
+
anchor: override.placement.anchor,
|
|
312
|
+
dx: override.placement.dx,
|
|
313
|
+
dy: override.placement.dy,
|
|
314
|
+
...(override.width === undefined ? {} : { width: override.width }),
|
|
315
|
+
...(override.height === undefined ? {} : { height: override.height }),
|
|
316
|
+
...(override.visible === undefined ? {} : { visible: override.visible }),
|
|
317
|
+
...(override.type === undefined ? {} : { type: override.type }),
|
|
318
|
+
};
|
|
183
319
|
}
|
|
184
|
-
const data = { v:
|
|
320
|
+
const data = { v: 2, panels };
|
|
185
321
|
return JSON.stringify(data);
|
|
186
322
|
},
|
|
187
323
|
hydrate(raw) {
|
|
@@ -191,17 +327,68 @@ export function createHudLayout(options) {
|
|
|
191
327
|
if (parsed.size === 0)
|
|
192
328
|
return;
|
|
193
329
|
let changed = false;
|
|
194
|
-
for (const [id,
|
|
330
|
+
for (const [id, override] of parsed) {
|
|
331
|
+
const panel = state.panels[id];
|
|
332
|
+
if (panel === undefined) {
|
|
333
|
+
pending.set(id, override);
|
|
334
|
+
continue;
|
|
335
|
+
}
|
|
336
|
+
setPanel({
|
|
337
|
+
...panel,
|
|
338
|
+
placement: override.placement,
|
|
339
|
+
width: override.width ?? panel.width,
|
|
340
|
+
height: override.height ?? panel.height,
|
|
341
|
+
visible: override.visible ?? panel.visible,
|
|
342
|
+
type: override.type ?? panel.type,
|
|
343
|
+
moved: true,
|
|
344
|
+
});
|
|
345
|
+
changed = true;
|
|
346
|
+
}
|
|
347
|
+
if (changed)
|
|
348
|
+
emit();
|
|
349
|
+
},
|
|
350
|
+
applyDocumentUi(ui) {
|
|
351
|
+
if (ui === undefined)
|
|
352
|
+
return;
|
|
353
|
+
let changed = false;
|
|
354
|
+
for (const [id, layout] of Object.entries(ui.panels)) {
|
|
355
|
+
const override = {
|
|
356
|
+
placement: { anchor: layout.anchor, dx: layout.dx, dy: layout.dy },
|
|
357
|
+
width: layout.width,
|
|
358
|
+
height: layout.height,
|
|
359
|
+
visible: layout.visible,
|
|
360
|
+
type: layout.type,
|
|
361
|
+
};
|
|
195
362
|
const panel = state.panels[id];
|
|
196
363
|
if (panel === undefined) {
|
|
197
|
-
pending.set(id,
|
|
364
|
+
pending.set(id, override);
|
|
198
365
|
continue;
|
|
199
366
|
}
|
|
200
|
-
setPanel({
|
|
367
|
+
setPanel({
|
|
368
|
+
...panel,
|
|
369
|
+
placement: override.placement,
|
|
370
|
+
width: override.width ?? panel.width,
|
|
371
|
+
height: override.height ?? panel.height,
|
|
372
|
+
visible: override.visible ?? panel.visible,
|
|
373
|
+
type: override.type ?? panel.type,
|
|
374
|
+
moved: true,
|
|
375
|
+
});
|
|
201
376
|
changed = true;
|
|
202
377
|
}
|
|
203
378
|
if (changed)
|
|
204
379
|
emit();
|
|
205
380
|
},
|
|
381
|
+
toDocumentUi() {
|
|
382
|
+
const panels = {};
|
|
383
|
+
for (const panel of Object.values(state.panels)) {
|
|
384
|
+
if (panel.moved)
|
|
385
|
+
panels[panel.id] = panelToUi(panel);
|
|
386
|
+
}
|
|
387
|
+
for (const [id, override] of pending) {
|
|
388
|
+
if (state.panels[id] === undefined)
|
|
389
|
+
panels[id] = overrideToUi(id, override);
|
|
390
|
+
}
|
|
391
|
+
return { panels };
|
|
392
|
+
},
|
|
206
393
|
};
|
|
207
394
|
}
|