@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,60 @@
|
|
|
1
|
+
import type { AnimatedSprite } from './AnimatedSprite.ts';
|
|
2
|
+
/** the three states any character's animation ever needs to be in */
|
|
3
|
+
export type ActorAnimationState = 'idle' | 'move' | 'action';
|
|
4
|
+
export interface ActorAnimatorOptions {
|
|
5
|
+
/**
|
|
6
|
+
* Names a state's animation, given whatever varies it - a facing direction for a grid
|
|
7
|
+
* character, an empty string for one that does not need it. Looked up through
|
|
8
|
+
* `AnimatedSprite.has`, so a state with nothing registered for the current variant is
|
|
9
|
+
* silently skipped rather than throwing - the same degrade-to-nothing `GridMover` already
|
|
10
|
+
* relies on for a sprite with no walk cycle at all.
|
|
11
|
+
*/
|
|
12
|
+
animationName: (state: ActorAnimationState, variant: string) => string;
|
|
13
|
+
/** the variant to start in; defaults to the empty string */
|
|
14
|
+
variant?: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* The convention `AnimatedSprite` and `GridMover` never had: standing still, moving, and
|
|
18
|
+
* performing an action are the only three states a character's animation is ever in, and an
|
|
19
|
+
* action is the only one of the three that interrupts the other two rather than being
|
|
20
|
+
* interrupted by them.
|
|
21
|
+
*
|
|
22
|
+
* `setMoving` toggles between idle and move freely, as often as every frame - a grid
|
|
23
|
+
* character's walk cycle calls it once per `update`. `playAction` cuts in over whichever of
|
|
24
|
+
* those is currently showing, plays once, and - because an action animation must be
|
|
25
|
+
* registered non-looping (`{ loop: false }`) for this to close the loop - hands control back
|
|
26
|
+
* to idle or move automatically the instant it finishes, picking up whichever `setMoving`
|
|
27
|
+
* calls arrived while it was playing rather than whatever was true when it started. A second
|
|
28
|
+
* `playAction` while one is already running is ignored unless `restart` is passed, so an
|
|
29
|
+
* attack animation is not stuttered by a turn resolving faster than its swing.
|
|
30
|
+
*
|
|
31
|
+
* This owns the sprite's `onFinish` hook entirely; a game driving one through
|
|
32
|
+
* `ActorAnimator` should not also set `onFinish` itself.
|
|
33
|
+
*/
|
|
34
|
+
export declare class ActorAnimator {
|
|
35
|
+
private sprite;
|
|
36
|
+
private animationName;
|
|
37
|
+
private variant;
|
|
38
|
+
private idleOrMove;
|
|
39
|
+
private inAction;
|
|
40
|
+
constructor(sprite: AnimatedSprite, options: ActorAnimatorOptions);
|
|
41
|
+
/** the state actually showing right now - `'action'` overrides idle/move while it plays */
|
|
42
|
+
get state(): ActorAnimationState;
|
|
43
|
+
get variantName(): string;
|
|
44
|
+
/**
|
|
45
|
+
* Standing still or moving, and which way. Has no effect while an action is playing -
|
|
46
|
+
* the request is remembered and taken up the moment it finishes.
|
|
47
|
+
*/
|
|
48
|
+
setMoving(moving: boolean, variant?: string): void;
|
|
49
|
+
/**
|
|
50
|
+
* Plays an action animation once - an attack, a use-item flourish, a wave. Idle/move
|
|
51
|
+
* resumes automatically when it finishes.
|
|
52
|
+
*
|
|
53
|
+
* @param restart replay from the first frame even if this action is already playing;
|
|
54
|
+
* without it, a second call while one is already running is a no-op
|
|
55
|
+
*/
|
|
56
|
+
playAction(variant?: string, restart?: boolean): void;
|
|
57
|
+
private onSpriteFinish;
|
|
58
|
+
private apply;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=ActorAnimator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ActorAnimator.d.ts","sourceRoot":"","sources":["../../src/render/ActorAnimator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,qEAAqE;AACrE,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE7D,MAAM,WAAW,oBAAoB;IACpC;;;;;;OAMG;IACH,aAAa,EAAE,CAAC,KAAK,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC;IAEvE,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,aAAa;IACzB,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,aAAa,CAA0D;IAE/E,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,QAAQ,CAAS;IAEzB,YAAY,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,oBAAoB,EAOhE;IAED,2FAA2F;IAC3F,IAAI,KAAK,IAAI,mBAAmB,CAE/B;IAED,IAAI,WAAW,IAAI,MAAM,CAExB;IAED;;;OAGG;IACH,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAIjD;IAED;;;;;;OAMG;IACH,UAAU,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,UAAQ,GAAG,IAAI,CAMlD;IAED,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,KAAK;CAIb"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The convention `AnimatedSprite` and `GridMover` never had: standing still, moving, and
|
|
3
|
+
* performing an action are the only three states a character's animation is ever in, and an
|
|
4
|
+
* action is the only one of the three that interrupts the other two rather than being
|
|
5
|
+
* interrupted by them.
|
|
6
|
+
*
|
|
7
|
+
* `setMoving` toggles between idle and move freely, as often as every frame - a grid
|
|
8
|
+
* character's walk cycle calls it once per `update`. `playAction` cuts in over whichever of
|
|
9
|
+
* those is currently showing, plays once, and - because an action animation must be
|
|
10
|
+
* registered non-looping (`{ loop: false }`) for this to close the loop - hands control back
|
|
11
|
+
* to idle or move automatically the instant it finishes, picking up whichever `setMoving`
|
|
12
|
+
* calls arrived while it was playing rather than whatever was true when it started. A second
|
|
13
|
+
* `playAction` while one is already running is ignored unless `restart` is passed, so an
|
|
14
|
+
* attack animation is not stuttered by a turn resolving faster than its swing.
|
|
15
|
+
*
|
|
16
|
+
* This owns the sprite's `onFinish` hook entirely; a game driving one through
|
|
17
|
+
* `ActorAnimator` should not also set `onFinish` itself.
|
|
18
|
+
*/
|
|
19
|
+
export class ActorAnimator {
|
|
20
|
+
constructor(sprite, options) {
|
|
21
|
+
this.idleOrMove = 'idle';
|
|
22
|
+
this.inAction = false;
|
|
23
|
+
this.sprite = sprite;
|
|
24
|
+
this.animationName = options.animationName;
|
|
25
|
+
this.variant = options.variant ?? '';
|
|
26
|
+
this.sprite.onFinish = () => this.onSpriteFinish();
|
|
27
|
+
this.apply(this.idleOrMove);
|
|
28
|
+
}
|
|
29
|
+
/** the state actually showing right now - `'action'` overrides idle/move while it plays */
|
|
30
|
+
get state() {
|
|
31
|
+
return this.inAction ? 'action' : this.idleOrMove;
|
|
32
|
+
}
|
|
33
|
+
get variantName() {
|
|
34
|
+
return this.variant;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Standing still or moving, and which way. Has no effect while an action is playing -
|
|
38
|
+
* the request is remembered and taken up the moment it finishes.
|
|
39
|
+
*/
|
|
40
|
+
setMoving(moving, variant) {
|
|
41
|
+
if (variant !== undefined)
|
|
42
|
+
this.variant = variant;
|
|
43
|
+
this.idleOrMove = moving ? 'move' : 'idle';
|
|
44
|
+
if (!this.inAction)
|
|
45
|
+
this.apply(this.idleOrMove);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Plays an action animation once - an attack, a use-item flourish, a wave. Idle/move
|
|
49
|
+
* resumes automatically when it finishes.
|
|
50
|
+
*
|
|
51
|
+
* @param restart replay from the first frame even if this action is already playing;
|
|
52
|
+
* without it, a second call while one is already running is a no-op
|
|
53
|
+
*/
|
|
54
|
+
playAction(variant, restart = false) {
|
|
55
|
+
if (this.inAction && !restart)
|
|
56
|
+
return;
|
|
57
|
+
if (variant !== undefined)
|
|
58
|
+
this.variant = variant;
|
|
59
|
+
this.inAction = true;
|
|
60
|
+
this.apply('action');
|
|
61
|
+
}
|
|
62
|
+
onSpriteFinish() {
|
|
63
|
+
//idle/move are registered looping and never reach this; a stray call (an action
|
|
64
|
+
//registered looping by mistake) is ignored rather than left to desync `inAction`
|
|
65
|
+
if (!this.inAction)
|
|
66
|
+
return;
|
|
67
|
+
this.inAction = false;
|
|
68
|
+
this.apply(this.idleOrMove);
|
|
69
|
+
}
|
|
70
|
+
apply(state) {
|
|
71
|
+
const name = this.animationName(state, this.variant);
|
|
72
|
+
if (this.sprite.has(name))
|
|
73
|
+
this.sprite.play(name, state === 'action');
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=ActorAnimator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ActorAnimator.js","sourceRoot":"","sources":["../../src/render/ActorAnimator.ts"],"names":[],"mappings":"AAmBA;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,OAAO,aAAa;IAQzB,YAAY,MAAsB,EAAE,OAA6B;QAHzD,eAAU,GAAoB,MAAM,CAAC;QACrC,aAAQ,GAAG,KAAK,CAAC;QAGxB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;QAC3C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;QAErC,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;QACnD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC7B,CAAC;IAED,2FAA2F;IAC3F,IAAI,KAAK;QACR,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;IACnD,CAAC;IAED,IAAI,WAAW;QACd,OAAO,IAAI,CAAC,OAAO,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,SAAS,CAAC,MAAe,EAAE,OAAgB;QAC1C,IAAI,OAAO,KAAK,SAAS;YAAE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QAClD,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;QAC3C,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACjD,CAAC;IAED;;;;;;OAMG;IACH,UAAU,CAAC,OAAgB,EAAE,OAAO,GAAG,KAAK;QAC3C,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO;YAAE,OAAO;QACtC,IAAI,OAAO,KAAK,SAAS;YAAE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QAElD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACtB,CAAC;IAEO,cAAc;QACrB,gFAAgF;QAChF,iFAAiF;QACjF,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,OAAO;QAE3B,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC7B,CAAC;IAEO,KAAK,CAAC,KAA0B;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACrD,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,KAAK,QAAQ,CAAC,CAAC;IACvE,CAAC;CACD"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { Texture } from 'pixi.js';
|
|
2
|
+
import { TintedSprite } from './TintedSprite.ts';
|
|
3
|
+
export interface AnimationOptions {
|
|
4
|
+
/** frames per second */
|
|
5
|
+
fps?: number;
|
|
6
|
+
/** whether to start again at the end, or hold on the last frame */
|
|
7
|
+
loop?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare class Animation {
|
|
10
|
+
readonly frames: readonly Texture[];
|
|
11
|
+
readonly frameDuration: number;
|
|
12
|
+
readonly loop: boolean;
|
|
13
|
+
constructor(frames: readonly Texture[], { fps, loop }?: AnimationOptions);
|
|
14
|
+
get duration(): number;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* A sprite that plays named animations, and can still be tinted.
|
|
18
|
+
*
|
|
19
|
+
* Animations are registered once and played by name, which is how a character ends up
|
|
20
|
+
* reading as `hero.play('walk')` rather than juggling frame arrays:
|
|
21
|
+
*
|
|
22
|
+
* ```ts
|
|
23
|
+
* const hero = new AnimatedSprite();
|
|
24
|
+
* hero.add('idle', sheet.pick(0, 0, 0, 1), { fps: 2 });
|
|
25
|
+
* hero.add('walk', sheet.range(6, 10), { fps: 10 });
|
|
26
|
+
* hero.add('die', sheet.range(11, 14), { fps: 10, loop: false });
|
|
27
|
+
* hero.play('idle');
|
|
28
|
+
* ```
|
|
29
|
+
*
|
|
30
|
+
* Nothing advances on its own: call `update(dt)` from the scene, or add the sprite to a
|
|
31
|
+
* `SpriteGroup`, so that pausing the game pauses the animations with it.
|
|
32
|
+
*/
|
|
33
|
+
export declare class AnimatedSprite extends TintedSprite {
|
|
34
|
+
private animations;
|
|
35
|
+
private current;
|
|
36
|
+
private currentName;
|
|
37
|
+
private frameIndex;
|
|
38
|
+
private timer;
|
|
39
|
+
private finished;
|
|
40
|
+
/** fires once when a non-looping animation reaches its last frame */
|
|
41
|
+
onFinish: ((name: string) => void) | null;
|
|
42
|
+
paused: boolean;
|
|
43
|
+
add(name: string, frames: readonly Texture[], options?: AnimationOptions): this;
|
|
44
|
+
has(name: string): boolean;
|
|
45
|
+
get playing(): string | null;
|
|
46
|
+
get isFinished(): boolean;
|
|
47
|
+
/**
|
|
48
|
+
* Starts an animation.
|
|
49
|
+
*
|
|
50
|
+
* Playing the one already running does nothing, so a movement loop can call
|
|
51
|
+
* `play('walk')` every frame without restarting it. Pass `restart` to force it.
|
|
52
|
+
*/
|
|
53
|
+
play(name: string, restart?: boolean): this;
|
|
54
|
+
stop(): void;
|
|
55
|
+
update(dt: number): void;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=AnimatedSprite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AnimatedSprite.d.ts","sourceRoot":"","sources":["../../src/render/AnimatedSprite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,WAAW,gBAAgB;IAChC,wBAAwB;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb,mEAAmE;IACnE,IAAI,CAAC,EAAE,OAAO,CAAC;CACf;AAED,qBAAa,SAAS;IACrB,QAAQ,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,CAAC;IACpC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAEvB,YAAY,MAAM,EAAE,SAAS,OAAO,EAAE,EAAE,EAAE,GAAQ,EAAE,IAAW,EAAE,GAAE,gBAAqB,EAKvF;IAED,IAAI,QAAQ,IAAI,MAAM,CAErB;CACD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,cAAe,SAAQ,YAAY;IAC/C,OAAO,CAAC,UAAU,CAAgC;IAElD,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,QAAQ,CAAS;IAEzB,qEAAqE;IACrE,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,IAAI,CAAQ;IAEjD,MAAM,UAAS;IAEf,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,OAAO,EAAE,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAG9E;IAED,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEzB;IAED,IAAI,OAAO,IAAI,MAAM,GAAG,IAAI,CAE3B;IAED,IAAI,UAAU,IAAI,OAAO,CAExB;IAED;;;;;OAKG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,UAAQ,GAAG,IAAI,CAcxC;IAED,IAAI,IAAI,IAAI,CAGX;IAED,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAuBvB;CACD"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { TintedSprite } from './TintedSprite.js';
|
|
2
|
+
export class Animation {
|
|
3
|
+
constructor(frames, { fps = 10, loop = true } = {}) {
|
|
4
|
+
if (frames.length === 0)
|
|
5
|
+
throw new Error('an animation needs at least one frame');
|
|
6
|
+
this.frames = frames;
|
|
7
|
+
this.frameDuration = 1 / fps;
|
|
8
|
+
this.loop = loop;
|
|
9
|
+
}
|
|
10
|
+
get duration() {
|
|
11
|
+
return this.frameDuration * this.frames.length;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* A sprite that plays named animations, and can still be tinted.
|
|
16
|
+
*
|
|
17
|
+
* Animations are registered once and played by name, which is how a character ends up
|
|
18
|
+
* reading as `hero.play('walk')` rather than juggling frame arrays:
|
|
19
|
+
*
|
|
20
|
+
* ```ts
|
|
21
|
+
* const hero = new AnimatedSprite();
|
|
22
|
+
* hero.add('idle', sheet.pick(0, 0, 0, 1), { fps: 2 });
|
|
23
|
+
* hero.add('walk', sheet.range(6, 10), { fps: 10 });
|
|
24
|
+
* hero.add('die', sheet.range(11, 14), { fps: 10, loop: false });
|
|
25
|
+
* hero.play('idle');
|
|
26
|
+
* ```
|
|
27
|
+
*
|
|
28
|
+
* Nothing advances on its own: call `update(dt)` from the scene, or add the sprite to a
|
|
29
|
+
* `SpriteGroup`, so that pausing the game pauses the animations with it.
|
|
30
|
+
*/
|
|
31
|
+
export class AnimatedSprite extends TintedSprite {
|
|
32
|
+
constructor() {
|
|
33
|
+
super(...arguments);
|
|
34
|
+
this.animations = new Map();
|
|
35
|
+
this.current = null;
|
|
36
|
+
this.currentName = null;
|
|
37
|
+
this.frameIndex = 0;
|
|
38
|
+
this.timer = 0;
|
|
39
|
+
this.finished = false;
|
|
40
|
+
/** fires once when a non-looping animation reaches its last frame */
|
|
41
|
+
this.onFinish = null;
|
|
42
|
+
this.paused = false;
|
|
43
|
+
}
|
|
44
|
+
add(name, frames, options) {
|
|
45
|
+
this.animations.set(name, new Animation(frames, options));
|
|
46
|
+
return this;
|
|
47
|
+
}
|
|
48
|
+
has(name) {
|
|
49
|
+
return this.animations.has(name);
|
|
50
|
+
}
|
|
51
|
+
get playing() {
|
|
52
|
+
return this.currentName;
|
|
53
|
+
}
|
|
54
|
+
get isFinished() {
|
|
55
|
+
return this.finished;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Starts an animation.
|
|
59
|
+
*
|
|
60
|
+
* Playing the one already running does nothing, so a movement loop can call
|
|
61
|
+
* `play('walk')` every frame without restarting it. Pass `restart` to force it.
|
|
62
|
+
*/
|
|
63
|
+
play(name, restart = false) {
|
|
64
|
+
if (!restart && this.currentName === name && !this.finished)
|
|
65
|
+
return this;
|
|
66
|
+
const animation = this.animations.get(name);
|
|
67
|
+
if (!animation)
|
|
68
|
+
throw new Error(`no animation named "${name}" on this sprite`);
|
|
69
|
+
this.current = animation;
|
|
70
|
+
this.currentName = name;
|
|
71
|
+
this.frameIndex = 0;
|
|
72
|
+
this.timer = 0;
|
|
73
|
+
this.finished = false;
|
|
74
|
+
this.texture = animation.frames[0];
|
|
75
|
+
return this;
|
|
76
|
+
}
|
|
77
|
+
stop() {
|
|
78
|
+
this.current = null;
|
|
79
|
+
this.currentName = null;
|
|
80
|
+
}
|
|
81
|
+
update(dt) {
|
|
82
|
+
const animation = this.current;
|
|
83
|
+
if (!animation || this.paused || this.finished)
|
|
84
|
+
return;
|
|
85
|
+
this.timer += dt;
|
|
86
|
+
//a long frame may cross several animation frames, so this catches up rather than
|
|
87
|
+
//dropping them, which keeps two sprites started together in step
|
|
88
|
+
while (this.timer >= animation.frameDuration) {
|
|
89
|
+
this.timer -= animation.frameDuration;
|
|
90
|
+
if (this.frameIndex < animation.frames.length - 1) {
|
|
91
|
+
this.frameIndex++;
|
|
92
|
+
}
|
|
93
|
+
else if (animation.loop) {
|
|
94
|
+
this.frameIndex = 0;
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
this.finished = true;
|
|
98
|
+
this.onFinish?.(this.currentName);
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
this.texture = animation.frames[this.frameIndex];
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=AnimatedSprite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AnimatedSprite.js","sourceRoot":"","sources":["../../src/render/AnimatedSprite.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/** which of a cell's 8 neighbours belong to the same terrain, for autotiling one cell */
|
|
2
|
+
export interface NeighborMask {
|
|
3
|
+
n: boolean;
|
|
4
|
+
e: boolean;
|
|
5
|
+
s: boolean;
|
|
6
|
+
w: boolean;
|
|
7
|
+
ne: boolean;
|
|
8
|
+
se: boolean;
|
|
9
|
+
sw: boolean;
|
|
10
|
+
nw: boolean;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Stitching a terrain edge or corner from many small tile pieces, chosen by which neighbours
|
|
14
|
+
* are the same terrain, rather than a game picking a frame per cell by hand.
|
|
15
|
+
*
|
|
16
|
+
* A diagonal neighbour only changes a cell's shape when both orthogonal neighbours flanking
|
|
17
|
+
* it also belong to the terrain - a corner piece already covers every case where one of them
|
|
18
|
+
* does not, since the edge piece on that side owns the corner instead. That rule is what
|
|
19
|
+
* collapses the 256 raw 8-neighbour combinations down to the 47 that are ever actually
|
|
20
|
+
* reachable, and it is the whole of what "blob" autotiling is - not 256 hand-drawn tiles, 47.
|
|
21
|
+
*
|
|
22
|
+
* `blobIndex` and `BLOB_SHAPES` are this module's own convention, not a claim of pixel
|
|
23
|
+
* compatibility with any particular existing tileset's frame order - a tileset drawn for a
|
|
24
|
+
* different engine's autotile layout will need its frames reordered into this one. What is
|
|
25
|
+
* guaranteed: `BLOB_SHAPES` lists all 47 shapes in the exact order `blobIndex` returns them
|
|
26
|
+
* in, so a tool (or a person, reading it once) can draw or arrange frames against it directly.
|
|
27
|
+
*/
|
|
28
|
+
export declare const BLOB_SHAPES: readonly NeighborMask[];
|
|
29
|
+
/** the blob index (0 to 46) for one cell's 8-neighbour membership test */
|
|
30
|
+
export declare function blobIndex(neighbors: NeighborMask): number;
|
|
31
|
+
/**
|
|
32
|
+
* One frame per cell of a terrain, autotiled from a same-terrain test alone.
|
|
33
|
+
*
|
|
34
|
+
* @param sameTerrain called for every cell in range, and for the 8 neighbours around each -
|
|
35
|
+
* including cells outside `width`/`height`, so a caller wanting a hard map edge should have
|
|
36
|
+
* it return `false` there rather than relying on this to bounds-check
|
|
37
|
+
* @param frames the 47 frames a `blobIndex` of 0 to 46 selects between, drawn (or arranged)
|
|
38
|
+
* against `BLOB_SHAPES`
|
|
39
|
+
* @returns one frame index per cell, row-major, `EMPTY` wherever `sameTerrain` is false
|
|
40
|
+
*/
|
|
41
|
+
export declare function autotileFrames(width: number, height: number, sameTerrain: (x: number, y: number) => boolean, frames: readonly number[]): Int32Array;
|
|
42
|
+
//# sourceMappingURL=Autotile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Autotile.d.ts","sourceRoot":"","sources":["../../src/render/Autotile.ts"],"names":[],"mappings":"AAEA,yFAAyF;AACzF,MAAM,WAAW,YAAY;IAC5B,CAAC,EAAE,OAAO,CAAC;IACX,CAAC,EAAE,OAAO,CAAC;IACX,CAAC,EAAE,OAAO,CAAC;IACX,CAAC,EAAE,OAAO,CAAC;IACX,EAAE,EAAE,OAAO,CAAC;IACZ,EAAE,EAAE,OAAO,CAAC;IACZ,EAAE,EAAE,OAAO,CAAC;IACZ,EAAE,EAAE,OAAO,CAAC;CACZ;AAED;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,WAAW,EAAE,SAAS,YAAY,EAAsB,CAAC;AAoEtE,0EAA0E;AAC1E,wBAAgB,SAAS,CAAC,SAAS,EAAE,YAAY,GAAG,MAAM,CAEzD;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAC7B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,OAAO,EAC9C,MAAM,EAAE,SAAS,MAAM,EAAE,GACvB,UAAU,CA+BZ"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { EMPTY } from './TileMap.js';
|
|
2
|
+
/**
|
|
3
|
+
* Stitching a terrain edge or corner from many small tile pieces, chosen by which neighbours
|
|
4
|
+
* are the same terrain, rather than a game picking a frame per cell by hand.
|
|
5
|
+
*
|
|
6
|
+
* A diagonal neighbour only changes a cell's shape when both orthogonal neighbours flanking
|
|
7
|
+
* it also belong to the terrain - a corner piece already covers every case where one of them
|
|
8
|
+
* does not, since the edge piece on that side owns the corner instead. That rule is what
|
|
9
|
+
* collapses the 256 raw 8-neighbour combinations down to the 47 that are ever actually
|
|
10
|
+
* reachable, and it is the whole of what "blob" autotiling is - not 256 hand-drawn tiles, 47.
|
|
11
|
+
*
|
|
12
|
+
* `blobIndex` and `BLOB_SHAPES` are this module's own convention, not a claim of pixel
|
|
13
|
+
* compatibility with any particular existing tileset's frame order - a tileset drawn for a
|
|
14
|
+
* different engine's autotile layout will need its frames reordered into this one. What is
|
|
15
|
+
* guaranteed: `BLOB_SHAPES` lists all 47 shapes in the exact order `blobIndex` returns them
|
|
16
|
+
* in, so a tool (or a person, reading it once) can draw or arrange frames against it directly.
|
|
17
|
+
*/
|
|
18
|
+
export const BLOB_SHAPES = buildBlobShapes();
|
|
19
|
+
const blobIndexByMask = new Map(BLOB_SHAPES.map((shape, index) => [maskOf(shape), index]));
|
|
20
|
+
function maskOf(shape) {
|
|
21
|
+
//a corner bit only ever appears here already reduced - see effectiveMask - so this is
|
|
22
|
+
//also how a raw NeighborMask gets canonicalised before the lookup
|
|
23
|
+
const ne = shape.ne && shape.n && shape.e;
|
|
24
|
+
const se = shape.se && shape.s && shape.e;
|
|
25
|
+
const sw = shape.sw && shape.s && shape.w;
|
|
26
|
+
const nw = shape.nw && shape.n && shape.w;
|
|
27
|
+
return ((shape.n ? 1 : 0) |
|
|
28
|
+
(shape.e ? 2 : 0) |
|
|
29
|
+
(shape.s ? 4 : 0) |
|
|
30
|
+
(shape.w ? 8 : 0) |
|
|
31
|
+
(ne ? 16 : 0) |
|
|
32
|
+
(se ? 32 : 0) |
|
|
33
|
+
(sw ? 64 : 0) |
|
|
34
|
+
(nw ? 128 : 0));
|
|
35
|
+
}
|
|
36
|
+
function buildBlobShapes() {
|
|
37
|
+
const seen = new Set();
|
|
38
|
+
const shapes = [];
|
|
39
|
+
//every one of the 256 raw combinations reduces to one of the 47 reachable masks; walking
|
|
40
|
+
//all of them and keeping the first shape seen for each mask is simpler than deriving the
|
|
41
|
+
//47 directly, and this runs once at module load over a fixed, tiny search space
|
|
42
|
+
for (let bits = 0; bits < 256; bits++) {
|
|
43
|
+
const shape = {
|
|
44
|
+
n: (bits & 1) !== 0,
|
|
45
|
+
e: (bits & 2) !== 0,
|
|
46
|
+
s: (bits & 4) !== 0,
|
|
47
|
+
w: (bits & 8) !== 0,
|
|
48
|
+
ne: (bits & 16) !== 0,
|
|
49
|
+
se: (bits & 32) !== 0,
|
|
50
|
+
sw: (bits & 64) !== 0,
|
|
51
|
+
nw: (bits & 128) !== 0,
|
|
52
|
+
};
|
|
53
|
+
const mask = maskOf(shape);
|
|
54
|
+
if (seen.has(mask))
|
|
55
|
+
continue;
|
|
56
|
+
seen.add(mask);
|
|
57
|
+
//store the shape in its canonical form - corner bits that do not survive the
|
|
58
|
+
//reduction are cleared, so BLOB_SHAPES never claims a corner matters when it does not
|
|
59
|
+
shapes.push({
|
|
60
|
+
mask,
|
|
61
|
+
shape: {
|
|
62
|
+
n: shape.n,
|
|
63
|
+
e: shape.e,
|
|
64
|
+
s: shape.s,
|
|
65
|
+
w: shape.w,
|
|
66
|
+
ne: shape.ne && shape.n && shape.e,
|
|
67
|
+
se: shape.se && shape.s && shape.e,
|
|
68
|
+
sw: shape.sw && shape.s && shape.w,
|
|
69
|
+
nw: shape.nw && shape.n && shape.w,
|
|
70
|
+
},
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
shapes.sort((a, b) => a.mask - b.mask);
|
|
74
|
+
return shapes.map((entry) => entry.shape);
|
|
75
|
+
}
|
|
76
|
+
/** the blob index (0 to 46) for one cell's 8-neighbour membership test */
|
|
77
|
+
export function blobIndex(neighbors) {
|
|
78
|
+
return blobIndexByMask.get(maskOf(neighbors));
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* One frame per cell of a terrain, autotiled from a same-terrain test alone.
|
|
82
|
+
*
|
|
83
|
+
* @param sameTerrain called for every cell in range, and for the 8 neighbours around each -
|
|
84
|
+
* including cells outside `width`/`height`, so a caller wanting a hard map edge should have
|
|
85
|
+
* it return `false` there rather than relying on this to bounds-check
|
|
86
|
+
* @param frames the 47 frames a `blobIndex` of 0 to 46 selects between, drawn (or arranged)
|
|
87
|
+
* against `BLOB_SHAPES`
|
|
88
|
+
* @returns one frame index per cell, row-major, `EMPTY` wherever `sameTerrain` is false
|
|
89
|
+
*/
|
|
90
|
+
export function autotileFrames(width, height, sameTerrain, frames) {
|
|
91
|
+
if (frames.length !== BLOB_SHAPES.length) {
|
|
92
|
+
throw new Error(`autotileFrames needs exactly ${BLOB_SHAPES.length} frames, got ${frames.length}`);
|
|
93
|
+
}
|
|
94
|
+
const out = new Int32Array(width * height);
|
|
95
|
+
for (let y = 0; y < height; y++) {
|
|
96
|
+
for (let x = 0; x < width; x++) {
|
|
97
|
+
const index = y * width + x;
|
|
98
|
+
if (!sameTerrain(x, y)) {
|
|
99
|
+
out[index] = EMPTY;
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
const neighbors = {
|
|
103
|
+
n: sameTerrain(x, y - 1),
|
|
104
|
+
e: sameTerrain(x + 1, y),
|
|
105
|
+
s: sameTerrain(x, y + 1),
|
|
106
|
+
w: sameTerrain(x - 1, y),
|
|
107
|
+
ne: sameTerrain(x + 1, y - 1),
|
|
108
|
+
se: sameTerrain(x + 1, y + 1),
|
|
109
|
+
sw: sameTerrain(x - 1, y + 1),
|
|
110
|
+
nw: sameTerrain(x - 1, y - 1),
|
|
111
|
+
};
|
|
112
|
+
out[index] = frames[blobIndex(neighbors)];
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return out;
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=Autotile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Autotile.js","sourceRoot":"","sources":["../../src/render/Autotile.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { Container } from 'pixi.js';
|
|
2
|
+
/**
|
|
3
|
+
* A view onto a world larger than the screen.
|
|
4
|
+
*
|
|
5
|
+
* The camera does not move: it moves the world under a fixed viewport, which is what a
|
|
6
|
+
* renderer actually wants. `world` is the container to put the map and its inhabitants in;
|
|
7
|
+
* anything that should stay put on screen — the HUD, a dialogue box — goes outside it.
|
|
8
|
+
*
|
|
9
|
+
* Positions are in world units. At `zoom = 3` a 16px tile is 48 screen pixels.
|
|
10
|
+
*/
|
|
11
|
+
export interface CameraOptions {
|
|
12
|
+
/** screen pixels per world unit */
|
|
13
|
+
zoom?: number;
|
|
14
|
+
/**
|
|
15
|
+
* How much of the screen the target may drift across before the camera follows, 0 to 1.
|
|
16
|
+
*
|
|
17
|
+
* 0 pins the target to the centre, which is precise but makes the world lurch on every
|
|
18
|
+
* step. 0.3 lets it wander through the middle third, which reads far calmer in a
|
|
19
|
+
* grid-based game where movement is in whole tiles.
|
|
20
|
+
*/
|
|
21
|
+
deadzone?: number;
|
|
22
|
+
}
|
|
23
|
+
export declare class Camera {
|
|
24
|
+
/** put the map and everything in it here */
|
|
25
|
+
readonly world: Container<import("pixi.js").ContainerChild>;
|
|
26
|
+
/** centre of the view, in world units */
|
|
27
|
+
x: number;
|
|
28
|
+
y: number;
|
|
29
|
+
private _zoom;
|
|
30
|
+
private deadzone;
|
|
31
|
+
private viewWidth;
|
|
32
|
+
private viewHeight;
|
|
33
|
+
private followTarget;
|
|
34
|
+
private followIntensity;
|
|
35
|
+
private shakeMagnitude;
|
|
36
|
+
private shakeRemaining;
|
|
37
|
+
private shakeDuration;
|
|
38
|
+
private shakeX;
|
|
39
|
+
private shakeY;
|
|
40
|
+
/** clamps the view to these world bounds when set, so the map's edge is never crossed */
|
|
41
|
+
private bounds;
|
|
42
|
+
constructor(options?: CameraOptions);
|
|
43
|
+
get zoom(): number;
|
|
44
|
+
set zoom(value: number);
|
|
45
|
+
/** the framework calls this on resize; sizes are in screen pixels */
|
|
46
|
+
setViewport(width: number, height: number): void;
|
|
47
|
+
/** the visible rectangle, in world units — use it to cull */
|
|
48
|
+
get view(): {
|
|
49
|
+
x: number;
|
|
50
|
+
y: number;
|
|
51
|
+
width: number;
|
|
52
|
+
height: number;
|
|
53
|
+
};
|
|
54
|
+
/** stops the camera leaving the map; pass null to allow it again */
|
|
55
|
+
setBounds(bounds: {
|
|
56
|
+
minX: number;
|
|
57
|
+
minY: number;
|
|
58
|
+
maxX: number;
|
|
59
|
+
maxY: number;
|
|
60
|
+
} | null): void;
|
|
61
|
+
/** jumps to a point with no easing, for a teleport or a scene change */
|
|
62
|
+
snapTo(x: number, y: number): void;
|
|
63
|
+
/** eases towards a fixed point */
|
|
64
|
+
panTo(x: number, y: number, intensity?: number): void;
|
|
65
|
+
/** eases towards something that keeps moving, such as the player */
|
|
66
|
+
follow(target: {
|
|
67
|
+
x: number;
|
|
68
|
+
y: number;
|
|
69
|
+
}, intensity?: number): void;
|
|
70
|
+
stopFollowing(): void;
|
|
71
|
+
/** @param magnitude world units @param duration seconds */
|
|
72
|
+
shake(magnitude: number, duration?: number): void;
|
|
73
|
+
update(dt: number): void;
|
|
74
|
+
/** world point to screen pixels */
|
|
75
|
+
toScreen(x: number, y: number): {
|
|
76
|
+
x: number;
|
|
77
|
+
y: number;
|
|
78
|
+
};
|
|
79
|
+
/** screen pixels to world point, for turning a click into a tile */
|
|
80
|
+
toWorld(x: number, y: number): {
|
|
81
|
+
x: number;
|
|
82
|
+
y: number;
|
|
83
|
+
};
|
|
84
|
+
private apply;
|
|
85
|
+
}
|
|
86
|
+
/** a camera sized to the running game's viewport, updated on every frame */
|
|
87
|
+
export declare function createCamera(options?: CameraOptions): Camera;
|
|
88
|
+
//# sourceMappingURL=Camera.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Camera.d.ts","sourceRoot":"","sources":["../../src/render/Camera.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAIpC;;;;;;;;GAQG;AACH,MAAM,WAAW,aAAa;IAC7B,mCAAmC;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,MAAM;IAClB,4CAA4C;IAC5C,QAAQ,CAAC,KAAK,8CAAmB;IAEjC,yCAAyC;IACzC,CAAC,SAAK;IACN,CAAC,SAAK;IAEN,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,QAAQ,CAAS;IAEzB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,UAAU,CAAK;IAEvB,OAAO,CAAC,YAAY,CAAyC;IAG7D,OAAO,CAAC,eAAe,CAAK;IAE5B,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,MAAM,CAAK;IAEnB,yFAAyF;IACzF,OAAO,CAAC,MAAM,CAA2E;IAEzF,YAAY,OAAO,GAAE,aAAkB,EAGtC;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM,EAErB;IAED,qEAAqE;IACrE,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAG/C;IAED,6DAA6D;IAC7D,IAAI,IAAI,IAAI;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAIlE;IAED,oEAAoE;IACpE,SAAS,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,GAAG,IAAI,CAEzF;IAED,wEAAwE;IACxE,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAMjC;IAED,kCAAkC;IAClC,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,SAAI,GAAG,IAAI,CAG/C;IAED,oEAAoE;IACpE,MAAM,CAAC,MAAM,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,SAAS,SAAI,GAAG,IAAI,CAG5D;IAED,aAAa,IAAI,IAAI,CAGpB;IAED,2DAA2D;IAC3D,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,SAAM,GAAG,IAAI,CAG7C;IAED,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CA8BvB;IAED,mCAAmC;IACnC,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAKvD;IAED,oEAAoE;IACpE,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAKtD;IAED,OAAO,CAAC,KAAK;CAoBb;AAMD,4EAA4E;AAC5E,wBAAgB,YAAY,CAAC,OAAO,GAAE,aAAkB,GAAG,MAAM,CAMhE"}
|