@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,107 @@
|
|
|
1
|
+
import { TileMap } from '../render/TileMap.ts';
|
|
2
|
+
import { SpriteSheet } from '../render/SpriteSheet.ts';
|
|
3
|
+
/**
|
|
4
|
+
* The subset of Tiled's JSON export this loader reads: embedded or external tilesets,
|
|
5
|
+
* and uncompressed tile-layer data, in any of orthogonal, isometric or staggered
|
|
6
|
+
* orientation - `TileMap`'s own `shape` option is what actually draws the difference,
|
|
7
|
+
* this only has to pick the right one. Base64/compressed layer data and Tiled's
|
|
8
|
+
* hexagonal orientation (a different offset/axial convention than `mwg`'s own flat-top
|
|
9
|
+
* scheme - see `mwg/core`'s `Hex.ts`) are still on the roadmap rather than read here yet -
|
|
10
|
+
* each throws a clear error naming what was found, rather than silently loading something
|
|
11
|
+
* wrong.
|
|
12
|
+
*
|
|
13
|
+
* Load the JSON itself with `mwg/assets`'s `Resources.get`, same as any other JSON asset;
|
|
14
|
+
* this function only does the parsing.
|
|
15
|
+
*/
|
|
16
|
+
export interface TiledMapData {
|
|
17
|
+
width: number;
|
|
18
|
+
height: number;
|
|
19
|
+
tilewidth: number;
|
|
20
|
+
tileheight: number;
|
|
21
|
+
orientation?: string;
|
|
22
|
+
/** staggered maps only - which axis alternates, and whether the odd or even one shifts */
|
|
23
|
+
staggeraxis?: string;
|
|
24
|
+
staggerindex?: string;
|
|
25
|
+
tilesets: Array<{
|
|
26
|
+
firstgid: number;
|
|
27
|
+
source?: string;
|
|
28
|
+
}>;
|
|
29
|
+
layers: TiledLayer[];
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* The fields of Tiled's tileset JSON (a `.tsx` exported to JSON) that the
|
|
33
|
+
* multi-tileset workflow reads: the caller loads each external tileset the map
|
|
34
|
+
* references, cuts its image to a sheet with its own tile size, and passes the
|
|
35
|
+
* sheets to `loadTiledMap` alongside their `firstgid`s.
|
|
36
|
+
*
|
|
37
|
+
* Tilesets with a margin or spacing between tiles are not supported -
|
|
38
|
+
* `SpriteSheet.grid` cuts a plain grid, with no gaps.
|
|
39
|
+
*/
|
|
40
|
+
export interface TiledTilesetData {
|
|
41
|
+
tilewidth: number;
|
|
42
|
+
tileheight: number;
|
|
43
|
+
image: string;
|
|
44
|
+
}
|
|
45
|
+
export interface TiledLayer {
|
|
46
|
+
type: string;
|
|
47
|
+
name: string;
|
|
48
|
+
data?: number[];
|
|
49
|
+
encoding?: string;
|
|
50
|
+
objects?: TiledObject[];
|
|
51
|
+
}
|
|
52
|
+
export interface TiledObject {
|
|
53
|
+
id: number;
|
|
54
|
+
name?: string;
|
|
55
|
+
type?: string;
|
|
56
|
+
x: number;
|
|
57
|
+
y: number;
|
|
58
|
+
gid?: number;
|
|
59
|
+
properties?: Array<{
|
|
60
|
+
name: string;
|
|
61
|
+
value: unknown;
|
|
62
|
+
}>;
|
|
63
|
+
}
|
|
64
|
+
export interface LoadedTiledMap {
|
|
65
|
+
map: TileMap;
|
|
66
|
+
/** every objectgroup layer's objects, in tile coordinates rather than pixels */
|
|
67
|
+
objects: Array<TiledObject & {
|
|
68
|
+
tileX: number;
|
|
69
|
+
tileY: number;
|
|
70
|
+
}>;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* One tileset's sheet, tagged with the `firstgid` the map gives it, so sheets
|
|
74
|
+
* can be passed in any order - they are matched to the map's tilesets, not to
|
|
75
|
+
* positions in an array.
|
|
76
|
+
*/
|
|
77
|
+
export interface TilesetSheet {
|
|
78
|
+
firstgid: number;
|
|
79
|
+
sheet: SpriteSheet;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Builds a `TileMap` from parsed Tiled JSON and sprite sheets already cut to tile size.
|
|
83
|
+
*
|
|
84
|
+
* A single sheet keeps the old behaviour: the map must have exactly one tileset, and
|
|
85
|
+
* cells hold plain frame indices (`gid - firstgid`). Several sheets - one per tileset,
|
|
86
|
+
* embedded or external - load a map mixing tilesets: each gid is owned by the tileset
|
|
87
|
+
* with the greatest `firstgid` at or below it (Tiled's own rule), and cells hold
|
|
88
|
+
* `tileFrame` packs naming the owning sheet. Every sheet must be cut to the map's own
|
|
89
|
+
* tile size, since one grid of cells draws them all.
|
|
90
|
+
*
|
|
91
|
+
* Resolving an external tileset stays the caller's job - the map only names its
|
|
92
|
+
* `source`, and fetching it is asset loading, which this pure parser never does:
|
|
93
|
+
*
|
|
94
|
+
* ```ts
|
|
95
|
+
* const map = Resources.get('maps/village.json');
|
|
96
|
+
* const sheets: TilesetSheet[] = map.tilesets.map((ref) => {
|
|
97
|
+
* if (ref.source === undefined) {
|
|
98
|
+
* return { firstgid: ref.firstgid, sheet: SpriteSheet.grid('tiles/ground.png', map.tilewidth, map.tileheight) };
|
|
99
|
+
* }
|
|
100
|
+
* const tileset: TiledTilesetData = Resources.get(ref.source);
|
|
101
|
+
* return { firstgid: ref.firstgid, sheet: SpriteSheet.grid(tileset.image, tileset.tilewidth, tileset.tileheight) };
|
|
102
|
+
* });
|
|
103
|
+
* loadTiledMap(map, sheets);
|
|
104
|
+
* ```
|
|
105
|
+
*/
|
|
106
|
+
export declare function loadTiledMap(data: TiledMapData, sheets: SpriteSheet | TilesetSheet[]): LoadedTiledMap;
|
|
107
|
+
//# sourceMappingURL=TiledMap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TiledMap.d.ts","sourceRoot":"","sources":["../../src/rpg/TiledMap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAoB,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,YAAY;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0FAA0F;IAC1F,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvD,MAAM,EAAE,UAAU,EAAE,CAAC;CACrB;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,gBAAgB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CACrD;AAiCD,MAAM,WAAW,cAAc;IAC9B,GAAG,EAAE,OAAO,CAAC;IACb,gFAAgF;IAChF,OAAO,EAAE,KAAK,CAAC,WAAW,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC/D;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,WAAW,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,GAAG,YAAY,EAAE,GAAG,cAAc,CA4ErG"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { TileMap, EMPTY, tileFrame } from '../render/TileMap.js';
|
|
2
|
+
import { SpriteSheet } from '../render/SpriteSheet.js';
|
|
3
|
+
/** the flip/rotation flags Tiled packs into the top bits of a tile layer's gid */
|
|
4
|
+
const GID_FLAG_MASK = 0x1fffffff;
|
|
5
|
+
const SHAPE_BY_ORIENTATION = {
|
|
6
|
+
orthogonal: 'square',
|
|
7
|
+
isometric: 'isometric',
|
|
8
|
+
staggered: 'staggered',
|
|
9
|
+
};
|
|
10
|
+
/** one grid of cells draws every sheet, so all of them must be cut to the map's tile size */
|
|
11
|
+
function checkTileSize(sheet, data, firstgid) {
|
|
12
|
+
if (sheet.frameWidth !== data.tilewidth || sheet.frameHeight !== data.tileheight) {
|
|
13
|
+
throw new Error(`the tileset at firstgid ${firstgid} is cut to ${sheet.frameWidth}x${sheet.frameHeight}, but the map is ${data.tilewidth}x${data.tileheight}`);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
/** Tiled's own rule: a gid belongs to the tileset with the greatest firstgid at or below it */
|
|
17
|
+
function ownerOf(gid, owners, layerName) {
|
|
18
|
+
let owner = -1;
|
|
19
|
+
for (let i = 0; i < owners.length; i++) {
|
|
20
|
+
if (owners[i] <= gid)
|
|
21
|
+
owner = i;
|
|
22
|
+
else
|
|
23
|
+
break;
|
|
24
|
+
}
|
|
25
|
+
if (owner === -1) {
|
|
26
|
+
throw new Error(`layer "${layerName}" uses gid ${gid}, below every tileset's firstgid (${owners.join(', ')})`);
|
|
27
|
+
}
|
|
28
|
+
return owner;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Builds a `TileMap` from parsed Tiled JSON and sprite sheets already cut to tile size.
|
|
32
|
+
*
|
|
33
|
+
* A single sheet keeps the old behaviour: the map must have exactly one tileset, and
|
|
34
|
+
* cells hold plain frame indices (`gid - firstgid`). Several sheets - one per tileset,
|
|
35
|
+
* embedded or external - load a map mixing tilesets: each gid is owned by the tileset
|
|
36
|
+
* with the greatest `firstgid` at or below it (Tiled's own rule), and cells hold
|
|
37
|
+
* `tileFrame` packs naming the owning sheet. Every sheet must be cut to the map's own
|
|
38
|
+
* tile size, since one grid of cells draws them all.
|
|
39
|
+
*
|
|
40
|
+
* Resolving an external tileset stays the caller's job - the map only names its
|
|
41
|
+
* `source`, and fetching it is asset loading, which this pure parser never does:
|
|
42
|
+
*
|
|
43
|
+
* ```ts
|
|
44
|
+
* const map = Resources.get('maps/village.json');
|
|
45
|
+
* const sheets: TilesetSheet[] = map.tilesets.map((ref) => {
|
|
46
|
+
* if (ref.source === undefined) {
|
|
47
|
+
* return { firstgid: ref.firstgid, sheet: SpriteSheet.grid('tiles/ground.png', map.tilewidth, map.tileheight) };
|
|
48
|
+
* }
|
|
49
|
+
* const tileset: TiledTilesetData = Resources.get(ref.source);
|
|
50
|
+
* return { firstgid: ref.firstgid, sheet: SpriteSheet.grid(tileset.image, tileset.tilewidth, tileset.tileheight) };
|
|
51
|
+
* });
|
|
52
|
+
* loadTiledMap(map, sheets);
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
export function loadTiledMap(data, sheets) {
|
|
56
|
+
const orientation = data.orientation ?? 'orthogonal';
|
|
57
|
+
const shape = SHAPE_BY_ORIENTATION[orientation];
|
|
58
|
+
if (!shape) {
|
|
59
|
+
throw new Error(`loadTiledMap does not read "${orientation}" maps yet`);
|
|
60
|
+
}
|
|
61
|
+
if (shape === 'staggered' && (data.staggeraxis ?? 'y') !== 'y') {
|
|
62
|
+
throw new Error(`loadTiledMap only reads Y-axis staggered maps right now, this one is staggered on "${data.staggeraxis}"`);
|
|
63
|
+
}
|
|
64
|
+
if (shape === 'staggered' && (data.staggerindex ?? 'odd') !== 'odd') {
|
|
65
|
+
throw new Error(`loadTiledMap only reads odd-index staggered maps right now, this one staggers "${data.staggerindex}"`);
|
|
66
|
+
}
|
|
67
|
+
if (data.tilesets.length === 0) {
|
|
68
|
+
throw new Error('loadTiledMap needs at least one tileset, this map has none');
|
|
69
|
+
}
|
|
70
|
+
//one sheet is the old single-tileset path; several are matched to tilesets by firstgid
|
|
71
|
+
const ordered = [...data.tilesets].sort((a, b) => a.firstgid - b.firstgid);
|
|
72
|
+
let mapSheets;
|
|
73
|
+
let owners;
|
|
74
|
+
if (sheets instanceof SpriteSheet) {
|
|
75
|
+
if (data.tilesets.length !== 1) {
|
|
76
|
+
throw new Error(`loadTiledMap was given one sheet but this map has ${data.tilesets.length} tilesets - pass one sheet per tileset`);
|
|
77
|
+
}
|
|
78
|
+
checkTileSize(sheets, data, ordered[0].firstgid);
|
|
79
|
+
mapSheets = [sheets];
|
|
80
|
+
owners = [ordered[0].firstgid];
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
if (sheets.length !== data.tilesets.length) {
|
|
84
|
+
throw new Error(`loadTiledMap was given ${sheets.length} sheets but this map has ${data.tilesets.length} tilesets - pass one sheet per tileset`);
|
|
85
|
+
}
|
|
86
|
+
mapSheets = ordered.map((ref) => {
|
|
87
|
+
const found = sheets.find((s) => s.firstgid === ref.firstgid);
|
|
88
|
+
if (!found)
|
|
89
|
+
throw new Error(`loadTiledMap was given no sheet for the tileset at firstgid ${ref.firstgid}`);
|
|
90
|
+
checkTileSize(found.sheet, data, ref.firstgid);
|
|
91
|
+
return found.sheet;
|
|
92
|
+
});
|
|
93
|
+
owners = ordered.map((ref) => ref.firstgid);
|
|
94
|
+
}
|
|
95
|
+
const map = new TileMap({ width: data.width, height: data.height, sheet: mapSheets, shape });
|
|
96
|
+
const objects = [];
|
|
97
|
+
for (const layer of data.layers) {
|
|
98
|
+
if (layer.type === 'tilelayer') {
|
|
99
|
+
if (layer.encoding && layer.encoding !== 'csv') {
|
|
100
|
+
throw new Error(`layer "${layer.name}" uses "${layer.encoding}" encoding - export tile layers as CSV/plain, not compressed`);
|
|
101
|
+
}
|
|
102
|
+
const frames = (layer.data ?? []).map((gid) => {
|
|
103
|
+
const raw = gid & GID_FLAG_MASK;
|
|
104
|
+
if (raw === 0)
|
|
105
|
+
return EMPTY;
|
|
106
|
+
const owner = ownerOf(raw, owners, layer.name);
|
|
107
|
+
return owners.length === 1 ? raw - owners[0] : tileFrame(owner, raw - owners[owner]);
|
|
108
|
+
});
|
|
109
|
+
map.addLayer(layer.name, frames);
|
|
110
|
+
}
|
|
111
|
+
else if (layer.type === 'objectgroup') {
|
|
112
|
+
for (const object of layer.objects ?? []) {
|
|
113
|
+
objects.push({
|
|
114
|
+
...object,
|
|
115
|
+
tileX: Math.floor(object.x / data.tilewidth),
|
|
116
|
+
tileY: Math.floor(object.y / data.tileheight),
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return { map, objects };
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=TiledMap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TiledMap.js","sourceRoot":"","sources":["../../src/rpg/TiledMap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { type TileMap } from '../render/TileMap.ts';
|
|
2
|
+
/**
|
|
3
|
+
* One automapping rule: a 2D pattern to find, and what to write where it matches.
|
|
4
|
+
*
|
|
5
|
+
* This is Tiled's automapping, minus the editor: `input_*` layers are arbitrary
|
|
6
|
+
* 2D patterns (not just one cell's 8 neighbours, unlike blob autotiling) matched
|
|
7
|
+
* anywhere against the map, and the paired `output_*` layers replace what matched.
|
|
8
|
+
* `EMPTY` is the wildcard on the way in (an empty input tile constrains nothing)
|
|
9
|
+
* and a no-op on the way out (an empty output tile leaves the cell alone).
|
|
10
|
+
*/
|
|
11
|
+
export interface AutomapRule {
|
|
12
|
+
/** only used to name the rule in errors */
|
|
13
|
+
name?: string;
|
|
14
|
+
/** the pattern size, in cells; every input and output grid must hold exactly this many */
|
|
15
|
+
width: number;
|
|
16
|
+
height: number;
|
|
17
|
+
/** layer name to pattern cells, row-major - all have to match at an origin for the rule to fire */
|
|
18
|
+
input: Record<string, ArrayLike<number>>;
|
|
19
|
+
/**
|
|
20
|
+
* Possible replacements, each a layer name to replacement cells. One variant is
|
|
21
|
+
* picked per match, so several numbered outputs are random variation and one is
|
|
22
|
+
* a plain deterministic write.
|
|
23
|
+
*/
|
|
24
|
+
outputs: Array<Record<string, ArrayLike<number>>>;
|
|
25
|
+
}
|
|
26
|
+
export interface AutomapOptions {
|
|
27
|
+
/** picks the winning variant per match; defaults to the shared seeded generator */
|
|
28
|
+
pick?: (variants: number) => number;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Applies automapping rules to a `TileMap`, in order.
|
|
32
|
+
*
|
|
33
|
+
* Rules read the live map but each rule collects all of its matches before writing
|
|
34
|
+
* any of them: a later rule sees - and can override - what an earlier one wrote,
|
|
35
|
+
* while a rule never trips over its own writes. Patterns must fit entirely; origins
|
|
36
|
+
* where they would hang past the map edge are skipped. Returns how many times rules
|
|
37
|
+
* matched (origins times rules), for tests and debug overlays.
|
|
38
|
+
*/
|
|
39
|
+
export declare function automap(map: TileMap, rules: readonly AutomapRule[], options?: AutomapOptions): number;
|
|
40
|
+
//# sourceMappingURL=automap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"automap.d.ts","sourceRoot":"","sources":["../../src/rpg/automap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAG3D;;;;;;;;GAQG;AACH,MAAM,WAAW,WAAW;IAC3B,2CAA2C;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0FAA0F;IAC1F,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,mGAAmG;IACnG,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IACzC;;;;OAIG;IACH,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;CAClD;AAED,MAAM,WAAW,cAAc;IAC9B,mFAAmF;IACnF,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;CACpC;AAED;;;;;;;;GAQG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,WAAW,EAAE,EAAE,OAAO,GAAE,cAAmB,GAAG,MAAM,CAwBzG"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { EMPTY } from '../render/TileMap.js';
|
|
2
|
+
import { int } from '../core/Random.js';
|
|
3
|
+
/**
|
|
4
|
+
* Applies automapping rules to a `TileMap`, in order.
|
|
5
|
+
*
|
|
6
|
+
* Rules read the live map but each rule collects all of its matches before writing
|
|
7
|
+
* any of them: a later rule sees - and can override - what an earlier one wrote,
|
|
8
|
+
* while a rule never trips over its own writes. Patterns must fit entirely; origins
|
|
9
|
+
* where they would hang past the map edge are skipped. Returns how many times rules
|
|
10
|
+
* matched (origins times rules), for tests and debug overlays.
|
|
11
|
+
*/
|
|
12
|
+
export function automap(map, rules, options = {}) {
|
|
13
|
+
const pick = options.pick ?? int;
|
|
14
|
+
let matches = 0;
|
|
15
|
+
rules.forEach((rule, index) => {
|
|
16
|
+
const label = rule.name ?? `#${index + 1}`;
|
|
17
|
+
checkRule(rule, label);
|
|
18
|
+
const origins = findMatches(map, rule);
|
|
19
|
+
matches += origins.length;
|
|
20
|
+
if (origins.length === 0)
|
|
21
|
+
return;
|
|
22
|
+
for (const [ox, oy] of origins) {
|
|
23
|
+
const output = rule.outputs[pick(rule.outputs.length)];
|
|
24
|
+
for (const [layer, cells] of Object.entries(output)) {
|
|
25
|
+
for (let dy = 0; dy < rule.height; dy++) {
|
|
26
|
+
for (let dx = 0; dx < rule.width; dx++) {
|
|
27
|
+
const value = cells[dy * rule.width + dx];
|
|
28
|
+
if (value !== EMPTY)
|
|
29
|
+
map.setTile(layer, ox + dx, oy + dy, value);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
return matches;
|
|
36
|
+
}
|
|
37
|
+
function checkRule(rule, label) {
|
|
38
|
+
if (!Number.isInteger(rule.width) || rule.width <= 0 || !Number.isInteger(rule.height) || rule.height <= 0) {
|
|
39
|
+
throw new Error(`automap rule "${label}" needs a positive width and height`);
|
|
40
|
+
}
|
|
41
|
+
if (rule.outputs.length === 0) {
|
|
42
|
+
throw new Error(`automap rule "${label}" has no outputs - a rule that matches and writes nothing is a mistake`);
|
|
43
|
+
}
|
|
44
|
+
const size = rule.width * rule.height;
|
|
45
|
+
for (const [layer, cells] of Object.entries(rule.input)) {
|
|
46
|
+
if (cells.length !== size) {
|
|
47
|
+
throw new Error(`automap rule "${label}" input "${layer}" has ${cells.length} cells, but the pattern is ${size}`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
rule.outputs.forEach((output, i) => {
|
|
51
|
+
for (const [layer, cells] of Object.entries(output)) {
|
|
52
|
+
if (cells.length !== size) {
|
|
53
|
+
throw new Error(`automap rule "${label}" output ${i + 1} "${layer}" has ${cells.length} cells, but the pattern is ${size}`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
/** every origin where the whole pattern fits and every constrained cell agrees */
|
|
59
|
+
function findMatches(map, rule) {
|
|
60
|
+
const out = [];
|
|
61
|
+
for (let oy = 0; oy + rule.height <= map.heightInTiles; oy++) {
|
|
62
|
+
for (let ox = 0; ox + rule.width <= map.widthInTiles; ox++) {
|
|
63
|
+
if (matchesAt(map, rule, ox, oy))
|
|
64
|
+
out.push([ox, oy]);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return out;
|
|
68
|
+
}
|
|
69
|
+
function matchesAt(map, rule, ox, oy) {
|
|
70
|
+
for (const [layer, cells] of Object.entries(rule.input)) {
|
|
71
|
+
for (let dy = 0; dy < rule.height; dy++) {
|
|
72
|
+
for (let dx = 0; dx < rule.width; dx++) {
|
|
73
|
+
const want = cells[dy * rule.width + dx];
|
|
74
|
+
if (want !== EMPTY && map.getTile(layer, ox + dx, oy + dy) !== want)
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=automap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"automap.js","sourceRoot":"","sources":["../../src/rpg/automap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export { loadTiledMap } from './TiledMap.ts';
|
|
2
|
+
export type { TiledMapData, TiledLayer, TiledObject, LoadedTiledMap, TilesetSheet, TiledTilesetData } from './TiledMap.ts';
|
|
3
|
+
export { automap } from './automap.ts';
|
|
4
|
+
export type { AutomapRule, AutomapOptions } from './automap.ts';
|
|
5
|
+
export { GameState } from './GameState.ts';
|
|
6
|
+
export { activePage, conditionHolds } from './Event.ts';
|
|
7
|
+
export type { EventTrigger, EventCondition, EventPage, MapEvent } from './Event.ts';
|
|
8
|
+
export { EventRunner } from './EventRunner.ts';
|
|
9
|
+
export type { EventCommand, EventRunnerState, EventRunnerOptions, MoveStep } from './EventRunner.ts';
|
|
10
|
+
export { GridMover } from './GridMover.ts';
|
|
11
|
+
export type { GridMoverOptions, Direction4 } from './GridMover.ts';
|
|
12
|
+
export { QuestLog } from './Quest.ts';
|
|
13
|
+
export type { QuestStage, QuestDefinition, QuestStatus } from './Quest.ts';
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rpg/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAC3H,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACxD,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACpF,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACrG,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,YAAY,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { loadTiledMap } from './TiledMap.js';
|
|
2
|
+
export { automap } from './automap.js';
|
|
3
|
+
export { GameState } from './GameState.js';
|
|
4
|
+
export { activePage, conditionHolds } from './Event.js';
|
|
5
|
+
export { EventRunner } from './EventRunner.js';
|
|
6
|
+
export { GridMover } from './GridMover.js';
|
|
7
|
+
export { QuestLog } from './Quest.js';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rpg/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAExD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { Container, Texture } from 'pixi.js';
|
|
2
|
+
import type { SpriteSheet } from '../render/SpriteSheet.ts';
|
|
3
|
+
export type SlotName = 'left' | 'center' | 'right' | 'farLeft' | 'farRight';
|
|
4
|
+
export interface CharacterDefinition {
|
|
5
|
+
sheet: SpriteSheet;
|
|
6
|
+
/** expression name to frame index in the sheet */
|
|
7
|
+
expressions: Record<string, number>;
|
|
8
|
+
/** how tall the character stands, as a fraction of the stage height */
|
|
9
|
+
height?: number;
|
|
10
|
+
/** where the character's feet sit, as a fraction of the stage height */
|
|
11
|
+
baseline?: number;
|
|
12
|
+
}
|
|
13
|
+
export interface ShowOptions {
|
|
14
|
+
at?: SlotName | number;
|
|
15
|
+
expression?: string;
|
|
16
|
+
/** seconds to fade in; 0 appears at once */
|
|
17
|
+
fade?: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* A dialogue scene: a backdrop, characters standing in front of it, and whoever is
|
|
21
|
+
* speaking picked out from the rest.
|
|
22
|
+
*
|
|
23
|
+
* This is the presentation the tile map is not — a still image with figures on it, the
|
|
24
|
+
* mode nearly every RPG drops into for a conversation that matters, and the whole of how a
|
|
25
|
+
* visual novel looks.
|
|
26
|
+
*
|
|
27
|
+
* It draws only the scene. The words go in a `MessageBox` from `mwg/ui`, so a game gets
|
|
28
|
+
* the same dialogue box whether it is talking to a shopkeeper on a tile map or running a
|
|
29
|
+
* scripted scene here.
|
|
30
|
+
*/
|
|
31
|
+
export declare class DialogueStage extends Container {
|
|
32
|
+
private backdropLayer;
|
|
33
|
+
private actorLayer;
|
|
34
|
+
private backdrop;
|
|
35
|
+
private outgoingBackdrop;
|
|
36
|
+
private actors;
|
|
37
|
+
private definitions;
|
|
38
|
+
private focused;
|
|
39
|
+
private stageWidth;
|
|
40
|
+
private stageHeight;
|
|
41
|
+
private tweens;
|
|
42
|
+
/** how far a character is darkened while someone else is speaking, 0 to 1 */
|
|
43
|
+
dimAmount: number;
|
|
44
|
+
constructor(width: number, height: number);
|
|
45
|
+
/** registers a character so a script can refer to it by name alone */
|
|
46
|
+
defineCharacter(id: string, definition: CharacterDefinition): void;
|
|
47
|
+
resize(width: number, height: number): void;
|
|
48
|
+
/**
|
|
49
|
+
* Changes the backdrop.
|
|
50
|
+
*
|
|
51
|
+
* The old one stays underneath while the new one fades in over it, so the scene never
|
|
52
|
+
* flashes through to an empty stage mid-transition.
|
|
53
|
+
*/
|
|
54
|
+
setBackdrop(texture: Texture, fade?: number): Promise<void>;
|
|
55
|
+
private fitBackdrop;
|
|
56
|
+
show(id: string, options?: ShowOptions): Promise<void>;
|
|
57
|
+
hide(id: string, fade?: number): Promise<void>;
|
|
58
|
+
hideAll(fade?: number): Promise<void>;
|
|
59
|
+
setExpression(id: string, expression: string): void;
|
|
60
|
+
/**
|
|
61
|
+
* Picks out whoever is speaking by dimming everyone else.
|
|
62
|
+
*
|
|
63
|
+
* A multiply tint is exactly right here: it darkens without changing hue, so a dimmed
|
|
64
|
+
* character reads as standing back rather than as being a different colour.
|
|
65
|
+
*/
|
|
66
|
+
focus(id: string | null): void;
|
|
67
|
+
private applyFocus;
|
|
68
|
+
private slotOf;
|
|
69
|
+
private placeActor;
|
|
70
|
+
private tween;
|
|
71
|
+
update(dt: number): void;
|
|
72
|
+
/** true while a fade is running, so a script can wait for it */
|
|
73
|
+
get isBusy(): boolean;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=DialogueStage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DialogueStage.d.ts","sourceRoot":"","sources":["../../src/stage/DialogueStage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAU,OAAO,EAAE,MAAM,SAAS,CAAC;AAErD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE5D,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,UAAU,CAAC;AAW5E,MAAM,WAAW,mBAAmB;IACnC,KAAK,EAAE,WAAW,CAAC;IAEnB,kDAAkD;IAClD,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEpC,uEAAuE;IACvE,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC3B,EAAE,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,4CAA4C;IAC5C,IAAI,CAAC,EAAE,MAAM,CAAC;CACd;AAUD;;;;;;;;;;;GAWG;AACH,qBAAa,aAAc,SAAQ,SAAS;IAC3C,OAAO,CAAC,aAAa,CAAmB;IACxC,OAAO,CAAC,UAAU,CAAmB;IAErC,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,gBAAgB,CAAuB;IAE/C,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,WAAW,CAA0C;IAE7D,OAAO,CAAC,OAAO,CAAuB;IAEtC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,WAAW,CAAS;IAE5B,OAAO,CAAC,MAAM,CAAe;IAE7B,6EAA6E;IAC7E,SAAS,SAAQ;IAEjB,YAAY,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAOxC;IAED,sEAAsE;IACtE,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,mBAAmB,GAAG,IAAI,CAEjE;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAQ1C;IAED;;;;;OAKG;IACH,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,SAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBvD;IAED,OAAO,CAAC,WAAW;IASnB,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoCzD;IAED,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,SAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAgB3C;IAED,OAAO,CAAC,IAAI,SAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAElC;IAED,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAWlD;IAED;;;;;OAKG;IACH,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAG7B;IAED,OAAO,CAAC,UAAU;IAUlB,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,UAAU;IAWlB,OAAO,CAAC,KAAK;IAMb,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAcvB;IAED,gEAAgE;IAChE,IAAI,MAAM,IAAI,OAAO,CAEpB;CACD"}
|