@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
|
@@ -3,9 +3,11 @@
|
|
|
3
3
|
* capture layer renders a virtual joystick, on-screen buttons, and a gesture
|
|
4
4
|
* surface, and feeds synthetic `touch:<action>` codes into the same
|
|
5
5
|
* ActionStateTracker the keyboard uses, so games gain touch play without any
|
|
6
|
-
* per-game input code.
|
|
7
|
-
*
|
|
8
|
-
*
|
|
6
|
+
* per-game input code. Session-lifecycle actions (start/restart/pause/menu/…)
|
|
7
|
+
* are left off the derived dock — they live in the start screen, pause menu, or
|
|
8
|
+
* settings sheet, never as a chip over live play. Games refine the derived
|
|
9
|
+
* defaults through TouchControlsConfig (gesture bindings, button curation) or
|
|
10
|
+
* opt out entirely with `touch: false`.
|
|
9
11
|
*/
|
|
10
12
|
import { isHotbarSlotAction } from "./actionBindings.js";
|
|
11
13
|
export const TOUCH_CODE_PREFIX = "touch:";
|
|
@@ -31,7 +33,68 @@ export function withTouchCodes(map) {
|
|
|
31
33
|
}
|
|
32
34
|
return result;
|
|
33
35
|
}
|
|
36
|
+
/** Every touch skin id, in menu order. */
|
|
37
|
+
export const TOUCH_STYLES = ["glass", "arcade", "mechanical", "minimal"];
|
|
38
|
+
/** Touch skins as `{ value, label }` rows for the Settings → Controls selector. */
|
|
39
|
+
export const TOUCH_STYLE_OPTIONS = [
|
|
40
|
+
{ value: "glass", label: "Glass" },
|
|
41
|
+
{ value: "arcade", label: "Arcade" },
|
|
42
|
+
{ value: "mechanical", label: "Mechanical" },
|
|
43
|
+
{ value: "minimal", label: "Minimal" },
|
|
44
|
+
];
|
|
45
|
+
/** Skin used when neither the game nor the player picks one. */
|
|
46
|
+
export const DEFAULT_TOUCH_STYLE = "glass";
|
|
34
47
|
const DEFAULT_LOOK_SENSITIVITY = 0.005;
|
|
48
|
+
const DEFAULT_TOUCH_LAYOUT = {
|
|
49
|
+
movement: "bottom-left",
|
|
50
|
+
actions: "bottom-right",
|
|
51
|
+
utility: "bottom-center",
|
|
52
|
+
};
|
|
53
|
+
const SHAPE_BY_ACTION = new Map([
|
|
54
|
+
["brake", "pedal"],
|
|
55
|
+
["accelerate", "pedal"],
|
|
56
|
+
["throttle", "pedal"],
|
|
57
|
+
["throttleUp", "pedal"],
|
|
58
|
+
["throttleDown", "pedal"],
|
|
59
|
+
["gas", "pedal"],
|
|
60
|
+
["clutch", "pedal"],
|
|
61
|
+
["handbrake", "lever"],
|
|
62
|
+
["gearUp", "lever"],
|
|
63
|
+
["gearDown", "lever"],
|
|
64
|
+
["shift", "lever"],
|
|
65
|
+
["boost", "lever"],
|
|
66
|
+
["fire", "trigger"],
|
|
67
|
+
["shoot", "trigger"],
|
|
68
|
+
["attack", "trigger"],
|
|
69
|
+
["primaryFire", "trigger"],
|
|
70
|
+
["secondaryFire", "trigger"],
|
|
71
|
+
["steer", "wheel"],
|
|
72
|
+
["inventory", "square"],
|
|
73
|
+
["bag", "square"],
|
|
74
|
+
["spellbook", "square"],
|
|
75
|
+
]);
|
|
76
|
+
const WHEEL_PREFIXES = ["steer"];
|
|
77
|
+
/** Slot-like verbs read as square tiles (inventory, spell/item/ability slots). */
|
|
78
|
+
const SQUARE_PREFIXES = ["spell", "slot", "item"];
|
|
79
|
+
/**
|
|
80
|
+
* Default silhouette for an action; `circle` when nothing more specific fits.
|
|
81
|
+
*
|
|
82
|
+
* @capability touch-controls default on-screen button silhouette for a touch action
|
|
83
|
+
*/
|
|
84
|
+
export function touchButtonShape(action) {
|
|
85
|
+
const direct = SHAPE_BY_ACTION.get(action);
|
|
86
|
+
if (direct !== undefined)
|
|
87
|
+
return direct;
|
|
88
|
+
for (const prefix of WHEEL_PREFIXES) {
|
|
89
|
+
if (action.startsWith(prefix))
|
|
90
|
+
return "wheel";
|
|
91
|
+
}
|
|
92
|
+
for (const prefix of SQUARE_PREFIXES) {
|
|
93
|
+
if (action.startsWith(prefix))
|
|
94
|
+
return "square";
|
|
95
|
+
}
|
|
96
|
+
return "circle";
|
|
97
|
+
}
|
|
35
98
|
const JOYSTICK_AXES = {
|
|
36
99
|
up: ["moveForward", "moveUp", "forward", "accelerate", "throttleUp", "pitchUp", "climb"],
|
|
37
100
|
down: ["moveBack", "moveBackward", "moveDown", "backward", "reverse", "brake", "throttleDown", "pitchDown", "dive"],
|
|
@@ -60,6 +123,27 @@ const UTILITY_ACTIONS = new Set([
|
|
|
60
123
|
"leaderboard",
|
|
61
124
|
]);
|
|
62
125
|
const UTILITY_PREFIXES = ["toggle", "cycle", "switch", "open", "close", "show", "hide", "zoom"];
|
|
126
|
+
/**
|
|
127
|
+
* Session-lifecycle and menu-chrome actions never auto-derive an on-screen
|
|
128
|
+
* touch button: they belong to the start screen, pause menu, or settings sheet
|
|
129
|
+
* (surfaced via `settings.actions` plus a `<SettingsTrigger>`), not the live
|
|
130
|
+
* control dock — a `restart` chip stapled over play is the anti-pattern, and a
|
|
131
|
+
* mis-tap on it wrecks the match. A game that truly wants one docked lists it
|
|
132
|
+
* explicitly in `touch.buttons`, which bypasses derivation entirely.
|
|
133
|
+
*/
|
|
134
|
+
const LIFECYCLE_ACTIONS = new Set([
|
|
135
|
+
"start",
|
|
136
|
+
"restart",
|
|
137
|
+
"reset",
|
|
138
|
+
"retry",
|
|
139
|
+
"pause",
|
|
140
|
+
"resume",
|
|
141
|
+
"menu",
|
|
142
|
+
"quit",
|
|
143
|
+
"exit",
|
|
144
|
+
"settings",
|
|
145
|
+
"options",
|
|
146
|
+
]);
|
|
63
147
|
export function touchButtonKind(action) {
|
|
64
148
|
if (UTILITY_ACTIONS.has(action))
|
|
65
149
|
return "utility";
|
|
@@ -103,17 +187,20 @@ export function deriveTouchScheme(input, { reserved, firstPerson, config }) {
|
|
|
103
187
|
const joystickMapped = new Set();
|
|
104
188
|
let joystick = null;
|
|
105
189
|
if (config?.movement !== false) {
|
|
106
|
-
const
|
|
190
|
+
const axis = config?.movement?.axis ?? "both";
|
|
191
|
+
const resolveAxis = (candidates, enabled) => {
|
|
192
|
+
if (!enabled)
|
|
193
|
+
return null;
|
|
107
194
|
const action = candidates.find((candidate) => bound.has(candidate)) ?? null;
|
|
108
195
|
if (action !== null)
|
|
109
196
|
joystickMapped.add(action);
|
|
110
197
|
return action;
|
|
111
198
|
};
|
|
112
199
|
const axes = {
|
|
113
|
-
up: resolveAxis(JOYSTICK_AXES.up),
|
|
114
|
-
down: resolveAxis(JOYSTICK_AXES.down),
|
|
115
|
-
left: resolveAxis(JOYSTICK_AXES.left),
|
|
116
|
-
right: resolveAxis(JOYSTICK_AXES.right),
|
|
200
|
+
up: resolveAxis(JOYSTICK_AXES.up, axis !== "horizontal"),
|
|
201
|
+
down: resolveAxis(JOYSTICK_AXES.down, axis !== "horizontal"),
|
|
202
|
+
left: resolveAxis(JOYSTICK_AXES.left, axis !== "vertical"),
|
|
203
|
+
right: resolveAxis(JOYSTICK_AXES.right, axis !== "vertical"),
|
|
117
204
|
};
|
|
118
205
|
joystick = axes.up === null && axes.down === null && axes.left === null && axes.right === null ? null : axes;
|
|
119
206
|
}
|
|
@@ -123,12 +210,23 @@ export function deriveTouchScheme(input, { reserved, firstPerson, config }) {
|
|
|
123
210
|
let buttons;
|
|
124
211
|
if (config?.buttons !== undefined) {
|
|
125
212
|
buttons = config.buttons.map((spec) => typeof spec === "string"
|
|
126
|
-
? {
|
|
213
|
+
? {
|
|
214
|
+
action: spec,
|
|
215
|
+
label: touchActionLabel(spec),
|
|
216
|
+
icon: null,
|
|
217
|
+
kind: touchButtonKind(spec),
|
|
218
|
+
shape: touchButtonShape(spec),
|
|
219
|
+
anchor: null,
|
|
220
|
+
image: null,
|
|
221
|
+
}
|
|
127
222
|
: {
|
|
128
223
|
action: spec.action,
|
|
129
224
|
label: spec.label ?? touchActionLabel(spec.action),
|
|
130
225
|
icon: spec.icon ?? null,
|
|
131
226
|
kind: spec.kind ?? touchButtonKind(spec.action),
|
|
227
|
+
shape: spec.shape ?? touchButtonShape(spec.action),
|
|
228
|
+
anchor: spec.anchor ?? null,
|
|
229
|
+
image: spec.image ?? null,
|
|
132
230
|
});
|
|
133
231
|
}
|
|
134
232
|
else {
|
|
@@ -137,8 +235,17 @@ export function deriveTouchScheme(input, { reserved, firstPerson, config }) {
|
|
|
137
235
|
.filter((action) => !isHotbarSlotAction(action))
|
|
138
236
|
.filter((action) => !consumedByGestures.has(action))
|
|
139
237
|
.filter((action) => !hidden.has(action))
|
|
238
|
+
.filter((action) => !LIFECYCLE_ACTIONS.has(action))
|
|
140
239
|
.filter((action) => !reserved.has(action) || BUTTONABLE_RESERVED.has(action))
|
|
141
|
-
.map((action) => ({
|
|
240
|
+
.map((action) => ({
|
|
241
|
+
action,
|
|
242
|
+
label: touchActionLabel(action),
|
|
243
|
+
icon: null,
|
|
244
|
+
kind: touchButtonKind(action),
|
|
245
|
+
shape: touchButtonShape(action),
|
|
246
|
+
anchor: null,
|
|
247
|
+
image: null,
|
|
248
|
+
}));
|
|
142
249
|
}
|
|
143
250
|
const look = config?.look ?? firstPerson;
|
|
144
251
|
if (joystick === null && buttons.length === 0 && gestures === null && !look)
|
|
@@ -149,5 +256,11 @@ export function deriveTouchScheme(input, { reserved, firstPerson, config }) {
|
|
|
149
256
|
gestures,
|
|
150
257
|
look,
|
|
151
258
|
lookSensitivity: config?.lookSensitivity ?? DEFAULT_LOOK_SENSITIVITY,
|
|
259
|
+
layout: {
|
|
260
|
+
movement: config?.layout?.movement ?? DEFAULT_TOUCH_LAYOUT.movement,
|
|
261
|
+
actions: config?.layout?.actions ?? DEFAULT_TOUCH_LAYOUT.actions,
|
|
262
|
+
utility: config?.layout?.utility ?? DEFAULT_TOUCH_LAYOUT.utility,
|
|
263
|
+
},
|
|
264
|
+
style: config?.style ?? DEFAULT_TOUCH_STYLE,
|
|
152
265
|
};
|
|
153
266
|
}
|
|
@@ -7,6 +7,7 @@ export interface ContextVerb {
|
|
|
7
7
|
/** Greyed-out and non-dispatchable when true (e.g. requirement unmet). */
|
|
8
8
|
disabled?: boolean;
|
|
9
9
|
}
|
|
10
|
+
/** Builds a {@link ContextVerb} for a right-click menu entry. */
|
|
10
11
|
export declare function contextVerb(label: string, command: string, args?: Record<string, unknown>): ContextVerb;
|
|
11
12
|
export interface ContextMenu {
|
|
12
13
|
kind: ContextTargetKind;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/** One discrete pick move: how far the pick drives into the lock this step. */
|
|
2
|
+
export type LockAction = "hardSet" | "set" | "steady" | "ease" | "drop";
|
|
3
|
+
/** Vertical row delta applied to the pick for each action. Row 0 is the shallow/top row. */
|
|
4
|
+
export declare const LOCK_ACTION_DELTA: Readonly<Record<LockAction, number>>;
|
|
5
|
+
/** The five pick actions, in display order (shallow → deep). */
|
|
6
|
+
export declare const LOCK_ACTIONS: readonly LockAction[];
|
|
7
|
+
/** Difficulty dials for one lock: board size, forgiveness band, gates, fog window, traps. */
|
|
8
|
+
export interface LockTierSpec {
|
|
9
|
+
cols: number;
|
|
10
|
+
rows: number;
|
|
11
|
+
width: number;
|
|
12
|
+
gateCount: number;
|
|
13
|
+
visibilityWindow: number;
|
|
14
|
+
allowedActions: readonly LockAction[];
|
|
15
|
+
trapCount?: number;
|
|
16
|
+
}
|
|
17
|
+
/** A generated lock board. `open[col]` holds every enterable row in that column. */
|
|
18
|
+
export interface LockSpec {
|
|
19
|
+
seed: string | number;
|
|
20
|
+
tier: LockTierSpec;
|
|
21
|
+
open: readonly (readonly number[])[];
|
|
22
|
+
gates: readonly number[];
|
|
23
|
+
traps: readonly (readonly number[])[];
|
|
24
|
+
startRow: number;
|
|
25
|
+
seatRow: number;
|
|
26
|
+
}
|
|
27
|
+
/** Outcome of one {@link stepLock} call: `advanced`/`success` move the pick, `slip`/`bind`/`trap`
|
|
28
|
+
* do not and should cost a life. */
|
|
29
|
+
export type LockStepResult = "advanced" | "slip" | "bind" | "trap" | "success";
|
|
30
|
+
/** What a revealed cell renders as: a plain open notch, an exact tumbler gate, the bolt seat
|
|
31
|
+
* (win condition), or a ward-trap that looks open but jams on contact. */
|
|
32
|
+
export type LockCellKind = "open" | "gate" | "seat" | "trap";
|
|
33
|
+
/** One cell inside the fogged {@link visibleCells} window: its board position and kind. */
|
|
34
|
+
export interface LockCell {
|
|
35
|
+
col: number;
|
|
36
|
+
row: number;
|
|
37
|
+
kind: LockCellKind;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Generate a solvable depth-puzzle lock: a "Tumbler's Path" board with a guaranteed solution
|
|
41
|
+
* path carved first, an open-row forgiveness band wrapped around it, tumbler gate columns that
|
|
42
|
+
* pinch to a single exact row, and optional ward-traps that look open but jam on contact.
|
|
43
|
+
* Deterministic: the same (seed, tier) always yields the same board.
|
|
44
|
+
*
|
|
45
|
+
* @capability lockpick a solvable grid depth-puzzle with fog-of-war, gates, and hidden traps
|
|
46
|
+
*/
|
|
47
|
+
export declare function generateLock(seed: string | number, tier: LockTierSpec): LockSpec;
|
|
48
|
+
/** Return a concrete row-per-column solution, or null if the board is unsolvable. */
|
|
49
|
+
export declare function solveLockPath(spec: LockSpec): number[] | null;
|
|
50
|
+
/** Whether the board has a path from the start row to the bolt seat at all. */
|
|
51
|
+
export declare function solveLock(spec: LockSpec): boolean;
|
|
52
|
+
/** Authoritative single step. The caller owns the lives economy: a slip/bind/trap does not
|
|
53
|
+
* advance the pick and should cost a life; advanced/success move the pick. */
|
|
54
|
+
export declare function stepLock(spec: LockSpec, col: number, row: number, action: LockAction): {
|
|
55
|
+
result: LockStepResult;
|
|
56
|
+
col: number;
|
|
57
|
+
row: number;
|
|
58
|
+
};
|
|
59
|
+
/** The render-safe slice: every open cell in columns [0, col + window]. The single source of
|
|
60
|
+
* truth for fog and the anti-cheat boundary — never serialize the full spec to a client. */
|
|
61
|
+
export declare function visibleCells(spec: LockSpec, col: number, window: number): LockCell[];
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { seededRng } from "../random/rng.js";
|
|
2
|
+
/** Vertical row delta applied to the pick for each action. Row 0 is the shallow/top row. */
|
|
3
|
+
export const LOCK_ACTION_DELTA = {
|
|
4
|
+
hardSet: -2,
|
|
5
|
+
set: -1,
|
|
6
|
+
steady: 0,
|
|
7
|
+
ease: 1,
|
|
8
|
+
drop: 2,
|
|
9
|
+
};
|
|
10
|
+
/** The five pick actions, in display order (shallow → deep). */
|
|
11
|
+
export const LOCK_ACTIONS = ["hardSet", "set", "steady", "ease", "drop"];
|
|
12
|
+
function randInt(rng, min, max) {
|
|
13
|
+
return min + Math.floor(rng() * (max - min + 1));
|
|
14
|
+
}
|
|
15
|
+
function legalDeltas(tier) {
|
|
16
|
+
return tier.allowedActions.map((action) => LOCK_ACTION_DELTA[action]);
|
|
17
|
+
}
|
|
18
|
+
function sampleGateColumns(rng, cols, count) {
|
|
19
|
+
const candidates = [];
|
|
20
|
+
for (let c = 1; c <= cols - 2; c += 1)
|
|
21
|
+
candidates.push(c);
|
|
22
|
+
for (let i = candidates.length - 1; i > 0; i -= 1) {
|
|
23
|
+
const j = randInt(rng, 0, i);
|
|
24
|
+
const tmp = candidates[i];
|
|
25
|
+
candidates[i] = candidates[j];
|
|
26
|
+
candidates[j] = tmp;
|
|
27
|
+
}
|
|
28
|
+
return candidates.slice(0, Math.max(0, Math.min(count, candidates.length))).sort((a, b) => a - b);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Generate a solvable depth-puzzle lock: a "Tumbler's Path" board with a guaranteed solution
|
|
32
|
+
* path carved first, an open-row forgiveness band wrapped around it, tumbler gate columns that
|
|
33
|
+
* pinch to a single exact row, and optional ward-traps that look open but jam on contact.
|
|
34
|
+
* Deterministic: the same (seed, tier) always yields the same board.
|
|
35
|
+
*
|
|
36
|
+
* @capability lockpick a solvable grid depth-puzzle with fog-of-war, gates, and hidden traps
|
|
37
|
+
*/
|
|
38
|
+
export function generateLock(seed, tier) {
|
|
39
|
+
const rng = seededRng(seed);
|
|
40
|
+
const rows = tier.rows;
|
|
41
|
+
const cols = tier.cols;
|
|
42
|
+
const deltas = legalDeltas(tier);
|
|
43
|
+
const path = new Array(cols);
|
|
44
|
+
path[0] = randInt(rng, 0, rows - 1);
|
|
45
|
+
for (let c = 1; c < cols; c += 1) {
|
|
46
|
+
const legal = deltas.filter((d) => path[c - 1] + d >= 0 && path[c - 1] + d <= rows - 1);
|
|
47
|
+
path[c] = path[c - 1] + (legal.length > 0 ? legal[randInt(rng, 0, legal.length - 1)] : 0);
|
|
48
|
+
}
|
|
49
|
+
const gates = sampleGateColumns(rng, cols, tier.gateCount);
|
|
50
|
+
const gateSet = new Set(gates);
|
|
51
|
+
const open = new Array(cols);
|
|
52
|
+
for (let c = 0; c < cols; c += 1) {
|
|
53
|
+
if (c === cols - 1 || gateSet.has(c)) {
|
|
54
|
+
open[c] = [path[c]];
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
const band = [];
|
|
58
|
+
for (let r = path[c] - tier.width; r <= path[c] + tier.width; r += 1) {
|
|
59
|
+
if (r >= 0 && r <= rows - 1)
|
|
60
|
+
band.push(r);
|
|
61
|
+
}
|
|
62
|
+
open[c] = band;
|
|
63
|
+
}
|
|
64
|
+
for (let c = 1; c < cols; c += 1) {
|
|
65
|
+
const prev = open[c - 1];
|
|
66
|
+
open[c] = open[c].filter((r) => prev.some((pr) => deltas.includes(r - pr)));
|
|
67
|
+
}
|
|
68
|
+
for (let c = cols - 2; c >= 0; c -= 1) {
|
|
69
|
+
const next = open[c + 1];
|
|
70
|
+
open[c] = open[c].filter((r) => next.some((nr) => deltas.includes(nr - r)));
|
|
71
|
+
}
|
|
72
|
+
const traps = open.map(() => []);
|
|
73
|
+
const trapBudget = Math.max(0, tier.trapCount ?? 0);
|
|
74
|
+
if (trapBudget > 0) {
|
|
75
|
+
const candidates = [];
|
|
76
|
+
for (let c = 1; c < cols - 1; c += 1) {
|
|
77
|
+
if (gateSet.has(c))
|
|
78
|
+
continue;
|
|
79
|
+
for (const r of open[c])
|
|
80
|
+
if (r !== path[c])
|
|
81
|
+
candidates.push([c, r]);
|
|
82
|
+
}
|
|
83
|
+
for (let i = candidates.length - 1; i > 0; i -= 1) {
|
|
84
|
+
const j = randInt(rng, 0, i);
|
|
85
|
+
const tmp = candidates[i];
|
|
86
|
+
candidates[i] = candidates[j];
|
|
87
|
+
candidates[j] = tmp;
|
|
88
|
+
}
|
|
89
|
+
for (const [c, r] of candidates.slice(0, Math.min(trapBudget, candidates.length)))
|
|
90
|
+
traps[c].push(r);
|
|
91
|
+
for (const t of traps)
|
|
92
|
+
t.sort((a, b) => a - b);
|
|
93
|
+
}
|
|
94
|
+
return { seed, tier, open, gates, traps, startRow: path[0], seatRow: path[cols - 1] };
|
|
95
|
+
}
|
|
96
|
+
/** Return a concrete row-per-column solution, or null if the board is unsolvable. */
|
|
97
|
+
export function solveLockPath(spec) {
|
|
98
|
+
const deltas = legalDeltas(spec.tier);
|
|
99
|
+
const cols = spec.open.length;
|
|
100
|
+
const safe = (c, r) => spec.open[c].includes(r) && !spec.traps[c]?.includes(r);
|
|
101
|
+
if (!safe(0, spec.startRow))
|
|
102
|
+
return null;
|
|
103
|
+
const parents = [];
|
|
104
|
+
let reach = new Set([spec.startRow]);
|
|
105
|
+
parents[0] = new Map();
|
|
106
|
+
for (let c = 1; c < cols; c += 1) {
|
|
107
|
+
const next = new Set();
|
|
108
|
+
const par = new Map();
|
|
109
|
+
for (const r of reach) {
|
|
110
|
+
for (const d of deltas) {
|
|
111
|
+
const nr = r + d;
|
|
112
|
+
if (safe(c, nr) && !par.has(nr)) {
|
|
113
|
+
par.set(nr, r);
|
|
114
|
+
next.add(nr);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
parents[c] = par;
|
|
119
|
+
reach = next;
|
|
120
|
+
if (reach.size === 0)
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
if (!reach.has(spec.seatRow))
|
|
124
|
+
return null;
|
|
125
|
+
const path = new Array(cols);
|
|
126
|
+
path[cols - 1] = spec.seatRow;
|
|
127
|
+
for (let c = cols - 1; c > 0; c -= 1)
|
|
128
|
+
path[c - 1] = parents[c].get(path[c]);
|
|
129
|
+
return path;
|
|
130
|
+
}
|
|
131
|
+
/** Whether the board has a path from the start row to the bolt seat at all. */
|
|
132
|
+
export function solveLock(spec) {
|
|
133
|
+
return solveLockPath(spec) !== null;
|
|
134
|
+
}
|
|
135
|
+
/** Authoritative single step. The caller owns the lives economy: a slip/bind/trap does not
|
|
136
|
+
* advance the pick and should cost a life; advanced/success move the pick. */
|
|
137
|
+
export function stepLock(spec, col, row, action) {
|
|
138
|
+
const rows = spec.tier.rows;
|
|
139
|
+
const newRow = Math.max(0, Math.min(rows - 1, row + LOCK_ACTION_DELTA[action]));
|
|
140
|
+
const newCol = col + 1;
|
|
141
|
+
const colOpen = spec.open[newCol];
|
|
142
|
+
if (colOpen === undefined || !colOpen.includes(newRow)) {
|
|
143
|
+
const isGate = spec.gates.includes(newCol);
|
|
144
|
+
return { result: isGate ? "bind" : "slip", col, row };
|
|
145
|
+
}
|
|
146
|
+
if (spec.traps[newCol]?.includes(newRow) === true) {
|
|
147
|
+
return { result: "trap", col, row };
|
|
148
|
+
}
|
|
149
|
+
if (newCol === spec.open.length - 1 && newRow === spec.seatRow) {
|
|
150
|
+
return { result: "success", col: newCol, row: newRow };
|
|
151
|
+
}
|
|
152
|
+
return { result: "advanced", col: newCol, row: newRow };
|
|
153
|
+
}
|
|
154
|
+
/** The render-safe slice: every open cell in columns [0, col + window]. The single source of
|
|
155
|
+
* truth for fog and the anti-cheat boundary — never serialize the full spec to a client. */
|
|
156
|
+
export function visibleCells(spec, col, window) {
|
|
157
|
+
const last = spec.open.length - 1;
|
|
158
|
+
const maxCol = window >= spec.tier.cols ? last : Math.min(last, col + window);
|
|
159
|
+
const cells = [];
|
|
160
|
+
for (let c = 0; c <= maxCol; c += 1) {
|
|
161
|
+
const trapRows = spec.traps[c];
|
|
162
|
+
for (const r of spec.open[c]) {
|
|
163
|
+
const kind = c === last ? "seat" : spec.gates.includes(c) ? "gate" : trapRows?.includes(r) === true ? "trap" : "open";
|
|
164
|
+
cells.push({ col: c, row: r, kind });
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return cells;
|
|
168
|
+
}
|
|
@@ -5,6 +5,8 @@ export interface PromptPoint {
|
|
|
5
5
|
export interface KeybindPromptDisplay {
|
|
6
6
|
kind: "keybind";
|
|
7
7
|
actionId: string;
|
|
8
|
+
/** What the interaction does, shown beside the key glyph (e.g. `"Open Chest"`, `"Talk"`); omit for key-only. */
|
|
9
|
+
label?: string;
|
|
8
10
|
}
|
|
9
11
|
export interface GaugePromptDisplay {
|
|
10
12
|
kind: "gauge";
|
|
@@ -15,7 +17,7 @@ export interface LabelPromptDisplay {
|
|
|
15
17
|
text: string;
|
|
16
18
|
}
|
|
17
19
|
export type ProximityPromptDisplay = KeybindPromptDisplay | GaugePromptDisplay | LabelPromptDisplay;
|
|
18
|
-
export declare function keybind(actionId: string): KeybindPromptDisplay;
|
|
20
|
+
export declare function keybind(actionId: string, label?: string): KeybindPromptDisplay;
|
|
19
21
|
export declare function gauge(gaugeId: string): GaugePromptDisplay;
|
|
20
22
|
export declare function label(text: string): LabelPromptDisplay;
|
|
21
23
|
export interface PromptCommand {
|
|
@@ -44,6 +46,8 @@ export interface PositionedPrompt {
|
|
|
44
46
|
* Nearest prompt strictly within its radius wins; a higher-priority prompt in
|
|
45
47
|
* range beats any lower-priority one regardless of distance; equal priority
|
|
46
48
|
* and distance keep the earliest prompt in the list.
|
|
49
|
+
*
|
|
50
|
+
* @capability proximity-prompt a "press E" contextual prompt shown near an interactable
|
|
47
51
|
*/
|
|
48
52
|
export declare function resolveActivePrompt<T extends PositionedPrompt>(playerPosition: PromptPoint, prompts: readonly T[]): T | null;
|
|
49
53
|
export declare function promptDisplaysEqual(a: ProximityPromptDisplay, b: ProximityPromptDisplay): boolean;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export function keybind(actionId) {
|
|
2
|
-
return { kind: "keybind", actionId };
|
|
1
|
+
export function keybind(actionId, label) {
|
|
2
|
+
return label === undefined ? { kind: "keybind", actionId } : { kind: "keybind", actionId, label };
|
|
3
3
|
}
|
|
4
4
|
export function gauge(gaugeId) {
|
|
5
5
|
return { kind: "gauge", gaugeId };
|
|
@@ -17,6 +17,8 @@ export function proximityPrompt({ radius, display, invoke = null }) {
|
|
|
17
17
|
* Nearest prompt strictly within its radius wins; a higher-priority prompt in
|
|
18
18
|
* range beats any lower-priority one regardless of distance; equal priority
|
|
19
19
|
* and distance keep the earliest prompt in the list.
|
|
20
|
+
*
|
|
21
|
+
* @capability proximity-prompt a "press E" contextual prompt shown near an interactable
|
|
20
22
|
*/
|
|
21
23
|
export function resolveActivePrompt(playerPosition, prompts) {
|
|
22
24
|
let active = null;
|
|
@@ -39,7 +41,7 @@ export function promptDisplaysEqual(a, b) {
|
|
|
39
41
|
if (a === b)
|
|
40
42
|
return true;
|
|
41
43
|
if (a.kind === "keybind")
|
|
42
|
-
return b.kind === "keybind" && a.actionId === b.actionId;
|
|
44
|
+
return b.kind === "keybind" && a.actionId === b.actionId && a.label === b.label;
|
|
43
45
|
if (a.kind === "gauge")
|
|
44
46
|
return b.kind === "gauge" && a.gaugeId === b.gaugeId;
|
|
45
47
|
return b.kind === "label" && a.text === b.text;
|
|
@@ -15,6 +15,11 @@ export type QteOutcome = {
|
|
|
15
15
|
atStep: string;
|
|
16
16
|
reason: "missed-window" | "wrong-action" | "too-early";
|
|
17
17
|
};
|
|
18
|
+
/**
|
|
19
|
+
* Evaluate a quick-time-event input sequence against timed hit windows.
|
|
20
|
+
*
|
|
21
|
+
* @capability qte a quick-time-event timed input sequence with hit windows
|
|
22
|
+
*/
|
|
18
23
|
export declare function evaluateQteSequence(steps: readonly QteStep[], inputs: readonly QteInputEvent[]): QteOutcome;
|
|
19
24
|
export declare function pendingQteStep(steps: readonly QteStep[], elapsedSeconds: number): QteStep | null;
|
|
20
25
|
export declare function qteProgress(steps: readonly QteStep[], elapsedSeconds: number): number;
|
package/dist/interaction/qte.js
CHANGED
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Evaluate a quick-time-event input sequence against timed hit windows.
|
|
3
|
+
*
|
|
4
|
+
* @capability qte a quick-time-event timed input sequence with hit windows
|
|
5
|
+
*/
|
|
1
6
|
export function evaluateQteSequence(steps, inputs) {
|
|
2
7
|
for (let index = 0; index < steps.length; index += 1) {
|
|
3
8
|
const step = steps[index];
|
|
@@ -16,5 +16,10 @@ export interface SkillCheckResult {
|
|
|
16
16
|
zone: SkillCheckZone;
|
|
17
17
|
}
|
|
18
18
|
export declare function skillCheckMarkerPosition(config: SkillCheckConfig, elapsedSeconds: number): number;
|
|
19
|
+
/**
|
|
20
|
+
* A timing-bar skill check that succeeds when the moving marker is released inside the target zone.
|
|
21
|
+
*
|
|
22
|
+
* @capability skill-check a timing-bar skill check where you release inside a zone
|
|
23
|
+
*/
|
|
19
24
|
export declare function skillCheckZoneAt(config: SkillCheckConfig, elapsedSeconds: number): SkillCheckZone;
|
|
20
25
|
export declare function evaluateSkillCheck(config: SkillCheckConfig, elapsedSeconds: number): SkillCheckResult;
|
|
@@ -8,6 +8,11 @@ function bounce(t, period, max) {
|
|
|
8
8
|
export function skillCheckMarkerPosition(config, elapsedSeconds) {
|
|
9
9
|
return bounce(Math.max(0, elapsedSeconds), config.markerPeriod, config.trackWidth);
|
|
10
10
|
}
|
|
11
|
+
/**
|
|
12
|
+
* A timing-bar skill check that succeeds when the moving marker is released inside the target zone.
|
|
13
|
+
*
|
|
14
|
+
* @capability skill-check a timing-bar skill check where you release inside a zone
|
|
15
|
+
*/
|
|
11
16
|
export function skillCheckZoneAt(config, elapsedSeconds) {
|
|
12
17
|
const drift = config.zoneDriftPerSecond ?? 0;
|
|
13
18
|
if (drift === 0)
|
|
@@ -35,13 +35,24 @@ export type MoveResult = {
|
|
|
35
35
|
status: "rejected";
|
|
36
36
|
reason: "invalid-slot" | "empty-slot" | "wrong-kind" | "no-space";
|
|
37
37
|
};
|
|
38
|
+
/**
|
|
39
|
+
* A bag of stackable items supporting add, remove, count, and move — the base inventory model.
|
|
40
|
+
*
|
|
41
|
+
* @capability inventory-grid a bag of stackable items with add, remove, and move
|
|
42
|
+
* @internal
|
|
43
|
+
*/
|
|
38
44
|
export declare function createEmptyInventory(layout: InventoryLayout): InventoryState;
|
|
45
|
+
/** @internal */
|
|
39
46
|
export declare function putItem(state: InventoryState, layout: InventoryLayout, traits: ItemTraits, itemId: string, count: number, options?: {
|
|
40
47
|
slot?: number;
|
|
41
48
|
}): PutResult;
|
|
49
|
+
/** @internal */
|
|
42
50
|
export declare function takeItem(state: InventoryState, itemId: string, count: number): TakeResult;
|
|
51
|
+
/** @internal */
|
|
43
52
|
export declare function countItem(state: InventoryState, itemId: string): number;
|
|
53
|
+
/** @internal */
|
|
44
54
|
export declare function hasItem(state: InventoryState, itemId: string, count: number): boolean;
|
|
55
|
+
/** @internal */
|
|
45
56
|
export declare function moveItem(from: InventoryState, fromSlot: number, to: InventoryState, toLayout: InventoryLayout, traits: ItemTraits, toSlot?: number): MoveResult;
|
|
46
57
|
export interface InventorySet<TId extends string> {
|
|
47
58
|
put(id: TId, itemId: string, count: number, options?: {
|
|
@@ -54,4 +65,5 @@ export interface InventorySet<TId extends string> {
|
|
|
54
65
|
state(id: TId): InventoryState;
|
|
55
66
|
replaceState(id: TId, state: InventoryState): void;
|
|
56
67
|
}
|
|
68
|
+
/** @internal */
|
|
57
69
|
export declare function createInventorySet<TId extends string>(layouts: Record<TId, InventoryLayout>, traits: ItemTraits): InventorySet<TId>;
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A bag of stackable items supporting add, remove, count, and move — the base inventory model.
|
|
3
|
+
*
|
|
4
|
+
* @capability inventory-grid a bag of stackable items with add, remove, and move
|
|
5
|
+
* @internal
|
|
6
|
+
*/
|
|
1
7
|
export function createEmptyInventory(layout) {
|
|
2
8
|
return { slots: new Array(layout.slots).fill(null) };
|
|
3
9
|
}
|
|
@@ -76,11 +82,13 @@ function explicitPut(state, layout, traits, itemId, count, slot) {
|
|
|
76
82
|
slots[slot] = { itemId, count: newCount };
|
|
77
83
|
return { status: "ok", state: { slots } };
|
|
78
84
|
}
|
|
85
|
+
/** @internal */
|
|
79
86
|
export function putItem(state, layout, traits, itemId, count, options) {
|
|
80
87
|
if (options?.slot !== undefined)
|
|
81
88
|
return explicitPut(state, layout, traits, itemId, count, options.slot);
|
|
82
89
|
return autoPut(state, layout, traits, itemId, count);
|
|
83
90
|
}
|
|
91
|
+
/** @internal */
|
|
84
92
|
export function takeItem(state, itemId, count) {
|
|
85
93
|
if (count <= 0)
|
|
86
94
|
return { status: "ok", state };
|
|
@@ -99,6 +107,7 @@ export function takeItem(state, itemId, count) {
|
|
|
99
107
|
}
|
|
100
108
|
return { status: "ok", state: { slots } };
|
|
101
109
|
}
|
|
110
|
+
/** @internal */
|
|
102
111
|
export function countItem(state, itemId) {
|
|
103
112
|
let total = 0;
|
|
104
113
|
for (const slot of state.slots)
|
|
@@ -106,9 +115,11 @@ export function countItem(state, itemId) {
|
|
|
106
115
|
total += slot.count;
|
|
107
116
|
return total;
|
|
108
117
|
}
|
|
118
|
+
/** @internal */
|
|
109
119
|
export function hasItem(state, itemId, count) {
|
|
110
120
|
return countItem(state, itemId) >= count;
|
|
111
121
|
}
|
|
122
|
+
/** @internal */
|
|
112
123
|
export function moveItem(from, fromSlot, to, toLayout, traits, toSlot) {
|
|
113
124
|
if (fromSlot < 0 || fromSlot >= from.slots.length)
|
|
114
125
|
return { status: "rejected", reason: "invalid-slot" };
|
|
@@ -160,6 +171,7 @@ export function moveItem(from, fromSlot, to, toLayout, traits, toSlot) {
|
|
|
160
171
|
to: sameInventory ? { slots: fromSlots } : { slots: toSlots },
|
|
161
172
|
};
|
|
162
173
|
}
|
|
174
|
+
/** @internal */
|
|
163
175
|
export function createInventorySet(layouts, traits) {
|
|
164
176
|
const states = new Map();
|
|
165
177
|
for (const id of Object.keys(layouts)) {
|
|
@@ -29,14 +29,28 @@ export interface ShapedRejected {
|
|
|
29
29
|
detail?: string;
|
|
30
30
|
}
|
|
31
31
|
export type ShapedResult<T> = ShapedPlaceResult<T> | ShapedRejected;
|
|
32
|
+
/** @internal */
|
|
32
33
|
export declare function normalizeFootprint(footprint: Footprint): Footprint;
|
|
34
|
+
/** @internal */
|
|
33
35
|
export declare function rotateFootprint(footprint: Footprint, rotation: Rotation): Footprint;
|
|
36
|
+
/** @internal */
|
|
34
37
|
export declare function occupiedCells(footprint: Footprint, origin: Cell, rotation: Rotation): Cell[];
|
|
38
|
+
/**
|
|
39
|
+
* A spatial grid inventory that holds shaped multi-cell items, Resident-Evil/Tarkov style.
|
|
40
|
+
*
|
|
41
|
+
* @capability tetris-inventory a spatial grid inventory holding shaped multi-cell items
|
|
42
|
+
* @internal
|
|
43
|
+
*/
|
|
35
44
|
export declare function createShapedGrid<T>(width: number, height: number): ShapedGrid<T>;
|
|
45
|
+
/** @internal */
|
|
36
46
|
export declare function canPlace<T>(grid: ShapedGrid<T>, footprint: Footprint, origin: Cell, rotation: Rotation, ignoreId?: string): ShapedRejection | null;
|
|
47
|
+
/** @internal */
|
|
37
48
|
export declare function placeShaped<T>(grid: ShapedGrid<T>, item: ShapedItem<T>, origin: Cell, rotation?: Rotation): ShapedResult<T>;
|
|
49
|
+
/** @internal */
|
|
38
50
|
export declare function removeShaped<T>(grid: ShapedGrid<T>, id: string): ShapedResult<T>;
|
|
51
|
+
/** @internal */
|
|
39
52
|
export declare function moveShaped<T>(grid: ShapedGrid<T>, id: string, origin: Cell, rotation?: Rotation): ShapedResult<T>;
|
|
53
|
+
/** @internal */
|
|
40
54
|
export declare function cellOccupant<T>(grid: ShapedGrid<T>, cell: Cell): string | null;
|
|
41
55
|
export interface GridAdjacencyQuery {
|
|
42
56
|
cellsOf(id: string): readonly Cell[];
|
|
@@ -44,9 +58,11 @@ export interface GridAdjacencyQuery {
|
|
|
44
58
|
touching(idA: string, idB: string): boolean;
|
|
45
59
|
adjacentCells(cells: readonly Cell[]): readonly Cell[];
|
|
46
60
|
}
|
|
61
|
+
/** @internal */
|
|
47
62
|
export declare function gridAdjacencyQuery<T>(grid: ShapedGrid<T>, options?: {
|
|
48
63
|
diagonal?: boolean;
|
|
49
64
|
}): GridAdjacencyQuery;
|
|
65
|
+
/** @internal */
|
|
50
66
|
export declare function cellFromPoint(point: {
|
|
51
67
|
x: number;
|
|
52
68
|
y: number;
|