@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
package/dist/ui/Label.js
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Text, TextStyle } from 'pixi.js';
|
|
2
|
+
import { theme } from './theme.js';
|
|
3
|
+
/**
|
|
4
|
+
* A piece of text, styled from the theme.
|
|
5
|
+
*
|
|
6
|
+
* This is a thin wrapper over Pixi's `Text`, and its job is to stop every call site from
|
|
7
|
+
* repeating a style object. Pixi renders text to its own texture, so changing the string
|
|
8
|
+
* costs a re-render — cheap enough for a label, wasteful for something updated every
|
|
9
|
+
* frame, where a value that only changes on whole numbers should be guarded.
|
|
10
|
+
*/
|
|
11
|
+
export class Label extends Text {
|
|
12
|
+
constructor(options = {}) {
|
|
13
|
+
const opts = typeof options === 'string' ? { text: options } : options;
|
|
14
|
+
const t = theme();
|
|
15
|
+
super({
|
|
16
|
+
text: opts.text ?? '',
|
|
17
|
+
style: new TextStyle({
|
|
18
|
+
fontFamily: t.font.family,
|
|
19
|
+
fontSize: opts.size ?? t.font.size,
|
|
20
|
+
fontWeight: opts.bold ? 'bold' : 'normal',
|
|
21
|
+
fill: opts.color ?? t.color.text,
|
|
22
|
+
lineHeight: (opts.size ?? t.font.size) * t.font.lineHeight,
|
|
23
|
+
align: opts.align ?? (t.direction === 'rtl' ? 'right' : 'left'),
|
|
24
|
+
wordWrap: opts.wrapWidth !== undefined,
|
|
25
|
+
wordWrapWidth: opts.wrapWidth ?? 0,
|
|
26
|
+
//without this a long unbroken word overflows its window instead of wrapping
|
|
27
|
+
breakWords: true,
|
|
28
|
+
}),
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
/** changes the colour without rebuilding the style object */
|
|
32
|
+
setColor(color) {
|
|
33
|
+
this.style.fill = color;
|
|
34
|
+
}
|
|
35
|
+
/** avoids the re-render when the text has not actually changed */
|
|
36
|
+
setText(value) {
|
|
37
|
+
if (this.text !== value)
|
|
38
|
+
this.text = value;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=Label.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Label.js","sourceRoot":"","sources":["../../src/ui/Label.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAYnC;;;;;;;GAOG;AACH,MAAM,OAAO,KAAM,SAAQ,IAAI;IAC9B,YAAY,OAAO,GAA0B,EAAE;QAC9C,MAAM,IAAI,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QACvE,MAAM,CAAC,GAAG,KAAK,EAAE,CAAC;QAElB,KAAK,CAAC;YACL,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE;YACrB,KAAK,EAAE,IAAI,SAAS,CAAC;gBACpB,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM;gBACzB,QAAQ,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI;gBAClC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ;gBACzC,IAAI,EAAE,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI;gBAChC,UAAU,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU;gBAC1D,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;gBAC/D,QAAQ,EAAE,IAAI,CAAC,SAAS,KAAK,SAAS;gBACtC,aAAa,EAAE,IAAI,CAAC,SAAS,IAAI,CAAC;gBAClC,4EAA4E;gBAC5E,UAAU,EAAE,IAAI;aAChB,CAAC;SACF,CAAC,CAAC;IACJ,CAAC;IAED,6DAA6D;IAC7D,QAAQ,CAAC,KAAa;QACrB,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC;IACzB,CAAC;IAED,kEAAkE;IAClE,OAAO,CAAC,KAAa;QACpB,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK;YAAE,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;IAC5C,CAAC;CACD"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { Container } from 'pixi.js';
|
|
2
|
+
import type { Action } from '../core/Input.ts';
|
|
3
|
+
export interface ListItem {
|
|
4
|
+
/** what the row reads */
|
|
5
|
+
text: string;
|
|
6
|
+
/** a greyed-out row can be looked at but not chosen */
|
|
7
|
+
disabled?: boolean;
|
|
8
|
+
/** anything the game wants to get back when the row is chosen */
|
|
9
|
+
value?: unknown;
|
|
10
|
+
/** an icon drawn to the left of the text; sized to the row height */
|
|
11
|
+
icon?: Container;
|
|
12
|
+
}
|
|
13
|
+
export interface ListViewOptions {
|
|
14
|
+
width: number;
|
|
15
|
+
height: number;
|
|
16
|
+
items?: ListItem[];
|
|
17
|
+
/** row height; defaults to the theme's line height */
|
|
18
|
+
rowHeight?: number;
|
|
19
|
+
onSelect?: (item: ListItem, index: number) => void;
|
|
20
|
+
onHighlight?: (item: ListItem, index: number) => void;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* A scrolling list of rows, driven by the keyboard.
|
|
24
|
+
*
|
|
25
|
+
* This is the workhorse of an inventory-heavy game: bags, spell lists, shop stock,
|
|
26
|
+
* dialogue choices, save slots. It scrolls by keeping the highlight in view rather than by
|
|
27
|
+
* pixel offset, which is what makes it feel right with a keyboard — the list moves only
|
|
28
|
+
* when the selection would otherwise leave the window.
|
|
29
|
+
*
|
|
30
|
+
* Rows that are `disabled` are skipped when moving, so holding a direction never lands on
|
|
31
|
+
* something unusable.
|
|
32
|
+
*/
|
|
33
|
+
export declare class ListView extends Container {
|
|
34
|
+
private items;
|
|
35
|
+
private rows;
|
|
36
|
+
private rowsLayer;
|
|
37
|
+
private highlight;
|
|
38
|
+
private mask_;
|
|
39
|
+
private viewWidth;
|
|
40
|
+
private viewHeight;
|
|
41
|
+
private rowHeight;
|
|
42
|
+
private index;
|
|
43
|
+
private scroll;
|
|
44
|
+
onSelect: ((item: ListItem, index: number) => void) | null;
|
|
45
|
+
onHighlight: ((item: ListItem, index: number) => void) | null;
|
|
46
|
+
constructor(options: ListViewOptions);
|
|
47
|
+
private drawMask;
|
|
48
|
+
get visibleRows(): number;
|
|
49
|
+
get selectedIndex(): number;
|
|
50
|
+
get selected(): ListItem | null;
|
|
51
|
+
get length(): number;
|
|
52
|
+
setItems(items: ListItem[]): void;
|
|
53
|
+
resize(width: number, height: number): void;
|
|
54
|
+
/**
|
|
55
|
+
* Moves the highlight by `delta` rows, skipping disabled ones.
|
|
56
|
+
*
|
|
57
|
+
* Wraps at both ends, which is what a short menu wants. Returns false when there is
|
|
58
|
+
* nothing selectable to move to, so a caller can beep rather than doing nothing.
|
|
59
|
+
*/
|
|
60
|
+
move(delta: number): boolean;
|
|
61
|
+
select(index: number): void;
|
|
62
|
+
confirm(): boolean;
|
|
63
|
+
/** @returns true when the action was used */
|
|
64
|
+
handleAction(action: Action): boolean;
|
|
65
|
+
private refresh;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=ListView.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ListView.d.ts","sourceRoot":"","sources":["../../src/ui/ListView.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAY,MAAM,SAAS,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAI/C,MAAM,WAAW,QAAQ;IACxB,yBAAyB;IACzB,IAAI,EAAE,MAAM,CAAC;IAEb,uDAAuD;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,iEAAiE;IACjE,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB,qEAAqE;IACrE,IAAI,CAAC,EAAE,SAAS,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;IAEnB,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnD,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACtD;AAED;;;;;;;;;;GAUG;AACH,qBAAa,QAAS,SAAQ,SAAS;IACtC,OAAO,CAAC,KAAK,CAAkB;IAC/B,OAAO,CAAC,IAAI,CAAmB;IAE/B,OAAO,CAAC,SAAS,CAAmB;IACpC,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,KAAK,CAAkB;IAE/B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,SAAS,CAAS;IAE1B,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,MAAM,CAAK;IAEnB,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;IAC3D,WAAW,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;IAE9D,YAAY,OAAO,EAAE,eAAe,EAmBnC;IAED,OAAO,CAAC,QAAQ;IAIhB,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED,IAAI,QAAQ,IAAI,QAAQ,GAAG,IAAI,CAE9B;IAED,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI,CAuChC;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAK1C;IAED;;;;;OAKG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAe3B;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAK1B;IAED,OAAO,IAAI,OAAO,CAKjB;IAED,6CAA6C;IAC7C,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAWpC;IAED,OAAO,CAAC,OAAO;CAwBf"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { Container, Graphics } from 'pixi.js';
|
|
2
|
+
import { Label } from './Label.js';
|
|
3
|
+
import { theme } from './theme.js';
|
|
4
|
+
/**
|
|
5
|
+
* A scrolling list of rows, driven by the keyboard.
|
|
6
|
+
*
|
|
7
|
+
* This is the workhorse of an inventory-heavy game: bags, spell lists, shop stock,
|
|
8
|
+
* dialogue choices, save slots. It scrolls by keeping the highlight in view rather than by
|
|
9
|
+
* pixel offset, which is what makes it feel right with a keyboard — the list moves only
|
|
10
|
+
* when the selection would otherwise leave the window.
|
|
11
|
+
*
|
|
12
|
+
* Rows that are `disabled` are skipped when moving, so holding a direction never lands on
|
|
13
|
+
* something unusable.
|
|
14
|
+
*/
|
|
15
|
+
export class ListView extends Container {
|
|
16
|
+
constructor(options) {
|
|
17
|
+
super();
|
|
18
|
+
this.items = [];
|
|
19
|
+
this.rows = [];
|
|
20
|
+
this.rowsLayer = new Container();
|
|
21
|
+
this.highlight = new Graphics();
|
|
22
|
+
this.mask_ = new Graphics();
|
|
23
|
+
this.index = 0;
|
|
24
|
+
this.scroll = 0;
|
|
25
|
+
const t = theme();
|
|
26
|
+
this.viewWidth = options.width;
|
|
27
|
+
this.viewHeight = options.height;
|
|
28
|
+
this.rowHeight = options.rowHeight ?? Math.ceil(t.font.size * t.font.lineHeight) + t.spacing;
|
|
29
|
+
this.onSelect = options.onSelect ?? null;
|
|
30
|
+
this.onHighlight = options.onHighlight ?? null;
|
|
31
|
+
this.addChild(this.highlight);
|
|
32
|
+
this.addChild(this.rowsLayer);
|
|
33
|
+
//rows outside the window are clipped rather than drawn over the frame
|
|
34
|
+
this.addChild(this.mask_);
|
|
35
|
+
this.rowsLayer.mask = this.mask_;
|
|
36
|
+
this.drawMask();
|
|
37
|
+
this.setItems(options.items ?? []);
|
|
38
|
+
}
|
|
39
|
+
drawMask() {
|
|
40
|
+
this.mask_.clear().rect(0, 0, this.viewWidth, this.viewHeight).fill({ color: 0xffffff });
|
|
41
|
+
}
|
|
42
|
+
get visibleRows() {
|
|
43
|
+
return Math.max(1, Math.floor(this.viewHeight / this.rowHeight));
|
|
44
|
+
}
|
|
45
|
+
get selectedIndex() {
|
|
46
|
+
return this.index;
|
|
47
|
+
}
|
|
48
|
+
get selected() {
|
|
49
|
+
return this.items[this.index] ?? null;
|
|
50
|
+
}
|
|
51
|
+
get length() {
|
|
52
|
+
return this.items.length;
|
|
53
|
+
}
|
|
54
|
+
setItems(items) {
|
|
55
|
+
this.items = items;
|
|
56
|
+
for (const row of this.rows)
|
|
57
|
+
row.destroy({ children: true });
|
|
58
|
+
this.rows = [];
|
|
59
|
+
this.rowsLayer.removeChildren();
|
|
60
|
+
const t = theme();
|
|
61
|
+
//in rtl the icon moves to the right edge and the text sits to its left, ending at
|
|
62
|
+
//the same distance from that edge the ltr text starts from the left one
|
|
63
|
+
const rtl = t.direction === 'rtl';
|
|
64
|
+
items.forEach((item, i) => {
|
|
65
|
+
const row = new Container();
|
|
66
|
+
row.y = i * this.rowHeight;
|
|
67
|
+
if (item.icon) {
|
|
68
|
+
item.icon.x = rtl ? this.viewWidth - t.spacing - this.rowHeight : t.spacing;
|
|
69
|
+
row.addChild(item.icon);
|
|
70
|
+
}
|
|
71
|
+
const label = new Label({
|
|
72
|
+
text: item.text,
|
|
73
|
+
color: item.disabled ? t.color.textDim : t.color.text,
|
|
74
|
+
});
|
|
75
|
+
const textStart = t.spacing + (item.icon ? this.rowHeight : 0);
|
|
76
|
+
label.x = rtl ? this.viewWidth - textStart - label.width : textStart;
|
|
77
|
+
//centre the text in its row rather than sitting it on the top edge
|
|
78
|
+
label.y = Math.round((this.rowHeight - label.height) / 2);
|
|
79
|
+
row.addChild(label);
|
|
80
|
+
this.rows.push(row);
|
|
81
|
+
this.rowsLayer.addChild(row);
|
|
82
|
+
});
|
|
83
|
+
this.index = this.items.findIndex((item) => !item.disabled);
|
|
84
|
+
if (this.index === -1)
|
|
85
|
+
this.index = 0;
|
|
86
|
+
this.scroll = 0;
|
|
87
|
+
this.refresh();
|
|
88
|
+
}
|
|
89
|
+
resize(width, height) {
|
|
90
|
+
this.viewWidth = width;
|
|
91
|
+
this.viewHeight = height;
|
|
92
|
+
this.drawMask();
|
|
93
|
+
this.refresh();
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Moves the highlight by `delta` rows, skipping disabled ones.
|
|
97
|
+
*
|
|
98
|
+
* Wraps at both ends, which is what a short menu wants. Returns false when there is
|
|
99
|
+
* nothing selectable to move to, so a caller can beep rather than doing nothing.
|
|
100
|
+
*/
|
|
101
|
+
move(delta) {
|
|
102
|
+
if (this.items.length === 0)
|
|
103
|
+
return false;
|
|
104
|
+
let next = this.index;
|
|
105
|
+
//at most one full pass, so a list of entirely disabled rows terminates
|
|
106
|
+
for (let step = 0; step < this.items.length; step++) {
|
|
107
|
+
next = (next + delta + this.items.length) % this.items.length;
|
|
108
|
+
if (!this.items[next].disabled) {
|
|
109
|
+
this.index = next;
|
|
110
|
+
this.refresh();
|
|
111
|
+
this.onHighlight?.(this.items[next], next);
|
|
112
|
+
return true;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
select(index) {
|
|
118
|
+
if (index < 0 || index >= this.items.length || this.items[index].disabled)
|
|
119
|
+
return;
|
|
120
|
+
this.index = index;
|
|
121
|
+
this.refresh();
|
|
122
|
+
this.onHighlight?.(this.items[index], index);
|
|
123
|
+
}
|
|
124
|
+
confirm() {
|
|
125
|
+
const item = this.selected;
|
|
126
|
+
if (!item || item.disabled)
|
|
127
|
+
return false;
|
|
128
|
+
this.onSelect?.(item, this.index);
|
|
129
|
+
return true;
|
|
130
|
+
}
|
|
131
|
+
/** @returns true when the action was used */
|
|
132
|
+
handleAction(action) {
|
|
133
|
+
switch (action) {
|
|
134
|
+
case 'up':
|
|
135
|
+
return this.move(-1);
|
|
136
|
+
case 'down':
|
|
137
|
+
return this.move(1);
|
|
138
|
+
case 'confirm':
|
|
139
|
+
return this.confirm();
|
|
140
|
+
default:
|
|
141
|
+
return false;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
refresh() {
|
|
145
|
+
//scroll only as far as needed to bring the selection back into view, so the list
|
|
146
|
+
//stays put while the highlight moves within it
|
|
147
|
+
const visible = this.visibleRows;
|
|
148
|
+
if (this.index < this.scroll) {
|
|
149
|
+
this.scroll = this.index;
|
|
150
|
+
}
|
|
151
|
+
else if (this.index >= this.scroll + visible) {
|
|
152
|
+
this.scroll = this.index - visible + 1;
|
|
153
|
+
}
|
|
154
|
+
this.scroll = Math.max(0, Math.min(this.scroll, Math.max(0, this.items.length - visible)));
|
|
155
|
+
this.rowsLayer.y = -this.scroll * this.rowHeight;
|
|
156
|
+
const t = theme();
|
|
157
|
+
if (this.items.length === 0) {
|
|
158
|
+
this.highlight.clear();
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
this.highlight
|
|
162
|
+
.clear()
|
|
163
|
+
.rect(0, (this.index - this.scroll) * this.rowHeight, this.viewWidth, this.rowHeight)
|
|
164
|
+
.fill({ color: t.color.selection });
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=ListView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ListView.js","sourceRoot":"","sources":["../../src/ui/ListView.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { type Texture } from 'pixi.js';
|
|
2
|
+
import type { Action } from '../core/Input.ts';
|
|
3
|
+
import { Window } from './Window.ts';
|
|
4
|
+
export interface MessagePage {
|
|
5
|
+
text: string;
|
|
6
|
+
/** who is speaking, drawn above the text */
|
|
7
|
+
speaker?: string;
|
|
8
|
+
/** a portrait drawn to the left of the text */
|
|
9
|
+
portrait?: Texture;
|
|
10
|
+
}
|
|
11
|
+
export interface Choice {
|
|
12
|
+
text: string;
|
|
13
|
+
value?: unknown;
|
|
14
|
+
disabled?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export interface MessageBoxOptions {
|
|
17
|
+
width: number;
|
|
18
|
+
height: number;
|
|
19
|
+
pages: Array<MessagePage | string>;
|
|
20
|
+
/** characters revealed per second; 0 shows each page at once */
|
|
21
|
+
speed?: number;
|
|
22
|
+
/** offered after the last page */
|
|
23
|
+
choices?: Choice[];
|
|
24
|
+
/** called with the chosen value, or undefined when there were no choices */
|
|
25
|
+
onDone?: (chosen: unknown) => void;
|
|
26
|
+
/** dim the world behind; false when the scene behind is the point, as in a dialogue */
|
|
27
|
+
dims?: boolean;
|
|
28
|
+
/** where the stack puts the box */
|
|
29
|
+
anchor?: 'center' | 'bottom' | 'top';
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* The dialogue box.
|
|
33
|
+
*
|
|
34
|
+
* It reveals text a character at a time, advances page by page on `confirm`, and can end
|
|
35
|
+
* on a set of choices. Pressing `confirm` while text is still appearing completes the page
|
|
36
|
+
* instead of advancing — the behaviour every player expects, and the reason the reveal is
|
|
37
|
+
* driven by a character count rather than by animating the label.
|
|
38
|
+
*
|
|
39
|
+
* This is the one window that is not closable by `cancel`: a conversation ends when it
|
|
40
|
+
* ends, or a cutscene would be left half-run.
|
|
41
|
+
*/
|
|
42
|
+
export declare class MessageBox extends Window {
|
|
43
|
+
private pages;
|
|
44
|
+
private pageIndex;
|
|
45
|
+
private speed;
|
|
46
|
+
private revealed;
|
|
47
|
+
private body;
|
|
48
|
+
private speakerLabel;
|
|
49
|
+
private portrait;
|
|
50
|
+
private portraitLayer;
|
|
51
|
+
private prompt;
|
|
52
|
+
private choices;
|
|
53
|
+
private choiceList;
|
|
54
|
+
private onDone;
|
|
55
|
+
private finished;
|
|
56
|
+
constructor(options: MessageBoxOptions);
|
|
57
|
+
private showPage;
|
|
58
|
+
private get pageComplete();
|
|
59
|
+
update(dt: number): void;
|
|
60
|
+
handleAction(action: Action): boolean;
|
|
61
|
+
private showChoices;
|
|
62
|
+
/** makes the box taller by `amount`, growing upwards so its foot stays put */
|
|
63
|
+
private grow;
|
|
64
|
+
private finish;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=MessageBox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessageBox.d.ts","sourceRoot":"","sources":["../../src/ui/MessageBox.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,OAAO,EAAE,MAAM,SAAS,CAAC;AAC1D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAKrC,MAAM,WAAW,WAAW;IAC3B,IAAI,EAAE,MAAM,CAAC;IAEb,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,MAAM;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,CAAC,WAAW,GAAG,MAAM,CAAC,CAAC;IAEnC,gEAAgE;IAChE,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,kCAAkC;IAClC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAEnB,4EAA4E;IAC5E,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IAEnC,uFAAuF;IACvF,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf,mCAAmC;IACnC,MAAM,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,KAAK,CAAC;CACrC;AAED;;;;;;;;;;GAUG;AACH,qBAAa,UAAW,SAAQ,MAAM;IACrC,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,SAAS,CAAK;IAEtB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,QAAQ,CAAK;IAErB,OAAO,CAAC,IAAI,CAAQ;IACpB,OAAO,CAAC,YAAY,CAAQ;IAC5B,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,aAAa,CAAmB;IACxC,OAAO,CAAC,MAAM,CAAQ;IAEtB,OAAO,CAAC,OAAO,CAAW;IAC1B,OAAO,CAAC,UAAU,CAAyB;IAE3C,OAAO,CAAC,MAAM,CAAqC;IACnD,OAAO,CAAC,QAAQ,CAAS;IAEzB,YAAY,OAAO,EAAE,iBAAiB,EA+BrC;IAED,OAAO,CAAC,QAAQ;IAqChB,OAAO,KAAK,YAAY,GAEvB;IAEQ,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAShC;IAEQ,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CA2B7C;IAED,OAAO,CAAC,WAAW;IAoCnB,8EAA8E;IAC9E,OAAO,CAAC,IAAI;IAOZ,OAAO,CAAC,MAAM;CAMd"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { Container, Sprite } from 'pixi.js';
|
|
2
|
+
import { Window } from './Window.js';
|
|
3
|
+
import { Label } from './Label.js';
|
|
4
|
+
import { ListView } from './ListView.js';
|
|
5
|
+
import { theme } from './theme.js';
|
|
6
|
+
/**
|
|
7
|
+
* The dialogue box.
|
|
8
|
+
*
|
|
9
|
+
* It reveals text a character at a time, advances page by page on `confirm`, and can end
|
|
10
|
+
* on a set of choices. Pressing `confirm` while text is still appearing completes the page
|
|
11
|
+
* instead of advancing — the behaviour every player expects, and the reason the reveal is
|
|
12
|
+
* driven by a character count rather than by animating the label.
|
|
13
|
+
*
|
|
14
|
+
* This is the one window that is not closable by `cancel`: a conversation ends when it
|
|
15
|
+
* ends, or a cutscene would be left half-run.
|
|
16
|
+
*/
|
|
17
|
+
export class MessageBox extends Window {
|
|
18
|
+
constructor(options) {
|
|
19
|
+
super({
|
|
20
|
+
width: options.width,
|
|
21
|
+
height: options.height,
|
|
22
|
+
modal: true,
|
|
23
|
+
closable: false,
|
|
24
|
+
dims: options.dims,
|
|
25
|
+
anchor: options.anchor ?? 'bottom',
|
|
26
|
+
});
|
|
27
|
+
this.pageIndex = 0;
|
|
28
|
+
this.revealed = 0;
|
|
29
|
+
this.portrait = null;
|
|
30
|
+
this.portraitLayer = new Container();
|
|
31
|
+
this.choiceList = null;
|
|
32
|
+
this.finished = false;
|
|
33
|
+
this.pages = options.pages.map((page) => (typeof page === 'string' ? { text: page } : page));
|
|
34
|
+
this.speed = options.speed ?? 40;
|
|
35
|
+
this.choices = options.choices ?? [];
|
|
36
|
+
this.onDone = options.onDone ?? null;
|
|
37
|
+
const t = theme();
|
|
38
|
+
this.content.addChild(this.portraitLayer);
|
|
39
|
+
this.speakerLabel = new Label({ color: t.color.textHighlight, bold: true });
|
|
40
|
+
this.content.addChild(this.speakerLabel);
|
|
41
|
+
this.body = new Label({ wrapWidth: this.contentWidth });
|
|
42
|
+
this.content.addChild(this.body);
|
|
43
|
+
//a small hint that the box is waiting, rather than leaving the player guessing
|
|
44
|
+
this.prompt = new Label({ text: '▼', color: t.color.textDim });
|
|
45
|
+
this.prompt.visible = false;
|
|
46
|
+
this.content.addChild(this.prompt);
|
|
47
|
+
this.showPage(0);
|
|
48
|
+
}
|
|
49
|
+
showPage(index) {
|
|
50
|
+
const page = this.pages[index];
|
|
51
|
+
const t = theme();
|
|
52
|
+
//in rtl the portrait moves to the right edge, the text runs from the left edge up
|
|
53
|
+
//to it, and the "waiting" prompt moves to the opposite corner from ltr
|
|
54
|
+
const rtl = t.direction === 'rtl';
|
|
55
|
+
this.portraitLayer.removeChildren();
|
|
56
|
+
this.portrait = null;
|
|
57
|
+
let textLeft = 0;
|
|
58
|
+
let textWidth = this.contentWidth;
|
|
59
|
+
if (page.portrait) {
|
|
60
|
+
this.portrait = new Sprite(page.portrait);
|
|
61
|
+
if (rtl)
|
|
62
|
+
this.portrait.x = this.contentWidth - this.portrait.width;
|
|
63
|
+
this.portraitLayer.addChild(this.portrait);
|
|
64
|
+
textWidth = this.contentWidth - this.portrait.width - t.padding;
|
|
65
|
+
textLeft = rtl ? 0 : this.portrait.width + t.padding;
|
|
66
|
+
}
|
|
67
|
+
this.speakerLabel.visible = page.speaker !== undefined;
|
|
68
|
+
this.speakerLabel.x = textLeft;
|
|
69
|
+
this.speakerLabel.setText(page.speaker ?? '');
|
|
70
|
+
this.body.x = textLeft;
|
|
71
|
+
this.body.y = page.speaker !== undefined ? this.speakerLabel.height + t.spacing : 0;
|
|
72
|
+
this.body.style.wordWrapWidth = Math.max(16, textWidth);
|
|
73
|
+
this.revealed = this.speed > 0 ? 0 : page.text.length;
|
|
74
|
+
this.body.setText(page.text.slice(0, this.revealed));
|
|
75
|
+
this.prompt.visible = false;
|
|
76
|
+
this.prompt.x = rtl ? 0 : this.contentWidth - this.prompt.width;
|
|
77
|
+
this.prompt.y = this.contentHeight - this.prompt.height;
|
|
78
|
+
}
|
|
79
|
+
get pageComplete() {
|
|
80
|
+
return this.revealed >= this.pages[this.pageIndex].text.length;
|
|
81
|
+
}
|
|
82
|
+
update(dt) {
|
|
83
|
+
if (this.finished || this.pageComplete) {
|
|
84
|
+
//only prompt once there is something to advance to
|
|
85
|
+
this.prompt.visible = this.pageComplete && !this.choiceList;
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
this.revealed = Math.min(this.pages[this.pageIndex].text.length, this.revealed + this.speed * dt);
|
|
89
|
+
this.body.setText(this.pages[this.pageIndex].text.slice(0, Math.floor(this.revealed)));
|
|
90
|
+
}
|
|
91
|
+
handleAction(action) {
|
|
92
|
+
//once choices are up they own the input, which is what `delegate` expresses
|
|
93
|
+
if (this.delegate)
|
|
94
|
+
return super.handleAction(action);
|
|
95
|
+
if (action !== 'confirm')
|
|
96
|
+
return false;
|
|
97
|
+
//first press completes the page, second advances: skipping the reveal must never
|
|
98
|
+
//also skip the page, or fast readers lose lines
|
|
99
|
+
if (!this.pageComplete) {
|
|
100
|
+
this.revealed = this.pages[this.pageIndex].text.length;
|
|
101
|
+
this.body.setText(this.pages[this.pageIndex].text);
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
104
|
+
if (this.pageIndex < this.pages.length - 1) {
|
|
105
|
+
this.pageIndex++;
|
|
106
|
+
this.showPage(this.pageIndex);
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
if (this.choices.length > 0) {
|
|
110
|
+
this.showChoices();
|
|
111
|
+
return true;
|
|
112
|
+
}
|
|
113
|
+
this.finish(undefined);
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
showChoices() {
|
|
117
|
+
const t = theme();
|
|
118
|
+
const items = this.choices.map((choice) => ({
|
|
119
|
+
text: choice.text,
|
|
120
|
+
disabled: choice.disabled,
|
|
121
|
+
value: choice.value ?? choice.text,
|
|
122
|
+
}));
|
|
123
|
+
const rowHeight = Math.ceil(t.font.size * t.font.lineHeight) + t.spacing;
|
|
124
|
+
const height = items.length * rowHeight;
|
|
125
|
+
//the choices go under the text, never over it. anchoring them to the bottom of the
|
|
126
|
+
//box looks tidier until a page wraps to more lines than the author expected, and
|
|
127
|
+
//then it silently eats the last line of what was said
|
|
128
|
+
const top = this.body.y + this.body.height + t.padding;
|
|
129
|
+
//if that does not fit, the box grows rather than clipping or overlapping: a
|
|
130
|
+
//conversation must never become unreadable because a translation ran long
|
|
131
|
+
const overflow = top + height - this.contentHeight;
|
|
132
|
+
if (overflow > 0) {
|
|
133
|
+
this.grow(overflow);
|
|
134
|
+
}
|
|
135
|
+
this.choiceList = new ListView({
|
|
136
|
+
width: this.contentWidth,
|
|
137
|
+
height,
|
|
138
|
+
items,
|
|
139
|
+
onSelect: (item) => this.finish(item.value),
|
|
140
|
+
});
|
|
141
|
+
this.choiceList.y = top;
|
|
142
|
+
this.content.addChild(this.choiceList);
|
|
143
|
+
this.delegate = this.choiceList;
|
|
144
|
+
this.prompt.visible = false;
|
|
145
|
+
}
|
|
146
|
+
/** makes the box taller by `amount`, growing upwards so its foot stays put */
|
|
147
|
+
grow(amount) {
|
|
148
|
+
const bounds = this.getLocalBounds();
|
|
149
|
+
this.resize(bounds.width, bounds.height + amount);
|
|
150
|
+
//a box anchored to the bottom must not slide off it when choices appear
|
|
151
|
+
this.y = Math.max(0, this.y - amount);
|
|
152
|
+
}
|
|
153
|
+
finish(chosen) {
|
|
154
|
+
if (this.finished)
|
|
155
|
+
return;
|
|
156
|
+
this.finished = true;
|
|
157
|
+
this.onDone?.(chosen);
|
|
158
|
+
this.close();
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=MessageBox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessageBox.js","sourceRoot":"","sources":["../../src/ui/MessageBox.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Container, Texture } from 'pixi.js';
|
|
2
|
+
export interface NinePatchOptions {
|
|
3
|
+
/** how many pixels of the texture are the fixed border, per side */
|
|
4
|
+
border: number | {
|
|
5
|
+
left: number;
|
|
6
|
+
top: number;
|
|
7
|
+
right: number;
|
|
8
|
+
bottom: number;
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* A panel that can be resized without distorting its frame.
|
|
13
|
+
*
|
|
14
|
+
* The texture is cut into nine: four corners that never stretch, four edges that stretch
|
|
15
|
+
* along one axis, and a middle that fills. It is what makes one small window texture serve
|
|
16
|
+
* every window in the game, at any size.
|
|
17
|
+
*
|
|
18
|
+
* Pixi has this built in; the wrapper exists so that a `border` can be given as one number,
|
|
19
|
+
* which is the case for almost every panel, and so that resizing reads the same as it does
|
|
20
|
+
* on the framework's other widgets.
|
|
21
|
+
*/
|
|
22
|
+
export declare class NinePatch extends Container {
|
|
23
|
+
private sprite;
|
|
24
|
+
constructor(texture: Texture, options: NinePatchOptions);
|
|
25
|
+
/** the border widths, which a window needs to know to inset its contents */
|
|
26
|
+
get border(): {
|
|
27
|
+
left: number;
|
|
28
|
+
top: number;
|
|
29
|
+
right: number;
|
|
30
|
+
bottom: number;
|
|
31
|
+
};
|
|
32
|
+
resize(width: number, height: number): void;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=NinePatch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NinePatch.d.ts","sourceRoot":"","sources":["../../src/ui/NinePatch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAmB,OAAO,EAAE,MAAM,SAAS,CAAC;AAE9D,MAAM,WAAW,gBAAgB;IAChC,oEAAoE;IACpE,MAAM,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9E;AAED;;;;;;;;;;GAUG;AACH,qBAAa,SAAU,SAAQ,SAAS;IACvC,OAAO,CAAC,MAAM,CAAkB;IAEhC,YAAY,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAgBtD;IAED,4EAA4E;IAC5E,IAAI,MAAM,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAOzE;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAM1C;CAID"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { Container, NineSliceSprite, Texture } from 'pixi.js';
|
|
2
|
+
/**
|
|
3
|
+
* A panel that can be resized without distorting its frame.
|
|
4
|
+
*
|
|
5
|
+
* The texture is cut into nine: four corners that never stretch, four edges that stretch
|
|
6
|
+
* along one axis, and a middle that fills. It is what makes one small window texture serve
|
|
7
|
+
* every window in the game, at any size.
|
|
8
|
+
*
|
|
9
|
+
* Pixi has this built in; the wrapper exists so that a `border` can be given as one number,
|
|
10
|
+
* which is the case for almost every panel, and so that resizing reads the same as it does
|
|
11
|
+
* on the framework's other widgets.
|
|
12
|
+
*/
|
|
13
|
+
export class NinePatch extends Container {
|
|
14
|
+
constructor(texture, options) {
|
|
15
|
+
super();
|
|
16
|
+
const b = typeof options.border === 'number'
|
|
17
|
+
? { left: options.border, top: options.border, right: options.border, bottom: options.border }
|
|
18
|
+
: options.border;
|
|
19
|
+
this.sprite = new NineSliceSprite({
|
|
20
|
+
texture,
|
|
21
|
+
leftWidth: b.left,
|
|
22
|
+
topHeight: b.top,
|
|
23
|
+
rightWidth: b.right,
|
|
24
|
+
bottomHeight: b.bottom,
|
|
25
|
+
});
|
|
26
|
+
this.addChild(this.sprite);
|
|
27
|
+
}
|
|
28
|
+
/** the border widths, which a window needs to know to inset its contents */
|
|
29
|
+
get border() {
|
|
30
|
+
return {
|
|
31
|
+
left: this.sprite.leftWidth,
|
|
32
|
+
top: this.sprite.topHeight,
|
|
33
|
+
right: this.sprite.rightWidth,
|
|
34
|
+
bottom: this.sprite.bottomHeight,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
resize(width, height) {
|
|
38
|
+
//below twice the border the corners would overlap and the frame would fold in on
|
|
39
|
+
//itself, so the panel refuses to go smaller rather than rendering nonsense
|
|
40
|
+
const b = this.border;
|
|
41
|
+
this.sprite.width = Math.max(width, b.left + b.right);
|
|
42
|
+
this.sprite.height = Math.max(height, b.top + b.bottom);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=NinePatch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NinePatch.js","sourceRoot":"","sources":["../../src/ui/NinePatch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAO9D;;;;;;;;;;GAUG;AACH,MAAM,OAAO,SAAU,SAAQ,SAAS;IAGvC,YAAY,OAAgB,EAAE,OAAyB;QACtD,KAAK,EAAE,CAAC;QAER,MAAM,CAAC,GAAG,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ;YAC3C,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE;YAC9F,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;QAElB,IAAI,CAAC,MAAM,GAAG,IAAI,eAAe,CAAC;YACjC,OAAO;YACP,SAAS,EAAE,CAAC,CAAC,IAAI;YACjB,SAAS,EAAE,CAAC,CAAC,GAAG;YAChB,UAAU,EAAE,CAAC,CAAC,KAAK;YACnB,YAAY,EAAE,CAAC,CAAC,MAAM;SACtB,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IAED,4EAA4E;IAC5E,IAAI,MAAM;QACT,OAAO;YACN,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;YAC3B,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;YAC1B,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;YAC7B,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;SAChC,CAAC;IACH,CAAC;IAED,MAAM,CAAC,KAAa,EAAE,MAAc;QACnC,iFAAiF;QACjF,2EAA2E;QAC3E,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;QACtB,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QACtD,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;IACzD,CAAC;CAID"}
|