@jgengine/core 0.10.0 → 0.12.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 +39 -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/populationDirector.d.ts +103 -0
- package/dist/ai/populationDirector.js +190 -0
- package/dist/ai/pursuit.d.ts +56 -0
- package/dist/ai/pursuit.js +53 -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 +2 -1
- package/dist/authoring.js +2 -1
- 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 +35 -0
- package/dist/combat.js +35 -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/controls.d.ts +38 -0
- package/dist/devtools/controls.js +181 -0
- package/dist/devtools/devtools.d.ts +5 -197
- package/dist/devtools/devtools.js +38 -774
- package/dist/devtools/discover.d.ts +32 -0
- package/dist/devtools/discover.js +240 -0
- package/dist/devtools/fallbackSeams.d.ts +50 -0
- package/dist/devtools/fallbackSeams.js +111 -0
- package/dist/devtools/frame.d.ts +15 -0
- package/dist/devtools/frame.js +247 -0
- package/dist/devtools/logs.d.ts +15 -0
- package/dist/devtools/logs.js +86 -0
- package/dist/devtools/overrides.d.ts +16 -0
- package/dist/devtools/overrides.js +66 -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/devtools/types.d.ts +212 -0
- package/dist/devtools/types.js +1 -0
- package/dist/economy/auctionBook.d.ts +122 -0
- package/dist/economy/auctionBook.js +213 -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/priceHistory.d.ts +44 -0
- package/dist/economy/priceHistory.js +89 -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/unlockPoints.d.ts +92 -0
- package/dist/economy/unlockPoints.js +103 -0
- package/dist/economy/wallet.d.ts +26 -2
- package/dist/economy/wallet.js +35 -6
- package/dist/editor/commandApply.d.ts +5 -0
- package/dist/editor/commandApply.js +755 -0
- package/dist/editor/commands.d.ts +235 -7
- package/dist/editor/commands.js +82 -124
- package/dist/editor/directives.d.ts +94 -0
- package/dist/editor/directives.js +206 -0
- package/dist/editor/document.d.ts +194 -13
- package/dist/editor/document.js +1166 -19
- package/dist/editor/entityCatalog.d.ts +42 -0
- package/dist/editor/entityCatalog.js +101 -0
- package/dist/editor/environment.d.ts +74 -0
- package/dist/editor/environment.js +169 -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 +98 -6
- package/dist/editor/index.js +13 -2
- package/dist/editor/liveSync.d.ts +127 -0
- package/dist/editor/liveSync.js +249 -0
- package/dist/editor/minimap.d.ts +31 -0
- package/dist/editor/minimap.js +73 -0
- package/dist/editor/runtimeInspector.d.ts +88 -0
- package/dist/editor/runtimeInspector.js +239 -0
- package/dist/editor/streamer.d.ts +66 -0
- package/dist/editor/streamer.js +68 -0
- package/dist/editor/types.d.ts +250 -1
- package/dist/editor/world.d.ts +136 -0
- package/dist/editor/world.js +303 -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/breeding.d.ts +161 -0
- package/dist/game/breeding.js +181 -0
- package/dist/game/cameraConfig.d.ts +451 -0
- package/dist/game/cameraConfig.js +1 -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 +110 -5
- package/dist/game/defineGame.js +49 -4
- package/dist/game/defineSystem.d.ts +90 -0
- package/dist/game/defineSystem.js +47 -0
- package/dist/game/dialogue.d.ts +33 -0
- package/dist/game/dialogue.js +21 -0
- package/dist/game/events.d.ts +63 -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 +116 -432
- package/dist/game/playableGame.js +1 -1
- package/dist/game/progression.d.ts +35 -0
- package/dist/game/progression.js +19 -0
- package/dist/game/quest.d.ts +8 -0
- package/dist/game/quest.js +30 -3
- 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/tribe.d.ts +184 -0
- package/dist/game/tribe.js +432 -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 +93 -0
- package/dist/gameplay.js +93 -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/encumbrance.d.ts +69 -0
- package/dist/inventory/encumbrance.js +68 -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 +6 -3
- 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 +39 -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 +50 -9
- package/dist/movement/movementModel.js +75 -29
- package/dist/movement/playerMovement.js +167 -12
- 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 +16 -8
- package/dist/multiplayer/lagCompensation.d.ts +5 -0
- package/dist/multiplayer/lagCompensation.js +5 -0
- package/dist/multiplayer/presenceModel.d.ts +11 -1
- package/dist/multiplayer/presenceModel.js +17 -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 +31 -0
- package/dist/physics/drivableVehicle.js +16 -0
- package/dist/physics/flightDynamics.d.ts +82 -0
- package/dist/physics/flightDynamics.js +165 -0
- package/dist/physics/gravityField.d.ts +25 -0
- package/dist/physics/gravityField.js +41 -0
- package/dist/physics/kinematicVehicle.d.ts +108 -1
- package/dist/physics/kinematicVehicle.js +212 -15
- package/dist/physics/physicsWorld.d.ts +50 -12
- package/dist/physics/physicsWorld.js +120 -122
- package/dist/physics/radialImpulse.d.ts +25 -0
- package/dist/physics/radialImpulse.js +27 -0
- package/dist/physics/vehicleObstacles.d.ts +44 -0
- package/dist/physics/vehicleObstacles.js +115 -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 +26 -1
- package/dist/random/rng.js +32 -9
- 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 +55 -3
- package/dist/runtime/adapter.js +57 -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/combat.d.ts +51 -0
- package/dist/runtime/context/combat.js +130 -0
- package/dist/runtime/context/combatFx.d.ts +23 -0
- package/dist/runtime/context/combatFx.js +161 -0
- package/dist/runtime/context/deathLoot.d.ts +30 -0
- package/dist/runtime/context/deathLoot.js +39 -0
- package/dist/runtime/context/player.d.ts +48 -0
- package/dist/runtime/context/player.js +125 -0
- package/dist/runtime/context/registries.d.ts +13 -0
- package/dist/runtime/context/registries.js +84 -0
- package/dist/runtime/context/scene.d.ts +59 -0
- package/dist/runtime/context/scene.js +291 -0
- package/dist/runtime/context/snapshotCodecs.d.ts +12 -0
- package/dist/runtime/context/snapshotCodecs.js +26 -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 +157 -0
- package/dist/runtime/descriptors/features.d.ts +79 -0
- package/dist/runtime/descriptors/features.js +299 -0
- package/dist/runtime/gameContext.d.ts +2 -327
- package/dist/runtime/gameContext.js +273 -778
- package/dist/runtime/gameContextTypes.d.ts +467 -0
- package/dist/runtime/gameContextTypes.js +1 -0
- package/dist/runtime/gameRuntime.d.ts +1 -0
- package/dist/runtime/gameRuntime.js +1 -0
- package/dist/runtime/headlessRunner.d.ts +62 -0
- package/dist/runtime/headlessRunner.js +45 -0
- package/dist/runtime/hostPersistence.d.ts +12 -0
- package/dist/runtime/hostPersistence.js +12 -0
- package/dist/runtime/hostPolicy.d.ts +51 -0
- package/dist/runtime/hostPolicy.js +68 -0
- package/dist/runtime/hostedGameRunner.d.ts +11 -4
- package/dist/runtime/hostedGameRunner.js +27 -3
- package/dist/runtime/hostedWorldSession.d.ts +15 -5
- package/dist/runtime/hostedWorldSession.js +12 -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 +42 -3
- package/dist/runtime/worldSnapshot.js +34 -7
- package/dist/scene/assetCatalog.d.ts +26 -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 +257 -0
- package/dist/scene/authoredTriggers.d.ts +219 -0
- package/dist/scene/authoredTriggers.js +454 -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 +67 -0
- package/dist/scene/colliders.d.ts +71 -1
- package/dist/scene/colliders.js +145 -1
- package/dist/scene/collisionMesh.d.ts +94 -0
- package/dist/scene/collisionMesh.js +699 -0
- package/dist/scene/companion.d.ts +147 -0
- package/dist/scene/companion.js +193 -0
- package/dist/scene/entityStats.d.ts +18 -11
- package/dist/scene/entityStats.js +21 -16
- 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 +256 -0
- package/dist/scene/sceneKinds.js +218 -0
- package/dist/scene/sceneOwnership.d.ts +169 -0
- package/dist/scene/sceneOwnership.js +179 -0
- package/dist/scene/sceneRaycast.js +15 -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/spawnLevelStats.d.ts +110 -0
- package/dist/stats/spawnLevelStats.js +140 -0
- package/dist/stats/statModifiers.d.ts +5 -0
- package/dist/stats/statModifiers.js +5 -0
- package/dist/stats/statPool.d.ts +70 -0
- package/dist/stats/statPool.js +59 -0
- package/dist/store/changeSignal.d.ts +3 -0
- package/dist/store/changeSignal.js +2 -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 +7 -0
- package/dist/store/observableKeyedStore.js +35 -2
- package/dist/survival/decayMeter.d.ts +55 -0
- package/dist/survival/decayMeter.js +130 -57
- package/dist/survival/moodle.d.ts +2 -0
- package/dist/survival/regionHealth.d.ts +6 -0
- package/dist/survival/regionHealth.js +6 -3
- 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 +38 -1
- package/dist/ui/hudLayout.js +220 -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/authoredEntities.d.ts +29 -0
- package/dist/world/authoredEntities.js +29 -0
- package/dist/world/authoredObjects.d.ts +72 -0
- package/dist/world/authoredObjects.js +81 -0
- package/dist/world/authoredSpawn.d.ts +39 -0
- package/dist/world/authoredSpawn.js +37 -0
- package/dist/world/buildSockets.d.ts +152 -0
- package/dist/world/buildSockets.js +188 -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/cityBlocks.d.ts +152 -0
- package/dist/world/cityBlocks.js +670 -0
- package/dist/world/cityContent.d.ts +77 -0
- package/dist/world/cityContent.js +261 -0
- package/dist/world/cityGeometry.d.ts +114 -0
- package/dist/world/cityGeometry.js +573 -0
- package/dist/world/cityKind.d.ts +314 -0
- package/dist/world/cityKind.js +1578 -0
- package/dist/world/features.d.ts +133 -10
- package/dist/world/features.js +66 -6
- 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/markers.d.ts +50 -4
- package/dist/world/markers.js +49 -0
- package/dist/world/massing.js +1 -1
- package/dist/world/minimapBake.d.ts +78 -0
- package/dist/world/minimapBake.js +208 -0
- package/dist/world/minimapTrack.d.ts +17 -0
- package/dist/world/minimapTrack.js +22 -0
- package/dist/world/pathInstances.d.ts +27 -0
- package/dist/world/pathInstances.js +27 -0
- package/dist/world/pathNetwork.d.ts +159 -0
- package/dist/world/pathNetwork.js +684 -0
- package/dist/world/pathTerrain.d.ts +80 -0
- package/dist/world/pathTerrain.js +142 -0
- package/dist/world/place.d.ts +166 -0
- package/dist/world/place.js +96 -0
- package/dist/world/placeAsset.d.ts +81 -0
- package/dist/world/placeAsset.js +79 -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/poleLineKind.d.ts +40 -0
- package/dist/world/poleLineKind.js +97 -0
- package/dist/world/polyline.d.ts +34 -0
- package/dist/world/polyline.js +88 -0
- package/dist/world/resourceNode.d.ts +109 -0
- package/dist/world/resourceNode.js +140 -0
- package/dist/world/roads.d.ts +8 -0
- package/dist/world/roads.js +38 -0
- package/dist/world/scatter.js +2 -20
- 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 +29 -0
- package/dist/world/streets.js +55 -0
- package/dist/world/terraform.d.ts +213 -1
- package/dist/world/terraform.js +627 -22
- package/dist/world/terrain.d.ts +164 -20
- package/dist/world/terrain.js +325 -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 +141 -0
- package/dist/world.js +141 -0
- package/package.json +32 -8
- package/skills/game-design/SKILL.md +28 -0
- package/skills/game-design/agents/openai.yaml +4 -0
- package/skills/game-design/references/application-playbook.md +170 -0
- package/skills/game-design/references/field-guide.md +288 -0
- package/skills/jgengine/SKILL.md +54 -0
- package/skills/jgengine/api.md +527 -0
- package/skills/jgengine/capabilities.md +131 -0
- package/skills/jgengine/recipes/minimal-game.md +88 -0
- package/skills/jgengine-combat/SKILL.md +38 -0
- package/skills/jgengine-combat/api.md +585 -0
- package/skills/jgengine-combat/capabilities.md +213 -0
- package/skills/jgengine-combat/recipes/portable-stat-pools.md +122 -0
- package/skills/jgengine-combat/reference.md +108 -0
- package/skills/jgengine-gameplay/SKILL.md +39 -0
- package/skills/jgengine-gameplay/api.md +1920 -0
- package/skills/jgengine-gameplay/capabilities.md +454 -0
- package/skills/jgengine-gameplay/reference-systems.md +56 -0
- package/skills/jgengine-world/SKILL.md +51 -0
- package/skills/jgengine-world/api.md +3056 -0
- package/skills/jgengine-world/capabilities.md +476 -0
- package/skills/jgengine-world/recipes/commanding-entities.md +128 -0
- package/skills/jgengine-world/reference.md +261 -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,32 @@
|
|
|
1
|
+
import type { ChangeSignal } from "../store/changeSignal.js";
|
|
2
|
+
import { type DevtoolsControlKind, type DiscoverySkip, type TunableOptions } from "./tunableSchema.js";
|
|
3
|
+
import type { ControlRecord } from "./controls.js";
|
|
4
|
+
import type { Devtools, Tunable } from "./types.js";
|
|
5
|
+
/** Internal record for an auto-discovered field: identity, kind, initial value, source object, and get/set accessors. */
|
|
6
|
+
export interface DiscoveredRecord {
|
|
7
|
+
id: string;
|
|
8
|
+
table: string;
|
|
9
|
+
key: string;
|
|
10
|
+
kind: DevtoolsControlKind;
|
|
11
|
+
initial: unknown;
|
|
12
|
+
enabled: boolean;
|
|
13
|
+
source: object | null;
|
|
14
|
+
options?: TunableOptions;
|
|
15
|
+
get(): unknown;
|
|
16
|
+
set(value: unknown): void;
|
|
17
|
+
}
|
|
18
|
+
/** Discovery subsystem: the public discover and probes facades plus internal record map and helpers. */
|
|
19
|
+
export interface DiscoverModule {
|
|
20
|
+
discover: Devtools["discover"];
|
|
21
|
+
probes: Devtools["probes"];
|
|
22
|
+
readProbes: () => Record<string, unknown>;
|
|
23
|
+
enableDiscovered: (id: string) => void;
|
|
24
|
+
discoveredRecords: Map<string, DiscoveredRecord>;
|
|
25
|
+
getDiscoverySkips: () => readonly DiscoverySkip[];
|
|
26
|
+
}
|
|
27
|
+
/** Create the discovery subsystem that scans objects/tables for tunable fields and binds them as controls and probes. */
|
|
28
|
+
export declare const createDiscoverModule: (deps: {
|
|
29
|
+
signal: ChangeSignal;
|
|
30
|
+
register: <T>(name: string, initial: T, options?: TunableOptions<T>) => Tunable<T>;
|
|
31
|
+
controlRecords: Map<string, ControlRecord>;
|
|
32
|
+
}) => DiscoverModule;
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
import { MAX_SCAN_DEPTH, MAX_SCAN_TARGETS, MAX_TABLE_ENTRIES, cloneValue, discoverableKind, isScannableContainer, joinTunablePath, ownWritableDataKeys, } from "./tunableSchema.js";
|
|
2
|
+
import { formatLogArg } from "./logs.js";
|
|
3
|
+
function collectScanTargets(root, meta) {
|
|
4
|
+
const skipped = [];
|
|
5
|
+
if (!isScannableContainer(root)) {
|
|
6
|
+
if (root !== null && typeof root === "object") {
|
|
7
|
+
skipped.push({ path: "", reason: "not a plain object or array" });
|
|
8
|
+
}
|
|
9
|
+
return { targets: [], skipped };
|
|
10
|
+
}
|
|
11
|
+
const out = [];
|
|
12
|
+
const visited = new Set([root]);
|
|
13
|
+
let frontier = [{ path: "", target: root }];
|
|
14
|
+
for (let depth = 0; depth <= MAX_SCAN_DEPTH && frontier.length > 0; depth += 1) {
|
|
15
|
+
const next = [];
|
|
16
|
+
for (const { path, target } of frontier) {
|
|
17
|
+
const keys = ownWritableDataKeys(target);
|
|
18
|
+
let scalarCount = 0;
|
|
19
|
+
for (const key of keys) {
|
|
20
|
+
const value = target[key];
|
|
21
|
+
const childPath = joinTunablePath(path, key);
|
|
22
|
+
const fieldMeta = meta?.[childPath];
|
|
23
|
+
const kind = discoverableKind(value, fieldMeta);
|
|
24
|
+
if (kind !== null) {
|
|
25
|
+
scalarCount += 1;
|
|
26
|
+
if (scalarCount > MAX_TABLE_ENTRIES) {
|
|
27
|
+
skipped.push({ path: path === "" ? "*" : path, reason: `more than ${MAX_TABLE_ENTRIES} scalar entries` });
|
|
28
|
+
scalarCount = -1;
|
|
29
|
+
break;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
if (scalarCount < 0)
|
|
34
|
+
continue;
|
|
35
|
+
for (const key of keys) {
|
|
36
|
+
const value = target[key];
|
|
37
|
+
const childPath = joinTunablePath(path, key);
|
|
38
|
+
const fieldMeta = meta?.[childPath];
|
|
39
|
+
const kind = discoverableKind(value, fieldMeta);
|
|
40
|
+
if (kind !== null) {
|
|
41
|
+
if (out.length >= MAX_SCAN_TARGETS) {
|
|
42
|
+
skipped.push({ path: childPath, reason: `scan cap ${MAX_SCAN_TARGETS}` });
|
|
43
|
+
return { targets: out, skipped };
|
|
44
|
+
}
|
|
45
|
+
out.push({ path: childPath, target, key, kind, options: fieldMeta });
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
if (value !== null && typeof value === "object") {
|
|
49
|
+
if (!isScannableContainer(value)) {
|
|
50
|
+
skipped.push({ path: childPath, reason: "unsupported structure" });
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
if (visited.has(value)) {
|
|
54
|
+
skipped.push({ path: childPath, reason: "cycle" });
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
if (depth === MAX_SCAN_DEPTH) {
|
|
58
|
+
skipped.push({ path: childPath, reason: `depth > ${MAX_SCAN_DEPTH}` });
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
visited.add(value);
|
|
62
|
+
next.push({ path: childPath, target: value });
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
frontier = next;
|
|
67
|
+
}
|
|
68
|
+
return { targets: out, skipped };
|
|
69
|
+
}
|
|
70
|
+
/** Create the discovery subsystem that scans objects/tables for tunable fields and binds them as controls and probes. */
|
|
71
|
+
export const createDiscoverModule = (deps) => {
|
|
72
|
+
const { signal, register, controlRecords } = deps;
|
|
73
|
+
const discoveredRecords = new Map();
|
|
74
|
+
const probeReaders = new Map();
|
|
75
|
+
let boundProps = new WeakMap();
|
|
76
|
+
let discoverySkips = [];
|
|
77
|
+
const readProbes = () => {
|
|
78
|
+
const values = {};
|
|
79
|
+
for (const [name, read] of probeReaders) {
|
|
80
|
+
try {
|
|
81
|
+
values[name] = read();
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
values[name] = `probe failed: ${formatLogArg(error)}`;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return values;
|
|
88
|
+
};
|
|
89
|
+
const bindDiscovered = (table, key, kind, accessor, source, options) => {
|
|
90
|
+
const id = `${table}/${key}`;
|
|
91
|
+
const existing = discoveredRecords.get(id);
|
|
92
|
+
if (existing === undefined) {
|
|
93
|
+
discoveredRecords.set(id, {
|
|
94
|
+
id,
|
|
95
|
+
table,
|
|
96
|
+
key,
|
|
97
|
+
kind,
|
|
98
|
+
initial: cloneValue(accessor.initial),
|
|
99
|
+
enabled: false,
|
|
100
|
+
source,
|
|
101
|
+
options,
|
|
102
|
+
get: accessor.get,
|
|
103
|
+
set: accessor.set,
|
|
104
|
+
});
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
if (source !== null && existing.source === source)
|
|
108
|
+
return false;
|
|
109
|
+
existing.source = source;
|
|
110
|
+
existing.get = accessor.get;
|
|
111
|
+
existing.set = accessor.set;
|
|
112
|
+
existing.kind = kind;
|
|
113
|
+
existing.options = options ?? existing.options;
|
|
114
|
+
const control = controlRecords.get(id);
|
|
115
|
+
if (existing.enabled && control !== undefined)
|
|
116
|
+
accessor.set(cloneValue(control.value));
|
|
117
|
+
return true;
|
|
118
|
+
};
|
|
119
|
+
const scanTable = (table, candidate, meta) => {
|
|
120
|
+
const { targets, skipped } = collectScanTargets(candidate, meta);
|
|
121
|
+
discoverySkips = [
|
|
122
|
+
...discoverySkips.filter((entry) => entry.path !== table && !entry.path.startsWith(`${table}/`)),
|
|
123
|
+
...skipped.map((entry) => ({
|
|
124
|
+
path: entry.path === "" ? table : `${table}/${entry.path}`,
|
|
125
|
+
reason: entry.reason,
|
|
126
|
+
})),
|
|
127
|
+
];
|
|
128
|
+
if (targets.length === 0)
|
|
129
|
+
return 0;
|
|
130
|
+
let changed = false;
|
|
131
|
+
let bound = 0;
|
|
132
|
+
for (const { path, target, key, kind, options } of targets) {
|
|
133
|
+
const boundKeys = boundProps.get(target);
|
|
134
|
+
if (boundKeys?.has(key) === true && !discoveredRecords.has(`${table}/${path}`))
|
|
135
|
+
continue;
|
|
136
|
+
const accessor = {
|
|
137
|
+
initial: cloneValue(target[key]),
|
|
138
|
+
get: () => target[key],
|
|
139
|
+
set: (value) => {
|
|
140
|
+
target[key] = value;
|
|
141
|
+
},
|
|
142
|
+
};
|
|
143
|
+
if (bindDiscovered(table, path, kind, accessor, target, options))
|
|
144
|
+
changed = true;
|
|
145
|
+
bound += 1;
|
|
146
|
+
if (boundKeys === undefined)
|
|
147
|
+
boundProps.set(target, new Set([key]));
|
|
148
|
+
else
|
|
149
|
+
boundKeys.add(key);
|
|
150
|
+
}
|
|
151
|
+
if (changed)
|
|
152
|
+
signal.notify();
|
|
153
|
+
return bound;
|
|
154
|
+
};
|
|
155
|
+
const enableDiscovered = (id) => {
|
|
156
|
+
const record = discoveredRecords.get(id);
|
|
157
|
+
if (record === undefined || record.enabled)
|
|
158
|
+
return;
|
|
159
|
+
record.enabled = true;
|
|
160
|
+
const current = record.get();
|
|
161
|
+
const handle = register(id, record.initial, {
|
|
162
|
+
...(record.options ?? {}),
|
|
163
|
+
group: record.options?.group ?? record.table,
|
|
164
|
+
label: record.options?.label ?? record.key,
|
|
165
|
+
kind: record.kind,
|
|
166
|
+
});
|
|
167
|
+
handle.subscribe((value) => record.set(cloneValue(value)));
|
|
168
|
+
if (JSON.stringify(current) !== JSON.stringify(record.initial))
|
|
169
|
+
handle.set(current);
|
|
170
|
+
};
|
|
171
|
+
return {
|
|
172
|
+
discover: {
|
|
173
|
+
bind(table, key, accessor, options) {
|
|
174
|
+
const kind = discoverableKind(accessor.initial, options);
|
|
175
|
+
if (kind === null)
|
|
176
|
+
return;
|
|
177
|
+
if (bindDiscovered(table, key, kind, accessor, null, options))
|
|
178
|
+
signal.notify();
|
|
179
|
+
},
|
|
180
|
+
scanTable,
|
|
181
|
+
scanModule(exports, meta) {
|
|
182
|
+
let total = 0;
|
|
183
|
+
for (const [name, value] of Object.entries(exports)) {
|
|
184
|
+
total += scanTable(name, value, meta);
|
|
185
|
+
}
|
|
186
|
+
return total;
|
|
187
|
+
},
|
|
188
|
+
list: () => [...discoveredRecords.values()].map((record) => ({
|
|
189
|
+
id: record.id,
|
|
190
|
+
table: record.table,
|
|
191
|
+
key: record.key,
|
|
192
|
+
kind: record.kind,
|
|
193
|
+
initial: record.initial,
|
|
194
|
+
enabled: record.enabled,
|
|
195
|
+
read: () => record.get(),
|
|
196
|
+
})),
|
|
197
|
+
skipped: () => discoverySkips,
|
|
198
|
+
enable(id) {
|
|
199
|
+
enableDiscovered(id);
|
|
200
|
+
signal.notify();
|
|
201
|
+
},
|
|
202
|
+
disable(id) {
|
|
203
|
+
const record = discoveredRecords.get(id);
|
|
204
|
+
if (record === undefined || !record.enabled)
|
|
205
|
+
return;
|
|
206
|
+
record.enabled = false;
|
|
207
|
+
record.set(cloneValue(record.initial));
|
|
208
|
+
controlRecords.delete(id);
|
|
209
|
+
signal.notify();
|
|
210
|
+
},
|
|
211
|
+
clear() {
|
|
212
|
+
for (const record of discoveredRecords.values()) {
|
|
213
|
+
if (record.enabled) {
|
|
214
|
+
record.set(cloneValue(record.initial));
|
|
215
|
+
controlRecords.delete(record.id);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
discoveredRecords.clear();
|
|
219
|
+
discoverySkips = [];
|
|
220
|
+
boundProps = new WeakMap();
|
|
221
|
+
signal.notify();
|
|
222
|
+
},
|
|
223
|
+
},
|
|
224
|
+
probes: {
|
|
225
|
+
register(name, read) {
|
|
226
|
+
probeReaders.set(name, read);
|
|
227
|
+
signal.notify();
|
|
228
|
+
return () => {
|
|
229
|
+
probeReaders.delete(name);
|
|
230
|
+
signal.notify();
|
|
231
|
+
};
|
|
232
|
+
},
|
|
233
|
+
read: readProbes,
|
|
234
|
+
},
|
|
235
|
+
readProbes,
|
|
236
|
+
enableDiscovered,
|
|
237
|
+
discoveredRecords,
|
|
238
|
+
getDiscoverySkips: () => discoverySkips,
|
|
239
|
+
};
|
|
240
|
+
};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Render seams that can resolve to a placeholder FALLBACK instead of authored content:
|
|
3
|
+
* `ground` (default green terrain), `entity`/`object` (primitive capsule/box actors),
|
|
4
|
+
* `scatter` (stylized proxy foliage).
|
|
5
|
+
*/
|
|
6
|
+
export type FallbackSeam = "ground" | "entity" | "object" | "scatter";
|
|
7
|
+
/**
|
|
8
|
+
* Why a seam fell back: `omittedMapping` (no mapping supplied — often intended),
|
|
9
|
+
* `unpulledPack` (a mapping was supplied but its asset pack is not pulled/indexed),
|
|
10
|
+
* `noScene` (nothing authored — e.g. no environment component).
|
|
11
|
+
*/
|
|
12
|
+
export type FallbackCause = "omittedMapping" | "unpulledPack" | "noScene";
|
|
13
|
+
/** A per-seam, per-cause count table. Serializable, allocation-stable (keys never change). */
|
|
14
|
+
export type FallbackSeamCounts = Record<FallbackSeam, Record<FallbackCause, number>>;
|
|
15
|
+
/** Non-zero-only view of {@link FallbackSeamCounts} returned by {@link fallbackSeamsSnapshot}. */
|
|
16
|
+
export type FallbackSeamsReport = Partial<Record<FallbackSeam, Partial<Record<FallbackCause, number>>>>;
|
|
17
|
+
/**
|
|
18
|
+
* Arm or disarm the fallback-seam diagnostic. Off by default; the shell arms it only when devtools
|
|
19
|
+
* is enabled (dev builds), so production is a pure no-op. Toggling clears all counts so a fresh
|
|
20
|
+
* observation starts empty and the opt-out path reports nothing.
|
|
21
|
+
* @capability render-fallback-diagnostics Enable/disable the dev-only placeholder-fallback probe.
|
|
22
|
+
*/
|
|
23
|
+
export declare function armFallbackSeams(on: boolean): void;
|
|
24
|
+
/**
|
|
25
|
+
* Record that a render seam CHOSE a placeholder fallback (called at the choice site). A pure,
|
|
26
|
+
* allocation-free no-op when disarmed — the disarmed guard returns before touching any table.
|
|
27
|
+
*
|
|
28
|
+
* Frame-boundary model: rather than a per-frame reset (which would flicker to empty on the many
|
|
29
|
+
* frames with no React re-render), each producing seam calls {@link beginFallbackSeam} at the top of
|
|
30
|
+
* its own render/compute, then reports during that same synchronous pass. This is idempotent under
|
|
31
|
+
* React StrictMode / concurrent double-render and keeps seams that re-render independently (entities
|
|
32
|
+
* vs. scatter vs. ground) from clobbering one another. {@link endFallbackPass} only emits the log.
|
|
33
|
+
* @capability render-fallback-diagnostics Report a seam resolving to a placeholder fallback.
|
|
34
|
+
*/
|
|
35
|
+
export declare function reportFallbackSeam(seam: FallbackSeam, cause: FallbackCause): void;
|
|
36
|
+
/** Zero one seam's tally before it re-reports (per-seam frame boundary). No-op when disarmed. */
|
|
37
|
+
export declare function beginFallbackSeam(seam: FallbackSeam): void;
|
|
38
|
+
/** Zero every seam's tally. Used to bracket a whole observation batch (e.g. in tests). No-op when disarmed. */
|
|
39
|
+
export declare function beginFallbackPass(): void;
|
|
40
|
+
/**
|
|
41
|
+
* Close an observation pass: when the set of active fallbacks changes to a non-empty signature, emit
|
|
42
|
+
* ONE deduped warn line (never per-frame — the signature dedup suppresses repeats). No-op when disarmed.
|
|
43
|
+
*/
|
|
44
|
+
export declare function endFallbackPass(): void;
|
|
45
|
+
/**
|
|
46
|
+
* Snapshot the current fallback tally as a compact, serializable object (non-zero entries only; empty
|
|
47
|
+
* when nothing fell back). Flows into the devtools `fallbacks` probe and the `debug_snapshot` RPC.
|
|
48
|
+
* @capability render-fallback-diagnostics Read authored-vs-placeholder fallback counts per seam.
|
|
49
|
+
*/
|
|
50
|
+
export declare function fallbackSeamsSnapshot(): FallbackSeamsReport;
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { devtools } from "./devtools.js";
|
|
2
|
+
const SEAMS = ["ground", "entity", "object", "scatter"];
|
|
3
|
+
const CAUSES = ["omittedMapping", "unpulledPack", "noScene"];
|
|
4
|
+
function freshCounts() {
|
|
5
|
+
const out = {};
|
|
6
|
+
for (const seam of SEAMS) {
|
|
7
|
+
const row = {};
|
|
8
|
+
for (const cause of CAUSES)
|
|
9
|
+
row[cause] = 0;
|
|
10
|
+
out[seam] = row;
|
|
11
|
+
}
|
|
12
|
+
return out;
|
|
13
|
+
}
|
|
14
|
+
// Module-private state. `counts` is the authoritative live tally; report sites write into it directly
|
|
15
|
+
// and each re-zeros its own seam before re-tallying (see the frame-boundary note in reportFallbackSeam).
|
|
16
|
+
// Pre-allocated tables so the report/begin/end hot paths do zero allocation.
|
|
17
|
+
let enabled = false;
|
|
18
|
+
const counts = freshCounts();
|
|
19
|
+
let lastSignature = "";
|
|
20
|
+
function zeroSeam(seam) {
|
|
21
|
+
const row = counts[seam];
|
|
22
|
+
for (const cause of CAUSES)
|
|
23
|
+
row[cause] = 0;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Arm or disarm the fallback-seam diagnostic. Off by default; the shell arms it only when devtools
|
|
27
|
+
* is enabled (dev builds), so production is a pure no-op. Toggling clears all counts so a fresh
|
|
28
|
+
* observation starts empty and the opt-out path reports nothing.
|
|
29
|
+
* @capability render-fallback-diagnostics Enable/disable the dev-only placeholder-fallback probe.
|
|
30
|
+
*/
|
|
31
|
+
export function armFallbackSeams(on) {
|
|
32
|
+
enabled = on;
|
|
33
|
+
for (const seam of SEAMS)
|
|
34
|
+
zeroSeam(seam);
|
|
35
|
+
lastSignature = "";
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Record that a render seam CHOSE a placeholder fallback (called at the choice site). A pure,
|
|
39
|
+
* allocation-free no-op when disarmed — the disarmed guard returns before touching any table.
|
|
40
|
+
*
|
|
41
|
+
* Frame-boundary model: rather than a per-frame reset (which would flicker to empty on the many
|
|
42
|
+
* frames with no React re-render), each producing seam calls {@link beginFallbackSeam} at the top of
|
|
43
|
+
* its own render/compute, then reports during that same synchronous pass. This is idempotent under
|
|
44
|
+
* React StrictMode / concurrent double-render and keeps seams that re-render independently (entities
|
|
45
|
+
* vs. scatter vs. ground) from clobbering one another. {@link endFallbackPass} only emits the log.
|
|
46
|
+
* @capability render-fallback-diagnostics Report a seam resolving to a placeholder fallback.
|
|
47
|
+
*/
|
|
48
|
+
export function reportFallbackSeam(seam, cause) {
|
|
49
|
+
if (!enabled)
|
|
50
|
+
return;
|
|
51
|
+
counts[seam][cause] += 1;
|
|
52
|
+
}
|
|
53
|
+
/** Zero one seam's tally before it re-reports (per-seam frame boundary). No-op when disarmed. */
|
|
54
|
+
export function beginFallbackSeam(seam) {
|
|
55
|
+
if (!enabled)
|
|
56
|
+
return;
|
|
57
|
+
zeroSeam(seam);
|
|
58
|
+
}
|
|
59
|
+
/** Zero every seam's tally. Used to bracket a whole observation batch (e.g. in tests). No-op when disarmed. */
|
|
60
|
+
export function beginFallbackPass() {
|
|
61
|
+
if (!enabled)
|
|
62
|
+
return;
|
|
63
|
+
for (const seam of SEAMS)
|
|
64
|
+
zeroSeam(seam);
|
|
65
|
+
}
|
|
66
|
+
function signature() {
|
|
67
|
+
let sig = "";
|
|
68
|
+
for (const seam of SEAMS) {
|
|
69
|
+
for (const cause of CAUSES) {
|
|
70
|
+
const n = counts[seam][cause];
|
|
71
|
+
if (n > 0)
|
|
72
|
+
sig += `${seam}:${cause}=${n}|`;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return sig;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Close an observation pass: when the set of active fallbacks changes to a non-empty signature, emit
|
|
79
|
+
* ONE deduped warn line (never per-frame — the signature dedup suppresses repeats). No-op when disarmed.
|
|
80
|
+
*/
|
|
81
|
+
export function endFallbackPass() {
|
|
82
|
+
if (!enabled)
|
|
83
|
+
return;
|
|
84
|
+
const sig = signature();
|
|
85
|
+
if (sig === lastSignature)
|
|
86
|
+
return;
|
|
87
|
+
lastSignature = sig;
|
|
88
|
+
if (sig === "")
|
|
89
|
+
return;
|
|
90
|
+
devtools.logs.push("warn", `[jgengine] render seams resolved to placeholder fallbacks — ${sig.replace(/\|$/, "").replaceAll("|", ", ")}. ` +
|
|
91
|
+
`Author the missing mapping/pack/scene, or ignore if the placeholder is intended.`);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Snapshot the current fallback tally as a compact, serializable object (non-zero entries only; empty
|
|
95
|
+
* when nothing fell back). Flows into the devtools `fallbacks` probe and the `debug_snapshot` RPC.
|
|
96
|
+
* @capability render-fallback-diagnostics Read authored-vs-placeholder fallback counts per seam.
|
|
97
|
+
*/
|
|
98
|
+
export function fallbackSeamsSnapshot() {
|
|
99
|
+
const out = {};
|
|
100
|
+
for (const seam of SEAMS) {
|
|
101
|
+
let row;
|
|
102
|
+
for (const cause of CAUSES) {
|
|
103
|
+
const n = counts[seam][cause];
|
|
104
|
+
if (n > 0)
|
|
105
|
+
(row ??= {})[cause] = n;
|
|
106
|
+
}
|
|
107
|
+
if (row !== undefined)
|
|
108
|
+
out[seam] = row;
|
|
109
|
+
}
|
|
110
|
+
return out;
|
|
111
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Devtools } from "./types.js";
|
|
2
|
+
/** Frame duration in milliseconds above which a frame is recorded as a long-frame spike (~30fps budget). */
|
|
3
|
+
export declare const LONG_FRAME_MS = 33.4;
|
|
4
|
+
/** @internal */
|
|
5
|
+
export declare function nowMs(): number;
|
|
6
|
+
/** Frame subsystem exposing the frame-timing, profiling, and render-sample facades. */
|
|
7
|
+
export interface FrameModule {
|
|
8
|
+
frame: Devtools["frame"];
|
|
9
|
+
profile: Devtools["profile"];
|
|
10
|
+
render: Devtools["render"];
|
|
11
|
+
}
|
|
12
|
+
/** Create the frame subsystem that records frame/sim/phase timings, computes stats, and captures long-frame events. */
|
|
13
|
+
export declare const createFrameModule: (deps: {
|
|
14
|
+
readProbes: () => Record<string, unknown>;
|
|
15
|
+
}) => FrameModule;
|