@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,145 @@
|
|
|
1
|
+
import { Container } from 'pixi.js';
|
|
2
|
+
import { Game } from '../core/Game.js';
|
|
3
|
+
import * as Random from '../core/Random.js';
|
|
4
|
+
export class Camera {
|
|
5
|
+
constructor(options = {}) {
|
|
6
|
+
/** put the map and everything in it here */
|
|
7
|
+
this.world = new Container();
|
|
8
|
+
/** centre of the view, in world units */
|
|
9
|
+
this.x = 0;
|
|
10
|
+
this.y = 0;
|
|
11
|
+
this.viewWidth = 0;
|
|
12
|
+
this.viewHeight = 0;
|
|
13
|
+
this.followTarget = null;
|
|
14
|
+
//how fast the camera closes on its target: it covers `intensity` of the remaining
|
|
15
|
+
//distance each second, so it eases in without ever quite arriving
|
|
16
|
+
this.followIntensity = 0;
|
|
17
|
+
this.shakeMagnitude = 0;
|
|
18
|
+
this.shakeRemaining = 0;
|
|
19
|
+
this.shakeDuration = 1;
|
|
20
|
+
this.shakeX = 0;
|
|
21
|
+
this.shakeY = 0;
|
|
22
|
+
/** clamps the view to these world bounds when set, so the map's edge is never crossed */
|
|
23
|
+
this.bounds = null;
|
|
24
|
+
this._zoom = options.zoom ?? 1;
|
|
25
|
+
this.deadzone = options.deadzone ?? 0;
|
|
26
|
+
}
|
|
27
|
+
get zoom() {
|
|
28
|
+
return this._zoom;
|
|
29
|
+
}
|
|
30
|
+
set zoom(value) {
|
|
31
|
+
this._zoom = Math.max(0.01, value);
|
|
32
|
+
}
|
|
33
|
+
/** the framework calls this on resize; sizes are in screen pixels */
|
|
34
|
+
setViewport(width, height) {
|
|
35
|
+
this.viewWidth = width;
|
|
36
|
+
this.viewHeight = height;
|
|
37
|
+
}
|
|
38
|
+
/** the visible rectangle, in world units — use it to cull */
|
|
39
|
+
get view() {
|
|
40
|
+
const width = this.viewWidth / this._zoom;
|
|
41
|
+
const height = this.viewHeight / this._zoom;
|
|
42
|
+
return { x: this.x - width / 2, y: this.y - height / 2, width, height };
|
|
43
|
+
}
|
|
44
|
+
/** stops the camera leaving the map; pass null to allow it again */
|
|
45
|
+
setBounds(bounds) {
|
|
46
|
+
this.bounds = bounds;
|
|
47
|
+
}
|
|
48
|
+
/** jumps to a point with no easing, for a teleport or a scene change */
|
|
49
|
+
snapTo(x, y) {
|
|
50
|
+
this.x = x;
|
|
51
|
+
this.y = y;
|
|
52
|
+
this.followTarget = null;
|
|
53
|
+
this.followIntensity = 0;
|
|
54
|
+
this.apply();
|
|
55
|
+
}
|
|
56
|
+
/** eases towards a fixed point */
|
|
57
|
+
panTo(x, y, intensity = 4) {
|
|
58
|
+
this.followTarget = { x, y };
|
|
59
|
+
this.followIntensity = intensity;
|
|
60
|
+
}
|
|
61
|
+
/** eases towards something that keeps moving, such as the player */
|
|
62
|
+
follow(target, intensity = 8) {
|
|
63
|
+
this.followTarget = target;
|
|
64
|
+
this.followIntensity = intensity;
|
|
65
|
+
}
|
|
66
|
+
stopFollowing() {
|
|
67
|
+
this.followTarget = null;
|
|
68
|
+
this.followIntensity = 0;
|
|
69
|
+
}
|
|
70
|
+
/** @param magnitude world units @param duration seconds */
|
|
71
|
+
shake(magnitude, duration = 0.4) {
|
|
72
|
+
this.shakeMagnitude = magnitude;
|
|
73
|
+
this.shakeRemaining = this.shakeDuration = duration;
|
|
74
|
+
}
|
|
75
|
+
update(dt) {
|
|
76
|
+
if (this.followTarget && this.followIntensity > 0) {
|
|
77
|
+
const deadX = (this.view.width * this.deadzone) / 2;
|
|
78
|
+
const deadY = (this.view.height * this.deadzone) / 2;
|
|
79
|
+
let dx = this.followTarget.x - this.x;
|
|
80
|
+
let dy = this.followTarget.y - this.y;
|
|
81
|
+
//inside the deadzone the camera simply does not move
|
|
82
|
+
dx = dx > deadX ? dx - deadX : dx < -deadX ? dx + deadX : 0;
|
|
83
|
+
dy = dy > deadY ? dy - deadY : dy < -deadY ? dy + deadY : 0;
|
|
84
|
+
//framerate-independent easing: the same fraction is covered per second however
|
|
85
|
+
//long the frame was, so a slow frame does not lag the camera behind
|
|
86
|
+
const t = 1 - Math.exp(-this.followIntensity * dt);
|
|
87
|
+
this.x += dx * t;
|
|
88
|
+
this.y += dy * t;
|
|
89
|
+
}
|
|
90
|
+
if (this.shakeRemaining > 0) {
|
|
91
|
+
this.shakeRemaining -= dt;
|
|
92
|
+
//the shake fades out over its duration rather than stopping dead
|
|
93
|
+
const damping = Math.max(0, this.shakeRemaining / this.shakeDuration);
|
|
94
|
+
this.shakeX = Random.float(-this.shakeMagnitude, this.shakeMagnitude) * damping;
|
|
95
|
+
this.shakeY = Random.float(-this.shakeMagnitude, this.shakeMagnitude) * damping;
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
this.shakeX = this.shakeY = 0;
|
|
99
|
+
}
|
|
100
|
+
this.apply();
|
|
101
|
+
}
|
|
102
|
+
/** world point to screen pixels */
|
|
103
|
+
toScreen(x, y) {
|
|
104
|
+
return {
|
|
105
|
+
x: (x - this.x) * this._zoom + this.viewWidth / 2,
|
|
106
|
+
y: (y - this.y) * this._zoom + this.viewHeight / 2,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
/** screen pixels to world point, for turning a click into a tile */
|
|
110
|
+
toWorld(x, y) {
|
|
111
|
+
return {
|
|
112
|
+
x: (x - this.viewWidth / 2) / this._zoom + this.x,
|
|
113
|
+
y: (y - this.viewHeight / 2) / this._zoom + this.y,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
apply() {
|
|
117
|
+
let centreX = this.x + this.shakeX;
|
|
118
|
+
let centreY = this.y + this.shakeY;
|
|
119
|
+
if (this.bounds) {
|
|
120
|
+
const halfWidth = this.viewWidth / this._zoom / 2;
|
|
121
|
+
const halfHeight = this.viewHeight / this._zoom / 2;
|
|
122
|
+
const { minX, minY, maxX, maxY } = this.bounds;
|
|
123
|
+
//when the map is narrower than the view, centre it rather than clamping to an
|
|
124
|
+
//edge, which would push the map against one side of the screen
|
|
125
|
+
centreX = maxX - minX < halfWidth * 2 ? (minX + maxX) / 2 : clamp(centreX, minX + halfWidth, maxX - halfWidth);
|
|
126
|
+
centreY = maxY - minY < halfHeight * 2 ? (minY + maxY) / 2 : clamp(centreY, minY + halfHeight, maxY - halfHeight);
|
|
127
|
+
}
|
|
128
|
+
this.world.scale.set(this._zoom);
|
|
129
|
+
//rounding to whole screen pixels stops pixel art shimmering as the camera moves
|
|
130
|
+
this.world.x = Math.round(this.viewWidth / 2 - centreX * this._zoom);
|
|
131
|
+
this.world.y = Math.round(this.viewHeight / 2 - centreY * this._zoom);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
function clamp(value, min, max) {
|
|
135
|
+
return value < min ? min : value > max ? max : value;
|
|
136
|
+
}
|
|
137
|
+
/** a camera sized to the running game's viewport, updated on every frame */
|
|
138
|
+
export function createCamera(options = {}) {
|
|
139
|
+
const camera = new Camera(options);
|
|
140
|
+
const game = Game.current;
|
|
141
|
+
//the logical viewport, not the backing store, which is larger on a hidpi display
|
|
142
|
+
camera.setViewport(game.width, game.height);
|
|
143
|
+
return camera;
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=Camera.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Camera.js","sourceRoot":"","sources":["../../src/render/Camera.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { Batcher, ExtensionType, Geometry, Shader } from 'pixi.js';
|
|
2
|
+
import type { BatchableMeshElement, BatchableQuadElement, BatcherOptions, Matrix } from 'pixi.js';
|
|
3
|
+
/**
|
|
4
|
+
* The fields the runtime elements carry but the published types omit.
|
|
5
|
+
*
|
|
6
|
+
* Pixi's own DefaultBatcher is untyped JavaScript, so these never had to be declared. They
|
|
7
|
+
* are read here exactly as DefaultBatcher reads them.
|
|
8
|
+
*/
|
|
9
|
+
interface PackedElement {
|
|
10
|
+
transform: Matrix;
|
|
11
|
+
color: number;
|
|
12
|
+
roundPixels: number;
|
|
13
|
+
colorAdd?: number;
|
|
14
|
+
}
|
|
15
|
+
type MeshElement = BatchableMeshElement & PackedElement;
|
|
16
|
+
type QuadElement = BatchableQuadElement & PackedElement;
|
|
17
|
+
/**
|
|
18
|
+
* Carries the additive colour for one renderable.
|
|
19
|
+
*
|
|
20
|
+
* Anything drawn through this batcher may set `colorAdd` on itself; anything that does not
|
|
21
|
+
* is packed with zero and renders exactly as it would have with the default batcher.
|
|
22
|
+
*/
|
|
23
|
+
export interface HasColorAdd {
|
|
24
|
+
/** additive colour, packed as 0xAABBGGRR to match the attribute's byte order */
|
|
25
|
+
colorAdd?: number;
|
|
26
|
+
}
|
|
27
|
+
export declare class ColorTransformBatcher extends Batcher {
|
|
28
|
+
/** @internal */
|
|
29
|
+
static extension: {
|
|
30
|
+
readonly type: readonly [ExtensionType.Batcher];
|
|
31
|
+
readonly name: 'mwg-color-transform';
|
|
32
|
+
};
|
|
33
|
+
geometry: Geometry;
|
|
34
|
+
shader: Shader;
|
|
35
|
+
name: "mwg-color-transform";
|
|
36
|
+
vertexSize: number;
|
|
37
|
+
constructor(options: BatcherOptions);
|
|
38
|
+
packAttributes(element: MeshElement, float32View: Float32Array, uint32View: Uint32Array, index: number, textureId: number): void;
|
|
39
|
+
packQuadAttributes(element: QuadElement, float32View: Float32Array, uint32View: Uint32Array, index: number, textureId: number): void;
|
|
40
|
+
/** @internal - Pixi calls this when the device's texture limit is known */
|
|
41
|
+
_updateMaxTextures(maxTextures: number): void;
|
|
42
|
+
destroy(): void;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Packs an additive colour into the form the attribute expects.
|
|
46
|
+
*
|
|
47
|
+
* @param r red, 0 to 1
|
|
48
|
+
* @param g green, 0 to 1
|
|
49
|
+
* @param b blue, 0 to 1
|
|
50
|
+
* @param a how much to add to the sprite's own alpha, 0 to 1; usually 0
|
|
51
|
+
*/
|
|
52
|
+
export declare function packColorAdd(r: number, g: number, b: number, a?: number): number;
|
|
53
|
+
/** the additive half of `lerp(texel, colour, strength)`; pair with a tint of `1 - strength` */
|
|
54
|
+
export declare function packTintAdd(color: number, strength: number): number;
|
|
55
|
+
export declare const NO_COLOR_ADD = 0;
|
|
56
|
+
export {};
|
|
57
|
+
//# sourceMappingURL=ColorTransformBatcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ColorTransformBatcher.d.ts","sourceRoot":"","sources":["../../src/render/ColorTransformBatcher.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,OAAO,EAGP,aAAa,EACb,QAAQ,EACR,MAAM,EAUN,MAAM,SAAS,CAAC;AACjB,OAAO,KAAK,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAElG;;;;;GAKG;AACH,UAAU,aAAa;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,KAAK,WAAW,GAAG,oBAAoB,GAAG,aAAa,CAAC;AACxD,KAAK,WAAW,GAAG,oBAAoB,GAAG,aAAa,CAAC;AA4HxD;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC3B,gFAAgF;IAChF,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAMD,qBAAa,qBAAsB,SAAQ,OAAO;IACjD,gBAAgB;IAChB,MAAM,CAAC,SAAS;iBACf,IAAI;iBACJ,IAAI,EAAE,qBAAqB;MACjB;IAEX,QAAQ,EAAE,QAAQ,CAAgC;IAClD,MAAM,EAAE,MAAM,CAAC;IACN,IAAI,wBAAwC;IAC5C,UAAU,SAAe;IAElC,YAAY,OAAO,EAAE,cAAc,EAGlC;IAED,cAAc,CACb,OAAO,EAAE,WAAW,EACpB,WAAW,EAAE,YAAY,EACzB,UAAU,EAAE,WAAW,EACvB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,GACf,IAAI,CAuBN;IAED,kBAAkB,CACjB,OAAO,EAAE,WAAW,EACpB,WAAW,EAAE,YAAY,EACzB,UAAU,EAAE,WAAW,EACvB,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,GACf,IAAI,CAgCN;IAED,2EAA2E;IAC3E,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAI5C;IAEQ,OAAO,IAAI,IAAI,CAGvB;CACD;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,SAAI,GAAG,MAAM,CAM3E;AAED,+FAA+F;AAC/F,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMnE;AAMD,eAAO,MAAM,YAAY,IAAS,CAAC"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import { Batcher, Buffer, BufferUsage, ExtensionType, Geometry, Shader, colorBit, colorBitGl, compileHighShaderGlProgram, compileHighShaderGpuProgram, generateTextureBatchBit, generateTextureBatchBitGl, getBatchSamplersUniformGroup, roundPixelsBit, roundPixelsBitGl, } from 'pixi.js';
|
|
2
|
+
/**
|
|
3
|
+
* A batcher that adds a per-sprite *additive* colour term.
|
|
4
|
+
*
|
|
5
|
+
* Pixi's built-in tint can only multiply. A roguelike needs `texel × M + A`, because the
|
|
6
|
+
* add term is what expresses everything that pulls a sprite *towards* a colour rather
|
|
7
|
+
* than darkening it: a poisoned enemy going green, a hit flashing white, a remembered but
|
|
8
|
+
* unlit tile washing out to grey. Those all read as `lerp(texel, colour, strength)`, which
|
|
9
|
+
* is `texel × (1 - s) + colour × s` — impossible with multiply alone.
|
|
10
|
+
*
|
|
11
|
+
* Doing it here rather than as a per-object filter is the whole point: a filter costs a
|
|
12
|
+
* render-texture pass per object, while this rides along in the same batch and costs one
|
|
13
|
+
* extra vertex attribute.
|
|
14
|
+
*
|
|
15
|
+
* ## A note on coupling
|
|
16
|
+
*
|
|
17
|
+
* This is the one file in `mwg` that builds on Pixi's batching internals: `Batcher`, the
|
|
18
|
+
* high-shader bits, and the vertex packing layout. They are exported from the package
|
|
19
|
+
* root, but they are implementation surface and may shift between Pixi minor versions.
|
|
20
|
+
* The coupling is deliberately confined to this file, and `ColorTransform.test.ts` pins
|
|
21
|
+
* the behaviour so an upgrade fails loudly rather than quietly rendering wrong.
|
|
22
|
+
*/
|
|
23
|
+
/** the extra vertex attribute, and how it folds into the fragment colour */
|
|
24
|
+
const colorAddBitGl = {
|
|
25
|
+
name: 'color-add-bit',
|
|
26
|
+
vertex: {
|
|
27
|
+
header: /* glsl */ `
|
|
28
|
+
in vec4 aColorAdd;
|
|
29
|
+
out vec4 vColorAdd;
|
|
30
|
+
`,
|
|
31
|
+
main: /* glsl */ `
|
|
32
|
+
vColorAdd = aColorAdd;
|
|
33
|
+
`,
|
|
34
|
+
},
|
|
35
|
+
fragment: {
|
|
36
|
+
header: /* glsl */ `
|
|
37
|
+
in vec4 vColorAdd;
|
|
38
|
+
`,
|
|
39
|
+
end: /* glsl */ `
|
|
40
|
+
// Pixi works in premultiplied alpha, so the added colour is scaled by the
|
|
41
|
+
// final alpha. That keeps a transparent texel transparent instead of leaving
|
|
42
|
+
// a coloured halo where the sprite is empty.
|
|
43
|
+
float addedAlpha = finalColor.a + vColorAdd.a;
|
|
44
|
+
finalColor = vec4(finalColor.rgb + vColorAdd.rgb * addedAlpha, addedAlpha);
|
|
45
|
+
`,
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
const colorAddBit = {
|
|
49
|
+
name: 'color-add-bit',
|
|
50
|
+
vertex: {
|
|
51
|
+
header: /* wgsl */ `
|
|
52
|
+
@in aColorAdd: vec4<f32>;
|
|
53
|
+
@out vColorAdd: vec4<f32>;
|
|
54
|
+
`,
|
|
55
|
+
main: /* wgsl */ `
|
|
56
|
+
vColorAdd = aColorAdd;
|
|
57
|
+
`,
|
|
58
|
+
},
|
|
59
|
+
fragment: {
|
|
60
|
+
header: /* wgsl */ `
|
|
61
|
+
@in vColorAdd: vec4<f32>;
|
|
62
|
+
`,
|
|
63
|
+
end: /* wgsl */ `
|
|
64
|
+
let addedAlpha = finalColor.a + vColorAdd.a;
|
|
65
|
+
finalColor = vec4<f32>(finalColor.rgb + vColorAdd.rgb * addedAlpha, addedAlpha);
|
|
66
|
+
`,
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
class ColorTransformShader extends Shader {
|
|
70
|
+
constructor(maxTextures) {
|
|
71
|
+
super({
|
|
72
|
+
glProgram: compileHighShaderGlProgram({
|
|
73
|
+
name: 'color-transform-batch',
|
|
74
|
+
bits: [colorBitGl, colorAddBitGl, generateTextureBatchBitGl(maxTextures), roundPixelsBitGl],
|
|
75
|
+
}),
|
|
76
|
+
gpuProgram: compileHighShaderGpuProgram({
|
|
77
|
+
name: 'color-transform-batch',
|
|
78
|
+
bits: [colorBit, colorAddBit, generateTextureBatchBit(maxTextures), roundPixelsBit],
|
|
79
|
+
}),
|
|
80
|
+
resources: { batchSamplers: getBatchSamplersUniformGroup(maxTextures) },
|
|
81
|
+
});
|
|
82
|
+
this.maxTextures = maxTextures;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/** the default layout plus one more 32-bit word for the additive colour */
|
|
86
|
+
const VERTEX_SIZE = 7;
|
|
87
|
+
class ColorTransformGeometry extends Geometry {
|
|
88
|
+
constructor() {
|
|
89
|
+
const attributeBuffer = new Buffer({
|
|
90
|
+
data: new Float32Array(1),
|
|
91
|
+
label: 'mwg-color-transform-attribute-buffer',
|
|
92
|
+
usage: BufferUsage.VERTEX | BufferUsage.COPY_DST,
|
|
93
|
+
shrinkToFit: false,
|
|
94
|
+
});
|
|
95
|
+
const indexBuffer = new Buffer({
|
|
96
|
+
data: new Uint32Array(1),
|
|
97
|
+
label: 'mwg-color-transform-index-buffer',
|
|
98
|
+
usage: BufferUsage.INDEX | BufferUsage.COPY_DST,
|
|
99
|
+
shrinkToFit: false,
|
|
100
|
+
});
|
|
101
|
+
const stride = VERTEX_SIZE * 4;
|
|
102
|
+
super({
|
|
103
|
+
attributes: {
|
|
104
|
+
aPosition: { buffer: attributeBuffer, format: 'float32x2', stride, offset: 0 },
|
|
105
|
+
aUV: { buffer: attributeBuffer, format: 'float32x2', stride, offset: 2 * 4 },
|
|
106
|
+
aColor: { buffer: attributeBuffer, format: 'unorm8x4', stride, offset: 4 * 4 },
|
|
107
|
+
aTextureIdAndRound: { buffer: attributeBuffer, format: 'uint16x2', stride, offset: 5 * 4 },
|
|
108
|
+
aColorAdd: { buffer: attributeBuffer, format: 'unorm8x4', stride, offset: 6 * 4 },
|
|
109
|
+
},
|
|
110
|
+
indexBuffer,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
const NO_ADD = 0;
|
|
115
|
+
const addOf = (element) => element.colorAdd ?? NO_ADD;
|
|
116
|
+
export class ColorTransformBatcher extends Batcher {
|
|
117
|
+
/** @internal */
|
|
118
|
+
static { this.extension = {
|
|
119
|
+
type: [ExtensionType.Batcher],
|
|
120
|
+
name: 'mwg-color-transform',
|
|
121
|
+
}; }
|
|
122
|
+
constructor(options) {
|
|
123
|
+
super(options);
|
|
124
|
+
this.geometry = new ColorTransformGeometry();
|
|
125
|
+
this.name = ColorTransformBatcher.extension.name;
|
|
126
|
+
this.vertexSize = VERTEX_SIZE;
|
|
127
|
+
this.shader = new ColorTransformShader(options.maxTextures);
|
|
128
|
+
}
|
|
129
|
+
packAttributes(element, float32View, uint32View, index, textureId) {
|
|
130
|
+
const textureIdAndRound = (textureId << 16) | (element.roundPixels & 0xffff);
|
|
131
|
+
const { a, b, c, d, tx, ty } = element.transform;
|
|
132
|
+
const { positions, uvs } = element;
|
|
133
|
+
const argb = element.color;
|
|
134
|
+
const colorAdd = addOf(element);
|
|
135
|
+
const offset = element.attributeOffset;
|
|
136
|
+
const end = offset + element.attributeSize;
|
|
137
|
+
for (let i = offset; i < end; i++) {
|
|
138
|
+
const i2 = i * 2;
|
|
139
|
+
const x = positions[i2];
|
|
140
|
+
const y = positions[i2 + 1];
|
|
141
|
+
float32View[index++] = a * x + c * y + tx;
|
|
142
|
+
float32View[index++] = d * y + b * x + ty;
|
|
143
|
+
float32View[index++] = uvs[i2];
|
|
144
|
+
float32View[index++] = uvs[i2 + 1];
|
|
145
|
+
uint32View[index++] = argb;
|
|
146
|
+
uint32View[index++] = textureIdAndRound;
|
|
147
|
+
uint32View[index++] = colorAdd;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
packQuadAttributes(element, float32View, uint32View, index, textureId) {
|
|
151
|
+
const { a, b, c, d, tx, ty } = element.transform;
|
|
152
|
+
const { bounds } = element;
|
|
153
|
+
const uvs = element.texture.uvs;
|
|
154
|
+
const w0 = bounds.maxX;
|
|
155
|
+
const w1 = bounds.minX;
|
|
156
|
+
const h0 = bounds.maxY;
|
|
157
|
+
const h1 = bounds.minY;
|
|
158
|
+
const argb = element.color;
|
|
159
|
+
const colorAdd = addOf(element);
|
|
160
|
+
const textureIdAndRound = (textureId << 16) | (element.roundPixels & 0xffff);
|
|
161
|
+
//the four corners, in the winding order Pixi's shared index buffer expects
|
|
162
|
+
const corners = [
|
|
163
|
+
[w1, h1, uvs.x0, uvs.y0],
|
|
164
|
+
[w0, h1, uvs.x1, uvs.y1],
|
|
165
|
+
[w0, h0, uvs.x2, uvs.y2],
|
|
166
|
+
[w1, h0, uvs.x3, uvs.y3],
|
|
167
|
+
];
|
|
168
|
+
for (const [x, y, u, v] of corners) {
|
|
169
|
+
float32View[index] = a * x + c * y + tx;
|
|
170
|
+
float32View[index + 1] = d * y + b * x + ty;
|
|
171
|
+
float32View[index + 2] = u;
|
|
172
|
+
float32View[index + 3] = v;
|
|
173
|
+
uint32View[index + 4] = argb;
|
|
174
|
+
uint32View[index + 5] = textureIdAndRound;
|
|
175
|
+
uint32View[index + 6] = colorAdd;
|
|
176
|
+
index += VERTEX_SIZE;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/** @internal - Pixi calls this when the device's texture limit is known */
|
|
180
|
+
_updateMaxTextures(maxTextures) {
|
|
181
|
+
if (this.shader.maxTextures === maxTextures)
|
|
182
|
+
return;
|
|
183
|
+
this.shader.destroy();
|
|
184
|
+
this.shader = new ColorTransformShader(maxTextures);
|
|
185
|
+
}
|
|
186
|
+
destroy() {
|
|
187
|
+
this.shader.destroy();
|
|
188
|
+
super.destroy();
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Packs an additive colour into the form the attribute expects.
|
|
193
|
+
*
|
|
194
|
+
* @param r red, 0 to 1
|
|
195
|
+
* @param g green, 0 to 1
|
|
196
|
+
* @param b blue, 0 to 1
|
|
197
|
+
* @param a how much to add to the sprite's own alpha, 0 to 1; usually 0
|
|
198
|
+
*/
|
|
199
|
+
export function packColorAdd(r, g, b, a = 0) {
|
|
200
|
+
//unorm8x4 reads the four bytes in memory order, and the view is little-endian, so the
|
|
201
|
+
//red channel has to sit in the lowest byte
|
|
202
|
+
return (((clamp255(a) << 24) | (clamp255(b) << 16) | (clamp255(g) << 8) | clamp255(r)) >>> 0);
|
|
203
|
+
}
|
|
204
|
+
/** the additive half of `lerp(texel, colour, strength)`; pair with a tint of `1 - strength` */
|
|
205
|
+
export function packTintAdd(color, strength) {
|
|
206
|
+
return packColorAdd((((color >> 16) & 0xff) / 255) * strength, (((color >> 8) & 0xff) / 255) * strength, ((color & 0xff) / 255) * strength);
|
|
207
|
+
}
|
|
208
|
+
function clamp255(value) {
|
|
209
|
+
return Math.max(0, Math.min(255, Math.round(value * 255)));
|
|
210
|
+
}
|
|
211
|
+
export const NO_COLOR_ADD = NO_ADD;
|
|
212
|
+
//# sourceMappingURL=ColorTransformBatcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ColorTransformBatcher.js","sourceRoot":"","sources":["../../src/render/ColorTransformBatcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Container } from 'pixi.js';
|
|
2
|
+
import type { Texture } from 'pixi.js';
|
|
3
|
+
import { TintedSprite } from './TintedSprite.ts';
|
|
4
|
+
/**
|
|
5
|
+
* A character assembled from independently swappable, independently tintable layers -
|
|
6
|
+
* skin, eyes, hair, garments, worn equipment - rather than one flat sprite per combination.
|
|
7
|
+
* A second palette is a colour change on one layer; worn equipment shows because it is
|
|
8
|
+
* another layer added on top, not a redrawn sprite for every gear combination a game might
|
|
9
|
+
* have. `tools/make-example-assets.mjs` already draws its characters this way; this is the
|
|
10
|
+
* runtime counterpart that keeps the layers together as one sprite that moves as a unit.
|
|
11
|
+
*/
|
|
12
|
+
export declare class LayeredSprite extends Container {
|
|
13
|
+
private layers;
|
|
14
|
+
/**
|
|
15
|
+
* Adds or replaces a named layer.
|
|
16
|
+
*
|
|
17
|
+
* @param order stacking order, higher drawn on top; equal order keeps insertion order
|
|
18
|
+
*/
|
|
19
|
+
addLayer(name: string, texture: Texture, order?: number): TintedSprite;
|
|
20
|
+
removeLayer(name: string): void;
|
|
21
|
+
layer(name: string): TintedSprite | undefined;
|
|
22
|
+
hasLayer(name: string): boolean;
|
|
23
|
+
/** swaps a layer's texture without touching its tint, order, or identity - gear changing */
|
|
24
|
+
setTexture(name: string, texture: Texture): void;
|
|
25
|
+
private resort;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=LayeredSprite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LayeredSprite.d.ts","sourceRoot":"","sources":["../../src/render/LayeredSprite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAOjD;;;;;;;GAOG;AACH,qBAAa,aAAc,SAAQ,SAAS;IAC3C,OAAO,CAAC,MAAM,CAA4B;IAE1C;;;;OAIG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,SAAI,GAAG,YAAY,CAQhE;IAED,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAM9B;IAED,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAE5C;IAED,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE9B;IAED,4FAA4F;IAC5F,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAG/C;IAED,OAAO,CAAC,MAAM;CAId"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { Container } from 'pixi.js';
|
|
2
|
+
import { TintedSprite } from './TintedSprite.js';
|
|
3
|
+
/**
|
|
4
|
+
* A character assembled from independently swappable, independently tintable layers -
|
|
5
|
+
* skin, eyes, hair, garments, worn equipment - rather than one flat sprite per combination.
|
|
6
|
+
* A second palette is a colour change on one layer; worn equipment shows because it is
|
|
7
|
+
* another layer added on top, not a redrawn sprite for every gear combination a game might
|
|
8
|
+
* have. `tools/make-example-assets.mjs` already draws its characters this way; this is the
|
|
9
|
+
* runtime counterpart that keeps the layers together as one sprite that moves as a unit.
|
|
10
|
+
*/
|
|
11
|
+
export class LayeredSprite extends Container {
|
|
12
|
+
constructor() {
|
|
13
|
+
super(...arguments);
|
|
14
|
+
this.layers = new Map();
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Adds or replaces a named layer.
|
|
18
|
+
*
|
|
19
|
+
* @param order stacking order, higher drawn on top; equal order keeps insertion order
|
|
20
|
+
*/
|
|
21
|
+
addLayer(name, texture, order = 0) {
|
|
22
|
+
this.removeLayer(name);
|
|
23
|
+
const sprite = new TintedSprite(texture);
|
|
24
|
+
this.layers.set(name, { sprite, order });
|
|
25
|
+
this.addChild(sprite);
|
|
26
|
+
this.resort();
|
|
27
|
+
return sprite;
|
|
28
|
+
}
|
|
29
|
+
removeLayer(name) {
|
|
30
|
+
const existing = this.layers.get(name);
|
|
31
|
+
if (!existing)
|
|
32
|
+
return;
|
|
33
|
+
this.layers.delete(name);
|
|
34
|
+
existing.sprite.destroy();
|
|
35
|
+
}
|
|
36
|
+
layer(name) {
|
|
37
|
+
return this.layers.get(name)?.sprite;
|
|
38
|
+
}
|
|
39
|
+
hasLayer(name) {
|
|
40
|
+
return this.layers.has(name);
|
|
41
|
+
}
|
|
42
|
+
/** swaps a layer's texture without touching its tint, order, or identity - gear changing */
|
|
43
|
+
setTexture(name, texture) {
|
|
44
|
+
const layer = this.layers.get(name);
|
|
45
|
+
if (layer)
|
|
46
|
+
layer.sprite.texture = texture;
|
|
47
|
+
}
|
|
48
|
+
resort() {
|
|
49
|
+
const sorted = [...this.layers.values()].sort((a, b) => a.order - b.order);
|
|
50
|
+
sorted.forEach((layer, index) => this.setChildIndex(layer.sprite, index));
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=LayeredSprite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LayeredSprite.js","sourceRoot":"","sources":["../../src/render/LayeredSprite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEpC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAOjD;;;;;;;GAOG;AACH,MAAM,OAAO,aAAc,SAAQ,SAAS;IAA5C;;QACS,WAAM,GAAG,IAAI,GAAG,EAAiB,CAAC;IA2C3C,CAAC;IAzCA;;;;OAIG;IACH,QAAQ,CAAC,IAAY,EAAE,OAAgB,EAAE,KAAK,GAAG,CAAC;QACjD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAEvB,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC;QACzC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QACzC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACtB,IAAI,CAAC,MAAM,EAAE,CAAC;QACd,OAAO,MAAM,CAAC;IACf,CAAC;IAED,WAAW,CAAC,IAAY;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,QAAQ;YAAE,OAAO;QAEtB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACzB,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,IAAY;QACjB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACtC,CAAC;IAED,QAAQ,CAAC,IAAY;QACpB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,4FAA4F;IAC5F,UAAU,CAAC,IAAY,EAAE,OAAgB;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,KAAK;YAAE,KAAK,CAAC,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;IAC3C,CAAC;IAEO,MAAM;QACb,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QAC3E,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;IAC3E,CAAC;CACD"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export interface ProjectilePoint {
|
|
2
|
+
x: number;
|
|
3
|
+
y: number;
|
|
4
|
+
}
|
|
5
|
+
export interface ProjectileOptions {
|
|
6
|
+
/** world units per second; ignored if `duration` is given */
|
|
7
|
+
speed?: number;
|
|
8
|
+
/** seconds to cross the whole flight; overrides `speed` when both are given */
|
|
9
|
+
duration?: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Tweens a sprite's position in a straight line, world units to world units.
|
|
13
|
+
*
|
|
14
|
+
* This owns position only, the same division `GridMover` draws for tile movement: whether
|
|
15
|
+
* the shot lands, what it does on arrival, whether it should even be fired - all of that is
|
|
16
|
+
* the caller's business, decided (with `mwg/roguelike`'s targeting helpers, typically)
|
|
17
|
+
* before a `Projectile` is ever created. What is here is just "this point moves to that
|
|
18
|
+
* point over time", because a thrown potion and a wand bolt both need exactly that and
|
|
19
|
+
* nothing about the game's own arithmetic.
|
|
20
|
+
*/
|
|
21
|
+
export declare class Projectile {
|
|
22
|
+
private sprite;
|
|
23
|
+
private fromX;
|
|
24
|
+
private fromY;
|
|
25
|
+
private toX;
|
|
26
|
+
private toY;
|
|
27
|
+
private duration;
|
|
28
|
+
private elapsed;
|
|
29
|
+
private arrived;
|
|
30
|
+
constructor(sprite: ProjectilePoint, from: ProjectilePoint, to: ProjectilePoint, options?: ProjectileOptions);
|
|
31
|
+
get done(): boolean;
|
|
32
|
+
/** 0 at launch, 1 on arrival */
|
|
33
|
+
get progress(): number;
|
|
34
|
+
/** @returns true the instant it arrives, so a caller can trigger impact exactly once */
|
|
35
|
+
update(dt: number): boolean;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=Projectile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Projectile.d.ts","sourceRoot":"","sources":["../../src/render/Projectile.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC/B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACV;AAED,MAAM,WAAW,iBAAiB;IACjC,6DAA6D;IAC7D,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;GASG;AACH,qBAAa,UAAU;IACtB,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,OAAO,CAAS;IAExB,YAAY,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE,EAAE,eAAe,EAAE,OAAO,GAAE,iBAAsB,EAc/G;IAED,IAAI,IAAI,IAAI,OAAO,CAElB;IAED,gCAAgC;IAChC,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,wFAAwF;IACxF,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAa1B;CACD"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tweens a sprite's position in a straight line, world units to world units.
|
|
3
|
+
*
|
|
4
|
+
* This owns position only, the same division `GridMover` draws for tile movement: whether
|
|
5
|
+
* the shot lands, what it does on arrival, whether it should even be fired - all of that is
|
|
6
|
+
* the caller's business, decided (with `mwg/roguelike`'s targeting helpers, typically)
|
|
7
|
+
* before a `Projectile` is ever created. What is here is just "this point moves to that
|
|
8
|
+
* point over time", because a thrown potion and a wand bolt both need exactly that and
|
|
9
|
+
* nothing about the game's own arithmetic.
|
|
10
|
+
*/
|
|
11
|
+
export class Projectile {
|
|
12
|
+
constructor(sprite, from, to, options = {}) {
|
|
13
|
+
this.elapsed = 0;
|
|
14
|
+
this.arrived = false;
|
|
15
|
+
this.sprite = sprite;
|
|
16
|
+
this.fromX = from.x;
|
|
17
|
+
this.fromY = from.y;
|
|
18
|
+
this.toX = to.x;
|
|
19
|
+
this.toY = to.y;
|
|
20
|
+
const distance = Math.hypot(to.x - from.x, to.y - from.y);
|
|
21
|
+
this.duration = options.duration ?? distance / (options.speed ?? 400);
|
|
22
|
+
//a zero-length flight (fired at your own feet) still resolves in one update
|
|
23
|
+
if (this.duration <= 0)
|
|
24
|
+
this.duration = 1e-6;
|
|
25
|
+
sprite.x = from.x;
|
|
26
|
+
sprite.y = from.y;
|
|
27
|
+
}
|
|
28
|
+
get done() {
|
|
29
|
+
return this.arrived;
|
|
30
|
+
}
|
|
31
|
+
/** 0 at launch, 1 on arrival */
|
|
32
|
+
get progress() {
|
|
33
|
+
return Math.min(1, this.elapsed / this.duration);
|
|
34
|
+
}
|
|
35
|
+
/** @returns true the instant it arrives, so a caller can trigger impact exactly once */
|
|
36
|
+
update(dt) {
|
|
37
|
+
if (this.arrived)
|
|
38
|
+
return false;
|
|
39
|
+
this.elapsed += dt;
|
|
40
|
+
const t = this.progress;
|
|
41
|
+
this.sprite.x = this.fromX + (this.toX - this.fromX) * t;
|
|
42
|
+
this.sprite.y = this.fromY + (this.toY - this.fromY) * t;
|
|
43
|
+
if (t >= 1) {
|
|
44
|
+
this.arrived = true;
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=Projectile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Projectile.js","sourceRoot":"","sources":["../../src/render/Projectile.ts"],"names":[],"mappings":"AAaA;;;;;;;;;GASG;AACH,MAAM,OAAO,UAAU;IAUtB,YAAY,MAAuB,EAAE,IAAqB,EAAE,EAAmB,EAAE,OAAO,GAAsB,EAAE;QAHxG,YAAO,GAAG,CAAC,CAAC;QACZ,YAAO,GAAG,KAAK,CAAC;QAGvB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC;QACpB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC;QACpB,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;QAChB,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;QAEhB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1D,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,QAAQ,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC;QACtE,4EAA4E;QAC5E,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC;YAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QAE7C,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QAClB,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IACnB,CAAC;IAED,IAAI,IAAI;QACP,OAAO,IAAI,CAAC,OAAO,CAAC;IACrB,CAAC;IAED,gCAAgC;IAChC,IAAI,QAAQ;QACX,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;IAClD,CAAC;IAED,wFAAwF;IACxF,MAAM,CAAC,EAAU;QAChB,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC;QAE/B,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;QACnB,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;QACxB,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACzD,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAEzD,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACZ,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,OAAO,IAAI,CAAC;QACb,CAAC;QACD,OAAO,KAAK,CAAC;IACd,CAAC;CACD"}
|