@datamoc/mw_games 0.3.1 → 0.4.0
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/README.md +401 -395
- package/dist/actors/Affix.d.ts +26 -0
- package/dist/actors/Affix.d.ts.map +1 -1
- package/dist/actors/Affix.js +32 -1
- package/dist/actors/Affix.js.map +1 -1
- package/dist/actors/Barrier.d.ts +47 -0
- package/dist/actors/Barrier.d.ts.map +1 -0
- package/dist/actors/Barrier.js +70 -0
- package/dist/actors/Barrier.js.map +1 -0
- package/dist/actors/Charges.d.ts +22 -0
- package/dist/actors/Charges.d.ts.map +1 -1
- package/dist/actors/Charges.js +26 -0
- package/dist/actors/Charges.js.map +1 -1
- package/dist/actors/Equipment.d.ts +30 -0
- package/dist/actors/Equipment.d.ts.map +1 -1
- package/dist/actors/Equipment.js +33 -1
- package/dist/actors/Equipment.js.map +1 -1
- package/dist/actors/Inventory.d.ts +58 -3
- package/dist/actors/Inventory.d.ts.map +1 -1
- package/dist/actors/Inventory.js +97 -5
- package/dist/actors/Inventory.js.map +1 -1
- package/dist/actors/ItemState.d.ts +11 -2
- package/dist/actors/ItemState.d.ts.map +1 -1
- package/dist/actors/ItemState.js +18 -2
- package/dist/actors/ItemState.js.map +1 -1
- package/dist/actors/Loot.js +1 -1
- package/dist/actors/Loot.js.map +1 -1
- package/dist/actors/Progression.d.ts +9 -0
- package/dist/actors/Progression.d.ts.map +1 -1
- package/dist/actors/Progression.js +7 -0
- package/dist/actors/Progression.js.map +1 -1
- package/dist/actors/Resource.d.ts +16 -0
- package/dist/actors/Resource.d.ts.map +1 -1
- package/dist/actors/Resource.js +22 -0
- package/dist/actors/Resource.js.map +1 -1
- package/dist/actors/SkillPoints.d.ts +14 -0
- package/dist/actors/SkillPoints.d.ts.map +1 -1
- package/dist/actors/SkillPoints.js +16 -0
- package/dist/actors/SkillPoints.js.map +1 -1
- package/dist/actors/StatBlock.d.ts +16 -0
- package/dist/actors/StatBlock.d.ts.map +1 -1
- package/dist/actors/StatBlock.js +21 -0
- package/dist/actors/StatBlock.js.map +1 -1
- package/dist/actors/Support.d.ts +2 -2
- package/dist/actors/Support.d.ts.map +1 -1
- package/dist/actors/Support.js +2 -2
- package/dist/actors/Support.js.map +1 -1
- package/dist/actors/index.d.ts +8 -5
- package/dist/actors/index.d.ts.map +1 -1
- package/dist/actors/index.js +3 -2
- package/dist/actors/index.js.map +1 -1
- package/dist/assets/ByteProgress.d.ts +27 -0
- package/dist/assets/ByteProgress.d.ts.map +1 -0
- package/dist/assets/ByteProgress.js +44 -0
- package/dist/assets/ByteProgress.js.map +1 -0
- package/dist/assets/Streaming.d.ts +1 -1
- package/dist/assets/Streaming.js +1 -1
- package/dist/assets/Streaming.js.map +1 -1
- package/dist/assets/index.d.ts +11 -52
- package/dist/assets/index.d.ts.map +1 -1
- package/dist/assets/index.js +9 -80
- package/dist/assets/index.js.map +1 -1
- package/dist/assets/loader.d.ts +34 -0
- package/dist/assets/loader.d.ts.map +1 -0
- package/dist/assets/loader.js +61 -0
- package/dist/assets/loader.js.map +1 -0
- package/dist/assets/paths.d.ts +40 -0
- package/dist/assets/paths.d.ts.map +1 -0
- package/dist/assets/paths.js +49 -0
- package/dist/assets/paths.js.map +1 -0
- package/dist/audio/Playable.js +1 -1
- package/dist/battle/Field.d.ts +2 -2
- package/dist/battle/Field.d.ts.map +1 -1
- package/dist/battle/Field.js +3 -3
- package/dist/battle/Field.js.map +1 -1
- package/dist/battle/Hooks.d.ts +7 -13
- package/dist/battle/Hooks.d.ts.map +1 -1
- package/dist/battle/Hooks.js +20 -18
- package/dist/battle/Hooks.js.map +1 -1
- package/dist/core/Hooks.d.ts +34 -0
- package/dist/core/Hooks.d.ts.map +1 -0
- package/dist/core/Hooks.js +33 -0
- package/dist/core/Hooks.js.map +1 -0
- package/dist/core/Input.d.ts +41 -0
- package/dist/core/Input.d.ts.map +1 -1
- package/dist/core/Input.js +126 -21
- package/dist/core/Input.js.map +1 -1
- package/dist/core/PlayerInput.d.ts +5 -0
- package/dist/core/PlayerInput.d.ts.map +1 -1
- package/dist/core/PlayerInput.js +11 -0
- package/dist/core/PlayerInput.js.map +1 -1
- package/dist/core/Random.d.ts +14 -5
- package/dist/core/Random.d.ts.map +1 -1
- package/dist/core/Random.js +14 -5
- package/dist/core/Random.js.map +1 -1
- package/dist/core/Scene.d.ts +16 -6
- package/dist/core/Scene.d.ts.map +1 -1
- package/dist/core/Scene.js +18 -6
- package/dist/core/Scene.js.map +1 -1
- package/dist/core/SceneStack.d.ts +8 -4
- package/dist/core/SceneStack.d.ts.map +1 -1
- package/dist/core/SceneStack.js +4 -0
- package/dist/core/SceneStack.js.map +1 -1
- package/dist/core/index.d.ts +3 -2
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1 -1
- package/dist/core/index.js.map +1 -1
- package/dist/index.d.ts +4 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -5
- package/dist/index.js.map +1 -1
- package/dist/mw_games.global.js +88 -88
- package/dist/roguelike/Boss.d.ts +4 -4
- package/dist/roguelike/Boss.d.ts.map +1 -1
- package/dist/roguelike/Boss.js +6 -6
- package/dist/roguelike/Boss.js.map +1 -1
- package/dist/roguelike/Combat.d.ts +10 -11
- package/dist/roguelike/Combat.d.ts.map +1 -1
- package/dist/roguelike/Combat.js +9 -16
- package/dist/roguelike/Combat.js.map +1 -1
- package/dist/roguelike/ContentRoll.d.ts +43 -0
- package/dist/roguelike/ContentRoll.d.ts.map +1 -0
- package/dist/roguelike/ContentRoll.js +38 -0
- package/dist/roguelike/ContentRoll.js.map +1 -0
- package/dist/roguelike/DungeonParity.d.ts +42 -0
- package/dist/roguelike/DungeonParity.d.ts.map +1 -0
- package/dist/roguelike/DungeonParity.js +63 -0
- package/dist/roguelike/DungeonParity.js.map +1 -0
- package/dist/roguelike/Features.d.ts +42 -0
- package/dist/roguelike/Features.d.ts.map +1 -0
- package/dist/roguelike/Features.js +59 -0
- package/dist/roguelike/Features.js.map +1 -0
- package/dist/roguelike/MonsterAI.js +1 -1
- package/dist/roguelike/MonsterAI.js.map +1 -1
- package/dist/roguelike/MultiStageAbility.d.ts +43 -0
- package/dist/roguelike/MultiStageAbility.d.ts.map +1 -0
- package/dist/roguelike/MultiStageAbility.js +60 -0
- package/dist/roguelike/MultiStageAbility.js.map +1 -0
- package/dist/roguelike/RoomBuilders.d.ts +43 -0
- package/dist/roguelike/RoomBuilders.d.ts.map +1 -0
- package/dist/roguelike/RoomBuilders.js +40 -0
- package/dist/roguelike/RoomBuilders.js.map +1 -0
- package/dist/roguelike/Targeting.d.ts +22 -0
- package/dist/roguelike/Targeting.d.ts.map +1 -1
- package/dist/roguelike/Targeting.js +20 -0
- package/dist/roguelike/Targeting.js.map +1 -1
- package/dist/roguelike/TriggerTracker.d.ts +36 -0
- package/dist/roguelike/TriggerTracker.d.ts.map +1 -0
- package/dist/roguelike/TriggerTracker.js +49 -0
- package/dist/roguelike/TriggerTracker.js.map +1 -0
- package/dist/roguelike/generate.d.ts +49 -0
- package/dist/roguelike/generate.d.ts.map +1 -1
- package/dist/roguelike/generate.js +38 -10
- package/dist/roguelike/generate.js.map +1 -1
- package/dist/roguelike/index.d.ts +16 -4
- package/dist/roguelike/index.d.ts.map +1 -1
- package/dist/roguelike/index.js +8 -2
- package/dist/roguelike/index.js.map +1 -1
- package/dist/rpg/EventRunner.d.ts +30 -8
- package/dist/rpg/EventRunner.d.ts.map +1 -1
- package/dist/rpg/EventRunner.js +1 -13
- package/dist/rpg/EventRunner.js.map +1 -1
- package/dist/rpg/FreeMover.d.ts +2 -2
- package/dist/rpg/FreeMover.d.ts.map +1 -1
- package/dist/rpg/FreeMover.js +5 -5
- package/dist/rpg/FreeMover.js.map +1 -1
- package/dist/rpg/GridMover.d.ts +2 -2
- package/dist/rpg/GridMover.d.ts.map +1 -1
- package/dist/rpg/GridMover.js +5 -5
- package/dist/rpg/GridMover.js.map +1 -1
- package/dist/rpg/MovableSprite.d.ts +25 -0
- package/dist/rpg/MovableSprite.d.ts.map +1 -0
- package/dist/rpg/MovableSprite.js +2 -0
- package/dist/rpg/MovableSprite.js.map +1 -0
- package/dist/rpg/Quest.d.ts +6 -1
- package/dist/rpg/Quest.d.ts.map +1 -1
- package/dist/rpg/Quest.js +6 -1
- package/dist/rpg/Quest.js.map +1 -1
- package/dist/rpg/automap.d.ts +24 -2
- package/dist/rpg/automap.d.ts.map +1 -1
- package/dist/rpg/automap.js +9 -1
- package/dist/rpg/automap.js.map +1 -1
- package/dist/rpg/index.d.ts +4 -4
- package/dist/rpg/index.d.ts.map +1 -1
- package/dist/rpg/index.js +1 -1
- package/dist/rpg/index.js.map +1 -1
- package/dist/three-d/Character3D.d.ts +26 -1
- package/dist/three-d/Character3D.d.ts.map +1 -1
- package/dist/three-d/Character3D.js +31 -14
- package/dist/three-d/Character3D.js.map +1 -1
- package/dist/three-d/Collision3D.d.ts +63 -0
- package/dist/three-d/Collision3D.d.ts.map +1 -0
- package/dist/three-d/Collision3D.js +75 -0
- package/dist/three-d/Collision3D.js.map +1 -0
- package/dist/three-d/Models.js +1 -1
- package/dist/three-d/index.d.ts +3 -1
- package/dist/three-d/index.d.ts.map +1 -1
- package/dist/three-d/index.js +1 -0
- package/dist/three-d/index.js.map +1 -1
- package/dist/{core → two-d}/Game.d.ts +7 -6
- package/dist/two-d/Game.d.ts.map +1 -0
- package/dist/{core → two-d}/Game.js +3 -3
- package/dist/two-d/Game.js.map +1 -0
- package/dist/two-d/Scene2D.d.ts +19 -0
- package/dist/two-d/Scene2D.d.ts.map +1 -0
- package/dist/two-d/Scene2D.js +23 -0
- package/dist/two-d/Scene2D.js.map +1 -0
- package/dist/two-d/index.d.ts +20 -0
- package/dist/two-d/index.d.ts.map +1 -0
- package/dist/two-d/index.js +18 -0
- package/dist/two-d/index.js.map +1 -0
- package/dist/two-d/render/ActorAnimator.d.ts.map +1 -0
- package/dist/two-d/render/ActorAnimator.js.map +1 -0
- package/dist/two-d/render/AnimatedSprite.d.ts.map +1 -0
- package/dist/two-d/render/AnimatedSprite.js.map +1 -0
- package/dist/two-d/render/Autotile.d.ts.map +1 -0
- package/dist/two-d/render/Autotile.js.map +1 -0
- package/dist/two-d/render/Camera.d.ts.map +1 -0
- package/dist/{render → two-d/render}/Camera.js +2 -2
- package/dist/two-d/render/Camera.js.map +1 -0
- package/dist/two-d/render/Capabilities.d.ts.map +1 -0
- package/dist/two-d/render/Capabilities.js.map +1 -0
- package/dist/two-d/render/ColorBlindness.d.ts.map +1 -0
- package/dist/two-d/render/ColorBlindness.js.map +1 -0
- package/dist/two-d/render/ColorTransformBatcher.d.ts.map +1 -0
- package/dist/{render → two-d/render}/ColorTransformBatcher.js +3 -2
- package/dist/two-d/render/ColorTransformBatcher.js.map +1 -0
- package/dist/two-d/render/LayeredSprite.d.ts.map +1 -0
- package/dist/two-d/render/LayeredSprite.js.map +1 -0
- package/dist/two-d/render/Minimap.d.ts.map +1 -0
- package/dist/{render → two-d/render}/Minimap.js +1 -1
- package/dist/two-d/render/Minimap.js.map +1 -0
- package/dist/two-d/render/Particles.d.ts +109 -0
- package/dist/two-d/render/Particles.d.ts.map +1 -0
- package/dist/two-d/render/Particles.js +178 -0
- package/dist/two-d/render/Particles.js.map +1 -0
- package/dist/two-d/render/Projectile.d.ts.map +1 -0
- package/dist/two-d/render/Projectile.js.map +1 -0
- package/dist/two-d/render/ScreenEffects.d.ts +71 -0
- package/dist/two-d/render/ScreenEffects.d.ts.map +1 -0
- package/dist/two-d/render/ScreenEffects.js +133 -0
- package/dist/two-d/render/ScreenEffects.js.map +1 -0
- package/dist/two-d/render/SpriteSheet.d.ts.map +1 -0
- package/dist/{render → two-d/render}/SpriteSheet.js +1 -1
- package/dist/two-d/render/SpriteSheet.js.map +1 -0
- package/dist/two-d/render/StatusVisuals.d.ts.map +1 -0
- package/dist/two-d/render/StatusVisuals.js.map +1 -0
- package/dist/two-d/render/TileMap.d.ts.map +1 -0
- package/dist/{render → two-d/render}/TileMap.js +1 -1
- package/dist/two-d/render/TileMap.js.map +1 -0
- package/dist/{rpg → two-d/render}/TiledMap.d.ts +2 -2
- package/dist/two-d/render/TiledMap.d.ts.map +1 -0
- package/dist/{rpg → two-d/render}/TiledMap.js +2 -2
- package/dist/two-d/render/TiledMap.js.map +1 -0
- package/dist/two-d/render/TintedSprite.d.ts.map +1 -0
- package/dist/two-d/render/TintedSprite.js.map +1 -0
- package/dist/two-d/render/Viewport.d.ts.map +1 -0
- package/dist/two-d/render/Viewport.js.map +1 -0
- package/dist/{render → two-d/render}/index.d.ts +6 -0
- package/dist/two-d/render/index.d.ts.map +1 -0
- package/dist/{render → two-d/render}/index.js +3 -0
- package/dist/two-d/render/index.js.map +1 -0
- package/dist/two-d/stage/DialogueStage.d.ts.map +1 -0
- package/dist/{stage → two-d/stage}/DialogueStage.js +1 -1
- package/dist/two-d/stage/DialogueStage.js.map +1 -0
- package/dist/two-d/stage/index.d.ts.map +1 -0
- package/dist/two-d/stage/index.js.map +1 -0
- package/dist/two-d/stage/script.d.ts.map +1 -0
- package/dist/{stage → two-d/stage}/script.js +0 -0
- package/dist/two-d/stage/script.js.map +1 -0
- package/dist/two-d/stage/twee.d.ts.map +1 -0
- package/dist/two-d/stage/twee.js.map +1 -0
- package/dist/two-d/ui/Bar.d.ts.map +1 -0
- package/dist/two-d/ui/Bar.js.map +1 -0
- package/dist/two-d/ui/BitmapLabel.d.ts.map +1 -0
- package/dist/two-d/ui/BitmapLabel.js.map +1 -0
- package/dist/{ui → two-d/ui}/Button.d.ts +7 -1
- package/dist/two-d/ui/Button.d.ts.map +1 -0
- package/dist/{ui → two-d/ui}/Button.js +20 -4
- package/dist/two-d/ui/Button.js.map +1 -0
- package/dist/two-d/ui/EventDialogue.d.ts +23 -0
- package/dist/two-d/ui/EventDialogue.d.ts.map +1 -0
- package/dist/two-d/ui/EventDialogue.js +27 -0
- package/dist/two-d/ui/EventDialogue.js.map +1 -0
- package/dist/two-d/ui/FloatingText.d.ts.map +1 -0
- package/dist/two-d/ui/FloatingText.js.map +1 -0
- package/dist/{ui → two-d/ui}/HelpScreen.d.ts +1 -1
- package/dist/two-d/ui/HelpScreen.d.ts.map +1 -0
- package/dist/two-d/ui/HelpScreen.js.map +1 -0
- package/dist/{ui → two-d/ui}/IconGrid.d.ts +1 -1
- package/dist/two-d/ui/IconGrid.d.ts.map +1 -0
- package/dist/two-d/ui/IconGrid.js.map +1 -0
- package/dist/two-d/ui/Label.d.ts.map +1 -0
- package/dist/two-d/ui/Label.js.map +1 -0
- package/dist/{ui → two-d/ui}/ListView.d.ts +1 -1
- package/dist/two-d/ui/ListView.d.ts.map +1 -0
- package/dist/two-d/ui/ListView.js.map +1 -0
- package/dist/{ui → two-d/ui}/LoadingScreen.d.ts +1 -1
- package/dist/two-d/ui/LoadingScreen.d.ts.map +1 -0
- package/dist/two-d/ui/LoadingScreen.js.map +1 -0
- package/dist/{ui → two-d/ui}/MessageBox.d.ts +1 -1
- package/dist/two-d/ui/MessageBox.d.ts.map +1 -0
- package/dist/two-d/ui/MessageBox.js.map +1 -0
- package/dist/two-d/ui/NinePatch.d.ts.map +1 -0
- package/dist/two-d/ui/NinePatch.js.map +1 -0
- package/dist/{ui → two-d/ui}/RebindScreen.d.ts +1 -1
- package/dist/two-d/ui/RebindScreen.d.ts.map +1 -0
- package/dist/{ui → two-d/ui}/RebindScreen.js +1 -1
- package/dist/two-d/ui/RebindScreen.js.map +1 -0
- package/dist/two-d/ui/StatsScreen.d.ts.map +1 -0
- package/dist/two-d/ui/StatsScreen.js.map +1 -0
- package/dist/two-d/ui/Toast.d.ts.map +1 -0
- package/dist/{ui → two-d/ui}/Toast.js +1 -1
- package/dist/two-d/ui/Toast.js.map +1 -0
- package/dist/two-d/ui/Tooltip.d.ts +94 -0
- package/dist/two-d/ui/Tooltip.d.ts.map +1 -0
- package/dist/two-d/ui/Tooltip.js +149 -0
- package/dist/two-d/ui/Tooltip.js.map +1 -0
- package/dist/two-d/ui/VerticalLabel.d.ts.map +1 -0
- package/dist/two-d/ui/VerticalLabel.js.map +1 -0
- package/dist/{ui → two-d/ui}/Window.d.ts +2 -2
- package/dist/two-d/ui/Window.d.ts.map +1 -0
- package/dist/{ui → two-d/ui}/Window.js +1 -1
- package/dist/two-d/ui/Window.js.map +1 -0
- package/dist/two-d/ui/WindowStack.d.ts.map +1 -0
- package/dist/{ui → two-d/ui}/WindowStack.js +1 -1
- package/dist/two-d/ui/WindowStack.js.map +1 -0
- package/dist/{ui → two-d/ui}/index.d.ts +4 -0
- package/dist/two-d/ui/index.d.ts.map +1 -0
- package/dist/{ui → two-d/ui}/index.js +2 -0
- package/dist/two-d/ui/index.js.map +1 -0
- package/dist/{ui → two-d/ui}/theme.d.ts +2 -2
- package/dist/two-d/ui/theme.d.ts.map +1 -0
- package/dist/{ui → two-d/ui}/theme.js +1 -1
- package/dist/two-d/ui/theme.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/world/Encounters.js +1 -1
- package/dist/world/Encounters.js.map +1 -1
- package/dist/world/Environment.d.ts +12 -3
- package/dist/world/Environment.d.ts.map +1 -1
- package/dist/world/Environment.js +18 -9
- package/dist/world/Environment.js.map +1 -1
- package/package.json +227 -147
- package/dist/core/Game.d.ts.map +0 -1
- package/dist/core/Game.js.map +0 -1
- package/dist/render/ActorAnimator.d.ts.map +0 -1
- package/dist/render/ActorAnimator.js.map +0 -1
- package/dist/render/AnimatedSprite.d.ts.map +0 -1
- package/dist/render/AnimatedSprite.js.map +0 -1
- package/dist/render/Autotile.d.ts.map +0 -1
- package/dist/render/Autotile.js.map +0 -1
- package/dist/render/Camera.d.ts.map +0 -1
- package/dist/render/Camera.js.map +0 -1
- package/dist/render/Capabilities.d.ts.map +0 -1
- package/dist/render/Capabilities.js.map +0 -1
- package/dist/render/ColorBlindness.d.ts.map +0 -1
- package/dist/render/ColorBlindness.js.map +0 -1
- package/dist/render/ColorTransformBatcher.d.ts.map +0 -1
- package/dist/render/ColorTransformBatcher.js.map +0 -1
- package/dist/render/LayeredSprite.d.ts.map +0 -1
- package/dist/render/LayeredSprite.js.map +0 -1
- package/dist/render/Minimap.d.ts.map +0 -1
- package/dist/render/Minimap.js.map +0 -1
- package/dist/render/Projectile.d.ts.map +0 -1
- package/dist/render/Projectile.js.map +0 -1
- package/dist/render/SpriteSheet.d.ts.map +0 -1
- package/dist/render/SpriteSheet.js.map +0 -1
- package/dist/render/StatusVisuals.d.ts.map +0 -1
- package/dist/render/StatusVisuals.js.map +0 -1
- package/dist/render/TileMap.d.ts.map +0 -1
- package/dist/render/TileMap.js.map +0 -1
- package/dist/render/TintedSprite.d.ts.map +0 -1
- package/dist/render/TintedSprite.js.map +0 -1
- package/dist/render/Viewport.d.ts.map +0 -1
- package/dist/render/Viewport.js.map +0 -1
- package/dist/render/index.d.ts.map +0 -1
- package/dist/render/index.js.map +0 -1
- package/dist/rpg/TiledMap.d.ts.map +0 -1
- package/dist/rpg/TiledMap.js.map +0 -1
- package/dist/stage/DialogueStage.d.ts.map +0 -1
- package/dist/stage/DialogueStage.js.map +0 -1
- package/dist/stage/index.d.ts.map +0 -1
- package/dist/stage/index.js.map +0 -1
- package/dist/stage/script.d.ts.map +0 -1
- package/dist/stage/script.js.map +0 -1
- package/dist/stage/twee.d.ts.map +0 -1
- package/dist/stage/twee.js.map +0 -1
- package/dist/ui/Bar.d.ts.map +0 -1
- package/dist/ui/Bar.js.map +0 -1
- package/dist/ui/BitmapLabel.d.ts.map +0 -1
- package/dist/ui/BitmapLabel.js.map +0 -1
- package/dist/ui/Button.d.ts.map +0 -1
- package/dist/ui/Button.js.map +0 -1
- package/dist/ui/FloatingText.d.ts.map +0 -1
- package/dist/ui/FloatingText.js.map +0 -1
- package/dist/ui/HelpScreen.d.ts.map +0 -1
- package/dist/ui/HelpScreen.js.map +0 -1
- package/dist/ui/IconGrid.d.ts.map +0 -1
- package/dist/ui/IconGrid.js.map +0 -1
- package/dist/ui/Label.d.ts.map +0 -1
- package/dist/ui/Label.js.map +0 -1
- package/dist/ui/ListView.d.ts.map +0 -1
- package/dist/ui/ListView.js.map +0 -1
- package/dist/ui/LoadingScreen.d.ts.map +0 -1
- package/dist/ui/LoadingScreen.js.map +0 -1
- package/dist/ui/MessageBox.d.ts.map +0 -1
- package/dist/ui/MessageBox.js.map +0 -1
- package/dist/ui/NinePatch.d.ts.map +0 -1
- package/dist/ui/NinePatch.js.map +0 -1
- package/dist/ui/RebindScreen.d.ts.map +0 -1
- package/dist/ui/RebindScreen.js.map +0 -1
- package/dist/ui/StatsScreen.d.ts.map +0 -1
- package/dist/ui/StatsScreen.js.map +0 -1
- package/dist/ui/Toast.d.ts.map +0 -1
- package/dist/ui/Toast.js.map +0 -1
- package/dist/ui/VerticalLabel.d.ts.map +0 -1
- package/dist/ui/VerticalLabel.js.map +0 -1
- package/dist/ui/Window.d.ts.map +0 -1
- package/dist/ui/Window.js.map +0 -1
- package/dist/ui/WindowStack.d.ts.map +0 -1
- package/dist/ui/WindowStack.js.map +0 -1
- package/dist/ui/index.d.ts.map +0 -1
- package/dist/ui/index.js.map +0 -1
- package/dist/ui/theme.d.ts.map +0 -1
- package/dist/ui/theme.js.map +0 -1
- /package/dist/{render → two-d/render}/ActorAnimator.d.ts +0 -0
- /package/dist/{render → two-d/render}/ActorAnimator.js +0 -0
- /package/dist/{render → two-d/render}/AnimatedSprite.d.ts +0 -0
- /package/dist/{render → two-d/render}/AnimatedSprite.js +0 -0
- /package/dist/{render → two-d/render}/Autotile.d.ts +0 -0
- /package/dist/{render → two-d/render}/Autotile.js +0 -0
- /package/dist/{render → two-d/render}/Camera.d.ts +0 -0
- /package/dist/{render → two-d/render}/Capabilities.d.ts +0 -0
- /package/dist/{render → two-d/render}/Capabilities.js +0 -0
- /package/dist/{render → two-d/render}/ColorBlindness.d.ts +0 -0
- /package/dist/{render → two-d/render}/ColorBlindness.js +0 -0
- /package/dist/{render → two-d/render}/ColorTransformBatcher.d.ts +0 -0
- /package/dist/{render → two-d/render}/LayeredSprite.d.ts +0 -0
- /package/dist/{render → two-d/render}/LayeredSprite.js +0 -0
- /package/dist/{render → two-d/render}/Minimap.d.ts +0 -0
- /package/dist/{render → two-d/render}/Projectile.d.ts +0 -0
- /package/dist/{render → two-d/render}/Projectile.js +0 -0
- /package/dist/{render → two-d/render}/SpriteSheet.d.ts +0 -0
- /package/dist/{render → two-d/render}/StatusVisuals.d.ts +0 -0
- /package/dist/{render → two-d/render}/StatusVisuals.js +0 -0
- /package/dist/{render → two-d/render}/TileMap.d.ts +0 -0
- /package/dist/{render → two-d/render}/TintedSprite.d.ts +0 -0
- /package/dist/{render → two-d/render}/TintedSprite.js +0 -0
- /package/dist/{render → two-d/render}/Viewport.d.ts +0 -0
- /package/dist/{render → two-d/render}/Viewport.js +0 -0
- /package/dist/{stage → two-d/stage}/DialogueStage.d.ts +0 -0
- /package/dist/{stage → two-d/stage}/index.d.ts +0 -0
- /package/dist/{stage → two-d/stage}/index.js +0 -0
- /package/dist/{stage → two-d/stage}/script.d.ts +0 -0
- /package/dist/{stage → two-d/stage}/twee.d.ts +0 -0
- /package/dist/{stage → two-d/stage}/twee.js +0 -0
- /package/dist/{ui → two-d/ui}/Bar.d.ts +0 -0
- /package/dist/{ui → two-d/ui}/Bar.js +0 -0
- /package/dist/{ui → two-d/ui}/BitmapLabel.d.ts +0 -0
- /package/dist/{ui → two-d/ui}/BitmapLabel.js +0 -0
- /package/dist/{ui → two-d/ui}/FloatingText.d.ts +0 -0
- /package/dist/{ui → two-d/ui}/FloatingText.js +0 -0
- /package/dist/{ui → two-d/ui}/HelpScreen.js +0 -0
- /package/dist/{ui → two-d/ui}/IconGrid.js +0 -0
- /package/dist/{ui → two-d/ui}/Label.d.ts +0 -0
- /package/dist/{ui → two-d/ui}/Label.js +0 -0
- /package/dist/{ui → two-d/ui}/ListView.js +0 -0
- /package/dist/{ui → two-d/ui}/LoadingScreen.js +0 -0
- /package/dist/{ui → two-d/ui}/MessageBox.js +0 -0
- /package/dist/{ui → two-d/ui}/NinePatch.d.ts +0 -0
- /package/dist/{ui → two-d/ui}/NinePatch.js +0 -0
- /package/dist/{ui → two-d/ui}/StatsScreen.d.ts +0 -0
- /package/dist/{ui → two-d/ui}/StatsScreen.js +0 -0
- /package/dist/{ui → two-d/ui}/Toast.d.ts +0 -0
- /package/dist/{ui → two-d/ui}/VerticalLabel.d.ts +0 -0
- /package/dist/{ui → two-d/ui}/VerticalLabel.js +0 -0
- /package/dist/{ui → two-d/ui}/WindowStack.d.ts +0 -0
package/dist/roguelike/Boss.d.ts
CHANGED
|
@@ -27,7 +27,7 @@ export declare class BossPhases {
|
|
|
27
27
|
* a game fires each phase's enter-hook exactly once; a single massive hit can enter
|
|
28
28
|
* several at once, and all of them are reported
|
|
29
29
|
*/
|
|
30
|
-
|
|
30
|
+
check(hpFraction: number): number[];
|
|
31
31
|
/** restarts the fight at phase 0, for a rematch or a reused boss object */
|
|
32
32
|
reset(): void;
|
|
33
33
|
toJSON(): {
|
|
@@ -38,7 +38,7 @@ export declare class BossPhases {
|
|
|
38
38
|
}): BossPhases;
|
|
39
39
|
}
|
|
40
40
|
/**
|
|
41
|
-
* One ability per named slot, each with its own cooldown in turns: `
|
|
41
|
+
* One ability per named slot, each with its own cooldown in turns: `advance()` counts every
|
|
42
42
|
* cooldown down by one turn, `ready()` lists whatever may fire now, and `use(id)` spends
|
|
43
43
|
* one - resetting its full cooldown - reporting whether it was actually ready, so a game
|
|
44
44
|
* can tell "fired" from "still waiting" without tracking the counters itself.
|
|
@@ -47,8 +47,8 @@ export declare class AbilityCycle {
|
|
|
47
47
|
private cooldowns;
|
|
48
48
|
private remaining;
|
|
49
49
|
constructor(cooldowns: Record<string, number>);
|
|
50
|
-
/** counts every cooling-down ability
|
|
51
|
-
|
|
50
|
+
/** counts every cooling-down ability `turns` closer to ready */
|
|
51
|
+
advance(turns?: number): void;
|
|
52
52
|
/** ids that may fire right now, in definition order */
|
|
53
53
|
ready(): string[];
|
|
54
54
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Boss.d.ts","sourceRoot":"","sources":["../../src/roguelike/Boss.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,qBAAa,UAAU;IACtB,OAAO,CAAC,UAAU,CAAoB;IACtC,OAAO,CAAC,OAAO,CAAK;IAEpB;;;;OAIG;IACH,YAAY,UAAU,GAAE,SAAS,MAAM,EAAO,EAO7C;IAED,oFAAoF;IACpF,IAAI,KAAK,IAAI,MAAM,CAElB;IAED;;;;;;OAMG;IACH,
|
|
1
|
+
{"version":3,"file":"Boss.d.ts","sourceRoot":"","sources":["../../src/roguelike/Boss.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,qBAAa,UAAU;IACtB,OAAO,CAAC,UAAU,CAAoB;IACtC,OAAO,CAAC,OAAO,CAAK;IAEpB;;;;OAIG;IACH,YAAY,UAAU,GAAE,SAAS,MAAM,EAAO,EAO7C;IAED,oFAAoF;IACpF,IAAI,KAAK,IAAI,MAAM,CAElB;IAED;;;;;;OAMG;IACH,KAAK,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAUlC;IAED,2EAA2E;IAC3E,KAAK,IAAI,IAAI,CAEZ;IAED,MAAM,IAAI;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAE1B;IAED,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,UAAU,CAIlF;CACD;AAED;;;;;GAKG;AACH,qBAAa,YAAY;IACxB,OAAO,CAAC,SAAS,CAA8B;IAC/C,OAAO,CAAC,SAAS,CAA6B;IAE9C,YAAY,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAE5C;IAED,gEAAgE;IAChE,OAAO,CAAC,KAAK,SAAI,GAAG,IAAI,CAKvB;IAED,uDAAuD;IACvD,KAAK,IAAI,MAAM,EAAE,CAMhB;IAED;;;;OAIG;IACH,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAKvB;IAED,MAAM,IAAI;QAAE,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAA;KAAE,CAE1C;IAED,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE;QAAE,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAA;KAAE,GAAG,YAAY,CAIxG;CACD"}
|
package/dist/roguelike/Boss.js
CHANGED
|
@@ -35,7 +35,7 @@ export class BossPhases {
|
|
|
35
35
|
* a game fires each phase's enter-hook exactly once; a single massive hit can enter
|
|
36
36
|
* several at once, and all of them are reported
|
|
37
37
|
*/
|
|
38
|
-
|
|
38
|
+
check(hpFraction) {
|
|
39
39
|
let phase = 0;
|
|
40
40
|
while (phase < this.thresholds.length && hpFraction <= this.thresholds[phase])
|
|
41
41
|
phase++;
|
|
@@ -60,7 +60,7 @@ export class BossPhases {
|
|
|
60
60
|
}
|
|
61
61
|
}
|
|
62
62
|
/**
|
|
63
|
-
* One ability per named slot, each with its own cooldown in turns: `
|
|
63
|
+
* One ability per named slot, each with its own cooldown in turns: `advance()` counts every
|
|
64
64
|
* cooldown down by one turn, `ready()` lists whatever may fire now, and `use(id)` spends
|
|
65
65
|
* one - resetting its full cooldown - reporting whether it was actually ready, so a game
|
|
66
66
|
* can tell "fired" from "still waiting" without tracking the counters itself.
|
|
@@ -70,13 +70,13 @@ export class AbilityCycle {
|
|
|
70
70
|
this.remaining = new Map();
|
|
71
71
|
this.cooldowns = new Map(Object.entries(cooldowns));
|
|
72
72
|
}
|
|
73
|
-
/** counts every cooling-down ability
|
|
74
|
-
|
|
73
|
+
/** counts every cooling-down ability `turns` closer to ready */
|
|
74
|
+
advance(turns = 1) {
|
|
75
75
|
for (const [id, left] of this.remaining) {
|
|
76
|
-
if (left <=
|
|
76
|
+
if (left <= turns)
|
|
77
77
|
this.remaining.delete(id);
|
|
78
78
|
else
|
|
79
|
-
this.remaining.set(id, left -
|
|
79
|
+
this.remaining.set(id, left - turns);
|
|
80
80
|
}
|
|
81
81
|
}
|
|
82
82
|
/** ids that may fire right now, in definition order */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Boss.js","sourceRoot":"","sources":["../../src/roguelike/Boss.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,OAAO,UAAU;IAItB;;;;OAIG;IACH,YAAY,UAAU,GAAsB,EAAE;QAPtC,YAAO,GAAG,CAAC,CAAC;QAQnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5C,IAAI,UAAU,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;gBACxC,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;YACvD,CAAC;QACF,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC9B,CAAC;IAED,oFAAoF;IACpF,IAAI,KAAK;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACrB,CAAC;IAED;;;;;;OAMG;IACH,
|
|
1
|
+
{"version":3,"file":"Boss.js","sourceRoot":"","sources":["../../src/roguelike/Boss.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { HookRegistry } from '../core/Hooks.ts';
|
|
1
2
|
export type CombatEvent = 'beforeAttack' | 'beforeDamage' | 'afterDamage' | 'onKill' | string;
|
|
2
3
|
export interface DamageContext<C> {
|
|
3
4
|
attacker: C;
|
|
@@ -6,18 +7,16 @@ export interface DamageContext<C> {
|
|
|
6
7
|
prevented: boolean;
|
|
7
8
|
[kind: string]: unknown;
|
|
8
9
|
}
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
on(event: CombatEvent, handler: (context: DamageContext<C>) => void, source?: unknown): void;
|
|
18
|
-
offSource(source: unknown): void;
|
|
19
|
-
emit(event: CombatEvent, context: DamageContext<C>): void;
|
|
10
|
+
/**
|
|
11
|
+
* Generic combat lifecycle hooks; the game owns HP, formulas, and when each event fires.
|
|
12
|
+
*
|
|
13
|
+
* The registry is `core.HookRegistry`, the same one `battle.BattleHooks` uses - these were two
|
|
14
|
+
* copies of one class for a while. What is combat-specific is that a handler receives a single
|
|
15
|
+
* mutable `DamageContext`, and the `modifyDamage` seam below built on it.
|
|
16
|
+
*/
|
|
17
|
+
export declare class CombatHooks<C> extends HookRegistry<[context: DamageContext<C>]> {
|
|
20
18
|
/** Runs the pre-damage seam and clamps the resulting amount at zero. */
|
|
21
19
|
modifyDamage(attacker: C, defender: C, amount: number): DamageContext<C>;
|
|
22
20
|
}
|
|
21
|
+
export type { Hook as CombatHook } from '../core/Hooks.ts';
|
|
23
22
|
//# sourceMappingURL=Combat.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Combat.d.ts","sourceRoot":"","sources":["../../src/roguelike/Combat.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,cAAc,GAAG,cAAc,GAAG,aAAa,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE9F,MAAM,WAAW,aAAa,CAAC,CAAC;IAC/B,QAAQ,EAAE,CAAC,CAAC;IACZ,QAAQ,EAAE,CAAC,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,
|
|
1
|
+
{"version":3,"file":"Combat.d.ts","sourceRoot":"","sources":["../../src/roguelike/Combat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,MAAM,WAAW,GAAG,cAAc,GAAG,cAAc,GAAG,aAAa,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE9F,MAAM,WAAW,aAAa,CAAC,CAAC;IAC/B,QAAQ,EAAE,CAAC,CAAC;IACZ,QAAQ,EAAE,CAAC,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;;;;GAMG;AACH,qBAAa,WAAW,CAAC,CAAC,CAAE,SAAQ,YAAY,CAAC,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5E,wEAAwE;IACxE,YAAY,CAAC,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,CAMvE;CACD;AAED,YAAY,EAAE,IAAI,IAAI,UAAU,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/roguelike/Combat.js
CHANGED
|
@@ -1,19 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
this.hooks = this.hooks.filter((hook) => hook.source !== source);
|
|
11
|
-
}
|
|
12
|
-
emit(event, context) {
|
|
13
|
-
for (const hook of this.hooks)
|
|
14
|
-
if (hook.event === event)
|
|
15
|
-
hook.handler(context);
|
|
16
|
-
}
|
|
1
|
+
import { HookRegistry } from '../core/Hooks.js';
|
|
2
|
+
/**
|
|
3
|
+
* Generic combat lifecycle hooks; the game owns HP, formulas, and when each event fires.
|
|
4
|
+
*
|
|
5
|
+
* The registry is `core.HookRegistry`, the same one `battle.BattleHooks` uses - these were two
|
|
6
|
+
* copies of one class for a while. What is combat-specific is that a handler receives a single
|
|
7
|
+
* mutable `DamageContext`, and the `modifyDamage` seam below built on it.
|
|
8
|
+
*/
|
|
9
|
+
export class CombatHooks extends HookRegistry {
|
|
17
10
|
/** Runs the pre-damage seam and clamps the resulting amount at zero. */
|
|
18
11
|
modifyDamage(attacker, defender, amount) {
|
|
19
12
|
const context = { attacker, defender, amount, prevented: false };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Combat.js","sourceRoot":"","sources":["../../src/roguelike/Combat.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Combat.js","sourceRoot":"","sources":["../../src/roguelike/Combat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAYhD;;;;;;GAMG;AACH,MAAM,OAAO,WAAe,SAAQ,YAAyC;IAC5E,wEAAwE;IACxE,YAAY,CAAC,QAAW,EAAE,QAAW,EAAE,MAAc;QACpD,MAAM,OAAO,GAAqB,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QACnF,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QACnC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;QACnD,OAAO,OAAO,CAAC;IAChB,CAAC;CACD"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A weighted regular-roster entry, optionally swappable into a named alternative variant.
|
|
3
|
+
* `mwg` names none of `T` - a monster kind, an item id, anything a game's own roster holds.
|
|
4
|
+
*/
|
|
5
|
+
export interface RosterEntry<T> {
|
|
6
|
+
value: T;
|
|
7
|
+
/** an alternative this entry may swap into once placed in the roster */
|
|
8
|
+
alternative?: {
|
|
9
|
+
value: T;
|
|
10
|
+
chance: number;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
/** an extra entry that may or may not join the roster this roll, beyond the regular ones */
|
|
14
|
+
export interface RareEntry<T> {
|
|
15
|
+
value: T;
|
|
16
|
+
chance: number;
|
|
17
|
+
/**
|
|
18
|
+
* false skips this entry's roll entirely without consuming RNG - an explicit *deferred*
|
|
19
|
+
* roll, distinct from one that rolled and lost (`'skipped'`), so a parity trace can tell
|
|
20
|
+
* "this depth never asks" from "this depth asked and the roll failed"
|
|
21
|
+
*/
|
|
22
|
+
enabled?: boolean;
|
|
23
|
+
}
|
|
24
|
+
export type RollOutcome = 'added' | 'skipped' | 'deferred' | 'swapped' | 'kept' | 'shuffled';
|
|
25
|
+
export interface RollTraceEntry {
|
|
26
|
+
step: 'rare' | 'alternative' | 'shuffle';
|
|
27
|
+
index: number;
|
|
28
|
+
outcome: RollOutcome;
|
|
29
|
+
}
|
|
30
|
+
export interface ContentRollResult<T> {
|
|
31
|
+
roster: T[];
|
|
32
|
+
trace: RollTraceEntry[];
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Rolls a spawn/content roster: the regular entries, then whichever rare additions rolled in,
|
|
36
|
+
* then a per-entry alternative-variant swap over the regular entries only, then (unless
|
|
37
|
+
* disabled) a shuffle - the "add-rare, swap, shuffle" order a variant-spawn table commonly
|
|
38
|
+
* needs. Every roll, including a disabled rare entry's explicit non-roll, is recorded in
|
|
39
|
+
* `trace`, so two runs against the same seed can be diffed roll for roll rather than only by
|
|
40
|
+
* final roster.
|
|
41
|
+
*/
|
|
42
|
+
export declare function rollRoster<T>(regular: readonly RosterEntry<T>[], rare?: readonly RareEntry<T>[], shuffleResult?: boolean): ContentRollResult<T>;
|
|
43
|
+
//# sourceMappingURL=ContentRoll.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContentRoll.d.ts","sourceRoot":"","sources":["../../src/roguelike/ContentRoll.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC;IAC7B,KAAK,EAAE,CAAC,CAAC;IAET,wEAAwE;IACxE,WAAW,CAAC,EAAE;QAAE,KAAK,EAAE,CAAC,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3C;AAED,4FAA4F;AAC5F,MAAM,WAAW,SAAS,CAAC,CAAC;IAC3B,KAAK,EAAE,CAAC,CAAC;IACT,MAAM,EAAE,MAAM,CAAC;IAEf;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,GAAG,UAAU,CAAC;AAE7F,MAAM,WAAW,cAAc;IAC9B,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAAC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,WAAW,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB,CAAC,CAAC;IACnC,MAAM,EAAE,CAAC,EAAE,CAAC;IACZ,KAAK,EAAE,cAAc,EAAE,CAAC;CACxB;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,GAAE,SAAS,SAAS,CAAC,CAAC,CAAC,EAAO,EAAE,aAAa,UAAO,GAAG,iBAAiB,CAAC,CAAC,CAAC,CA8BhJ"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import * as Random from '../core/Random.js';
|
|
2
|
+
/**
|
|
3
|
+
* Rolls a spawn/content roster: the regular entries, then whichever rare additions rolled in,
|
|
4
|
+
* then a per-entry alternative-variant swap over the regular entries only, then (unless
|
|
5
|
+
* disabled) a shuffle - the "add-rare, swap, shuffle" order a variant-spawn table commonly
|
|
6
|
+
* needs. Every roll, including a disabled rare entry's explicit non-roll, is recorded in
|
|
7
|
+
* `trace`, so two runs against the same seed can be diffed roll for roll rather than only by
|
|
8
|
+
* final roster.
|
|
9
|
+
*/
|
|
10
|
+
export function rollRoster(regular, rare = [], shuffleResult = true) {
|
|
11
|
+
const trace = [];
|
|
12
|
+
const roster = regular.map((entry) => entry.value);
|
|
13
|
+
rare.forEach((entry, index) => {
|
|
14
|
+
if (entry.enabled === false) {
|
|
15
|
+
trace.push({ step: 'rare', index, outcome: 'deferred' });
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
const rolled = Random.chance(entry.chance);
|
|
19
|
+
trace.push({ step: 'rare', index, outcome: rolled ? 'added' : 'skipped' });
|
|
20
|
+
if (rolled)
|
|
21
|
+
roster.push(entry.value);
|
|
22
|
+
});
|
|
23
|
+
for (let i = 0; i < regular.length; i++) {
|
|
24
|
+
const alternative = regular[i].alternative;
|
|
25
|
+
if (!alternative)
|
|
26
|
+
continue;
|
|
27
|
+
const rolled = Random.chance(alternative.chance);
|
|
28
|
+
trace.push({ step: 'alternative', index: i, outcome: rolled ? 'swapped' : 'kept' });
|
|
29
|
+
if (rolled)
|
|
30
|
+
roster[i] = alternative.value;
|
|
31
|
+
}
|
|
32
|
+
if (shuffleResult) {
|
|
33
|
+
Random.shuffle(roster);
|
|
34
|
+
trace.push({ step: 'shuffle', index: -1, outcome: 'shuffled' });
|
|
35
|
+
}
|
|
36
|
+
return { roster, trace };
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=ContentRoll.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContentRoll.js","sourceRoot":"","sources":["../../src/roguelike/ContentRoll.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAuC5C;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CAAI,OAAkC,EAAE,IAAI,GAA4B,EAAE,EAAE,aAAa,GAAG,IAAI;IACzH,MAAM,KAAK,GAAqB,EAAE,CAAC;IACnC,MAAM,MAAM,GAAQ,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAExD,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QAC7B,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YAC7B,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;YACzD,OAAO;QACR,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC3C,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;QAC3E,IAAI,MAAM;YAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;QAC3C,IAAI,CAAC,WAAW;YAAE,SAAS;QAE3B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACjD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACpF,IAAI,MAAM;YAAE,MAAM,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC;IAC3C,CAAC;IAED,IAAI,aAAa,EAAE,CAAC;QACnB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { RoomEdge } from './generate.ts';
|
|
2
|
+
/**
|
|
3
|
+
* Everything a seeded generation run produced, flattened into plain data a parity check can
|
|
4
|
+
* diff: the room graph and retry count from `generateDungeonGraph`, the terrain it painted,
|
|
5
|
+
* whatever feature layer and content rolls a game attached, and however many RNG draws the
|
|
6
|
+
* game itself chose to count. `mwg` dictates none of the game-side shapes here (`content` is
|
|
7
|
+
* whatever a game's own roll traces are) - only how to compare two of them.
|
|
8
|
+
*/
|
|
9
|
+
export interface DungeonArtifacts {
|
|
10
|
+
graph: readonly RoomEdge[];
|
|
11
|
+
retries: number;
|
|
12
|
+
/** which builder carved each room, by room index - a paint-stage artifact, not a graph one */
|
|
13
|
+
roomBuilders: readonly string[];
|
|
14
|
+
width: number;
|
|
15
|
+
height: number;
|
|
16
|
+
terrain: ArrayLike<number>;
|
|
17
|
+
features: readonly [number, string][];
|
|
18
|
+
content: readonly unknown[];
|
|
19
|
+
rngDraws: number;
|
|
20
|
+
}
|
|
21
|
+
/** which half of the pipeline a mismatch belongs to, so a graph bug and a paint bug never get conflated */
|
|
22
|
+
export type DungeonParityStage = 'graph' | 'paint';
|
|
23
|
+
export interface DungeonMismatch {
|
|
24
|
+
stage: DungeonParityStage;
|
|
25
|
+
field: string;
|
|
26
|
+
expected: unknown;
|
|
27
|
+
actual: unknown;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Diffs two artifact snapshots (this port's own run against a reference implementation's, or
|
|
31
|
+
* a golden fixture), reporting every mismatch tagged with which stage it belongs to: `'graph'`
|
|
32
|
+
* for the room graph and retry count, `'paint'` for terrain, features, content placements and
|
|
33
|
+
* RNG draw count. An empty result means the two runs are equivalent by every artifact checked.
|
|
34
|
+
*/
|
|
35
|
+
export declare function compareDungeonArtifacts(expected: DungeonArtifacts, actual: DungeonArtifacts): DungeonMismatch[];
|
|
36
|
+
/**
|
|
37
|
+
* Runs `generate` repeatedly and diffs every later run against the first - the same seed
|
|
38
|
+
* (pushed by the caller around `generate`) must produce byte-identical artifacts every time,
|
|
39
|
+
* or the generator itself is non-deterministic regardless of what it is being compared against.
|
|
40
|
+
*/
|
|
41
|
+
export declare function checkDeterminism(generate: () => DungeonArtifacts, runs?: number): DungeonMismatch[];
|
|
42
|
+
//# sourceMappingURL=DungeonParity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DungeonParity.d.ts","sourceRoot":"","sources":["../../src/roguelike/DungeonParity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAChC,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAEhB,8FAA8F;IAC9F,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAEhC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAC3B,QAAQ,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;IACtC,OAAO,EAAE,SAAS,OAAO,EAAE,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,2GAA2G;AAC3G,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,OAAO,CAAC;AAEnD,MAAM,WAAW,eAAe;IAC/B,KAAK,EAAE,kBAAkB,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;CAChB;AAmBD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,MAAM,EAAE,gBAAgB,GAAG,eAAe,EAAE,CA2B/G;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,gBAAgB,EAAE,IAAI,SAAI,GAAG,eAAe,EAAE,CAO9F"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
function edgesEqual(a, b) {
|
|
2
|
+
return a.length === b.length && a.every((edge, i) => edge.a === b[i].a && edge.b === b[i].b && edge.extra === b[i].extra);
|
|
3
|
+
}
|
|
4
|
+
function arraysEqual(a, b) {
|
|
5
|
+
if (a.length !== b.length)
|
|
6
|
+
return false;
|
|
7
|
+
for (let i = 0; i < a.length; i++)
|
|
8
|
+
if (a[i] !== b[i])
|
|
9
|
+
return false;
|
|
10
|
+
return true;
|
|
11
|
+
}
|
|
12
|
+
function featuresEqual(a, b) {
|
|
13
|
+
if (a.length !== b.length)
|
|
14
|
+
return false;
|
|
15
|
+
const sortedA = [...a].sort((x, y) => x[0] - y[0]);
|
|
16
|
+
const sortedB = [...b].sort((x, y) => x[0] - y[0]);
|
|
17
|
+
return sortedA.every(([cell, kind], i) => cell === sortedB[i][0] && kind === sortedB[i][1]);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Diffs two artifact snapshots (this port's own run against a reference implementation's, or
|
|
21
|
+
* a golden fixture), reporting every mismatch tagged with which stage it belongs to: `'graph'`
|
|
22
|
+
* for the room graph and retry count, `'paint'` for terrain, features, content placements and
|
|
23
|
+
* RNG draw count. An empty result means the two runs are equivalent by every artifact checked.
|
|
24
|
+
*/
|
|
25
|
+
export function compareDungeonArtifacts(expected, actual) {
|
|
26
|
+
const mismatches = [];
|
|
27
|
+
if (expected.retries !== actual.retries) {
|
|
28
|
+
mismatches.push({ stage: 'graph', field: 'retries', expected: expected.retries, actual: actual.retries });
|
|
29
|
+
}
|
|
30
|
+
if (!edgesEqual(expected.graph, actual.graph)) {
|
|
31
|
+
mismatches.push({ stage: 'graph', field: 'graph', expected: expected.graph, actual: actual.graph });
|
|
32
|
+
}
|
|
33
|
+
if (expected.width !== actual.width || expected.height !== actual.height || !arraysEqual(expected.terrain, actual.terrain)) {
|
|
34
|
+
mismatches.push({ stage: 'paint', field: 'terrain', expected: expected.terrain, actual: actual.terrain });
|
|
35
|
+
}
|
|
36
|
+
if (expected.roomBuilders.length !== actual.roomBuilders.length || expected.roomBuilders.some((id, i) => id !== actual.roomBuilders[i])) {
|
|
37
|
+
mismatches.push({ stage: 'paint', field: 'roomBuilders', expected: expected.roomBuilders, actual: actual.roomBuilders });
|
|
38
|
+
}
|
|
39
|
+
if (!featuresEqual(expected.features, actual.features)) {
|
|
40
|
+
mismatches.push({ stage: 'paint', field: 'features', expected: expected.features, actual: actual.features });
|
|
41
|
+
}
|
|
42
|
+
if (JSON.stringify(expected.content) !== JSON.stringify(actual.content)) {
|
|
43
|
+
mismatches.push({ stage: 'paint', field: 'content', expected: expected.content, actual: actual.content });
|
|
44
|
+
}
|
|
45
|
+
if (expected.rngDraws !== actual.rngDraws) {
|
|
46
|
+
mismatches.push({ stage: 'paint', field: 'rngDraws', expected: expected.rngDraws, actual: actual.rngDraws });
|
|
47
|
+
}
|
|
48
|
+
return mismatches;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Runs `generate` repeatedly and diffs every later run against the first - the same seed
|
|
52
|
+
* (pushed by the caller around `generate`) must produce byte-identical artifacts every time,
|
|
53
|
+
* or the generator itself is non-deterministic regardless of what it is being compared against.
|
|
54
|
+
*/
|
|
55
|
+
export function checkDeterminism(generate, runs = 2) {
|
|
56
|
+
const first = generate();
|
|
57
|
+
const mismatches = [];
|
|
58
|
+
for (let i = 1; i < runs; i++) {
|
|
59
|
+
mismatches.push(...compareDungeonArtifacts(first, generate()));
|
|
60
|
+
}
|
|
61
|
+
return mismatches;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=DungeonParity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DungeonParity.js","sourceRoot":"","sources":["../../src/roguelike/DungeonParity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A generated cell wearing a named behaviour: a sign, a well, a plant, a statue, a chasm
|
|
3
|
+
* edge, a trap - anything a regional generator places that the player later looks at or
|
|
4
|
+
* steps on. `mwg` supplies the four rule slots every one of those shares (inspect it without
|
|
5
|
+
* triggering it, interact with it, run the consequence that follows, and decide whether it
|
|
6
|
+
* persists), never what any specific kind actually does - that stays the game's own
|
|
7
|
+
* definition, supplied fresh each load the way `QuestLog`'s quest definitions already are.
|
|
8
|
+
*/
|
|
9
|
+
export interface CellFeatureDef<TContext = unknown> {
|
|
10
|
+
/** looking at or searching the cell, without triggering anything */
|
|
11
|
+
inspect?(cell: number, ctx: TContext): void;
|
|
12
|
+
/** stepping on or using the cell; returning false refuses the interaction before any consequence runs */
|
|
13
|
+
interact?(cell: number, ctx: TContext): boolean | void;
|
|
14
|
+
/** runs once `interact` did not refuse it - the actual effect: damage, an item, a reveal */
|
|
15
|
+
consequence?(cell: number, ctx: TContext): void;
|
|
16
|
+
/** false removes the feature immediately after its consequence runs once; default true (repeatable) */
|
|
17
|
+
persistent?: boolean;
|
|
18
|
+
}
|
|
19
|
+
export declare class FeatureLayer<TContext = unknown> {
|
|
20
|
+
private defs;
|
|
21
|
+
private placed;
|
|
22
|
+
/** registers what a named kind does; call again to replace it, e.g. after loading a save */
|
|
23
|
+
define(kind: string, def: CellFeatureDef<TContext>): void;
|
|
24
|
+
/** places a defined kind onto a cell, replacing whatever was there */
|
|
25
|
+
place(cell: number, kind: string): void;
|
|
26
|
+
has(cell: number): boolean;
|
|
27
|
+
kindAt(cell: number): string | undefined;
|
|
28
|
+
remove(cell: number): void;
|
|
29
|
+
/** looking at or searching the cell; a no-op on a cell with no feature or no `inspect` rule */
|
|
30
|
+
inspect(cell: number, ctx: TContext): void;
|
|
31
|
+
/** using or stepping on the cell; runs `interact` then, unless refused, `consequence` */
|
|
32
|
+
interact(cell: number, ctx: TContext): void;
|
|
33
|
+
private defAt;
|
|
34
|
+
/** only which cell has which kind is save data; definitions are supplied fresh on load */
|
|
35
|
+
toJSON(): {
|
|
36
|
+
cells: [number, string][];
|
|
37
|
+
};
|
|
38
|
+
static fromJSON<T>(defs: ReadonlyMap<string, CellFeatureDef<T>>, data: {
|
|
39
|
+
cells: [number, string][];
|
|
40
|
+
}): FeatureLayer<T>;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=Features.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Features.d.ts","sourceRoot":"","sources":["../../src/roguelike/Features.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,WAAW,cAAc,CAAC,QAAQ,GAAG,OAAO;IACjD,oEAAoE;IACpE,OAAO,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,GAAG,IAAI,CAAC;IAE5C,yGAAyG;IACzG,QAAQ,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,GAAG,IAAI,CAAC;IAEvD,4FAA4F;IAC5F,WAAW,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,GAAG,IAAI,CAAC;IAEhD,uGAAuG;IACvG,UAAU,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,qBAAa,YAAY,CAAC,QAAQ,GAAG,OAAO;IAC3C,OAAO,CAAC,IAAI,CAA+C;IAC3D,OAAO,CAAC,MAAM,CAA6B;IAE3C,4FAA4F;IAC5F,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,cAAc,CAAC,QAAQ,CAAC,GAAG,IAAI,CAExD;IAED,sEAAsE;IACtE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAGtC;IAED,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEzB;IAED,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEvC;IAED,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAEzB;IAED,+FAA+F;IAC/F,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,GAAG,IAAI,CAGzC;IAED,yFAAyF;IACzF,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,GAAG,IAAI,CAS1C;IAED,OAAO,CAAC,KAAK;IAKb,0FAA0F;IAC1F,MAAM,IAAI;QAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAA;KAAE,CAEtC;IAED,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE;QAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAA;KAAE,GAAG,YAAY,CAAC,CAAC,CAAC,CAKrH;CACD"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
export class FeatureLayer {
|
|
2
|
+
constructor() {
|
|
3
|
+
this.defs = new Map();
|
|
4
|
+
this.placed = new Map();
|
|
5
|
+
}
|
|
6
|
+
/** registers what a named kind does; call again to replace it, e.g. after loading a save */
|
|
7
|
+
define(kind, def) {
|
|
8
|
+
this.defs.set(kind, def);
|
|
9
|
+
}
|
|
10
|
+
/** places a defined kind onto a cell, replacing whatever was there */
|
|
11
|
+
place(cell, kind) {
|
|
12
|
+
if (!this.defs.has(kind))
|
|
13
|
+
throw new Error(`FeatureLayer.place: no definition for kind "${kind}"`);
|
|
14
|
+
this.placed.set(cell, kind);
|
|
15
|
+
}
|
|
16
|
+
has(cell) {
|
|
17
|
+
return this.placed.has(cell);
|
|
18
|
+
}
|
|
19
|
+
kindAt(cell) {
|
|
20
|
+
return this.placed.get(cell);
|
|
21
|
+
}
|
|
22
|
+
remove(cell) {
|
|
23
|
+
this.placed.delete(cell);
|
|
24
|
+
}
|
|
25
|
+
/** looking at or searching the cell; a no-op on a cell with no feature or no `inspect` rule */
|
|
26
|
+
inspect(cell, ctx) {
|
|
27
|
+
const def = this.defAt(cell);
|
|
28
|
+
def?.inspect?.(cell, ctx);
|
|
29
|
+
}
|
|
30
|
+
/** using or stepping on the cell; runs `interact` then, unless refused, `consequence` */
|
|
31
|
+
interact(cell, ctx) {
|
|
32
|
+
const def = this.defAt(cell);
|
|
33
|
+
if (!def)
|
|
34
|
+
return;
|
|
35
|
+
const allowed = def.interact ? def.interact(cell, ctx) !== false : true;
|
|
36
|
+
if (!allowed)
|
|
37
|
+
return;
|
|
38
|
+
def.consequence?.(cell, ctx);
|
|
39
|
+
if (def.persistent === false)
|
|
40
|
+
this.remove(cell);
|
|
41
|
+
}
|
|
42
|
+
defAt(cell) {
|
|
43
|
+
const kind = this.placed.get(cell);
|
|
44
|
+
return kind === undefined ? undefined : this.defs.get(kind);
|
|
45
|
+
}
|
|
46
|
+
/** only which cell has which kind is save data; definitions are supplied fresh on load */
|
|
47
|
+
toJSON() {
|
|
48
|
+
return { cells: [...this.placed.entries()] };
|
|
49
|
+
}
|
|
50
|
+
static fromJSON(defs, data) {
|
|
51
|
+
const layer = new FeatureLayer();
|
|
52
|
+
for (const [kind, def] of defs)
|
|
53
|
+
layer.define(kind, def);
|
|
54
|
+
for (const [cell, kind] of data.cells)
|
|
55
|
+
layer.place(cell, kind);
|
|
56
|
+
return layer;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=Features.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Features.js","sourceRoot":"","sources":["../../src/roguelike/Features.ts"],"names":[],"mappings":"AAsBA,MAAM,OAAO,YAAY;IAAzB;QACS,SAAI,GAAG,IAAI,GAAG,EAAoC,CAAC;QACnD,WAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IA2D5C,CAAC;IAzDA,4FAA4F;IAC5F,MAAM,CAAC,IAAY,EAAE,GAA6B;QACjD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC1B,CAAC;IAED,sEAAsE;IACtE,KAAK,CAAC,IAAY,EAAE,IAAY;QAC/B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,+CAA+C,IAAI,GAAG,CAAC,CAAC;QAClG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED,GAAG,CAAC,IAAY;QACf,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,MAAM,CAAC,IAAY;QAClB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,MAAM,CAAC,IAAY;QAClB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,+FAA+F;IAC/F,OAAO,CAAC,IAAY,EAAE,GAAa;QAClC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,GAAG,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED,yFAAyF;IACzF,QAAQ,CAAC,IAAY,EAAE,GAAa;QACnC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,GAAG;YAAE,OAAO;QAEjB,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QACxE,IAAI,CAAC,OAAO;YAAE,OAAO;QAErB,GAAG,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC7B,IAAI,GAAG,CAAC,UAAU,KAAK,KAAK;YAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACjD,CAAC;IAEO,KAAK,CAAC,IAAY;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnC,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC7D,CAAC;IAED,0FAA0F;IAC1F,MAAM;QACL,OAAO,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;IAC9C,CAAC;IAED,MAAM,CAAC,QAAQ,CAAI,IAA4C,EAAE,IAAmC;QACnG,MAAM,KAAK,GAAG,IAAI,YAAY,EAAK,CAAC;QACpC,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI;YAAE,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACxD,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK;YAAE,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC/D,OAAO,KAAK,CAAC;IACd,CAAC;CACD"}
|
|
@@ -34,7 +34,7 @@ export function decideMonsterAI(level, pathfinder, self, hpFraction, target, opt
|
|
|
34
34
|
/** a random open neighbour, or null when boxed in - wandering needs no path, just a step */
|
|
35
35
|
function wanderStep(level, self, options) {
|
|
36
36
|
const open = openNeighbours(level, self, options);
|
|
37
|
-
return
|
|
37
|
+
return Random.element(open);
|
|
38
38
|
}
|
|
39
39
|
/** the open neighbour furthest from the target - moving away needs no path either */
|
|
40
40
|
function fleeStep(level, self, target, options) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MonsterAI.js","sourceRoot":"","sources":["../../src/roguelike/MonsterAI.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAE5C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAgD,MAAM,iBAAiB,CAAC;AAgCjG;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,eAAe,CAC9B,KAAY,EACZ,UAAsB,EACtB,IAAU,EACV,UAAkB,EAClB,MAAY,EACZ,OAAO,GAAqB,EAAE;IAE9B,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,WAAW,IAAI,SAAS,CAAC,KAAK,SAAS,IAAI,OAAO,CAAC,QAAQ,KAAK,IAAI,CAAC;IAE5F,IAAI,CAAC,KAAK,EAAE,CAAC;QACZ,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC;IACpE,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC;IACnC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;IAExC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QACxC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC;IACpE,CAAC;IAED,IAAI,UAAU,IAAI,SAAS,EAAE,CAAC;QAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACxE,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;AACxE,CAAC;AAED,4FAA4F;AAC5F,SAAS,UAAU,CAAC,KAAY,EAAE,IAAU,EAAE,OAAoB;IACjE,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAClD,OAAO,
|
|
1
|
+
{"version":3,"file":"MonsterAI.js","sourceRoot":"","sources":["../../src/roguelike/MonsterAI.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* An ability whose own use unfolds through named stages in sequence (windup, active, recovery)
|
|
3
|
+
* rather than resolving instantly - the multi-stage subclass/ability shape a talent branch's
|
|
4
|
+
* capstone move often needs, distinct from `AbilityCycle`'s cooldown-only view of "may I use
|
|
5
|
+
* this yet". `mwg` tracks only which stage is current and when it should advance; what each
|
|
6
|
+
* stage does (grant invulnerability, deal damage, open a window for a follow-up) stays the
|
|
7
|
+
* game's own hook, fired from `advance`'s returned stage name.
|
|
8
|
+
*/
|
|
9
|
+
export interface AbilityStage {
|
|
10
|
+
name: string;
|
|
11
|
+
/** turns this stage lasts once entered */
|
|
12
|
+
duration: number;
|
|
13
|
+
}
|
|
14
|
+
export declare class MultiStageAbility {
|
|
15
|
+
private stages;
|
|
16
|
+
private index;
|
|
17
|
+
private remaining;
|
|
18
|
+
constructor(stages: readonly AbilityStage[]);
|
|
19
|
+
/** whether the ability is currently mid-sequence */
|
|
20
|
+
get active(): boolean;
|
|
21
|
+
/** the currently active stage, or null when not in use */
|
|
22
|
+
get stage(): AbilityStage | null;
|
|
23
|
+
/** begins the ability at its first stage; a no-op, reporting false, while already active */
|
|
24
|
+
start(): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Advances one turn.
|
|
27
|
+
*
|
|
28
|
+
* @returns the newly entered stage's name the turn a stage changes, `'done'` the turn the
|
|
29
|
+
* last stage finishes, or null when nothing changed (still mid-stage, or never started)
|
|
30
|
+
*/
|
|
31
|
+
advance(): string | null;
|
|
32
|
+
/** ends the ability early - interrupted mid-windup, say */
|
|
33
|
+
cancel(): void;
|
|
34
|
+
toJSON(): {
|
|
35
|
+
index: number;
|
|
36
|
+
remaining: number;
|
|
37
|
+
};
|
|
38
|
+
static fromJSON(stages: readonly AbilityStage[], data: {
|
|
39
|
+
index: number;
|
|
40
|
+
remaining: number;
|
|
41
|
+
}): MultiStageAbility;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=MultiStageAbility.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MultiStageAbility.d.ts","sourceRoot":"","sources":["../../src/roguelike/MultiStageAbility.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,WAAW,YAAY;IAC5B,IAAI,EAAE,MAAM,CAAC;IAEb,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,iBAAiB;IAC7B,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,KAAK,CAAM;IACnB,OAAO,CAAC,SAAS,CAAK;IAEtB,YAAY,MAAM,EAAE,SAAS,YAAY,EAAE,EAG1C;IAED,oDAAoD;IACpD,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,0DAA0D;IAC1D,IAAI,KAAK,IAAI,YAAY,GAAG,IAAI,CAE/B;IAED,4FAA4F;IAC5F,KAAK,IAAI,OAAO,CAKf;IAED;;;;;OAKG;IACH,OAAO,IAAI,MAAM,GAAG,IAAI,CAYvB;IAED,2DAA2D;IAC3D,MAAM,IAAI,IAAI,CAGb;IAED,MAAM,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAE7C;IAED,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,EAAE,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,iBAAiB,CAK9G;CACD"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
export class MultiStageAbility {
|
|
2
|
+
constructor(stages) {
|
|
3
|
+
this.index = -1;
|
|
4
|
+
this.remaining = 0;
|
|
5
|
+
if (stages.length === 0)
|
|
6
|
+
throw new Error('a multi-stage ability needs at least one stage');
|
|
7
|
+
this.stages = stages;
|
|
8
|
+
}
|
|
9
|
+
/** whether the ability is currently mid-sequence */
|
|
10
|
+
get active() {
|
|
11
|
+
return this.index >= 0;
|
|
12
|
+
}
|
|
13
|
+
/** the currently active stage, or null when not in use */
|
|
14
|
+
get stage() {
|
|
15
|
+
return this.index >= 0 ? this.stages[this.index] : null;
|
|
16
|
+
}
|
|
17
|
+
/** begins the ability at its first stage; a no-op, reporting false, while already active */
|
|
18
|
+
start() {
|
|
19
|
+
if (this.active)
|
|
20
|
+
return false;
|
|
21
|
+
this.index = 0;
|
|
22
|
+
this.remaining = this.stages[0].duration;
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Advances one turn.
|
|
27
|
+
*
|
|
28
|
+
* @returns the newly entered stage's name the turn a stage changes, `'done'` the turn the
|
|
29
|
+
* last stage finishes, or null when nothing changed (still mid-stage, or never started)
|
|
30
|
+
*/
|
|
31
|
+
advance() {
|
|
32
|
+
if (!this.active)
|
|
33
|
+
return null;
|
|
34
|
+
this.remaining--;
|
|
35
|
+
if (this.remaining > 0)
|
|
36
|
+
return null;
|
|
37
|
+
this.index++;
|
|
38
|
+
if (this.index >= this.stages.length) {
|
|
39
|
+
this.index = -1;
|
|
40
|
+
return 'done';
|
|
41
|
+
}
|
|
42
|
+
this.remaining = this.stages[this.index].duration;
|
|
43
|
+
return this.stages[this.index].name;
|
|
44
|
+
}
|
|
45
|
+
/** ends the ability early - interrupted mid-windup, say */
|
|
46
|
+
cancel() {
|
|
47
|
+
this.index = -1;
|
|
48
|
+
this.remaining = 0;
|
|
49
|
+
}
|
|
50
|
+
toJSON() {
|
|
51
|
+
return { index: this.index, remaining: this.remaining };
|
|
52
|
+
}
|
|
53
|
+
static fromJSON(stages, data) {
|
|
54
|
+
const ability = new MultiStageAbility(stages);
|
|
55
|
+
ability.index = data.index;
|
|
56
|
+
ability.remaining = data.remaining;
|
|
57
|
+
return ability;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=MultiStageAbility.js.map
|