@datamoc/mw_games 0.1.1
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/LICENSE +373 -0
- package/README.md +327 -0
- package/dist/actors/Advancement.d.ts +73 -0
- package/dist/actors/Advancement.d.ts.map +1 -0
- package/dist/actors/Advancement.js +98 -0
- package/dist/actors/Advancement.js.map +1 -0
- package/dist/actors/Affix.d.ts +44 -0
- package/dist/actors/Affix.d.ts.map +1 -0
- package/dist/actors/Affix.js +35 -0
- package/dist/actors/Affix.js.map +1 -0
- package/dist/actors/Appearances.d.ts +36 -0
- package/dist/actors/Appearances.d.ts.map +1 -0
- package/dist/actors/Appearances.js +50 -0
- package/dist/actors/Appearances.js.map +1 -0
- package/dist/actors/Charges.d.ts +31 -0
- package/dist/actors/Charges.d.ts.map +1 -0
- package/dist/actors/Charges.js +35 -0
- package/dist/actors/Charges.js.map +1 -0
- package/dist/actors/Equipment.d.ts +40 -0
- package/dist/actors/Equipment.d.ts.map +1 -0
- package/dist/actors/Equipment.js +57 -0
- package/dist/actors/Equipment.js.map +1 -0
- package/dist/actors/Inventory.d.ts +50 -0
- package/dist/actors/Inventory.d.ts.map +1 -0
- package/dist/actors/Inventory.js +56 -0
- package/dist/actors/Inventory.js.map +1 -0
- package/dist/actors/ItemState.d.ts +21 -0
- package/dist/actors/ItemState.d.ts.map +1 -0
- package/dist/actors/ItemState.js +34 -0
- package/dist/actors/ItemState.js.map +1 -0
- package/dist/actors/Loot.d.ts +24 -0
- package/dist/actors/Loot.d.ts.map +1 -0
- package/dist/actors/Loot.js +14 -0
- package/dist/actors/Loot.js.map +1 -0
- package/dist/actors/Progression.d.ts +30 -0
- package/dist/actors/Progression.d.ts.map +1 -0
- package/dist/actors/Progression.js +39 -0
- package/dist/actors/Progression.js.map +1 -0
- package/dist/actors/Resource.d.ts +23 -0
- package/dist/actors/Resource.d.ts.map +1 -0
- package/dist/actors/Resource.js +28 -0
- package/dist/actors/Resource.js.map +1 -0
- package/dist/actors/Scaling.d.ts +22 -0
- package/dist/actors/Scaling.d.ts.map +1 -0
- package/dist/actors/Scaling.js +9 -0
- package/dist/actors/Scaling.js.map +1 -0
- package/dist/actors/Shop.d.ts +25 -0
- package/dist/actors/Shop.d.ts.map +1 -0
- package/dist/actors/Shop.js +33 -0
- package/dist/actors/Shop.js.map +1 -0
- package/dist/actors/SkillPoints.d.ts +45 -0
- package/dist/actors/SkillPoints.d.ts.map +1 -0
- package/dist/actors/SkillPoints.js +58 -0
- package/dist/actors/SkillPoints.js.map +1 -0
- package/dist/actors/StatBlock.d.ts +52 -0
- package/dist/actors/StatBlock.d.ts.map +1 -0
- package/dist/actors/StatBlock.js +80 -0
- package/dist/actors/StatBlock.js.map +1 -0
- package/dist/actors/StatusEffect.d.ts +38 -0
- package/dist/actors/StatusEffect.d.ts.map +1 -0
- package/dist/actors/StatusEffect.js +28 -0
- package/dist/actors/StatusEffect.js.map +1 -0
- package/dist/actors/craft.d.ts +26 -0
- package/dist/actors/craft.d.ts.map +1 -0
- package/dist/actors/craft.js +34 -0
- package/dist/actors/craft.js.map +1 -0
- package/dist/actors/index.d.ts +33 -0
- package/dist/actors/index.d.ts.map +1 -0
- package/dist/actors/index.js +18 -0
- package/dist/actors/index.js.map +1 -0
- package/dist/actors/skillCheck.d.ts +13 -0
- package/dist/actors/skillCheck.d.ts.map +1 -0
- package/dist/actors/skillCheck.js +16 -0
- package/dist/actors/skillCheck.js.map +1 -0
- package/dist/assets/index.d.ts +37 -0
- package/dist/assets/index.d.ts.map +1 -0
- package/dist/assets/index.js +62 -0
- package/dist/assets/index.js.map +1 -0
- package/dist/audio/Music.d.ts +22 -0
- package/dist/audio/Music.d.ts.map +1 -0
- package/dist/audio/Music.js +67 -0
- package/dist/audio/Music.js.map +1 -0
- package/dist/audio/Playable.d.ts +16 -0
- package/dist/audio/Playable.d.ts.map +1 -0
- package/dist/audio/Playable.js +6 -0
- package/dist/audio/Playable.js.map +1 -0
- package/dist/audio/Sound.d.ts +23 -0
- package/dist/audio/Sound.d.ts.map +1 -0
- package/dist/audio/Sound.js +30 -0
- package/dist/audio/Sound.js.map +1 -0
- package/dist/audio/index.d.ts +7 -0
- package/dist/audio/index.d.ts.map +1 -0
- package/dist/audio/index.js +4 -0
- package/dist/audio/index.js.map +1 -0
- package/dist/battle/BattleAI.d.ts +24 -0
- package/dist/battle/BattleAI.d.ts.map +1 -0
- package/dist/battle/BattleAI.js +47 -0
- package/dist/battle/BattleAI.js.map +1 -0
- package/dist/battle/Evolution.d.ts +22 -0
- package/dist/battle/Evolution.d.ts.map +1 -0
- package/dist/battle/Evolution.js +25 -0
- package/dist/battle/Evolution.js.map +1 -0
- package/dist/battle/Field.d.ts +25 -0
- package/dist/battle/Field.d.ts.map +1 -0
- package/dist/battle/Field.js +31 -0
- package/dist/battle/Field.js.map +1 -0
- package/dist/battle/Hooks.d.ts +29 -0
- package/dist/battle/Hooks.d.ts.map +1 -0
- package/dist/battle/Hooks.js +20 -0
- package/dist/battle/Hooks.js.map +1 -0
- package/dist/battle/Move.d.ts +32 -0
- package/dist/battle/Move.d.ts.map +1 -0
- package/dist/battle/Move.js +10 -0
- package/dist/battle/Move.js.map +1 -0
- package/dist/battle/Party.d.ts +21 -0
- package/dist/battle/Party.d.ts.map +1 -0
- package/dist/battle/Party.js +49 -0
- package/dist/battle/Party.js.map +1 -0
- package/dist/battle/Species.d.ts +40 -0
- package/dist/battle/Species.d.ts.map +1 -0
- package/dist/battle/Species.js +31 -0
- package/dist/battle/Species.js.map +1 -0
- package/dist/battle/StatStages.d.ts +38 -0
- package/dist/battle/StatStages.d.ts.map +1 -0
- package/dist/battle/StatStages.js +50 -0
- package/dist/battle/StatStages.js.map +1 -0
- package/dist/battle/TypeMatrix.d.ts +14 -0
- package/dist/battle/TypeMatrix.d.ts.map +1 -0
- package/dist/battle/TypeMatrix.js +24 -0
- package/dist/battle/TypeMatrix.js.map +1 -0
- package/dist/battle/index.d.ts +16 -0
- package/dist/battle/index.d.ts.map +1 -0
- package/dist/battle/index.js +10 -0
- package/dist/battle/index.js.map +1 -0
- package/dist/board/Classics.d.ts +123 -0
- package/dist/board/Classics.d.ts.map +1 -0
- package/dist/board/Classics.js +260 -0
- package/dist/board/Classics.js.map +1 -0
- package/dist/board/Engine.d.ts +23 -0
- package/dist/board/Engine.d.ts.map +1 -0
- package/dist/board/Engine.js +87 -0
- package/dist/board/Engine.js.map +1 -0
- package/dist/board/Tactics.d.ts +46 -0
- package/dist/board/Tactics.d.ts.map +1 -0
- package/dist/board/Tactics.js +108 -0
- package/dist/board/Tactics.js.map +1 -0
- package/dist/board/chess.d.ts +67 -0
- package/dist/board/chess.d.ts.map +1 -0
- package/dist/board/chess.js +439 -0
- package/dist/board/chess.js.map +1 -0
- package/dist/board/index.d.ts +9 -0
- package/dist/board/index.d.ts.map +1 -0
- package/dist/board/index.js +5 -0
- package/dist/board/index.js.map +1 -0
- package/dist/core/Achievements.d.ts +53 -0
- package/dist/core/Achievements.d.ts.map +1 -0
- package/dist/core/Achievements.js +80 -0
- package/dist/core/Achievements.js.map +1 -0
- package/dist/core/Collection.d.ts +46 -0
- package/dist/core/Collection.d.ts.map +1 -0
- package/dist/core/Collection.js +61 -0
- package/dist/core/Collection.js.map +1 -0
- package/dist/core/Game.d.ts +115 -0
- package/dist/core/Game.d.ts.map +1 -0
- package/dist/core/Game.js +236 -0
- package/dist/core/Game.js.map +1 -0
- package/dist/core/Hex.d.ts +45 -0
- package/dist/core/Hex.d.ts.map +1 -0
- package/dist/core/Hex.js +120 -0
- package/dist/core/Hex.js.map +1 -0
- package/dist/core/Input.d.ts +41 -0
- package/dist/core/Input.d.ts.map +1 -0
- package/dist/core/Input.js +132 -0
- package/dist/core/Input.js.map +1 -0
- package/dist/core/Log.d.ts +39 -0
- package/dist/core/Log.d.ts.map +1 -0
- package/dist/core/Log.js +50 -0
- package/dist/core/Log.js.map +1 -0
- package/dist/core/Random.d.ts +64 -0
- package/dist/core/Random.d.ts.map +1 -0
- package/dist/core/Random.js +178 -0
- package/dist/core/Random.js.map +1 -0
- package/dist/core/Replay.d.ts +71 -0
- package/dist/core/Replay.d.ts.map +1 -0
- package/dist/core/Replay.js +102 -0
- package/dist/core/Replay.js.map +1 -0
- package/dist/core/Save.d.ts +52 -0
- package/dist/core/Save.d.ts.map +1 -0
- package/dist/core/Save.js +81 -0
- package/dist/core/Save.js.map +1 -0
- package/dist/core/Scene.d.ts +40 -0
- package/dist/core/Scene.d.ts.map +1 -0
- package/dist/core/Scene.js +56 -0
- package/dist/core/Scene.js.map +1 -0
- package/dist/core/SceneStack.d.ts +37 -0
- package/dist/core/SceneStack.d.ts.map +1 -0
- package/dist/core/SceneStack.js +67 -0
- package/dist/core/SceneStack.js.map +1 -0
- package/dist/core/Signal.d.ts +24 -0
- package/dist/core/Signal.d.ts.map +1 -0
- package/dist/core/Signal.js +41 -0
- package/dist/core/Signal.js.map +1 -0
- package/dist/core/index.d.ts +23 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +14 -0
- package/dist/core/index.js.map +1 -0
- package/dist/i18n/index.d.ts +51 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +74 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/mw_games.global.js +993 -0
- package/dist/render/ActorAnimator.d.ts +60 -0
- package/dist/render/ActorAnimator.d.ts.map +1 -0
- package/dist/render/ActorAnimator.js +76 -0
- package/dist/render/ActorAnimator.js.map +1 -0
- package/dist/render/AnimatedSprite.d.ts +57 -0
- package/dist/render/AnimatedSprite.d.ts.map +1 -0
- package/dist/render/AnimatedSprite.js +105 -0
- package/dist/render/AnimatedSprite.js.map +1 -0
- package/dist/render/Autotile.d.ts +42 -0
- package/dist/render/Autotile.d.ts.map +1 -0
- package/dist/render/Autotile.js +117 -0
- package/dist/render/Autotile.js.map +1 -0
- package/dist/render/Camera.d.ts +88 -0
- package/dist/render/Camera.d.ts.map +1 -0
- package/dist/render/Camera.js +145 -0
- package/dist/render/Camera.js.map +1 -0
- package/dist/render/ColorTransformBatcher.d.ts +57 -0
- package/dist/render/ColorTransformBatcher.d.ts.map +1 -0
- package/dist/render/ColorTransformBatcher.js +212 -0
- package/dist/render/ColorTransformBatcher.js.map +1 -0
- package/dist/render/LayeredSprite.d.ts +27 -0
- package/dist/render/LayeredSprite.d.ts.map +1 -0
- package/dist/render/LayeredSprite.js +53 -0
- package/dist/render/LayeredSprite.js.map +1 -0
- package/dist/render/Projectile.d.ts +37 -0
- package/dist/render/Projectile.d.ts.map +1 -0
- package/dist/render/Projectile.js +50 -0
- package/dist/render/Projectile.js.map +1 -0
- package/dist/render/SpriteSheet.d.ts +38 -0
- package/dist/render/SpriteSheet.d.ts.map +1 -0
- package/dist/render/SpriteSheet.js +79 -0
- package/dist/render/SpriteSheet.js.map +1 -0
- package/dist/render/TileMap.d.ts +188 -0
- package/dist/render/TileMap.d.ts.map +1 -0
- package/dist/render/TileMap.js +488 -0
- package/dist/render/TileMap.js.map +1 -0
- package/dist/render/TintedSprite.d.ts +47 -0
- package/dist/render/TintedSprite.d.ts.map +1 -0
- package/dist/render/TintedSprite.js +173 -0
- package/dist/render/TintedSprite.js.map +1 -0
- package/dist/render/index.d.ts +18 -0
- package/dist/render/index.d.ts.map +1 -0
- package/dist/render/index.js +11 -0
- package/dist/render/index.js.map +1 -0
- package/dist/roguelike/Blob.d.ts +46 -0
- package/dist/roguelike/Blob.d.ts.map +1 -0
- package/dist/roguelike/Blob.js +98 -0
- package/dist/roguelike/Blob.js.map +1 -0
- package/dist/roguelike/Boss.d.ts +67 -0
- package/dist/roguelike/Boss.d.ts.map +1 -0
- package/dist/roguelike/Boss.js +114 -0
- package/dist/roguelike/Boss.js.map +1 -0
- package/dist/roguelike/Combat.d.ts +23 -0
- package/dist/roguelike/Combat.d.ts.map +1 -0
- package/dist/roguelike/Combat.js +27 -0
- package/dist/roguelike/Combat.js.map +1 -0
- package/dist/roguelike/Doors.d.ts +60 -0
- package/dist/roguelike/Doors.d.ts.map +1 -0
- package/dist/roguelike/Doors.js +102 -0
- package/dist/roguelike/Doors.js.map +1 -0
- package/dist/roguelike/Elevation.d.ts +26 -0
- package/dist/roguelike/Elevation.d.ts.map +1 -0
- package/dist/roguelike/Elevation.js +37 -0
- package/dist/roguelike/Elevation.js.map +1 -0
- package/dist/roguelike/FieldOfView.d.ts +72 -0
- package/dist/roguelike/FieldOfView.d.ts.map +1 -0
- package/dist/roguelike/FieldOfView.js +134 -0
- package/dist/roguelike/FieldOfView.js.map +1 -0
- package/dist/roguelike/Level.d.ts +96 -0
- package/dist/roguelike/Level.d.ts.map +1 -0
- package/dist/roguelike/Level.js +137 -0
- package/dist/roguelike/Level.js.map +1 -0
- package/dist/roguelike/MonsterAI.d.ts +40 -0
- package/dist/roguelike/MonsterAI.d.ts.map +1 -0
- package/dist/roguelike/MonsterAI.js +69 -0
- package/dist/roguelike/MonsterAI.js.map +1 -0
- package/dist/roguelike/Pathfinder.d.ts +82 -0
- package/dist/roguelike/Pathfinder.d.ts.map +1 -0
- package/dist/roguelike/Pathfinder.js +192 -0
- package/dist/roguelike/Pathfinder.js.map +1 -0
- package/dist/roguelike/Scheduler.d.ts +45 -0
- package/dist/roguelike/Scheduler.d.ts.map +1 -0
- package/dist/roguelike/Scheduler.js +82 -0
- package/dist/roguelike/Scheduler.js.map +1 -0
- package/dist/roguelike/Secrets.d.ts +44 -0
- package/dist/roguelike/Secrets.d.ts.map +1 -0
- package/dist/roguelike/Secrets.js +64 -0
- package/dist/roguelike/Secrets.js.map +1 -0
- package/dist/roguelike/Targeting.d.ts +66 -0
- package/dist/roguelike/Targeting.d.ts.map +1 -0
- package/dist/roguelike/Targeting.js +150 -0
- package/dist/roguelike/Targeting.js.map +1 -0
- package/dist/roguelike/generate.d.ts +44 -0
- package/dist/roguelike/generate.d.ts.map +1 -0
- package/dist/roguelike/generate.js +88 -0
- package/dist/roguelike/generate.js.map +1 -0
- package/dist/roguelike/index.d.ts +23 -0
- package/dist/roguelike/index.d.ts.map +1 -0
- package/dist/roguelike/index.js +15 -0
- package/dist/roguelike/index.js.map +1 -0
- package/dist/rpg/Event.d.ts +33 -0
- package/dist/rpg/Event.d.ts.map +1 -0
- package/dist/rpg/Event.js +19 -0
- package/dist/rpg/Event.js.map +1 -0
- package/dist/rpg/EventRunner.d.ts +72 -0
- package/dist/rpg/EventRunner.d.ts.map +1 -0
- package/dist/rpg/EventRunner.js +76 -0
- package/dist/rpg/EventRunner.js.map +1 -0
- package/dist/rpg/GameState.d.ts +22 -0
- package/dist/rpg/GameState.d.ts.map +1 -0
- package/dist/rpg/GameState.js +35 -0
- package/dist/rpg/GameState.js.map +1 -0
- package/dist/rpg/GridMover.d.ts +51 -0
- package/dist/rpg/GridMover.d.ts.map +1 -0
- package/dist/rpg/GridMover.js +91 -0
- package/dist/rpg/GridMover.js.map +1 -0
- package/dist/rpg/Quest.d.ts +67 -0
- package/dist/rpg/Quest.d.ts.map +1 -0
- package/dist/rpg/Quest.js +92 -0
- package/dist/rpg/Quest.js.map +1 -0
- package/dist/rpg/TiledMap.d.ts +107 -0
- package/dist/rpg/TiledMap.d.ts.map +1 -0
- package/dist/rpg/TiledMap.js +123 -0
- package/dist/rpg/TiledMap.js.map +1 -0
- package/dist/rpg/automap.d.ts +40 -0
- package/dist/rpg/automap.d.ts.map +1 -0
- package/dist/rpg/automap.js +81 -0
- package/dist/rpg/automap.js.map +1 -0
- package/dist/rpg/index.d.ts +14 -0
- package/dist/rpg/index.d.ts.map +1 -0
- package/dist/rpg/index.js +8 -0
- package/dist/rpg/index.js.map +1 -0
- package/dist/stage/DialogueStage.d.ts +75 -0
- package/dist/stage/DialogueStage.d.ts.map +1 -0
- package/dist/stage/DialogueStage.js +207 -0
- package/dist/stage/DialogueStage.js.map +1 -0
- package/dist/stage/index.d.ts +7 -0
- package/dist/stage/index.d.ts.map +1 -0
- package/dist/stage/index.js +4 -0
- package/dist/stage/index.js.map +1 -0
- package/dist/stage/script.d.ts +111 -0
- package/dist/stage/script.d.ts.map +1 -0
- package/dist/stage/script.js +133 -0
- package/dist/stage/script.js.map +1 -0
- package/dist/stage/twee.d.ts +42 -0
- package/dist/stage/twee.d.ts.map +1 -0
- package/dist/stage/twee.js +169 -0
- package/dist/stage/twee.js.map +1 -0
- package/dist/ui/IconGrid.d.ts +110 -0
- package/dist/ui/IconGrid.d.ts.map +1 -0
- package/dist/ui/IconGrid.js +284 -0
- package/dist/ui/IconGrid.js.map +1 -0
- package/dist/ui/Label.d.ts +26 -0
- package/dist/ui/Label.d.ts.map +1 -0
- package/dist/ui/Label.js +41 -0
- package/dist/ui/Label.js.map +1 -0
- package/dist/ui/ListView.d.ts +67 -0
- package/dist/ui/ListView.d.ts.map +1 -0
- package/dist/ui/ListView.js +167 -0
- package/dist/ui/ListView.js.map +1 -0
- package/dist/ui/MessageBox.d.ts +66 -0
- package/dist/ui/MessageBox.d.ts.map +1 -0
- package/dist/ui/MessageBox.js +161 -0
- package/dist/ui/MessageBox.js.map +1 -0
- package/dist/ui/NinePatch.d.ts +34 -0
- package/dist/ui/NinePatch.d.ts.map +1 -0
- package/dist/ui/NinePatch.js +45 -0
- package/dist/ui/NinePatch.js.map +1 -0
- package/dist/ui/VerticalLabel.d.ts +46 -0
- package/dist/ui/VerticalLabel.d.ts.map +1 -0
- package/dist/ui/VerticalLabel.js +81 -0
- package/dist/ui/VerticalLabel.js.map +1 -0
- package/dist/ui/Window.d.ts +71 -0
- package/dist/ui/Window.d.ts.map +1 -0
- package/dist/ui/Window.js +126 -0
- package/dist/ui/Window.js.map +1 -0
- package/dist/ui/WindowStack.d.ts +40 -0
- package/dist/ui/WindowStack.d.ts.map +1 -0
- package/dist/ui/WindowStack.js +106 -0
- package/dist/ui/WindowStack.js.map +1 -0
- package/dist/ui/index.d.ts +18 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +10 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/theme.d.ts +50 -0
- package/dist/ui/theme.d.ts.map +1 -0
- package/dist/ui/theme.js +36 -0
- package/dist/ui/theme.js.map +1 -0
- package/dist/world/Encounters.d.ts +20 -0
- package/dist/world/Encounters.d.ts.map +1 -0
- package/dist/world/Encounters.js +9 -0
- package/dist/world/Encounters.js.map +1 -0
- package/dist/world/Overworld.d.ts +25 -0
- package/dist/world/Overworld.d.ts.map +1 -0
- package/dist/world/Overworld.js +26 -0
- package/dist/world/Overworld.js.map +1 -0
- package/dist/world/TurnClock.d.ts +25 -0
- package/dist/world/TurnClock.d.ts.map +1 -0
- package/dist/world/TurnClock.js +33 -0
- package/dist/world/TurnClock.js.map +1 -0
- package/dist/world/World.d.ts +50 -0
- package/dist/world/World.d.ts.map +1 -0
- package/dist/world/World.js +77 -0
- package/dist/world/World.js.map +1 -0
- package/dist/world/index.d.ts +8 -0
- package/dist/world/index.d.ts.map +1 -0
- package/dist/world/index.js +5 -0
- package/dist/world/index.js.map +1 -0
- package/package.json +76 -0
- package/tools/compile-resources.mjs +129 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { Container } from 'pixi.js';
|
|
2
|
+
export interface GlyphLayout {
|
|
3
|
+
char: string;
|
|
4
|
+
x: number;
|
|
5
|
+
y: number;
|
|
6
|
+
rotate: boolean;
|
|
7
|
+
}
|
|
8
|
+
export interface VerticalLayoutOptions {
|
|
9
|
+
lineHeight: number;
|
|
10
|
+
/** a column wraps to a new one, further left, once it reaches this height */
|
|
11
|
+
columnHeight: number;
|
|
12
|
+
/** characters matching this are rotated a quarter turn rather than kept upright */
|
|
13
|
+
rotate?: RegExp;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* The pure layout math behind `VerticalLabel`, kept separate from Pixi's `Text` so it can
|
|
17
|
+
* be tested without a canvas - `Text` needs a real `document` to measure glyphs, which does
|
|
18
|
+
* not exist outside a browser.
|
|
19
|
+
*
|
|
20
|
+
* Columns run right to left, each one top to bottom, which is the traditional order for
|
|
21
|
+
* vertical Japanese and Chinese. `\n` in the source text forces a new column, the same way
|
|
22
|
+
* it forces a new line in horizontal text.
|
|
23
|
+
*/
|
|
24
|
+
export declare function layoutVertical(text: string, options: VerticalLayoutOptions): GlyphLayout[];
|
|
25
|
+
export interface VerticalLabelOptions {
|
|
26
|
+
text: string;
|
|
27
|
+
color?: number;
|
|
28
|
+
size?: number;
|
|
29
|
+
columnHeight: number;
|
|
30
|
+
rotate?: RegExp;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Text laid out top to bottom, column by column, right to left - vertical writing, which
|
|
34
|
+
* canvas has no writing-mode for at all. Each character is its own `Text`, positioned by
|
|
35
|
+
* `layoutVertical`; this is real per-glyph work, not a flag, which is why the README
|
|
36
|
+
* schedules it separately from left-to-right/right-to-left (see `mwg/i18n`).
|
|
37
|
+
*
|
|
38
|
+
* What this does not do: tate-chu-yoko (shrinking a short latin/digit run to sit upright
|
|
39
|
+
* within one column instead of rotating whole characters), and it does not reposition
|
|
40
|
+
* punctuation to a cell's corner the way professionally typeset Japanese does. Both are
|
|
41
|
+
* real refinements a native reader would want on top of this, not included here.
|
|
42
|
+
*/
|
|
43
|
+
export declare class VerticalLabel extends Container {
|
|
44
|
+
constructor(options: VerticalLabelOptions);
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=VerticalLabel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VerticalLabel.d.ts","sourceRoot":"","sources":["../../src/ui/VerticalLabel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAQ,MAAM,SAAS,CAAC;AAG1C,MAAM,WAAW,WAAW;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,MAAM,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,6EAA6E;IAC7E,YAAY,EAAE,MAAM,CAAC;IACrB,mFAAmF;IACnF,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAKD;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,GAAG,WAAW,EAAE,CAiC1F;AAED,MAAM,WAAW,oBAAoB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;GAUG;AACH,qBAAa,aAAc,SAAQ,SAAS;IAC3C,YAAY,OAAO,EAAE,oBAAoB,EA2BxC;CACD"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { Container, Text } from 'pixi.js';
|
|
2
|
+
import { theme } from './theme.js';
|
|
3
|
+
/** ASCII letters and digits read sideways in vertical Japanese/Chinese text by default */
|
|
4
|
+
const DEFAULT_ROTATE = /[A-Za-z0-9]/;
|
|
5
|
+
/**
|
|
6
|
+
* The pure layout math behind `VerticalLabel`, kept separate from Pixi's `Text` so it can
|
|
7
|
+
* be tested without a canvas - `Text` needs a real `document` to measure glyphs, which does
|
|
8
|
+
* not exist outside a browser.
|
|
9
|
+
*
|
|
10
|
+
* Columns run right to left, each one top to bottom, which is the traditional order for
|
|
11
|
+
* vertical Japanese and Chinese. `\n` in the source text forces a new column, the same way
|
|
12
|
+
* it forces a new line in horizontal text.
|
|
13
|
+
*/
|
|
14
|
+
export function layoutVertical(text, options) {
|
|
15
|
+
const { lineHeight, columnHeight } = options;
|
|
16
|
+
const rotate = options.rotate ?? DEFAULT_ROTATE;
|
|
17
|
+
const glyphs = [];
|
|
18
|
+
let column = 0;
|
|
19
|
+
let row = 0;
|
|
20
|
+
for (const char of text) {
|
|
21
|
+
if (char === '\n') {
|
|
22
|
+
column++;
|
|
23
|
+
row = 0;
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
if (row * lineHeight >= columnHeight) {
|
|
27
|
+
column++;
|
|
28
|
+
row = 0;
|
|
29
|
+
}
|
|
30
|
+
const doRotate = rotate.test(char);
|
|
31
|
+
//`column` is 0 at the start; -0 * lineHeight is still -0, which is never a value worth
|
|
32
|
+
//exposing over a plain 0
|
|
33
|
+
const columnX = column === 0 ? 0 : -column * lineHeight;
|
|
34
|
+
glyphs.push({
|
|
35
|
+
char,
|
|
36
|
+
x: doRotate ? columnX - lineHeight / 2 : columnX,
|
|
37
|
+
y: doRotate ? row * lineHeight + lineHeight / 2 : row * lineHeight,
|
|
38
|
+
rotate: doRotate,
|
|
39
|
+
});
|
|
40
|
+
row++;
|
|
41
|
+
}
|
|
42
|
+
return glyphs;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Text laid out top to bottom, column by column, right to left - vertical writing, which
|
|
46
|
+
* canvas has no writing-mode for at all. Each character is its own `Text`, positioned by
|
|
47
|
+
* `layoutVertical`; this is real per-glyph work, not a flag, which is why the README
|
|
48
|
+
* schedules it separately from left-to-right/right-to-left (see `mwg/i18n`).
|
|
49
|
+
*
|
|
50
|
+
* What this does not do: tate-chu-yoko (shrinking a short latin/digit run to sit upright
|
|
51
|
+
* within one column instead of rotating whole characters), and it does not reposition
|
|
52
|
+
* punctuation to a cell's corner the way professionally typeset Japanese does. Both are
|
|
53
|
+
* real refinements a native reader would want on top of this, not included here.
|
|
54
|
+
*/
|
|
55
|
+
export class VerticalLabel extends Container {
|
|
56
|
+
constructor(options) {
|
|
57
|
+
super();
|
|
58
|
+
const t = theme();
|
|
59
|
+
const size = options.size ?? t.font.size;
|
|
60
|
+
const lineHeight = Math.ceil(size * t.font.lineHeight);
|
|
61
|
+
const glyphs = layoutVertical(options.text, {
|
|
62
|
+
lineHeight,
|
|
63
|
+
columnHeight: options.columnHeight,
|
|
64
|
+
rotate: options.rotate,
|
|
65
|
+
});
|
|
66
|
+
for (const glyph of glyphs) {
|
|
67
|
+
const text = new Text({
|
|
68
|
+
text: glyph.char,
|
|
69
|
+
style: { fontFamily: t.font.family, fontSize: size, fill: options.color ?? t.color.text },
|
|
70
|
+
});
|
|
71
|
+
if (glyph.rotate) {
|
|
72
|
+
text.anchor.set(0.5);
|
|
73
|
+
text.rotation = Math.PI / 2;
|
|
74
|
+
}
|
|
75
|
+
text.x = glyph.x;
|
|
76
|
+
text.y = glyph.y;
|
|
77
|
+
this.addChild(text);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=VerticalLabel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VerticalLabel.js","sourceRoot":"","sources":["../../src/ui/VerticalLabel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { Container } from 'pixi.js';
|
|
2
|
+
import { Signal } from '../core/Signal.ts';
|
|
3
|
+
import type { Action } from '../core/Input.ts';
|
|
4
|
+
export interface WindowOptions {
|
|
5
|
+
width: number;
|
|
6
|
+
height: number;
|
|
7
|
+
title?: string;
|
|
8
|
+
/** a modal window swallows input; anything below it stops responding */
|
|
9
|
+
modal?: boolean;
|
|
10
|
+
/** whether `cancel` closes it; false for a window that must be answered */
|
|
11
|
+
closable?: boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Whether the world behind is dimmed. Defaults to true for a modal window.
|
|
14
|
+
*
|
|
15
|
+
* A dialogue box over a conversation scene is the case for false: it takes the input
|
|
16
|
+
* like any modal, but the scene behind it is what the player is meant to be looking at,
|
|
17
|
+
* so dimming it would be backwards.
|
|
18
|
+
*/
|
|
19
|
+
dims?: boolean;
|
|
20
|
+
/** where the stack puts it; 'bottom' is the usual place for a dialogue box */
|
|
21
|
+
anchor?: 'center' | 'bottom' | 'top';
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* A panel with a frame, a title and a content area.
|
|
25
|
+
*
|
|
26
|
+
* Windows are the interface: inventory, dialogue, character sheets, confirmations. They
|
|
27
|
+
* live in a `WindowStack`, which decides which one has the keyboard.
|
|
28
|
+
*
|
|
29
|
+
* Contents go in `content`, whose origin is already inset past the frame and padding, so a
|
|
30
|
+
* child placed at 0,0 sits correctly whatever the theme's border is.
|
|
31
|
+
*/
|
|
32
|
+
export declare class Window extends Container {
|
|
33
|
+
readonly content: Container<import("pixi.js").ContainerChild>;
|
|
34
|
+
readonly onClose: Signal<void>;
|
|
35
|
+
readonly modal: boolean;
|
|
36
|
+
readonly closable: boolean;
|
|
37
|
+
readonly dims: boolean;
|
|
38
|
+
readonly anchor: 'center' | 'bottom' | 'top';
|
|
39
|
+
private background;
|
|
40
|
+
private titleLabel;
|
|
41
|
+
private innerWidth;
|
|
42
|
+
private innerHeight;
|
|
43
|
+
constructor(options: WindowOptions);
|
|
44
|
+
resize(width: number, height: number): void;
|
|
45
|
+
/** the space available inside the frame, which is what contents should lay out against */
|
|
46
|
+
get contentWidth(): number;
|
|
47
|
+
get contentHeight(): number;
|
|
48
|
+
setTitle(text: string): void;
|
|
49
|
+
/**
|
|
50
|
+
* A widget offered actions before the window itself sees them.
|
|
51
|
+
*
|
|
52
|
+
* Set it to the list or field the window exists to show. Without it, every window
|
|
53
|
+
* holding a widget has to override `handleAction` just to forward, which is noise at
|
|
54
|
+
* best and, done by assigning over the method, a trap.
|
|
55
|
+
*/
|
|
56
|
+
delegate: {
|
|
57
|
+
handleAction(action: Action): boolean;
|
|
58
|
+
} | null;
|
|
59
|
+
/**
|
|
60
|
+
* Offered every action while this window is on top of the stack.
|
|
61
|
+
*
|
|
62
|
+
* @returns true if the window used it, which stops it going any further down
|
|
63
|
+
*/
|
|
64
|
+
handleAction(action: Action): boolean;
|
|
65
|
+
/** called each frame while this window is the top of the stack */
|
|
66
|
+
update(_dt: number): void;
|
|
67
|
+
close(): void;
|
|
68
|
+
/** positions the window in a viewport of the given size, per its anchor */
|
|
69
|
+
place(viewportWidth: number, viewportHeight: number): void;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=Window.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Window.d.ts","sourceRoot":"","sources":["../../src/ui/Window.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAY,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAK/C,MAAM,WAAW,aAAa;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,wEAAwE;IACxE,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf,8EAA8E;IAC9E,MAAM,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,KAAK,CAAC;CACrC;AAED;;;;;;;;GAQG;AACH,qBAAa,MAAO,SAAQ,SAAS;IACpC,QAAQ,CAAC,OAAO,8CAAmB;IACnC,QAAQ,CAAC,OAAO,eAAsB;IAEtC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,KAAK,CAAC;IAE7C,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,UAAU,CAAsB;IAExC,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,WAAW,CAAK;IAExB,YAAY,OAAO,EAAE,aAAa,EAyBjC;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CA2B1C;IAED,0FAA0F;IAC1F,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE3B;IAED;;;;;;OAMG;IACH,QAAQ,EAAE;QAAE,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,GAAG,IAAI,CAAQ;IAElE;;;;OAIG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAQpC;IAED,kEAAkE;IAClE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAExB;IAED,KAAK,IAAI,IAAI,CAIZ;IAED,2EAA2E;IAC3E,KAAK,CAAC,aAAa,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,IAAI,CAazD;CACD"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { Container, Graphics } from 'pixi.js';
|
|
2
|
+
import { Signal } from '../core/Signal.js';
|
|
3
|
+
import { NinePatch } from './NinePatch.js';
|
|
4
|
+
import { Label } from './Label.js';
|
|
5
|
+
import { theme } from './theme.js';
|
|
6
|
+
/**
|
|
7
|
+
* A panel with a frame, a title and a content area.
|
|
8
|
+
*
|
|
9
|
+
* Windows are the interface: inventory, dialogue, character sheets, confirmations. They
|
|
10
|
+
* live in a `WindowStack`, which decides which one has the keyboard.
|
|
11
|
+
*
|
|
12
|
+
* Contents go in `content`, whose origin is already inset past the frame and padding, so a
|
|
13
|
+
* child placed at 0,0 sits correctly whatever the theme's border is.
|
|
14
|
+
*/
|
|
15
|
+
export class Window extends Container {
|
|
16
|
+
constructor(options) {
|
|
17
|
+
super();
|
|
18
|
+
this.content = new Container();
|
|
19
|
+
this.onClose = new Signal();
|
|
20
|
+
this.titleLabel = null;
|
|
21
|
+
this.innerWidth = 0;
|
|
22
|
+
this.innerHeight = 0;
|
|
23
|
+
/**
|
|
24
|
+
* A widget offered actions before the window itself sees them.
|
|
25
|
+
*
|
|
26
|
+
* Set it to the list or field the window exists to show. Without it, every window
|
|
27
|
+
* holding a widget has to override `handleAction` just to forward, which is noise at
|
|
28
|
+
* best and, done by assigning over the method, a trap.
|
|
29
|
+
*/
|
|
30
|
+
this.delegate = null;
|
|
31
|
+
const t = theme();
|
|
32
|
+
this.modal = options.modal ?? true;
|
|
33
|
+
this.closable = options.closable ?? true;
|
|
34
|
+
this.dims = options.dims ?? this.modal;
|
|
35
|
+
this.anchor = options.anchor ?? 'center';
|
|
36
|
+
if (t.panel) {
|
|
37
|
+
this.background = new NinePatch(t.panel, { border: t.panelBorder });
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
//no panel texture: a flat rounded rectangle, so a game is usable before it has
|
|
41
|
+
//any interface art at all
|
|
42
|
+
this.background = new Graphics();
|
|
43
|
+
}
|
|
44
|
+
this.addChild(this.background);
|
|
45
|
+
if (options.title !== undefined) {
|
|
46
|
+
this.titleLabel = new Label({ text: options.title, color: t.color.textHighlight, bold: true });
|
|
47
|
+
this.addChild(this.titleLabel);
|
|
48
|
+
}
|
|
49
|
+
this.addChild(this.content);
|
|
50
|
+
this.resize(options.width, options.height);
|
|
51
|
+
}
|
|
52
|
+
resize(width, height) {
|
|
53
|
+
const t = theme();
|
|
54
|
+
const border = this.background instanceof NinePatch ? this.background.border.left : 2;
|
|
55
|
+
const inset = border + t.padding;
|
|
56
|
+
if (this.background instanceof NinePatch) {
|
|
57
|
+
this.background.resize(width, height);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
this.background
|
|
61
|
+
.clear()
|
|
62
|
+
.roundRect(0, 0, width, height, 4)
|
|
63
|
+
.fill({ color: t.color.panelFill })
|
|
64
|
+
.stroke({ color: t.color.panelBorder, width: 1 });
|
|
65
|
+
}
|
|
66
|
+
let contentTop = inset;
|
|
67
|
+
if (this.titleLabel) {
|
|
68
|
+
this.titleLabel.x = t.direction === 'rtl' ? width - inset - this.titleLabel.width : inset;
|
|
69
|
+
this.titleLabel.y = inset;
|
|
70
|
+
contentTop = inset + this.titleLabel.height + t.padding;
|
|
71
|
+
}
|
|
72
|
+
this.content.x = inset;
|
|
73
|
+
this.content.y = contentTop;
|
|
74
|
+
this.innerWidth = Math.max(0, width - inset * 2);
|
|
75
|
+
this.innerHeight = Math.max(0, height - contentTop - inset);
|
|
76
|
+
}
|
|
77
|
+
/** the space available inside the frame, which is what contents should lay out against */
|
|
78
|
+
get contentWidth() {
|
|
79
|
+
return this.innerWidth;
|
|
80
|
+
}
|
|
81
|
+
get contentHeight() {
|
|
82
|
+
return this.innerHeight;
|
|
83
|
+
}
|
|
84
|
+
setTitle(text) {
|
|
85
|
+
this.titleLabel?.setText(text);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Offered every action while this window is on top of the stack.
|
|
89
|
+
*
|
|
90
|
+
* @returns true if the window used it, which stops it going any further down
|
|
91
|
+
*/
|
|
92
|
+
handleAction(action) {
|
|
93
|
+
if (this.delegate?.handleAction(action))
|
|
94
|
+
return true;
|
|
95
|
+
if (action === 'cancel' && this.closable) {
|
|
96
|
+
this.close();
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
/** called each frame while this window is the top of the stack */
|
|
102
|
+
update(_dt) {
|
|
103
|
+
//most windows are static and need nothing here
|
|
104
|
+
}
|
|
105
|
+
close() {
|
|
106
|
+
this.onClose.dispatch();
|
|
107
|
+
this.parent?.removeChild(this);
|
|
108
|
+
this.destroy({ children: true });
|
|
109
|
+
}
|
|
110
|
+
/** positions the window in a viewport of the given size, per its anchor */
|
|
111
|
+
place(viewportWidth, viewportHeight) {
|
|
112
|
+
const bounds = this.getLocalBounds();
|
|
113
|
+
const margin = theme().padding * 2;
|
|
114
|
+
this.x = Math.round((viewportWidth - bounds.width) / 2);
|
|
115
|
+
if (this.anchor === 'bottom') {
|
|
116
|
+
this.y = Math.round(viewportHeight - bounds.height - margin);
|
|
117
|
+
}
|
|
118
|
+
else if (this.anchor === 'top') {
|
|
119
|
+
this.y = margin;
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
this.y = Math.round((viewportHeight - bounds.height) / 2);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=Window.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Window.js","sourceRoot":"","sources":["../../src/ui/Window.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { Container } from 'pixi.js';
|
|
2
|
+
import type { Window } from './Window.ts';
|
|
3
|
+
/**
|
|
4
|
+
* The stack of open windows, and the arbiter of who has the keyboard.
|
|
5
|
+
*
|
|
6
|
+
* Only the topmost window is offered input. That single rule is what makes nested
|
|
7
|
+
* interfaces behave: opening a confirmation over an inventory means the inventory stops
|
|
8
|
+
* responding until the confirmation is answered, without either window knowing about the
|
|
9
|
+
* other.
|
|
10
|
+
*
|
|
11
|
+
* Below a modal window sits a dimming layer, which is both a visual cue and a hint that
|
|
12
|
+
* the world underneath is not listening.
|
|
13
|
+
*/
|
|
14
|
+
export declare class WindowStack extends Container {
|
|
15
|
+
private windows;
|
|
16
|
+
private overlay;
|
|
17
|
+
private viewportWidth;
|
|
18
|
+
private viewportHeight;
|
|
19
|
+
private listener;
|
|
20
|
+
constructor();
|
|
21
|
+
setViewport(width: number, height: number): void;
|
|
22
|
+
get top(): Window | null;
|
|
23
|
+
get isEmpty(): boolean;
|
|
24
|
+
get depth(): number;
|
|
25
|
+
/** opens a window on top; it takes the keyboard until it closes */
|
|
26
|
+
push(window: Window): Window;
|
|
27
|
+
/** closes the top window, as `cancel` would */
|
|
28
|
+
pop(): void;
|
|
29
|
+
closeAll(): void;
|
|
30
|
+
private forget;
|
|
31
|
+
private updateOverlay;
|
|
32
|
+
private drawOverlay;
|
|
33
|
+
/** @returns true when a window consumed the action */
|
|
34
|
+
private handleAction;
|
|
35
|
+
/** true while any window is open, so the world knows to hold still */
|
|
36
|
+
get blocksWorld(): boolean;
|
|
37
|
+
update(dt: number): void;
|
|
38
|
+
destroy(options?: Parameters<Container['destroy']>[0]): void;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=WindowStack.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WindowStack.d.ts","sourceRoot":"","sources":["../../src/ui/WindowStack.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAY,MAAM,SAAS,CAAC;AAG9C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAG1C;;;;;;;;;;GAUG;AACH,qBAAa,WAAY,SAAQ,SAAS;IACzC,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,OAAO,CAAkB;IAEjC,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,cAAc,CAAK;IAE3B,OAAO,CAAC,QAAQ,CAA0D;IAE1E,cAQC;IAED,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAM/C;IAED,IAAI,GAAG,IAAI,MAAM,GAAG,IAAI,CAEvB;IAED,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,IAAI,KAAK,IAAI,MAAM,CAElB;IAED,mEAAmE;IACnE,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAY3B;IAED,+CAA+C;IAC/C,GAAG,IAAI,IAAI,CAEV;IAED,QAAQ,IAAI,IAAI,CAGf;IAED,OAAO,CAAC,MAAM;IAMd,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,WAAW;IAQnB,sDAAsD;IACtD,OAAO,CAAC,YAAY;IAIpB,sEAAsE;IACtE,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAEvB;IAEQ,OAAO,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAGpE;CACD"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { Container, Graphics } from 'pixi.js';
|
|
2
|
+
import * as Input from '../core/Input.js';
|
|
3
|
+
import { theme } from './theme.js';
|
|
4
|
+
/**
|
|
5
|
+
* The stack of open windows, and the arbiter of who has the keyboard.
|
|
6
|
+
*
|
|
7
|
+
* Only the topmost window is offered input. That single rule is what makes nested
|
|
8
|
+
* interfaces behave: opening a confirmation over an inventory means the inventory stops
|
|
9
|
+
* responding until the confirmation is answered, without either window knowing about the
|
|
10
|
+
* other.
|
|
11
|
+
*
|
|
12
|
+
* Below a modal window sits a dimming layer, which is both a visual cue and a hint that
|
|
13
|
+
* the world underneath is not listening.
|
|
14
|
+
*/
|
|
15
|
+
export class WindowStack extends Container {
|
|
16
|
+
constructor() {
|
|
17
|
+
super();
|
|
18
|
+
this.windows = [];
|
|
19
|
+
this.overlay = new Graphics();
|
|
20
|
+
this.viewportWidth = 0;
|
|
21
|
+
this.viewportHeight = 0;
|
|
22
|
+
this.listener = (action) => this.handleAction(action);
|
|
23
|
+
this.overlay.visible = false;
|
|
24
|
+
this.addChild(this.overlay);
|
|
25
|
+
//stack mode, so this is offered actions before anything registered earlier: a window
|
|
26
|
+
//that is open should always win over the map underneath
|
|
27
|
+
Input.onAction.add(this.listener);
|
|
28
|
+
}
|
|
29
|
+
setViewport(width, height) {
|
|
30
|
+
this.viewportWidth = width;
|
|
31
|
+
this.viewportHeight = height;
|
|
32
|
+
this.drawOverlay();
|
|
33
|
+
for (const window of this.windows)
|
|
34
|
+
window.place(width, height);
|
|
35
|
+
}
|
|
36
|
+
get top() {
|
|
37
|
+
return this.windows[this.windows.length - 1] ?? null;
|
|
38
|
+
}
|
|
39
|
+
get isEmpty() {
|
|
40
|
+
return this.windows.length === 0;
|
|
41
|
+
}
|
|
42
|
+
get depth() {
|
|
43
|
+
return this.windows.length;
|
|
44
|
+
}
|
|
45
|
+
/** opens a window on top; it takes the keyboard until it closes */
|
|
46
|
+
push(window) {
|
|
47
|
+
this.windows.push(window);
|
|
48
|
+
this.addChild(window);
|
|
49
|
+
window.onClose.add(() => {
|
|
50
|
+
this.forget(window);
|
|
51
|
+
return false;
|
|
52
|
+
});
|
|
53
|
+
window.place(this.viewportWidth, this.viewportHeight);
|
|
54
|
+
this.updateOverlay();
|
|
55
|
+
return window;
|
|
56
|
+
}
|
|
57
|
+
/** closes the top window, as `cancel` would */
|
|
58
|
+
pop() {
|
|
59
|
+
this.top?.close();
|
|
60
|
+
}
|
|
61
|
+
closeAll() {
|
|
62
|
+
//iterate a copy: closing a window mutates the list through its onClose handler
|
|
63
|
+
for (const window of [...this.windows].reverse())
|
|
64
|
+
window.close();
|
|
65
|
+
}
|
|
66
|
+
forget(window) {
|
|
67
|
+
const index = this.windows.indexOf(window);
|
|
68
|
+
if (index !== -1)
|
|
69
|
+
this.windows.splice(index, 1);
|
|
70
|
+
this.updateOverlay();
|
|
71
|
+
}
|
|
72
|
+
updateOverlay() {
|
|
73
|
+
//the overlay sits directly beneath the lowest window that asks to dim, so windows
|
|
74
|
+
//above it stay lit and the world below is dimmed exactly once however many are open
|
|
75
|
+
const firstModal = this.windows.findIndex((window) => window.dims);
|
|
76
|
+
if (firstModal === -1) {
|
|
77
|
+
this.overlay.visible = false;
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
this.overlay.visible = true;
|
|
81
|
+
this.setChildIndex(this.overlay, Math.max(0, this.getChildIndex(this.windows[firstModal]) - 1));
|
|
82
|
+
}
|
|
83
|
+
drawOverlay() {
|
|
84
|
+
const t = theme();
|
|
85
|
+
this.overlay
|
|
86
|
+
.clear()
|
|
87
|
+
.rect(0, 0, this.viewportWidth, this.viewportHeight)
|
|
88
|
+
.fill({ color: t.color.overlay, alpha: t.overlayAlpha });
|
|
89
|
+
}
|
|
90
|
+
/** @returns true when a window consumed the action */
|
|
91
|
+
handleAction(action) {
|
|
92
|
+
return this.top?.handleAction(action) ?? false;
|
|
93
|
+
}
|
|
94
|
+
/** true while any window is open, so the world knows to hold still */
|
|
95
|
+
get blocksWorld() {
|
|
96
|
+
return this.windows.some((window) => window.modal);
|
|
97
|
+
}
|
|
98
|
+
update(dt) {
|
|
99
|
+
this.top?.update(dt);
|
|
100
|
+
}
|
|
101
|
+
destroy(options) {
|
|
102
|
+
Input.onAction.remove(this.listener);
|
|
103
|
+
super.destroy(options);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=WindowStack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WindowStack.js","sourceRoot":"","sources":["../../src/ui/WindowStack.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export { theme, setTheme, defaultTheme } from './theme.ts';
|
|
2
|
+
export type { Theme } from './theme.ts';
|
|
3
|
+
export { Label } from './Label.ts';
|
|
4
|
+
export type { LabelOptions } from './Label.ts';
|
|
5
|
+
export { NinePatch } from './NinePatch.ts';
|
|
6
|
+
export type { NinePatchOptions } from './NinePatch.ts';
|
|
7
|
+
export { Window } from './Window.ts';
|
|
8
|
+
export type { WindowOptions } from './Window.ts';
|
|
9
|
+
export { WindowStack } from './WindowStack.ts';
|
|
10
|
+
export { ListView } from './ListView.ts';
|
|
11
|
+
export type { ListItem, ListViewOptions } from './ListView.ts';
|
|
12
|
+
export { IconGrid } from './IconGrid.ts';
|
|
13
|
+
export type { IconGridItem, IconGridOptions } from './IconGrid.ts';
|
|
14
|
+
export { MessageBox } from './MessageBox.ts';
|
|
15
|
+
export type { MessageBoxOptions, MessagePage, Choice } from './MessageBox.ts';
|
|
16
|
+
export { VerticalLabel, layoutVertical } from './VerticalLabel.ts';
|
|
17
|
+
export type { VerticalLabelOptions, VerticalLayoutOptions, GlyphLayout } from './VerticalLabel.ts';
|
|
18
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC3D,YAAY,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAE/D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEnE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAE9E,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACnE,YAAY,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC"}
|
package/dist/ui/index.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { theme, setTheme, defaultTheme } from './theme.js';
|
|
2
|
+
export { Label } from './Label.js';
|
|
3
|
+
export { NinePatch } from './NinePatch.js';
|
|
4
|
+
export { Window } from './Window.js';
|
|
5
|
+
export { WindowStack } from './WindowStack.js';
|
|
6
|
+
export { ListView } from './ListView.js';
|
|
7
|
+
export { IconGrid } from './IconGrid.js';
|
|
8
|
+
export { MessageBox } from './MessageBox.js';
|
|
9
|
+
export { VerticalLabel, layoutVertical } from './VerticalLabel.js';
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG3D,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAGnC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAG3C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAGzC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAGzC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG7C,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { Texture } from 'pixi.js';
|
|
2
|
+
import type { Direction } from '../i18n/index.ts';
|
|
3
|
+
/**
|
|
4
|
+
* How the interface looks.
|
|
5
|
+
*
|
|
6
|
+
* Widgets read from here rather than carrying their own colours, so a game restyles its
|
|
7
|
+
* whole interface by assigning one object. Everything has a default that works, so a game
|
|
8
|
+
* that does not care never has to think about it.
|
|
9
|
+
*/
|
|
10
|
+
export interface Theme {
|
|
11
|
+
/** the panel texture behind windows; without one, windows draw a flat rectangle */
|
|
12
|
+
panel?: Texture;
|
|
13
|
+
/** how many pixels of `panel` are its fixed border */
|
|
14
|
+
panelBorder: number;
|
|
15
|
+
/** space between a window's frame and its contents */
|
|
16
|
+
padding: number;
|
|
17
|
+
/** space between stacked items in a list */
|
|
18
|
+
spacing: number;
|
|
19
|
+
font: {
|
|
20
|
+
family: string;
|
|
21
|
+
size: number;
|
|
22
|
+
/** distance between baselines, as a multiple of size */
|
|
23
|
+
lineHeight: number;
|
|
24
|
+
};
|
|
25
|
+
color: {
|
|
26
|
+
text: number;
|
|
27
|
+
textDim: number;
|
|
28
|
+
textHighlight: number;
|
|
29
|
+
/** used for the flat panel when no texture is set */
|
|
30
|
+
panelFill: number;
|
|
31
|
+
panelBorder: number;
|
|
32
|
+
selection: number;
|
|
33
|
+
/** the dim layer behind a modal window */
|
|
34
|
+
overlay: number;
|
|
35
|
+
};
|
|
36
|
+
/** opacity of the layer behind a modal window, 0 to 1 */
|
|
37
|
+
overlayAlpha: number;
|
|
38
|
+
/**
|
|
39
|
+
* What widgets lay themselves out against, instead of a hardcoded "left".
|
|
40
|
+
*
|
|
41
|
+
* A game with `mwg/i18n` sets this from `I18n.direction()` whenever the active language
|
|
42
|
+
* changes; a game without it never has to think about the field at all.
|
|
43
|
+
*/
|
|
44
|
+
direction: Direction;
|
|
45
|
+
}
|
|
46
|
+
export declare const defaultTheme: Theme;
|
|
47
|
+
export declare function theme(): Theme;
|
|
48
|
+
/** replaces the theme; partial objects are merged over the default */
|
|
49
|
+
export declare function setTheme(next: Partial<Theme>): void;
|
|
50
|
+
//# sourceMappingURL=theme.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../src/ui/theme.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD;;;;;;GAMG;AACH,MAAM,WAAW,KAAK;IACrB,mFAAmF;IACnF,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB,sDAAsD;IACtD,WAAW,EAAE,MAAM,CAAC;IAEpB,sDAAsD;IACtD,OAAO,EAAE,MAAM,CAAC;IAEhB,4CAA4C;IAC5C,OAAO,EAAE,MAAM,CAAC;IAEhB,IAAI,EAAE;QACL,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,wDAAwD;QACxD,UAAU,EAAE,MAAM,CAAC;KACnB,CAAC;IAEF,KAAK,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,aAAa,EAAE,MAAM,CAAC;QACtB,qDAAqD;QACrD,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,0CAA0C;QAC1C,OAAO,EAAE,MAAM,CAAC;KAChB,CAAC;IAEF,yDAAyD;IACzD,YAAY,EAAE,MAAM,CAAC;IAErB;;;;;OAKG;IACH,SAAS,EAAE,SAAS,CAAC;CACrB;AAED,eAAO,MAAM,YAAY,EAAE,KAqB1B,CAAC;AAIF,wBAAgB,KAAK,IAAI,KAAK,CAE7B;AAED,sEAAsE;AACtE,wBAAgB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAOnD"}
|
package/dist/ui/theme.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export const defaultTheme = {
|
|
2
|
+
panelBorder: 4,
|
|
3
|
+
padding: 8,
|
|
4
|
+
spacing: 2,
|
|
5
|
+
direction: 'ltr',
|
|
6
|
+
font: {
|
|
7
|
+
//a stack rather than one name, so a missing font degrades instead of disappearing
|
|
8
|
+
family: 'ui-monospace, Consolas, "DejaVu Sans Mono", monospace',
|
|
9
|
+
size: 12,
|
|
10
|
+
lineHeight: 1.4,
|
|
11
|
+
},
|
|
12
|
+
color: {
|
|
13
|
+
text: 0xe8e8f0,
|
|
14
|
+
textDim: 0x8a8a96,
|
|
15
|
+
textHighlight: 0xffe680,
|
|
16
|
+
panelFill: 0x1c1c26,
|
|
17
|
+
panelBorder: 0x4a4a5e,
|
|
18
|
+
selection: 0x3a4a7a,
|
|
19
|
+
overlay: 0x000000,
|
|
20
|
+
},
|
|
21
|
+
overlayAlpha: 0.5,
|
|
22
|
+
};
|
|
23
|
+
let current = defaultTheme;
|
|
24
|
+
export function theme() {
|
|
25
|
+
return current;
|
|
26
|
+
}
|
|
27
|
+
/** replaces the theme; partial objects are merged over the default */
|
|
28
|
+
export function setTheme(next) {
|
|
29
|
+
current = {
|
|
30
|
+
...defaultTheme,
|
|
31
|
+
...next,
|
|
32
|
+
font: { ...defaultTheme.font, ...next.font },
|
|
33
|
+
color: { ...defaultTheme.color, ...next.color },
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=theme.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/ui/theme.ts"],"names":[],"mappings":"AAsDA,MAAM,CAAC,MAAM,YAAY,GAAU;IAClC,WAAW,EAAE,CAAC;IACd,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,CAAC;IACV,SAAS,EAAE,KAAK;IAChB,IAAI,EAAE;QACL,kFAAkF;QAClF,MAAM,EAAE,uDAAuD;QAC/D,IAAI,EAAE,EAAE;QACR,UAAU,EAAE,GAAG;KACf;IACD,KAAK,EAAE;QACN,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,QAAQ;QACjB,aAAa,EAAE,QAAQ;QACvB,SAAS,EAAE,QAAQ;QACnB,WAAW,EAAE,QAAQ;QACrB,SAAS,EAAE,QAAQ;QACnB,OAAO,EAAE,QAAQ;KACjB;IACD,YAAY,EAAE,GAAG;CACjB,CAAC;AAEF,IAAI,OAAO,GAAU,YAAY,CAAC;AAElC,MAAM,UAAU,KAAK;IACpB,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,QAAQ,CAAC,IAAoB;IAC5C,OAAO,GAAG;QACT,GAAG,YAAY;QACf,GAAG,IAAI;QACP,IAAI,EAAE,EAAE,GAAG,YAAY,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE;QAC5C,KAAK,EAAE,EAAE,GAAG,YAAY,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE;KAC/C,CAAC;AACH,CAAC"}
|