@jgengine/core 0.10.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -2
- package/LICENSE +203 -661
- package/README.md +1 -1
- package/dist/ai/crowd.d.ts +55 -0
- package/dist/ai/crowd.js +114 -0
- package/dist/ai/flock.d.ts +5 -2
- package/dist/ai/flock.js +5 -2
- package/dist/ai/groupAssist.d.ts +1 -0
- package/dist/ai/groupAssist.js +1 -0
- package/dist/ai/heatSystem.d.ts +76 -0
- package/dist/ai/heatSystem.js +97 -0
- package/dist/ai/interestScheduler.d.ts +107 -0
- package/dist/ai/interestScheduler.js +118 -0
- package/dist/ai/jobBoard.d.ts +1 -0
- package/dist/ai/jobBoard.js +1 -0
- package/dist/ai/laneSelect.d.ts +5 -2
- package/dist/ai/laneSelect.js +5 -2
- package/dist/ai/mobBrain.d.ts +1 -0
- package/dist/ai/mobBrain.js +1 -0
- package/dist/ai/spawnDirector.d.ts +7 -2
- package/dist/ai/spawnDirector.js +18 -15
- package/dist/ai/spawnPoint.d.ts +3 -1
- package/dist/ai/spawnPoint.js +3 -1
- package/dist/ai/targetAcquisition.d.ts +84 -0
- package/dist/ai/targetAcquisition.js +92 -0
- package/dist/anim/easing.d.ts +19 -0
- package/dist/anim/easing.js +19 -0
- package/dist/anim/oscillator.d.ts +12 -0
- package/dist/anim/oscillator.js +25 -0
- package/dist/area/areaEffectField.d.ts +127 -0
- package/dist/area/areaEffectField.js +175 -0
- package/dist/area/stackPolicy.d.ts +47 -0
- package/dist/area/stackPolicy.js +99 -0
- package/dist/authoring.d.ts +1 -0
- package/dist/authoring.js +1 -0
- package/dist/board/laneBoard.d.ts +13 -0
- package/dist/board/laneBoard.js +13 -0
- package/dist/board/timelineBoard.d.ts +10 -0
- package/dist/board/timelineBoard.js +10 -0
- package/dist/combat/abilityKit.d.ts +18 -0
- package/dist/combat/abilityKit.js +24 -9
- package/dist/combat/animationState.d.ts +5 -0
- package/dist/combat/animationState.js +5 -0
- package/dist/combat/breakMeters.d.ts +10 -0
- package/dist/combat/breakMeters.js +10 -0
- package/dist/combat/castRunner.d.ts +5 -0
- package/dist/combat/castRunner.js +5 -0
- package/dist/combat/comboPoints.d.ts +5 -0
- package/dist/combat/comboPoints.js +5 -0
- package/dist/combat/comboString.d.ts +5 -0
- package/dist/combat/comboString.js +5 -0
- package/dist/combat/damageInterceptors.d.ts +192 -0
- package/dist/combat/damageInterceptors.js +251 -0
- package/dist/combat/damageMatchup.d.ts +68 -0
- package/dist/combat/damageMatchup.js +42 -0
- package/dist/combat/damageResolution.d.ts +63 -0
- package/dist/combat/damageResolution.js +50 -0
- package/dist/combat/death.d.ts +7 -1
- package/dist/combat/death.js +5 -0
- package/dist/combat/deathReason.d.ts +14 -0
- package/dist/combat/deathReason.js +1 -0
- package/dist/combat/defensiveWindow.d.ts +5 -0
- package/dist/combat/defensiveWindow.js +5 -0
- package/dist/combat/dotField.d.ts +5 -1
- package/dist/combat/dotField.js +5 -1
- package/dist/combat/downed.d.ts +5 -0
- package/dist/combat/downed.js +5 -0
- package/dist/combat/effects.d.ts +5 -0
- package/dist/combat/effects.js +5 -0
- package/dist/combat/encounterSequence.d.ts +258 -0
- package/dist/combat/encounterSequence.js +426 -0
- package/dist/combat/hitReaction.d.ts +57 -1
- package/dist/combat/hitReaction.js +45 -5
- package/dist/combat/magazine.d.ts +54 -0
- package/dist/combat/magazine.js +96 -0
- package/dist/combat/projectiles.d.ts +5 -0
- package/dist/combat/projectiles.js +32 -14
- package/dist/combat/receivedDamage.d.ts +117 -0
- package/dist/combat/receivedDamage.js +92 -0
- package/dist/combat/regenShield.d.ts +5 -1
- package/dist/combat/regenShield.js +5 -1
- package/dist/combat/renderCues.d.ts +51 -0
- package/dist/combat/renderCues.js +44 -0
- package/dist/combat/resourcePool.d.ts +5 -0
- package/dist/combat/resourcePool.js +5 -0
- package/dist/combat/rewardAllocation.d.ts +121 -0
- package/dist/combat/rewardAllocation.js +251 -0
- package/dist/combat/shotOrigin.d.ts +18 -1
- package/dist/combat/shotOrigin.js +39 -0
- package/dist/combat/statusApplication.d.ts +96 -0
- package/dist/combat/statusApplication.js +81 -0
- package/dist/combat/telegraph.d.ts +11 -2
- package/dist/combat/telegraph.js +11 -2
- package/dist/combat/thresholdCrossings.d.ts +85 -0
- package/dist/combat/thresholdCrossings.js +116 -0
- package/dist/combat.d.ts +34 -0
- package/dist/combat.js +34 -0
- package/dist/commands/commandRegistry.d.ts +11 -0
- package/dist/commands/commandRegistry.js +9 -2
- package/dist/crafting/crop.d.ts +18 -0
- package/dist/crafting/crop.js +18 -0
- package/dist/crafting/production.d.ts +5 -0
- package/dist/crafting/production.js +5 -0
- package/dist/devtools/rewriteTunables.d.ts +17 -0
- package/dist/devtools/rewriteTunables.js +276 -0
- package/dist/devtools/saveEndpoint.d.ts +46 -0
- package/dist/devtools/saveEndpoint.js +48 -0
- package/dist/devtools/transformTunables.d.ts +3 -0
- package/dist/devtools/transformTunables.js +3 -0
- package/dist/devtools/tunableSchema.d.ts +31 -0
- package/dist/devtools/tunableSchema.js +31 -0
- package/dist/economy/currency.d.ts +12 -1
- package/dist/economy/currency.js +12 -1
- package/dist/economy/listingBook.d.ts +91 -0
- package/dist/economy/listingBook.js +144 -0
- package/dist/economy/resourceLedger.d.ts +222 -0
- package/dist/economy/resourceLedger.js +353 -0
- package/dist/economy/sharedWallet.d.ts +14 -0
- package/dist/economy/sharedWallet.js +14 -0
- package/dist/economy/techTree.d.ts +12 -0
- package/dist/economy/techTree.js +12 -0
- package/dist/economy/wallet.d.ts +26 -2
- package/dist/economy/wallet.js +35 -6
- package/dist/editor/commands.d.ts +190 -7
- package/dist/editor/commands.js +727 -55
- package/dist/editor/document.d.ts +159 -13
- package/dist/editor/document.js +750 -19
- package/dist/editor/grid.d.ts +229 -0
- package/dist/editor/grid.js +366 -0
- package/dist/editor/gridAdapters.d.ts +80 -0
- package/dist/editor/gridAdapters.js +134 -0
- package/dist/editor/index.d.ts +73 -6
- package/dist/editor/index.js +6 -2
- package/dist/editor/liveSync.d.ts +127 -0
- package/dist/editor/liveSync.js +249 -0
- package/dist/editor/runtimeInspector.d.ts +88 -0
- package/dist/editor/runtimeInspector.js +239 -0
- package/dist/editor/types.d.ts +107 -1
- package/dist/faction/reputation.d.ts +5 -0
- package/dist/faction/reputation.js +5 -0
- package/dist/format/distance.d.ts +17 -0
- package/dist/format/distance.js +18 -0
- package/dist/format/duration.d.ts +27 -0
- package/dist/format/duration.js +45 -0
- package/dist/format/speed.d.ts +17 -0
- package/dist/format/speed.js +25 -0
- package/dist/game/connectedPlayers.d.ts +6 -4
- package/dist/game/connectedPlayers.js +2 -2
- package/dist/game/cosmetics.d.ts +9 -0
- package/dist/game/cosmetics.js +16 -0
- package/dist/game/defineGame.d.ts +100 -2
- package/dist/game/defineGame.js +39 -2
- package/dist/game/defineSystem.d.ts +88 -0
- package/dist/game/defineSystem.js +45 -0
- package/dist/game/dialogue.d.ts +33 -0
- package/dist/game/dialogue.js +21 -0
- package/dist/game/events.d.ts +35 -13
- package/dist/game/events.js +5 -0
- package/dist/game/feed.d.ts +33 -0
- package/dist/game/feed.js +35 -2
- package/dist/game/gamePhase.d.ts +11 -0
- package/dist/game/gamePhase.js +16 -0
- package/dist/game/leaderboard.d.ts +5 -0
- package/dist/game/leaderboard.js +5 -0
- package/dist/game/loadout.d.ts +5 -0
- package/dist/game/loadout.js +5 -0
- package/dist/game/lootFilter.d.ts +2 -0
- package/dist/game/lootFilter.js +2 -0
- package/dist/game/lootPipeline.d.ts +164 -0
- package/dist/game/lootPipeline.js +216 -0
- package/dist/game/lootTable.d.ts +19 -2
- package/dist/game/lootTable.js +15 -5
- package/dist/game/objectives.d.ts +43 -0
- package/dist/game/objectives.js +36 -0
- package/dist/game/paramLayers.d.ts +148 -0
- package/dist/game/paramLayers.js +185 -0
- package/dist/game/ping.d.ts +5 -0
- package/dist/game/ping.js +5 -0
- package/dist/game/playableGame.d.ts +92 -7
- package/dist/game/quest.d.ts +8 -0
- package/dist/game/quest.js +29 -0
- package/dist/game/race.d.ts +141 -0
- package/dist/game/race.js +169 -0
- package/dist/game/recordBook.d.ts +3 -1
- package/dist/game/recordBook.js +4 -1
- package/dist/game/ruleSelection.d.ts +75 -0
- package/dist/game/ruleSelection.js +127 -0
- package/dist/game/runDraft.d.ts +5 -0
- package/dist/game/runDraft.js +5 -0
- package/dist/game/saveStore.d.ts +111 -0
- package/dist/game/saveStore.js +312 -0
- package/dist/game/snapshotHistory.d.ts +67 -0
- package/dist/game/snapshotHistory.js +95 -0
- package/dist/game/social.d.ts +38 -1
- package/dist/game/social.js +71 -0
- package/dist/game/spawnPoints.d.ts +5 -0
- package/dist/game/spawnPoints.js +5 -0
- package/dist/game/systemRuntime.d.ts +50 -0
- package/dist/game/systemRuntime.js +157 -0
- package/dist/game/systemSchedule.d.ts +72 -0
- package/dist/game/systemSchedule.js +242 -0
- package/dist/game/toasts.d.ts +43 -0
- package/dist/game/toasts.js +44 -0
- package/dist/game/trade.d.ts +10 -0
- package/dist/game/trade.js +10 -0
- package/dist/game/unlocks.d.ts +8 -0
- package/dist/game/unlocks.js +16 -0
- package/dist/game/vfxInstance.d.ts +138 -0
- package/dist/game/vfxInstance.js +96 -0
- package/dist/game/worldItem.d.ts +17 -4
- package/dist/game/worldItem.js +17 -4
- package/dist/gameplay.d.ts +91 -0
- package/dist/gameplay.js +91 -0
- package/dist/index.d.ts +5 -14
- package/dist/index.js +5 -14
- package/dist/input/actionBindings.d.ts +23 -6
- package/dist/input/actionBindings.js +23 -6
- package/dist/input/axisInput.d.ts +7 -2
- package/dist/input/axisInput.js +7 -2
- package/dist/input/controlGroups.d.ts +67 -0
- package/dist/input/controlGroups.js +41 -0
- package/dist/input/touchScheme.d.ts +82 -6
- package/dist/input/touchScheme.js +123 -10
- package/dist/interaction/lockpick.d.ts +61 -0
- package/dist/interaction/lockpick.js +168 -0
- package/dist/interaction/proximityPrompt.d.ts +2 -0
- package/dist/interaction/proximityPrompt.js +2 -0
- package/dist/interaction/qte.d.ts +5 -0
- package/dist/interaction/qte.js +5 -0
- package/dist/interaction/skillCheck.d.ts +5 -0
- package/dist/interaction/skillCheck.js +5 -0
- package/dist/inventory/inventoryModel.d.ts +12 -0
- package/dist/inventory/inventoryModel.js +12 -0
- package/dist/inventory/shapedGrid.d.ts +16 -0
- package/dist/inventory/shapedGrid.js +16 -0
- package/dist/inventory/slotModel.d.ts +10 -0
- package/dist/inventory/slotModel.js +10 -0
- package/dist/item/durability.d.ts +5 -0
- package/dist/item/durability.js +5 -0
- package/dist/item/itemIdentity.d.ts +171 -0
- package/dist/item/itemIdentity.js +138 -0
- package/dist/item/itemInstanceRegistry.d.ts +32 -0
- package/dist/item/itemInstanceRegistry.js +34 -0
- package/dist/item/itemgen.d.ts +163 -0
- package/dist/item/itemgen.js +151 -0
- package/dist/item/modularItem.d.ts +5 -0
- package/dist/item/modularItem.js +5 -0
- package/dist/item/use.d.ts +5 -0
- package/dist/item/use.js +5 -0
- package/dist/item/useBehavior.d.ts +142 -0
- package/dist/item/useBehavior.js +105 -0
- package/dist/item/weapon.d.ts +5 -0
- package/dist/item/weapon.js +5 -0
- package/dist/math/scalar.d.ts +25 -0
- package/dist/math/scalar.js +47 -0
- package/dist/meta/changelog.d.ts +4 -1
- package/dist/meta/changelog.js +16 -2
- package/dist/movement/avoidance.d.ts +45 -0
- package/dist/movement/avoidance.js +123 -0
- package/dist/movement/cameraRig.d.ts +8 -0
- package/dist/movement/cameraRig.js +8 -0
- package/dist/movement/dash.d.ts +11 -0
- package/dist/movement/dash.js +11 -0
- package/dist/movement/formation.d.ts +135 -0
- package/dist/movement/formation.js +194 -0
- package/dist/movement/glideModel.d.ts +5 -0
- package/dist/movement/glideModel.js +5 -0
- package/dist/movement/grappleSwing.d.ts +5 -0
- package/dist/movement/grappleSwing.js +5 -0
- package/dist/movement/leaderTrail.d.ts +5 -0
- package/dist/movement/leaderTrail.js +5 -0
- package/dist/movement/movementModel.d.ts +35 -8
- package/dist/movement/movementModel.js +42 -14
- package/dist/movement/playerMovement.js +65 -10
- package/dist/movement/poseState.d.ts +13 -0
- package/dist/movement/poseState.js +16 -0
- package/dist/movement/steering.d.ts +8 -0
- package/dist/movement/steering.js +18 -0
- package/dist/multiplayer/combatSnapshot.d.ts +3 -0
- package/dist/multiplayer/combatSnapshot.js +3 -0
- package/dist/multiplayer/lagCompensation.d.ts +5 -0
- package/dist/multiplayer/lagCompensation.js +5 -0
- package/dist/multiplayer/presenceModel.d.ts +9 -1
- package/dist/multiplayer/presenceModel.js +9 -1
- package/dist/multiplayer/simultaneousCommit.d.ts +3 -0
- package/dist/multiplayer/simultaneousCommit.js +3 -0
- package/dist/multiplayer.d.ts +11 -0
- package/dist/multiplayer.js +11 -0
- package/dist/nav/pathFollow.d.ts +57 -0
- package/dist/nav/pathFollow.js +109 -0
- package/dist/orders/orderKinds.d.ts +156 -0
- package/dist/orders/orderKinds.js +197 -0
- package/dist/orders/orderQueue.d.ts +208 -0
- package/dist/orders/orderQueue.js +211 -0
- package/dist/physics/drivableVehicle.d.ts +29 -0
- package/dist/physics/drivableVehicle.js +16 -0
- package/dist/physics/kinematicVehicle.d.ts +21 -1
- package/dist/physics/kinematicVehicle.js +23 -8
- package/dist/physics/physicsWorld.d.ts +24 -12
- package/dist/physics/physicsWorld.js +11 -5
- package/dist/physics/radialImpulse.d.ts +25 -0
- package/dist/physics/radialImpulse.js +27 -0
- package/dist/procedural.d.ts +3 -0
- package/dist/procedural.js +3 -0
- package/dist/progression/statGraph.d.ts +116 -0
- package/dist/progression/statGraph.js +318 -0
- package/dist/puzzle/cellGrid.d.ts +9 -0
- package/dist/puzzle/cellGrid.js +9 -0
- package/dist/puzzle/fallingPiece.d.ts +9 -0
- package/dist/puzzle/fallingPiece.js +9 -0
- package/dist/puzzle/nonogram.d.ts +39 -0
- package/dist/puzzle/nonogram.js +136 -0
- package/dist/random/nameGen.d.ts +5 -0
- package/dist/random/nameGen.js +5 -0
- package/dist/random/pick.d.ts +8 -0
- package/dist/random/pick.js +31 -0
- package/dist/random/rng.d.ts +22 -0
- package/dist/random/rng.js +28 -8
- package/dist/random/seedLink.d.ts +4 -0
- package/dist/random/seedLink.js +4 -0
- package/dist/relation/keyedValues.d.ts +54 -0
- package/dist/relation/keyedValues.js +115 -0
- package/dist/relation/thresholds.d.ts +62 -0
- package/dist/relation/thresholds.js +62 -0
- package/dist/render/color.d.ts +12 -0
- package/dist/render/color.js +26 -0
- package/dist/render/lookPreset.d.ts +41 -0
- package/dist/render/lookPreset.js +29 -0
- package/dist/render/postProcessing.d.ts +20 -0
- package/dist/render/postProcessing.js +21 -1
- package/dist/rules/predicate.d.ts +53 -0
- package/dist/rules/predicate.js +64 -0
- package/dist/rules/ruleEffects.d.ts +38 -0
- package/dist/rules/ruleEffects.js +37 -0
- package/dist/rules/triggeredRules.d.ts +160 -0
- package/dist/rules/triggeredRules.js +241 -0
- package/dist/runtime/adapter.d.ts +42 -3
- package/dist/runtime/adapter.js +44 -1
- package/dist/runtime/cameraDirector.d.ts +1 -0
- package/dist/runtime/cameraDirector.js +1 -0
- package/dist/runtime/commandRunner.d.ts +1 -0
- package/dist/runtime/commandRunner.js +1 -0
- package/dist/runtime/context/combatFx.d.ts +23 -0
- package/dist/runtime/context/combatFx.js +161 -0
- package/dist/runtime/context/registries.d.ts +13 -0
- package/dist/runtime/context/registries.js +84 -0
- package/dist/runtime/context/worldItems.d.ts +21 -0
- package/dist/runtime/context/worldItems.js +37 -0
- package/dist/runtime/descriptors/baseline.d.ts +48 -0
- package/dist/runtime/descriptors/baseline.js +134 -0
- package/dist/runtime/descriptors/features.d.ts +74 -0
- package/dist/runtime/descriptors/features.js +281 -0
- package/dist/runtime/gameContext.d.ts +114 -13
- package/dist/runtime/gameContext.js +303 -395
- package/dist/runtime/gameRuntime.d.ts +1 -0
- package/dist/runtime/gameRuntime.js +1 -0
- package/dist/runtime/headlessRunner.d.ts +60 -0
- package/dist/runtime/headlessRunner.js +44 -0
- package/dist/runtime/hostPersistence.d.ts +12 -0
- package/dist/runtime/hostPersistence.js +12 -0
- package/dist/runtime/hostedGameRunner.d.ts +8 -3
- package/dist/runtime/hostedGameRunner.js +26 -3
- package/dist/runtime/hostedWorldSession.d.ts +12 -4
- package/dist/runtime/hostedWorldSession.js +11 -4
- package/dist/runtime/inputSnapshot.d.ts +8 -3
- package/dist/runtime/inputSnapshot.js +6 -2
- package/dist/runtime/motionIntents.d.ts +11 -2
- package/dist/runtime/motionIntents.js +16 -2
- package/dist/runtime/perContext.d.ts +15 -0
- package/dist/runtime/perContext.js +21 -0
- package/dist/runtime/runtimeSave.d.ts +79 -0
- package/dist/runtime/runtimeSave.js +105 -0
- package/dist/runtime/save.d.ts +4 -0
- package/dist/runtime/save.js +4 -0
- package/dist/runtime/snapshot.d.ts +7 -0
- package/dist/runtime/snapshot.js +7 -0
- package/dist/runtime/visibility.d.ts +2 -1
- package/dist/runtime/visibility.js +2 -1
- package/dist/runtime/worldChannel.d.ts +7 -3
- package/dist/runtime/worldChannel.js +51 -6
- package/dist/runtime/worldMirror.d.ts +14 -2
- package/dist/runtime/worldMirror.js +15 -2
- package/dist/runtime/worldProjection.d.ts +47 -0
- package/dist/runtime/worldProjection.js +52 -0
- package/dist/runtime/worldReplication.d.ts +30 -7
- package/dist/runtime/worldReplication.js +41 -9
- package/dist/runtime/worldSnapshot.d.ts +30 -3
- package/dist/runtime/worldSnapshot.js +20 -5
- package/dist/scene/assetCatalog.d.ts +21 -0
- package/dist/scene/assetCatalog.js +4 -0
- package/dist/scene/assetDiagnostics.d.ts +69 -0
- package/dist/scene/assetDiagnostics.js +110 -0
- package/dist/scene/assetGenerator.d.ts +65 -0
- package/dist/scene/assetGenerator.js +64 -0
- package/dist/scene/assetSpace.d.ts +137 -0
- package/dist/scene/assetSpace.js +259 -0
- package/dist/scene/authoredTriggers.d.ts +169 -0
- package/dist/scene/authoredTriggers.js +340 -0
- package/dist/scene/behaviorRuntime.d.ts +75 -0
- package/dist/scene/behaviorRuntime.js +217 -0
- package/dist/scene/behaviors.d.ts +14 -2
- package/dist/scene/behaviors.js +7 -2
- package/dist/scene/bodyBind.d.ts +60 -0
- package/dist/scene/bodyBind.js +51 -0
- package/dist/scene/builtinSceneKinds.d.ts +5 -0
- package/dist/scene/builtinSceneKinds.js +62 -0
- package/dist/scene/colliders.d.ts +13 -1
- package/dist/scene/colliders.js +37 -1
- package/dist/scene/entityStats.d.ts +11 -2
- package/dist/scene/entityStats.js +11 -2
- package/dist/scene/entityStore.d.ts +12 -1
- package/dist/scene/entityStore.js +15 -0
- package/dist/scene/facing.d.ts +18 -0
- package/dist/scene/facing.js +26 -0
- package/dist/scene/modelSockets.d.ts +33 -0
- package/dist/scene/modelSockets.js +29 -0
- package/dist/scene/objectQuery.d.ts +2 -0
- package/dist/scene/objectQuery.js +2 -0
- package/dist/scene/objectStore.d.ts +4 -0
- package/dist/scene/objectStore.js +6 -0
- package/dist/scene/possession.d.ts +8 -0
- package/dist/scene/possession.js +14 -0
- package/dist/scene/roster.d.ts +3 -0
- package/dist/scene/roster.js +12 -0
- package/dist/scene/sceneKinds.d.ts +240 -0
- package/dist/scene/sceneKinds.js +214 -0
- package/dist/scene/sceneOwnership.d.ts +169 -0
- package/dist/scene/sceneOwnership.js +179 -0
- package/dist/scene/selectionBookmarks.d.ts +93 -0
- package/dist/scene/selectionBookmarks.js +122 -0
- package/dist/scene/vehicleSeat.d.ts +68 -0
- package/dist/scene/vehicleSeat.js +59 -0
- package/dist/sensor/concealment.d.ts +3 -0
- package/dist/sensor/concealment.js +3 -0
- package/dist/sensor/freezeMonitor.d.ts +1 -0
- package/dist/sensor/freezeMonitor.js +1 -0
- package/dist/sensor/frustumSensor.d.ts +7 -3
- package/dist/sensor/frustumSensor.js +7 -3
- package/dist/sensor/hiddenStateProbe.d.ts +5 -2
- package/dist/sensor/hiddenStateProbe.js +5 -2
- package/dist/sensor/recordingBuffer.d.ts +2 -1
- package/dist/sensor/recordingBuffer.js +2 -1
- package/dist/sensor/replayLoop.d.ts +6 -2
- package/dist/sensor/replayLoop.js +6 -2
- package/dist/sensor/revealQuery.d.ts +2 -1
- package/dist/sensor/revealQuery.js +2 -1
- package/dist/sensor/visionCone.d.ts +10 -3
- package/dist/sensor/visionCone.js +10 -3
- package/dist/session/contestedChannel.d.ts +1 -0
- package/dist/session/contestedChannel.js +1 -0
- package/dist/session/extraction.d.ts +1 -0
- package/dist/session/extraction.js +1 -0
- package/dist/session/roles.d.ts +6 -0
- package/dist/session/roles.js +6 -0
- package/dist/session/roundState.d.ts +8 -0
- package/dist/session/roundState.js +2 -0
- package/dist/settings/settingsModel.d.ts +1 -0
- package/dist/settings/settingsModel.js +1 -0
- package/dist/stats/accumulatorMeter.d.ts +6 -0
- package/dist/stats/accumulatorMeter.js +6 -0
- package/dist/stats/eventMeter.d.ts +5 -0
- package/dist/stats/eventMeter.js +5 -0
- package/dist/stats/rollCheck.d.ts +5 -0
- package/dist/stats/rollCheck.js +5 -0
- package/dist/stats/statModifiers.d.ts +5 -0
- package/dist/stats/statModifiers.js +5 -0
- package/dist/store/defineKeyedStore.d.ts +38 -0
- package/dist/store/defineKeyedStore.js +42 -0
- package/dist/store/defineStore.d.ts +33 -0
- package/dist/store/defineStore.js +35 -0
- package/dist/store/observableKeyedStore.d.ts +5 -0
- package/dist/store/observableKeyedStore.js +34 -2
- package/dist/survival/decayMeter.d.ts +55 -0
- package/dist/survival/decayMeter.js +130 -55
- package/dist/survival/moodle.d.ts +2 -0
- package/dist/survival/regionHealth.d.ts +6 -0
- package/dist/survival/regionHealth.js +5 -0
- package/dist/tactics/fallingGrid.d.ts +4 -2
- package/dist/tactics/fallingGrid.js +4 -2
- package/dist/tactics/predictiveQuery.d.ts +3 -0
- package/dist/tactics/predictiveQuery.js +3 -0
- package/dist/tactics/snapshot.d.ts +2 -0
- package/dist/tactics/snapshot.js +2 -0
- package/dist/tactics/surface.d.ts +1 -0
- package/dist/tactics/surface.js +1 -0
- package/dist/tactics/tacticalGrid.d.ts +1 -0
- package/dist/tactics/tacticalGrid.js +1 -0
- package/dist/time/beatClock.d.ts +14 -4
- package/dist/time/beatClock.js +14 -4
- package/dist/time/calendarClock.d.ts +3 -0
- package/dist/time/calendarClock.js +3 -0
- package/dist/time/idleProgress.d.ts +4 -0
- package/dist/time/idleProgress.js +4 -0
- package/dist/time/simClock.d.ts +2 -0
- package/dist/time/simClock.js +20 -5
- package/dist/ui/actionModel.d.ts +110 -0
- package/dist/ui/actionModel.js +159 -0
- package/dist/ui/gameLayout.d.ts +30 -11
- package/dist/ui/gameLayout.js +30 -11
- package/dist/ui/hudDocument.d.ts +114 -0
- package/dist/ui/hudDocument.js +220 -0
- package/dist/ui/hudLayout.d.ts +33 -1
- package/dist/ui/hudLayout.js +204 -17
- package/dist/ui/selectionModel.d.ts +92 -0
- package/dist/ui/selectionModel.js +88 -0
- package/dist/ui/tooltipModel.d.ts +63 -0
- package/dist/ui/tooltipModel.js +82 -0
- package/dist/ui.d.ts +15 -0
- package/dist/ui.js +15 -0
- package/dist/visibility/bounds.d.ts +8 -1
- package/dist/visibility/bounds.js +8 -1
- package/dist/visibility/frustum.d.ts +12 -3
- package/dist/visibility/frustum.js +12 -3
- package/dist/work/jobQueue.d.ts +201 -0
- package/dist/work/jobQueue.js +253 -0
- package/dist/work/unitTraining.d.ts +58 -0
- package/dist/work/unitTraining.js +52 -0
- package/dist/world/authoredObjects.d.ts +58 -0
- package/dist/world/authoredObjects.js +69 -0
- package/dist/world/buildingGenerator.d.ts +18 -0
- package/dist/world/buildingGenerator.js +62 -0
- package/dist/world/buildings.d.ts +5 -0
- package/dist/world/buildings.js +5 -0
- package/dist/world/catenary.d.ts +22 -0
- package/dist/world/catenary.js +69 -0
- package/dist/world/features.d.ts +115 -7
- package/dist/world/features.js +56 -5
- package/dist/world/footprintGrid.d.ts +59 -0
- package/dist/world/footprintGrid.js +141 -0
- package/dist/world/geometry.d.ts +64 -0
- package/dist/world/geometry.js +94 -0
- package/dist/world/grassKind.d.ts +51 -0
- package/dist/world/grassKind.js +101 -0
- package/dist/world/pathInstances.d.ts +27 -0
- package/dist/world/pathInstances.js +27 -0
- package/dist/world/pathTerrain.d.ts +80 -0
- package/dist/world/pathTerrain.js +142 -0
- package/dist/world/placeAsset.d.ts +81 -0
- package/dist/world/placeAsset.js +77 -0
- package/dist/world/placement.d.ts +4 -0
- package/dist/world/placement.js +4 -0
- package/dist/world/placementController.d.ts +6 -0
- package/dist/world/placementController.js +6 -0
- package/dist/world/polyline.d.ts +34 -0
- package/dist/world/polyline.js +81 -0
- package/dist/world/roads.d.ts +8 -0
- package/dist/world/roads.js +38 -0
- package/dist/world/scatterRegion.d.ts +164 -0
- package/dist/world/scatterRegion.js +409 -0
- package/dist/world/sceneShapes.d.ts +43 -0
- package/dist/world/sceneShapes.js +1 -0
- package/dist/world/segment.d.ts +27 -0
- package/dist/world/segment.js +43 -0
- package/dist/world/soilKind.d.ts +48 -0
- package/dist/world/soilKind.js +92 -0
- package/dist/world/spatialSample.d.ts +241 -0
- package/dist/world/spatialSample.js +465 -0
- package/dist/world/terraform.d.ts +213 -1
- package/dist/world/terraform.js +655 -20
- package/dist/world/terrain.d.ts +119 -20
- package/dist/world/terrain.js +247 -41
- package/dist/world/terrainGuides.d.ts +182 -0
- package/dist/world/terrainGuides.js +343 -0
- package/dist/world/vec2.d.ts +81 -0
- package/dist/world/vec2.js +128 -0
- package/dist/world/vec3.d.ts +49 -0
- package/dist/world/vec3.js +76 -0
- package/dist/world/vegetation.d.ts +71 -0
- package/dist/world/vegetation.js +151 -0
- package/dist/world/visibilityField.d.ts +154 -0
- package/dist/world/visibilityField.js +271 -0
- package/dist/world/volumetricClouds.d.ts +52 -0
- package/dist/world/volumetricClouds.js +43 -0
- package/dist/world/walls.d.ts +9 -0
- package/dist/world/walls.js +9 -0
- package/dist/world/waterKind.d.ts +55 -0
- package/dist/world/waterKind.js +99 -0
- package/dist/world.d.ts +132 -0
- package/dist/world.js +132 -0
- package/package.json +32 -8
- package/skills/jgengine/SKILL.md +51 -0
- package/skills/jgengine/api.md +434 -0
- package/skills/jgengine/capabilities.md +29 -0
- package/skills/jgengine/reference-cartridge.md +72 -0
- package/skills/jgengine-combat/SKILL.md +34 -0
- package/skills/jgengine-combat/api.md +549 -0
- package/skills/jgengine-combat/capabilities.md +169 -0
- package/skills/jgengine-combat/reference.md +98 -0
- package/skills/jgengine-gameplay/SKILL.md +39 -0
- package/skills/jgengine-gameplay/api.md +1794 -0
- package/skills/jgengine-gameplay/capabilities.md +378 -0
- package/skills/jgengine-gameplay/reference-systems.md +60 -0
- package/skills/jgengine-world/SKILL.md +38 -0
- package/skills/jgengine-world/api.md +2652 -0
- package/skills/jgengine-world/capabilities.md +370 -0
- package/skills/jgengine-world/reference.md +222 -0
- package/dist/cartridge/runtime.d.ts +0 -15
- package/dist/cartridge/runtime.js +0 -556
- package/dist/cartridge/spec.d.ts +0 -188
- package/dist/cartridge/spec.js +0 -19
- package/dist/cartridge/validate.d.ts +0 -2
- package/dist/cartridge/validate.js +0 -78
- package/dist/store/engineStore.d.ts +0 -22
- package/dist/store/engineStore.js +0 -50
- package/dist/store/features.d.ts +0 -10
- package/dist/store/features.js +0 -23
- package/llms.txt +0 -5389
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
function clamp01(value) {
|
|
2
|
+
return value < 0 ? 0 : value > 1 ? 1 : value;
|
|
3
|
+
}
|
|
4
|
+
/**
|
|
5
|
+
* Evaluate a single live-metric objective: is `value` at least (or at most) the target, and how far along.
|
|
6
|
+
* Unlike an event counter, this reads a continuously-changing metric — population, approval, pollution —
|
|
7
|
+
* the objective shape city-builders and management sims track every tick.
|
|
8
|
+
*
|
|
9
|
+
* @capability objectives check progress of a threshold objective against a live metric
|
|
10
|
+
*/
|
|
11
|
+
export function evaluateObjective(objective, value) {
|
|
12
|
+
const direction = objective.direction ?? "atLeast";
|
|
13
|
+
const target = objective.target;
|
|
14
|
+
let met;
|
|
15
|
+
let progress;
|
|
16
|
+
if (direction === "atMost") {
|
|
17
|
+
met = value <= target;
|
|
18
|
+
progress = met ? 1 : target <= 0 ? 0 : clamp01(target / value);
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
met = value >= target;
|
|
22
|
+
progress = met ? 1 : target <= 0 ? 1 : clamp01(value / target);
|
|
23
|
+
}
|
|
24
|
+
return { id: objective.id, value, target, direction, met, progress };
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Evaluate every objective against current metric values (a lookup map or function) and roll them up into
|
|
28
|
+
* a met-count, completion flag, and mean progress — the brief/charter panel every sim renders.
|
|
29
|
+
*/
|
|
30
|
+
export function evaluateObjectives(objectives, values) {
|
|
31
|
+
const lookup = typeof values === "function" ? values : (id) => values[id] ?? 0;
|
|
32
|
+
const statuses = objectives.map((objective) => evaluateObjective(objective, lookup(objective.id)));
|
|
33
|
+
const met = statuses.filter((status) => status.met).length;
|
|
34
|
+
const progress = statuses.length === 0 ? 1 : statuses.reduce((sum, s) => sum + s.progress, 0) / statuses.length;
|
|
35
|
+
return { statuses, met, total: statuses.length, complete: met === statuses.length, progress };
|
|
36
|
+
}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Layered numeric parameter modifiers over a caller-owned schema.
|
|
3
|
+
*
|
|
4
|
+
* A {@link ParamLayer} is a named, serializable bundle of transforms ({@link ParamOp}) keyed by
|
|
5
|
+
* parameter name. {@link resolveParams} folds an ordered stack of layers over a base value map and
|
|
6
|
+
* returns a deterministic {@link ParamSnapshot} — the effective values plus a full provenance trace
|
|
7
|
+
* of every op that touched each parameter. Layers order by ascending `priority` (ties broken by
|
|
8
|
+
* active-list index, a stable sort), and within a layer a parameter's ops fold left-to-right, so the
|
|
9
|
+
* stacking order is fully well-defined and reproducible.
|
|
10
|
+
*
|
|
11
|
+
* The primitive is genre-agnostic: difficulty tiers, game modes, mutators, accessibility presets,
|
|
12
|
+
* events, NG+, server rules, and challenge runs are all just ordered layers over different schemas.
|
|
13
|
+
* Save files store a {@link LayerSelection} (ordered layer ids); a {@link LayerRegistry} resolves
|
|
14
|
+
* those ids back to layers and reports unknown ids so migration and unknown saved content degrade
|
|
15
|
+
* gracefully rather than throwing.
|
|
16
|
+
*/
|
|
17
|
+
import { type Curve } from "./progression.js";
|
|
18
|
+
/**
|
|
19
|
+
* A single transform applied to one numeric parameter. `set` overrides, `add`/`multiply` accumulate,
|
|
20
|
+
* `clamp` bounds, and `curve` remaps the running value through a {@link Curve} (the same curve
|
|
21
|
+
* primitive progression tracks use), so a caller can reshape a value non-linearly mid-stack.
|
|
22
|
+
*/
|
|
23
|
+
export type ParamOp = {
|
|
24
|
+
readonly kind: "set";
|
|
25
|
+
readonly value: number;
|
|
26
|
+
} | {
|
|
27
|
+
readonly kind: "add";
|
|
28
|
+
readonly value: number;
|
|
29
|
+
} | {
|
|
30
|
+
readonly kind: "multiply";
|
|
31
|
+
readonly value: number;
|
|
32
|
+
} | {
|
|
33
|
+
readonly kind: "clamp";
|
|
34
|
+
readonly min?: number;
|
|
35
|
+
readonly max?: number;
|
|
36
|
+
} | {
|
|
37
|
+
readonly kind: "curve";
|
|
38
|
+
readonly curve: Curve;
|
|
39
|
+
};
|
|
40
|
+
/** Per-parameter ops contributed by one layer — a single op or an ordered list folded in sequence. */
|
|
41
|
+
export type LayerOps = Readonly<Record<string, ParamOp | readonly ParamOp[]>>;
|
|
42
|
+
/**
|
|
43
|
+
* A named, serializable bundle of parameter transforms with a stable id and precedence. `label` is an
|
|
44
|
+
* optional display name that may intentionally differ from the applied ops (e.g. a tier shown as
|
|
45
|
+
* "Mayhem 4" whose real multipliers are data). Higher `priority` applies later — on top — and ties
|
|
46
|
+
* break by the layer's index in the active list, so ordering is deterministic.
|
|
47
|
+
*/
|
|
48
|
+
export interface ParamLayer {
|
|
49
|
+
readonly id: string;
|
|
50
|
+
readonly label?: string;
|
|
51
|
+
/** Higher applies later (stacks on top). Ties break by active-list index. Default `0`. */
|
|
52
|
+
readonly priority?: number;
|
|
53
|
+
readonly ops: LayerOps;
|
|
54
|
+
}
|
|
55
|
+
/** One recorded fold step — which layer's op ran and the value before/after. Contribution provenance. */
|
|
56
|
+
export interface ParamContribution {
|
|
57
|
+
readonly layerId: string;
|
|
58
|
+
readonly op: ParamOp;
|
|
59
|
+
readonly from: number;
|
|
60
|
+
readonly to: number;
|
|
61
|
+
}
|
|
62
|
+
/** A resolved effective-parameter snapshot: final `values` plus the ordered op trace per parameter. */
|
|
63
|
+
export interface ParamSnapshot {
|
|
64
|
+
readonly values: Readonly<Record<string, number>>;
|
|
65
|
+
readonly contributions: Readonly<Record<string, readonly ParamContribution[]>>;
|
|
66
|
+
}
|
|
67
|
+
/** A serializable, ordered reference to layers by stable id — what a save file or session setup stores. */
|
|
68
|
+
export type LayerSelection = readonly string[];
|
|
69
|
+
/** A single conflict surfaced by {@link validateLayers}. */
|
|
70
|
+
export interface LayerConflict {
|
|
71
|
+
readonly kind: "duplicate-id" | "set-conflict";
|
|
72
|
+
/** The affected parameter, for `set-conflict`. */
|
|
73
|
+
readonly param?: string;
|
|
74
|
+
readonly layerIds: readonly string[];
|
|
75
|
+
}
|
|
76
|
+
/** One parameter's change between two value maps, for preview/diff surfaces. */
|
|
77
|
+
export interface ParamDelta {
|
|
78
|
+
readonly param: string;
|
|
79
|
+
readonly from: number;
|
|
80
|
+
readonly to: number;
|
|
81
|
+
readonly delta: number;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Order layers into their well-defined application sequence: ascending `priority`, ties broken by the
|
|
85
|
+
* layer's index in `layers` (a stable sort). Same input, same order, on every platform.
|
|
86
|
+
*
|
|
87
|
+
* @capability param-layers order active parameter layers into their deterministic application sequence
|
|
88
|
+
*/
|
|
89
|
+
export declare function orderLayers(layers: readonly ParamLayer[]): readonly ParamLayer[];
|
|
90
|
+
/**
|
|
91
|
+
* Fold an ordered stack of layers over `base` and return the effective {@link ParamSnapshot}. Layers
|
|
92
|
+
* apply in {@link orderLayers} sequence; within a layer each parameter's ops fold left-to-right. Every
|
|
93
|
+
* op is recorded in `contributions` for provenance/preview. Parameters a layer introduces but `base`
|
|
94
|
+
* omits start from `0`. Pure and deterministic — no ambient randomness or time.
|
|
95
|
+
*
|
|
96
|
+
* @capability param-layers resolve base values plus ordered layers into an effective parameter snapshot
|
|
97
|
+
*/
|
|
98
|
+
export declare function resolveParams(base: Readonly<Record<string, number>>, layers: readonly ParamLayer[]): ParamSnapshot;
|
|
99
|
+
/**
|
|
100
|
+
* Detect design conflicts in a layer set before resolving: duplicate ids, and competing `set` ops on
|
|
101
|
+
* the same parameter at the same priority (order-dependent, so worth surfacing). Returns an empty
|
|
102
|
+
* array when the set is clean, so callers can gate a difficulty/session build on it.
|
|
103
|
+
*
|
|
104
|
+
* @capability param-layers validate a layer set for duplicate ids and competing set-op conflicts
|
|
105
|
+
*/
|
|
106
|
+
export declare function validateLayers(layers: readonly ParamLayer[]): readonly LayerConflict[];
|
|
107
|
+
/**
|
|
108
|
+
* Compute the per-parameter deltas between two value maps — the preview/diff of applying a change,
|
|
109
|
+
* for showing a player what a difficulty tier or mutator will do before they commit.
|
|
110
|
+
*
|
|
111
|
+
* @capability param-layers diff two parameter value maps into per-parameter deltas for preview
|
|
112
|
+
*/
|
|
113
|
+
export declare function diffParams(before: Readonly<Record<string, number>>, after: Readonly<Record<string, number>>): readonly ParamDelta[];
|
|
114
|
+
/** Registered lookup of {@link ParamLayer}s by stable id, resolving serialized selections and unknowns. */
|
|
115
|
+
export interface LayerRegistry {
|
|
116
|
+
register(layer: ParamLayer): void;
|
|
117
|
+
has(id: string): boolean;
|
|
118
|
+
get(id: string): ParamLayer | undefined;
|
|
119
|
+
all(): readonly ParamLayer[];
|
|
120
|
+
/**
|
|
121
|
+
* Resolve a saved {@link LayerSelection} to concrete layers in the given order, collecting any ids
|
|
122
|
+
* with no registered layer into `unknown` (dropped, never thrown) so migration and stale saves
|
|
123
|
+
* degrade gracefully.
|
|
124
|
+
*/
|
|
125
|
+
resolve(ids: LayerSelection): {
|
|
126
|
+
readonly layers: readonly ParamLayer[];
|
|
127
|
+
readonly unknown: readonly string[];
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Create a {@link LayerRegistry} — the registration seam difficulty tiers, mutators, and presets
|
|
132
|
+
* install into. Duplicate ids throw at registration; unknown ids at resolve time are reported, not
|
|
133
|
+
* fatal, which is what keeps saved sessions reproducible across content/version drift.
|
|
134
|
+
*
|
|
135
|
+
* @capability param-layers register parameter layers by stable id and resolve serialized selections
|
|
136
|
+
*/
|
|
137
|
+
export declare function createLayerRegistry(initial?: readonly ParamLayer[]): LayerRegistry;
|
|
138
|
+
/**
|
|
139
|
+
* Reproducible session setup in one call: resolve a saved {@link LayerSelection} through a registry,
|
|
140
|
+
* fold the found layers over `base`, and return the snapshot alongside any unknown ids. The same
|
|
141
|
+
* base + registry + selection always yields the same snapshot.
|
|
142
|
+
*
|
|
143
|
+
* @capability param-layers resolve a saved layer selection into an effective snapshot with unknown-id report
|
|
144
|
+
*/
|
|
145
|
+
export declare function resolveSelection(base: Readonly<Record<string, number>>, registry: LayerRegistry, ids: LayerSelection): {
|
|
146
|
+
readonly snapshot: ParamSnapshot;
|
|
147
|
+
readonly unknown: readonly string[];
|
|
148
|
+
};
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Layered numeric parameter modifiers over a caller-owned schema.
|
|
3
|
+
*
|
|
4
|
+
* A {@link ParamLayer} is a named, serializable bundle of transforms ({@link ParamOp}) keyed by
|
|
5
|
+
* parameter name. {@link resolveParams} folds an ordered stack of layers over a base value map and
|
|
6
|
+
* returns a deterministic {@link ParamSnapshot} — the effective values plus a full provenance trace
|
|
7
|
+
* of every op that touched each parameter. Layers order by ascending `priority` (ties broken by
|
|
8
|
+
* active-list index, a stable sort), and within a layer a parameter's ops fold left-to-right, so the
|
|
9
|
+
* stacking order is fully well-defined and reproducible.
|
|
10
|
+
*
|
|
11
|
+
* The primitive is genre-agnostic: difficulty tiers, game modes, mutators, accessibility presets,
|
|
12
|
+
* events, NG+, server rules, and challenge runs are all just ordered layers over different schemas.
|
|
13
|
+
* Save files store a {@link LayerSelection} (ordered layer ids); a {@link LayerRegistry} resolves
|
|
14
|
+
* those ids back to layers and reports unknown ids so migration and unknown saved content degrade
|
|
15
|
+
* gracefully rather than throwing.
|
|
16
|
+
*/
|
|
17
|
+
import { evalCurve } from "./progression.js";
|
|
18
|
+
function applyOp(value, op) {
|
|
19
|
+
switch (op.kind) {
|
|
20
|
+
case "set":
|
|
21
|
+
return op.value;
|
|
22
|
+
case "add":
|
|
23
|
+
return value + op.value;
|
|
24
|
+
case "multiply":
|
|
25
|
+
return value * op.value;
|
|
26
|
+
case "clamp": {
|
|
27
|
+
let next = value;
|
|
28
|
+
if (op.min !== undefined)
|
|
29
|
+
next = Math.max(op.min, next);
|
|
30
|
+
if (op.max !== undefined)
|
|
31
|
+
next = Math.min(op.max, next);
|
|
32
|
+
return next;
|
|
33
|
+
}
|
|
34
|
+
case "curve":
|
|
35
|
+
return evalCurve(op.curve, value);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Order layers into their well-defined application sequence: ascending `priority`, ties broken by the
|
|
40
|
+
* layer's index in `layers` (a stable sort). Same input, same order, on every platform.
|
|
41
|
+
*
|
|
42
|
+
* @capability param-layers order active parameter layers into their deterministic application sequence
|
|
43
|
+
*/
|
|
44
|
+
export function orderLayers(layers) {
|
|
45
|
+
return layers
|
|
46
|
+
.map((layer, index) => ({ layer, index }))
|
|
47
|
+
.sort((a, b) => (a.layer.priority ?? 0) - (b.layer.priority ?? 0) || a.index - b.index)
|
|
48
|
+
.map((entry) => entry.layer);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Fold an ordered stack of layers over `base` and return the effective {@link ParamSnapshot}. Layers
|
|
52
|
+
* apply in {@link orderLayers} sequence; within a layer each parameter's ops fold left-to-right. Every
|
|
53
|
+
* op is recorded in `contributions` for provenance/preview. Parameters a layer introduces but `base`
|
|
54
|
+
* omits start from `0`. Pure and deterministic — no ambient randomness or time.
|
|
55
|
+
*
|
|
56
|
+
* @capability param-layers resolve base values plus ordered layers into an effective parameter snapshot
|
|
57
|
+
*/
|
|
58
|
+
export function resolveParams(base, layers) {
|
|
59
|
+
const values = { ...base };
|
|
60
|
+
const contributions = {};
|
|
61
|
+
for (const layer of orderLayers(layers)) {
|
|
62
|
+
for (const [param, opOrList] of Object.entries(layer.ops)) {
|
|
63
|
+
const ops = Array.isArray(opOrList) ? opOrList : [opOrList];
|
|
64
|
+
let current = values[param] ?? 0;
|
|
65
|
+
const trace = (contributions[param] ??= []);
|
|
66
|
+
for (const op of ops) {
|
|
67
|
+
const next = applyOp(current, op);
|
|
68
|
+
trace.push({ layerId: layer.id, op, from: current, to: next });
|
|
69
|
+
current = next;
|
|
70
|
+
}
|
|
71
|
+
values[param] = current;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return { values, contributions };
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Detect design conflicts in a layer set before resolving: duplicate ids, and competing `set` ops on
|
|
78
|
+
* the same parameter at the same priority (order-dependent, so worth surfacing). Returns an empty
|
|
79
|
+
* array when the set is clean, so callers can gate a difficulty/session build on it.
|
|
80
|
+
*
|
|
81
|
+
* @capability param-layers validate a layer set for duplicate ids and competing set-op conflicts
|
|
82
|
+
*/
|
|
83
|
+
export function validateLayers(layers) {
|
|
84
|
+
const conflicts = [];
|
|
85
|
+
const counts = new Map();
|
|
86
|
+
for (const layer of layers)
|
|
87
|
+
counts.set(layer.id, (counts.get(layer.id) ?? 0) + 1);
|
|
88
|
+
for (const [id, count] of counts) {
|
|
89
|
+
if (count > 1)
|
|
90
|
+
conflicts.push({ kind: "duplicate-id", layerIds: [id] });
|
|
91
|
+
}
|
|
92
|
+
const setters = new Map();
|
|
93
|
+
for (const layer of layers) {
|
|
94
|
+
const priority = layer.priority ?? 0;
|
|
95
|
+
for (const [param, opOrList] of Object.entries(layer.ops)) {
|
|
96
|
+
const ops = Array.isArray(opOrList) ? opOrList : [opOrList];
|
|
97
|
+
if (!ops.some((op) => op.kind === "set"))
|
|
98
|
+
continue;
|
|
99
|
+
const existing = setters.get(param);
|
|
100
|
+
if (existing)
|
|
101
|
+
existing.push({ layerId: layer.id, priority });
|
|
102
|
+
else
|
|
103
|
+
setters.set(param, [{ layerId: layer.id, priority }]);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
for (const [param, entries] of setters) {
|
|
107
|
+
const byPriority = new Map();
|
|
108
|
+
for (const entry of entries) {
|
|
109
|
+
const bucket = byPriority.get(entry.priority);
|
|
110
|
+
if (bucket)
|
|
111
|
+
bucket.add(entry.layerId);
|
|
112
|
+
else
|
|
113
|
+
byPriority.set(entry.priority, new Set([entry.layerId]));
|
|
114
|
+
}
|
|
115
|
+
for (const ids of byPriority.values()) {
|
|
116
|
+
if (ids.size > 1)
|
|
117
|
+
conflicts.push({ kind: "set-conflict", param, layerIds: [...ids] });
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return conflicts;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Compute the per-parameter deltas between two value maps — the preview/diff of applying a change,
|
|
124
|
+
* for showing a player what a difficulty tier or mutator will do before they commit.
|
|
125
|
+
*
|
|
126
|
+
* @capability param-layers diff two parameter value maps into per-parameter deltas for preview
|
|
127
|
+
*/
|
|
128
|
+
export function diffParams(before, after) {
|
|
129
|
+
const params = new Set([...Object.keys(before), ...Object.keys(after)]);
|
|
130
|
+
const deltas = [];
|
|
131
|
+
for (const param of [...params].sort()) {
|
|
132
|
+
const from = before[param] ?? 0;
|
|
133
|
+
const to = after[param] ?? 0;
|
|
134
|
+
if (from !== to)
|
|
135
|
+
deltas.push({ param, from, to, delta: to - from });
|
|
136
|
+
}
|
|
137
|
+
return deltas;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Create a {@link LayerRegistry} — the registration seam difficulty tiers, mutators, and presets
|
|
141
|
+
* install into. Duplicate ids throw at registration; unknown ids at resolve time are reported, not
|
|
142
|
+
* fatal, which is what keeps saved sessions reproducible across content/version drift.
|
|
143
|
+
*
|
|
144
|
+
* @capability param-layers register parameter layers by stable id and resolve serialized selections
|
|
145
|
+
*/
|
|
146
|
+
export function createLayerRegistry(initial) {
|
|
147
|
+
const layers = new Map();
|
|
148
|
+
const register = (layer) => {
|
|
149
|
+
if (layers.has(layer.id))
|
|
150
|
+
throw new Error(`param layer "${layer.id}" is already registered`);
|
|
151
|
+
layers.set(layer.id, layer);
|
|
152
|
+
};
|
|
153
|
+
if (initial)
|
|
154
|
+
for (const layer of initial)
|
|
155
|
+
register(layer);
|
|
156
|
+
return {
|
|
157
|
+
register,
|
|
158
|
+
has: (id) => layers.has(id),
|
|
159
|
+
get: (id) => layers.get(id),
|
|
160
|
+
all: () => [...layers.values()],
|
|
161
|
+
resolve(ids) {
|
|
162
|
+
const resolved = [];
|
|
163
|
+
const unknown = [];
|
|
164
|
+
for (const id of ids) {
|
|
165
|
+
const layer = layers.get(id);
|
|
166
|
+
if (layer)
|
|
167
|
+
resolved.push(layer);
|
|
168
|
+
else
|
|
169
|
+
unknown.push(id);
|
|
170
|
+
}
|
|
171
|
+
return { layers: resolved, unknown };
|
|
172
|
+
},
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Reproducible session setup in one call: resolve a saved {@link LayerSelection} through a registry,
|
|
177
|
+
* fold the found layers over `base`, and return the snapshot alongside any unknown ids. The same
|
|
178
|
+
* base + registry + selection always yields the same snapshot.
|
|
179
|
+
*
|
|
180
|
+
* @capability param-layers resolve a saved layer selection into an effective snapshot with unknown-id report
|
|
181
|
+
*/
|
|
182
|
+
export function resolveSelection(base, registry, ids) {
|
|
183
|
+
const { layers, unknown } = registry.resolve(ids);
|
|
184
|
+
return { snapshot: resolveParams(base, layers), unknown };
|
|
185
|
+
}
|
package/dist/game/ping.d.ts
CHANGED
|
@@ -64,4 +64,9 @@ export interface PingSystem {
|
|
|
64
64
|
/** Classify → build → broadcast in one call; the ping verb. */
|
|
65
65
|
ping(from: string, hit: PointerHit, category?: PingCategory): PingPayload;
|
|
66
66
|
}
|
|
67
|
+
/**
|
|
68
|
+
* Contextual ping/marker communication between teammates, classified by what was pinged.
|
|
69
|
+
*
|
|
70
|
+
* @capability ping-wheel contextual ping/marker communication between teammates
|
|
71
|
+
*/
|
|
67
72
|
export declare function createPingSystem(deps: PingSystemDeps): PingSystem;
|
package/dist/game/ping.js
CHANGED
|
@@ -33,6 +33,11 @@ export function classifyPing(hit, deps = {}, options = {}) {
|
|
|
33
33
|
function categoryDef(categories, category) {
|
|
34
34
|
return categories[category] ?? { id: category, markerKind: category, label: category, callout: category };
|
|
35
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* Contextual ping/marker communication between teammates, classified by what was pinged.
|
|
38
|
+
*
|
|
39
|
+
* @capability ping-wheel contextual ping/marker communication between teammates
|
|
40
|
+
*/
|
|
36
41
|
export function createPingSystem(deps) {
|
|
37
42
|
const now = deps.now ?? Date.now;
|
|
38
43
|
const categories = deps.categories ?? DEFAULT_PING_CATEGORIES;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { AudioBusDef, SoundDef } from "../audio/audioFalloff.js";
|
|
2
2
|
import type { MusicTheme } from "../audio/music.js";
|
|
3
3
|
import type { PostProcessingConfig } from "../render/postProcessing.js";
|
|
4
|
+
import type { LookPreset } from "../render/lookPreset.js";
|
|
4
5
|
import type { TouchControlsConfig } from "../input/touchScheme.js";
|
|
5
6
|
import type { GameSettingsConfig } from "../settings/settingsModel.js";
|
|
6
7
|
import type { GameOrientation } from "../ui/orientation.js";
|
|
@@ -50,6 +51,10 @@ export interface CameraFollowState {
|
|
|
50
51
|
};
|
|
51
52
|
distance: number;
|
|
52
53
|
}
|
|
54
|
+
/** Props handed to a `WorldOverlay` component (#542): explicit `ctx` access so canvas-layer VFX read live engine state directly, without an extra hook or a module-global workaround. */
|
|
55
|
+
export interface WorldOverlayProps {
|
|
56
|
+
ctx: GameContext;
|
|
57
|
+
}
|
|
53
58
|
export interface FirstPersonCameraConfig {
|
|
54
59
|
/** Camera height above the followed entity's origin. Default 1.6. */
|
|
55
60
|
eyeHeight?: number;
|
|
@@ -59,7 +64,7 @@ export interface FirstPersonCameraConfig {
|
|
|
59
64
|
maxPitch?: number;
|
|
60
65
|
/** Show the centered crosshair overlay. Default true. */
|
|
61
66
|
reticle?: boolean;
|
|
62
|
-
/** Render a
|
|
67
|
+
/** Render a viewmodel in view: the built-in three-mesh gun, or `PlayableGame.viewmodel` when set (#542). `false` renders no viewmodel regardless of `PlayableGame.viewmodel`. Default true. */
|
|
63
68
|
viewmodel?: boolean;
|
|
64
69
|
}
|
|
65
70
|
/**
|
|
@@ -77,7 +82,7 @@ export interface FirstPersonCameraConfig {
|
|
|
77
82
|
* - `observer` — detached spectator/photo cam bound to any entity or fixed point; never reads player input.
|
|
78
83
|
* - `turntable` — slow auto-orbit of a fixed point: a rotating display stand for a scene. The friendly, flat spelling of `observer`'s point-orbit mode; providing `camera.turntable` selects it without an explicit `rig`.
|
|
79
84
|
* - `sideScroll` — fixed lateral follow (2.5D platformer/beat-'em-up side view); reads no player input.
|
|
80
|
-
* - `inspection` — model-viewer rig (#207.7):
|
|
85
|
+
* - `inspection` — model-viewer / editor rig (#207.7, #866): middle-drag pan, right-drag orbit, scroll zoom toward a configurable anchor; orbits a fixed point, reads no player/entity input.
|
|
81
86
|
* - `none` — no camera rig is mounted; use for HUD-only presentations or a game that manages its own camera.
|
|
82
87
|
*/
|
|
83
88
|
export type CameraRigKind = "orbit" | "first" | "topDown" | "rts" | "shoulder" | "lockOn" | "chase" | "observer" | "turntable" | "sideScroll" | "inspection" | "none";
|
|
@@ -326,7 +331,7 @@ export interface InspectionCameraConfig {
|
|
|
326
331
|
/** Vertical orbit clamp (radians). Unset allows a full pole-to-pole orbit, unlike the tighter default on the classic orbit rig. */
|
|
327
332
|
minPolarAngle?: number;
|
|
328
333
|
maxPolarAngle?: number;
|
|
329
|
-
/** Middle-mouse
|
|
334
|
+
/** Middle-mouse pan. Default true for this rig. */
|
|
330
335
|
pan?: boolean;
|
|
331
336
|
rotateSpeed?: number;
|
|
332
337
|
zoomSpeed?: number;
|
|
@@ -441,6 +446,10 @@ export interface GameCameraConfig {
|
|
|
441
446
|
};
|
|
442
447
|
initialDistance?: number;
|
|
443
448
|
initialHeight?: number;
|
|
449
|
+
/** Initial horizontal boom facing (radians): 0 = camera behind on -Z, PI = camera on +Z. Seeds the orbit rig; unset keeps the legacy -Z placement. */
|
|
450
|
+
initialYaw?: number;
|
|
451
|
+
/** Initial boom elevation (radians): 0 = level, positive = camera above the target looking down. Seeds the orbit rig; unset derives elevation from `initialHeight`/`initialDistance`. */
|
|
452
|
+
initialPitch?: number;
|
|
444
453
|
/** Lock orbit radius while the follow target moves (default true in shell). */
|
|
445
454
|
followLock?: boolean;
|
|
446
455
|
/** When false, orbit target stays fixed (cinematic / debug). Default true. */
|
|
@@ -458,6 +467,8 @@ export interface GameCameraConfig {
|
|
|
458
467
|
/** Vertical look clamp (three.js polar angle, radians): 0 = top-down over the head, PI/2 = level, >PI/2 = look up from below. Widen for top-down or vertical aim; unset keeps the standard chase feel. */
|
|
459
468
|
minPolarAngle?: number;
|
|
460
469
|
maxPolarAngle?: number;
|
|
470
|
+
/** Signed boom-elevation clamp `[min, max]` (radians): min < 0 dips the camera below the target, max > 0 rises overhead. Maps onto `minPolarAngle`/`maxPolarAngle` (polar = PI/2 − pitch); explicit polar fields win. */
|
|
471
|
+
pitchClamp?: readonly [number, number];
|
|
461
472
|
/** Spring-arm occlusion for the orbit rig: pull the camera in past walls/terrain so it never clips inside geometry. Off unless `enabled`. */
|
|
462
473
|
collision?: {
|
|
463
474
|
enabled?: boolean;
|
|
@@ -538,6 +549,17 @@ export interface ModelAnimationConfig {
|
|
|
538
549
|
*/
|
|
539
550
|
oneShots?: Record<string, string | readonly string[]>;
|
|
540
551
|
}
|
|
552
|
+
/**
|
|
553
|
+
* Real PBR map URLs (e.g. `buildMaterialCatalog(...).resolve(id)!.maps` from `@jgengine/assets`)
|
|
554
|
+
* layered onto a model's material — the seam for texturing an otherwise-flat/untextured GLB. Any
|
|
555
|
+
* role may be omitted to keep the model's own map.
|
|
556
|
+
*/
|
|
557
|
+
export interface ModelMaterialMaps {
|
|
558
|
+
color?: string;
|
|
559
|
+
normal?: string;
|
|
560
|
+
roughness?: string;
|
|
561
|
+
ao?: string;
|
|
562
|
+
}
|
|
541
563
|
/** Per-entity PBR material override (#151.3) applied to every `MeshStandardMaterial` in the model's cloned scene graph. */
|
|
542
564
|
export interface ModelMaterialOverride {
|
|
543
565
|
color?: string;
|
|
@@ -545,6 +567,8 @@ export interface ModelMaterialOverride {
|
|
|
545
567
|
roughness?: number;
|
|
546
568
|
emissive?: string;
|
|
547
569
|
emissiveIntensity?: number;
|
|
570
|
+
/** Real PBR texture maps applied over the model's material — see {@link ModelMaterialMaps}. */
|
|
571
|
+
maps?: ModelMaterialMaps;
|
|
548
572
|
}
|
|
549
573
|
/** Parents a prop/weapon model to a named bone or node on the host model's rig — a sword on `handslot.r`, a spellbook offhand — following the bone's animated transform each frame. */
|
|
550
574
|
export interface ModelAttachment {
|
|
@@ -559,6 +583,17 @@ export interface ModelAttachment {
|
|
|
559
583
|
/** Uniform scale of the attached model at the bone. Default 1. */
|
|
560
584
|
scale?: number;
|
|
561
585
|
}
|
|
586
|
+
/** Static child model stacked at a fixed local offset under its parent's transform — no bone/rig resolution, unlike `ModelAttachment`. Assembles a compound entity (e.g. a modular castle wall + tower + roof) from several single-mesh kit pieces. */
|
|
587
|
+
export interface ModelPart {
|
|
588
|
+
/** The child model — a catalog asset id or an inline `ModelConfig`; resolves through the catalog exactly like the top-level model and gets its own `dims`/anchor centering. */
|
|
589
|
+
model: string | ModelConfig;
|
|
590
|
+
/** Local position offset under the parent's transform. */
|
|
591
|
+
position?: [number, number, number];
|
|
592
|
+
/** Local Euler rotation (radians) under the parent's transform. */
|
|
593
|
+
rotation?: [number, number, number];
|
|
594
|
+
/** Uniform scale of the part under the parent's transform. Default 1. */
|
|
595
|
+
scale?: number;
|
|
596
|
+
}
|
|
562
597
|
export interface ModelConfig {
|
|
563
598
|
url: string;
|
|
564
599
|
scale?: number;
|
|
@@ -575,6 +610,8 @@ export interface ModelConfig {
|
|
|
575
610
|
animation?: ModelAnimationConfig;
|
|
576
611
|
/** Props/weapons parented to named bones on this model's rig; each follows its bone through animation. */
|
|
577
612
|
attachments?: readonly ModelAttachment[];
|
|
613
|
+
/** Static kit-of-parts pieces stacked at fixed local offsets — no bone/rig involved. Use this for a compound entity assembled from several modular meshes (a castle keep from base + mid + roof pieces); use `attachments` for props parented to an animated rig's bones. */
|
|
614
|
+
parts?: readonly ModelPart[];
|
|
578
615
|
}
|
|
579
616
|
export interface ObjectStyle {
|
|
580
617
|
color?: string;
|
|
@@ -637,6 +674,18 @@ export interface PlayerMovementConfig {
|
|
|
637
674
|
beforeCommit?: (frame: MovementCommitFrame) => readonly [number, number, number] | undefined | void;
|
|
638
675
|
/** Gates the built-in sprint (`runSpeedMultiplier`) behind live game state — a stamina stat, an encumbrance check (#282.3). Called each frame while sprint is held; `false` walks. */
|
|
639
676
|
canSprint?: (ctx: GameContext) => boolean;
|
|
677
|
+
/** Fraction of walk speed while backpedalling (holding `moveBack`). Overrides the engine default (0.65). */
|
|
678
|
+
backpedalMult?: number;
|
|
679
|
+
/** Radians/second the rendered body rotates toward its movement heading (shortest arc), so strafing/backpedalling read as a turn rather than an instant flip; also the rate the internally-integrated `turnLeft`/`turnRight` heading turns when the shell doesn't own yaw. Unset = body facing snaps instantly (no change to existing feel). */
|
|
680
|
+
turnSpeed?: number;
|
|
681
|
+
/** On-foot swimming when the terrain declares a `waterLevel` and the player is submerged: caps speed and floats them at the surface. `true` uses defaults; default off. */
|
|
682
|
+
swim?: {
|
|
683
|
+
speedMultiplier?: number;
|
|
684
|
+
} | boolean;
|
|
685
|
+
/** Slide the player downhill on terrain steeper than they can stand on (heightfield worlds only). `true` uses defaults; default off. */
|
|
686
|
+
slopeSlide?: {
|
|
687
|
+
maxClimbSlope?: number;
|
|
688
|
+
} | boolean;
|
|
640
689
|
}
|
|
641
690
|
/** One frame's movement resolution handed to `PlayerMovementConfig.beforeCommit`. */
|
|
642
691
|
export interface MovementCommitFrame {
|
|
@@ -647,17 +696,36 @@ export interface MovementCommitFrame {
|
|
|
647
696
|
/** The live game context (#282.2) — movement rules read stores/stats directly instead of module-level bridge objects. */
|
|
648
697
|
ctx: GameContext;
|
|
649
698
|
}
|
|
650
|
-
|
|
699
|
+
/** How a screenshot host reaches live gameplay in this game — the data behind `shoot --mode play`. */
|
|
700
|
+
export interface GameCaptureConfig {
|
|
701
|
+
/** Commands run (in order, via `ctx.game.commands.run`) right after boot when a capture host requests the play screen — the same commands the start-menu buttons dispatch. A bare string runs with a default input; the object form carries the input a command needs (e.g. `[{ name: "class.select", input: { classId: "siren" } }, "startRun"]`). A name the game never registers fails the capture loudly instead of shipping a menu screenshot. */
|
|
702
|
+
play?: readonly (string | {
|
|
703
|
+
name: string;
|
|
704
|
+
input?: unknown;
|
|
705
|
+
})[];
|
|
706
|
+
/** Named capture states beyond live gameplay — any screen worth screenshotting on demand (`lobby`, `store`, `game_over`), each mapping to the command sequence that reaches it from boot. `shoot <game> --state <name>` runs that sequence and captures whatever is on screen — menus included, no live-play guard. An unknown state name fails the capture with the declared list. */
|
|
707
|
+
states?: Record<string, readonly (string | {
|
|
708
|
+
name: string;
|
|
709
|
+
input?: unknown;
|
|
710
|
+
})[]>;
|
|
711
|
+
/** Extra milliseconds the capture host waits after `play` commands before taking the play-mode screenshot — cover an intro cinematic or spawn-in fade. Default 2500. */
|
|
712
|
+
settleMs?: number;
|
|
713
|
+
/** Bot-playtest read hook: maps live game state to a flat vector of numeric progress metrics the `drive --playtest` harness samples over time (e.g. `{ x, z, score, phase }`). Genre-agnostic — "progress" is whatever the game reports; the engine stays neutral. The harness watches these numbers move under scripted input: any metric changing beyond an epsilon counts as forward progress, all metrics flat past the softlock threshold under active input flags a softlock. Return every value that should count as advancing; omit to opt the game out of the playtest rung. */
|
|
714
|
+
probe?: (ctx: GameContext) => Record<string, number>;
|
|
715
|
+
}
|
|
716
|
+
export interface PlayableGame<TUi = unknown, TWorldOverlay = unknown, TRenderEntity = never, TRenderObject = never, TViewmodel = unknown, TOverlay = TWorldOverlay> {
|
|
651
717
|
game: GameDefinition;
|
|
652
718
|
content: GameContextContent;
|
|
653
719
|
loop: Required<Omit<GameLoop<GameContext>, "onPlayerLeave">> & Pick<GameLoop<GameContext>, "onPlayerLeave">;
|
|
654
720
|
GameUI: TUi;
|
|
655
721
|
/** Which shell mount to use. Default `"3d"` (canvas, camera rig, pointer, world rendering). `"hud"` mounts no 3D canvas, camera rig, or pointer — the game is `GameUI` plus the command/input loop, for board/card/menu games. */
|
|
656
722
|
presentation?: "3d" | "hud";
|
|
657
|
-
/** Optional canvas-layer VFX component (e.g. traveling projectiles). */
|
|
658
|
-
WorldOverlay?:
|
|
723
|
+
/** Optional canvas-layer VFX component (e.g. traveling projectiles); receives `{ ctx }` (#542) so overlay VFX read live engine state without a separate hook or a module-global workaround. */
|
|
724
|
+
WorldOverlay?: TOverlay;
|
|
659
725
|
/** Replaces the default demo backdrop (ground + grid + rocks) with the game's own scene — ground, sky, structures. Camera, input, HUD, entity rendering, and the loop stay shell-provided; supply your world without forking the shell. When unset and `game.world` is an `environment()` descriptor, the shell auto-renders that world here — no manual wiring needed. */
|
|
660
726
|
environment?: TWorldOverlay;
|
|
727
|
+
/** Custom first-person viewmodel (#542), read when the active rig is first-person. Rendered inside the shell's camera-locked, muzzle-tracked anchor in place of the built-in three-mesh gun; receives a live `cuesRef` (velocity/bob/firing/reloading/recoil) driven from the followed entity — see `@jgengine/shell/camera`'s `ViewmodelProps`. Set `camera.firstPerson.viewmodel: false` to render no viewmodel at all regardless of this field. */
|
|
728
|
+
viewmodel?: TViewmodel;
|
|
661
729
|
/** Per-entity visual override: return your own mesh for an entity and the shell still positions it and drives selection/targeting. Return null/undefined to fall back to model → sprite → primitive. */
|
|
662
730
|
renderEntity?: TRenderEntity;
|
|
663
731
|
/** Per-object visual override: return your own mesh for a placed scene object and the shell still positions it and drives picking. Return null/undefined to fall back to objectModels → styled box. */
|
|
@@ -676,6 +744,8 @@ export interface PlayableGame<TUi = unknown, TWorldOverlay = unknown, TRenderEnt
|
|
|
676
744
|
prompts?: (ctx: GameContext) => readonly PositionedPrompt[];
|
|
677
745
|
/** Camera tuning (perspective, orbit, first-person) for the dev game player shell. */
|
|
678
746
|
camera?: GameCameraConfig;
|
|
747
|
+
/** Screenshot-host recipe for reaching live gameplay past a start menu (`shoot --mode play` runs `capture.play` automatically). Any game with a start/title screen declares this. */
|
|
748
|
+
capture?: GameCaptureConfig;
|
|
679
749
|
/** Cast/receive shadows across the scene (R3F Canvas shadow pass). Default true. */
|
|
680
750
|
shadows?: boolean;
|
|
681
751
|
/** Pointer-driven input: click-to-move, box-select, right-click verbs, cursor aim (#22/#30/#31). */
|
|
@@ -694,6 +764,19 @@ export interface PlayableGame<TUi = unknown, TWorldOverlay = unknown, TRenderEnt
|
|
|
694
764
|
roles?: readonly CatalogEntityRole[];
|
|
695
765
|
maxDistance?: number;
|
|
696
766
|
};
|
|
767
|
+
/**
|
|
768
|
+
* Opt in to billboarded nameplates (name + optional HP bar) floating over non-local entities — the
|
|
769
|
+
* MMO "who's this and how hurt are they" readout. `roles` restricts to entities whose catalog entry
|
|
770
|
+
* declares one of the given roles (default: all); `maxDistance` hides nameplates beyond this many
|
|
771
|
+
* world units from the player (default 40). Headless: skin every part via `className`/`data-*` hooks
|
|
772
|
+
* on `WorldNameplates` (`@jgengine/shell/world/WorldHud`) — this flag only turns the readout on and
|
|
773
|
+
* scopes which entities it covers.
|
|
774
|
+
*/
|
|
775
|
+
nameplates?: boolean | {
|
|
776
|
+
statId?: string;
|
|
777
|
+
roles?: readonly CatalogEntityRole[];
|
|
778
|
+
maxDistance?: number;
|
|
779
|
+
};
|
|
697
780
|
/** Sound catalog + mix buses (music/sfx/ambient/…) the shell's Web Audio glue plays from. Catalog-first — no per-game audio wiring. `sounds` may be sample (`url`) or procedural (`synth`); `music` holds procedural themes crossfaded via `ctx.game.audio.music(id)`. */
|
|
698
781
|
audio?: {
|
|
699
782
|
sounds: Record<string, SoundDef>;
|
|
@@ -711,13 +794,15 @@ export interface PlayableGame<TUi = unknown, TWorldOverlay = unknown, TRenderEnt
|
|
|
711
794
|
collision?: VoxelCollisionConfig;
|
|
712
795
|
/** Movement-control levers (axis/grid constraints, object collision, pre-commit hook) for the shell-driven walk controller. */
|
|
713
796
|
movement?: PlayerMovementConfig;
|
|
797
|
+
/** Default-look preset (#773). Unset/`"cinematic"` composes a real sky, a shadow-casting sun+hemisphere rig, a network-free image-based-lighting environment (soft PBR reflections), and a tuned tone-map/bloom/AO/vignette post stack, so a scene reads lit-like-a-game out of the box; `"flat"` opts out to the bare ambient+directional default. Upgraded default primitive materials (tuned PBR + subtle procedural surface detail) apply under both presets. Any explicit `lighting`/`backdrop`/`postProcessing` always wins. */
|
|
798
|
+
look?: LookPreset;
|
|
714
799
|
/** Declarative ambient/directional/hemisphere lighting (#207.5); replaces the shell's hardcoded default lights when present, regardless of world kind. */
|
|
715
800
|
lighting?: LightingConfig;
|
|
716
801
|
/** Generic background/sky/fog (#207.6), applied for any world kind including a custom `environment` component. */
|
|
717
802
|
backdrop?: BackdropConfig;
|
|
718
803
|
/** Declarative post-processing chain (AO/bloom/tone-map/grade). When set, the shell mounts an EffectComposer and owns the render; absent leaves the renderer drawing directly (unchanged). */
|
|
719
804
|
postProcessing?: PostProcessingConfig;
|
|
720
|
-
/** F2 debug overlay (frame/sim timing, logs, backend latency, keybinds, live tunables). On for every game by default; `false` disables the toggle. */
|
|
805
|
+
/** F2+D debug overlay (frame/sim timing, logs, backend latency, keybinds, live tunables). On for every game by default; `false` disables the toggle. */
|
|
721
806
|
devtools?: boolean;
|
|
722
807
|
/** Player settings menu. Auto-mounted for every game (Sound / Graphics / Gameplay / Controls); unset uses the defaults, `false` opts out. Add game-specific rows via `extra`, switch overlay/full-page via `mode`, or swap the gear for compact on-screen buttons via `surface: "quick"`. */
|
|
723
808
|
settings?: GameSettingsConfig | false;
|
package/dist/game/quest.d.ts
CHANGED
|
@@ -89,7 +89,15 @@ export interface QuestJournal {
|
|
|
89
89
|
bind(action: "entity.died" | "inventory.added"): () => void;
|
|
90
90
|
snapshot(userId: string): QuestSnapshotEntry[];
|
|
91
91
|
hydrate(userId: string, data: QuestSnapshotEntry[]): void;
|
|
92
|
+
/** Whole-store capture across every user — the world-save/replication seam (per-user `snapshot` can't enumerate users). */
|
|
93
|
+
snapshotAll(): Record<string, QuestSnapshotEntry[]>;
|
|
94
|
+
hydrateAll(data: Record<string, QuestSnapshotEntry[]>): void;
|
|
92
95
|
}
|
|
96
|
+
/**
|
|
97
|
+
* Track accepted quests and their per-objective progress, granting rewards on completion.
|
|
98
|
+
*
|
|
99
|
+
* @capability quest-log track accepted quests and their per-objective progress
|
|
100
|
+
*/
|
|
93
101
|
export declare function createQuestJournal(deps: QuestJournalDeps): QuestJournal;
|
|
94
102
|
export interface QuestAcceptOptions {
|
|
95
103
|
hasUnlock?(id: string): boolean;
|