@datamoc/mw_games 0.7.6 → 0.7.8
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 +359 -0
- package/README.md +7 -7
- package/dist/actors/Inventory.d.ts +7 -1
- package/dist/actors/Inventory.d.ts.map +1 -1
- package/dist/actors/Inventory.js.map +1 -1
- package/dist/actors/Shop.d.ts.map +1 -1
- package/dist/actors/Shop.js +4 -1
- package/dist/actors/Shop.js.map +1 -1
- package/dist/actors/craft.d.ts +35 -14
- package/dist/actors/craft.d.ts.map +1 -1
- package/dist/actors/craft.js +56 -24
- package/dist/actors/craft.js.map +1 -1
- package/dist/actors/index.d.ts +1 -1
- package/dist/actors/index.d.ts.map +1 -1
- package/dist/ai/Heuristics.d.ts +240 -0
- package/dist/ai/Heuristics.d.ts.map +1 -0
- package/dist/ai/Heuristics.js +298 -0
- package/dist/ai/Heuristics.js.map +1 -0
- package/dist/ai/index.d.ts +4 -0
- package/dist/ai/index.d.ts.map +1 -1
- package/dist/ai/index.js +2 -0
- package/dist/ai/index.js.map +1 -1
- package/dist/ai/lua.d.ts +21 -0
- package/dist/ai/lua.d.ts.map +1 -1
- package/dist/ai/lua.js +21 -0
- package/dist/ai/lua.js.map +1 -1
- package/dist/ai/score.d.ts +162 -0
- package/dist/ai/score.d.ts.map +1 -0
- package/dist/ai/score.js +147 -0
- package/dist/ai/score.js.map +1 -0
- package/dist/assets/loader.d.ts +18 -4
- package/dist/assets/loader.d.ts.map +1 -1
- package/dist/assets/loader.js +40 -11
- package/dist/assets/loader.js.map +1 -1
- package/dist/audio/Positional.d.ts +125 -0
- package/dist/audio/Positional.d.ts.map +1 -0
- package/dist/audio/Positional.js +135 -0
- package/dist/audio/Positional.js.map +1 -0
- package/dist/audio/Sound.d.ts +7 -1
- package/dist/audio/Sound.d.ts.map +1 -1
- package/dist/audio/Sound.js +8 -2
- package/dist/audio/Sound.js.map +1 -1
- package/dist/audio/index.d.ts +2 -0
- package/dist/audio/index.d.ts.map +1 -1
- package/dist/audio/index.js +1 -0
- package/dist/audio/index.js.map +1 -1
- package/dist/battle/AttackDialog.d.ts +75 -0
- package/dist/battle/AttackDialog.d.ts.map +1 -0
- package/dist/battle/AttackDialog.js +115 -0
- package/dist/battle/AttackDialog.js.map +1 -0
- package/dist/battle/AttackPreview.d.ts +70 -0
- package/dist/battle/AttackPreview.d.ts.map +1 -0
- package/dist/battle/AttackPreview.js +78 -0
- package/dist/battle/AttackPreview.js.map +1 -0
- package/dist/battle/BattleStats.d.ts +45 -0
- package/dist/battle/BattleStats.d.ts.map +1 -0
- package/dist/battle/BattleStats.js +63 -0
- package/dist/battle/BattleStats.js.map +1 -0
- package/dist/battle/UnitSelector.d.ts +72 -0
- package/dist/battle/UnitSelector.d.ts.map +1 -0
- package/dist/battle/UnitSelector.js +117 -0
- package/dist/battle/UnitSelector.js.map +1 -0
- package/dist/battle/Whiteboard.d.ts +50 -0
- package/dist/battle/Whiteboard.d.ts.map +1 -0
- package/dist/battle/Whiteboard.js +94 -0
- package/dist/battle/Whiteboard.js.map +1 -0
- package/dist/battle/index.d.ts +10 -0
- package/dist/battle/index.d.ts.map +1 -1
- package/dist/battle/index.js +5 -0
- package/dist/battle/index.js.map +1 -1
- package/dist/board/Classics.d.ts.map +1 -1
- package/dist/board/Classics.js +51 -39
- package/dist/board/Classics.js.map +1 -1
- package/dist/board/FogOfWar.d.ts +32 -2
- package/dist/board/FogOfWar.d.ts.map +1 -1
- package/dist/board/FogOfWar.js +70 -6
- package/dist/board/FogOfWar.js.map +1 -1
- package/dist/board/HexSkirmish.d.ts.map +1 -1
- package/dist/board/HexSkirmish.js +69 -20
- package/dist/board/HexSkirmish.js.map +1 -1
- package/dist/board/Tactics.d.ts +7 -0
- package/dist/board/Tactics.d.ts.map +1 -1
- package/dist/board/Tactics.js +2 -2
- package/dist/board/Tactics.js.map +1 -1
- package/dist/core/Achievements.d.ts +40 -7
- package/dist/core/Achievements.d.ts.map +1 -1
- package/dist/core/Achievements.js +53 -7
- package/dist/core/Achievements.js.map +1 -1
- package/dist/core/Hex.d.ts +26 -6
- package/dist/core/Hex.d.ts.map +1 -1
- package/dist/core/Hex.js +40 -13
- package/dist/core/Hex.js.map +1 -1
- package/dist/core/Input.d.ts +36 -0
- package/dist/core/Input.d.ts.map +1 -1
- package/dist/core/Input.js +63 -1
- package/dist/core/Input.js.map +1 -1
- package/dist/core/Random.d.ts +93 -0
- package/dist/core/Random.d.ts.map +1 -1
- package/dist/core/Random.js +177 -0
- package/dist/core/Random.js.map +1 -1
- package/dist/core/SyncGuard.d.ts +57 -0
- package/dist/core/SyncGuard.d.ts.map +1 -0
- package/dist/core/SyncGuard.js +116 -0
- package/dist/core/SyncGuard.js.map +1 -0
- package/dist/core/index.d.ts +3 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +2 -1
- package/dist/core/index.js.map +1 -1
- package/dist/i18n/Po.d.ts +51 -0
- package/dist/i18n/Po.d.ts.map +1 -0
- package/dist/i18n/Po.js +176 -0
- package/dist/i18n/Po.js.map +1 -0
- package/dist/i18n/index.d.ts +2 -0
- package/dist/i18n/index.d.ts.map +1 -1
- package/dist/i18n/index.js +1 -0
- package/dist/i18n/index.js.map +1 -1
- package/dist/mw_games.global.js +104 -98
- package/dist/mwl/MapFile.d.ts +41 -0
- package/dist/mwl/MapFile.d.ts.map +1 -0
- package/dist/mwl/MapFile.js +43 -0
- package/dist/mwl/MapFile.js.map +1 -0
- package/dist/mwl/actors.d.ts +46 -2
- package/dist/mwl/actors.d.ts.map +1 -1
- package/dist/mwl/actors.js +46 -2
- package/dist/mwl/actors.js.map +1 -1
- package/dist/mwl/campaign.d.ts +51 -0
- package/dist/mwl/campaign.d.ts.map +1 -0
- package/dist/mwl/campaign.js +58 -0
- package/dist/mwl/campaign.js.map +1 -0
- package/dist/mwl/carryover.d.ts +86 -0
- package/dist/mwl/carryover.d.ts.map +1 -0
- package/dist/mwl/carryover.js +70 -0
- package/dist/mwl/carryover.js.map +1 -0
- package/dist/mwl/catalog.d.ts +10 -1
- package/dist/mwl/catalog.d.ts.map +1 -1
- package/dist/mwl/catalog.js +10 -1
- package/dist/mwl/catalog.js.map +1 -1
- package/dist/mwl/compiler.d.ts +70 -3
- package/dist/mwl/compiler.d.ts.map +1 -1
- package/dist/mwl/compiler.js +70 -3
- package/dist/mwl/compiler.js.map +1 -1
- package/dist/mwl/conditions.d.ts +10 -1
- package/dist/mwl/conditions.d.ts.map +1 -1
- package/dist/mwl/conditions.js +10 -1
- package/dist/mwl/conditions.js.map +1 -1
- package/dist/mwl/content.d.ts +21 -0
- package/dist/mwl/content.d.ts.map +1 -1
- package/dist/mwl/content.js +19 -0
- package/dist/mwl/content.js.map +1 -1
- package/dist/mwl/expression.d.ts +21 -0
- package/dist/mwl/expression.d.ts.map +1 -1
- package/dist/mwl/expression.js +21 -0
- package/dist/mwl/expression.js.map +1 -1
- package/dist/mwl/fengari.d.ts +12 -1
- package/dist/mwl/fengari.d.ts.map +1 -1
- package/dist/mwl/fengari.js +12 -1
- package/dist/mwl/fengari.js.map +1 -1
- package/dist/mwl/grammar.d.ts +45 -1
- package/dist/mwl/grammar.d.ts.map +1 -1
- package/dist/mwl/grammar.js +45 -1
- package/dist/mwl/grammar.js.map +1 -1
- package/dist/mwl/hooks.d.ts +51 -6
- package/dist/mwl/hooks.d.ts.map +1 -1
- package/dist/mwl/hooks.js +45 -1
- package/dist/mwl/hooks.js.map +1 -1
- package/dist/mwl/index.d.ts +9 -3
- package/dist/mwl/index.d.ts.map +1 -1
- package/dist/mwl/index.js +5 -2
- package/dist/mwl/index.js.map +1 -1
- package/dist/mwl/persistence.d.ts +32 -0
- package/dist/mwl/persistence.d.ts.map +1 -1
- package/dist/mwl/persistence.js +32 -0
- package/dist/mwl/persistence.js.map +1 -1
- package/dist/mwl/readers.d.ts +24 -2
- package/dist/mwl/readers.d.ts.map +1 -1
- package/dist/mwl/readers.js +27 -4
- package/dist/mwl/readers.js.map +1 -1
- package/dist/mwl/report.d.ts +21 -2
- package/dist/mwl/report.d.ts.map +1 -1
- package/dist/mwl/report.js +21 -2
- package/dist/mwl/report.js.map +1 -1
- package/dist/mwl/runtime.d.ts +212 -7
- package/dist/mwl/runtime.d.ts.map +1 -1
- package/dist/mwl/runtime.js +682 -90
- package/dist/mwl/runtime.js.map +1 -1
- package/dist/mwl/schema.d.ts +57 -1
- package/dist/mwl/schema.d.ts.map +1 -1
- package/dist/mwl/schema.js +181 -21
- package/dist/mwl/schema.js.map +1 -1
- package/dist/mwl/scripts.d.ts +12 -1
- package/dist/mwl/scripts.d.ts.map +1 -1
- package/dist/mwl/scripts.js +12 -1
- package/dist/mwl/scripts.js.map +1 -1
- package/dist/mwl/utils.d.ts +2 -0
- package/dist/mwl/utils.d.ts.map +1 -1
- package/dist/mwl/utils.js +4 -1
- package/dist/mwl/utils.js.map +1 -1
- package/dist/roguelike/MultiTurnBeam.d.ts +50 -12
- package/dist/roguelike/MultiTurnBeam.d.ts.map +1 -1
- package/dist/roguelike/MultiTurnBeam.js +100 -53
- package/dist/roguelike/MultiTurnBeam.js.map +1 -1
- package/dist/roguelike/Targeting.d.ts +94 -0
- package/dist/roguelike/Targeting.d.ts.map +1 -1
- package/dist/roguelike/Targeting.js +123 -0
- package/dist/roguelike/Targeting.js.map +1 -1
- package/dist/roguelike/index.d.ts +3 -1
- package/dist/roguelike/index.d.ts.map +1 -1
- package/dist/roguelike/index.js +1 -0
- package/dist/roguelike/index.js.map +1 -1
- package/dist/rpg/GameState.d.ts +2 -2
- package/dist/rpg/GameState.js +2 -2
- package/dist/simulation/CampaignSave.d.ts +68 -0
- package/dist/simulation/CampaignSave.d.ts.map +1 -0
- package/dist/simulation/CampaignSave.js +54 -0
- package/dist/simulation/CampaignSave.js.map +1 -0
- package/dist/simulation/EventPresentation.d.ts +111 -0
- package/dist/simulation/EventPresentation.d.ts.map +1 -0
- package/dist/simulation/EventPresentation.js +120 -0
- package/dist/simulation/EventPresentation.js.map +1 -0
- package/dist/simulation/index.d.ts +4 -0
- package/dist/simulation/index.d.ts.map +1 -1
- package/dist/simulation/index.js +2 -0
- package/dist/simulation/index.js.map +1 -1
- package/dist/two-d/pixi-interop.d.ts +18 -6
- package/dist/two-d/pixi-interop.d.ts.map +1 -1
- package/dist/two-d/pixi-interop.js +18 -6
- package/dist/two-d/pixi-interop.js.map +1 -1
- package/dist/two-d/render/AnimatedSprite.d.ts +74 -7
- package/dist/two-d/render/AnimatedSprite.d.ts.map +1 -1
- package/dist/two-d/render/AnimatedSprite.js +88 -26
- package/dist/two-d/render/AnimatedSprite.js.map +1 -1
- package/dist/two-d/render/Camera.d.ts +64 -4
- package/dist/two-d/render/Camera.d.ts.map +1 -1
- package/dist/two-d/render/Camera.js +132 -11
- package/dist/two-d/render/Camera.js.map +1 -1
- package/dist/two-d/render/ColorTransformBatcher.d.ts +7 -1
- package/dist/two-d/render/ColorTransformBatcher.d.ts.map +1 -1
- package/dist/two-d/render/ColorTransformBatcher.js +10 -1
- package/dist/two-d/render/ColorTransformBatcher.js.map +1 -1
- package/dist/two-d/render/Halo.d.ts +58 -0
- package/dist/two-d/render/Halo.d.ts.map +1 -0
- package/dist/two-d/render/Halo.js +48 -0
- package/dist/two-d/render/Halo.js.map +1 -0
- package/dist/two-d/render/ImageModifiers.d.ts +174 -0
- package/dist/two-d/render/ImageModifiers.d.ts.map +1 -1
- package/dist/two-d/render/ImageModifiers.js +454 -1
- package/dist/two-d/render/ImageModifiers.js.map +1 -1
- package/dist/two-d/render/LightningArc.d.ts +57 -0
- package/dist/two-d/render/LightningArc.d.ts.map +1 -0
- package/dist/two-d/render/LightningArc.js +91 -0
- package/dist/two-d/render/LightningArc.js.map +1 -0
- package/dist/two-d/render/PaletteRemap.d.ts +135 -0
- package/dist/two-d/render/PaletteRemap.d.ts.map +1 -0
- package/dist/two-d/render/PaletteRemap.js +181 -0
- package/dist/two-d/render/PaletteRemap.js.map +1 -0
- package/dist/two-d/render/Particles.d.ts +26 -0
- package/dist/two-d/render/Particles.d.ts.map +1 -1
- package/dist/two-d/render/Particles.js +23 -2
- package/dist/two-d/render/Particles.js.map +1 -1
- package/dist/two-d/render/SpriteAttachment.d.ts +55 -0
- package/dist/two-d/render/SpriteAttachment.d.ts.map +1 -0
- package/dist/two-d/render/SpriteAttachment.js +60 -0
- package/dist/two-d/render/SpriteAttachment.js.map +1 -0
- package/dist/two-d/render/TerrainGraphics.d.ts +142 -0
- package/dist/two-d/render/TerrainGraphics.d.ts.map +1 -0
- package/dist/two-d/render/TerrainGraphics.js +161 -0
- package/dist/two-d/render/TerrainGraphics.js.map +1 -0
- package/dist/two-d/render/TerrainGraphicsLayer.d.ts +55 -0
- package/dist/two-d/render/TerrainGraphicsLayer.d.ts.map +1 -0
- package/dist/two-d/render/TerrainGraphicsLayer.js +54 -0
- package/dist/two-d/render/TerrainGraphicsLayer.js.map +1 -0
- package/dist/two-d/render/TintedSprite.js +2 -2
- package/dist/two-d/render/TintedSprite.js.map +1 -1
- package/dist/two-d/render/index.d.ts +15 -3
- package/dist/two-d/render/index.d.ts.map +1 -1
- package/dist/two-d/render/index.js +7 -1
- package/dist/two-d/render/index.js.map +1 -1
- package/dist/two-d/stage/StoryScreen.d.ts +110 -0
- package/dist/two-d/stage/StoryScreen.d.ts.map +1 -0
- package/dist/two-d/stage/StoryScreen.js +178 -0
- package/dist/two-d/stage/StoryScreen.js.map +1 -0
- package/dist/two-d/stage/index.d.ts +2 -0
- package/dist/two-d/stage/index.d.ts.map +1 -1
- package/dist/two-d/stage/index.js +1 -0
- package/dist/two-d/stage/index.js.map +1 -1
- package/dist/two-d/ui/Checkbox.d.ts +44 -0
- package/dist/two-d/ui/Checkbox.d.ts.map +1 -0
- package/dist/two-d/ui/Checkbox.js +89 -0
- package/dist/two-d/ui/Checkbox.js.map +1 -0
- package/dist/two-d/ui/DataTable.d.ts +79 -0
- package/dist/two-d/ui/DataTable.d.ts.map +1 -0
- package/dist/two-d/ui/DataTable.js +164 -0
- package/dist/two-d/ui/DataTable.js.map +1 -0
- package/dist/two-d/ui/Dropdown.d.ts +72 -0
- package/dist/two-d/ui/Dropdown.d.ts.map +1 -0
- package/dist/two-d/ui/Dropdown.js +126 -0
- package/dist/two-d/ui/Dropdown.js.map +1 -0
- package/dist/two-d/ui/FloatingText.d.ts +43 -4
- package/dist/two-d/ui/FloatingText.d.ts.map +1 -1
- package/dist/two-d/ui/FloatingText.js +52 -5
- package/dist/two-d/ui/FloatingText.js.map +1 -1
- package/dist/two-d/ui/FloatingTextStack.d.ts +86 -13
- package/dist/two-d/ui/FloatingTextStack.d.ts.map +1 -1
- package/dist/two-d/ui/FloatingTextStack.js +89 -18
- package/dist/two-d/ui/FloatingTextStack.js.map +1 -1
- package/dist/two-d/ui/Layout.d.ts +105 -0
- package/dist/two-d/ui/Layout.d.ts.map +1 -0
- package/dist/two-d/ui/Layout.js +174 -0
- package/dist/two-d/ui/Layout.js.map +1 -0
- package/dist/two-d/ui/MarkupText.d.ts +53 -0
- package/dist/two-d/ui/MarkupText.d.ts.map +1 -0
- package/dist/two-d/ui/MarkupText.js +122 -0
- package/dist/two-d/ui/MarkupText.js.map +1 -0
- package/dist/two-d/ui/ScrollBox.d.ts +67 -0
- package/dist/two-d/ui/ScrollBox.d.ts.map +1 -0
- package/dist/two-d/ui/ScrollBox.js +127 -0
- package/dist/two-d/ui/ScrollBox.js.map +1 -0
- package/dist/two-d/ui/Skins.d.ts +59 -0
- package/dist/two-d/ui/Skins.d.ts.map +1 -0
- package/dist/two-d/ui/Skins.js +77 -0
- package/dist/two-d/ui/Skins.js.map +1 -0
- package/dist/two-d/ui/Slider.d.ts +91 -0
- package/dist/two-d/ui/Slider.d.ts.map +1 -0
- package/dist/two-d/ui/Slider.js +170 -0
- package/dist/two-d/ui/Slider.js.map +1 -0
- package/dist/two-d/ui/Spinner.d.ts +67 -0
- package/dist/two-d/ui/Spinner.d.ts.map +1 -0
- package/dist/two-d/ui/Spinner.js +137 -0
- package/dist/two-d/ui/Spinner.js.map +1 -0
- package/dist/two-d/ui/TabbedList.d.ts +118 -0
- package/dist/two-d/ui/TabbedList.d.ts.map +1 -0
- package/dist/two-d/ui/TabbedList.js +221 -0
- package/dist/two-d/ui/TabbedList.js.map +1 -0
- package/dist/two-d/ui/TextModel.d.ts +65 -0
- package/dist/two-d/ui/TextModel.d.ts.map +1 -0
- package/dist/two-d/ui/TextModel.js +126 -0
- package/dist/two-d/ui/TextModel.js.map +1 -0
- package/dist/two-d/ui/TreeView.d.ts +68 -0
- package/dist/two-d/ui/TreeView.d.ts.map +1 -0
- package/dist/two-d/ui/TreeView.js +133 -0
- package/dist/two-d/ui/TreeView.js.map +1 -0
- package/dist/two-d/ui/Window.d.ts +13 -0
- package/dist/two-d/ui/Window.d.ts.map +1 -1
- package/dist/two-d/ui/Window.js +23 -0
- package/dist/two-d/ui/Window.js.map +1 -1
- package/dist/two-d/ui/WindowStack.d.ts.map +1 -1
- package/dist/two-d/ui/WindowStack.js +2 -0
- package/dist/two-d/ui/WindowStack.js.map +1 -1
- package/dist/two-d/ui/index.d.ts +29 -3
- package/dist/two-d/ui/index.d.ts.map +1 -1
- package/dist/two-d/ui/index.js +15 -2
- package/dist/two-d/ui/index.js.map +1 -1
- package/dist/two-d/ui/markup.d.ts +181 -0
- package/dist/two-d/ui/markup.d.ts.map +1 -0
- package/dist/two-d/ui/markup.js +370 -0
- package/dist/two-d/ui/markup.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/world/SideTurns.d.ts +115 -0
- package/dist/world/SideTurns.d.ts.map +1 -0
- package/dist/world/SideTurns.js +138 -0
- package/dist/world/SideTurns.js.map +1 -0
- package/dist/world/index.d.ts +2 -0
- package/dist/world/index.d.ts.map +1 -1
- package/dist/world/index.js +1 -0
- package/dist/world/index.js.map +1 -1
- package/package.json +2 -1
package/dist/core/Random.d.ts
CHANGED
|
@@ -94,4 +94,97 @@ export declare function weighted(weights: readonly number[]): number | null;
|
|
|
94
94
|
export declare function weightedKey<K>(weights: ReadonlyMap<K, number>): K | null;
|
|
95
95
|
/** Fisher-Yates, in place */
|
|
96
96
|
export declare function shuffle<T>(items: T[]): T[];
|
|
97
|
+
/** the engine state a `MersenneTwister` save or a named stream resumes from */
|
|
98
|
+
export interface MersenneTwisterState {
|
|
99
|
+
/** the value `seed()` was last given */
|
|
100
|
+
seed: number;
|
|
101
|
+
/** the 624 words of engine state */
|
|
102
|
+
state: number[];
|
|
103
|
+
/** how many words have been drawn from the current block */
|
|
104
|
+
index: number;
|
|
105
|
+
/** how many values have been produced since the last seed, `mt_rng.get_discard()`'s number */
|
|
106
|
+
discard: number;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* MT19937, the Mersenne Twister the reference strategy game's `mt_rng` wraps, with the same
|
|
110
|
+
* `seed`/`discard` bookkeeping its save files use. The engine itself is exactly specified
|
|
111
|
+
* (the paper's constants and the 32-bit seeding routine), so `nextUint32` matches that
|
|
112
|
+
* engine bit for bit on any machine; a port that consumes the raw stream, or a replay of raw
|
|
113
|
+
* draws, lines up.
|
|
114
|
+
*
|
|
115
|
+
* What is *not* portable is C++'s `std::uniform_int_distribution`, which the reference then
|
|
116
|
+
* runs the engine through: the C++ standard leaves that mapping implementation-defined, so
|
|
117
|
+
* two standard libraries do not agree on it. `int` here is the same unbiased rejection
|
|
118
|
+
* `Generator` uses, which makes a replay deterministic within this framework rather than
|
|
119
|
+
* bit-identical to any one C++ standard library.
|
|
120
|
+
*
|
|
121
|
+
* @example
|
|
122
|
+
* ```ts
|
|
123
|
+
* import { MersenneTwister } from '@datamoc/mw_games/core';
|
|
124
|
+
*
|
|
125
|
+
* const rng = new MersenneTwister(5489);
|
|
126
|
+
* const first = rng.nextUint32(); // 3499211612, the engine's own first value for this seed
|
|
127
|
+
* rng.discard(10); // skip ahead without consuming the values
|
|
128
|
+
* const saved = rng.getState(); // { seed, state, index, discard } - restorable
|
|
129
|
+
* ```
|
|
130
|
+
*/
|
|
131
|
+
export declare class MersenneTwister {
|
|
132
|
+
private state;
|
|
133
|
+
private index;
|
|
134
|
+
private seedValue;
|
|
135
|
+
private produced;
|
|
136
|
+
constructor(seed?: number);
|
|
137
|
+
/** re-seeds the engine and resets the discard count, as `mt_rng::seed` does */
|
|
138
|
+
seed(seed: number): void;
|
|
139
|
+
private generate;
|
|
140
|
+
/** the raw generator, tempered as MT19937 specifies */
|
|
141
|
+
nextUint32(): number;
|
|
142
|
+
/** a float in [0, 1), with 32 bits of resolution */
|
|
143
|
+
float(): number;
|
|
144
|
+
/** an integer in [0, bound), without modulo bias (the same rule `Generator.int` uses) */
|
|
145
|
+
int(bound: number): number;
|
|
146
|
+
/** advances the engine without using the values, as `mt_rng::discard` does */
|
|
147
|
+
discard(count: number): void;
|
|
148
|
+
/** how many values have been produced since the last seed - `get_discard()`'s number */
|
|
149
|
+
get discardCount(): number;
|
|
150
|
+
getState(): MersenneTwisterState;
|
|
151
|
+
setState(state: MersenneTwisterState): void;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Named, independent random streams over one base seed: `streams.stream('loot')` and
|
|
155
|
+
* `streams.stream('ai:goblin-3')` each get their own MT19937 position, so one consumer
|
|
156
|
+
* drawing more numbers never shifts another's results - the property a replay and a
|
|
157
|
+
* per-entity stream both need, and one a single shared generator cannot give.
|
|
158
|
+
*
|
|
159
|
+
* A stream is created on first use, from `baseSeed ^ FNV-1a(name)`, and then kept. Creating
|
|
160
|
+
* a stream later therefore does not disturb an existing one, which is what makes adding a
|
|
161
|
+
* new consumer reproducible rather than a change to every draw after it.
|
|
162
|
+
*
|
|
163
|
+
* @example
|
|
164
|
+
* ```ts
|
|
165
|
+
* import { RandomStreams } from '@datamoc/mw_games/core';
|
|
166
|
+
*
|
|
167
|
+
* const streams = new RandomStreams(12345);
|
|
168
|
+
* streams.stream('loot').int(100); // one stream
|
|
169
|
+
* streams.stream('ai:goblin-3').int(6); // an unrelated one, unaffected by the loot draw
|
|
170
|
+
*
|
|
171
|
+
* const saved = streams.getState(); // every stream's engine state, for a save file
|
|
172
|
+
* ```
|
|
173
|
+
*/
|
|
174
|
+
export declare class RandomStreams {
|
|
175
|
+
private baseSeed;
|
|
176
|
+
private streams;
|
|
177
|
+
constructor(seed?: number);
|
|
178
|
+
/** the stream named `name`, created from the base seed on first use and kept after that */
|
|
179
|
+
stream(name: string): MersenneTwister;
|
|
180
|
+
/** the seed a stream was created from; undefined for one that has never been asked for */
|
|
181
|
+
seedOf(name: string): number | undefined;
|
|
182
|
+
/** drops every stream and re-bases future ones; existing streams are gone, not reset */
|
|
183
|
+
reseed(seed: number): void;
|
|
184
|
+
/** the names that have been asked for, in creation order */
|
|
185
|
+
names(): string[];
|
|
186
|
+
getState(): Record<string, MersenneTwisterState>;
|
|
187
|
+
/** restores what `getState` wrote; a stream missing from `state` stays as it was */
|
|
188
|
+
setState(state: Readonly<Record<string, MersenneTwisterState>>): void;
|
|
189
|
+
}
|
|
97
190
|
//# sourceMappingURL=Random.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Random.d.ts","sourceRoot":"","sources":["../../src/core/Random.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAcH;;;;;;;;;;;;GAYG;AACH,qBAAa,SAAS;IACrB,OAAO,CAAC,EAAE,CAAK;IACf,OAAO,CAAC,EAAE,CAAK;IACf,OAAO,CAAC,EAAE,CAAK;IACf,OAAO,CAAC,EAAE,CAAK;IAEf,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,YAAY,IAAI,CAAC,EAAE,MAAM,EAcxB;IAED,yEAAyE;IACzE,UAAU,IAAI,MAAM,CAanB;IAED,oDAAoD;IACpD,KAAK,IAAI,MAAM,CAEd;IAED;;;;;OAKG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CASzB;IAED,8EAA8E;IAC9E,QAAQ,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAE3C;IAED,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAE/D;CACD;AAUD,iEAAiE;AACjE,wBAAgB,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAI7C;AAED,wBAAgB,GAAG,IAAI,IAAI,CAK1B;AAED,4EAA4E;AAC5E,wBAAgB,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAO1D;AAED,wBAAgB,KAAK,IAAI,IAAI,CAG5B;AAED,oDAAoD;AACpD,wBAAgB,KAAK,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAIxD;AAED,4CAA4C;AAC5C,wBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAGrD;AAED,8EAA8E;AAC9E,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,wBAAgB,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;;;;;;GAOG;AAEH,oDAAoD;AACpD,wBAAgB,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,GAAG,IAAI,CAExD;AAED,8FAA8F;AAC9F,wBAAgB,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAWlE;AAED,mGAAmG;AACnG,wBAAgB,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAIxE;AAED,6BAA6B;AAC7B,wBAAgB,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAM1C"}
|
|
1
|
+
{"version":3,"file":"Random.d.ts","sourceRoot":"","sources":["../../src/core/Random.ts"],"names":[],"mappings":"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"}
|
package/dist/core/Random.js
CHANGED
|
@@ -208,4 +208,181 @@ export function shuffle(items) {
|
|
|
208
208
|
}
|
|
209
209
|
return items;
|
|
210
210
|
}
|
|
211
|
+
const MT_N = 624;
|
|
212
|
+
const MT_M = 397;
|
|
213
|
+
const MT_MATRIX_A = 0x9908b0df;
|
|
214
|
+
const MT_UPPER_MASK = 0x80000000;
|
|
215
|
+
const MT_LOWER_MASK = 0x7fffffff;
|
|
216
|
+
/**
|
|
217
|
+
* MT19937, the Mersenne Twister the reference strategy game's `mt_rng` wraps, with the same
|
|
218
|
+
* `seed`/`discard` bookkeeping its save files use. The engine itself is exactly specified
|
|
219
|
+
* (the paper's constants and the 32-bit seeding routine), so `nextUint32` matches that
|
|
220
|
+
* engine bit for bit on any machine; a port that consumes the raw stream, or a replay of raw
|
|
221
|
+
* draws, lines up.
|
|
222
|
+
*
|
|
223
|
+
* What is *not* portable is C++'s `std::uniform_int_distribution`, which the reference then
|
|
224
|
+
* runs the engine through: the C++ standard leaves that mapping implementation-defined, so
|
|
225
|
+
* two standard libraries do not agree on it. `int` here is the same unbiased rejection
|
|
226
|
+
* `Generator` uses, which makes a replay deterministic within this framework rather than
|
|
227
|
+
* bit-identical to any one C++ standard library.
|
|
228
|
+
*
|
|
229
|
+
* @example
|
|
230
|
+
* ```ts
|
|
231
|
+
* import { MersenneTwister } from '@datamoc/mw_games/core';
|
|
232
|
+
*
|
|
233
|
+
* const rng = new MersenneTwister(5489);
|
|
234
|
+
* const first = rng.nextUint32(); // 3499211612, the engine's own first value for this seed
|
|
235
|
+
* rng.discard(10); // skip ahead without consuming the values
|
|
236
|
+
* const saved = rng.getState(); // { seed, state, index, discard } - restorable
|
|
237
|
+
* ```
|
|
238
|
+
*/
|
|
239
|
+
export class MersenneTwister {
|
|
240
|
+
constructor(seed = 5489) {
|
|
241
|
+
this.state = new Uint32Array(MT_N);
|
|
242
|
+
this.index = MT_N;
|
|
243
|
+
this.seedValue = 5489;
|
|
244
|
+
this.produced = 0;
|
|
245
|
+
this.seed(seed);
|
|
246
|
+
}
|
|
247
|
+
/** re-seeds the engine and resets the discard count, as `mt_rng::seed` does */
|
|
248
|
+
seed(seed) {
|
|
249
|
+
this.seedValue = seed >>> 0;
|
|
250
|
+
this.state[0] = this.seedValue;
|
|
251
|
+
for (let i = 1; i < MT_N; i++) {
|
|
252
|
+
const previous = this.state[i - 1] ^ (this.state[i - 1] >>> 30);
|
|
253
|
+
this.state[i] = (Math.imul(1812433253, previous) + i) >>> 0;
|
|
254
|
+
}
|
|
255
|
+
this.index = MT_N;
|
|
256
|
+
this.produced = 0;
|
|
257
|
+
}
|
|
258
|
+
generate() {
|
|
259
|
+
for (let i = 0; i < MT_N; i++) {
|
|
260
|
+
const y = (this.state[i] & MT_UPPER_MASK) | (this.state[(i + 1) % MT_N] & MT_LOWER_MASK);
|
|
261
|
+
let value = this.state[(i + MT_M) % MT_N] ^ (y >>> 1);
|
|
262
|
+
if (y & 1)
|
|
263
|
+
value ^= MT_MATRIX_A;
|
|
264
|
+
this.state[i] = value >>> 0;
|
|
265
|
+
}
|
|
266
|
+
this.index = 0;
|
|
267
|
+
}
|
|
268
|
+
/** the raw generator, tempered as MT19937 specifies */
|
|
269
|
+
nextUint32() {
|
|
270
|
+
if (this.index >= MT_N)
|
|
271
|
+
this.generate();
|
|
272
|
+
let y = this.state[this.index++];
|
|
273
|
+
y ^= y >>> 11;
|
|
274
|
+
y ^= (y << 7) & 0x9d2c5680;
|
|
275
|
+
y ^= (y << 15) & 0xefc60000;
|
|
276
|
+
y ^= y >>> 18;
|
|
277
|
+
this.produced++;
|
|
278
|
+
return y >>> 0;
|
|
279
|
+
}
|
|
280
|
+
/** a float in [0, 1), with 32 bits of resolution */
|
|
281
|
+
float() {
|
|
282
|
+
return this.nextUint32() / 0x100000000;
|
|
283
|
+
}
|
|
284
|
+
/** an integer in [0, bound), without modulo bias (the same rule `Generator.int` uses) */
|
|
285
|
+
int(bound) {
|
|
286
|
+
if (bound <= 0)
|
|
287
|
+
return 0;
|
|
288
|
+
const limit = 0x100000000 - (0x100000000 % bound);
|
|
289
|
+
let value = this.nextUint32();
|
|
290
|
+
while (value >= limit) {
|
|
291
|
+
value = this.nextUint32();
|
|
292
|
+
}
|
|
293
|
+
return value % bound;
|
|
294
|
+
}
|
|
295
|
+
/** advances the engine without using the values, as `mt_rng::discard` does */
|
|
296
|
+
discard(count) {
|
|
297
|
+
for (let i = 0; i < count; i++)
|
|
298
|
+
this.nextUint32();
|
|
299
|
+
}
|
|
300
|
+
/** how many values have been produced since the last seed - `get_discard()`'s number */
|
|
301
|
+
get discardCount() {
|
|
302
|
+
return this.produced;
|
|
303
|
+
}
|
|
304
|
+
getState() {
|
|
305
|
+
return { seed: this.seedValue, state: [...this.state], index: this.index, discard: this.produced };
|
|
306
|
+
}
|
|
307
|
+
setState(state) {
|
|
308
|
+
this.seedValue = state.seed >>> 0;
|
|
309
|
+
for (let i = 0; i < MT_N; i++)
|
|
310
|
+
this.state[i] = (state.state[i] ?? 0) >>> 0;
|
|
311
|
+
this.index = state.index;
|
|
312
|
+
this.produced = state.discard;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
/** FNV-1a over a stream name, so a name deterministically derives its own seed */
|
|
316
|
+
function fnv1a(text) {
|
|
317
|
+
let hash = 0x811c9dc5;
|
|
318
|
+
for (let i = 0; i < text.length; i++) {
|
|
319
|
+
hash ^= text.charCodeAt(i);
|
|
320
|
+
hash = Math.imul(hash, 0x01000193) >>> 0;
|
|
321
|
+
}
|
|
322
|
+
return hash >>> 0;
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Named, independent random streams over one base seed: `streams.stream('loot')` and
|
|
326
|
+
* `streams.stream('ai:goblin-3')` each get their own MT19937 position, so one consumer
|
|
327
|
+
* drawing more numbers never shifts another's results - the property a replay and a
|
|
328
|
+
* per-entity stream both need, and one a single shared generator cannot give.
|
|
329
|
+
*
|
|
330
|
+
* A stream is created on first use, from `baseSeed ^ FNV-1a(name)`, and then kept. Creating
|
|
331
|
+
* a stream later therefore does not disturb an existing one, which is what makes adding a
|
|
332
|
+
* new consumer reproducible rather than a change to every draw after it.
|
|
333
|
+
*
|
|
334
|
+
* @example
|
|
335
|
+
* ```ts
|
|
336
|
+
* import { RandomStreams } from '@datamoc/mw_games/core';
|
|
337
|
+
*
|
|
338
|
+
* const streams = new RandomStreams(12345);
|
|
339
|
+
* streams.stream('loot').int(100); // one stream
|
|
340
|
+
* streams.stream('ai:goblin-3').int(6); // an unrelated one, unaffected by the loot draw
|
|
341
|
+
*
|
|
342
|
+
* const saved = streams.getState(); // every stream's engine state, for a save file
|
|
343
|
+
* ```
|
|
344
|
+
*/
|
|
345
|
+
export class RandomStreams {
|
|
346
|
+
constructor(seed = 0) {
|
|
347
|
+
this.streams = new Map();
|
|
348
|
+
this.baseSeed = seed >>> 0;
|
|
349
|
+
}
|
|
350
|
+
/** the stream named `name`, created from the base seed on first use and kept after that */
|
|
351
|
+
stream(name) {
|
|
352
|
+
let entry = this.streams.get(name);
|
|
353
|
+
if (!entry) {
|
|
354
|
+
const seed = (this.baseSeed ^ fnv1a(name)) >>> 0;
|
|
355
|
+
entry = { seed, engine: new MersenneTwister(seed) };
|
|
356
|
+
this.streams.set(name, entry);
|
|
357
|
+
}
|
|
358
|
+
return entry.engine;
|
|
359
|
+
}
|
|
360
|
+
/** the seed a stream was created from; undefined for one that has never been asked for */
|
|
361
|
+
seedOf(name) {
|
|
362
|
+
return this.streams.get(name)?.seed;
|
|
363
|
+
}
|
|
364
|
+
/** drops every stream and re-bases future ones; existing streams are gone, not reset */
|
|
365
|
+
reseed(seed) {
|
|
366
|
+
this.baseSeed = seed >>> 0;
|
|
367
|
+
this.streams.clear();
|
|
368
|
+
}
|
|
369
|
+
/** the names that have been asked for, in creation order */
|
|
370
|
+
names() {
|
|
371
|
+
return [...this.streams.keys()];
|
|
372
|
+
}
|
|
373
|
+
getState() {
|
|
374
|
+
const out = {};
|
|
375
|
+
for (const [name, entry] of this.streams)
|
|
376
|
+
out[name] = entry.engine.getState();
|
|
377
|
+
return out;
|
|
378
|
+
}
|
|
379
|
+
/** restores what `getState` wrote; a stream missing from `state` stays as it was */
|
|
380
|
+
setState(state) {
|
|
381
|
+
for (const [name, saved] of Object.entries(state)) {
|
|
382
|
+
const engine = new MersenneTwister(saved.seed);
|
|
383
|
+
engine.setState(saved);
|
|
384
|
+
this.streams.set(name, { seed: saved.seed, engine });
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
}
|
|
211
388
|
//# sourceMappingURL=Random.js.map
|
package/dist/core/Random.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Random.js","sourceRoot":"","sources":["../../src/core/Random.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Random.js","sourceRoot":"","sources":["../../src/core/Random.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Out-of-sync detection for lockstep play: a deterministic checksum of JSON-serialisable state,
|
|
3
|
+
* and a guard that compares the checksums peers compute for the same tick. `LockstepClient` moves
|
|
4
|
+
* inputs between peers; this is how a game notices that the same inputs produced different state
|
|
5
|
+
* on two of them, which lockstep cannot otherwise see - it never compares state, only inputs.
|
|
6
|
+
*
|
|
7
|
+
* A checksum is not security: it is a fast, stable hash that catches a divergence, not one that
|
|
8
|
+
* resists an attacker. Its one real requirement is determinism across machines, so object keys are
|
|
9
|
+
* sorted and the encoding is fixed rather than left to `JSON.stringify`'s engine-defined key order.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* A 32-bit FNV-1a checksum of a state value, stable across machines and across property order.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```ts
|
|
16
|
+
* import { stateChecksum } from '@datamoc/mw_games/core';
|
|
17
|
+
*
|
|
18
|
+
* // same state, whatever order the keys happen to be in
|
|
19
|
+
* stateChecksum({ hp: 7, x: 2 }) === stateChecksum({ x: 2, hp: 7 }); // true
|
|
20
|
+
* stateChecksum({ hp: 7 }) === stateChecksum({ hp: 6 }); // false
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export declare function stateChecksum(value: unknown): number;
|
|
24
|
+
/**
|
|
25
|
+
* Compares the checksum peers compute for each tick. The first checksum seen for a tick is taken
|
|
26
|
+
* as the reference; a later observation of the same tick that disagrees marks the run divergent and
|
|
27
|
+
* is remembered as the first such tick, so a game can report exactly where the two peers parted.
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```ts
|
|
31
|
+
* import { SyncGuard, stateChecksum } from '@datamoc/mw_games/core';
|
|
32
|
+
*
|
|
33
|
+
* const localState = { hp: 7 };
|
|
34
|
+
* const remoteState = { hp: 6 };
|
|
35
|
+
*
|
|
36
|
+
* const guard = new SyncGuard();
|
|
37
|
+
* guard.observe(12, stateChecksum(localState)); // true
|
|
38
|
+
* guard.observe(12, stateChecksum(remoteState)); // false if the two peers disagree
|
|
39
|
+
* if (guard.divergent) console.log('desync at tick', guard.atTick);
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export declare class SyncGuard {
|
|
43
|
+
private readonly reference;
|
|
44
|
+
private desyncTick;
|
|
45
|
+
/**
|
|
46
|
+
* Records `checksum` for `tick`; true when it matches the tick's reference (or is the first
|
|
47
|
+
* one), false on the first disagreement, which is then remembered.
|
|
48
|
+
*/
|
|
49
|
+
observe(tick: number, checksum: number): boolean;
|
|
50
|
+
/** true once any tick has disagreed */
|
|
51
|
+
get divergent(): boolean;
|
|
52
|
+
/** the first tick that disagreed, or null while the run is in sync */
|
|
53
|
+
get atTick(): number | null;
|
|
54
|
+
/** forgets every observation, for a new run */
|
|
55
|
+
reset(): void;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=SyncGuard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SyncGuard.d.ts","sourceRoot":"","sources":["../../src/core/SyncGuard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAmCH;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAQpD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,SAAS;IACrB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6B;IACvD,OAAO,CAAC,UAAU,CAAuB;IAEzC;;;OAGG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAS/C;IAED,uCAAuC;IACvC,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,sEAAsE;IACtE,IAAI,MAAM,IAAI,MAAM,GAAG,IAAI,CAE1B;IAED,+CAA+C;IAC/C,KAAK,IAAI,IAAI,CAGZ;CACD"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Out-of-sync detection for lockstep play: a deterministic checksum of JSON-serialisable state,
|
|
3
|
+
* and a guard that compares the checksums peers compute for the same tick. `LockstepClient` moves
|
|
4
|
+
* inputs between peers; this is how a game notices that the same inputs produced different state
|
|
5
|
+
* on two of them, which lockstep cannot otherwise see - it never compares state, only inputs.
|
|
6
|
+
*
|
|
7
|
+
* A checksum is not security: it is a fast, stable hash that catches a divergence, not one that
|
|
8
|
+
* resists an attacker. Its one real requirement is determinism across machines, so object keys are
|
|
9
|
+
* sorted and the encoding is fixed rather than left to `JSON.stringify`'s engine-defined key order.
|
|
10
|
+
*/
|
|
11
|
+
const FNV_OFFSET = 0x811c9dc5;
|
|
12
|
+
const FNV_PRIME = 0x01000193;
|
|
13
|
+
/**
|
|
14
|
+
* A stable string encoding of a JSON-serialisable value, with object keys sorted so two
|
|
15
|
+
* structurally equal values always encode identically regardless of insertion order. Values JSON
|
|
16
|
+
* itself has no representation for (`undefined`, functions, symbols, `NaN`, infinities) follow
|
|
17
|
+
* JSON's own rules: an object entry with one is omitted, an array element becomes `null`.
|
|
18
|
+
*/
|
|
19
|
+
function canonical(value, inArray = false) {
|
|
20
|
+
if (value === null || value === undefined)
|
|
21
|
+
return 'null';
|
|
22
|
+
switch (typeof value) {
|
|
23
|
+
case 'boolean':
|
|
24
|
+
return value ? 'true' : 'false';
|
|
25
|
+
case 'number':
|
|
26
|
+
return Number.isFinite(value) ? String(value) : 'null';
|
|
27
|
+
case 'string':
|
|
28
|
+
return JSON.stringify(value);
|
|
29
|
+
case 'bigint':
|
|
30
|
+
return JSON.stringify(value.toString());
|
|
31
|
+
case 'function':
|
|
32
|
+
case 'symbol':
|
|
33
|
+
return inArray ? 'null' : 'undefined';
|
|
34
|
+
}
|
|
35
|
+
if (Array.isArray(value))
|
|
36
|
+
return `[${value.map((entry) => canonical(entry, true)).join(',')}]`;
|
|
37
|
+
const entries = Object.entries(value)
|
|
38
|
+
.filter(([, entry]) => entry !== undefined && typeof entry !== 'function' && typeof entry !== 'symbol')
|
|
39
|
+
.sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0));
|
|
40
|
+
return `{${entries.map(([key, entry]) => `${JSON.stringify(key)}:${canonical(entry)}`).join(',')}}`;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* A 32-bit FNV-1a checksum of a state value, stable across machines and across property order.
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* ```ts
|
|
47
|
+
* import { stateChecksum } from '@datamoc/mw_games/core';
|
|
48
|
+
*
|
|
49
|
+
* // same state, whatever order the keys happen to be in
|
|
50
|
+
* stateChecksum({ hp: 7, x: 2 }) === stateChecksum({ x: 2, hp: 7 }); // true
|
|
51
|
+
* stateChecksum({ hp: 7 }) === stateChecksum({ hp: 6 }); // false
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
export function stateChecksum(value) {
|
|
55
|
+
const text = canonical(value);
|
|
56
|
+
let hash = FNV_OFFSET;
|
|
57
|
+
for (let i = 0; i < text.length; i++) {
|
|
58
|
+
hash ^= text.charCodeAt(i);
|
|
59
|
+
hash = Math.imul(hash, FNV_PRIME) >>> 0;
|
|
60
|
+
}
|
|
61
|
+
return hash >>> 0;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Compares the checksum peers compute for each tick. The first checksum seen for a tick is taken
|
|
65
|
+
* as the reference; a later observation of the same tick that disagrees marks the run divergent and
|
|
66
|
+
* is remembered as the first such tick, so a game can report exactly where the two peers parted.
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* ```ts
|
|
70
|
+
* import { SyncGuard, stateChecksum } from '@datamoc/mw_games/core';
|
|
71
|
+
*
|
|
72
|
+
* const localState = { hp: 7 };
|
|
73
|
+
* const remoteState = { hp: 6 };
|
|
74
|
+
*
|
|
75
|
+
* const guard = new SyncGuard();
|
|
76
|
+
* guard.observe(12, stateChecksum(localState)); // true
|
|
77
|
+
* guard.observe(12, stateChecksum(remoteState)); // false if the two peers disagree
|
|
78
|
+
* if (guard.divergent) console.log('desync at tick', guard.atTick);
|
|
79
|
+
* ```
|
|
80
|
+
*/
|
|
81
|
+
export class SyncGuard {
|
|
82
|
+
constructor() {
|
|
83
|
+
this.reference = new Map();
|
|
84
|
+
this.desyncTick = null;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Records `checksum` for `tick`; true when it matches the tick's reference (or is the first
|
|
88
|
+
* one), false on the first disagreement, which is then remembered.
|
|
89
|
+
*/
|
|
90
|
+
observe(tick, checksum) {
|
|
91
|
+
const expected = this.reference.get(tick);
|
|
92
|
+
if (expected === undefined) {
|
|
93
|
+
this.reference.set(tick, checksum);
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
if (expected === checksum)
|
|
97
|
+
return true;
|
|
98
|
+
if (this.desyncTick === null)
|
|
99
|
+
this.desyncTick = tick;
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
/** true once any tick has disagreed */
|
|
103
|
+
get divergent() {
|
|
104
|
+
return this.desyncTick !== null;
|
|
105
|
+
}
|
|
106
|
+
/** the first tick that disagreed, or null while the run is in sync */
|
|
107
|
+
get atTick() {
|
|
108
|
+
return this.desyncTick;
|
|
109
|
+
}
|
|
110
|
+
/** forgets every observation, for a new run */
|
|
111
|
+
reset() {
|
|
112
|
+
this.reference.clear();
|
|
113
|
+
this.desyncTick = null;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=SyncGuard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SyncGuard.js","sourceRoot":"","sources":["../../src/core/SyncGuard.ts"],"names":[],"mappings":"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"}
|
package/dist/core/index.d.ts
CHANGED
|
@@ -14,7 +14,8 @@ export * as Random from './Random.ts';
|
|
|
14
14
|
export * as Input from './Input.ts';
|
|
15
15
|
export { PlayerInput } from './PlayerInput.ts';
|
|
16
16
|
export type { PlayerInputOptions } from './PlayerInput.ts';
|
|
17
|
-
export { Generator } from './Random.ts';
|
|
17
|
+
export { Generator, MersenneTwister, RandomStreams } from './Random.ts';
|
|
18
|
+
export type { MersenneTwisterState } from './Random.ts';
|
|
18
19
|
export { SaveSystem } from './Save.ts';
|
|
19
20
|
export type { SaveMeta, SaveData, SaveStorage, SaveSystemOptions } from './Save.ts';
|
|
20
21
|
export { StateRegistry } from './State.ts';
|
|
@@ -68,6 +69,7 @@ export { EntityRegistry } from './Entity.ts';
|
|
|
68
69
|
export type { EntityId } from './Entity.ts';
|
|
69
70
|
export { PresentationQueue } from './Presentation.ts';
|
|
70
71
|
export type { PresentationQueueOptions } from './Presentation.ts';
|
|
72
|
+
export { SyncGuard, stateChecksum } from './SyncGuard.ts';
|
|
71
73
|
export { parseCSV } from './Csv.ts';
|
|
72
74
|
export type { CsvOptions, CsvColumnType } from './Csv.ts';
|
|
73
75
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/core/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAClE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,YAAY,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACvC,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,YAAY,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"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"}
|
package/dist/core/index.js
CHANGED
|
@@ -8,7 +8,7 @@ export { HookRegistry } from './Hooks.js';
|
|
|
8
8
|
export * as Random from './Random.js';
|
|
9
9
|
export * as Input from './Input.js';
|
|
10
10
|
export { PlayerInput } from './PlayerInput.js';
|
|
11
|
-
export { Generator } from './Random.js';
|
|
11
|
+
export { Generator, MersenneTwister, RandomStreams } from './Random.js';
|
|
12
12
|
export { SaveSystem } from './Save.js';
|
|
13
13
|
export { StateRegistry } from './State.js';
|
|
14
14
|
export { scramble, unscramble } from './Scramble.js';
|
|
@@ -36,5 +36,6 @@ export { weightedFlood } from './Pathfinding.js';
|
|
|
36
36
|
export { LoadQueue } from './Loading.js';
|
|
37
37
|
export { EntityRegistry } from './Entity.js';
|
|
38
38
|
export { PresentationQueue } from './Presentation.js';
|
|
39
|
+
export { SyncGuard, stateChecksum } from './SyncGuard.js';
|
|
39
40
|
export { parseCSV } from './Csv.js';
|
|
40
41
|
//# sourceMappingURL=index.js.map
|
package/dist/core/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG1C,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG1C,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAExE,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG/C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG7C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGzC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAExD,OAAO,EAAE,SAAS,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEzG,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEnF,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG/C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEhG,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,aAAa,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAExH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAE7C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { Catalog, Direction } from './index.ts';
|
|
2
|
+
export interface PoOptions {
|
|
3
|
+
/** override the direction `parsePo` infers from the locale */
|
|
4
|
+
direction?: Direction;
|
|
5
|
+
/**
|
|
6
|
+
* The gettext domain this catalog is. `'messages'` (the default) leaves keys bare, the
|
|
7
|
+
* way gettext's default domain does; any other domain prefixes every key with
|
|
8
|
+
* `domain:`, so a game can load several `.po` files into one catalog without a shared
|
|
9
|
+
* `msgid` colliding.
|
|
10
|
+
*/
|
|
11
|
+
domain?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Parses the useful, dependency-free subset of a gettext `.po` file into an `i18n`
|
|
15
|
+
* `Catalog`: `msgid`/`msgstr`, `msgctxt`, `msgid_plural` with `msgstr[N]`, and the header
|
|
16
|
+
* entry, which is read and dropped. Comments and flags are ignored.
|
|
17
|
+
*
|
|
18
|
+
* Gettext's plural forms are positions (`msgstr[0]`, `msgstr[1]`), while a `Catalog` keys
|
|
19
|
+
* them by CLDR category (what `Intl.PluralRules.select` returns). The two agree on order for
|
|
20
|
+
* a CLDR-ordered catalog - English's two forms are one/other and Arabic's six are
|
|
21
|
+
* zero/one/two/few/many/other - so form `N` maps to the Nth category the locale declares. A
|
|
22
|
+
* catalog with more forms than its locale declares throws rather than silently mislabelling
|
|
23
|
+
* one.
|
|
24
|
+
*
|
|
25
|
+
* An entry with an empty translation is left out, which is what gettext means by
|
|
26
|
+
* "untranslated" and what lets `t()` fall back to the base language. A `msgid` carries no
|
|
27
|
+
* placeholder syntax of its own here: write the catalog's own `{token}` form in the `.po`,
|
|
28
|
+
* or run the strings through `FormatSpec` separately.
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```ts
|
|
32
|
+
* import { parsePo, setBase, setActive, t } from '@datamoc/mw_games/i18n';
|
|
33
|
+
*
|
|
34
|
+
* const po = [
|
|
35
|
+
* 'msgid "greeting"',
|
|
36
|
+
* 'msgstr "Bonjour, {name} !"',
|
|
37
|
+
* '',
|
|
38
|
+
* 'msgid "apple"',
|
|
39
|
+
* 'msgid_plural "{n} apples"',
|
|
40
|
+
* 'msgstr[0] "une pomme"',
|
|
41
|
+
* 'msgstr[1] "{n} pommes"',
|
|
42
|
+
* ].join('\n');
|
|
43
|
+
*
|
|
44
|
+
* setBase({ locale: 'en', direction: 'ltr', messages: { greeting: 'Hello, {name}!' } });
|
|
45
|
+
* setActive(parsePo('fr', po));
|
|
46
|
+
* console.log(t('greeting', { name: 'Ada' })); // 'Bonjour, Ada !'
|
|
47
|
+
* console.log(t('apple', { count: 3, n: 3 })); // '{n} pommes'
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
export declare function parsePo(locale: string, source: string, options?: PoOptions): Catalog;
|
|
51
|
+
//# sourceMappingURL=Po.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Po.d.ts","sourceRoot":"","sources":["../../src/i18n/Po.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAe,MAAM,YAAY,CAAC;AAElE,MAAM,WAAW,SAAS;IACzB,8DAA8D;IAC9D,SAAS,CAAC,EAAE,SAAS,CAAC;IAEtB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,SAAc,GAAG,OAAO,CAoGxF"}
|