@jgengine/core 0.9.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +34 -3
- package/LICENSE +203 -661
- package/README.md +1 -1
- package/dist/ai/crowd.d.ts +55 -0
- package/dist/ai/crowd.js +114 -0
- package/dist/ai/flock.d.ts +5 -2
- package/dist/ai/flock.js +5 -2
- package/dist/ai/groupAssist.d.ts +1 -0
- package/dist/ai/groupAssist.js +1 -0
- package/dist/ai/heatSystem.d.ts +76 -0
- package/dist/ai/heatSystem.js +97 -0
- package/dist/ai/interestScheduler.d.ts +107 -0
- package/dist/ai/interestScheduler.js +118 -0
- package/dist/ai/jobBoard.d.ts +1 -0
- package/dist/ai/jobBoard.js +1 -0
- package/dist/ai/laneSelect.d.ts +5 -2
- package/dist/ai/laneSelect.js +5 -2
- package/dist/ai/mobBrain.d.ts +1 -0
- package/dist/ai/mobBrain.js +1 -0
- package/dist/ai/spawnDirector.d.ts +19 -1
- package/dist/ai/spawnDirector.js +53 -26
- package/dist/ai/spawnPoint.d.ts +7 -0
- package/dist/ai/spawnPoint.js +7 -0
- package/dist/ai/targetAcquisition.d.ts +84 -0
- package/dist/ai/targetAcquisition.js +92 -0
- package/dist/anim/easing.d.ts +19 -0
- package/dist/anim/easing.js +19 -0
- package/dist/anim/oscillator.d.ts +12 -0
- package/dist/anim/oscillator.js +25 -0
- package/dist/area/areaEffectField.d.ts +127 -0
- package/dist/area/areaEffectField.js +175 -0
- package/dist/area/stackPolicy.d.ts +47 -0
- package/dist/area/stackPolicy.js +99 -0
- package/dist/audio/audioFalloff.d.ts +5 -2
- package/dist/audio/music.d.ts +53 -0
- package/dist/audio/music.js +34 -0
- package/dist/audio/synth.d.ts +60 -0
- package/dist/audio/synth.js +8 -0
- package/dist/authoring.d.ts +15 -0
- package/dist/authoring.js +15 -0
- package/dist/board/laneBoard.d.ts +13 -0
- package/dist/board/laneBoard.js +13 -0
- package/dist/board/timelineBoard.d.ts +10 -0
- package/dist/board/timelineBoard.js +10 -0
- package/dist/combat/abilityKit.d.ts +18 -0
- package/dist/combat/abilityKit.js +24 -9
- package/dist/combat/animationState.d.ts +5 -0
- package/dist/combat/animationState.js +5 -0
- package/dist/combat/breakMeters.d.ts +10 -0
- package/dist/combat/breakMeters.js +10 -0
- package/dist/combat/castRunner.d.ts +5 -0
- package/dist/combat/castRunner.js +5 -0
- package/dist/combat/comboPoints.d.ts +5 -0
- package/dist/combat/comboPoints.js +5 -0
- package/dist/combat/comboString.d.ts +5 -0
- package/dist/combat/comboString.js +5 -0
- package/dist/combat/damageInterceptors.d.ts +192 -0
- package/dist/combat/damageInterceptors.js +251 -0
- package/dist/combat/damageMatchup.d.ts +68 -0
- package/dist/combat/damageMatchup.js +42 -0
- package/dist/combat/damageResolution.d.ts +63 -0
- package/dist/combat/damageResolution.js +50 -0
- package/dist/combat/death.d.ts +7 -1
- package/dist/combat/death.js +5 -0
- package/dist/combat/deathReason.d.ts +14 -0
- package/dist/combat/deathReason.js +1 -0
- package/dist/combat/defensiveWindow.d.ts +5 -0
- package/dist/combat/defensiveWindow.js +5 -0
- package/dist/combat/dotField.d.ts +47 -0
- package/dist/combat/dotField.js +52 -0
- package/dist/combat/downed.d.ts +5 -0
- package/dist/combat/downed.js +5 -0
- package/dist/combat/effects.d.ts +5 -0
- package/dist/combat/effects.js +5 -0
- package/dist/combat/encounterSequence.d.ts +258 -0
- package/dist/combat/encounterSequence.js +426 -0
- package/dist/combat/hitReaction.d.ts +57 -1
- package/dist/combat/hitReaction.js +45 -5
- package/dist/combat/magazine.d.ts +54 -0
- package/dist/combat/magazine.js +96 -0
- package/dist/combat/projectiles.d.ts +7 -2
- package/dist/combat/projectiles.js +48 -17
- package/dist/combat/receivedDamage.d.ts +117 -0
- package/dist/combat/receivedDamage.js +92 -0
- package/dist/combat/regenShield.d.ts +39 -0
- package/dist/combat/regenShield.js +49 -0
- package/dist/combat/renderCues.d.ts +51 -0
- package/dist/combat/renderCues.js +44 -0
- package/dist/combat/resourcePool.d.ts +5 -0
- package/dist/combat/resourcePool.js +5 -0
- package/dist/combat/rewardAllocation.d.ts +121 -0
- package/dist/combat/rewardAllocation.js +251 -0
- package/dist/combat/shotOrigin.d.ts +30 -1
- package/dist/combat/shotOrigin.js +70 -2
- package/dist/combat/statusApplication.d.ts +96 -0
- package/dist/combat/statusApplication.js +81 -0
- package/dist/combat/telegraph.d.ts +11 -2
- package/dist/combat/telegraph.js +11 -2
- package/dist/combat/thresholdCrossings.d.ts +85 -0
- package/dist/combat/thresholdCrossings.js +116 -0
- package/dist/combat.d.ts +34 -0
- package/dist/combat.js +34 -0
- package/dist/commands/commandRegistry.d.ts +11 -0
- package/dist/commands/commandRegistry.js +9 -2
- package/dist/crafting/crop.d.ts +18 -0
- package/dist/crafting/crop.js +18 -0
- package/dist/crafting/production.d.ts +5 -0
- package/dist/crafting/production.js +5 -0
- package/dist/devtools/rewriteTunables.d.ts +17 -0
- package/dist/devtools/rewriteTunables.js +276 -0
- package/dist/devtools/saveEndpoint.d.ts +46 -0
- package/dist/devtools/saveEndpoint.js +48 -0
- package/dist/devtools/transformTunables.d.ts +3 -0
- package/dist/devtools/transformTunables.js +3 -0
- package/dist/devtools/tunableSchema.d.ts +31 -0
- package/dist/devtools/tunableSchema.js +31 -0
- package/dist/economy/currency.d.ts +12 -1
- package/dist/economy/currency.js +12 -1
- package/dist/economy/listingBook.d.ts +91 -0
- package/dist/economy/listingBook.js +144 -0
- package/dist/economy/resourceLedger.d.ts +222 -0
- package/dist/economy/resourceLedger.js +353 -0
- package/dist/economy/sharedWallet.d.ts +14 -0
- package/dist/economy/sharedWallet.js +14 -0
- package/dist/economy/techTree.d.ts +12 -0
- package/dist/economy/techTree.js +12 -0
- package/dist/economy/wallet.d.ts +26 -2
- package/dist/economy/wallet.js +35 -6
- package/dist/editor/commands.d.ts +248 -0
- package/dist/editor/commands.js +865 -0
- package/dist/editor/document.d.ts +186 -0
- package/dist/editor/document.js +884 -0
- package/dist/editor/grid.d.ts +229 -0
- package/dist/editor/grid.js +366 -0
- package/dist/editor/gridAdapters.d.ts +80 -0
- package/dist/editor/gridAdapters.js +134 -0
- package/dist/editor/index.d.ts +97 -0
- package/dist/editor/index.js +10 -0
- package/dist/editor/liveSync.d.ts +127 -0
- package/dist/editor/liveSync.js +249 -0
- package/dist/editor/runtimeInspector.d.ts +88 -0
- package/dist/editor/runtimeInspector.js +239 -0
- package/dist/editor/types.d.ts +175 -0
- package/dist/editor/types.js +29 -0
- package/dist/faction/reputation.d.ts +5 -0
- package/dist/faction/reputation.js +5 -0
- package/dist/format/distance.d.ts +17 -0
- package/dist/format/distance.js +18 -0
- package/dist/format/duration.d.ts +27 -0
- package/dist/format/duration.js +45 -0
- package/dist/format/speed.d.ts +17 -0
- package/dist/format/speed.js +25 -0
- package/dist/game/connectedPlayers.d.ts +30 -0
- package/dist/game/connectedPlayers.js +21 -0
- package/dist/game/cosmetics.d.ts +9 -0
- package/dist/game/cosmetics.js +16 -0
- package/dist/game/defineGame.d.ts +141 -2
- package/dist/game/defineGame.js +39 -1
- package/dist/game/defineSystem.d.ts +88 -0
- package/dist/game/defineSystem.js +45 -0
- package/dist/game/dialogue.d.ts +33 -0
- package/dist/game/dialogue.js +21 -0
- package/dist/game/events.d.ts +50 -13
- package/dist/game/events.js +5 -0
- package/dist/game/feed.d.ts +33 -0
- package/dist/game/feed.js +35 -2
- package/dist/game/gamePhase.d.ts +11 -0
- package/dist/game/gamePhase.js +16 -0
- package/dist/game/keyValueStore.d.ts +25 -0
- package/dist/game/keyValueStore.js +61 -0
- package/dist/game/leaderboard.d.ts +5 -0
- package/dist/game/leaderboard.js +5 -0
- package/dist/game/levelSequence.d.ts +24 -2
- package/dist/game/levelSequence.js +51 -2
- package/dist/game/loadout.d.ts +5 -0
- package/dist/game/loadout.js +5 -0
- package/dist/game/lootFilter.d.ts +2 -0
- package/dist/game/lootFilter.js +2 -0
- package/dist/game/lootPipeline.d.ts +164 -0
- package/dist/game/lootPipeline.js +216 -0
- package/dist/game/lootTable.d.ts +21 -0
- package/dist/game/lootTable.js +15 -4
- package/dist/game/modelAnimation.d.ts +8 -0
- package/dist/game/modelAnimation.js +18 -0
- package/dist/game/objectives.d.ts +43 -0
- package/dist/game/objectives.js +36 -0
- package/dist/game/paramLayers.d.ts +148 -0
- package/dist/game/paramLayers.js +185 -0
- package/dist/game/ping.d.ts +5 -0
- package/dist/game/ping.js +5 -0
- package/dist/game/playableGame.d.ts +160 -12
- package/dist/game/quest.d.ts +8 -0
- package/dist/game/quest.js +29 -0
- package/dist/game/race.d.ts +141 -0
- package/dist/game/race.js +169 -0
- package/dist/game/recordBook.d.ts +5 -5
- package/dist/game/recordBook.js +4 -1
- package/dist/game/ruleSelection.d.ts +75 -0
- package/dist/game/ruleSelection.js +127 -0
- package/dist/game/runDraft.d.ts +5 -0
- package/dist/game/runDraft.js +5 -0
- package/dist/game/saveStore.d.ts +111 -0
- package/dist/game/saveStore.js +312 -0
- package/dist/game/snapshotHistory.d.ts +67 -0
- package/dist/game/snapshotHistory.js +95 -0
- package/dist/game/social.d.ts +38 -1
- package/dist/game/social.js +71 -0
- package/dist/game/spawnPoints.d.ts +5 -0
- package/dist/game/spawnPoints.js +5 -0
- package/dist/game/systemRuntime.d.ts +50 -0
- package/dist/game/systemRuntime.js +157 -0
- package/dist/game/systemSchedule.d.ts +72 -0
- package/dist/game/systemSchedule.js +242 -0
- package/dist/game/toasts.d.ts +43 -0
- package/dist/game/toasts.js +44 -0
- package/dist/game/trade.d.ts +10 -0
- package/dist/game/trade.js +10 -0
- package/dist/game/unlocks.d.ts +8 -0
- package/dist/game/unlocks.js +16 -0
- package/dist/game/vfxInstance.d.ts +138 -0
- package/dist/game/vfxInstance.js +96 -0
- package/dist/game/worldItem.d.ts +17 -4
- package/dist/game/worldItem.js +17 -4
- package/dist/gameplay.d.ts +91 -0
- package/dist/gameplay.js +91 -0
- package/dist/index.d.ts +5 -7
- package/dist/index.js +5 -7
- package/dist/input/actionBindings.d.ts +24 -5
- package/dist/input/actionBindings.js +23 -5
- package/dist/input/axisInput.d.ts +13 -1
- package/dist/input/axisInput.js +22 -1
- package/dist/input/controlGroups.d.ts +67 -0
- package/dist/input/controlGroups.js +41 -0
- package/dist/input/touchScheme.d.ts +82 -6
- package/dist/input/touchScheme.js +123 -10
- package/dist/interaction/contextMenu.d.ts +1 -0
- package/dist/interaction/contextMenu.js +1 -0
- package/dist/interaction/lockpick.d.ts +61 -0
- package/dist/interaction/lockpick.js +168 -0
- package/dist/interaction/proximityPrompt.d.ts +5 -1
- package/dist/interaction/proximityPrompt.js +5 -3
- package/dist/interaction/qte.d.ts +5 -0
- package/dist/interaction/qte.js +5 -0
- package/dist/interaction/skillCheck.d.ts +5 -0
- package/dist/interaction/skillCheck.js +5 -0
- package/dist/inventory/inventoryModel.d.ts +12 -0
- package/dist/inventory/inventoryModel.js +12 -0
- package/dist/inventory/shapedGrid.d.ts +16 -0
- package/dist/inventory/shapedGrid.js +16 -0
- package/dist/inventory/slotModel.d.ts +10 -0
- package/dist/inventory/slotModel.js +10 -0
- package/dist/item/durability.d.ts +5 -0
- package/dist/item/durability.js +5 -0
- package/dist/item/itemIdentity.d.ts +171 -0
- package/dist/item/itemIdentity.js +138 -0
- package/dist/item/itemInstanceRegistry.d.ts +32 -0
- package/dist/item/itemInstanceRegistry.js +34 -0
- package/dist/item/itemgen.d.ts +163 -0
- package/dist/item/itemgen.js +151 -0
- package/dist/item/modularItem.d.ts +5 -0
- package/dist/item/modularItem.js +5 -0
- package/dist/item/use.d.ts +5 -0
- package/dist/item/use.js +5 -0
- package/dist/item/useBehavior.d.ts +142 -0
- package/dist/item/useBehavior.js +105 -0
- package/dist/item/weapon.d.ts +5 -0
- package/dist/item/weapon.js +5 -0
- package/dist/math/scalar.d.ts +25 -0
- package/dist/math/scalar.js +47 -0
- package/dist/meta/changelog.d.ts +4 -1
- package/dist/meta/changelog.js +36 -1
- package/dist/movement/avoidance.d.ts +45 -0
- package/dist/movement/avoidance.js +123 -0
- package/dist/movement/cameraRig.d.ts +8 -0
- package/dist/movement/cameraRig.js +8 -0
- package/dist/movement/dash.d.ts +11 -0
- package/dist/movement/dash.js +11 -0
- package/dist/movement/formation.d.ts +135 -0
- package/dist/movement/formation.js +194 -0
- package/dist/movement/glideModel.d.ts +5 -0
- package/dist/movement/glideModel.js +5 -0
- package/dist/movement/grappleSwing.d.ts +5 -0
- package/dist/movement/grappleSwing.js +5 -0
- package/dist/movement/leaderTrail.d.ts +5 -0
- package/dist/movement/leaderTrail.js +5 -0
- package/dist/movement/movementModel.d.ts +38 -7
- package/dist/movement/movementModel.js +54 -13
- package/dist/movement/playerMovement.d.ts +41 -0
- package/dist/movement/playerMovement.js +236 -0
- package/dist/movement/poseState.d.ts +13 -0
- package/dist/movement/poseState.js +16 -0
- package/dist/movement/steering.d.ts +8 -0
- package/dist/movement/steering.js +18 -0
- package/dist/multiplayer/combatSnapshot.d.ts +3 -0
- package/dist/multiplayer/combatSnapshot.js +3 -0
- package/dist/multiplayer/lagCompensation.d.ts +5 -0
- package/dist/multiplayer/lagCompensation.js +5 -0
- package/dist/multiplayer/presenceModel.d.ts +9 -1
- package/dist/multiplayer/presenceModel.js +9 -1
- package/dist/multiplayer/simultaneousCommit.d.ts +3 -0
- package/dist/multiplayer/simultaneousCommit.js +3 -0
- package/dist/multiplayer.d.ts +11 -0
- package/dist/multiplayer.js +11 -0
- package/dist/nav/pathFollow.d.ts +57 -0
- package/dist/nav/pathFollow.js +109 -0
- package/dist/orders/orderKinds.d.ts +156 -0
- package/dist/orders/orderKinds.js +197 -0
- package/dist/orders/orderQueue.d.ts +208 -0
- package/dist/orders/orderQueue.js +211 -0
- package/dist/physics/drivableVehicle.d.ts +29 -0
- package/dist/physics/drivableVehicle.js +16 -0
- package/dist/physics/kinematicVehicle.d.ts +21 -1
- package/dist/physics/kinematicVehicle.js +23 -8
- package/dist/physics/physicsWorld.d.ts +24 -12
- package/dist/physics/physicsWorld.js +11 -5
- package/dist/physics/radialImpulse.d.ts +25 -0
- package/dist/physics/radialImpulse.js +27 -0
- package/dist/procedural.d.ts +3 -0
- package/dist/procedural.js +3 -0
- package/dist/progression/statGraph.d.ts +116 -0
- package/dist/progression/statGraph.js +318 -0
- package/dist/puzzle/cellGrid.d.ts +9 -0
- package/dist/puzzle/cellGrid.js +9 -0
- package/dist/puzzle/fallingPiece.d.ts +9 -0
- package/dist/puzzle/fallingPiece.js +9 -0
- package/dist/puzzle/nonogram.d.ts +39 -0
- package/dist/puzzle/nonogram.js +136 -0
- package/dist/random/nameGen.d.ts +5 -0
- package/dist/random/nameGen.js +5 -0
- package/dist/random/pick.d.ts +8 -0
- package/dist/random/pick.js +31 -0
- package/dist/random/rng.d.ts +24 -0
- package/dist/random/rng.js +30 -8
- package/dist/random/seedLink.d.ts +4 -0
- package/dist/random/seedLink.js +4 -0
- package/dist/relation/keyedValues.d.ts +54 -0
- package/dist/relation/keyedValues.js +115 -0
- package/dist/relation/thresholds.d.ts +62 -0
- package/dist/relation/thresholds.js +62 -0
- package/dist/render/color.d.ts +12 -0
- package/dist/render/color.js +26 -0
- package/dist/render/lookPreset.d.ts +41 -0
- package/dist/render/lookPreset.js +29 -0
- package/dist/render/postProcessing.d.ts +76 -0
- package/dist/render/postProcessing.js +21 -0
- package/dist/rules/predicate.d.ts +53 -0
- package/dist/rules/predicate.js +64 -0
- package/dist/rules/ruleEffects.d.ts +38 -0
- package/dist/rules/ruleEffects.js +37 -0
- package/dist/rules/triggeredRules.d.ts +160 -0
- package/dist/rules/triggeredRules.js +241 -0
- package/dist/runtime/adapter.d.ts +58 -0
- package/dist/runtime/adapter.js +54 -5
- package/dist/runtime/cameraDirector.d.ts +1 -0
- package/dist/runtime/cameraDirector.js +1 -0
- package/dist/runtime/commandRunner.d.ts +1 -0
- package/dist/runtime/commandRunner.js +1 -0
- package/dist/runtime/context/combatFx.d.ts +23 -0
- package/dist/runtime/context/combatFx.js +161 -0
- package/dist/runtime/context/registries.d.ts +13 -0
- package/dist/runtime/context/registries.js +84 -0
- package/dist/runtime/context/worldItems.d.ts +21 -0
- package/dist/runtime/context/worldItems.js +37 -0
- package/dist/runtime/descriptors/baseline.d.ts +48 -0
- package/dist/runtime/descriptors/baseline.js +134 -0
- package/dist/runtime/descriptors/features.d.ts +74 -0
- package/dist/runtime/descriptors/features.js +281 -0
- package/dist/runtime/gameContext.d.ts +163 -19
- package/dist/runtime/gameContext.js +385 -339
- package/dist/runtime/gameRuntime.d.ts +1 -0
- package/dist/runtime/gameRuntime.js +1 -0
- package/dist/runtime/headlessRunner.d.ts +60 -0
- package/dist/runtime/headlessRunner.js +44 -0
- package/dist/runtime/hostPersistence.d.ts +12 -0
- package/dist/runtime/hostPersistence.js +12 -0
- package/dist/runtime/hostedGameRunner.d.ts +54 -0
- package/dist/runtime/hostedGameRunner.js +85 -0
- package/dist/runtime/hostedWorldSession.d.ts +73 -0
- package/dist/runtime/hostedWorldSession.js +64 -0
- package/dist/runtime/inputSnapshot.d.ts +21 -3
- package/dist/runtime/inputSnapshot.js +8 -2
- package/dist/runtime/motionIntents.d.ts +12 -1
- package/dist/runtime/motionIntents.js +26 -1
- package/dist/runtime/perContext.d.ts +15 -0
- package/dist/runtime/perContext.js +21 -0
- package/dist/runtime/runtimeSave.d.ts +79 -0
- package/dist/runtime/runtimeSave.js +105 -0
- package/dist/runtime/save.d.ts +4 -0
- package/dist/runtime/save.js +4 -0
- package/dist/runtime/snapshot.d.ts +7 -0
- package/dist/runtime/snapshot.js +7 -0
- package/dist/runtime/visibility.d.ts +2 -1
- package/dist/runtime/visibility.js +2 -1
- package/dist/runtime/worldChannel.d.ts +62 -0
- package/dist/runtime/worldChannel.js +114 -0
- package/dist/runtime/worldMirror.d.ts +36 -0
- package/dist/runtime/worldMirror.js +44 -0
- package/dist/runtime/worldProjection.d.ts +47 -0
- package/dist/runtime/worldProjection.js +52 -0
- package/dist/runtime/worldReplication.d.ts +69 -0
- package/dist/runtime/worldReplication.js +217 -0
- package/dist/runtime/worldSnapshot.d.ts +44 -0
- package/dist/runtime/worldSnapshot.js +30 -0
- package/dist/scene/assetCatalog.d.ts +22 -0
- package/dist/scene/assetCatalog.js +4 -0
- package/dist/scene/assetDiagnostics.d.ts +69 -0
- package/dist/scene/assetDiagnostics.js +110 -0
- package/dist/scene/assetGenerator.d.ts +65 -0
- package/dist/scene/assetGenerator.js +64 -0
- package/dist/scene/assetSpace.d.ts +137 -0
- package/dist/scene/assetSpace.js +259 -0
- package/dist/scene/authoredTriggers.d.ts +169 -0
- package/dist/scene/authoredTriggers.js +340 -0
- package/dist/scene/behaviorRuntime.d.ts +75 -0
- package/dist/scene/behaviorRuntime.js +217 -0
- package/dist/scene/behaviors.d.ts +14 -2
- package/dist/scene/behaviors.js +7 -2
- package/dist/scene/bodyBind.d.ts +60 -0
- package/dist/scene/bodyBind.js +51 -0
- package/dist/scene/builtinSceneKinds.d.ts +5 -0
- package/dist/scene/builtinSceneKinds.js +62 -0
- package/dist/scene/colliders.d.ts +18 -0
- package/dist/scene/colliders.js +61 -1
- package/dist/scene/entityStats.d.ts +13 -0
- package/dist/scene/entityStats.js +30 -0
- package/dist/scene/entityStore.d.ts +41 -1
- package/dist/scene/entityStore.js +75 -0
- package/dist/scene/facing.d.ts +18 -0
- package/dist/scene/facing.js +26 -0
- package/dist/scene/modelSockets.d.ts +33 -0
- package/dist/scene/modelSockets.js +29 -0
- package/dist/scene/objectQuery.d.ts +2 -0
- package/dist/scene/objectQuery.js +2 -0
- package/dist/scene/objectStore.d.ts +4 -0
- package/dist/scene/objectStore.js +6 -0
- package/dist/scene/possession.d.ts +8 -0
- package/dist/scene/possession.js +14 -0
- package/dist/scene/roster.d.ts +3 -0
- package/dist/scene/roster.js +12 -0
- package/dist/scene/sceneKinds.d.ts +240 -0
- package/dist/scene/sceneKinds.js +214 -0
- package/dist/scene/sceneOwnership.d.ts +169 -0
- package/dist/scene/sceneOwnership.js +179 -0
- package/dist/scene/selectionBookmarks.d.ts +93 -0
- package/dist/scene/selectionBookmarks.js +122 -0
- package/dist/scene/vehicleSeat.d.ts +68 -0
- package/dist/scene/vehicleSeat.js +59 -0
- package/dist/sensor/concealment.d.ts +3 -0
- package/dist/sensor/concealment.js +3 -0
- package/dist/sensor/freezeMonitor.d.ts +1 -0
- package/dist/sensor/freezeMonitor.js +1 -0
- package/dist/sensor/frustumSensor.d.ts +7 -3
- package/dist/sensor/frustumSensor.js +7 -3
- package/dist/sensor/hiddenStateProbe.d.ts +5 -2
- package/dist/sensor/hiddenStateProbe.js +5 -2
- package/dist/sensor/recordingBuffer.d.ts +2 -1
- package/dist/sensor/recordingBuffer.js +2 -1
- package/dist/sensor/replayLoop.d.ts +6 -2
- package/dist/sensor/replayLoop.js +6 -2
- package/dist/sensor/revealQuery.d.ts +2 -1
- package/dist/sensor/revealQuery.js +2 -1
- package/dist/sensor/visionCone.d.ts +10 -3
- package/dist/sensor/visionCone.js +10 -3
- package/dist/session/contestedChannel.d.ts +1 -0
- package/dist/session/contestedChannel.js +1 -0
- package/dist/session/extraction.d.ts +1 -0
- package/dist/session/extraction.js +1 -0
- package/dist/session/roles.d.ts +6 -0
- package/dist/session/roles.js +6 -0
- package/dist/session/roundState.d.ts +8 -0
- package/dist/session/roundState.js +2 -0
- package/dist/settings/settingsModel.d.ts +1 -0
- package/dist/settings/settingsModel.js +1 -0
- package/dist/stats/accumulatorMeter.d.ts +6 -0
- package/dist/stats/accumulatorMeter.js +6 -0
- package/dist/stats/eventMeter.d.ts +5 -0
- package/dist/stats/eventMeter.js +5 -0
- package/dist/stats/rollCheck.d.ts +5 -0
- package/dist/stats/rollCheck.js +5 -0
- package/dist/stats/statModifiers.d.ts +5 -0
- package/dist/stats/statModifiers.js +5 -0
- package/dist/store/defineKeyedStore.d.ts +38 -0
- package/dist/store/defineKeyedStore.js +42 -0
- package/dist/store/defineStore.d.ts +33 -0
- package/dist/store/defineStore.js +35 -0
- package/dist/store/observableKeyedStore.d.ts +9 -0
- package/dist/store/observableKeyedStore.js +43 -2
- package/dist/survival/decayMeter.d.ts +55 -0
- package/dist/survival/decayMeter.js +130 -55
- package/dist/survival/moodle.d.ts +2 -0
- package/dist/survival/regionHealth.d.ts +6 -0
- package/dist/survival/regionHealth.js +5 -0
- package/dist/tactics/fallingGrid.d.ts +6 -4
- package/dist/tactics/fallingGrid.js +6 -4
- package/dist/tactics/predictiveQuery.d.ts +3 -0
- package/dist/tactics/predictiveQuery.js +3 -0
- package/dist/tactics/snapshot.d.ts +2 -0
- package/dist/tactics/snapshot.js +2 -0
- package/dist/tactics/surface.d.ts +1 -0
- package/dist/tactics/surface.js +1 -0
- package/dist/tactics/tacticalGrid.d.ts +1 -0
- package/dist/tactics/tacticalGrid.js +1 -0
- package/dist/time/beatClock.d.ts +14 -4
- package/dist/time/beatClock.js +14 -4
- package/dist/time/calendarClock.d.ts +3 -0
- package/dist/time/calendarClock.js +3 -0
- package/dist/time/idleProgress.d.ts +4 -0
- package/dist/time/idleProgress.js +4 -0
- package/dist/time/simClock.d.ts +2 -0
- package/dist/time/simClock.js +20 -5
- package/dist/ui/actionModel.d.ts +110 -0
- package/dist/ui/actionModel.js +159 -0
- package/dist/ui/gameLayout.d.ts +144 -0
- package/dist/ui/gameLayout.js +148 -0
- package/dist/ui/hudDocument.d.ts +114 -0
- package/dist/ui/hudDocument.js +220 -0
- package/dist/ui/hudLayout.d.ts +33 -1
- package/dist/ui/hudLayout.js +204 -17
- package/dist/ui/orientation.d.ts +39 -0
- package/dist/ui/orientation.js +49 -0
- package/dist/ui/selectionModel.d.ts +92 -0
- package/dist/ui/selectionModel.js +88 -0
- package/dist/ui/swingTimer.d.ts +42 -0
- package/dist/ui/swingTimer.js +38 -0
- package/dist/ui/tooltipModel.d.ts +63 -0
- package/dist/ui/tooltipModel.js +82 -0
- package/dist/ui.d.ts +15 -0
- package/dist/ui.js +15 -0
- package/dist/visibility/bounds.d.ts +8 -1
- package/dist/visibility/bounds.js +8 -1
- package/dist/visibility/frustum.d.ts +12 -3
- package/dist/visibility/frustum.js +12 -3
- package/dist/visibility/spatialIndex.js +34 -20
- package/dist/work/jobQueue.d.ts +201 -0
- package/dist/work/jobQueue.js +253 -0
- package/dist/work/unitTraining.d.ts +58 -0
- package/dist/work/unitTraining.js +52 -0
- package/dist/world/authoredObjects.d.ts +58 -0
- package/dist/world/authoredObjects.js +69 -0
- package/dist/world/buildingGenerator.d.ts +18 -0
- package/dist/world/buildingGenerator.js +62 -0
- package/dist/world/buildings.d.ts +5 -0
- package/dist/world/buildings.js +5 -0
- package/dist/world/catenary.d.ts +22 -0
- package/dist/world/catenary.js +69 -0
- package/dist/world/environmentSummary.d.ts +11 -2
- package/dist/world/environmentSummary.js +11 -1
- package/dist/world/features.d.ts +244 -7
- package/dist/world/features.js +92 -4
- package/dist/world/footprintGrid.d.ts +59 -0
- package/dist/world/footprintGrid.js +141 -0
- package/dist/world/geometry.d.ts +64 -0
- package/dist/world/geometry.js +94 -0
- package/dist/world/grassKind.d.ts +51 -0
- package/dist/world/grassKind.js +101 -0
- package/dist/world/pathInstances.d.ts +27 -0
- package/dist/world/pathInstances.js +27 -0
- package/dist/world/pathTerrain.d.ts +80 -0
- package/dist/world/pathTerrain.js +142 -0
- package/dist/world/placeAsset.d.ts +81 -0
- package/dist/world/placeAsset.js +77 -0
- package/dist/world/placement.d.ts +4 -0
- package/dist/world/placement.js +4 -0
- package/dist/world/placementController.d.ts +6 -0
- package/dist/world/placementController.js +6 -0
- package/dist/world/polyline.d.ts +34 -0
- package/dist/world/polyline.js +81 -0
- package/dist/world/roads.d.ts +55 -0
- package/dist/world/roads.js +184 -0
- package/dist/world/scatterRegion.d.ts +164 -0
- package/dist/world/scatterRegion.js +409 -0
- package/dist/world/sceneShapes.d.ts +43 -0
- package/dist/world/sceneShapes.js +1 -0
- package/dist/world/segment.d.ts +27 -0
- package/dist/world/segment.js +43 -0
- package/dist/world/soilKind.d.ts +48 -0
- package/dist/world/soilKind.js +92 -0
- package/dist/world/spatialSample.d.ts +241 -0
- package/dist/world/spatialSample.js +465 -0
- package/dist/world/streets.d.ts +80 -0
- package/dist/world/streets.js +144 -0
- package/dist/world/terraform.d.ts +213 -1
- package/dist/world/terraform.js +655 -20
- package/dist/world/terrain.d.ts +138 -12
- package/dist/world/terrain.js +346 -28
- package/dist/world/terrainGuides.d.ts +182 -0
- package/dist/world/terrainGuides.js +343 -0
- package/dist/world/vec2.d.ts +81 -0
- package/dist/world/vec2.js +128 -0
- package/dist/world/vec3.d.ts +49 -0
- package/dist/world/vec3.js +76 -0
- package/dist/world/vegetation.d.ts +71 -0
- package/dist/world/vegetation.js +151 -0
- package/dist/world/visibilityField.d.ts +154 -0
- package/dist/world/visibilityField.js +271 -0
- package/dist/world/volumetricClouds.d.ts +52 -0
- package/dist/world/volumetricClouds.js +43 -0
- package/dist/world/walls.d.ts +9 -0
- package/dist/world/walls.js +9 -0
- package/dist/world/waterKind.d.ts +55 -0
- package/dist/world/waterKind.js +99 -0
- package/dist/world.d.ts +132 -0
- package/dist/world.js +132 -0
- package/package.json +32 -8
- package/skills/jgengine/SKILL.md +51 -0
- package/skills/jgengine/api.md +434 -0
- package/skills/jgengine/capabilities.md +29 -0
- package/skills/jgengine/reference-cartridge.md +72 -0
- package/skills/jgengine-combat/SKILL.md +34 -0
- package/skills/jgengine-combat/api.md +549 -0
- package/skills/jgengine-combat/capabilities.md +169 -0
- package/skills/jgengine-combat/reference.md +98 -0
- package/skills/jgengine-gameplay/SKILL.md +39 -0
- package/skills/jgengine-gameplay/api.md +1794 -0
- package/skills/jgengine-gameplay/capabilities.md +378 -0
- package/skills/jgengine-gameplay/reference-systems.md +60 -0
- package/skills/jgengine-world/SKILL.md +38 -0
- package/skills/jgengine-world/api.md +2652 -0
- package/skills/jgengine-world/capabilities.md +370 -0
- package/skills/jgengine-world/reference.md +222 -0
- package/dist/cartridge/runtime.d.ts +0 -15
- package/dist/cartridge/runtime.js +0 -556
- package/dist/cartridge/spec.d.ts +0 -188
- package/dist/cartridge/spec.js +0 -19
- package/dist/cartridge/validate.d.ts +0 -2
- package/dist/cartridge/validate.js +0 -78
- package/dist/store/engineStore.d.ts +0 -22
- package/dist/store/engineStore.js +0 -50
- package/dist/store/features.d.ts +0 -10
- package/dist/store/features.js +0 -23
- package/llms.txt +0 -4983
package/README.md
CHANGED
|
@@ -10,4 +10,4 @@ import { createGameRuntime } from "@jgengine/core/runtime/gameRuntime";
|
|
|
10
10
|
|
|
11
11
|
The renderer-free world layer includes a Gerstner `waterSurface` (`world/water`) and a seeded `generateBuilding` kit (`world/buildings`), whose wave math and building component vocabulary were shaped from **[achrefelouafi](https://github.com/achrefelouafi)**'s MIT [OceanThreejs](https://github.com/achrefelouafi/OceanThreejs) and [BuildingGeneratorThreeJS](https://github.com/achrefelouafi/BuildingGeneratorThreeJS) — see [CREDITS.md](../../CREDITS.md).
|
|
12
12
|
|
|
13
|
-
Part of [JGengine](https://github.com/Noisemaker111/jgengine).
|
|
13
|
+
Part of [JGengine](https://github.com/Noisemaker111/jgengine). Apache-2.0.
|
package/dist/ai/crowd.d.ts
CHANGED
|
@@ -1,4 +1,11 @@
|
|
|
1
1
|
import type { NavGrid, NavPoint } from "../nav/navGrid.js";
|
|
2
|
+
/**
|
|
3
|
+
* Deterministic 2D offset uniformly within a disc of `radius`, stable per `id` — so a crowd converging
|
|
4
|
+
* on one target (a flank point, a rally banner, a boss) fans out to distinct spots instead of all
|
|
5
|
+
* stacking on the same coordinate. Same `id` always yields the same offset, no per-entity state to store.
|
|
6
|
+
* @internal
|
|
7
|
+
*/
|
|
8
|
+
export declare function spreadOffset(id: string, radius: number): readonly [number, number];
|
|
2
9
|
export interface FlowFieldOptions {
|
|
3
10
|
clearance?: number;
|
|
4
11
|
congestion?: (col: number, row: number) => number;
|
|
@@ -11,6 +18,7 @@ export interface FlowField {
|
|
|
11
18
|
direction(point: NavPoint): NavPoint;
|
|
12
19
|
next(point: NavPoint): NavPoint | null;
|
|
13
20
|
}
|
|
21
|
+
/** @internal */
|
|
14
22
|
export declare function computeFlowField(grid: NavGrid, goals: readonly NavPoint[], options?: FlowFieldOptions): FlowField;
|
|
15
23
|
export interface CrowdField {
|
|
16
24
|
enter(point: NavPoint): void;
|
|
@@ -20,6 +28,7 @@ export interface CrowdField {
|
|
|
20
28
|
penalty(weight?: number): (col: number, row: number) => number;
|
|
21
29
|
reset(): void;
|
|
22
30
|
}
|
|
31
|
+
/** @internal */
|
|
23
32
|
export declare function createCrowdField(grid: NavGrid): CrowdField;
|
|
24
33
|
export interface Poi {
|
|
25
34
|
id: string;
|
|
@@ -33,4 +42,50 @@ export interface SelectPoiOptions {
|
|
|
33
42
|
distanceBias?: number;
|
|
34
43
|
distance?: (from: NavPoint, poi: Poi) => number;
|
|
35
44
|
}
|
|
45
|
+
/** @internal */
|
|
36
46
|
export declare function selectPoi(pois: readonly Poi[], from: NavPoint, options: SelectPoiOptions): Poi | null;
|
|
47
|
+
/** A many-agent visitor's current step of the seek→travel→arrive→dwell→depart loop. */
|
|
48
|
+
export type VisitorPhase = "seeking" | "traveling" | "dwelling" | "departing" | "done";
|
|
49
|
+
/** One tick's result from a {@link VisitorLoop}: current phase, where to steer, and which POI it concerns. */
|
|
50
|
+
export interface VisitorStep {
|
|
51
|
+
phase: VisitorPhase;
|
|
52
|
+
/** Where to steer this tick (feed `scene.entity.moveToward`/`moveTowardCommit`), or `null` once `done` or stuck `seeking` with no eligible POI. */
|
|
53
|
+
target: NavPoint | null;
|
|
54
|
+
poiId: string | null;
|
|
55
|
+
}
|
|
56
|
+
/** Config for {@link createVisitorLoop}: the POI catalog, dwell duration, and exit point every agent shares. */
|
|
57
|
+
export interface VisitorLoopOptions {
|
|
58
|
+
pois: readonly Poi[];
|
|
59
|
+
/** How long (ms, sim time) a visitor lingers once it arrives at a POI. */
|
|
60
|
+
dwellMs: (poi: Poi) => number;
|
|
61
|
+
/** Where a visitor heads once its dwell ends — a fixed exit/despawn point, or one resolved per agent (multiple gates). */
|
|
62
|
+
exitPoint: NavPoint | ((agentId: string) => NavPoint);
|
|
63
|
+
/** Distance under which "traveling"/"departing" counts as arrived. Default 1. */
|
|
64
|
+
arriveRadius?: number;
|
|
65
|
+
occupancy?: (poiId: string) => number;
|
|
66
|
+
distanceBias?: number;
|
|
67
|
+
distance?: (from: NavPoint, poi: Poi) => number;
|
|
68
|
+
/** Fires once, on the traveling→dwelling transition (e.g. `crowdField.enter(poi.point)`). */
|
|
69
|
+
onArrive?: (agentId: string, poiId: string) => void;
|
|
70
|
+
/** Fires once, on the dwelling→departing transition (e.g. `crowdField.leave(poi.point)`). */
|
|
71
|
+
onDepart?: (agentId: string, poiId: string) => void;
|
|
72
|
+
}
|
|
73
|
+
/** Handle returned by {@link createVisitorLoop}: per-agent seek/travel/dwell/depart state machine. */
|
|
74
|
+
export interface VisitorLoop {
|
|
75
|
+
/** Registers `agentId` in the `"seeking"` phase; `tick` also auto-spawns on first call. */
|
|
76
|
+
spawn(agentId: string): VisitorStep;
|
|
77
|
+
/** Advances one agent by `dtMs` from its current `position`; `roll()` feeds `selectPoi`'s weighted pick. */
|
|
78
|
+
tick(agentId: string, position: NavPoint, dtMs: number, roll: () => number): VisitorStep;
|
|
79
|
+
get(agentId: string): VisitorStep | null;
|
|
80
|
+
remove(agentId: string): void;
|
|
81
|
+
clear(): void;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* A many-agent seek→travel→arrive→dwell→depart loop over weighted points of interest (park visitors,
|
|
85
|
+
* shoppers, tavern patrons) — `ai/crowd`'s `selectPoi` covers only the weighted-pick step; this owns
|
|
86
|
+
* the per-agent phase machine around it so the caller only supplies positions and drives movement.
|
|
87
|
+
*
|
|
88
|
+
* @capability visitor-loop many-agent seek/travel/dwell/depart state machine over weighted POIs
|
|
89
|
+
* @internal
|
|
90
|
+
*/
|
|
91
|
+
export declare function createVisitorLoop(options: VisitorLoopOptions): VisitorLoop;
|
package/dist/ai/crowd.js
CHANGED
|
@@ -1,4 +1,17 @@
|
|
|
1
|
+
import { seededRng } from "../random/rng.js";
|
|
1
2
|
const SQRT2 = Math.SQRT2;
|
|
3
|
+
/**
|
|
4
|
+
* Deterministic 2D offset uniformly within a disc of `radius`, stable per `id` — so a crowd converging
|
|
5
|
+
* on one target (a flank point, a rally banner, a boss) fans out to distinct spots instead of all
|
|
6
|
+
* stacking on the same coordinate. Same `id` always yields the same offset, no per-entity state to store.
|
|
7
|
+
* @internal
|
|
8
|
+
*/
|
|
9
|
+
export function spreadOffset(id, radius) {
|
|
10
|
+
const rng = seededRng(id);
|
|
11
|
+
const angle = rng() * Math.PI * 2;
|
|
12
|
+
const r = Math.sqrt(rng()) * radius;
|
|
13
|
+
return [Math.cos(angle) * r, Math.sin(angle) * r];
|
|
14
|
+
}
|
|
2
15
|
function heapPush(heap, node) {
|
|
3
16
|
heap.push(node);
|
|
4
17
|
let i = heap.length - 1;
|
|
@@ -46,6 +59,7 @@ function passableWithClearance(grid, clearance) {
|
|
|
46
59
|
return true;
|
|
47
60
|
};
|
|
48
61
|
}
|
|
62
|
+
/** @internal */
|
|
49
63
|
export function computeFlowField(grid, goals, options = {}) {
|
|
50
64
|
const { cols, rows } = grid;
|
|
51
65
|
const passable = passableWithClearance(grid, options.clearance ?? 0);
|
|
@@ -150,6 +164,7 @@ export function computeFlowField(grid, goals, options = {}) {
|
|
|
150
164
|
};
|
|
151
165
|
return field;
|
|
152
166
|
}
|
|
167
|
+
/** @internal */
|
|
153
168
|
export function createCrowdField(grid) {
|
|
154
169
|
const { cols, rows } = grid;
|
|
155
170
|
const occupancy = new Int32Array(cols * rows);
|
|
@@ -183,6 +198,7 @@ export function createCrowdField(grid) {
|
|
|
183
198
|
function euclidean(from, poi) {
|
|
184
199
|
return Math.hypot(poi.point[0] - from[0], poi.point[1] - from[1]);
|
|
185
200
|
}
|
|
201
|
+
/** @internal */
|
|
186
202
|
export function selectPoi(pois, from, options) {
|
|
187
203
|
const distanceBias = options.distanceBias ?? 1;
|
|
188
204
|
const distanceOf = options.distance ?? euclidean;
|
|
@@ -211,3 +227,101 @@ export function selectPoi(pois, from, options) {
|
|
|
211
227
|
}
|
|
212
228
|
return eligible[eligible.length - 1];
|
|
213
229
|
}
|
|
230
|
+
function toStep(state, poiOf, exitOf, agentId) {
|
|
231
|
+
if (state.phase === "seeking" || state.phase === "done") {
|
|
232
|
+
return { phase: state.phase, target: null, poiId: null };
|
|
233
|
+
}
|
|
234
|
+
if (state.phase === "departing") {
|
|
235
|
+
return { phase: "departing", target: exitOf(agentId), poiId: state.poiId };
|
|
236
|
+
}
|
|
237
|
+
const poi = state.poiId === null ? undefined : poiOf(state.poiId);
|
|
238
|
+
return { phase: state.phase, target: poi?.point ?? null, poiId: state.poiId };
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* A many-agent seek→travel→arrive→dwell→depart loop over weighted points of interest (park visitors,
|
|
242
|
+
* shoppers, tavern patrons) — `ai/crowd`'s `selectPoi` covers only the weighted-pick step; this owns
|
|
243
|
+
* the per-agent phase machine around it so the caller only supplies positions and drives movement.
|
|
244
|
+
*
|
|
245
|
+
* @capability visitor-loop many-agent seek/travel/dwell/depart state machine over weighted POIs
|
|
246
|
+
* @internal
|
|
247
|
+
*/
|
|
248
|
+
export function createVisitorLoop(options) {
|
|
249
|
+
const { pois, dwellMs, exitPoint, occupancy, distanceBias, distance } = options;
|
|
250
|
+
const arriveRadius = options.arriveRadius ?? 1;
|
|
251
|
+
const agents = new Map();
|
|
252
|
+
const poiById = new Map(pois.map((poi) => [poi.id, poi]));
|
|
253
|
+
function poiOf(id) {
|
|
254
|
+
return poiById.get(id);
|
|
255
|
+
}
|
|
256
|
+
function exitOf(agentId) {
|
|
257
|
+
return typeof exitPoint === "function" ? exitPoint(agentId) : exitPoint;
|
|
258
|
+
}
|
|
259
|
+
function ensure(agentId) {
|
|
260
|
+
let state = agents.get(agentId);
|
|
261
|
+
if (state === undefined) {
|
|
262
|
+
state = { phase: "seeking", poiId: null, dwellRemaining: 0 };
|
|
263
|
+
agents.set(agentId, state);
|
|
264
|
+
}
|
|
265
|
+
return state;
|
|
266
|
+
}
|
|
267
|
+
return {
|
|
268
|
+
spawn(agentId) {
|
|
269
|
+
const state = ensure(agentId);
|
|
270
|
+
return toStep(state, poiOf, exitOf, agentId);
|
|
271
|
+
},
|
|
272
|
+
tick(agentId, position, dtMs, roll) {
|
|
273
|
+
const state = ensure(agentId);
|
|
274
|
+
if (state.phase === "seeking") {
|
|
275
|
+
const poi = selectPoi(pois, position, {
|
|
276
|
+
roll: roll(),
|
|
277
|
+
...(occupancy === undefined ? {} : { occupancy }),
|
|
278
|
+
...(distanceBias === undefined ? {} : { distanceBias }),
|
|
279
|
+
...(distance === undefined ? {} : { distance }),
|
|
280
|
+
});
|
|
281
|
+
if (poi !== null) {
|
|
282
|
+
state.poiId = poi.id;
|
|
283
|
+
state.phase = "traveling";
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
else if (state.phase === "traveling") {
|
|
287
|
+
const poi = state.poiId === null ? undefined : poiOf(state.poiId);
|
|
288
|
+
if (poi === undefined) {
|
|
289
|
+
state.phase = "departing";
|
|
290
|
+
state.poiId = null;
|
|
291
|
+
}
|
|
292
|
+
else if ((distance ?? euclidean)(position, poi) <= arriveRadius) {
|
|
293
|
+
state.phase = "dwelling";
|
|
294
|
+
state.dwellRemaining = dwellMs(poi);
|
|
295
|
+
options.onArrive?.(agentId, poi.id);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
else if (state.phase === "dwelling") {
|
|
299
|
+
state.dwellRemaining -= dtMs;
|
|
300
|
+
if (state.dwellRemaining <= 0) {
|
|
301
|
+
const poiId = state.poiId;
|
|
302
|
+
state.phase = "departing";
|
|
303
|
+
if (poiId !== null)
|
|
304
|
+
options.onDepart?.(agentId, poiId);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
else if (state.phase === "departing") {
|
|
308
|
+
const exit = exitOf(agentId);
|
|
309
|
+
if (Math.hypot(exit[0] - position[0], exit[1] - position[1]) <= arriveRadius) {
|
|
310
|
+
state.phase = "done";
|
|
311
|
+
state.poiId = null;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
return toStep(state, poiOf, exitOf, agentId);
|
|
315
|
+
},
|
|
316
|
+
get(agentId) {
|
|
317
|
+
const state = agents.get(agentId);
|
|
318
|
+
return state === undefined ? null : toStep(state, poiOf, exitOf, agentId);
|
|
319
|
+
},
|
|
320
|
+
remove(agentId) {
|
|
321
|
+
agents.delete(agentId);
|
|
322
|
+
},
|
|
323
|
+
clear() {
|
|
324
|
+
agents.clear();
|
|
325
|
+
},
|
|
326
|
+
};
|
|
327
|
+
}
|
package/dist/ai/flock.d.ts
CHANGED
|
@@ -26,11 +26,14 @@ export interface FlockConfig {
|
|
|
26
26
|
* (many-agents-to-POI) deliberately isn't. Pure: returns the desired acceleration for one agent;
|
|
27
27
|
* `stepFlock` is the convenience integrator. O(neighbors) per agent — pre-filter with a spatial
|
|
28
28
|
* grid past a few hundred agents.
|
|
29
|
-
|
|
29
|
+
* @internal
|
|
30
|
+
*/
|
|
30
31
|
export declare function flockSteer(agent: FlockAgent, neighbors: readonly FlockAgent[], config: FlockConfig, target?: FlockVec3): FlockVec3;
|
|
31
32
|
export interface FlockStepAgent {
|
|
32
33
|
position: FlockVec3;
|
|
33
34
|
velocity: FlockVec3;
|
|
34
35
|
}
|
|
35
|
-
/** Integrate one tick in place: steer every agent, clamp to `maxSpeed`, advance positions.
|
|
36
|
+
/** Integrate one tick in place: steer every agent, clamp to `maxSpeed`, advance positions.
|
|
37
|
+
* @internal
|
|
38
|
+
*/
|
|
36
39
|
export declare function stepFlock(agents: FlockStepAgent[], config: FlockConfig, dt: number, target?: FlockVec3): void;
|
package/dist/ai/flock.js
CHANGED
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
* (many-agents-to-POI) deliberately isn't. Pure: returns the desired acceleration for one agent;
|
|
5
5
|
* `stepFlock` is the convenience integrator. O(neighbors) per agent — pre-filter with a spatial
|
|
6
6
|
* grid past a few hundred agents.
|
|
7
|
-
|
|
7
|
+
* @internal
|
|
8
|
+
*/
|
|
8
9
|
export function flockSteer(agent, neighbors, config, target) {
|
|
9
10
|
const separationWeight = config.separationWeight ?? 1.5;
|
|
10
11
|
const cohesionWeight = config.cohesionWeight ?? 1;
|
|
@@ -142,7 +143,9 @@ function fillNeighbors(agents, agentIndex, invCell) {
|
|
|
142
143
|
neighborScratch.length = count;
|
|
143
144
|
return count;
|
|
144
145
|
}
|
|
145
|
-
/** Integrate one tick in place: steer every agent, clamp to `maxSpeed`, advance positions.
|
|
146
|
+
/** Integrate one tick in place: steer every agent, clamp to `maxSpeed`, advance positions.
|
|
147
|
+
* @internal
|
|
148
|
+
*/
|
|
146
149
|
export function stepFlock(agents, config, dt, target) {
|
|
147
150
|
const count = agents.length;
|
|
148
151
|
if (count === 0)
|
package/dist/ai/groupAssist.d.ts
CHANGED
|
@@ -16,4 +16,5 @@ export interface AssistNetwork {
|
|
|
16
16
|
assistersOf(memberId: string): string[];
|
|
17
17
|
addThreat(memberId: string, sourceId: string, amount: number): string[];
|
|
18
18
|
}
|
|
19
|
+
/** @internal */
|
|
19
20
|
export declare function createAssistNetwork(config?: AssistNetworkConfig): AssistNetwork;
|
package/dist/ai/groupAssist.js
CHANGED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { type RandomSeed } from "../random/rng.js";
|
|
2
|
+
/** A world-space `[x, z]` used for the heat system's spawn ring and witness proximity checks. */
|
|
3
|
+
export type HeatPoint = readonly [number, number];
|
|
4
|
+
/** One escalation tier — the heat threshold it begins at and the pursuer count it wants active. */
|
|
5
|
+
export interface HeatLevelDef {
|
|
6
|
+
/** Ascending level number (1, 2, 3, ...); level 0 is implicit below the first threshold. */
|
|
7
|
+
level: number;
|
|
8
|
+
/** Cumulative heat at which this level begins. */
|
|
9
|
+
threshold: number;
|
|
10
|
+
/** Active pursuers this level wants once reached. */
|
|
11
|
+
pursuerBudget: number;
|
|
12
|
+
}
|
|
13
|
+
/** Tuning for {@link createHeatState}/{@link advanceHeat} — levels, decay, and pursuit-spawn ring. */
|
|
14
|
+
export interface HeatConfig {
|
|
15
|
+
/** Sorted ascending by `threshold`. */
|
|
16
|
+
levels: readonly HeatLevelDef[];
|
|
17
|
+
maxHeat?: number;
|
|
18
|
+
/** Heat bled per second once decay is unblocked. */
|
|
19
|
+
decayPerSecond: number;
|
|
20
|
+
/** Seconds after the last witnessed gain before decay starts (a beat of "still hot" after the last crime). */
|
|
21
|
+
decayDelaySeconds?: number;
|
|
22
|
+
/** Seconds at level 0 with pursuers still alive before {@link HeatStep.standDown} fires. */
|
|
23
|
+
standDownSeconds?: number;
|
|
24
|
+
/** `[min, max]` radius for {@link HeatStep.spawnPoints}; omit to skip ring generation. */
|
|
25
|
+
spawnRingRadius?: readonly [number, number];
|
|
26
|
+
seed?: number;
|
|
27
|
+
}
|
|
28
|
+
/** Serializable heat-system state — round-trips through `createHeatState`/`advanceHeat` each tick. */
|
|
29
|
+
export interface HeatState {
|
|
30
|
+
heat: number;
|
|
31
|
+
level: number;
|
|
32
|
+
sinceGain: number;
|
|
33
|
+
standDownElapsed: number;
|
|
34
|
+
/** Opaque PRNG cursor — round-trip it as part of the state, never read or set it directly. */
|
|
35
|
+
rng: RandomSeed;
|
|
36
|
+
}
|
|
37
|
+
/** One crime tick's contribution — only `witnessed` gains raise heat (unseen crimes are free, GTA-style). */
|
|
38
|
+
export interface HeatGain {
|
|
39
|
+
amount: number;
|
|
40
|
+
witnessed: boolean;
|
|
41
|
+
}
|
|
42
|
+
/** Per-tick world facts {@link advanceHeat} needs but can't derive itself — witness proximity, pursuer count, origin. */
|
|
43
|
+
export interface HeatTickContext {
|
|
44
|
+
/** True blocks decay this tick (a witness/pursuer is still close enough to keep the heat hot). */
|
|
45
|
+
nearWitness: boolean;
|
|
46
|
+
activePursuers: number;
|
|
47
|
+
around: HeatPoint;
|
|
48
|
+
}
|
|
49
|
+
/** One `advanceHeat` tick's result — updated state plus what the caller should spawn/despawn. */
|
|
50
|
+
export interface HeatStep {
|
|
51
|
+
state: HeatState;
|
|
52
|
+
levelChanged: boolean;
|
|
53
|
+
pursuerBudget: number;
|
|
54
|
+
/** `max(0, pursuerBudget - activePursuers)` — how many more pursuers to spawn this tick. */
|
|
55
|
+
wantSpawns: number;
|
|
56
|
+
/** `wantSpawns` points on the configured ring around `ctx.around`; empty without `spawnRingRadius`. */
|
|
57
|
+
spawnPoints: HeatPoint[];
|
|
58
|
+
/** True exactly the tick pursuit should fully clear — despawn every remaining pursuer. */
|
|
59
|
+
standDown: boolean;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Escalating crime/heat/pursuit state machine (#533.4) — the star-meter every open-world crime sandbox
|
|
63
|
+
* hand-rolls: witness-scoped gain (unseen crimes don't raise heat), proximity-gated decay (still hot
|
|
64
|
+
* while a witness or pursuer is close), tiered pursuer budgets, ring-shaped spawn points around the
|
|
65
|
+
* player, and a stand-down countdown once heat clears so pursuit doesn't vanish instantly. Pure and
|
|
66
|
+
* seeded like `ai/spawnDirector` — the caller owns spawning/despawning the actual entities.
|
|
67
|
+
* @internal
|
|
68
|
+
*/
|
|
69
|
+
export declare function createHeatState(config: HeatConfig): HeatState;
|
|
70
|
+
/**
|
|
71
|
+
* Advances {@link HeatState} by one tick: sums this tick's witnessed gains, bleeds heat once clear of
|
|
72
|
+
* witnesses past `decayDelaySeconds`, resolves the current {@link HeatLevelDef}, and reports how many
|
|
73
|
+
* pursuers to spawn (with ring points) or whether to stand pursuit down entirely.
|
|
74
|
+
* @internal
|
|
75
|
+
*/
|
|
76
|
+
export declare function advanceHeat(config: HeatConfig, state: HeatState, dt: number, gains: readonly HeatGain[], ctx: HeatTickContext): HeatStep;
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { randomSeedFrom, stepRandomSeed } from "../random/rng.js";
|
|
2
|
+
function levelFor(levels, heat) {
|
|
3
|
+
let current = null;
|
|
4
|
+
for (const level of levels) {
|
|
5
|
+
if (heat >= level.threshold)
|
|
6
|
+
current = level;
|
|
7
|
+
}
|
|
8
|
+
return current;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Escalating crime/heat/pursuit state machine (#533.4) — the star-meter every open-world crime sandbox
|
|
12
|
+
* hand-rolls: witness-scoped gain (unseen crimes don't raise heat), proximity-gated decay (still hot
|
|
13
|
+
* while a witness or pursuer is close), tiered pursuer budgets, ring-shaped spawn points around the
|
|
14
|
+
* player, and a stand-down countdown once heat clears so pursuit doesn't vanish instantly. Pure and
|
|
15
|
+
* seeded like `ai/spawnDirector` — the caller owns spawning/despawning the actual entities.
|
|
16
|
+
* @internal
|
|
17
|
+
*/
|
|
18
|
+
export function createHeatState(config) {
|
|
19
|
+
return {
|
|
20
|
+
heat: 0,
|
|
21
|
+
level: 0,
|
|
22
|
+
sinceGain: Number.POSITIVE_INFINITY,
|
|
23
|
+
standDownElapsed: 0,
|
|
24
|
+
rng: randomSeedFrom(config.seed ?? 1),
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function ringPoints(around, count, radius, rng) {
|
|
28
|
+
const points = [];
|
|
29
|
+
let seed = rng;
|
|
30
|
+
const [minR, maxR] = radius;
|
|
31
|
+
for (let i = 0; i < count; i += 1) {
|
|
32
|
+
let roll;
|
|
33
|
+
[roll, seed] = stepRandomSeed(seed);
|
|
34
|
+
const angle = roll * Math.PI * 2;
|
|
35
|
+
let spread;
|
|
36
|
+
[spread, seed] = stepRandomSeed(seed);
|
|
37
|
+
const distance = minR + spread * Math.max(0, maxR - minR);
|
|
38
|
+
points.push([around[0] + Math.sin(angle) * distance, around[1] + Math.cos(angle) * distance]);
|
|
39
|
+
}
|
|
40
|
+
return { points, rng: seed };
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Advances {@link HeatState} by one tick: sums this tick's witnessed gains, bleeds heat once clear of
|
|
44
|
+
* witnesses past `decayDelaySeconds`, resolves the current {@link HeatLevelDef}, and reports how many
|
|
45
|
+
* pursuers to spawn (with ring points) or whether to stand pursuit down entirely.
|
|
46
|
+
* @internal
|
|
47
|
+
*/
|
|
48
|
+
export function advanceHeat(config, state, dt, gains, ctx) {
|
|
49
|
+
const maxHeat = config.maxHeat ?? Number.POSITIVE_INFINITY;
|
|
50
|
+
const decayDelay = config.decayDelaySeconds ?? 0;
|
|
51
|
+
const gained = gains.reduce((sum, gain) => (gain.witnessed ? sum + gain.amount : sum), 0);
|
|
52
|
+
let heat = state.heat;
|
|
53
|
+
let sinceGain = state.sinceGain;
|
|
54
|
+
if (gained > 0) {
|
|
55
|
+
heat = Math.min(maxHeat, heat + gained);
|
|
56
|
+
sinceGain = 0;
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
sinceGain += dt;
|
|
60
|
+
if (sinceGain >= decayDelay && !ctx.nearWitness) {
|
|
61
|
+
heat = Math.max(0, heat - config.decayPerSecond * dt);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
const resolvedLevel = levelFor(config.levels, heat);
|
|
65
|
+
const level = resolvedLevel?.level ?? 0;
|
|
66
|
+
const pursuerBudget = resolvedLevel?.pursuerBudget ?? 0;
|
|
67
|
+
const levelChanged = level !== state.level;
|
|
68
|
+
let standDownElapsed = state.standDownElapsed;
|
|
69
|
+
let standDown = false;
|
|
70
|
+
if (level === 0 && ctx.activePursuers > 0) {
|
|
71
|
+
standDownElapsed += dt;
|
|
72
|
+
const limit = config.standDownSeconds ?? 0;
|
|
73
|
+
if (standDownElapsed >= limit) {
|
|
74
|
+
standDown = true;
|
|
75
|
+
standDownElapsed = 0;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
standDownElapsed = 0;
|
|
80
|
+
}
|
|
81
|
+
const wantSpawns = Math.max(0, pursuerBudget - ctx.activePursuers);
|
|
82
|
+
let spawnPoints = [];
|
|
83
|
+
let rng = state.rng;
|
|
84
|
+
if (wantSpawns > 0 && config.spawnRingRadius !== undefined) {
|
|
85
|
+
const rolled = ringPoints(ctx.around, wantSpawns, config.spawnRingRadius, rng);
|
|
86
|
+
spawnPoints = rolled.points;
|
|
87
|
+
rng = rolled.rng;
|
|
88
|
+
}
|
|
89
|
+
return {
|
|
90
|
+
state: { heat, level, sinceGain, standDownElapsed, rng },
|
|
91
|
+
levelChanged,
|
|
92
|
+
pursuerBudget,
|
|
93
|
+
wantSpawns,
|
|
94
|
+
spawnPoints,
|
|
95
|
+
standDown,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interest scheduling: the scale primitive that lets far-away agents sleep instead of running
|
|
3
|
+
* acquisition and pathing every frame. A per-agent gate decides — from proximity to the nearest
|
|
4
|
+
* interest source plus explicit wake signals — whether this tick does expensive work, at what
|
|
5
|
+
* cadence, with hysteresis so it never thrashes at the boundary and deterministic staggering so a
|
|
6
|
+
* thousand siblings do not all wake on the same frame. State is a plain serializable object; the
|
|
7
|
+
* caller drives it from a bounded spatial query, never a full-world scan.
|
|
8
|
+
*/
|
|
9
|
+
/** Whether an agent's gate is doing work (`active`) or culled (`dormant`). */
|
|
10
|
+
export type InterestState = "active" | "dormant";
|
|
11
|
+
/** A distance-keyed cadence tier: nearer agents tick faster, farther-but-awake agents tick slower. */
|
|
12
|
+
export interface InterestTier {
|
|
13
|
+
/** Applies when proximity is at or below this distance. */
|
|
14
|
+
readonly within: number;
|
|
15
|
+
/** Seconds between active ticks in this tier (`0` = every tick). */
|
|
16
|
+
readonly interval: number;
|
|
17
|
+
}
|
|
18
|
+
/** Static configuration shared by every gate of one behavior class. */
|
|
19
|
+
export interface InterestSchedulerConfig {
|
|
20
|
+
/** Proximity at or below which a dormant agent wakes. */
|
|
21
|
+
readonly wakeRadius: number;
|
|
22
|
+
/**
|
|
23
|
+
* Proximity above which an active agent sleeps. Must be >= `wakeRadius`; the gap between them is
|
|
24
|
+
* the hysteresis band that stops sleep/wake thrash at the edge. Default: `wakeRadius` (no band).
|
|
25
|
+
*/
|
|
26
|
+
readonly sleepRadius?: number;
|
|
27
|
+
/** Seconds between active ticks while awake (`0` = every tick). Overridden by a matching tier. */
|
|
28
|
+
readonly activeInterval?: number;
|
|
29
|
+
/**
|
|
30
|
+
* Distance-keyed cadence tiers, checked in array order with the first `proximity <= within` match
|
|
31
|
+
* winning — so order them nearest-first (smallest `within` first). Overrides `activeInterval`.
|
|
32
|
+
*/
|
|
33
|
+
readonly tiers?: readonly InterestTier[];
|
|
34
|
+
/** After any wake signal, stay active at least this long regardless of proximity. Default `0`. */
|
|
35
|
+
readonly stayAwakeSeconds?: number;
|
|
36
|
+
}
|
|
37
|
+
/** Per-agent serializable gate state. Round-trip the whole object; never read fields to drive logic. */
|
|
38
|
+
export interface InterestGateState {
|
|
39
|
+
state: InterestState;
|
|
40
|
+
/** Time accrued toward the next active tick. */
|
|
41
|
+
clock: number;
|
|
42
|
+
/** Remaining forced-awake time from the last wake signal. */
|
|
43
|
+
awakeHold: number;
|
|
44
|
+
/** Deterministic `[0,1)` cadence offset so sibling agents fire on different frames. */
|
|
45
|
+
phase: number;
|
|
46
|
+
}
|
|
47
|
+
/** Per-tick input the caller supplies to a gate. */
|
|
48
|
+
export interface InterestGateInput {
|
|
49
|
+
/** Distance to the nearest interest source (player, threat, owner); `null` when none / unknown. */
|
|
50
|
+
readonly proximity?: number | null;
|
|
51
|
+
/** Explicit wake trigger — damage, event, ownership change, caller override. Forces active. */
|
|
52
|
+
readonly wake?: boolean;
|
|
53
|
+
}
|
|
54
|
+
/** Per-tick output that tells the caller whether to run expensive work. */
|
|
55
|
+
export interface InterestGateStep {
|
|
56
|
+
/** The gate's state after this tick. */
|
|
57
|
+
readonly state: InterestState;
|
|
58
|
+
/** Run the expensive work (acquisition, pathing) this tick? */
|
|
59
|
+
readonly active: boolean;
|
|
60
|
+
/** Transitioned dormant→active this tick — the single-frame wake edge. */
|
|
61
|
+
readonly woke: boolean;
|
|
62
|
+
/** Transitioned active→dormant this tick — the single-frame sleep edge. */
|
|
63
|
+
readonly slept: boolean;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* A deterministic `[0,1)` cadence phase derived from a stable id, for staggering sibling gates so a
|
|
67
|
+
* batch of agents spawned together does not fire their first active tick on the same frame. Pass the
|
|
68
|
+
* result as the `phase` argument to {@link createInterestGateState}.
|
|
69
|
+
*
|
|
70
|
+
* @capability interest-stagger deterministic per-id cadence phase that spreads sibling gate ticks across frames
|
|
71
|
+
*/
|
|
72
|
+
export declare function interestPhase(seed: string | number): number;
|
|
73
|
+
/**
|
|
74
|
+
* Create a dormant gate state, staggered by `phase` (`[0,1)`, typically {@link interestPhase} of the
|
|
75
|
+
* agent id) so siblings created together do not all fire their first active tick on the same frame.
|
|
76
|
+
*
|
|
77
|
+
* @capability interest-gate per-agent sleep/wake + cadence gate state so far agents skip expensive ticks
|
|
78
|
+
*/
|
|
79
|
+
export declare function createInterestGateState(config: InterestSchedulerConfig, phase?: number): InterestGateState;
|
|
80
|
+
/**
|
|
81
|
+
* Advance one gate by `dt` seconds against this tick's `input`, mutating `state` in place and
|
|
82
|
+
* returning what the caller should do. Sleeping skips the expensive work (`active: false`) while the
|
|
83
|
+
* gate's timers keep advancing, so state is preserved; a `wake` signal or crossing `wakeRadius`
|
|
84
|
+
* flips it back to active and fires an immediate tick.
|
|
85
|
+
*
|
|
86
|
+
* @capability interest-scheduler advance a sleep/wake gate with hysteresis, cadence tiers, and stagger
|
|
87
|
+
*/
|
|
88
|
+
export declare function advanceInterestGate(state: InterestGateState, config: InterestSchedulerConfig, dt: number, input?: InterestGateInput): InterestGateStep;
|
|
89
|
+
/** Aggregate counts of active vs dormant gates — the metric the issue asks a scheduler to expose. */
|
|
90
|
+
export interface InterestCensus {
|
|
91
|
+
active: number;
|
|
92
|
+
dormant: number;
|
|
93
|
+
total: number;
|
|
94
|
+
}
|
|
95
|
+
/** A running census accumulator; call `record` inside the caller's existing tick loop (no extra pass). */
|
|
96
|
+
export interface InterestCensusAccumulator {
|
|
97
|
+
record(state: InterestState | InterestGateState): void;
|
|
98
|
+
snapshot(): InterestCensus;
|
|
99
|
+
reset(): void;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Create a census accumulator so the caller can tally active/dormant gates during the loop it already
|
|
103
|
+
* runs, avoiding any separate full-world scan just to report scheduler metrics.
|
|
104
|
+
*
|
|
105
|
+
* @capability interest-census running active/dormant gate tally folded into the caller's tick loop
|
|
106
|
+
*/
|
|
107
|
+
export declare function createInterestCensus(): InterestCensusAccumulator;
|