@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,33 @@
|
|
|
1
|
+
import type { GameState } from './GameState.ts';
|
|
2
|
+
import type { EventCommand } from './EventRunner.ts';
|
|
3
|
+
/** when a page's commands run */
|
|
4
|
+
export type EventTrigger = 'action' | 'touch' | 'autorun' | 'parallel';
|
|
5
|
+
export type EventCondition = {
|
|
6
|
+
switch: string;
|
|
7
|
+
equals: boolean;
|
|
8
|
+
} | {
|
|
9
|
+
variable: string;
|
|
10
|
+
atLeast: number;
|
|
11
|
+
};
|
|
12
|
+
export interface EventPage {
|
|
13
|
+
/** every condition must hold for this page to be selected */
|
|
14
|
+
conditions?: EventCondition[];
|
|
15
|
+
trigger: EventTrigger;
|
|
16
|
+
commands: EventCommand[];
|
|
17
|
+
/** the frame shown on the map for this page; omit for no graphic */
|
|
18
|
+
frame?: number | string;
|
|
19
|
+
}
|
|
20
|
+
export interface MapEvent {
|
|
21
|
+
id: string;
|
|
22
|
+
x: number;
|
|
23
|
+
y: number;
|
|
24
|
+
pages: EventPage[];
|
|
25
|
+
}
|
|
26
|
+
export declare function conditionHolds(condition: EventCondition, state: GameState): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* The last page whose conditions all hold - the same convention RPG Maker uses, so an event
|
|
29
|
+
* is authored as an ordered list running from "default behaviour" to "most specific", and
|
|
30
|
+
* whichever specific case currently applies overrides the general one before it.
|
|
31
|
+
*/
|
|
32
|
+
export declare function activePage(event: MapEvent, state: GameState): EventPage | undefined;
|
|
33
|
+
//# sourceMappingURL=Event.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Event.d.ts","sourceRoot":"","sources":["../../src/rpg/Event.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD,iCAAiC;AACjC,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,UAAU,CAAC;AAEvE,MAAM,MAAM,cAAc,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzG,MAAM,WAAW,SAAS;IACzB,6DAA6D;IAC7D,UAAU,CAAC,EAAE,cAAc,EAAE,CAAC;IAC9B,OAAO,EAAE,YAAY,CAAC;IACtB,QAAQ,EAAE,YAAY,EAAE,CAAC;IAEzB,oEAAoE;IACpE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,QAAQ;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,SAAS,EAAE,CAAC;CACnB;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,cAAc,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAGnF;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAMnF"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export function conditionHolds(condition, state) {
|
|
2
|
+
if ('switch' in condition)
|
|
3
|
+
return state.switch(condition.switch) === condition.equals;
|
|
4
|
+
return state.variable(condition.variable) >= condition.atLeast;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* The last page whose conditions all hold - the same convention RPG Maker uses, so an event
|
|
8
|
+
* is authored as an ordered list running from "default behaviour" to "most specific", and
|
|
9
|
+
* whichever specific case currently applies overrides the general one before it.
|
|
10
|
+
*/
|
|
11
|
+
export function activePage(event, state) {
|
|
12
|
+
let match;
|
|
13
|
+
for (const page of event.pages) {
|
|
14
|
+
if ((page.conditions ?? []).every((c) => conditionHolds(c, state)))
|
|
15
|
+
match = page;
|
|
16
|
+
}
|
|
17
|
+
return match;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=Event.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Event.js","sourceRoot":"","sources":["../../src/rpg/Event.ts"],"names":[],"mappings":"AAyBA,MAAM,UAAU,cAAc,CAAC,SAAyB,EAAE,KAAgB;IACzE,IAAI,QAAQ,IAAI,SAAS;QAAE,OAAO,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,SAAS,CAAC,MAAM,CAAC;IACtF,OAAO,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAC,OAAO,CAAC;AAChE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,KAAe,EAAE,KAAgB;IAC3D,IAAI,KAA4B,CAAC;IACjC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAChC,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YAAE,KAAK,GAAG,IAAI,CAAC;IAClF,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { type Choice } from '../ui/MessageBox.ts';
|
|
2
|
+
import type { WindowStack } from '../ui/WindowStack.ts';
|
|
3
|
+
import { type EventCondition } from './Event.ts';
|
|
4
|
+
import type { GameState } from './GameState.ts';
|
|
5
|
+
export interface MoveStep {
|
|
6
|
+
dx: number;
|
|
7
|
+
dy: number;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* A map event's script, written as data - the same shape `mwg/stage`'s `StageCommand` is,
|
|
11
|
+
* but for map events rather than dialogue scenes: switches, variables and branches instead
|
|
12
|
+
* of a backdrop and characters. Kept as its own interpreter because the two run on
|
|
13
|
+
* genuinely different state, not because the "list of commands, awaited as one call" shape
|
|
14
|
+
* needed reinventing.
|
|
15
|
+
*/
|
|
16
|
+
export type EventCommand = {
|
|
17
|
+
say: string;
|
|
18
|
+
speaker?: string;
|
|
19
|
+
} | {
|
|
20
|
+
ask: string;
|
|
21
|
+
speaker?: string;
|
|
22
|
+
choices: Choice[];
|
|
23
|
+
store?: string;
|
|
24
|
+
} | {
|
|
25
|
+
wait: number;
|
|
26
|
+
} | {
|
|
27
|
+
setSwitch: string;
|
|
28
|
+
value: boolean;
|
|
29
|
+
} | {
|
|
30
|
+
setVariable: string;
|
|
31
|
+
value: number;
|
|
32
|
+
} | {
|
|
33
|
+
addVariable: string;
|
|
34
|
+
amount: number;
|
|
35
|
+
} | {
|
|
36
|
+
if: EventCondition;
|
|
37
|
+
then: EventCommand[];
|
|
38
|
+
else?: EventCommand[];
|
|
39
|
+
} | {
|
|
40
|
+
move: {
|
|
41
|
+
target: string;
|
|
42
|
+
steps: MoveStep[];
|
|
43
|
+
};
|
|
44
|
+
} | {
|
|
45
|
+
call: (state: EventRunnerState) => void | Promise<void>;
|
|
46
|
+
};
|
|
47
|
+
export interface EventRunnerState {
|
|
48
|
+
game: GameState;
|
|
49
|
+
/** whatever `ask` commands have stored, keyed by their `store` name */
|
|
50
|
+
answers: Record<string, unknown>;
|
|
51
|
+
}
|
|
52
|
+
export interface EventRunnerOptions {
|
|
53
|
+
windows: WindowStack;
|
|
54
|
+
game: GameState;
|
|
55
|
+
/** carries out a move command; the runner itself does not know what "moving" means */
|
|
56
|
+
move?: (target: string, steps: readonly MoveStep[]) => Promise<void>;
|
|
57
|
+
/** width/height of the dialogue box; characters revealed per second */
|
|
58
|
+
boxWidth?: number;
|
|
59
|
+
boxHeight?: number;
|
|
60
|
+
speed?: number;
|
|
61
|
+
}
|
|
62
|
+
export declare class EventRunner {
|
|
63
|
+
private options;
|
|
64
|
+
readonly state: EventRunnerState;
|
|
65
|
+
private cancelled;
|
|
66
|
+
constructor(options: EventRunnerOptions);
|
|
67
|
+
cancel(): void;
|
|
68
|
+
run(commands: readonly EventCommand[]): Promise<EventRunnerState>;
|
|
69
|
+
private step;
|
|
70
|
+
private speak;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=EventRunner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EventRunner.d.ts","sourceRoot":"","sources":["../../src/rpg/EventRunner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAkB,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,MAAM,WAAW,QAAQ;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;CACX;AAED;;;;;;GAMG;AACH,MAAM,MAAM,YAAY,GACrB;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACpE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GACrC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACtC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACvC;IAAE,EAAE,EAAE,cAAc,CAAC;IAAC,IAAI,EAAE,YAAY,EAAE,CAAC;IAAC,IAAI,CAAC,EAAE,YAAY,EAAE,CAAA;CAAE,GACnE;IAAE,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,QAAQ,EAAE,CAAA;KAAE,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAAC;AAE/D,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,SAAS,CAAC;IAChB,uEAAuE;IACvE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,kBAAkB;IAClC,OAAO,EAAE,WAAW,CAAC;IACrB,IAAI,EAAE,SAAS,CAAC;IAEhB,sFAAsF;IACtF,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,QAAQ,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAErE,uEAAuE;IACvE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,WAAW;IACvB,OAAO,CAAC,OAAO,CAAqB;IACpC,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAC;IACjC,OAAO,CAAC,SAAS,CAAS;IAE1B,YAAY,OAAO,EAAE,kBAAkB,EAGtC;IAED,MAAM,IAAI,IAAI,CAEb;IAEK,GAAG,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAMtE;YAEa,IAAI;IAiDlB,OAAO,CAAC,KAAK;CAgBb"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { MessageBox } from '../ui/MessageBox.js';
|
|
2
|
+
import { conditionHolds } from './Event.js';
|
|
3
|
+
export class EventRunner {
|
|
4
|
+
constructor(options) {
|
|
5
|
+
this.cancelled = false;
|
|
6
|
+
this.options = options;
|
|
7
|
+
this.state = { game: options.game, answers: {} };
|
|
8
|
+
}
|
|
9
|
+
cancel() {
|
|
10
|
+
this.cancelled = true;
|
|
11
|
+
}
|
|
12
|
+
async run(commands) {
|
|
13
|
+
for (const command of commands) {
|
|
14
|
+
if (this.cancelled)
|
|
15
|
+
break;
|
|
16
|
+
await this.step(command);
|
|
17
|
+
}
|
|
18
|
+
return this.state;
|
|
19
|
+
}
|
|
20
|
+
async step(command) {
|
|
21
|
+
if ('say' in command) {
|
|
22
|
+
await this.speak(command.say, command.speaker);
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
if ('ask' in command) {
|
|
26
|
+
const chosen = await this.speak(command.ask, command.speaker, command.choices);
|
|
27
|
+
if (command.store)
|
|
28
|
+
this.state.answers[command.store] = chosen;
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
if ('wait' in command) {
|
|
32
|
+
await new Promise((resolve) => setTimeout(resolve, command.wait * 1000));
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
if ('setSwitch' in command) {
|
|
36
|
+
this.state.game.setSwitch(command.setSwitch, command.value);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
if ('setVariable' in command) {
|
|
40
|
+
this.state.game.setVariable(command.setVariable, command.value);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
if ('addVariable' in command) {
|
|
44
|
+
const current = this.state.game.variable(command.addVariable);
|
|
45
|
+
this.state.game.setVariable(command.addVariable, current + command.amount);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
if ('if' in command) {
|
|
49
|
+
const holds = conditionHolds(command.if, this.state.game);
|
|
50
|
+
await this.run(holds ? command.then : (command.else ?? []));
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
if ('move' in command) {
|
|
54
|
+
await this.options.move?.(command.move.target, command.move.steps);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
if ('call' in command) {
|
|
58
|
+
await command.call(this.state);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
speak(text, speaker, choices) {
|
|
62
|
+
const { windows } = this.options;
|
|
63
|
+
return new Promise((resolve) => {
|
|
64
|
+
windows.push(new MessageBox({
|
|
65
|
+
width: this.options.boxWidth ?? 480,
|
|
66
|
+
height: this.options.boxHeight ?? 120,
|
|
67
|
+
speed: this.options.speed ?? 45,
|
|
68
|
+
pages: [{ text, speaker }],
|
|
69
|
+
choices,
|
|
70
|
+
anchor: 'bottom',
|
|
71
|
+
onDone: (chosen) => resolve(chosen),
|
|
72
|
+
}));
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=EventRunner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EventRunner.js","sourceRoot":"","sources":["../../src/rpg/EventRunner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Global switches and variables - the two pieces of state an RPG's events read and write
|
|
3
|
+
* most, kept as plain maps rather than anything fancier so `mwg/core`'s eventual save
|
|
4
|
+
* system (see the roadmap) can serialise them like any other plain data.
|
|
5
|
+
*/
|
|
6
|
+
export declare class GameState {
|
|
7
|
+
private switches;
|
|
8
|
+
private variables;
|
|
9
|
+
switch(name: string): boolean;
|
|
10
|
+
setSwitch(name: string, value: boolean): void;
|
|
11
|
+
variable(name: string): number;
|
|
12
|
+
setVariable(name: string, value: number): void;
|
|
13
|
+
toJSON(): {
|
|
14
|
+
switches: [string, boolean][];
|
|
15
|
+
variables: [string, number][];
|
|
16
|
+
};
|
|
17
|
+
static fromJSON(data: {
|
|
18
|
+
switches: [string, boolean][];
|
|
19
|
+
variables: [string, number][];
|
|
20
|
+
}): GameState;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=GameState.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GameState.d.ts","sourceRoot":"","sources":["../../src/rpg/GameState.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,qBAAa,SAAS;IACrB,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,SAAS,CAA6B;IAE9C,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE5B;IAED,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAE5C;IAED,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7B;IAED,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAE7C;IAED,MAAM,IAAI;QAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;QAAC,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAA;KAAE,CAEzE;IAED,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE;QAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;QAAC,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAA;KAAE,GAAG,SAAS,CAKjG;CACD"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Global switches and variables - the two pieces of state an RPG's events read and write
|
|
3
|
+
* most, kept as plain maps rather than anything fancier so `mwg/core`'s eventual save
|
|
4
|
+
* system (see the roadmap) can serialise them like any other plain data.
|
|
5
|
+
*/
|
|
6
|
+
export class GameState {
|
|
7
|
+
constructor() {
|
|
8
|
+
this.switches = new Map();
|
|
9
|
+
this.variables = new Map();
|
|
10
|
+
}
|
|
11
|
+
switch(name) {
|
|
12
|
+
return this.switches.get(name) ?? false;
|
|
13
|
+
}
|
|
14
|
+
setSwitch(name, value) {
|
|
15
|
+
this.switches.set(name, value);
|
|
16
|
+
}
|
|
17
|
+
variable(name) {
|
|
18
|
+
return this.variables.get(name) ?? 0;
|
|
19
|
+
}
|
|
20
|
+
setVariable(name, value) {
|
|
21
|
+
this.variables.set(name, value);
|
|
22
|
+
}
|
|
23
|
+
toJSON() {
|
|
24
|
+
return { switches: [...this.switches], variables: [...this.variables] };
|
|
25
|
+
}
|
|
26
|
+
static fromJSON(data) {
|
|
27
|
+
const state = new GameState();
|
|
28
|
+
for (const [name, value] of data.switches)
|
|
29
|
+
state.setSwitch(name, value);
|
|
30
|
+
for (const [name, value] of data.variables)
|
|
31
|
+
state.setVariable(name, value);
|
|
32
|
+
return state;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=GameState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GameState.js","sourceRoot":"","sources":["../../src/rpg/GameState.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,OAAO,SAAS;IAAtB;QACS,aAAQ,GAAG,IAAI,GAAG,EAAmB,CAAC;QACtC,cAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IA4B/C,CAAC;IA1BA,MAAM,CAAC,IAAY;QAClB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC;IACzC,CAAC;IAED,SAAS,CAAC,IAAY,EAAE,KAAc;QACrC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAChC,CAAC;IAED,QAAQ,CAAC,IAAY;QACpB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IAED,WAAW,CAAC,IAAY,EAAE,KAAa;QACtC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACjC,CAAC;IAED,MAAM;QACL,OAAO,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;IACzE,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,IAAsE;QACrF,MAAM,KAAK,GAAG,IAAI,SAAS,EAAE,CAAC;QAC9B,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ;YAAE,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACxE,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,SAAS;YAAE,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC3E,OAAO,KAAK,CAAC;IACd,CAAC;CACD"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { AnimatedSprite } from '../render/AnimatedSprite.ts';
|
|
2
|
+
export type Direction4 = 'up' | 'down' | 'left' | 'right';
|
|
3
|
+
export interface GridMoverOptions {
|
|
4
|
+
tileWidth: number;
|
|
5
|
+
tileHeight: number;
|
|
6
|
+
/** tiles crossed per second */
|
|
7
|
+
speed?: number;
|
|
8
|
+
/** an animation name to play while moving in this direction, if the sprite has one */
|
|
9
|
+
walkAnimation?: (direction: Direction4) => string;
|
|
10
|
+
/** an animation name to play while standing still facing this direction */
|
|
11
|
+
idleAnimation?: (direction: Direction4) => string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Grid movement tweened between tiles, with a walk cycle - what turns "the player pressed
|
|
15
|
+
* right" into a sprite that glides from one tile to the next and faces the way it is going,
|
|
16
|
+
* rather than teleporting square to square.
|
|
17
|
+
*
|
|
18
|
+
* This owns position and animation only. Whether the target tile is passable, whether
|
|
19
|
+
* something is standing on it, whether stepping onto it should trigger an event - all of
|
|
20
|
+
* that is a question for the map, asked before `moveBy` is called.
|
|
21
|
+
*/
|
|
22
|
+
export declare class GridMover {
|
|
23
|
+
x: number;
|
|
24
|
+
y: number;
|
|
25
|
+
facing: Direction4;
|
|
26
|
+
private sprite;
|
|
27
|
+
private tileWidth;
|
|
28
|
+
private tileHeight;
|
|
29
|
+
private speed;
|
|
30
|
+
private options;
|
|
31
|
+
private fromX;
|
|
32
|
+
private fromY;
|
|
33
|
+
private target;
|
|
34
|
+
private progress;
|
|
35
|
+
constructor(sprite: AnimatedSprite, x: number, y: number, options: GridMoverOptions);
|
|
36
|
+
get isMoving(): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Faces a direction without moving - what a bump into a wall or an NPC turns into,
|
|
39
|
+
* rather than nothing at all. Without this, a player who arrives beside an NPC from the
|
|
40
|
+
* "wrong" side can never turn to face it, since an actual step that way is blocked and
|
|
41
|
+
* `moveBy` only ever faces the direction it successfully moves in.
|
|
42
|
+
*/
|
|
43
|
+
turnTo(dx: number, dy: number): void;
|
|
44
|
+
/** starts moving one tile in the given direction; false when already moving */
|
|
45
|
+
moveBy(dx: number, dy: number): boolean;
|
|
46
|
+
update(dt: number): void;
|
|
47
|
+
private place;
|
|
48
|
+
private playWalk;
|
|
49
|
+
private playIdle;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=GridMover.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GridMover.d.ts","sourceRoot":"","sources":["../../src/rpg/GridMover.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAElE,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE1D,MAAM,WAAW,gBAAgB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IAEnB,+BAA+B;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,sFAAsF;IACtF,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,UAAU,KAAK,MAAM,CAAC;IAElD,2EAA2E;IAC3E,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,UAAU,KAAK,MAAM,CAAC;CAClD;AAED;;;;;;;;GAQG;AACH,qBAAa,SAAS;IACrB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,MAAM,EAAE,UAAU,CAAU;IAE5B,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAmB;IAElC,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,MAAM,CAAyC;IACvD,OAAO,CAAC,QAAQ,CAAK;IAErB,YAAY,MAAM,EAAE,cAAc,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAWlF;IAED,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED;;;;;OAKG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAInC;IAED,+EAA+E;IAC/E,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAUtC;IAED,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAcvB;IAED,OAAO,CAAC,KAAK;IAKb,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,QAAQ;CAIhB"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Grid movement tweened between tiles, with a walk cycle - what turns "the player pressed
|
|
3
|
+
* right" into a sprite that glides from one tile to the next and faces the way it is going,
|
|
4
|
+
* rather than teleporting square to square.
|
|
5
|
+
*
|
|
6
|
+
* This owns position and animation only. Whether the target tile is passable, whether
|
|
7
|
+
* something is standing on it, whether stepping onto it should trigger an event - all of
|
|
8
|
+
* that is a question for the map, asked before `moveBy` is called.
|
|
9
|
+
*/
|
|
10
|
+
export class GridMover {
|
|
11
|
+
constructor(sprite, x, y, options) {
|
|
12
|
+
this.facing = 'down';
|
|
13
|
+
this.target = null;
|
|
14
|
+
this.progress = 0;
|
|
15
|
+
this.sprite = sprite;
|
|
16
|
+
this.x = this.fromX = x;
|
|
17
|
+
this.y = this.fromY = y;
|
|
18
|
+
this.tileWidth = options.tileWidth;
|
|
19
|
+
this.tileHeight = options.tileHeight;
|
|
20
|
+
this.speed = options.speed ?? 4;
|
|
21
|
+
this.options = options;
|
|
22
|
+
this.place();
|
|
23
|
+
this.playIdle();
|
|
24
|
+
}
|
|
25
|
+
get isMoving() {
|
|
26
|
+
return this.target !== null;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Faces a direction without moving - what a bump into a wall or an NPC turns into,
|
|
30
|
+
* rather than nothing at all. Without this, a player who arrives beside an NPC from the
|
|
31
|
+
* "wrong" side can never turn to face it, since an actual step that way is blocked and
|
|
32
|
+
* `moveBy` only ever faces the direction it successfully moves in.
|
|
33
|
+
*/
|
|
34
|
+
turnTo(dx, dy) {
|
|
35
|
+
if (this.target)
|
|
36
|
+
return;
|
|
37
|
+
this.facing = directionOf(dx, dy);
|
|
38
|
+
this.playIdle();
|
|
39
|
+
}
|
|
40
|
+
/** starts moving one tile in the given direction; false when already moving */
|
|
41
|
+
moveBy(dx, dy) {
|
|
42
|
+
if (this.target)
|
|
43
|
+
return false;
|
|
44
|
+
this.facing = directionOf(dx, dy);
|
|
45
|
+
this.fromX = this.x;
|
|
46
|
+
this.fromY = this.y;
|
|
47
|
+
this.target = { x: this.x + dx, y: this.y + dy };
|
|
48
|
+
this.progress = 0;
|
|
49
|
+
this.playWalk();
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
update(dt) {
|
|
53
|
+
this.sprite.update(dt);
|
|
54
|
+
if (!this.target)
|
|
55
|
+
return;
|
|
56
|
+
this.progress = Math.min(1, this.progress + this.speed * dt);
|
|
57
|
+
this.sprite.x = lerp(this.fromX, this.target.x, this.progress) * this.tileWidth;
|
|
58
|
+
this.sprite.y = lerp(this.fromY, this.target.y, this.progress) * this.tileHeight;
|
|
59
|
+
if (this.progress >= 1) {
|
|
60
|
+
this.x = this.target.x;
|
|
61
|
+
this.y = this.target.y;
|
|
62
|
+
this.target = null;
|
|
63
|
+
this.playIdle();
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
place() {
|
|
67
|
+
this.sprite.x = this.x * this.tileWidth;
|
|
68
|
+
this.sprite.y = this.y * this.tileHeight;
|
|
69
|
+
}
|
|
70
|
+
playWalk() {
|
|
71
|
+
const name = this.options.walkAnimation?.(this.facing);
|
|
72
|
+
if (name && this.sprite.has(name))
|
|
73
|
+
this.sprite.play(name);
|
|
74
|
+
}
|
|
75
|
+
playIdle() {
|
|
76
|
+
const name = this.options.idleAnimation?.(this.facing);
|
|
77
|
+
if (name && this.sprite.has(name))
|
|
78
|
+
this.sprite.play(name);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
function directionOf(dx, dy) {
|
|
82
|
+
if (dx > 0)
|
|
83
|
+
return 'right';
|
|
84
|
+
if (dx < 0)
|
|
85
|
+
return 'left';
|
|
86
|
+
return dy > 0 ? 'down' : 'up';
|
|
87
|
+
}
|
|
88
|
+
function lerp(from, to, t) {
|
|
89
|
+
return from + (to - from) * t;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=GridMover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GridMover.js","sourceRoot":"","sources":["../../src/rpg/GridMover.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import type { GameState } from './GameState.ts';
|
|
2
|
+
import { type EventCondition } from './Event.ts';
|
|
3
|
+
/**
|
|
4
|
+
* One step of a quest: complete once its condition holds, or once its counter reaches a
|
|
5
|
+
* target - "kill 5 rats: 3/5" is a counter stage, "talked to the shopkeeper" a condition
|
|
6
|
+
* one, read off the same `GameState` switches/variables `EventRunner`'s `activePage`
|
|
7
|
+
* conditions already do. A stage with neither is a pure milestone, complete the instant it
|
|
8
|
+
* becomes current - the shape a quest's very first or very last stage often wants.
|
|
9
|
+
*/
|
|
10
|
+
export interface QuestStage {
|
|
11
|
+
condition?: EventCondition;
|
|
12
|
+
counter?: {
|
|
13
|
+
variable: string;
|
|
14
|
+
target: number;
|
|
15
|
+
};
|
|
16
|
+
/** shown in a quest log's progress readout; `mwg` never reads this itself */
|
|
17
|
+
description?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface QuestDefinition {
|
|
20
|
+
id: string;
|
|
21
|
+
stages: QuestStage[];
|
|
22
|
+
/** quest ids that must already be complete before this one can start */
|
|
23
|
+
requires?: string[];
|
|
24
|
+
}
|
|
25
|
+
export type QuestStatus = 'unavailable' | 'available' | 'active' | 'complete';
|
|
26
|
+
/**
|
|
27
|
+
* Tracks which stage every known quest is on, against `GameState`'s existing switches and
|
|
28
|
+
* variables - not a storage mechanism of its own. A quest's *definition* (its stages, its
|
|
29
|
+
* prerequisites) is static game content, supplied once, the same way the dungeon example's
|
|
30
|
+
* `ITEMS` table is; only which stage each quest has reached is what gets saved.
|
|
31
|
+
*/
|
|
32
|
+
export declare class QuestLog {
|
|
33
|
+
private definitions;
|
|
34
|
+
/** the stage index a started quest is on; absent means not yet started */
|
|
35
|
+
private stageIndex;
|
|
36
|
+
define(quest: QuestDefinition): void;
|
|
37
|
+
/** whether every prerequisite is already complete, so the quest could be started */
|
|
38
|
+
canStart(id: string): boolean;
|
|
39
|
+
/** begins a quest; throws if a prerequisite is not yet complete */
|
|
40
|
+
start(id: string): void;
|
|
41
|
+
status(id: string): QuestStatus;
|
|
42
|
+
/** the stage a quest is currently on; `null` once complete or before it has started */
|
|
43
|
+
currentStage(id: string): QuestStage | null;
|
|
44
|
+
/** progress, 0 to 1, towards the current stage's counter; `null` for a condition stage */
|
|
45
|
+
progress(id: string, state: GameState): number | null;
|
|
46
|
+
/**
|
|
47
|
+
* Moves a quest on if its current stage's condition or counter is now satisfied.
|
|
48
|
+
*
|
|
49
|
+
* A game calls this after anything that might have finished a stage - an event, a kill,
|
|
50
|
+
* picking up an item - the same way `EventRunner` re-checks `activePage` rather than
|
|
51
|
+
* being told directly when to move on. A single call advances at most one stage, even if
|
|
52
|
+
* the next one would also already be satisfied; call it again (a fresh turn, a fresh
|
|
53
|
+
* check) to walk through several at once.
|
|
54
|
+
*
|
|
55
|
+
* @returns true if a stage (or the whole quest) completed this call
|
|
56
|
+
*/
|
|
57
|
+
advance(id: string, state: GameState): boolean;
|
|
58
|
+
private require;
|
|
59
|
+
toJSON(): {
|
|
60
|
+
stageIndex: [string, number][];
|
|
61
|
+
};
|
|
62
|
+
/** rebuilds a log from save data - `definitions` are supplied fresh, the same as `ITEMS` */
|
|
63
|
+
static fromJSON(definitions: QuestDefinition[], data: {
|
|
64
|
+
stageIndex: [string, number][];
|
|
65
|
+
}): QuestLog;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=Quest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Quest.d.ts","sourceRoot":"","sources":["../../src/rpg/Quest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAkB,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjE;;;;;;GAMG;AACH,MAAM,WAAW,UAAU;IAC1B,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,OAAO,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAE/C,6EAA6E;IAC7E,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,UAAU,EAAE,CAAC;IAErB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,MAAM,WAAW,GAAG,aAAa,GAAG,WAAW,GAAG,QAAQ,GAAG,UAAU,CAAC;AAE9E;;;;;GAKG;AACH,qBAAa,QAAQ;IACpB,OAAO,CAAC,WAAW,CAAsC;IAEzD,0EAA0E;IAC1E,OAAO,CAAC,UAAU,CAA6B;IAE/C,MAAM,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAEnC;IAED,oFAAoF;IACpF,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAG5B;IAED,mEAAmE;IACnE,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAGtB;IAED,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW,CAK9B;IAED,uFAAuF;IACvF,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAG1C;IAED,0FAA0F;IAC1F,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,MAAM,GAAG,IAAI,CAIpD;IAED;;;;;;;;;;OAUG;IACH,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAa7C;IAED,OAAO,CAAC,OAAO;IAMf,MAAM,IAAI;QAAE,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAA;KAAE,CAE3C;IAED,4FAA4F;IAC5F,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,eAAe,EAAE,EAAE,IAAI,EAAE;QAAE,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAA;KAAE,GAAG,QAAQ,CAKlG;CACD"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { conditionHolds } from './Event.js';
|
|
2
|
+
/**
|
|
3
|
+
* Tracks which stage every known quest is on, against `GameState`'s existing switches and
|
|
4
|
+
* variables - not a storage mechanism of its own. A quest's *definition* (its stages, its
|
|
5
|
+
* prerequisites) is static game content, supplied once, the same way the dungeon example's
|
|
6
|
+
* `ITEMS` table is; only which stage each quest has reached is what gets saved.
|
|
7
|
+
*/
|
|
8
|
+
export class QuestLog {
|
|
9
|
+
constructor() {
|
|
10
|
+
this.definitions = new Map();
|
|
11
|
+
/** the stage index a started quest is on; absent means not yet started */
|
|
12
|
+
this.stageIndex = new Map();
|
|
13
|
+
}
|
|
14
|
+
define(quest) {
|
|
15
|
+
this.definitions.set(quest.id, quest);
|
|
16
|
+
}
|
|
17
|
+
/** whether every prerequisite is already complete, so the quest could be started */
|
|
18
|
+
canStart(id) {
|
|
19
|
+
const quest = this.require(id);
|
|
20
|
+
return (quest.requires ?? []).every((r) => this.status(r) === 'complete');
|
|
21
|
+
}
|
|
22
|
+
/** begins a quest; throws if a prerequisite is not yet complete */
|
|
23
|
+
start(id) {
|
|
24
|
+
if (!this.canStart(id))
|
|
25
|
+
throw new Error(`quest "${id}" cannot start yet - a prerequisite is incomplete`);
|
|
26
|
+
this.stageIndex.set(id, 0);
|
|
27
|
+
}
|
|
28
|
+
status(id) {
|
|
29
|
+
const quest = this.require(id);
|
|
30
|
+
const index = this.stageIndex.get(id);
|
|
31
|
+
if (index === undefined)
|
|
32
|
+
return this.canStart(id) ? 'available' : 'unavailable';
|
|
33
|
+
return index >= quest.stages.length ? 'complete' : 'active';
|
|
34
|
+
}
|
|
35
|
+
/** the stage a quest is currently on; `null` once complete or before it has started */
|
|
36
|
+
currentStage(id) {
|
|
37
|
+
if (this.status(id) !== 'active')
|
|
38
|
+
return null;
|
|
39
|
+
return this.require(id).stages[this.stageIndex.get(id)];
|
|
40
|
+
}
|
|
41
|
+
/** progress, 0 to 1, towards the current stage's counter; `null` for a condition stage */
|
|
42
|
+
progress(id, state) {
|
|
43
|
+
const stage = this.currentStage(id);
|
|
44
|
+
if (!stage?.counter)
|
|
45
|
+
return null;
|
|
46
|
+
return Math.min(1, state.variable(stage.counter.variable) / stage.counter.target);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Moves a quest on if its current stage's condition or counter is now satisfied.
|
|
50
|
+
*
|
|
51
|
+
* A game calls this after anything that might have finished a stage - an event, a kill,
|
|
52
|
+
* picking up an item - the same way `EventRunner` re-checks `activePage` rather than
|
|
53
|
+
* being told directly when to move on. A single call advances at most one stage, even if
|
|
54
|
+
* the next one would also already be satisfied; call it again (a fresh turn, a fresh
|
|
55
|
+
* check) to walk through several at once.
|
|
56
|
+
*
|
|
57
|
+
* @returns true if a stage (or the whole quest) completed this call
|
|
58
|
+
*/
|
|
59
|
+
advance(id, state) {
|
|
60
|
+
const stage = this.currentStage(id);
|
|
61
|
+
if (!stage)
|
|
62
|
+
return false;
|
|
63
|
+
const done = stage.condition
|
|
64
|
+
? conditionHolds(stage.condition, state)
|
|
65
|
+
: stage.counter
|
|
66
|
+
? state.variable(stage.counter.variable) >= stage.counter.target
|
|
67
|
+
: true;
|
|
68
|
+
if (!done)
|
|
69
|
+
return false;
|
|
70
|
+
this.stageIndex.set(id, this.stageIndex.get(id) + 1);
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
require(id) {
|
|
74
|
+
const quest = this.definitions.get(id);
|
|
75
|
+
if (!quest)
|
|
76
|
+
throw new Error(`no such quest: "${id}"`);
|
|
77
|
+
return quest;
|
|
78
|
+
}
|
|
79
|
+
toJSON() {
|
|
80
|
+
return { stageIndex: [...this.stageIndex] };
|
|
81
|
+
}
|
|
82
|
+
/** rebuilds a log from save data - `definitions` are supplied fresh, the same as `ITEMS` */
|
|
83
|
+
static fromJSON(definitions, data) {
|
|
84
|
+
const log = new QuestLog();
|
|
85
|
+
for (const quest of definitions)
|
|
86
|
+
log.define(quest);
|
|
87
|
+
for (const [id, index] of data.stageIndex)
|
|
88
|
+
log.stageIndex.set(id, index);
|
|
89
|
+
return log;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=Quest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Quest.js","sourceRoot":"","sources":["../../src/rpg/Quest.ts"],"names":[],"mappings":"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"}
|