@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
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { Container, Texture } from 'pixi.js';
|
|
2
|
+
import { Signal } from '../../core/Signal.ts';
|
|
3
|
+
/** One full-screen story beat: a backdrop image, a title, the text, and the music under it. */
|
|
4
|
+
export interface StoryBeat {
|
|
5
|
+
text: string;
|
|
6
|
+
title?: string;
|
|
7
|
+
/** the backdrop image path, resolved by the screen's `textureFor` */
|
|
8
|
+
image?: string;
|
|
9
|
+
/** the music track to play while this beat is up */
|
|
10
|
+
music?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* The beats of a story screen and where the reader is in them, with no renderer attached - the
|
|
14
|
+
* same split `TabbedList` keeps, so the advance/back/skip rules are testable without a DOM.
|
|
15
|
+
*
|
|
16
|
+
* Music is reported as a signal rather than played: the sequence says *what* track a beat wants,
|
|
17
|
+
* and the game decides whether to crossfade, loop or ignore it. A beat with no `music` reports
|
|
18
|
+
* `null`, so a reader who turns the page to a silent beat gets the previous track stopped.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```ts
|
|
22
|
+
* import { StorySequence } from '@datamoc/mw_games/two-d/stage';
|
|
23
|
+
*
|
|
24
|
+
* const story = new StorySequence([
|
|
25
|
+
* { title: 'Prologue', text: 'The war begins.', music: 'intro.ogg' },
|
|
26
|
+
* { text: 'And so it went.' },
|
|
27
|
+
* ]);
|
|
28
|
+
* story.onMusic.add((track) => console.log(track)); // 'intro.ogg', then null
|
|
29
|
+
* story.advance();
|
|
30
|
+
* console.log(story.done); // true, only one page was left
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export declare class StorySequence {
|
|
34
|
+
readonly onChange: Signal<StoryBeat>;
|
|
35
|
+
readonly onMusic: Signal<string | null>;
|
|
36
|
+
private readonly beats;
|
|
37
|
+
private index;
|
|
38
|
+
constructor(beats: readonly StoryBeat[]);
|
|
39
|
+
get length(): number;
|
|
40
|
+
/** the beat on screen, 0 when empty */
|
|
41
|
+
get position(): number;
|
|
42
|
+
/** the beat on screen; `null` for an empty story */
|
|
43
|
+
get current(): StoryBeat | null;
|
|
44
|
+
/** whether the last beat is the one on screen */
|
|
45
|
+
get done(): boolean;
|
|
46
|
+
/** the music the current beat wants, or `null` for silence */
|
|
47
|
+
get music(): string | null;
|
|
48
|
+
/** moves to a beat, clamped to the ends; reports the beat and its music either way */
|
|
49
|
+
goTo(index: number): void;
|
|
50
|
+
/** turns one page; false when there was no next page */
|
|
51
|
+
advance(): boolean;
|
|
52
|
+
/** turns back one page; false when already at the first */
|
|
53
|
+
back(): boolean;
|
|
54
|
+
/** jumps to the last beat, the "skip" a player who has read it before reaches for */
|
|
55
|
+
skip(): void;
|
|
56
|
+
restart(): void;
|
|
57
|
+
private report;
|
|
58
|
+
}
|
|
59
|
+
export interface StoryScreenOptions {
|
|
60
|
+
sequence: StorySequence;
|
|
61
|
+
width: number;
|
|
62
|
+
height: number;
|
|
63
|
+
/** how a beat's `image` path becomes a texture; `null` when the path cannot be resolved */
|
|
64
|
+
textureFor?: (path: string) => Texture | null;
|
|
65
|
+
/** called with the current beat's music, or `null` for a silent beat */
|
|
66
|
+
playMusic?: (track: string | null) => void;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* A full-screen story beat: a backdrop image, a title and the text over it, advanced by a click -
|
|
70
|
+
* the campaign interlude a scenario shows between maps.
|
|
71
|
+
*
|
|
72
|
+
* `DialogueStage` is the visual-novel model: characters standing on a backdrop, a box under them
|
|
73
|
+
* doing the talking. This is the other shape an interlude needs and that one is not - one page of
|
|
74
|
+
* prose filling the screen, no cast, page forward on any input - so it reuses the same `Label`
|
|
75
|
+
* everything else lays words out with and leaves the sequencing to `StorySequence`, the part worth
|
|
76
|
+
* testing without a renderer. Feeding it `MwlWorld.story` from an `.mwl` scenario is the intended
|
|
77
|
+
* use: both carry the same `{ text, title, image, music }` shape.
|
|
78
|
+
*
|
|
79
|
+
* @example
|
|
80
|
+
* ```ts
|
|
81
|
+
* import { StoryScreen, StorySequence } from '@datamoc/mw_games/two-d/stage';
|
|
82
|
+
*
|
|
83
|
+
* const sequence = new StorySequence([{ title: 'Prologue', text: 'The war begins.' }]);
|
|
84
|
+
* const screen = new StoryScreen({ sequence, width: 960, height: 540 });
|
|
85
|
+
* console.log(screen.current?.title); // 'Prologue'
|
|
86
|
+
* ```
|
|
87
|
+
*/
|
|
88
|
+
export declare class StoryScreen extends Container {
|
|
89
|
+
readonly sequence: StorySequence;
|
|
90
|
+
private readonly backdrop;
|
|
91
|
+
private readonly titleLabel;
|
|
92
|
+
private readonly textLabel;
|
|
93
|
+
private readonly textureFor;
|
|
94
|
+
private readonly playMusic;
|
|
95
|
+
private width_;
|
|
96
|
+
private height_;
|
|
97
|
+
constructor(options: StoryScreenOptions);
|
|
98
|
+
/** the beat on screen */
|
|
99
|
+
get current(): StoryBeat | null;
|
|
100
|
+
/** turns one page; false when the story is over, the caller's cue to change scene */
|
|
101
|
+
advance(): boolean;
|
|
102
|
+
/** jumps to the end, for a player who has already read it */
|
|
103
|
+
skip(): void;
|
|
104
|
+
resize(width: number, height: number): void;
|
|
105
|
+
private readonly handleAdvance;
|
|
106
|
+
private readonly handleBeat;
|
|
107
|
+
private applyBeat;
|
|
108
|
+
destroy(options?: Parameters<Container['destroy']>[0]): void;
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=StoryScreen.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StoryScreen.d.ts","sourceRoot":"","sources":["../../../src/two-d/stage/StoryScreen.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAU,OAAO,EAAE,MAAM,SAAS,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAI9C,+FAA+F;AAC/F,MAAM,WAAW,SAAS;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,aAAa;IACzB,QAAQ,CAAC,QAAQ,oBAA2B;IAC5C,QAAQ,CAAC,OAAO,wBAA+B;IAE/C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAuB;IAC7C,OAAO,CAAC,KAAK,CAAK;IAElB,YAAY,KAAK,EAAE,SAAS,SAAS,EAAE,EAEtC;IAED,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,uCAAuC;IACvC,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,oDAAoD;IACpD,IAAI,OAAO,IAAI,SAAS,GAAG,IAAI,CAE9B;IAED,iDAAiD;IACjD,IAAI,IAAI,IAAI,OAAO,CAElB;IAED,8DAA8D;IAC9D,IAAI,KAAK,IAAI,MAAM,GAAG,IAAI,CAEzB;IAED,sFAAsF;IACtF,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAIxB;IAED,wDAAwD;IACxD,OAAO,IAAI,OAAO,CAIjB;IAED,2DAA2D;IAC3D,IAAI,IAAI,OAAO,CAId;IAED,qFAAqF;IACrF,IAAI,IAAI,IAAI,CAEX;IAED,OAAO,IAAI,IAAI,CAEd;IAED,OAAO,CAAC,MAAM;CAKd;AAED,MAAM,WAAW,kBAAkB;IAClC,QAAQ,EAAE,aAAa,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,2FAA2F;IAC3F,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,GAAG,IAAI,CAAC;IAC9C,wEAAwE;IACxE,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CAC3C;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,WAAY,SAAQ,SAAS;IACzC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IAEjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6B;IACtD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAQ;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;IAElC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAmC;IAC9D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiC;IAC3D,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;IAExB,YAAY,OAAO,EAAE,kBAAkB,EAsBtC;IAED,yBAAyB;IACzB,IAAI,OAAO,IAAI,SAAS,GAAG,IAAI,CAE9B;IAED,qFAAqF;IACrF,OAAO,IAAI,OAAO,CAEjB;IAED,6DAA6D;IAC7D,IAAI,IAAI,IAAI,CAEX;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAI1C;IAED,OAAO,CAAC,QAAQ,CAAC,aAAa,CAE5B;IAEF,OAAO,CAAC,QAAQ,CAAC,UAAU,CAEzB;IAEF,OAAO,CAAC,SAAS;IA0BR,OAAO,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAIpE;CACD"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { Container, Sprite, Texture } from 'pixi.js';
|
|
2
|
+
import { Signal } from '../../core/Signal.js';
|
|
3
|
+
import { Label } from '../ui/Label.js';
|
|
4
|
+
import { theme } from '../ui/theme.js';
|
|
5
|
+
/**
|
|
6
|
+
* The beats of a story screen and where the reader is in them, with no renderer attached - the
|
|
7
|
+
* same split `TabbedList` keeps, so the advance/back/skip rules are testable without a DOM.
|
|
8
|
+
*
|
|
9
|
+
* Music is reported as a signal rather than played: the sequence says *what* track a beat wants,
|
|
10
|
+
* and the game decides whether to crossfade, loop or ignore it. A beat with no `music` reports
|
|
11
|
+
* `null`, so a reader who turns the page to a silent beat gets the previous track stopped.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* import { StorySequence } from '@datamoc/mw_games/two-d/stage';
|
|
16
|
+
*
|
|
17
|
+
* const story = new StorySequence([
|
|
18
|
+
* { title: 'Prologue', text: 'The war begins.', music: 'intro.ogg' },
|
|
19
|
+
* { text: 'And so it went.' },
|
|
20
|
+
* ]);
|
|
21
|
+
* story.onMusic.add((track) => console.log(track)); // 'intro.ogg', then null
|
|
22
|
+
* story.advance();
|
|
23
|
+
* console.log(story.done); // true, only one page was left
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export class StorySequence {
|
|
27
|
+
constructor(beats) {
|
|
28
|
+
this.onChange = new Signal();
|
|
29
|
+
this.onMusic = new Signal();
|
|
30
|
+
this.index = 0;
|
|
31
|
+
this.beats = beats;
|
|
32
|
+
}
|
|
33
|
+
get length() {
|
|
34
|
+
return this.beats.length;
|
|
35
|
+
}
|
|
36
|
+
/** the beat on screen, 0 when empty */
|
|
37
|
+
get position() {
|
|
38
|
+
return this.index;
|
|
39
|
+
}
|
|
40
|
+
/** the beat on screen; `null` for an empty story */
|
|
41
|
+
get current() {
|
|
42
|
+
return this.beats[this.index] ?? null;
|
|
43
|
+
}
|
|
44
|
+
/** whether the last beat is the one on screen */
|
|
45
|
+
get done() {
|
|
46
|
+
return this.beats.length === 0 || this.index >= this.beats.length - 1;
|
|
47
|
+
}
|
|
48
|
+
/** the music the current beat wants, or `null` for silence */
|
|
49
|
+
get music() {
|
|
50
|
+
return this.current?.music ?? null;
|
|
51
|
+
}
|
|
52
|
+
/** moves to a beat, clamped to the ends; reports the beat and its music either way */
|
|
53
|
+
goTo(index) {
|
|
54
|
+
const next = Math.max(0, Math.min(this.beats.length - 1, index));
|
|
55
|
+
this.index = next;
|
|
56
|
+
this.report();
|
|
57
|
+
}
|
|
58
|
+
/** turns one page; false when there was no next page */
|
|
59
|
+
advance() {
|
|
60
|
+
if (this.done)
|
|
61
|
+
return false;
|
|
62
|
+
this.goTo(this.index + 1);
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
/** turns back one page; false when already at the first */
|
|
66
|
+
back() {
|
|
67
|
+
if (this.index === 0)
|
|
68
|
+
return false;
|
|
69
|
+
this.goTo(this.index - 1);
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
/** jumps to the last beat, the "skip" a player who has read it before reaches for */
|
|
73
|
+
skip() {
|
|
74
|
+
this.goTo(this.beats.length - 1);
|
|
75
|
+
}
|
|
76
|
+
restart() {
|
|
77
|
+
this.goTo(0);
|
|
78
|
+
}
|
|
79
|
+
report() {
|
|
80
|
+
const beat = this.current;
|
|
81
|
+
if (beat)
|
|
82
|
+
this.onChange.dispatch(beat);
|
|
83
|
+
this.onMusic.dispatch(this.music);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* A full-screen story beat: a backdrop image, a title and the text over it, advanced by a click -
|
|
88
|
+
* the campaign interlude a scenario shows between maps.
|
|
89
|
+
*
|
|
90
|
+
* `DialogueStage` is the visual-novel model: characters standing on a backdrop, a box under them
|
|
91
|
+
* doing the talking. This is the other shape an interlude needs and that one is not - one page of
|
|
92
|
+
* prose filling the screen, no cast, page forward on any input - so it reuses the same `Label`
|
|
93
|
+
* everything else lays words out with and leaves the sequencing to `StorySequence`, the part worth
|
|
94
|
+
* testing without a renderer. Feeding it `MwlWorld.story` from an `.mwl` scenario is the intended
|
|
95
|
+
* use: both carry the same `{ text, title, image, music }` shape.
|
|
96
|
+
*
|
|
97
|
+
* @example
|
|
98
|
+
* ```ts
|
|
99
|
+
* import { StoryScreen, StorySequence } from '@datamoc/mw_games/two-d/stage';
|
|
100
|
+
*
|
|
101
|
+
* const sequence = new StorySequence([{ title: 'Prologue', text: 'The war begins.' }]);
|
|
102
|
+
* const screen = new StoryScreen({ sequence, width: 960, height: 540 });
|
|
103
|
+
* console.log(screen.current?.title); // 'Prologue'
|
|
104
|
+
* ```
|
|
105
|
+
*/
|
|
106
|
+
export class StoryScreen extends Container {
|
|
107
|
+
constructor(options) {
|
|
108
|
+
super();
|
|
109
|
+
this.backdrop = new Sprite(Texture.EMPTY);
|
|
110
|
+
this.handleAdvance = () => {
|
|
111
|
+
this.advance();
|
|
112
|
+
};
|
|
113
|
+
this.handleBeat = (beat) => {
|
|
114
|
+
this.applyBeat(beat);
|
|
115
|
+
};
|
|
116
|
+
this.sequence = options.sequence;
|
|
117
|
+
this.textureFor = options.textureFor ?? (() => null);
|
|
118
|
+
this.playMusic = options.playMusic ?? (() => { });
|
|
119
|
+
this.width_ = options.width;
|
|
120
|
+
this.height_ = options.height;
|
|
121
|
+
this.titleLabel = new Label({ text: '', color: theme().color.textHighlight });
|
|
122
|
+
this.textLabel = new Label({ text: '', wrapWidth: this.width_ * 0.8 });
|
|
123
|
+
this.addChild(this.backdrop);
|
|
124
|
+
this.addChild(this.titleLabel);
|
|
125
|
+
this.addChild(this.textLabel);
|
|
126
|
+
this.eventMode = 'static';
|
|
127
|
+
this.on('pointertap', this.handleAdvance);
|
|
128
|
+
this.sequence.onChange.add(this.handleBeat);
|
|
129
|
+
this.sequence.onMusic.add(this.playMusic);
|
|
130
|
+
this.applyBeat(this.sequence.current);
|
|
131
|
+
}
|
|
132
|
+
/** the beat on screen */
|
|
133
|
+
get current() {
|
|
134
|
+
return this.sequence.current;
|
|
135
|
+
}
|
|
136
|
+
/** turns one page; false when the story is over, the caller's cue to change scene */
|
|
137
|
+
advance() {
|
|
138
|
+
return this.sequence.advance();
|
|
139
|
+
}
|
|
140
|
+
/** jumps to the end, for a player who has already read it */
|
|
141
|
+
skip() {
|
|
142
|
+
this.sequence.skip();
|
|
143
|
+
}
|
|
144
|
+
resize(width, height) {
|
|
145
|
+
this.width_ = width;
|
|
146
|
+
this.height_ = height;
|
|
147
|
+
this.applyBeat(this.current);
|
|
148
|
+
}
|
|
149
|
+
applyBeat(beat) {
|
|
150
|
+
if (!beat) {
|
|
151
|
+
this.backdrop.visible = false;
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
const texture = beat.image ? this.textureFor(beat.image) : null;
|
|
155
|
+
this.backdrop.visible = texture !== null;
|
|
156
|
+
if (texture) {
|
|
157
|
+
this.backdrop.texture = texture;
|
|
158
|
+
//cover the screen without distorting the art, the way a backdrop changes aspect
|
|
159
|
+
const scale = Math.max(this.width_ / texture.width, this.height_ / texture.height);
|
|
160
|
+
this.backdrop.scale.set(scale);
|
|
161
|
+
this.backdrop.x = (this.width_ - texture.width * scale) / 2;
|
|
162
|
+
this.backdrop.y = (this.height_ - texture.height * scale) / 2;
|
|
163
|
+
}
|
|
164
|
+
this.titleLabel.setText(beat.title ?? '');
|
|
165
|
+
this.titleLabel.x = this.width_ * 0.1;
|
|
166
|
+
this.titleLabel.y = this.height_ * 0.12;
|
|
167
|
+
this.textLabel.setText(beat.text);
|
|
168
|
+
this.textLabel.x = this.width_ * 0.1;
|
|
169
|
+
this.textLabel.y = this.height_ * 0.24;
|
|
170
|
+
this.textLabel.style.wordWrapWidth = this.width_ * 0.8;
|
|
171
|
+
}
|
|
172
|
+
destroy(options) {
|
|
173
|
+
this.sequence.onChange.remove(this.handleBeat);
|
|
174
|
+
this.sequence.onMusic.remove(this.playMusic);
|
|
175
|
+
super.destroy(options);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=StoryScreen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StoryScreen.js","sourceRoot":"","sources":["../../../src/two-d/stage/StoryScreen.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,4 +4,6 @@ export { StageScript } from './script.ts';
|
|
|
4
4
|
export type { StageCommand, StageChoice, StoryScript, ScriptOptions, ScriptState, HistoryEntry } from './script.ts';
|
|
5
5
|
export { importTwee } from './twee.ts';
|
|
6
6
|
export type { TwineStory } from './twee.ts';
|
|
7
|
+
export { StoryScreen, StorySequence } from './StoryScreen.ts';
|
|
8
|
+
export type { StoryBeat, StoryScreenOptions } from './StoryScreen.ts';
|
|
7
9
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/two-d/stage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,YAAY,EAAE,mBAAmB,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAErF,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACpH,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,YAAY,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/two-d/stage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,YAAY,EAAE,mBAAmB,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAErF,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACpH,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,YAAY,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC9D,YAAY,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/two-d/stage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/two-d/stage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAGvC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { Container } from 'pixi.js';
|
|
2
|
+
import { Signal } from '../../core/Signal.ts';
|
|
3
|
+
export interface CheckboxOptions {
|
|
4
|
+
/** the box's side length; the check is drawn inside it */
|
|
5
|
+
size?: number;
|
|
6
|
+
checked?: boolean;
|
|
7
|
+
disabled?: boolean;
|
|
8
|
+
/** the tick's colour; the theme's highlight when omitted */
|
|
9
|
+
color?: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* A square box that is ticked or not, the toggle a settings row or an option list puts beside its
|
|
13
|
+
* label. It draws only the box and its tick - a caption is a `Label` the game places next to it,
|
|
14
|
+
* so the two can be laid out and translated independently.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```ts
|
|
18
|
+
* import { Checkbox } from '@datamoc/mw_games/two-d/ui';
|
|
19
|
+
*
|
|
20
|
+
* const fullscreen = new Checkbox({ checked: true });
|
|
21
|
+
* fullscreen.onChange.add((on) => console.log('fullscreen', on));
|
|
22
|
+
* fullscreen.toggle();
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export declare class Checkbox extends Container {
|
|
26
|
+
readonly onChange: Signal<boolean>;
|
|
27
|
+
private box;
|
|
28
|
+
private size_;
|
|
29
|
+
private checked_;
|
|
30
|
+
private disabled_;
|
|
31
|
+
private readonly themeListener;
|
|
32
|
+
constructor(options?: CheckboxOptions);
|
|
33
|
+
get checked(): boolean;
|
|
34
|
+
get disabled(): boolean;
|
|
35
|
+
setDisabled(disabled: boolean): void;
|
|
36
|
+
/** sets the box, firing `onChange` only when the value actually moves */
|
|
37
|
+
setChecked(checked: boolean): void;
|
|
38
|
+
toggle(): void;
|
|
39
|
+
resize(size: number): void;
|
|
40
|
+
private readonly handleTap;
|
|
41
|
+
private draw;
|
|
42
|
+
destroy(options?: Parameters<Container['destroy']>[0]): void;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=Checkbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Checkbox.d.ts","sourceRoot":"","sources":["../../../src/two-d/ui/Checkbox.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAY,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAG9C,MAAM,WAAW,eAAe;IAC/B,0DAA0D;IAC1D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;;;;GAaG;AACH,qBAAa,QAAS,SAAQ,SAAS;IACtC,QAAQ,CAAC,QAAQ,kBAAyB;IAE1C,OAAO,CAAC,GAAG,CAAkB;IAE7B,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,QAAQ,CAAU;IAC1B,OAAO,CAAC,SAAS,CAAU;IAE3B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqB;IAEnD,YAAY,OAAO,GAAE,eAAoB,EAexC;IAED,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAInC;IAED,yEAAyE;IACzE,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAQjC;IAED,MAAM,IAAI,IAAI,CAEb;IAED,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAGzB;IAED,OAAO,CAAC,QAAQ,CAAC,SAAS,CAGxB;IAEF,OAAO,CAAC,IAAI;IAoBH,OAAO,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAGpE;CACD"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { Container, Graphics } from 'pixi.js';
|
|
2
|
+
import { Signal } from '../../core/Signal.js';
|
|
3
|
+
import { theme, themeChanged } from './theme.js';
|
|
4
|
+
/**
|
|
5
|
+
* A square box that is ticked or not, the toggle a settings row or an option list puts beside its
|
|
6
|
+
* label. It draws only the box and its tick - a caption is a `Label` the game places next to it,
|
|
7
|
+
* so the two can be laid out and translated independently.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* import { Checkbox } from '@datamoc/mw_games/two-d/ui';
|
|
12
|
+
*
|
|
13
|
+
* const fullscreen = new Checkbox({ checked: true });
|
|
14
|
+
* fullscreen.onChange.add((on) => console.log('fullscreen', on));
|
|
15
|
+
* fullscreen.toggle();
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
export class Checkbox extends Container {
|
|
19
|
+
constructor(options = {}) {
|
|
20
|
+
super();
|
|
21
|
+
this.onChange = new Signal();
|
|
22
|
+
this.box = new Graphics();
|
|
23
|
+
this.themeListener = () => this.draw();
|
|
24
|
+
this.handleTap = () => {
|
|
25
|
+
if (this.disabled_)
|
|
26
|
+
return;
|
|
27
|
+
this.toggle();
|
|
28
|
+
};
|
|
29
|
+
this.size_ = options.size ?? 20;
|
|
30
|
+
this.checked_ = options.checked ?? false;
|
|
31
|
+
this.disabled_ = options.disabled ?? false;
|
|
32
|
+
this.addChild(this.box);
|
|
33
|
+
this.draw();
|
|
34
|
+
this.eventMode = 'static';
|
|
35
|
+
this.cursor = 'pointer';
|
|
36
|
+
this.on('pointertap', this.handleTap);
|
|
37
|
+
themeChanged.add(this.themeListener);
|
|
38
|
+
}
|
|
39
|
+
get checked() {
|
|
40
|
+
return this.checked_;
|
|
41
|
+
}
|
|
42
|
+
get disabled() {
|
|
43
|
+
return this.disabled_;
|
|
44
|
+
}
|
|
45
|
+
setDisabled(disabled) {
|
|
46
|
+
this.disabled_ = disabled;
|
|
47
|
+
this.cursor = disabled ? 'default' : 'pointer';
|
|
48
|
+
this.draw();
|
|
49
|
+
}
|
|
50
|
+
/** sets the box, firing `onChange` only when the value actually moves */
|
|
51
|
+
setChecked(checked) {
|
|
52
|
+
if (checked === this.checked_) {
|
|
53
|
+
this.draw();
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
this.checked_ = checked;
|
|
57
|
+
this.draw();
|
|
58
|
+
this.onChange.dispatch(checked);
|
|
59
|
+
}
|
|
60
|
+
toggle() {
|
|
61
|
+
this.setChecked(!this.checked_);
|
|
62
|
+
}
|
|
63
|
+
resize(size) {
|
|
64
|
+
this.size_ = size;
|
|
65
|
+
this.draw();
|
|
66
|
+
}
|
|
67
|
+
draw() {
|
|
68
|
+
const t = theme();
|
|
69
|
+
const color = this.disabled_ ? t.color.textDim : t.color.textHighlight;
|
|
70
|
+
this.box
|
|
71
|
+
.clear()
|
|
72
|
+
.roundRect(0, 0, this.size_, this.size_, 4)
|
|
73
|
+
.fill({ color: t.color.panelFill })
|
|
74
|
+
.stroke({ color: this.disabled_ ? t.color.textDim : t.color.panelBorder, width: 2 });
|
|
75
|
+
if (this.checked_) {
|
|
76
|
+
const inset = this.size_ * 0.25;
|
|
77
|
+
this.box
|
|
78
|
+
.moveTo(inset, this.size_ * 0.55)
|
|
79
|
+
.lineTo(this.size_ * 0.45, this.size_ - inset)
|
|
80
|
+
.lineTo(this.size_ - inset, inset)
|
|
81
|
+
.stroke({ color, width: Math.max(2, this.size_ * 0.12), cap: 'round', join: 'round' });
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
destroy(options) {
|
|
85
|
+
themeChanged.remove(this.themeListener);
|
|
86
|
+
super.destroy(options);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=Checkbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Checkbox.js","sourceRoot":"","sources":["../../../src/two-d/ui/Checkbox.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { Signal } from '../../core/Signal.ts';
|
|
2
|
+
export interface TableColumn<T> {
|
|
3
|
+
/** the key a sort reads when the column has no `compare` */
|
|
4
|
+
key: string;
|
|
5
|
+
/** the header caption; a game may still draw its own */
|
|
6
|
+
label?: string;
|
|
7
|
+
width?: number;
|
|
8
|
+
align?: 'left' | 'right' | 'center';
|
|
9
|
+
/** how to sort this column; `row[key]` compared generically when omitted */
|
|
10
|
+
compare?: (a: T, b: T) => number;
|
|
11
|
+
}
|
|
12
|
+
export interface DataTableOptions<T> {
|
|
13
|
+
columns: readonly TableColumn<T>[];
|
|
14
|
+
rows?: readonly T[];
|
|
15
|
+
/** rows per page; 0 or omitted means one page, no paging */
|
|
16
|
+
pageSize?: number;
|
|
17
|
+
/** rows the highlight skips, the way `ListView` skips a disabled item */
|
|
18
|
+
disabled?: (row: T) => boolean;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* A columned table with a highlighted row, a sort order and paging - the roster or inventory grid
|
|
22
|
+
* that wants headers and a stable sort, where `ListView` is a flat one-column list.
|
|
23
|
+
*
|
|
24
|
+
* Renderer-free, like `TabbedList`: it holds the columns, the rows, the sort, the highlight and
|
|
25
|
+
* the current page, and a game draws the cells. The page is *derived* from the highlighted row
|
|
26
|
+
* rather than tracked beside it, so the two can never disagree; `setPage` is the only thing that
|
|
27
|
+
* moves the highlight on its own, and it lands on the first selectable row of that page.
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```ts
|
|
31
|
+
* import { DataTable } from '@datamoc/mw_games/two-d/ui';
|
|
32
|
+
*
|
|
33
|
+
* const roster = new DataTable({
|
|
34
|
+
* columns: [{ key: 'name' }, { key: 'level' }],
|
|
35
|
+
* rows: [{ name: 'Ash', level: 3 }, { name: 'Bo', level: 1 }],
|
|
36
|
+
* });
|
|
37
|
+
* roster.sortBy('level');
|
|
38
|
+
* console.log(roster.rows[0].name); // 'Bo'
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export declare class DataTable<T> {
|
|
42
|
+
readonly onChange: Signal<void>;
|
|
43
|
+
private columns_;
|
|
44
|
+
private rows_;
|
|
45
|
+
private pageSize_;
|
|
46
|
+
private current;
|
|
47
|
+
private sortKey_;
|
|
48
|
+
private ascending;
|
|
49
|
+
private readonly disabledOf;
|
|
50
|
+
constructor(options: DataTableOptions<T>);
|
|
51
|
+
get columns(): readonly TableColumn<T>[];
|
|
52
|
+
get rows(): readonly T[];
|
|
53
|
+
get pageSize(): number;
|
|
54
|
+
get sortKey(): string | null;
|
|
55
|
+
get sortAscending(): boolean;
|
|
56
|
+
get selectedIndex(): number;
|
|
57
|
+
get selected(): T | null;
|
|
58
|
+
/** the page the highlighted row is on, 0 when there is no paging */
|
|
59
|
+
get page(): number;
|
|
60
|
+
/** how many pages there are; at least one, so an empty table still has a page 0 */
|
|
61
|
+
get pageCount(): number;
|
|
62
|
+
get pageRows(): readonly T[];
|
|
63
|
+
setRows(rows: readonly T[]): void;
|
|
64
|
+
setColumns(columns: readonly TableColumn<T>[]): void;
|
|
65
|
+
setPageSize(size: number): void;
|
|
66
|
+
/**
|
|
67
|
+
* Sorts by a column, ascending the first time and toggling on a repeat of the same key.
|
|
68
|
+
* The highlight returns to the first selectable row, since the row it pointed at moved.
|
|
69
|
+
*/
|
|
70
|
+
sortBy(key: string): void;
|
|
71
|
+
select(index: number): void;
|
|
72
|
+
/** moves the highlight a row at a time, skipping disabled rows and stopping at the ends */
|
|
73
|
+
move(delta: number): void;
|
|
74
|
+
/** moves to a page and highlights its first selectable row */
|
|
75
|
+
setPage(page: number): void;
|
|
76
|
+
nextPage(delta?: number): void;
|
|
77
|
+
private firstEnabled;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=DataTable.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataTable.d.ts","sourceRoot":"","sources":["../../../src/two-d/ui/DataTable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE9C,MAAM,WAAW,WAAW,CAAC,CAAC;IAC7B,4DAA4D;IAC5D,GAAG,EAAE,MAAM,CAAC;IACZ,wDAAwD;IACxD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IACpC,4EAA4E;IAC5E,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC;IAClC,OAAO,EAAE,SAAS,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;IACnC,IAAI,CAAC,EAAE,SAAS,CAAC,EAAE,CAAC;IACpB,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yEAAyE;IACzE,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,OAAO,CAAC;CAC/B;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,SAAS,CAAC,CAAC;IACvB,QAAQ,CAAC,QAAQ,eAAsB;IAEvC,OAAO,CAAC,QAAQ,CAAmB;IACnC,OAAO,CAAC,KAAK,CAAM;IACnB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAsB;IAEjD,YAAY,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAMvC;IAED,IAAI,OAAO,IAAI,SAAS,WAAW,CAAC,CAAC,CAAC,EAAE,CAEvC;IAED,IAAI,IAAI,IAAI,SAAS,CAAC,EAAE,CAEvB;IAED,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,IAAI,OAAO,IAAI,MAAM,GAAG,IAAI,CAE3B;IAED,IAAI,aAAa,IAAI,OAAO,CAE3B;IAED,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED,IAAI,QAAQ,IAAI,CAAC,GAAG,IAAI,CAEvB;IAED,oEAAoE;IACpE,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,mFAAmF;IACnF,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,IAAI,QAAQ,IAAI,SAAS,CAAC,EAAE,CAI3B;IAED,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,GAAG,IAAI,CAIhC;IAED,UAAU,CAAC,OAAO,EAAE,SAAS,WAAW,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAInD;IAED,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAG9B;IAED;;;OAGG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAYxB;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAI1B;IAED,2FAA2F;IAC3F,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAaxB;IAED,8DAA8D;IAC9D,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAY1B;IAED,QAAQ,CAAC,KAAK,SAAI,GAAG,IAAI,CAExB;IAED,OAAO,CAAC,YAAY;CAIpB"}
|