@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,242 @@
|
|
|
1
|
+
/** Default fixed-sim stage order — systems pick a stage; most need only this. */
|
|
2
|
+
export const DEFAULT_FIXED_STAGES = [
|
|
3
|
+
"input",
|
|
4
|
+
"movement",
|
|
5
|
+
"combat",
|
|
6
|
+
"ai",
|
|
7
|
+
"activities",
|
|
8
|
+
"cleanup",
|
|
9
|
+
];
|
|
10
|
+
/**
|
|
11
|
+
* Default frame stage order. Gameplay stages mirror the fixed table so once-per-frame systems
|
|
12
|
+
* (`type: "frame"`) can pick `combat`/`ai`/… without falling into the unknown-stage bucket;
|
|
13
|
+
* presentation stages follow.
|
|
14
|
+
*/
|
|
15
|
+
export const DEFAULT_FRAME_STAGES = [
|
|
16
|
+
"input",
|
|
17
|
+
"movement",
|
|
18
|
+
"combat",
|
|
19
|
+
"ai",
|
|
20
|
+
"activities",
|
|
21
|
+
"cleanup",
|
|
22
|
+
"animation",
|
|
23
|
+
"camera",
|
|
24
|
+
"effects",
|
|
25
|
+
];
|
|
26
|
+
const DEFAULT_FIXED_RATE = 60;
|
|
27
|
+
function asList(value) {
|
|
28
|
+
if (value === undefined)
|
|
29
|
+
return [];
|
|
30
|
+
return typeof value === "string" ? [value] : value;
|
|
31
|
+
}
|
|
32
|
+
function channelOf(tick) {
|
|
33
|
+
if (tick === undefined)
|
|
34
|
+
return "event";
|
|
35
|
+
return tick.type;
|
|
36
|
+
}
|
|
37
|
+
function stageOf(tick, channel) {
|
|
38
|
+
if (tick === undefined || tick.type === "manual")
|
|
39
|
+
return "";
|
|
40
|
+
if (tick.type === "fixed" || tick.type === "frame" || tick.type === "interval") {
|
|
41
|
+
return tick.stage ?? defaultStage(channel);
|
|
42
|
+
}
|
|
43
|
+
return "";
|
|
44
|
+
}
|
|
45
|
+
function defaultStage(channel) {
|
|
46
|
+
if (channel === "fixed")
|
|
47
|
+
return "combat";
|
|
48
|
+
if (channel === "frame")
|
|
49
|
+
return "effects";
|
|
50
|
+
if (channel === "interval")
|
|
51
|
+
return "activities";
|
|
52
|
+
return "";
|
|
53
|
+
}
|
|
54
|
+
function rateOf(tick, defaultFixedRate) {
|
|
55
|
+
if (tick?.type === "fixed")
|
|
56
|
+
return tick.rate ?? defaultFixedRate;
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
function everyOf(tick) {
|
|
60
|
+
if (tick?.type === "interval")
|
|
61
|
+
return tick.every;
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
function afterOf(tick) {
|
|
65
|
+
if (tick === undefined || tick.type === "manual")
|
|
66
|
+
return [];
|
|
67
|
+
if (tick.type === "fixed" || tick.type === "frame" || tick.type === "interval") {
|
|
68
|
+
return asList(tick.after);
|
|
69
|
+
}
|
|
70
|
+
return [];
|
|
71
|
+
}
|
|
72
|
+
function beforeOf(tick) {
|
|
73
|
+
if (tick === undefined || tick.type === "manual")
|
|
74
|
+
return [];
|
|
75
|
+
if (tick.type === "fixed" || tick.type === "frame" || tick.type === "interval") {
|
|
76
|
+
return asList(tick.before);
|
|
77
|
+
}
|
|
78
|
+
return [];
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Topological sort with a stable tie-break on original declaration index, then id.
|
|
82
|
+
* Edges: `after: "x"` means this runs after x (x → this); `before: "y"` means this → y.
|
|
83
|
+
* @internal
|
|
84
|
+
*/
|
|
85
|
+
export function orderWithConstraints(ids, after, before, indexOf) {
|
|
86
|
+
const idSet = new Set(ids);
|
|
87
|
+
const preds = new Map();
|
|
88
|
+
const succs = new Map();
|
|
89
|
+
for (const id of ids) {
|
|
90
|
+
preds.set(id, new Set());
|
|
91
|
+
succs.set(id, new Set());
|
|
92
|
+
}
|
|
93
|
+
const addEdge = (from, to) => {
|
|
94
|
+
if (!idSet.has(from) || !idSet.has(to) || from === to)
|
|
95
|
+
return;
|
|
96
|
+
succs.get(from).add(to);
|
|
97
|
+
preds.get(to).add(from);
|
|
98
|
+
};
|
|
99
|
+
for (const id of ids) {
|
|
100
|
+
for (const a of after.get(id) ?? [])
|
|
101
|
+
addEdge(a, id);
|
|
102
|
+
for (const b of before.get(id) ?? [])
|
|
103
|
+
addEdge(id, b);
|
|
104
|
+
}
|
|
105
|
+
const ready = ids
|
|
106
|
+
.filter((id) => preds.get(id).size === 0)
|
|
107
|
+
.sort((a, b) => {
|
|
108
|
+
const ia = indexOf.get(a) ?? 0;
|
|
109
|
+
const ib = indexOf.get(b) ?? 0;
|
|
110
|
+
if (ia !== ib)
|
|
111
|
+
return ia - ib;
|
|
112
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
|
113
|
+
});
|
|
114
|
+
const ordered = [];
|
|
115
|
+
while (ready.length > 0) {
|
|
116
|
+
const next = ready.shift();
|
|
117
|
+
ordered.push(next);
|
|
118
|
+
for (const succ of succs.get(next) ?? []) {
|
|
119
|
+
const set = preds.get(succ);
|
|
120
|
+
set.delete(next);
|
|
121
|
+
if (set.size === 0) {
|
|
122
|
+
ready.push(succ);
|
|
123
|
+
ready.sort((a, b) => {
|
|
124
|
+
const ia = indexOf.get(a) ?? 0;
|
|
125
|
+
const ib = indexOf.get(b) ?? 0;
|
|
126
|
+
if (ia !== ib)
|
|
127
|
+
return ia - ib;
|
|
128
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
if (ordered.length !== ids.length) {
|
|
134
|
+
const leftover = ids.filter((id) => !ordered.includes(id));
|
|
135
|
+
throw new Error(`system schedule: cyclic before/after constraints among: ${leftover.join(", ")}`);
|
|
136
|
+
}
|
|
137
|
+
return ordered;
|
|
138
|
+
}
|
|
139
|
+
function bucketByStage(items, stageOrder, indexOf) {
|
|
140
|
+
const stageIndex = new Map();
|
|
141
|
+
stageOrder.forEach((s, i) => stageIndex.set(s, i));
|
|
142
|
+
const unknownStages = new Set();
|
|
143
|
+
for (const item of items) {
|
|
144
|
+
if (item.stage !== "" && !stageIndex.has(item.stage))
|
|
145
|
+
unknownStages.add(item.stage);
|
|
146
|
+
}
|
|
147
|
+
const stages = [...stageOrder, ...[...unknownStages].sort()];
|
|
148
|
+
const buckets = [];
|
|
149
|
+
for (const stage of stages) {
|
|
150
|
+
const inStage = items.filter((s) => s.stage === stage);
|
|
151
|
+
if (inStage.length === 0)
|
|
152
|
+
continue;
|
|
153
|
+
const after = new Map();
|
|
154
|
+
const before = new Map();
|
|
155
|
+
for (const s of inStage) {
|
|
156
|
+
after.set(s.id, s.after);
|
|
157
|
+
before.set(s.id, s.before);
|
|
158
|
+
}
|
|
159
|
+
const order = orderWithConstraints(inStage.map((s) => s.id), after, before, indexOf);
|
|
160
|
+
buckets.push({ stage, systems: order });
|
|
161
|
+
}
|
|
162
|
+
return buckets;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Compile system definitions into a deterministic schedule.
|
|
166
|
+
* Validates unique ids, `dependsOn`, and before/after cycles.
|
|
167
|
+
*
|
|
168
|
+
* @capability system-schedule compile fixed/frame/interval system ticks into deterministic ordered stages
|
|
169
|
+
*/
|
|
170
|
+
export function compileSystemSchedule(systems, options) {
|
|
171
|
+
const fixedStages = options?.fixedStages ?? DEFAULT_FIXED_STAGES;
|
|
172
|
+
const frameStages = options?.frameStages ?? DEFAULT_FRAME_STAGES;
|
|
173
|
+
const defaultFixedRate = options?.defaultFixedRate ?? DEFAULT_FIXED_RATE;
|
|
174
|
+
const systemsById = new Map();
|
|
175
|
+
const indexOf = new Map();
|
|
176
|
+
systems.forEach((system, index) => {
|
|
177
|
+
if (systemsById.has(system.id)) {
|
|
178
|
+
throw new Error(`system schedule: duplicate system id "${system.id}"`);
|
|
179
|
+
}
|
|
180
|
+
systemsById.set(system.id, system);
|
|
181
|
+
indexOf.set(system.id, index);
|
|
182
|
+
});
|
|
183
|
+
for (const system of systems) {
|
|
184
|
+
for (const dep of system.dependsOn ?? []) {
|
|
185
|
+
if (!systemsById.has(dep)) {
|
|
186
|
+
throw new Error(`system schedule: "${system.id}" dependsOn unknown system "${dep}"`);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
const scheduled = systems.map((system) => {
|
|
191
|
+
const channel = channelOf(system.tick);
|
|
192
|
+
return {
|
|
193
|
+
id: system.id,
|
|
194
|
+
channel,
|
|
195
|
+
stage: stageOf(system.tick, channel),
|
|
196
|
+
rate: rateOf(system.tick, defaultFixedRate),
|
|
197
|
+
every: everyOf(system.tick),
|
|
198
|
+
after: afterOf(system.tick),
|
|
199
|
+
before: beforeOf(system.tick),
|
|
200
|
+
dependsOn: system.dependsOn ?? [],
|
|
201
|
+
};
|
|
202
|
+
});
|
|
203
|
+
const fixedItems = scheduled.filter((s) => s.channel === "fixed");
|
|
204
|
+
const rates = [...new Set(fixedItems.map((s) => s.rate ?? defaultFixedRate))].sort((a, b) => b - a);
|
|
205
|
+
const fixed = rates.map((rate) => {
|
|
206
|
+
const group = fixedItems.filter((s) => (s.rate ?? defaultFixedRate) === rate);
|
|
207
|
+
const stages = bucketByStage(group, fixedStages, indexOf);
|
|
208
|
+
return {
|
|
209
|
+
rate,
|
|
210
|
+
stages,
|
|
211
|
+
order: stages.flatMap((b) => b.systems),
|
|
212
|
+
};
|
|
213
|
+
});
|
|
214
|
+
const frameItems = scheduled.filter((s) => s.channel === "frame");
|
|
215
|
+
const frame = bucketByStage(frameItems, frameStages, indexOf);
|
|
216
|
+
const frameOrder = frame.flatMap((b) => b.systems);
|
|
217
|
+
const intervals = scheduled.filter((s) => s.channel === "interval");
|
|
218
|
+
// Stable order for intervals: stage buckets then constraints across all interval systems
|
|
219
|
+
const intervalBuckets = bucketByStage(intervals, fixedStages, indexOf);
|
|
220
|
+
const intervalOrder = intervalBuckets.flatMap((b) => b.systems);
|
|
221
|
+
const intervalsOrdered = intervalOrder.map((id) => intervals.find((s) => s.id === id));
|
|
222
|
+
const manual = scheduled.filter((s) => s.channel === "manual").map((s) => s.id);
|
|
223
|
+
const eventOnly = scheduled
|
|
224
|
+
.filter((s) => s.channel === "event")
|
|
225
|
+
.map((s) => s.id);
|
|
226
|
+
const tickOrder = [
|
|
227
|
+
...fixed.flatMap((g) => g.order),
|
|
228
|
+
...frameOrder,
|
|
229
|
+
...intervalOrder,
|
|
230
|
+
];
|
|
231
|
+
return {
|
|
232
|
+
systemsById,
|
|
233
|
+
scheduled,
|
|
234
|
+
fixed,
|
|
235
|
+
frame,
|
|
236
|
+
frameOrder,
|
|
237
|
+
intervals: intervalsOrdered,
|
|
238
|
+
manual,
|
|
239
|
+
eventOnly,
|
|
240
|
+
tickOrder,
|
|
241
|
+
};
|
|
242
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/** A transient HUD message that expires on its own — banner, pickup note, alert. */
|
|
2
|
+
export interface Toast<T = string> {
|
|
3
|
+
/** Stable id for keying in a UI list. */
|
|
4
|
+
id: string;
|
|
5
|
+
/** Message payload (a string, or any structured content the HUD renders). */
|
|
6
|
+
body: T;
|
|
7
|
+
/** Wall-clock time (seconds) after which the toast should be dropped. */
|
|
8
|
+
expiresAt: number;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Append `toast`, keeping only the newest `cap` entries.
|
|
12
|
+
*
|
|
13
|
+
* @capability toast-feed queue of transient self-expiring on-screen messages (toasts, announcer, kill-feed)
|
|
14
|
+
*/
|
|
15
|
+
export declare function appendToast<T>(toasts: readonly Toast<T>[], toast: Toast<T>, cap: number): readonly Toast<T>[];
|
|
16
|
+
/** Drop every toast whose `expiresAt` is at or before `now`. Returns the same array when nothing expired. */
|
|
17
|
+
export declare function pruneToasts<T>(toasts: readonly Toast<T>[], now: number): readonly Toast<T>[];
|
|
18
|
+
/** Stateful transient-toast list with a size cap and time-to-live eviction. */
|
|
19
|
+
export interface ToastQueue<T = string> {
|
|
20
|
+
/** Raise a toast at `now` living `ttlSeconds` (falling back to the queue default); returns it. */
|
|
21
|
+
push(body: T, now: number, ttlSeconds?: number): Toast<T>;
|
|
22
|
+
/** Evict toasts that have expired as of `now`. */
|
|
23
|
+
prune(now: number): void;
|
|
24
|
+
/** Current live toasts, oldest first. */
|
|
25
|
+
list(): readonly Toast<T>[];
|
|
26
|
+
/** Remove all toasts. */
|
|
27
|
+
clear(): void;
|
|
28
|
+
}
|
|
29
|
+
/** Options for {@link createToastQueue}. */
|
|
30
|
+
export interface ToastQueueOptions {
|
|
31
|
+
/** Maximum toasts retained; older ones fall off. Defaults to 4. */
|
|
32
|
+
cap?: number;
|
|
33
|
+
/** Default lifetime in seconds when `push` is not given one. Defaults to 3. */
|
|
34
|
+
ttlSeconds?: number;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* A capped, self-expiring toast queue — the append-with-limit plus TTL-prune list every HUD hand-rolled
|
|
38
|
+
* on top of a plain array. Feed it game time: `push` raises a message, `prune(now)` drops expired ones,
|
|
39
|
+
* `list()` is what the HUD renders. Unlike the append-only event feed, toasts evict themselves.
|
|
40
|
+
*
|
|
41
|
+
* @capability toast-feed queue of transient self-expiring on-screen messages (toasts, announcer, kill-feed)
|
|
42
|
+
*/
|
|
43
|
+
export declare function createToastQueue<T = string>(options?: ToastQueueOptions): ToastQueue<T>;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Append `toast`, keeping only the newest `cap` entries.
|
|
3
|
+
*
|
|
4
|
+
* @capability toast-feed queue of transient self-expiring on-screen messages (toasts, announcer, kill-feed)
|
|
5
|
+
*/
|
|
6
|
+
export function appendToast(toasts, toast, cap) {
|
|
7
|
+
const next = [...toasts, toast];
|
|
8
|
+
return cap > 0 && next.length > cap ? next.slice(next.length - cap) : next;
|
|
9
|
+
}
|
|
10
|
+
/** Drop every toast whose `expiresAt` is at or before `now`. Returns the same array when nothing expired. */
|
|
11
|
+
export function pruneToasts(toasts, now) {
|
|
12
|
+
const kept = toasts.filter((toast) => toast.expiresAt > now);
|
|
13
|
+
return kept.length === toasts.length ? toasts : kept;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* A capped, self-expiring toast queue — the append-with-limit plus TTL-prune list every HUD hand-rolled
|
|
17
|
+
* on top of a plain array. Feed it game time: `push` raises a message, `prune(now)` drops expired ones,
|
|
18
|
+
* `list()` is what the HUD renders. Unlike the append-only event feed, toasts evict themselves.
|
|
19
|
+
*
|
|
20
|
+
* @capability toast-feed queue of transient self-expiring on-screen messages (toasts, announcer, kill-feed)
|
|
21
|
+
*/
|
|
22
|
+
export function createToastQueue(options = {}) {
|
|
23
|
+
const cap = options.cap ?? 4;
|
|
24
|
+
const defaultTtl = options.ttlSeconds ?? 3;
|
|
25
|
+
let toasts = [];
|
|
26
|
+
let counter = 0;
|
|
27
|
+
return {
|
|
28
|
+
push(body, now, ttlSeconds) {
|
|
29
|
+
const toast = { id: `toast-${counter}`, body, expiresAt: now + (ttlSeconds ?? defaultTtl) };
|
|
30
|
+
counter += 1;
|
|
31
|
+
toasts = appendToast(toasts, toast, cap);
|
|
32
|
+
return toast;
|
|
33
|
+
},
|
|
34
|
+
prune(now) {
|
|
35
|
+
toasts = pruneToasts(toasts, now);
|
|
36
|
+
},
|
|
37
|
+
list() {
|
|
38
|
+
return toasts;
|
|
39
|
+
},
|
|
40
|
+
clear() {
|
|
41
|
+
toasts = [];
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
}
|
package/dist/game/trade.d.ts
CHANGED
|
@@ -32,6 +32,7 @@ export interface TradeSystem {
|
|
|
32
32
|
sell(itemId: string, count: number | undefined, party: TradeParty): TradeRejection | null;
|
|
33
33
|
tradableAt(shopId: string, allItemIds: string[]): string[];
|
|
34
34
|
}
|
|
35
|
+
/** @internal */
|
|
35
36
|
export declare function canAffordCosts(balances: Record<string, number>, costs: Record<string, number>): string | null;
|
|
36
37
|
export interface TradeOutcome {
|
|
37
38
|
itemId: string;
|
|
@@ -45,8 +46,11 @@ export type TradeResolution = {
|
|
|
45
46
|
status: "rejected";
|
|
46
47
|
reason: string;
|
|
47
48
|
};
|
|
49
|
+
/** @internal */
|
|
48
50
|
export declare function resolveBuy(itemId: string, trade: TradeField | null | undefined, shopId: string, count: number, balances: Record<string, number>): TradeResolution;
|
|
51
|
+
/** @internal */
|
|
49
52
|
export declare function resolveSell(itemId: string, trade: TradeField | null | undefined, count: number): TradeResolution;
|
|
53
|
+
/** @internal */
|
|
50
54
|
export declare function applyTradeOutcome(outcome: TradeOutcome, appliers: {
|
|
51
55
|
adjustItem(itemId: string, count: number): {
|
|
52
56
|
reason: string;
|
|
@@ -55,4 +59,10 @@ export declare function applyTradeOutcome(outcome: TradeOutcome, appliers: {
|
|
|
55
59
|
}): {
|
|
56
60
|
reason: string;
|
|
57
61
|
} | null;
|
|
62
|
+
/**
|
|
63
|
+
* Buy and sell goods against player currency balances, resolving affordability and price.
|
|
64
|
+
*
|
|
65
|
+
* @capability shop-trade buy and sell goods against player currency balances
|
|
66
|
+
* @internal
|
|
67
|
+
*/
|
|
58
68
|
export declare function createTradeSystem(deps: TradeSystemDeps): TradeSystem;
|
package/dist/game/trade.js
CHANGED
|
@@ -10,6 +10,7 @@ function negate(amounts) {
|
|
|
10
10
|
out[currency] = -amount;
|
|
11
11
|
return out;
|
|
12
12
|
}
|
|
13
|
+
/** @internal */
|
|
13
14
|
export function canAffordCosts(balances, costs) {
|
|
14
15
|
for (const [currency, amount] of Object.entries(costs)) {
|
|
15
16
|
if ((balances[currency] ?? 0) < amount)
|
|
@@ -27,6 +28,7 @@ function buyEligibility(trade, shopId) {
|
|
|
27
28
|
function sellEligibility(trade) {
|
|
28
29
|
return trade?.sell ? null : "not-sellable";
|
|
29
30
|
}
|
|
31
|
+
/** @internal */
|
|
30
32
|
export function resolveBuy(itemId, trade, shopId, count, balances) {
|
|
31
33
|
const ineligible = buyEligibility(trade, shopId);
|
|
32
34
|
if (ineligible)
|
|
@@ -37,12 +39,14 @@ export function resolveBuy(itemId, trade, shopId, count, balances) {
|
|
|
37
39
|
return { status: "rejected", reason: unaffordable };
|
|
38
40
|
return { status: "ok", outcome: { itemId, count, currency: negate(costs) } };
|
|
39
41
|
}
|
|
42
|
+
/** @internal */
|
|
40
43
|
export function resolveSell(itemId, trade, count) {
|
|
41
44
|
const ineligible = sellEligibility(trade);
|
|
42
45
|
if (ineligible)
|
|
43
46
|
return { status: "rejected", reason: ineligible };
|
|
44
47
|
return { status: "ok", outcome: { itemId, count: -count, currency: scale(trade.sell, count) } };
|
|
45
48
|
}
|
|
49
|
+
/** @internal */
|
|
46
50
|
export function applyTradeOutcome(outcome, appliers) {
|
|
47
51
|
const itemResult = appliers.adjustItem(outcome.itemId, outcome.count);
|
|
48
52
|
if (itemResult)
|
|
@@ -50,6 +54,12 @@ export function applyTradeOutcome(outcome, appliers) {
|
|
|
50
54
|
appliers.adjustCurrency(outcome.currency);
|
|
51
55
|
return null;
|
|
52
56
|
}
|
|
57
|
+
/**
|
|
58
|
+
* Buy and sell goods against player currency balances, resolving affordability and price.
|
|
59
|
+
*
|
|
60
|
+
* @capability shop-trade buy and sell goods against player currency balances
|
|
61
|
+
* @internal
|
|
62
|
+
*/
|
|
53
63
|
export function createTradeSystem(deps) {
|
|
54
64
|
const { resolveTrade, wallet, inventory } = deps;
|
|
55
65
|
function canBuy(itemId, shopId, count = 1) {
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import type { FactionRelation } from "../faction/factions.js";
|
|
2
|
+
/**
|
|
3
|
+
* A rank within a group's hierarchy. Higher `level` means more authority: a member can only
|
|
4
|
+
* manage (kick, re-rank) members strictly below their own level, and cannot promote anyone to a
|
|
5
|
+
* level at or above their own. `permissions` are opaque, genre-agnostic capability slugs the game
|
|
6
|
+
* checks with {@link Tribe.can} (e.g. `"build"`, `"demolish"`, `"invite"`, `"kick"`, `"manage-ranks"`,
|
|
7
|
+
* plus the {@link AssetAction} slugs `"inventory"`, `"use"`, `"command"` for group-owned assets).
|
|
8
|
+
* A `bypass` rank (an admin) skips every permission check, exactly like the founder.
|
|
9
|
+
*/
|
|
10
|
+
export interface TribeRankDef {
|
|
11
|
+
id: string;
|
|
12
|
+
name: string;
|
|
13
|
+
/** Higher = more authority. Determines who can manage/promote whom. */
|
|
14
|
+
level: number;
|
|
15
|
+
/** Capability slugs this rank grants; checked by {@link Tribe.can} and {@link Tribe.canAccess}. */
|
|
16
|
+
permissions?: readonly string[];
|
|
17
|
+
/** Admin rank — bypasses all permission and hierarchy checks (like the founder). */
|
|
18
|
+
bypass?: boolean;
|
|
19
|
+
}
|
|
20
|
+
/** Per-asset action gated by rank on group-owned assets. */
|
|
21
|
+
export type AssetAction = "inventory" | "use" | "command";
|
|
22
|
+
/** Opaque reference to a shared thing (structure, creature, container) by kind + id. */
|
|
23
|
+
export interface AssetRef {
|
|
24
|
+
kind: string;
|
|
25
|
+
id: string;
|
|
26
|
+
}
|
|
27
|
+
/** Who inside the group owns an asset: the group as a whole, or a specific member personally. */
|
|
28
|
+
export type AssetOwnership = {
|
|
29
|
+
scope: "group";
|
|
30
|
+
} | {
|
|
31
|
+
scope: "personal";
|
|
32
|
+
memberId: string;
|
|
33
|
+
};
|
|
34
|
+
/** The kind of change recorded in a tribe's event log (membership, ownership, or alliance). */
|
|
35
|
+
export type TribeEventType = "member-added" | "member-removed" | "member-left" | "rank-changed" | "founder-transferred" | "asset-registered" | "asset-unregistered" | "alliance-formed" | "alliance-broken";
|
|
36
|
+
/** One entry in a tribe's bounded event log. Optional fields present only when meaningful. */
|
|
37
|
+
export interface TribeEvent {
|
|
38
|
+
seq: number;
|
|
39
|
+
type: TribeEventType;
|
|
40
|
+
at: number;
|
|
41
|
+
/** Member who performed the action, when applicable. */
|
|
42
|
+
actor?: string;
|
|
43
|
+
/** Member the action targets (added/removed/re-ranked). */
|
|
44
|
+
subject?: string;
|
|
45
|
+
/** Other tribe id, for alliance events. */
|
|
46
|
+
tribeId?: string;
|
|
47
|
+
rankId?: string;
|
|
48
|
+
assetKind?: string;
|
|
49
|
+
assetId?: string;
|
|
50
|
+
}
|
|
51
|
+
/** A member of a tribe and the rank id that governs their permissions. */
|
|
52
|
+
export interface TribeMemberRecord {
|
|
53
|
+
id: string;
|
|
54
|
+
rankId: string;
|
|
55
|
+
joinedAt: number;
|
|
56
|
+
}
|
|
57
|
+
/** An asset (structure/creature) owned within a tribe — group-shared or held by one member. */
|
|
58
|
+
export interface TribeAssetRecord {
|
|
59
|
+
kind: string;
|
|
60
|
+
id: string;
|
|
61
|
+
/** `null` marks a group-owned asset; otherwise the member who owns it personally. */
|
|
62
|
+
ownerId: string | null;
|
|
63
|
+
}
|
|
64
|
+
/** Full serializable state of one tribe — the save/replication baseline. */
|
|
65
|
+
export interface TribeSnapshot {
|
|
66
|
+
id: string;
|
|
67
|
+
founderId: string;
|
|
68
|
+
ranks: TribeRankDef[];
|
|
69
|
+
defaultRankId: string;
|
|
70
|
+
founderRankId: string;
|
|
71
|
+
logCap: number;
|
|
72
|
+
members: TribeMemberRecord[];
|
|
73
|
+
assets: TribeAssetRecord[];
|
|
74
|
+
allies: string[];
|
|
75
|
+
events: TribeEvent[];
|
|
76
|
+
eventSeq: number;
|
|
77
|
+
}
|
|
78
|
+
/** Construction options for {@link createTribe}: id, founder, rank ladder, and log cap. */
|
|
79
|
+
export interface TribeConfig {
|
|
80
|
+
id: string;
|
|
81
|
+
founderId: string;
|
|
82
|
+
/** At least one rank. */
|
|
83
|
+
ranks: readonly TribeRankDef[];
|
|
84
|
+
/** Rank new members receive; defaults to the lowest-level rank. */
|
|
85
|
+
defaultRankId?: string;
|
|
86
|
+
/** Rank the founder holds; defaults to the highest-level rank. */
|
|
87
|
+
founderRankId?: string;
|
|
88
|
+
/** Max events retained in the ring buffer (default 128). */
|
|
89
|
+
logCap?: number;
|
|
90
|
+
/** Injected clock for deterministic timestamps; defaults to `Date.now`. */
|
|
91
|
+
now?: () => number;
|
|
92
|
+
}
|
|
93
|
+
/** Standard `{ reason }`-on-failure / `null`-on-success result for authorized mutations. */
|
|
94
|
+
export type TribeResult = {
|
|
95
|
+
reason: string;
|
|
96
|
+
} | null;
|
|
97
|
+
/**
|
|
98
|
+
* A shared-ownership group — a tribe, guild, clan, or company — as one first-class aggregate.
|
|
99
|
+
* Unifies ranked membership, group-vs-personal asset ownership, mutual alliances, and a bounded
|
|
100
|
+
* event log that otherwise have to be hand-assembled from parties, factions, build permissions,
|
|
101
|
+
* and per-owner rosters.
|
|
102
|
+
*/
|
|
103
|
+
export interface Tribe {
|
|
104
|
+
readonly id: string;
|
|
105
|
+
founderId(): string;
|
|
106
|
+
hasMember(memberId: string): boolean;
|
|
107
|
+
memberIds(): readonly string[];
|
|
108
|
+
rankOf(memberId: string): TribeRankDef | null;
|
|
109
|
+
/** True if the member's rank grants `permission`, or they are the founder / an admin rank. */
|
|
110
|
+
can(memberId: string, permission: string): boolean;
|
|
111
|
+
/** Founder or a `bypass` rank — skips every permission check. */
|
|
112
|
+
isAdmin(memberId: string): boolean;
|
|
113
|
+
addMember(actorId: string, memberId: string, rankId?: string): TribeResult;
|
|
114
|
+
removeMember(actorId: string, memberId: string): TribeResult;
|
|
115
|
+
leave(memberId: string): TribeResult;
|
|
116
|
+
setMemberRank(actorId: string, memberId: string, rankId: string): TribeResult;
|
|
117
|
+
transferFounder(actorId: string, memberId: string): TribeResult;
|
|
118
|
+
registerAsset(actorId: string, ref: AssetRef, ownership: AssetOwnership): TribeResult;
|
|
119
|
+
unregisterAsset(actorId: string, ref: AssetRef): TribeResult;
|
|
120
|
+
ownerOfAsset(ref: AssetRef): AssetOwnership | null;
|
|
121
|
+
/** Personal assets a member holds inside this group (they keep these on leaving). */
|
|
122
|
+
assetsOf(memberId: string): readonly AssetRef[];
|
|
123
|
+
/** Resolve access to an asset: rank permission for group assets, ownership for personal ones. */
|
|
124
|
+
canAccess(memberId: string, ref: AssetRef, action: AssetAction): boolean;
|
|
125
|
+
addAlly(tribeId: string): void;
|
|
126
|
+
removeAlly(tribeId: string): void;
|
|
127
|
+
isAllied(tribeId: string): boolean;
|
|
128
|
+
allyIds(): readonly string[];
|
|
129
|
+
/** `"friendly"` for self and allies, else `"neutral"` — never hostile by default. */
|
|
130
|
+
relationTo(tribeId: string): FactionRelation;
|
|
131
|
+
events(): readonly TribeEvent[];
|
|
132
|
+
snapshot(): TribeSnapshot;
|
|
133
|
+
hydrate(snapshot: TribeSnapshot): void;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Create a shared-ownership group aggregate (tribe / guild / clan / company). Members hold a
|
|
137
|
+
* {@link TribeRankDef rank} whose configurable permission slugs gate management actions and access
|
|
138
|
+
* to group-owned assets, while personally-owned assets stay with their member — and follow them out
|
|
139
|
+
* when they leave. Group↔group {@link Tribe.addAlly alliances} resolve allied tribes as friendly, and
|
|
140
|
+
* every membership / ownership / alliance change lands in a bounded ring-buffer {@link Tribe.events log}.
|
|
141
|
+
* All state is plain JSON via {@link Tribe.snapshot}/{@link Tribe.hydrate}; timestamps come from an
|
|
142
|
+
* injected clock for determinism. Compose many tribes with {@link createTribeRegistry} for mutual
|
|
143
|
+
* alliances and cross-member relation lookups.
|
|
144
|
+
*
|
|
145
|
+
* @capability tribe-group shared-ownership group (tribe/guild/clan) with ranked permissions, group vs personal assets, alliances, and a bounded event log
|
|
146
|
+
*/
|
|
147
|
+
export declare function createTribe(config: TribeConfig): Tribe;
|
|
148
|
+
/** Injected dependencies for {@link createTribeRegistry} (e.g. a `now()` clock for event timestamps). */
|
|
149
|
+
export interface TribeRegistryDeps {
|
|
150
|
+
now?: () => number;
|
|
151
|
+
defaultLogCap?: number;
|
|
152
|
+
}
|
|
153
|
+
/** Full serializable state of a tribe registry — every tribe's snapshot in one payload. */
|
|
154
|
+
export interface TribeRegistrySnapshot {
|
|
155
|
+
tribes: TribeSnapshot[];
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* A collection of {@link Tribe tribes} with mutual alliance management and cross-member relation
|
|
159
|
+
* lookups. Alliances are kept symmetric here (both sides updated together), and member-to-member
|
|
160
|
+
* relations resolve through tribe membership + alliances, mirroring the `faction` graph vocabulary.
|
|
161
|
+
*/
|
|
162
|
+
export interface TribeRegistry {
|
|
163
|
+
create(config: TribeConfig): Tribe;
|
|
164
|
+
get(id: string): Tribe | null;
|
|
165
|
+
all(): readonly Tribe[];
|
|
166
|
+
remove(id: string): void;
|
|
167
|
+
/** Form a mutual alliance, updating and logging both tribes. */
|
|
168
|
+
formAlliance(tribeA: string, tribeB: string): TribeResult;
|
|
169
|
+
/** Break a mutual alliance on both sides. */
|
|
170
|
+
breakAlliance(tribeA: string, tribeB: string): void;
|
|
171
|
+
areAllied(tribeA: string, tribeB: string): boolean;
|
|
172
|
+
relationBetweenTribes(tribeA: string, tribeB: string): FactionRelation;
|
|
173
|
+
tribeOfMember(memberId: string): Tribe | null;
|
|
174
|
+
relationBetweenMembers(memberA: string, memberB: string): FactionRelation;
|
|
175
|
+
isFriendly(memberA: string, memberB: string): boolean;
|
|
176
|
+
snapshot(): TribeRegistrySnapshot;
|
|
177
|
+
hydrate(snapshot: TribeRegistrySnapshot): void;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Create a registry that owns many tribes, keeps alliances mutual, and resolves member relations.
|
|
181
|
+
*
|
|
182
|
+
* @capability tribe-registry registry of tribes with mutual alliances and cross-tribe relation lookup
|
|
183
|
+
*/
|
|
184
|
+
export declare function createTribeRegistry(deps?: TribeRegistryDeps): TribeRegistry;
|