@jgengine/core 0.9.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +34 -3
- package/LICENSE +203 -661
- package/README.md +1 -1
- package/dist/ai/crowd.d.ts +55 -0
- package/dist/ai/crowd.js +114 -0
- package/dist/ai/flock.d.ts +5 -2
- package/dist/ai/flock.js +5 -2
- package/dist/ai/groupAssist.d.ts +1 -0
- package/dist/ai/groupAssist.js +1 -0
- package/dist/ai/heatSystem.d.ts +76 -0
- package/dist/ai/heatSystem.js +97 -0
- package/dist/ai/interestScheduler.d.ts +107 -0
- package/dist/ai/interestScheduler.js +118 -0
- package/dist/ai/jobBoard.d.ts +1 -0
- package/dist/ai/jobBoard.js +1 -0
- package/dist/ai/laneSelect.d.ts +5 -2
- package/dist/ai/laneSelect.js +5 -2
- package/dist/ai/mobBrain.d.ts +1 -0
- package/dist/ai/mobBrain.js +1 -0
- package/dist/ai/spawnDirector.d.ts +19 -1
- package/dist/ai/spawnDirector.js +53 -26
- package/dist/ai/spawnPoint.d.ts +7 -0
- package/dist/ai/spawnPoint.js +7 -0
- package/dist/ai/targetAcquisition.d.ts +84 -0
- package/dist/ai/targetAcquisition.js +92 -0
- package/dist/anim/easing.d.ts +19 -0
- package/dist/anim/easing.js +19 -0
- package/dist/anim/oscillator.d.ts +12 -0
- package/dist/anim/oscillator.js +25 -0
- package/dist/area/areaEffectField.d.ts +127 -0
- package/dist/area/areaEffectField.js +175 -0
- package/dist/area/stackPolicy.d.ts +47 -0
- package/dist/area/stackPolicy.js +99 -0
- package/dist/audio/audioFalloff.d.ts +5 -2
- package/dist/audio/music.d.ts +53 -0
- package/dist/audio/music.js +34 -0
- package/dist/audio/synth.d.ts +60 -0
- package/dist/audio/synth.js +8 -0
- package/dist/authoring.d.ts +15 -0
- package/dist/authoring.js +15 -0
- package/dist/board/laneBoard.d.ts +13 -0
- package/dist/board/laneBoard.js +13 -0
- package/dist/board/timelineBoard.d.ts +10 -0
- package/dist/board/timelineBoard.js +10 -0
- package/dist/combat/abilityKit.d.ts +18 -0
- package/dist/combat/abilityKit.js +24 -9
- package/dist/combat/animationState.d.ts +5 -0
- package/dist/combat/animationState.js +5 -0
- package/dist/combat/breakMeters.d.ts +10 -0
- package/dist/combat/breakMeters.js +10 -0
- package/dist/combat/castRunner.d.ts +5 -0
- package/dist/combat/castRunner.js +5 -0
- package/dist/combat/comboPoints.d.ts +5 -0
- package/dist/combat/comboPoints.js +5 -0
- package/dist/combat/comboString.d.ts +5 -0
- package/dist/combat/comboString.js +5 -0
- package/dist/combat/damageInterceptors.d.ts +192 -0
- package/dist/combat/damageInterceptors.js +251 -0
- package/dist/combat/damageMatchup.d.ts +68 -0
- package/dist/combat/damageMatchup.js +42 -0
- package/dist/combat/damageResolution.d.ts +63 -0
- package/dist/combat/damageResolution.js +50 -0
- package/dist/combat/death.d.ts +7 -1
- package/dist/combat/death.js +5 -0
- package/dist/combat/deathReason.d.ts +14 -0
- package/dist/combat/deathReason.js +1 -0
- package/dist/combat/defensiveWindow.d.ts +5 -0
- package/dist/combat/defensiveWindow.js +5 -0
- package/dist/combat/dotField.d.ts +47 -0
- package/dist/combat/dotField.js +52 -0
- package/dist/combat/downed.d.ts +5 -0
- package/dist/combat/downed.js +5 -0
- package/dist/combat/effects.d.ts +5 -0
- package/dist/combat/effects.js +5 -0
- package/dist/combat/encounterSequence.d.ts +258 -0
- package/dist/combat/encounterSequence.js +426 -0
- package/dist/combat/hitReaction.d.ts +57 -1
- package/dist/combat/hitReaction.js +45 -5
- package/dist/combat/magazine.d.ts +54 -0
- package/dist/combat/magazine.js +96 -0
- package/dist/combat/projectiles.d.ts +7 -2
- package/dist/combat/projectiles.js +48 -17
- package/dist/combat/receivedDamage.d.ts +117 -0
- package/dist/combat/receivedDamage.js +92 -0
- package/dist/combat/regenShield.d.ts +39 -0
- package/dist/combat/regenShield.js +49 -0
- package/dist/combat/renderCues.d.ts +51 -0
- package/dist/combat/renderCues.js +44 -0
- package/dist/combat/resourcePool.d.ts +5 -0
- package/dist/combat/resourcePool.js +5 -0
- package/dist/combat/rewardAllocation.d.ts +121 -0
- package/dist/combat/rewardAllocation.js +251 -0
- package/dist/combat/shotOrigin.d.ts +30 -1
- package/dist/combat/shotOrigin.js +70 -2
- package/dist/combat/statusApplication.d.ts +96 -0
- package/dist/combat/statusApplication.js +81 -0
- package/dist/combat/telegraph.d.ts +11 -2
- package/dist/combat/telegraph.js +11 -2
- package/dist/combat/thresholdCrossings.d.ts +85 -0
- package/dist/combat/thresholdCrossings.js +116 -0
- package/dist/combat.d.ts +34 -0
- package/dist/combat.js +34 -0
- package/dist/commands/commandRegistry.d.ts +11 -0
- package/dist/commands/commandRegistry.js +9 -2
- package/dist/crafting/crop.d.ts +18 -0
- package/dist/crafting/crop.js +18 -0
- package/dist/crafting/production.d.ts +5 -0
- package/dist/crafting/production.js +5 -0
- package/dist/devtools/rewriteTunables.d.ts +17 -0
- package/dist/devtools/rewriteTunables.js +276 -0
- package/dist/devtools/saveEndpoint.d.ts +46 -0
- package/dist/devtools/saveEndpoint.js +48 -0
- package/dist/devtools/transformTunables.d.ts +3 -0
- package/dist/devtools/transformTunables.js +3 -0
- package/dist/devtools/tunableSchema.d.ts +31 -0
- package/dist/devtools/tunableSchema.js +31 -0
- package/dist/economy/currency.d.ts +12 -1
- package/dist/economy/currency.js +12 -1
- package/dist/economy/listingBook.d.ts +91 -0
- package/dist/economy/listingBook.js +144 -0
- package/dist/economy/resourceLedger.d.ts +222 -0
- package/dist/economy/resourceLedger.js +353 -0
- package/dist/economy/sharedWallet.d.ts +14 -0
- package/dist/economy/sharedWallet.js +14 -0
- package/dist/economy/techTree.d.ts +12 -0
- package/dist/economy/techTree.js +12 -0
- package/dist/economy/wallet.d.ts +26 -2
- package/dist/economy/wallet.js +35 -6
- package/dist/editor/commands.d.ts +248 -0
- package/dist/editor/commands.js +865 -0
- package/dist/editor/document.d.ts +186 -0
- package/dist/editor/document.js +884 -0
- package/dist/editor/grid.d.ts +229 -0
- package/dist/editor/grid.js +366 -0
- package/dist/editor/gridAdapters.d.ts +80 -0
- package/dist/editor/gridAdapters.js +134 -0
- package/dist/editor/index.d.ts +97 -0
- package/dist/editor/index.js +10 -0
- package/dist/editor/liveSync.d.ts +127 -0
- package/dist/editor/liveSync.js +249 -0
- package/dist/editor/runtimeInspector.d.ts +88 -0
- package/dist/editor/runtimeInspector.js +239 -0
- package/dist/editor/types.d.ts +175 -0
- package/dist/editor/types.js +29 -0
- package/dist/faction/reputation.d.ts +5 -0
- package/dist/faction/reputation.js +5 -0
- package/dist/format/distance.d.ts +17 -0
- package/dist/format/distance.js +18 -0
- package/dist/format/duration.d.ts +27 -0
- package/dist/format/duration.js +45 -0
- package/dist/format/speed.d.ts +17 -0
- package/dist/format/speed.js +25 -0
- package/dist/game/connectedPlayers.d.ts +30 -0
- package/dist/game/connectedPlayers.js +21 -0
- package/dist/game/cosmetics.d.ts +9 -0
- package/dist/game/cosmetics.js +16 -0
- package/dist/game/defineGame.d.ts +141 -2
- package/dist/game/defineGame.js +39 -1
- package/dist/game/defineSystem.d.ts +88 -0
- package/dist/game/defineSystem.js +45 -0
- package/dist/game/dialogue.d.ts +33 -0
- package/dist/game/dialogue.js +21 -0
- package/dist/game/events.d.ts +50 -13
- package/dist/game/events.js +5 -0
- package/dist/game/feed.d.ts +33 -0
- package/dist/game/feed.js +35 -2
- package/dist/game/gamePhase.d.ts +11 -0
- package/dist/game/gamePhase.js +16 -0
- package/dist/game/keyValueStore.d.ts +25 -0
- package/dist/game/keyValueStore.js +61 -0
- package/dist/game/leaderboard.d.ts +5 -0
- package/dist/game/leaderboard.js +5 -0
- package/dist/game/levelSequence.d.ts +24 -2
- package/dist/game/levelSequence.js +51 -2
- package/dist/game/loadout.d.ts +5 -0
- package/dist/game/loadout.js +5 -0
- package/dist/game/lootFilter.d.ts +2 -0
- package/dist/game/lootFilter.js +2 -0
- package/dist/game/lootPipeline.d.ts +164 -0
- package/dist/game/lootPipeline.js +216 -0
- package/dist/game/lootTable.d.ts +21 -0
- package/dist/game/lootTable.js +15 -4
- package/dist/game/modelAnimation.d.ts +8 -0
- package/dist/game/modelAnimation.js +18 -0
- package/dist/game/objectives.d.ts +43 -0
- package/dist/game/objectives.js +36 -0
- package/dist/game/paramLayers.d.ts +148 -0
- package/dist/game/paramLayers.js +185 -0
- package/dist/game/ping.d.ts +5 -0
- package/dist/game/ping.js +5 -0
- package/dist/game/playableGame.d.ts +160 -12
- package/dist/game/quest.d.ts +8 -0
- package/dist/game/quest.js +29 -0
- package/dist/game/race.d.ts +141 -0
- package/dist/game/race.js +169 -0
- package/dist/game/recordBook.d.ts +5 -5
- package/dist/game/recordBook.js +4 -1
- package/dist/game/ruleSelection.d.ts +75 -0
- package/dist/game/ruleSelection.js +127 -0
- package/dist/game/runDraft.d.ts +5 -0
- package/dist/game/runDraft.js +5 -0
- package/dist/game/saveStore.d.ts +111 -0
- package/dist/game/saveStore.js +312 -0
- package/dist/game/snapshotHistory.d.ts +67 -0
- package/dist/game/snapshotHistory.js +95 -0
- package/dist/game/social.d.ts +38 -1
- package/dist/game/social.js +71 -0
- package/dist/game/spawnPoints.d.ts +5 -0
- package/dist/game/spawnPoints.js +5 -0
- package/dist/game/systemRuntime.d.ts +50 -0
- package/dist/game/systemRuntime.js +157 -0
- package/dist/game/systemSchedule.d.ts +72 -0
- package/dist/game/systemSchedule.js +242 -0
- package/dist/game/toasts.d.ts +43 -0
- package/dist/game/toasts.js +44 -0
- package/dist/game/trade.d.ts +10 -0
- package/dist/game/trade.js +10 -0
- package/dist/game/unlocks.d.ts +8 -0
- package/dist/game/unlocks.js +16 -0
- package/dist/game/vfxInstance.d.ts +138 -0
- package/dist/game/vfxInstance.js +96 -0
- package/dist/game/worldItem.d.ts +17 -4
- package/dist/game/worldItem.js +17 -4
- package/dist/gameplay.d.ts +91 -0
- package/dist/gameplay.js +91 -0
- package/dist/index.d.ts +5 -7
- package/dist/index.js +5 -7
- package/dist/input/actionBindings.d.ts +24 -5
- package/dist/input/actionBindings.js +23 -5
- package/dist/input/axisInput.d.ts +13 -1
- package/dist/input/axisInput.js +22 -1
- package/dist/input/controlGroups.d.ts +67 -0
- package/dist/input/controlGroups.js +41 -0
- package/dist/input/touchScheme.d.ts +82 -6
- package/dist/input/touchScheme.js +123 -10
- package/dist/interaction/contextMenu.d.ts +1 -0
- package/dist/interaction/contextMenu.js +1 -0
- package/dist/interaction/lockpick.d.ts +61 -0
- package/dist/interaction/lockpick.js +168 -0
- package/dist/interaction/proximityPrompt.d.ts +5 -1
- package/dist/interaction/proximityPrompt.js +5 -3
- package/dist/interaction/qte.d.ts +5 -0
- package/dist/interaction/qte.js +5 -0
- package/dist/interaction/skillCheck.d.ts +5 -0
- package/dist/interaction/skillCheck.js +5 -0
- package/dist/inventory/inventoryModel.d.ts +12 -0
- package/dist/inventory/inventoryModel.js +12 -0
- package/dist/inventory/shapedGrid.d.ts +16 -0
- package/dist/inventory/shapedGrid.js +16 -0
- package/dist/inventory/slotModel.d.ts +10 -0
- package/dist/inventory/slotModel.js +10 -0
- package/dist/item/durability.d.ts +5 -0
- package/dist/item/durability.js +5 -0
- package/dist/item/itemIdentity.d.ts +171 -0
- package/dist/item/itemIdentity.js +138 -0
- package/dist/item/itemInstanceRegistry.d.ts +32 -0
- package/dist/item/itemInstanceRegistry.js +34 -0
- package/dist/item/itemgen.d.ts +163 -0
- package/dist/item/itemgen.js +151 -0
- package/dist/item/modularItem.d.ts +5 -0
- package/dist/item/modularItem.js +5 -0
- package/dist/item/use.d.ts +5 -0
- package/dist/item/use.js +5 -0
- package/dist/item/useBehavior.d.ts +142 -0
- package/dist/item/useBehavior.js +105 -0
- package/dist/item/weapon.d.ts +5 -0
- package/dist/item/weapon.js +5 -0
- package/dist/math/scalar.d.ts +25 -0
- package/dist/math/scalar.js +47 -0
- package/dist/meta/changelog.d.ts +4 -1
- package/dist/meta/changelog.js +36 -1
- package/dist/movement/avoidance.d.ts +45 -0
- package/dist/movement/avoidance.js +123 -0
- package/dist/movement/cameraRig.d.ts +8 -0
- package/dist/movement/cameraRig.js +8 -0
- package/dist/movement/dash.d.ts +11 -0
- package/dist/movement/dash.js +11 -0
- package/dist/movement/formation.d.ts +135 -0
- package/dist/movement/formation.js +194 -0
- package/dist/movement/glideModel.d.ts +5 -0
- package/dist/movement/glideModel.js +5 -0
- package/dist/movement/grappleSwing.d.ts +5 -0
- package/dist/movement/grappleSwing.js +5 -0
- package/dist/movement/leaderTrail.d.ts +5 -0
- package/dist/movement/leaderTrail.js +5 -0
- package/dist/movement/movementModel.d.ts +38 -7
- package/dist/movement/movementModel.js +54 -13
- package/dist/movement/playerMovement.d.ts +41 -0
- package/dist/movement/playerMovement.js +236 -0
- package/dist/movement/poseState.d.ts +13 -0
- package/dist/movement/poseState.js +16 -0
- package/dist/movement/steering.d.ts +8 -0
- package/dist/movement/steering.js +18 -0
- package/dist/multiplayer/combatSnapshot.d.ts +3 -0
- package/dist/multiplayer/combatSnapshot.js +3 -0
- package/dist/multiplayer/lagCompensation.d.ts +5 -0
- package/dist/multiplayer/lagCompensation.js +5 -0
- package/dist/multiplayer/presenceModel.d.ts +9 -1
- package/dist/multiplayer/presenceModel.js +9 -1
- package/dist/multiplayer/simultaneousCommit.d.ts +3 -0
- package/dist/multiplayer/simultaneousCommit.js +3 -0
- package/dist/multiplayer.d.ts +11 -0
- package/dist/multiplayer.js +11 -0
- package/dist/nav/pathFollow.d.ts +57 -0
- package/dist/nav/pathFollow.js +109 -0
- package/dist/orders/orderKinds.d.ts +156 -0
- package/dist/orders/orderKinds.js +197 -0
- package/dist/orders/orderQueue.d.ts +208 -0
- package/dist/orders/orderQueue.js +211 -0
- package/dist/physics/drivableVehicle.d.ts +29 -0
- package/dist/physics/drivableVehicle.js +16 -0
- package/dist/physics/kinematicVehicle.d.ts +21 -1
- package/dist/physics/kinematicVehicle.js +23 -8
- package/dist/physics/physicsWorld.d.ts +24 -12
- package/dist/physics/physicsWorld.js +11 -5
- package/dist/physics/radialImpulse.d.ts +25 -0
- package/dist/physics/radialImpulse.js +27 -0
- package/dist/procedural.d.ts +3 -0
- package/dist/procedural.js +3 -0
- package/dist/progression/statGraph.d.ts +116 -0
- package/dist/progression/statGraph.js +318 -0
- package/dist/puzzle/cellGrid.d.ts +9 -0
- package/dist/puzzle/cellGrid.js +9 -0
- package/dist/puzzle/fallingPiece.d.ts +9 -0
- package/dist/puzzle/fallingPiece.js +9 -0
- package/dist/puzzle/nonogram.d.ts +39 -0
- package/dist/puzzle/nonogram.js +136 -0
- package/dist/random/nameGen.d.ts +5 -0
- package/dist/random/nameGen.js +5 -0
- package/dist/random/pick.d.ts +8 -0
- package/dist/random/pick.js +31 -0
- package/dist/random/rng.d.ts +24 -0
- package/dist/random/rng.js +30 -8
- package/dist/random/seedLink.d.ts +4 -0
- package/dist/random/seedLink.js +4 -0
- package/dist/relation/keyedValues.d.ts +54 -0
- package/dist/relation/keyedValues.js +115 -0
- package/dist/relation/thresholds.d.ts +62 -0
- package/dist/relation/thresholds.js +62 -0
- package/dist/render/color.d.ts +12 -0
- package/dist/render/color.js +26 -0
- package/dist/render/lookPreset.d.ts +41 -0
- package/dist/render/lookPreset.js +29 -0
- package/dist/render/postProcessing.d.ts +76 -0
- package/dist/render/postProcessing.js +21 -0
- package/dist/rules/predicate.d.ts +53 -0
- package/dist/rules/predicate.js +64 -0
- package/dist/rules/ruleEffects.d.ts +38 -0
- package/dist/rules/ruleEffects.js +37 -0
- package/dist/rules/triggeredRules.d.ts +160 -0
- package/dist/rules/triggeredRules.js +241 -0
- package/dist/runtime/adapter.d.ts +58 -0
- package/dist/runtime/adapter.js +54 -5
- package/dist/runtime/cameraDirector.d.ts +1 -0
- package/dist/runtime/cameraDirector.js +1 -0
- package/dist/runtime/commandRunner.d.ts +1 -0
- package/dist/runtime/commandRunner.js +1 -0
- package/dist/runtime/context/combatFx.d.ts +23 -0
- package/dist/runtime/context/combatFx.js +161 -0
- package/dist/runtime/context/registries.d.ts +13 -0
- package/dist/runtime/context/registries.js +84 -0
- package/dist/runtime/context/worldItems.d.ts +21 -0
- package/dist/runtime/context/worldItems.js +37 -0
- package/dist/runtime/descriptors/baseline.d.ts +48 -0
- package/dist/runtime/descriptors/baseline.js +134 -0
- package/dist/runtime/descriptors/features.d.ts +74 -0
- package/dist/runtime/descriptors/features.js +281 -0
- package/dist/runtime/gameContext.d.ts +163 -19
- package/dist/runtime/gameContext.js +385 -339
- package/dist/runtime/gameRuntime.d.ts +1 -0
- package/dist/runtime/gameRuntime.js +1 -0
- package/dist/runtime/headlessRunner.d.ts +60 -0
- package/dist/runtime/headlessRunner.js +44 -0
- package/dist/runtime/hostPersistence.d.ts +12 -0
- package/dist/runtime/hostPersistence.js +12 -0
- package/dist/runtime/hostedGameRunner.d.ts +54 -0
- package/dist/runtime/hostedGameRunner.js +85 -0
- package/dist/runtime/hostedWorldSession.d.ts +73 -0
- package/dist/runtime/hostedWorldSession.js +64 -0
- package/dist/runtime/inputSnapshot.d.ts +21 -3
- package/dist/runtime/inputSnapshot.js +8 -2
- package/dist/runtime/motionIntents.d.ts +12 -1
- package/dist/runtime/motionIntents.js +26 -1
- package/dist/runtime/perContext.d.ts +15 -0
- package/dist/runtime/perContext.js +21 -0
- package/dist/runtime/runtimeSave.d.ts +79 -0
- package/dist/runtime/runtimeSave.js +105 -0
- package/dist/runtime/save.d.ts +4 -0
- package/dist/runtime/save.js +4 -0
- package/dist/runtime/snapshot.d.ts +7 -0
- package/dist/runtime/snapshot.js +7 -0
- package/dist/runtime/visibility.d.ts +2 -1
- package/dist/runtime/visibility.js +2 -1
- package/dist/runtime/worldChannel.d.ts +62 -0
- package/dist/runtime/worldChannel.js +114 -0
- package/dist/runtime/worldMirror.d.ts +36 -0
- package/dist/runtime/worldMirror.js +44 -0
- package/dist/runtime/worldProjection.d.ts +47 -0
- package/dist/runtime/worldProjection.js +52 -0
- package/dist/runtime/worldReplication.d.ts +69 -0
- package/dist/runtime/worldReplication.js +217 -0
- package/dist/runtime/worldSnapshot.d.ts +44 -0
- package/dist/runtime/worldSnapshot.js +30 -0
- package/dist/scene/assetCatalog.d.ts +22 -0
- package/dist/scene/assetCatalog.js +4 -0
- package/dist/scene/assetDiagnostics.d.ts +69 -0
- package/dist/scene/assetDiagnostics.js +110 -0
- package/dist/scene/assetGenerator.d.ts +65 -0
- package/dist/scene/assetGenerator.js +64 -0
- package/dist/scene/assetSpace.d.ts +137 -0
- package/dist/scene/assetSpace.js +259 -0
- package/dist/scene/authoredTriggers.d.ts +169 -0
- package/dist/scene/authoredTriggers.js +340 -0
- package/dist/scene/behaviorRuntime.d.ts +75 -0
- package/dist/scene/behaviorRuntime.js +217 -0
- package/dist/scene/behaviors.d.ts +14 -2
- package/dist/scene/behaviors.js +7 -2
- package/dist/scene/bodyBind.d.ts +60 -0
- package/dist/scene/bodyBind.js +51 -0
- package/dist/scene/builtinSceneKinds.d.ts +5 -0
- package/dist/scene/builtinSceneKinds.js +62 -0
- package/dist/scene/colliders.d.ts +18 -0
- package/dist/scene/colliders.js +61 -1
- package/dist/scene/entityStats.d.ts +13 -0
- package/dist/scene/entityStats.js +30 -0
- package/dist/scene/entityStore.d.ts +41 -1
- package/dist/scene/entityStore.js +75 -0
- package/dist/scene/facing.d.ts +18 -0
- package/dist/scene/facing.js +26 -0
- package/dist/scene/modelSockets.d.ts +33 -0
- package/dist/scene/modelSockets.js +29 -0
- package/dist/scene/objectQuery.d.ts +2 -0
- package/dist/scene/objectQuery.js +2 -0
- package/dist/scene/objectStore.d.ts +4 -0
- package/dist/scene/objectStore.js +6 -0
- package/dist/scene/possession.d.ts +8 -0
- package/dist/scene/possession.js +14 -0
- package/dist/scene/roster.d.ts +3 -0
- package/dist/scene/roster.js +12 -0
- package/dist/scene/sceneKinds.d.ts +240 -0
- package/dist/scene/sceneKinds.js +214 -0
- package/dist/scene/sceneOwnership.d.ts +169 -0
- package/dist/scene/sceneOwnership.js +179 -0
- package/dist/scene/selectionBookmarks.d.ts +93 -0
- package/dist/scene/selectionBookmarks.js +122 -0
- package/dist/scene/vehicleSeat.d.ts +68 -0
- package/dist/scene/vehicleSeat.js +59 -0
- package/dist/sensor/concealment.d.ts +3 -0
- package/dist/sensor/concealment.js +3 -0
- package/dist/sensor/freezeMonitor.d.ts +1 -0
- package/dist/sensor/freezeMonitor.js +1 -0
- package/dist/sensor/frustumSensor.d.ts +7 -3
- package/dist/sensor/frustumSensor.js +7 -3
- package/dist/sensor/hiddenStateProbe.d.ts +5 -2
- package/dist/sensor/hiddenStateProbe.js +5 -2
- package/dist/sensor/recordingBuffer.d.ts +2 -1
- package/dist/sensor/recordingBuffer.js +2 -1
- package/dist/sensor/replayLoop.d.ts +6 -2
- package/dist/sensor/replayLoop.js +6 -2
- package/dist/sensor/revealQuery.d.ts +2 -1
- package/dist/sensor/revealQuery.js +2 -1
- package/dist/sensor/visionCone.d.ts +10 -3
- package/dist/sensor/visionCone.js +10 -3
- package/dist/session/contestedChannel.d.ts +1 -0
- package/dist/session/contestedChannel.js +1 -0
- package/dist/session/extraction.d.ts +1 -0
- package/dist/session/extraction.js +1 -0
- package/dist/session/roles.d.ts +6 -0
- package/dist/session/roles.js +6 -0
- package/dist/session/roundState.d.ts +8 -0
- package/dist/session/roundState.js +2 -0
- package/dist/settings/settingsModel.d.ts +1 -0
- package/dist/settings/settingsModel.js +1 -0
- package/dist/stats/accumulatorMeter.d.ts +6 -0
- package/dist/stats/accumulatorMeter.js +6 -0
- package/dist/stats/eventMeter.d.ts +5 -0
- package/dist/stats/eventMeter.js +5 -0
- package/dist/stats/rollCheck.d.ts +5 -0
- package/dist/stats/rollCheck.js +5 -0
- package/dist/stats/statModifiers.d.ts +5 -0
- package/dist/stats/statModifiers.js +5 -0
- package/dist/store/defineKeyedStore.d.ts +38 -0
- package/dist/store/defineKeyedStore.js +42 -0
- package/dist/store/defineStore.d.ts +33 -0
- package/dist/store/defineStore.js +35 -0
- package/dist/store/observableKeyedStore.d.ts +9 -0
- package/dist/store/observableKeyedStore.js +43 -2
- package/dist/survival/decayMeter.d.ts +55 -0
- package/dist/survival/decayMeter.js +130 -55
- package/dist/survival/moodle.d.ts +2 -0
- package/dist/survival/regionHealth.d.ts +6 -0
- package/dist/survival/regionHealth.js +5 -0
- package/dist/tactics/fallingGrid.d.ts +6 -4
- package/dist/tactics/fallingGrid.js +6 -4
- package/dist/tactics/predictiveQuery.d.ts +3 -0
- package/dist/tactics/predictiveQuery.js +3 -0
- package/dist/tactics/snapshot.d.ts +2 -0
- package/dist/tactics/snapshot.js +2 -0
- package/dist/tactics/surface.d.ts +1 -0
- package/dist/tactics/surface.js +1 -0
- package/dist/tactics/tacticalGrid.d.ts +1 -0
- package/dist/tactics/tacticalGrid.js +1 -0
- package/dist/time/beatClock.d.ts +14 -4
- package/dist/time/beatClock.js +14 -4
- package/dist/time/calendarClock.d.ts +3 -0
- package/dist/time/calendarClock.js +3 -0
- package/dist/time/idleProgress.d.ts +4 -0
- package/dist/time/idleProgress.js +4 -0
- package/dist/time/simClock.d.ts +2 -0
- package/dist/time/simClock.js +20 -5
- package/dist/ui/actionModel.d.ts +110 -0
- package/dist/ui/actionModel.js +159 -0
- package/dist/ui/gameLayout.d.ts +144 -0
- package/dist/ui/gameLayout.js +148 -0
- package/dist/ui/hudDocument.d.ts +114 -0
- package/dist/ui/hudDocument.js +220 -0
- package/dist/ui/hudLayout.d.ts +33 -1
- package/dist/ui/hudLayout.js +204 -17
- package/dist/ui/orientation.d.ts +39 -0
- package/dist/ui/orientation.js +49 -0
- package/dist/ui/selectionModel.d.ts +92 -0
- package/dist/ui/selectionModel.js +88 -0
- package/dist/ui/swingTimer.d.ts +42 -0
- package/dist/ui/swingTimer.js +38 -0
- package/dist/ui/tooltipModel.d.ts +63 -0
- package/dist/ui/tooltipModel.js +82 -0
- package/dist/ui.d.ts +15 -0
- package/dist/ui.js +15 -0
- package/dist/visibility/bounds.d.ts +8 -1
- package/dist/visibility/bounds.js +8 -1
- package/dist/visibility/frustum.d.ts +12 -3
- package/dist/visibility/frustum.js +12 -3
- package/dist/visibility/spatialIndex.js +34 -20
- package/dist/work/jobQueue.d.ts +201 -0
- package/dist/work/jobQueue.js +253 -0
- package/dist/work/unitTraining.d.ts +58 -0
- package/dist/work/unitTraining.js +52 -0
- package/dist/world/authoredObjects.d.ts +58 -0
- package/dist/world/authoredObjects.js +69 -0
- package/dist/world/buildingGenerator.d.ts +18 -0
- package/dist/world/buildingGenerator.js +62 -0
- package/dist/world/buildings.d.ts +5 -0
- package/dist/world/buildings.js +5 -0
- package/dist/world/catenary.d.ts +22 -0
- package/dist/world/catenary.js +69 -0
- package/dist/world/environmentSummary.d.ts +11 -2
- package/dist/world/environmentSummary.js +11 -1
- package/dist/world/features.d.ts +244 -7
- package/dist/world/features.js +92 -4
- package/dist/world/footprintGrid.d.ts +59 -0
- package/dist/world/footprintGrid.js +141 -0
- package/dist/world/geometry.d.ts +64 -0
- package/dist/world/geometry.js +94 -0
- package/dist/world/grassKind.d.ts +51 -0
- package/dist/world/grassKind.js +101 -0
- package/dist/world/pathInstances.d.ts +27 -0
- package/dist/world/pathInstances.js +27 -0
- package/dist/world/pathTerrain.d.ts +80 -0
- package/dist/world/pathTerrain.js +142 -0
- package/dist/world/placeAsset.d.ts +81 -0
- package/dist/world/placeAsset.js +77 -0
- package/dist/world/placement.d.ts +4 -0
- package/dist/world/placement.js +4 -0
- package/dist/world/placementController.d.ts +6 -0
- package/dist/world/placementController.js +6 -0
- package/dist/world/polyline.d.ts +34 -0
- package/dist/world/polyline.js +81 -0
- package/dist/world/roads.d.ts +55 -0
- package/dist/world/roads.js +184 -0
- package/dist/world/scatterRegion.d.ts +164 -0
- package/dist/world/scatterRegion.js +409 -0
- package/dist/world/sceneShapes.d.ts +43 -0
- package/dist/world/sceneShapes.js +1 -0
- package/dist/world/segment.d.ts +27 -0
- package/dist/world/segment.js +43 -0
- package/dist/world/soilKind.d.ts +48 -0
- package/dist/world/soilKind.js +92 -0
- package/dist/world/spatialSample.d.ts +241 -0
- package/dist/world/spatialSample.js +465 -0
- package/dist/world/streets.d.ts +80 -0
- package/dist/world/streets.js +144 -0
- package/dist/world/terraform.d.ts +213 -1
- package/dist/world/terraform.js +655 -20
- package/dist/world/terrain.d.ts +138 -12
- package/dist/world/terrain.js +346 -28
- package/dist/world/terrainGuides.d.ts +182 -0
- package/dist/world/terrainGuides.js +343 -0
- package/dist/world/vec2.d.ts +81 -0
- package/dist/world/vec2.js +128 -0
- package/dist/world/vec3.d.ts +49 -0
- package/dist/world/vec3.js +76 -0
- package/dist/world/vegetation.d.ts +71 -0
- package/dist/world/vegetation.js +151 -0
- package/dist/world/visibilityField.d.ts +154 -0
- package/dist/world/visibilityField.js +271 -0
- package/dist/world/volumetricClouds.d.ts +52 -0
- package/dist/world/volumetricClouds.js +43 -0
- package/dist/world/walls.d.ts +9 -0
- package/dist/world/walls.js +9 -0
- package/dist/world/waterKind.d.ts +55 -0
- package/dist/world/waterKind.js +99 -0
- package/dist/world.d.ts +132 -0
- package/dist/world.js +132 -0
- package/package.json +32 -8
- package/skills/jgengine/SKILL.md +51 -0
- package/skills/jgengine/api.md +434 -0
- package/skills/jgengine/capabilities.md +29 -0
- package/skills/jgengine/reference-cartridge.md +72 -0
- package/skills/jgengine-combat/SKILL.md +34 -0
- package/skills/jgengine-combat/api.md +549 -0
- package/skills/jgengine-combat/capabilities.md +169 -0
- package/skills/jgengine-combat/reference.md +98 -0
- package/skills/jgengine-gameplay/SKILL.md +39 -0
- package/skills/jgengine-gameplay/api.md +1794 -0
- package/skills/jgengine-gameplay/capabilities.md +378 -0
- package/skills/jgengine-gameplay/reference-systems.md +60 -0
- package/skills/jgengine-world/SKILL.md +38 -0
- package/skills/jgengine-world/api.md +2652 -0
- package/skills/jgengine-world/capabilities.md +370 -0
- package/skills/jgengine-world/reference.md +222 -0
- package/dist/cartridge/runtime.d.ts +0 -15
- package/dist/cartridge/runtime.js +0 -556
- package/dist/cartridge/spec.d.ts +0 -188
- package/dist/cartridge/spec.js +0 -19
- package/dist/cartridge/validate.d.ts +0 -2
- package/dist/cartridge/validate.js +0 -78
- package/dist/store/engineStore.d.ts +0 -22
- package/dist/store/engineStore.js +0 -50
- package/dist/store/features.d.ts +0 -10
- package/dist/store/features.js +0 -23
- package/llms.txt +0 -4983
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
|
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The game-level orientation contract. A game declares how it supports phone
|
|
3
|
+
* orientations; the shell resolves that against the live orientation to decide
|
|
4
|
+
* whether to show a dismissible rotate hint (advisory) or a full-screen gate
|
|
5
|
+
* that blocks gameplay until the device is turned (required).
|
|
6
|
+
*/
|
|
7
|
+
/** How a game supports a phone orientation on coarse-pointer displays. */
|
|
8
|
+
export type MobileOrientationRule = "any" | "portrait" | "landscape" | "portrait-required" | "landscape-required" | "unsupported";
|
|
9
|
+
/** Object form of the `orientation` field: the strict per-platform contract. */
|
|
10
|
+
export interface GameOrientationConfig {
|
|
11
|
+
/** Orientation contract on coarse-pointer / phone displays. Default `"any"`. */
|
|
12
|
+
mobile?: MobileOrientationRule;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* The `orientation` field of a game definition. Legacy shorthand `"landscape"`
|
|
16
|
+
* / `"portrait"` stays advisory (a dismissible rotate hint, never a gate). The
|
|
17
|
+
* object form `{ mobile: "landscape-required" }` is the strict contract that
|
|
18
|
+
* blocks gameplay behind the rotate screen until the device is turned.
|
|
19
|
+
*/
|
|
20
|
+
export type GameOrientation = "landscape" | "portrait" | GameOrientationConfig;
|
|
21
|
+
/** A concrete device orientation. */
|
|
22
|
+
export type LayoutOrientation = "portrait" | "landscape";
|
|
23
|
+
/** The resolved orientation contract for a platform: whether it's supported, gated, or merely preferred. */
|
|
24
|
+
export interface OrientationRequirement {
|
|
25
|
+
/** False only for `"unsupported"` — the game declares it isn't built for phones. */
|
|
26
|
+
supported: boolean;
|
|
27
|
+
/** Orientation gameplay is hard-gated to; `null` when there is no gate. */
|
|
28
|
+
required: LayoutOrientation | null;
|
|
29
|
+
/** Orientation the game reads best in; drives an advisory hint when not required. */
|
|
30
|
+
preferred: LayoutOrientation | null;
|
|
31
|
+
}
|
|
32
|
+
/** Normalize the `orientation` field (legacy string or object) to a single mobile rule. */
|
|
33
|
+
export declare function resolveMobileOrientationRule(orientation: GameOrientation | undefined): MobileOrientationRule;
|
|
34
|
+
/** Resolve the game's orientation declaration into a concrete requirement for a platform. Desktop is always unconstrained. */
|
|
35
|
+
export declare function resolveOrientationRequirement(orientation: GameOrientation | undefined, platform: "mobile" | "desktop"): OrientationRequirement;
|
|
36
|
+
/** The rotate gate blocks gameplay: a hard requirement (or `unsupported`) the live orientation doesn't satisfy. */
|
|
37
|
+
export declare function orientationGateActive(requirement: OrientationRequirement, liveOrientation: LayoutOrientation): boolean;
|
|
38
|
+
/** An advisory rotate hint applies: a preference (not a hard gate) the live orientation doesn't satisfy. */
|
|
39
|
+
export declare function orientationHintActive(requirement: OrientationRequirement, liveOrientation: LayoutOrientation): boolean;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The game-level orientation contract. A game declares how it supports phone
|
|
3
|
+
* orientations; the shell resolves that against the live orientation to decide
|
|
4
|
+
* whether to show a dismissible rotate hint (advisory) or a full-screen gate
|
|
5
|
+
* that blocks gameplay until the device is turned (required).
|
|
6
|
+
*/
|
|
7
|
+
/** Normalize the `orientation` field (legacy string or object) to a single mobile rule. */
|
|
8
|
+
export function resolveMobileOrientationRule(orientation) {
|
|
9
|
+
if (orientation === undefined)
|
|
10
|
+
return "any";
|
|
11
|
+
if (orientation === "landscape")
|
|
12
|
+
return "landscape";
|
|
13
|
+
if (orientation === "portrait")
|
|
14
|
+
return "portrait";
|
|
15
|
+
return orientation.mobile ?? "any";
|
|
16
|
+
}
|
|
17
|
+
/** Resolve the game's orientation declaration into a concrete requirement for a platform. Desktop is always unconstrained. */
|
|
18
|
+
export function resolveOrientationRequirement(orientation, platform) {
|
|
19
|
+
if (platform === "desktop")
|
|
20
|
+
return { supported: true, required: null, preferred: null };
|
|
21
|
+
const rule = resolveMobileOrientationRule(orientation);
|
|
22
|
+
switch (rule) {
|
|
23
|
+
case "unsupported":
|
|
24
|
+
return { supported: false, required: null, preferred: null };
|
|
25
|
+
case "landscape-required":
|
|
26
|
+
return { supported: true, required: "landscape", preferred: "landscape" };
|
|
27
|
+
case "portrait-required":
|
|
28
|
+
return { supported: true, required: "portrait", preferred: "portrait" };
|
|
29
|
+
case "landscape":
|
|
30
|
+
return { supported: true, required: null, preferred: "landscape" };
|
|
31
|
+
case "portrait":
|
|
32
|
+
return { supported: true, required: null, preferred: "portrait" };
|
|
33
|
+
case "any":
|
|
34
|
+
return { supported: true, required: null, preferred: null };
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/** The rotate gate blocks gameplay: a hard requirement (or `unsupported`) the live orientation doesn't satisfy. */
|
|
38
|
+
export function orientationGateActive(requirement, liveOrientation) {
|
|
39
|
+
if (!requirement.supported)
|
|
40
|
+
return true;
|
|
41
|
+
return requirement.required !== null && requirement.required !== liveOrientation;
|
|
42
|
+
}
|
|
43
|
+
/** An advisory rotate hint applies: a preference (not a hard gate) the live orientation doesn't satisfy. */
|
|
44
|
+
export function orientationHintActive(requirement, liveOrientation) {
|
|
45
|
+
return (requirement.supported &&
|
|
46
|
+
requirement.required === null &&
|
|
47
|
+
requirement.preferred !== null &&
|
|
48
|
+
requirement.preferred !== liveOrientation);
|
|
49
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Headless view model for a multi-entity selection — the data layer behind an RTS selection panel, a
|
|
3
|
+
* party frame, or a squad summary. It turns a caller-owned list of selected entity summaries into a
|
|
4
|
+
* primary detail focus, an ordered member strip, and same-kind buckets for large selections, with
|
|
5
|
+
* focus/hover and virtualization helpers. No rendering opinion: the React renderers in
|
|
6
|
+
* `@jgengine/react/selectionHud` consume this and a game supplies the entity data from wherever it
|
|
7
|
+
* lives (a `createSelectionSet`, a roster, a marquee query).
|
|
8
|
+
*/
|
|
9
|
+
/** One vital bar on an entity summary (health/shield/energy): current/max plus optional label and tone. */
|
|
10
|
+
export interface EntityVital {
|
|
11
|
+
id: string;
|
|
12
|
+
label?: string;
|
|
13
|
+
current: number;
|
|
14
|
+
max: number;
|
|
15
|
+
/** Colour-ramp hint the renderer maps to a palette (e.g. `"health" | "shield"`); caller-owned. */
|
|
16
|
+
tone?: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* A caller-provided summary of one selectable entity — the DATA input. `kind` is the grouping key
|
|
20
|
+
* used to bucket a large selection (unit type, catalog id); `icon` is a portrait id the renderer
|
|
21
|
+
* resolves. Only `id` is required.
|
|
22
|
+
*/
|
|
23
|
+
export interface EntitySummaryDef {
|
|
24
|
+
id: string;
|
|
25
|
+
name?: string;
|
|
26
|
+
/** Type/catalog id a large selection is bucketed by; falls back to `"unit"` when omitted. */
|
|
27
|
+
kind?: string;
|
|
28
|
+
/** Portrait id / glyph the caller maps to art. */
|
|
29
|
+
icon?: string;
|
|
30
|
+
vitals?: readonly EntityVital[];
|
|
31
|
+
tags?: readonly string[];
|
|
32
|
+
/** Ownership / faction tint id, caller-owned. */
|
|
33
|
+
owner?: string;
|
|
34
|
+
}
|
|
35
|
+
/** A bucket of same-`kind` entities in a large selection — the RTS "12 Marines" control chip. */
|
|
36
|
+
export interface SelectionGroup {
|
|
37
|
+
kind: string;
|
|
38
|
+
label: string;
|
|
39
|
+
icon?: string;
|
|
40
|
+
count: number;
|
|
41
|
+
ids: readonly string[];
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* A resolved multi-selection view model. `primary` is the focused entity's full detail; `members` is
|
|
45
|
+
* the stable-order strip; `groups` buckets members by kind (count-desc, then label) for the
|
|
46
|
+
* portrait-overflow case; `grouped` is the hint that the selection is large enough to prefer groups
|
|
47
|
+
* over per-member portraits.
|
|
48
|
+
*/
|
|
49
|
+
export interface SelectionView {
|
|
50
|
+
count: number;
|
|
51
|
+
primary: EntitySummaryDef | null;
|
|
52
|
+
members: readonly EntitySummaryDef[];
|
|
53
|
+
groups: readonly SelectionGroup[];
|
|
54
|
+
focusIndex: number;
|
|
55
|
+
grouped: boolean;
|
|
56
|
+
}
|
|
57
|
+
/** Options for {@link summarizeSelection}. */
|
|
58
|
+
export interface SummarizeSelectionOptions {
|
|
59
|
+
/** Id of the entity to treat as primary/focused. Wins over `focusIndex`; ignored when not present. */
|
|
60
|
+
primaryId?: string;
|
|
61
|
+
/** Index of the primary/focused member when `primaryId` is absent (default 0). */
|
|
62
|
+
focusIndex?: number;
|
|
63
|
+
/** Member count above which `grouped` flips true (default 12). */
|
|
64
|
+
groupThreshold?: number;
|
|
65
|
+
/** Map a `kind` to a display label for its group (default: the kind itself). */
|
|
66
|
+
labelOf?: (kind: string) => string;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Summarize a selected-entity list into a {@link SelectionView}: resolve the primary focus, keep the
|
|
70
|
+
* ordered members, and bucket them by `kind`. Pure and stable — deterministic group ordering and a
|
|
71
|
+
* clamped focus index, so it is safe to call every render and to assert on in a test.
|
|
72
|
+
*/
|
|
73
|
+
export declare function summarizeSelection(members: readonly EntitySummaryDef[], options?: SummarizeSelectionOptions): SelectionView;
|
|
74
|
+
/** A 1-D focus move within the selection member strip. */
|
|
75
|
+
export type SelectionFocusDirection = "next" | "prev" | "first" | "last";
|
|
76
|
+
/**
|
|
77
|
+
* Pure next-focus math for the selection strip: step the focus index by one member (wrapping), or
|
|
78
|
+
* jump to an end. `-1` (no focus) steps to the first/last member. Returns `-1` for an empty selection.
|
|
79
|
+
*/
|
|
80
|
+
export declare function moveSelectionFocus(count: number, current: number, dir: SelectionFocusDirection): number;
|
|
81
|
+
/** A contiguous slice of members for virtualizing a large selection strip. */
|
|
82
|
+
export interface SelectionWindow {
|
|
83
|
+
start: number;
|
|
84
|
+
end: number;
|
|
85
|
+
items: readonly EntitySummaryDef[];
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Compute a virtualization window over a large selection: a `size`-length slice starting near
|
|
89
|
+
* `scroll`, clamped so the window never runs past the end. Render only `items`, offsetting by
|
|
90
|
+
* `start * itemSize`, to keep a thousand-unit selection from mounting a thousand portraits.
|
|
91
|
+
*/
|
|
92
|
+
export declare function selectionWindow(members: readonly EntitySummaryDef[], scroll: number, size: number): SelectionWindow;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Headless view model for a multi-entity selection — the data layer behind an RTS selection panel, a
|
|
3
|
+
* party frame, or a squad summary. It turns a caller-owned list of selected entity summaries into a
|
|
4
|
+
* primary detail focus, an ordered member strip, and same-kind buckets for large selections, with
|
|
5
|
+
* focus/hover and virtualization helpers. No rendering opinion: the React renderers in
|
|
6
|
+
* `@jgengine/react/selectionHud` consume this and a game supplies the entity data from wherever it
|
|
7
|
+
* lives (a `createSelectionSet`, a roster, a marquee query).
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Summarize a selected-entity list into a {@link SelectionView}: resolve the primary focus, keep the
|
|
11
|
+
* ordered members, and bucket them by `kind`. Pure and stable — deterministic group ordering and a
|
|
12
|
+
* clamped focus index, so it is safe to call every render and to assert on in a test.
|
|
13
|
+
*/
|
|
14
|
+
export function summarizeSelection(members, options) {
|
|
15
|
+
const count = members.length;
|
|
16
|
+
const threshold = options?.groupThreshold ?? 12;
|
|
17
|
+
const labelOf = options?.labelOf ?? ((kind) => kind);
|
|
18
|
+
let focusIndex = -1;
|
|
19
|
+
if (options?.primaryId !== undefined) {
|
|
20
|
+
focusIndex = members.findIndex((m) => m.id === options.primaryId);
|
|
21
|
+
}
|
|
22
|
+
if (focusIndex < 0)
|
|
23
|
+
focusIndex = options?.focusIndex ?? 0;
|
|
24
|
+
focusIndex = count === 0 ? -1 : Math.max(0, Math.min(count - 1, focusIndex));
|
|
25
|
+
const primary = focusIndex < 0 ? null : (members[focusIndex] ?? null);
|
|
26
|
+
return {
|
|
27
|
+
count,
|
|
28
|
+
primary,
|
|
29
|
+
members,
|
|
30
|
+
groups: groupSelection(members, labelOf),
|
|
31
|
+
focusIndex,
|
|
32
|
+
grouped: count > threshold,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/** @internal Bucket members by `kind` into count-desc, label-asc ordered {@link SelectionGroup}s. */
|
|
36
|
+
function groupSelection(members, labelOf) {
|
|
37
|
+
const order = [];
|
|
38
|
+
const byKind = new Map();
|
|
39
|
+
for (const member of members) {
|
|
40
|
+
const kind = member.kind ?? "unit";
|
|
41
|
+
let bucket = byKind.get(kind);
|
|
42
|
+
if (bucket === undefined) {
|
|
43
|
+
bucket = { icon: member.icon, ids: [] };
|
|
44
|
+
byKind.set(kind, bucket);
|
|
45
|
+
order.push(kind);
|
|
46
|
+
}
|
|
47
|
+
bucket.ids.push(member.id);
|
|
48
|
+
}
|
|
49
|
+
const groups = order.map((kind) => {
|
|
50
|
+
const bucket = byKind.get(kind);
|
|
51
|
+
const group = { kind, label: labelOf(kind), count: bucket.ids.length, ids: bucket.ids };
|
|
52
|
+
if (bucket.icon !== undefined)
|
|
53
|
+
group.icon = bucket.icon;
|
|
54
|
+
return group;
|
|
55
|
+
});
|
|
56
|
+
groups.sort((a, b) => (b.count - a.count) || a.label.localeCompare(b.label));
|
|
57
|
+
return groups;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Pure next-focus math for the selection strip: step the focus index by one member (wrapping), or
|
|
61
|
+
* jump to an end. `-1` (no focus) steps to the first/last member. Returns `-1` for an empty selection.
|
|
62
|
+
*/
|
|
63
|
+
export function moveSelectionFocus(count, current, dir) {
|
|
64
|
+
if (count <= 0)
|
|
65
|
+
return -1;
|
|
66
|
+
if (dir === "first")
|
|
67
|
+
return 0;
|
|
68
|
+
if (dir === "last")
|
|
69
|
+
return count - 1;
|
|
70
|
+
if (current < 0)
|
|
71
|
+
return dir === "prev" ? count - 1 : 0;
|
|
72
|
+
if (dir === "next")
|
|
73
|
+
return (current + 1) % count;
|
|
74
|
+
return (current - 1 + count) % count;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Compute a virtualization window over a large selection: a `size`-length slice starting near
|
|
78
|
+
* `scroll`, clamped so the window never runs past the end. Render only `items`, offsetting by
|
|
79
|
+
* `start * itemSize`, to keep a thousand-unit selection from mounting a thousand portraits.
|
|
80
|
+
*/
|
|
81
|
+
export function selectionWindow(members, scroll, size) {
|
|
82
|
+
const count = members.length;
|
|
83
|
+
const windowSize = Math.max(1, Math.floor(size));
|
|
84
|
+
const maxStart = Math.max(0, count - windowSize);
|
|
85
|
+
const start = Math.max(0, Math.min(maxStart, Math.floor(scroll)));
|
|
86
|
+
const end = Math.min(count, start + windowSize);
|
|
87
|
+
return { start, end, items: members.slice(start, end) };
|
|
88
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/** The local player's auto-attack state for one frame. `swingTimer` counts DOWN in seconds to 0 (= a swing lands). */
|
|
2
|
+
export interface SwingPlayerInput {
|
|
3
|
+
autoAttack: boolean;
|
|
4
|
+
swingTimer: number;
|
|
5
|
+
weapon: {
|
|
6
|
+
speed: number;
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
/** The current target, or the fields the bar needs from it. */
|
|
10
|
+
export interface SwingTargetInput {
|
|
11
|
+
dead: boolean;
|
|
12
|
+
/** Entity kind; an `"object"` target (a node/chest) never shows a swing bar. */
|
|
13
|
+
kind: string;
|
|
14
|
+
}
|
|
15
|
+
/** Whether the bar shows a "ready" label or the seconds-remaining countdown. */
|
|
16
|
+
export type SwingLabelKind = "ready" | "seconds";
|
|
17
|
+
/** One frame of swing-bar state plus the cursor (`nextPeriod`/`nextTimer`) the caller carries back into the next call. */
|
|
18
|
+
export interface SwingTimerState {
|
|
19
|
+
/** Whether the bar should render at all. */
|
|
20
|
+
visible: boolean;
|
|
21
|
+
/** Fill 0..1, growing toward 1 as the next swing nears. */
|
|
22
|
+
frac: number;
|
|
23
|
+
/** True the moment the swing is ready to land. */
|
|
24
|
+
ready: boolean;
|
|
25
|
+
labelKind: SwingLabelKind;
|
|
26
|
+
/** Seconds remaining until the next swing (0 when ready). */
|
|
27
|
+
seconds: number;
|
|
28
|
+
/** Recovered swing period this frame — pass back as `prevPeriod` next call. */
|
|
29
|
+
nextPeriod: number;
|
|
30
|
+
/** This frame's timer — pass back as `prevTimer` next call to detect the reset edge. */
|
|
31
|
+
nextTimer: number;
|
|
32
|
+
}
|
|
33
|
+
/** Threshold above which a timer jump is treated as a fresh swing (period reset). */
|
|
34
|
+
export declare const SWING_EDGE_EPSILON = 0.0001;
|
|
35
|
+
/**
|
|
36
|
+
* Pure swing-timer bar state — no hidden state, no clock, no DOM. The caller
|
|
37
|
+
* threads `prevPeriod`/`prevTimer` back each frame. The period is recovered on
|
|
38
|
+
* the reset edge (when `swingTimer` jumps up = a new swing began) as
|
|
39
|
+
* `max(swingTimer, weapon.speed)`, so the fill is correct even without knowing
|
|
40
|
+
* the weapon's exact cadence. Hidden unless auto-attacking a live, non-object target.
|
|
41
|
+
*/
|
|
42
|
+
export declare function swingTimerState(player: SwingPlayerInput, target: SwingTargetInput | null, prevPeriod: number, prevTimer: number): SwingTimerState;
|