@datamoc/mw_games 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +373 -0
- package/README.md +327 -0
- package/dist/actors/Advancement.d.ts +73 -0
- package/dist/actors/Advancement.d.ts.map +1 -0
- package/dist/actors/Advancement.js +98 -0
- package/dist/actors/Advancement.js.map +1 -0
- package/dist/actors/Affix.d.ts +44 -0
- package/dist/actors/Affix.d.ts.map +1 -0
- package/dist/actors/Affix.js +35 -0
- package/dist/actors/Affix.js.map +1 -0
- package/dist/actors/Appearances.d.ts +36 -0
- package/dist/actors/Appearances.d.ts.map +1 -0
- package/dist/actors/Appearances.js +50 -0
- package/dist/actors/Appearances.js.map +1 -0
- package/dist/actors/Charges.d.ts +31 -0
- package/dist/actors/Charges.d.ts.map +1 -0
- package/dist/actors/Charges.js +35 -0
- package/dist/actors/Charges.js.map +1 -0
- package/dist/actors/Equipment.d.ts +40 -0
- package/dist/actors/Equipment.d.ts.map +1 -0
- package/dist/actors/Equipment.js +57 -0
- package/dist/actors/Equipment.js.map +1 -0
- package/dist/actors/Inventory.d.ts +50 -0
- package/dist/actors/Inventory.d.ts.map +1 -0
- package/dist/actors/Inventory.js +56 -0
- package/dist/actors/Inventory.js.map +1 -0
- package/dist/actors/ItemState.d.ts +21 -0
- package/dist/actors/ItemState.d.ts.map +1 -0
- package/dist/actors/ItemState.js +34 -0
- package/dist/actors/ItemState.js.map +1 -0
- package/dist/actors/Loot.d.ts +24 -0
- package/dist/actors/Loot.d.ts.map +1 -0
- package/dist/actors/Loot.js +14 -0
- package/dist/actors/Loot.js.map +1 -0
- package/dist/actors/Progression.d.ts +30 -0
- package/dist/actors/Progression.d.ts.map +1 -0
- package/dist/actors/Progression.js +39 -0
- package/dist/actors/Progression.js.map +1 -0
- package/dist/actors/Resource.d.ts +23 -0
- package/dist/actors/Resource.d.ts.map +1 -0
- package/dist/actors/Resource.js +28 -0
- package/dist/actors/Resource.js.map +1 -0
- package/dist/actors/Scaling.d.ts +22 -0
- package/dist/actors/Scaling.d.ts.map +1 -0
- package/dist/actors/Scaling.js +9 -0
- package/dist/actors/Scaling.js.map +1 -0
- package/dist/actors/Shop.d.ts +25 -0
- package/dist/actors/Shop.d.ts.map +1 -0
- package/dist/actors/Shop.js +33 -0
- package/dist/actors/Shop.js.map +1 -0
- package/dist/actors/SkillPoints.d.ts +45 -0
- package/dist/actors/SkillPoints.d.ts.map +1 -0
- package/dist/actors/SkillPoints.js +58 -0
- package/dist/actors/SkillPoints.js.map +1 -0
- package/dist/actors/StatBlock.d.ts +52 -0
- package/dist/actors/StatBlock.d.ts.map +1 -0
- package/dist/actors/StatBlock.js +80 -0
- package/dist/actors/StatBlock.js.map +1 -0
- package/dist/actors/StatusEffect.d.ts +38 -0
- package/dist/actors/StatusEffect.d.ts.map +1 -0
- package/dist/actors/StatusEffect.js +28 -0
- package/dist/actors/StatusEffect.js.map +1 -0
- package/dist/actors/craft.d.ts +26 -0
- package/dist/actors/craft.d.ts.map +1 -0
- package/dist/actors/craft.js +34 -0
- package/dist/actors/craft.js.map +1 -0
- package/dist/actors/index.d.ts +33 -0
- package/dist/actors/index.d.ts.map +1 -0
- package/dist/actors/index.js +18 -0
- package/dist/actors/index.js.map +1 -0
- package/dist/actors/skillCheck.d.ts +13 -0
- package/dist/actors/skillCheck.d.ts.map +1 -0
- package/dist/actors/skillCheck.js +16 -0
- package/dist/actors/skillCheck.js.map +1 -0
- package/dist/assets/index.d.ts +37 -0
- package/dist/assets/index.d.ts.map +1 -0
- package/dist/assets/index.js +62 -0
- package/dist/assets/index.js.map +1 -0
- package/dist/audio/Music.d.ts +22 -0
- package/dist/audio/Music.d.ts.map +1 -0
- package/dist/audio/Music.js +67 -0
- package/dist/audio/Music.js.map +1 -0
- package/dist/audio/Playable.d.ts +16 -0
- package/dist/audio/Playable.d.ts.map +1 -0
- package/dist/audio/Playable.js +6 -0
- package/dist/audio/Playable.js.map +1 -0
- package/dist/audio/Sound.d.ts +23 -0
- package/dist/audio/Sound.d.ts.map +1 -0
- package/dist/audio/Sound.js +30 -0
- package/dist/audio/Sound.js.map +1 -0
- package/dist/audio/index.d.ts +7 -0
- package/dist/audio/index.d.ts.map +1 -0
- package/dist/audio/index.js +4 -0
- package/dist/audio/index.js.map +1 -0
- package/dist/battle/BattleAI.d.ts +24 -0
- package/dist/battle/BattleAI.d.ts.map +1 -0
- package/dist/battle/BattleAI.js +47 -0
- package/dist/battle/BattleAI.js.map +1 -0
- package/dist/battle/Evolution.d.ts +22 -0
- package/dist/battle/Evolution.d.ts.map +1 -0
- package/dist/battle/Evolution.js +25 -0
- package/dist/battle/Evolution.js.map +1 -0
- package/dist/battle/Field.d.ts +25 -0
- package/dist/battle/Field.d.ts.map +1 -0
- package/dist/battle/Field.js +31 -0
- package/dist/battle/Field.js.map +1 -0
- package/dist/battle/Hooks.d.ts +29 -0
- package/dist/battle/Hooks.d.ts.map +1 -0
- package/dist/battle/Hooks.js +20 -0
- package/dist/battle/Hooks.js.map +1 -0
- package/dist/battle/Move.d.ts +32 -0
- package/dist/battle/Move.d.ts.map +1 -0
- package/dist/battle/Move.js +10 -0
- package/dist/battle/Move.js.map +1 -0
- package/dist/battle/Party.d.ts +21 -0
- package/dist/battle/Party.d.ts.map +1 -0
- package/dist/battle/Party.js +49 -0
- package/dist/battle/Party.js.map +1 -0
- package/dist/battle/Species.d.ts +40 -0
- package/dist/battle/Species.d.ts.map +1 -0
- package/dist/battle/Species.js +31 -0
- package/dist/battle/Species.js.map +1 -0
- package/dist/battle/StatStages.d.ts +38 -0
- package/dist/battle/StatStages.d.ts.map +1 -0
- package/dist/battle/StatStages.js +50 -0
- package/dist/battle/StatStages.js.map +1 -0
- package/dist/battle/TypeMatrix.d.ts +14 -0
- package/dist/battle/TypeMatrix.d.ts.map +1 -0
- package/dist/battle/TypeMatrix.js +24 -0
- package/dist/battle/TypeMatrix.js.map +1 -0
- package/dist/battle/index.d.ts +16 -0
- package/dist/battle/index.d.ts.map +1 -0
- package/dist/battle/index.js +10 -0
- package/dist/battle/index.js.map +1 -0
- package/dist/board/Classics.d.ts +123 -0
- package/dist/board/Classics.d.ts.map +1 -0
- package/dist/board/Classics.js +260 -0
- package/dist/board/Classics.js.map +1 -0
- package/dist/board/Engine.d.ts +23 -0
- package/dist/board/Engine.d.ts.map +1 -0
- package/dist/board/Engine.js +87 -0
- package/dist/board/Engine.js.map +1 -0
- package/dist/board/Tactics.d.ts +46 -0
- package/dist/board/Tactics.d.ts.map +1 -0
- package/dist/board/Tactics.js +108 -0
- package/dist/board/Tactics.js.map +1 -0
- package/dist/board/chess.d.ts +67 -0
- package/dist/board/chess.d.ts.map +1 -0
- package/dist/board/chess.js +439 -0
- package/dist/board/chess.js.map +1 -0
- package/dist/board/index.d.ts +9 -0
- package/dist/board/index.d.ts.map +1 -0
- package/dist/board/index.js +5 -0
- package/dist/board/index.js.map +1 -0
- package/dist/core/Achievements.d.ts +53 -0
- package/dist/core/Achievements.d.ts.map +1 -0
- package/dist/core/Achievements.js +80 -0
- package/dist/core/Achievements.js.map +1 -0
- package/dist/core/Collection.d.ts +46 -0
- package/dist/core/Collection.d.ts.map +1 -0
- package/dist/core/Collection.js +61 -0
- package/dist/core/Collection.js.map +1 -0
- package/dist/core/Game.d.ts +115 -0
- package/dist/core/Game.d.ts.map +1 -0
- package/dist/core/Game.js +236 -0
- package/dist/core/Game.js.map +1 -0
- package/dist/core/Hex.d.ts +45 -0
- package/dist/core/Hex.d.ts.map +1 -0
- package/dist/core/Hex.js +120 -0
- package/dist/core/Hex.js.map +1 -0
- package/dist/core/Input.d.ts +41 -0
- package/dist/core/Input.d.ts.map +1 -0
- package/dist/core/Input.js +132 -0
- package/dist/core/Input.js.map +1 -0
- package/dist/core/Log.d.ts +39 -0
- package/dist/core/Log.d.ts.map +1 -0
- package/dist/core/Log.js +50 -0
- package/dist/core/Log.js.map +1 -0
- package/dist/core/Random.d.ts +64 -0
- package/dist/core/Random.d.ts.map +1 -0
- package/dist/core/Random.js +178 -0
- package/dist/core/Random.js.map +1 -0
- package/dist/core/Replay.d.ts +71 -0
- package/dist/core/Replay.d.ts.map +1 -0
- package/dist/core/Replay.js +102 -0
- package/dist/core/Replay.js.map +1 -0
- package/dist/core/Save.d.ts +52 -0
- package/dist/core/Save.d.ts.map +1 -0
- package/dist/core/Save.js +81 -0
- package/dist/core/Save.js.map +1 -0
- package/dist/core/Scene.d.ts +40 -0
- package/dist/core/Scene.d.ts.map +1 -0
- package/dist/core/Scene.js +56 -0
- package/dist/core/Scene.js.map +1 -0
- package/dist/core/SceneStack.d.ts +37 -0
- package/dist/core/SceneStack.d.ts.map +1 -0
- package/dist/core/SceneStack.js +67 -0
- package/dist/core/SceneStack.js.map +1 -0
- package/dist/core/Signal.d.ts +24 -0
- package/dist/core/Signal.d.ts.map +1 -0
- package/dist/core/Signal.js +41 -0
- package/dist/core/Signal.js.map +1 -0
- package/dist/core/index.d.ts +23 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +14 -0
- package/dist/core/index.js.map +1 -0
- package/dist/i18n/index.d.ts +51 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +74 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/mw_games.global.js +993 -0
- package/dist/render/ActorAnimator.d.ts +60 -0
- package/dist/render/ActorAnimator.d.ts.map +1 -0
- package/dist/render/ActorAnimator.js +76 -0
- package/dist/render/ActorAnimator.js.map +1 -0
- package/dist/render/AnimatedSprite.d.ts +57 -0
- package/dist/render/AnimatedSprite.d.ts.map +1 -0
- package/dist/render/AnimatedSprite.js +105 -0
- package/dist/render/AnimatedSprite.js.map +1 -0
- package/dist/render/Autotile.d.ts +42 -0
- package/dist/render/Autotile.d.ts.map +1 -0
- package/dist/render/Autotile.js +117 -0
- package/dist/render/Autotile.js.map +1 -0
- package/dist/render/Camera.d.ts +88 -0
- package/dist/render/Camera.d.ts.map +1 -0
- package/dist/render/Camera.js +145 -0
- package/dist/render/Camera.js.map +1 -0
- package/dist/render/ColorTransformBatcher.d.ts +57 -0
- package/dist/render/ColorTransformBatcher.d.ts.map +1 -0
- package/dist/render/ColorTransformBatcher.js +212 -0
- package/dist/render/ColorTransformBatcher.js.map +1 -0
- package/dist/render/LayeredSprite.d.ts +27 -0
- package/dist/render/LayeredSprite.d.ts.map +1 -0
- package/dist/render/LayeredSprite.js +53 -0
- package/dist/render/LayeredSprite.js.map +1 -0
- package/dist/render/Projectile.d.ts +37 -0
- package/dist/render/Projectile.d.ts.map +1 -0
- package/dist/render/Projectile.js +50 -0
- package/dist/render/Projectile.js.map +1 -0
- package/dist/render/SpriteSheet.d.ts +38 -0
- package/dist/render/SpriteSheet.d.ts.map +1 -0
- package/dist/render/SpriteSheet.js +79 -0
- package/dist/render/SpriteSheet.js.map +1 -0
- package/dist/render/TileMap.d.ts +188 -0
- package/dist/render/TileMap.d.ts.map +1 -0
- package/dist/render/TileMap.js +488 -0
- package/dist/render/TileMap.js.map +1 -0
- package/dist/render/TintedSprite.d.ts +47 -0
- package/dist/render/TintedSprite.d.ts.map +1 -0
- package/dist/render/TintedSprite.js +173 -0
- package/dist/render/TintedSprite.js.map +1 -0
- package/dist/render/index.d.ts +18 -0
- package/dist/render/index.d.ts.map +1 -0
- package/dist/render/index.js +11 -0
- package/dist/render/index.js.map +1 -0
- package/dist/roguelike/Blob.d.ts +46 -0
- package/dist/roguelike/Blob.d.ts.map +1 -0
- package/dist/roguelike/Blob.js +98 -0
- package/dist/roguelike/Blob.js.map +1 -0
- package/dist/roguelike/Boss.d.ts +67 -0
- package/dist/roguelike/Boss.d.ts.map +1 -0
- package/dist/roguelike/Boss.js +114 -0
- package/dist/roguelike/Boss.js.map +1 -0
- package/dist/roguelike/Combat.d.ts +23 -0
- package/dist/roguelike/Combat.d.ts.map +1 -0
- package/dist/roguelike/Combat.js +27 -0
- package/dist/roguelike/Combat.js.map +1 -0
- package/dist/roguelike/Doors.d.ts +60 -0
- package/dist/roguelike/Doors.d.ts.map +1 -0
- package/dist/roguelike/Doors.js +102 -0
- package/dist/roguelike/Doors.js.map +1 -0
- package/dist/roguelike/Elevation.d.ts +26 -0
- package/dist/roguelike/Elevation.d.ts.map +1 -0
- package/dist/roguelike/Elevation.js +37 -0
- package/dist/roguelike/Elevation.js.map +1 -0
- package/dist/roguelike/FieldOfView.d.ts +72 -0
- package/dist/roguelike/FieldOfView.d.ts.map +1 -0
- package/dist/roguelike/FieldOfView.js +134 -0
- package/dist/roguelike/FieldOfView.js.map +1 -0
- package/dist/roguelike/Level.d.ts +96 -0
- package/dist/roguelike/Level.d.ts.map +1 -0
- package/dist/roguelike/Level.js +137 -0
- package/dist/roguelike/Level.js.map +1 -0
- package/dist/roguelike/MonsterAI.d.ts +40 -0
- package/dist/roguelike/MonsterAI.d.ts.map +1 -0
- package/dist/roguelike/MonsterAI.js +69 -0
- package/dist/roguelike/MonsterAI.js.map +1 -0
- package/dist/roguelike/Pathfinder.d.ts +82 -0
- package/dist/roguelike/Pathfinder.d.ts.map +1 -0
- package/dist/roguelike/Pathfinder.js +192 -0
- package/dist/roguelike/Pathfinder.js.map +1 -0
- package/dist/roguelike/Scheduler.d.ts +45 -0
- package/dist/roguelike/Scheduler.d.ts.map +1 -0
- package/dist/roguelike/Scheduler.js +82 -0
- package/dist/roguelike/Scheduler.js.map +1 -0
- package/dist/roguelike/Secrets.d.ts +44 -0
- package/dist/roguelike/Secrets.d.ts.map +1 -0
- package/dist/roguelike/Secrets.js +64 -0
- package/dist/roguelike/Secrets.js.map +1 -0
- package/dist/roguelike/Targeting.d.ts +66 -0
- package/dist/roguelike/Targeting.d.ts.map +1 -0
- package/dist/roguelike/Targeting.js +150 -0
- package/dist/roguelike/Targeting.js.map +1 -0
- package/dist/roguelike/generate.d.ts +44 -0
- package/dist/roguelike/generate.d.ts.map +1 -0
- package/dist/roguelike/generate.js +88 -0
- package/dist/roguelike/generate.js.map +1 -0
- package/dist/roguelike/index.d.ts +23 -0
- package/dist/roguelike/index.d.ts.map +1 -0
- package/dist/roguelike/index.js +15 -0
- package/dist/roguelike/index.js.map +1 -0
- package/dist/rpg/Event.d.ts +33 -0
- package/dist/rpg/Event.d.ts.map +1 -0
- package/dist/rpg/Event.js +19 -0
- package/dist/rpg/Event.js.map +1 -0
- package/dist/rpg/EventRunner.d.ts +72 -0
- package/dist/rpg/EventRunner.d.ts.map +1 -0
- package/dist/rpg/EventRunner.js +76 -0
- package/dist/rpg/EventRunner.js.map +1 -0
- package/dist/rpg/GameState.d.ts +22 -0
- package/dist/rpg/GameState.d.ts.map +1 -0
- package/dist/rpg/GameState.js +35 -0
- package/dist/rpg/GameState.js.map +1 -0
- package/dist/rpg/GridMover.d.ts +51 -0
- package/dist/rpg/GridMover.d.ts.map +1 -0
- package/dist/rpg/GridMover.js +91 -0
- package/dist/rpg/GridMover.js.map +1 -0
- package/dist/rpg/Quest.d.ts +67 -0
- package/dist/rpg/Quest.d.ts.map +1 -0
- package/dist/rpg/Quest.js +92 -0
- package/dist/rpg/Quest.js.map +1 -0
- package/dist/rpg/TiledMap.d.ts +107 -0
- package/dist/rpg/TiledMap.d.ts.map +1 -0
- package/dist/rpg/TiledMap.js +123 -0
- package/dist/rpg/TiledMap.js.map +1 -0
- package/dist/rpg/automap.d.ts +40 -0
- package/dist/rpg/automap.d.ts.map +1 -0
- package/dist/rpg/automap.js +81 -0
- package/dist/rpg/automap.js.map +1 -0
- package/dist/rpg/index.d.ts +14 -0
- package/dist/rpg/index.d.ts.map +1 -0
- package/dist/rpg/index.js +8 -0
- package/dist/rpg/index.js.map +1 -0
- package/dist/stage/DialogueStage.d.ts +75 -0
- package/dist/stage/DialogueStage.d.ts.map +1 -0
- package/dist/stage/DialogueStage.js +207 -0
- package/dist/stage/DialogueStage.js.map +1 -0
- package/dist/stage/index.d.ts +7 -0
- package/dist/stage/index.d.ts.map +1 -0
- package/dist/stage/index.js +4 -0
- package/dist/stage/index.js.map +1 -0
- package/dist/stage/script.d.ts +111 -0
- package/dist/stage/script.d.ts.map +1 -0
- package/dist/stage/script.js +133 -0
- package/dist/stage/script.js.map +1 -0
- package/dist/stage/twee.d.ts +42 -0
- package/dist/stage/twee.d.ts.map +1 -0
- package/dist/stage/twee.js +169 -0
- package/dist/stage/twee.js.map +1 -0
- package/dist/ui/IconGrid.d.ts +110 -0
- package/dist/ui/IconGrid.d.ts.map +1 -0
- package/dist/ui/IconGrid.js +284 -0
- package/dist/ui/IconGrid.js.map +1 -0
- package/dist/ui/Label.d.ts +26 -0
- package/dist/ui/Label.d.ts.map +1 -0
- package/dist/ui/Label.js +41 -0
- package/dist/ui/Label.js.map +1 -0
- package/dist/ui/ListView.d.ts +67 -0
- package/dist/ui/ListView.d.ts.map +1 -0
- package/dist/ui/ListView.js +167 -0
- package/dist/ui/ListView.js.map +1 -0
- package/dist/ui/MessageBox.d.ts +66 -0
- package/dist/ui/MessageBox.d.ts.map +1 -0
- package/dist/ui/MessageBox.js +161 -0
- package/dist/ui/MessageBox.js.map +1 -0
- package/dist/ui/NinePatch.d.ts +34 -0
- package/dist/ui/NinePatch.d.ts.map +1 -0
- package/dist/ui/NinePatch.js +45 -0
- package/dist/ui/NinePatch.js.map +1 -0
- package/dist/ui/VerticalLabel.d.ts +46 -0
- package/dist/ui/VerticalLabel.d.ts.map +1 -0
- package/dist/ui/VerticalLabel.js +81 -0
- package/dist/ui/VerticalLabel.js.map +1 -0
- package/dist/ui/Window.d.ts +71 -0
- package/dist/ui/Window.d.ts.map +1 -0
- package/dist/ui/Window.js +126 -0
- package/dist/ui/Window.js.map +1 -0
- package/dist/ui/WindowStack.d.ts +40 -0
- package/dist/ui/WindowStack.d.ts.map +1 -0
- package/dist/ui/WindowStack.js +106 -0
- package/dist/ui/WindowStack.js.map +1 -0
- package/dist/ui/index.d.ts +18 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +10 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/theme.d.ts +50 -0
- package/dist/ui/theme.d.ts.map +1 -0
- package/dist/ui/theme.js +36 -0
- package/dist/ui/theme.js.map +1 -0
- package/dist/world/Encounters.d.ts +20 -0
- package/dist/world/Encounters.d.ts.map +1 -0
- package/dist/world/Encounters.js +9 -0
- package/dist/world/Encounters.js.map +1 -0
- package/dist/world/Overworld.d.ts +25 -0
- package/dist/world/Overworld.d.ts.map +1 -0
- package/dist/world/Overworld.js +26 -0
- package/dist/world/Overworld.js.map +1 -0
- package/dist/world/TurnClock.d.ts +25 -0
- package/dist/world/TurnClock.d.ts.map +1 -0
- package/dist/world/TurnClock.js +33 -0
- package/dist/world/TurnClock.js.map +1 -0
- package/dist/world/World.d.ts +50 -0
- package/dist/world/World.d.ts.map +1 -0
- package/dist/world/World.js +77 -0
- package/dist/world/World.js.map +1 -0
- package/dist/world/index.d.ts +8 -0
- package/dist/world/index.d.ts.map +1 -0
- package/dist/world/index.js +5 -0
- package/dist/world/index.js.map +1 -0
- package/package.json +76 -0
- package/tools/compile-resources.mjs +129 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { Level } from './Level.ts';
|
|
2
|
+
/**
|
|
3
|
+
* Open/closed/locked door state, the same shape `Secrets` already uses: the state itself is
|
|
4
|
+
* just terrain (a door swaps between its own open and closed terrain kinds, so `passable`/
|
|
5
|
+
* `transparent` need no door-specific code at all), and this class remembers the other half -
|
|
6
|
+
* which cells are doors, and what they swap to.
|
|
7
|
+
*
|
|
8
|
+
* Locking is a separate flag from open/closed: a locked door is always closed and refuses to
|
|
9
|
+
* open until `unlock` is called (typically once a game confirms the actor holds the right
|
|
10
|
+
* key item), rather than open/closed and locked/unlocked being folded into one state.
|
|
11
|
+
*/
|
|
12
|
+
export declare class Doors {
|
|
13
|
+
private level;
|
|
14
|
+
private openKind;
|
|
15
|
+
private closedKind;
|
|
16
|
+
private lockedBy;
|
|
17
|
+
private open_;
|
|
18
|
+
constructor(level: Level);
|
|
19
|
+
/** places a door at `(x, y)`, swapping between `open`/`closed` terrain kinds */
|
|
20
|
+
place(x: number, y: number, options: {
|
|
21
|
+
open: number;
|
|
22
|
+
closed: number;
|
|
23
|
+
locked?: string;
|
|
24
|
+
startOpen?: boolean;
|
|
25
|
+
}): void;
|
|
26
|
+
isDoor(x: number, y: number): boolean;
|
|
27
|
+
isOpen(x: number, y: number): boolean;
|
|
28
|
+
isLocked(x: number, y: number): boolean;
|
|
29
|
+
/** the id of the key item that unlocks this door, or undefined if it is not locked */
|
|
30
|
+
requiredKey(x: number, y: number): string | undefined;
|
|
31
|
+
/** @returns false, changing nothing, for a locked door, an already-open one, or not a door */
|
|
32
|
+
open(x: number, y: number): boolean;
|
|
33
|
+
/** @returns false, changing nothing, for an already-closed door or not a door */
|
|
34
|
+
close(x: number, y: number): boolean;
|
|
35
|
+
/** removes a door's lock, leaving it closed but now openable; false if it was not locked */
|
|
36
|
+
unlock(x: number, y: number): boolean;
|
|
37
|
+
toJSON(): {
|
|
38
|
+
doors: {
|
|
39
|
+
cell: number;
|
|
40
|
+
open: number;
|
|
41
|
+
closed: number;
|
|
42
|
+
locked?: string;
|
|
43
|
+
isOpen: boolean;
|
|
44
|
+
}[];
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Rebuilds doors from save data onto a (separately restored) level, re-applying each
|
|
48
|
+
* door's terrain so an open door still reads as open to `passable`/`transparent`.
|
|
49
|
+
*/
|
|
50
|
+
static fromJSON(level: Level, data: {
|
|
51
|
+
doors: {
|
|
52
|
+
cell: number;
|
|
53
|
+
open: number;
|
|
54
|
+
closed: number;
|
|
55
|
+
locked?: string;
|
|
56
|
+
isOpen: boolean;
|
|
57
|
+
}[];
|
|
58
|
+
}): Doors;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=Doors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Doors.d.ts","sourceRoot":"","sources":["../../src/roguelike/Doors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC;;;;;;;;;GASG;AACH,qBAAa,KAAK;IACjB,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,UAAU,CAA6B;IAC/C,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,KAAK,CAA8B;IAE3C,YAAY,KAAK,EAAE,KAAK,EAEvB;IAED,gFAAgF;IAChF,KAAK,CACJ,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAC7E,IAAI,CASN;IAED,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAEpC;IAED,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAEpC;IAED,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAEtC;IAED,sFAAsF;IACtF,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEpD;IAED,8FAA8F;IAC9F,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAOlC;IAED,iFAAiF;IACjF,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAOnC;IAED,4FAA4F;IAC5F,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAMpC;IAED,MAAM,IAAI;QAAE,KAAK,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,OAAO,CAAA;SAAE,EAAE,CAAA;KAAE,CAYtG;IAED;;;OAGG;IACH,MAAM,CAAC,QAAQ,CACd,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE;QAAE,KAAK,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,OAAO,CAAA;SAAE,EAAE,CAAA;KAAE,GACjG,KAAK,CAaP;CACD"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Open/closed/locked door state, the same shape `Secrets` already uses: the state itself is
|
|
3
|
+
* just terrain (a door swaps between its own open and closed terrain kinds, so `passable`/
|
|
4
|
+
* `transparent` need no door-specific code at all), and this class remembers the other half -
|
|
5
|
+
* which cells are doors, and what they swap to.
|
|
6
|
+
*
|
|
7
|
+
* Locking is a separate flag from open/closed: a locked door is always closed and refuses to
|
|
8
|
+
* open until `unlock` is called (typically once a game confirms the actor holds the right
|
|
9
|
+
* key item), rather than open/closed and locked/unlocked being folded into one state.
|
|
10
|
+
*/
|
|
11
|
+
export class Doors {
|
|
12
|
+
constructor(level) {
|
|
13
|
+
this.openKind = new Map();
|
|
14
|
+
this.closedKind = new Map();
|
|
15
|
+
this.lockedBy = new Map();
|
|
16
|
+
this.open_ = new Map();
|
|
17
|
+
this.level = level;
|
|
18
|
+
}
|
|
19
|
+
/** places a door at `(x, y)`, swapping between `open`/`closed` terrain kinds */
|
|
20
|
+
place(x, y, options) {
|
|
21
|
+
const cell = this.level.index(x, y);
|
|
22
|
+
this.openKind.set(cell, options.open);
|
|
23
|
+
this.closedKind.set(cell, options.closed);
|
|
24
|
+
this.open_.set(cell, options.startOpen ?? false);
|
|
25
|
+
if (options.locked !== undefined)
|
|
26
|
+
this.lockedBy.set(cell, options.locked);
|
|
27
|
+
else
|
|
28
|
+
this.lockedBy.delete(cell);
|
|
29
|
+
this.level.set(x, y, this.open_.get(cell) ? options.open : options.closed);
|
|
30
|
+
}
|
|
31
|
+
isDoor(x, y) {
|
|
32
|
+
return this.open_.has(this.level.index(x, y));
|
|
33
|
+
}
|
|
34
|
+
isOpen(x, y) {
|
|
35
|
+
return this.open_.get(this.level.index(x, y)) === true;
|
|
36
|
+
}
|
|
37
|
+
isLocked(x, y) {
|
|
38
|
+
return this.lockedBy.has(this.level.index(x, y));
|
|
39
|
+
}
|
|
40
|
+
/** the id of the key item that unlocks this door, or undefined if it is not locked */
|
|
41
|
+
requiredKey(x, y) {
|
|
42
|
+
return this.lockedBy.get(this.level.index(x, y));
|
|
43
|
+
}
|
|
44
|
+
/** @returns false, changing nothing, for a locked door, an already-open one, or not a door */
|
|
45
|
+
open(x, y) {
|
|
46
|
+
const cell = this.level.index(x, y);
|
|
47
|
+
if (!this.open_.has(cell) || this.open_.get(cell) || this.lockedBy.has(cell))
|
|
48
|
+
return false;
|
|
49
|
+
this.open_.set(cell, true);
|
|
50
|
+
this.level.set(x, y, this.openKind.get(cell));
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
/** @returns false, changing nothing, for an already-closed door or not a door */
|
|
54
|
+
close(x, y) {
|
|
55
|
+
const cell = this.level.index(x, y);
|
|
56
|
+
if (!this.open_.has(cell) || !this.open_.get(cell))
|
|
57
|
+
return false;
|
|
58
|
+
this.open_.set(cell, false);
|
|
59
|
+
this.level.set(x, y, this.closedKind.get(cell));
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
/** removes a door's lock, leaving it closed but now openable; false if it was not locked */
|
|
63
|
+
unlock(x, y) {
|
|
64
|
+
const cell = this.level.index(x, y);
|
|
65
|
+
if (!this.lockedBy.has(cell))
|
|
66
|
+
return false;
|
|
67
|
+
this.lockedBy.delete(cell);
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
toJSON() {
|
|
71
|
+
const doors = [];
|
|
72
|
+
for (const [cell, open] of this.openKind) {
|
|
73
|
+
doors.push({
|
|
74
|
+
cell,
|
|
75
|
+
open,
|
|
76
|
+
closed: this.closedKind.get(cell),
|
|
77
|
+
locked: this.lockedBy.get(cell),
|
|
78
|
+
isOpen: this.open_.get(cell) === true,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
return { doors };
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Rebuilds doors from save data onto a (separately restored) level, re-applying each
|
|
85
|
+
* door's terrain so an open door still reads as open to `passable`/`transparent`.
|
|
86
|
+
*/
|
|
87
|
+
static fromJSON(level, data) {
|
|
88
|
+
const doors = new Doors(level);
|
|
89
|
+
for (const saved of data.doors) {
|
|
90
|
+
const x = level.xOf(saved.cell);
|
|
91
|
+
const y = level.yOf(saved.cell);
|
|
92
|
+
doors.place(x, y, {
|
|
93
|
+
open: saved.open,
|
|
94
|
+
closed: saved.closed,
|
|
95
|
+
locked: saved.locked,
|
|
96
|
+
startOpen: saved.isOpen,
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
return doors;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=Doors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Doors.js","sourceRoot":"","sources":["../../src/roguelike/Doors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { Level } from './Level.ts';
|
|
2
|
+
/**
|
|
3
|
+
* A discrete height per cell: raised platforms, cliffs, pits.
|
|
4
|
+
*
|
|
5
|
+
* A sidecar like `Secrets` and `Doors`, holding the `Level` it belongs to rather
|
|
6
|
+
* than living inside it - the still-fundamentally-2D map gains a height value,
|
|
7
|
+
* not a third axis. Every cell starts at 0, the ground everything else is
|
|
8
|
+
* measured against; negative heights are pits, for whatever a game makes of them.
|
|
9
|
+
*
|
|
10
|
+
* What reads it: `FieldOfView.update` takes heights to block sight asymmetrically
|
|
11
|
+
* (a cliff hides what is behind it from below, but not from above), and
|
|
12
|
+
* `Pathfinder` takes heights with a climb limit. What does not: `TileMap` draws
|
|
13
|
+
* tiles where the grid says, and sprites stand where the game puts them - a
|
|
14
|
+
* raised cell *looks* raised because the game offsets its occupants' sprites
|
|
15
|
+
* upward by their height, which is presentation, not pathing, and lives game-side.
|
|
16
|
+
*/
|
|
17
|
+
export declare class Elevation {
|
|
18
|
+
private readonly level;
|
|
19
|
+
private readonly heights;
|
|
20
|
+
constructor(level: Level);
|
|
21
|
+
/** the height of a cell; off the map reads as ground (walking there is refused by `Level` itself) */
|
|
22
|
+
heightAt(x: number, y: number): number;
|
|
23
|
+
/** raises or lowers one cell - heights are whole levels, not fractions */
|
|
24
|
+
set(x: number, y: number, height: number): void;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=Elevation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Elevation.d.ts","sourceRoot":"","sources":["../../src/roguelike/Elevation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC;;;;;;;;;;;;;;GAcG;AACH,qBAAa,SAAS;IACrB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAa;IAErC,YAAY,KAAK,EAAE,KAAK,EAGvB;IAED,qGAAqG;IACrG,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAGrC;IAED,0EAA0E;IAC1E,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAM9C;CACD"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A discrete height per cell: raised platforms, cliffs, pits.
|
|
3
|
+
*
|
|
4
|
+
* A sidecar like `Secrets` and `Doors`, holding the `Level` it belongs to rather
|
|
5
|
+
* than living inside it - the still-fundamentally-2D map gains a height value,
|
|
6
|
+
* not a third axis. Every cell starts at 0, the ground everything else is
|
|
7
|
+
* measured against; negative heights are pits, for whatever a game makes of them.
|
|
8
|
+
*
|
|
9
|
+
* What reads it: `FieldOfView.update` takes heights to block sight asymmetrically
|
|
10
|
+
* (a cliff hides what is behind it from below, but not from above), and
|
|
11
|
+
* `Pathfinder` takes heights with a climb limit. What does not: `TileMap` draws
|
|
12
|
+
* tiles where the grid says, and sprites stand where the game puts them - a
|
|
13
|
+
* raised cell *looks* raised because the game offsets its occupants' sprites
|
|
14
|
+
* upward by their height, which is presentation, not pathing, and lives game-side.
|
|
15
|
+
*/
|
|
16
|
+
export class Elevation {
|
|
17
|
+
constructor(level) {
|
|
18
|
+
this.level = level;
|
|
19
|
+
this.heights = new Int32Array(level.cellCount);
|
|
20
|
+
}
|
|
21
|
+
/** the height of a cell; off the map reads as ground (walking there is refused by `Level` itself) */
|
|
22
|
+
heightAt(x, y) {
|
|
23
|
+
if (!this.level.inside(x, y))
|
|
24
|
+
return 0;
|
|
25
|
+
return this.heights[this.level.index(x, y)];
|
|
26
|
+
}
|
|
27
|
+
/** raises or lowers one cell - heights are whole levels, not fractions */
|
|
28
|
+
set(x, y, height) {
|
|
29
|
+
if (!Number.isInteger(height)) {
|
|
30
|
+
throw new Error(`a cell's height must be a whole number, got ${height}`);
|
|
31
|
+
}
|
|
32
|
+
if (!this.level.inside(x, y))
|
|
33
|
+
return;
|
|
34
|
+
this.heights[this.level.index(x, y)] = height;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=Elevation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Elevation.js","sourceRoot":"","sources":["../../src/roguelike/Elevation.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;GAcG;AACH,MAAM,OAAO,SAAS;IAIrB,YAAY,KAAY;QACvB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,OAAO,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAChD,CAAC;IAED,qGAAqG;IACrG,QAAQ,CAAC,CAAS,EAAE,CAAS;QAC5B,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,0EAA0E;IAC1E,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,MAAc;QACvC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,+CAA+C,MAAM,EAAE,CAAC,CAAC;QAC1E,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;YAAE,OAAO;QACrC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;IAC/C,CAAC;CACD"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import type { Level } from './Level.ts';
|
|
2
|
+
import type { Elevation } from './Elevation.ts';
|
|
3
|
+
/**
|
|
4
|
+
* What the player can see, and what they remember seeing.
|
|
5
|
+
*
|
|
6
|
+
* Two sets, because a roguelike map has three states and not two: lit and in view,
|
|
7
|
+
* remembered but not currently seen, and never visited. The middle one is the whole reason
|
|
8
|
+
* exploring a dungeon feels like exploring — the map you have built stays on screen while
|
|
9
|
+
* what is happening on it does not.
|
|
10
|
+
*
|
|
11
|
+
* The shadowcasting itself comes from rot.js on a square `Level`, which has had these edge
|
|
12
|
+
* cases beaten out of it over years - what is here around it is the memory. rot.js has
|
|
13
|
+
* nothing hex-shaped, so a hex `Level` instead traces a straight line (`hexLine`) to every
|
|
14
|
+
* cell in range and lights it if nothing along the way is opaque: simple line-of-sight,
|
|
15
|
+
* deliberately not true shadowcasting, which is the v1 this roadmap item commits to.
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* Sight from a height: the viewer's elevation, for maps with an `Elevation`.
|
|
19
|
+
*
|
|
20
|
+
* A cliff hides what is behind it from below but not from above - an intervening
|
|
21
|
+
* cell blocks exactly when it rises above both ends of the gaze. `height`
|
|
22
|
+
* defaults to the height of the cell stood on; a flying or perched viewer passes
|
|
23
|
+
* its own.
|
|
24
|
+
*/
|
|
25
|
+
export interface HeightSight {
|
|
26
|
+
heights: Elevation;
|
|
27
|
+
height?: number;
|
|
28
|
+
}
|
|
29
|
+
export declare class FieldOfView {
|
|
30
|
+
private level;
|
|
31
|
+
private fov;
|
|
32
|
+
/** cells currently in view */
|
|
33
|
+
readonly visible: Set<number>;
|
|
34
|
+
/** cells ever seen, which is what gets drawn dim */
|
|
35
|
+
readonly explored: Set<number>;
|
|
36
|
+
/** how bright each visible cell is, 0 to 1, by cell index */
|
|
37
|
+
readonly light: Map<number, number>;
|
|
38
|
+
constructor(level: Level);
|
|
39
|
+
/**
|
|
40
|
+
* Recomputes what is visible from a point.
|
|
41
|
+
*
|
|
42
|
+
* @param radius how far light reaches, in cells
|
|
43
|
+
* @param sight when given, sight is height-aware: every cell in range is
|
|
44
|
+
* tested along the straight line to it, blocked by opaque terrain or by a
|
|
45
|
+
* cell rising above viewer and target alike. That is line-of-sight per cell
|
|
46
|
+
* rather than shadowcasting, so its edges deliberately disagree with the
|
|
47
|
+
* flat computation in the same way targeting already does - rot.js's
|
|
48
|
+
* callback only ever sees the blocking cell, never the target, so the
|
|
49
|
+
* viewer-relative rule cannot live inside it.
|
|
50
|
+
*/
|
|
51
|
+
update(x: number, y: number, radius: number, sight?: HeightSight): void;
|
|
52
|
+
/** lights one visible cell with the usual distance falloff */
|
|
53
|
+
private lightCell;
|
|
54
|
+
/** height-aware sight for both shapes: one straight line per cell, one rule for cliffs */
|
|
55
|
+
private updateFromHeight;
|
|
56
|
+
/**
|
|
57
|
+
* Whether anything between the line's ends blocks a gaze from `viewer` height
|
|
58
|
+
* to `target` height: opaque terrain always does, and so does a cell rising
|
|
59
|
+
* above them both. Heights only ever add blocking - a wall still reads as a
|
|
60
|
+
* wall from above.
|
|
61
|
+
*/
|
|
62
|
+
private heightBlocked;
|
|
63
|
+
isVisible(x: number, y: number): boolean;
|
|
64
|
+
isExplored(x: number, y: number): boolean;
|
|
65
|
+
/** how lit a cell is right now, 0 when out of view */
|
|
66
|
+
lightAt(x: number, y: number): number;
|
|
67
|
+
/** forgets everything, as a new floor should */
|
|
68
|
+
reset(): void;
|
|
69
|
+
/** reveals the whole map, for a magic mapping effect or a debug view */
|
|
70
|
+
revealAll(): void;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=FieldOfView.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FieldOfView.d.ts","sourceRoot":"","sources":["../../src/roguelike/FieldOfView.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAIhD;;;;;;;;;;;;;GAaG;AACH;;;;;;;GAOG;AACH,MAAM,WAAW,WAAW;IAC3B,OAAO,EAAE,SAAS,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,WAAW;IAAG,OAAO,CAAC,KAAK,CAAQ;IAG/C,OAAO,CAAC,GAAG,CAAuD;IAElE,8BAA8B;IAC9B,QAAQ,CAAC,OAAO,cAAqB;IAErC,oDAAoD;IACpD,QAAQ,CAAC,QAAQ,cAAqB;IAEtC,6DAA6D;IAC7D,QAAQ,CAAC,KAAK,sBAA6B;IAE3C,YAAY,KAAK,EAAE,KAAK,EAGvB;IAED;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,WAAW,GAAG,IAAI,CAmCtE;IAED,8DAA8D;IAC9D,OAAO,CAAC,SAAS;IAOjB,0FAA0F;IAC1F,OAAO,CAAC,gBAAgB;IAyBxB;;;;;OAKG;IACH,OAAO,CAAC,aAAa;IAerB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAEvC;IAED,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAExC;IAED,sDAAsD;IACtD,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAEpC;IAED,gDAAgD;IAChD,KAAK,IAAI,IAAI,CAIZ;IAED,wEAAwE;IACxE,SAAS,IAAI,IAAI,CAEhB;CACD"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { FOV } from 'rot-js';
|
|
2
|
+
import { hexRange, hexLine } from '../core/Hex.js';
|
|
3
|
+
import { chebyshevDistance, traceLine } from './Targeting.js';
|
|
4
|
+
export class FieldOfView {
|
|
5
|
+
constructor(level) {
|
|
6
|
+
/** cells currently in view */
|
|
7
|
+
this.visible = new Set();
|
|
8
|
+
/** cells ever seen, which is what gets drawn dim */
|
|
9
|
+
this.explored = new Set();
|
|
10
|
+
/** how bright each visible cell is, 0 to 1, by cell index */
|
|
11
|
+
this.light = new Map();
|
|
12
|
+
this.level = level;
|
|
13
|
+
this.fov = level.shape === 'hex' ? null : new FOV.PreciseShadowcasting((x, y) => level.transparent(x, y));
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Recomputes what is visible from a point.
|
|
17
|
+
*
|
|
18
|
+
* @param radius how far light reaches, in cells
|
|
19
|
+
* @param sight when given, sight is height-aware: every cell in range is
|
|
20
|
+
* tested along the straight line to it, blocked by opaque terrain or by a
|
|
21
|
+
* cell rising above viewer and target alike. That is line-of-sight per cell
|
|
22
|
+
* rather than shadowcasting, so its edges deliberately disagree with the
|
|
23
|
+
* flat computation in the same way targeting already does - rot.js's
|
|
24
|
+
* callback only ever sees the blocking cell, never the target, so the
|
|
25
|
+
* viewer-relative rule cannot live inside it.
|
|
26
|
+
*/
|
|
27
|
+
update(x, y, radius, sight) {
|
|
28
|
+
this.visible.clear();
|
|
29
|
+
this.light.clear();
|
|
30
|
+
if (sight) {
|
|
31
|
+
this.updateFromHeight(x, y, radius, sight);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
if (this.fov) {
|
|
35
|
+
this.fov.compute(x, y, radius, (cx, cy, _r, visibility) => {
|
|
36
|
+
if (!this.level.inside(cx, cy))
|
|
37
|
+
return;
|
|
38
|
+
const cell = this.level.index(cx, cy);
|
|
39
|
+
this.visible.add(cell);
|
|
40
|
+
this.explored.add(cell);
|
|
41
|
+
this.light.set(cell, visibility);
|
|
42
|
+
});
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const center = { x, y };
|
|
46
|
+
for (const target of hexRange(center, radius)) {
|
|
47
|
+
if (!this.level.inside(target.x, target.y))
|
|
48
|
+
continue;
|
|
49
|
+
const line = hexLine(center, target);
|
|
50
|
+
//every cell between the two ends must be transparent; the two ends themselves
|
|
51
|
+
//need not be, the same rule `hasLineOfSight` uses for a square grid
|
|
52
|
+
const blocked = line
|
|
53
|
+
.slice(1, -1)
|
|
54
|
+
.some((cell) => !this.level.inside(cell.x, cell.y) || !this.level.transparent(cell.x, cell.y));
|
|
55
|
+
if (blocked)
|
|
56
|
+
continue;
|
|
57
|
+
this.lightCell(target.x, target.y, line.length - 1, radius);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/** lights one visible cell with the usual distance falloff */
|
|
61
|
+
lightCell(x, y, distance, radius) {
|
|
62
|
+
const cell = this.level.index(x, y);
|
|
63
|
+
this.visible.add(cell);
|
|
64
|
+
this.explored.add(cell);
|
|
65
|
+
this.light.set(cell, radius === 0 ? 1 : Math.max(0, 1 - distance / (radius + 1)));
|
|
66
|
+
}
|
|
67
|
+
/** height-aware sight for both shapes: one straight line per cell, one rule for cliffs */
|
|
68
|
+
updateFromHeight(x, y, radius, sight) {
|
|
69
|
+
const viewer = sight.height ?? sight.heights.heightAt(x, y);
|
|
70
|
+
const center = { x, y };
|
|
71
|
+
if (this.level.shape === 'hex') {
|
|
72
|
+
for (const target of hexRange(center, radius)) {
|
|
73
|
+
if (!this.level.inside(target.x, target.y))
|
|
74
|
+
continue;
|
|
75
|
+
const line = hexLine(center, target);
|
|
76
|
+
if (this.heightBlocked(line, sight.heights, viewer, sight.heights.heightAt(target.x, target.y)))
|
|
77
|
+
continue;
|
|
78
|
+
this.lightCell(target.x, target.y, line.length - 1, radius);
|
|
79
|
+
}
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
for (let ty = y - radius; ty <= y + radius; ty++) {
|
|
83
|
+
for (let tx = x - radius; tx <= x + radius; tx++) {
|
|
84
|
+
if (!this.level.inside(tx, ty))
|
|
85
|
+
continue;
|
|
86
|
+
if (chebyshevDistance(center, { x: tx, y: ty }) > radius)
|
|
87
|
+
continue;
|
|
88
|
+
const line = traceLine(center, { x: tx, y: ty });
|
|
89
|
+
if (this.heightBlocked(line, sight.heights, viewer, sight.heights.heightAt(tx, ty)))
|
|
90
|
+
continue;
|
|
91
|
+
this.lightCell(tx, ty, line.length - 1, radius);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Whether anything between the line's ends blocks a gaze from `viewer` height
|
|
97
|
+
* to `target` height: opaque terrain always does, and so does a cell rising
|
|
98
|
+
* above them both. Heights only ever add blocking - a wall still reads as a
|
|
99
|
+
* wall from above.
|
|
100
|
+
*/
|
|
101
|
+
heightBlocked(line, heights, viewer, target) {
|
|
102
|
+
const top = Math.max(viewer, target);
|
|
103
|
+
for (let i = 1; i < line.length - 1; i++) {
|
|
104
|
+
const cell = line[i];
|
|
105
|
+
if (!this.level.inside(cell.x, cell.y) || !this.level.transparent(cell.x, cell.y))
|
|
106
|
+
return true;
|
|
107
|
+
if (heights.heightAt(cell.x, cell.y) > top)
|
|
108
|
+
return true;
|
|
109
|
+
}
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
isVisible(x, y) {
|
|
113
|
+
return this.visible.has(this.level.index(x, y));
|
|
114
|
+
}
|
|
115
|
+
isExplored(x, y) {
|
|
116
|
+
return this.explored.has(this.level.index(x, y));
|
|
117
|
+
}
|
|
118
|
+
/** how lit a cell is right now, 0 when out of view */
|
|
119
|
+
lightAt(x, y) {
|
|
120
|
+
return this.light.get(this.level.index(x, y)) ?? 0;
|
|
121
|
+
}
|
|
122
|
+
/** forgets everything, as a new floor should */
|
|
123
|
+
reset() {
|
|
124
|
+
this.visible.clear();
|
|
125
|
+
this.explored.clear();
|
|
126
|
+
this.light.clear();
|
|
127
|
+
}
|
|
128
|
+
/** reveals the whole map, for a magic mapping effect or a debug view */
|
|
129
|
+
revealAll() {
|
|
130
|
+
for (let i = 0; i < this.level.cellCount; i++)
|
|
131
|
+
this.explored.add(i);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=FieldOfView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FieldOfView.js","sourceRoot":"","sources":["../../src/roguelike/FieldOfView.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The map a roguelike reasons about.
|
|
3
|
+
*
|
|
4
|
+
* Deliberately separate from `TileMap`, which is how a map is *drawn*. This one holds what
|
|
5
|
+
* the algorithms need — can something walk here, can light pass — and nothing about
|
|
6
|
+
* appearance. A game maps its own terrain kinds onto these two flags, so it can invent
|
|
7
|
+
* whatever terrain it likes without the framework knowing about lava or bookshelves.
|
|
8
|
+
*/
|
|
9
|
+
/** the grid a `Level` reasons over - a parameter, not a forked class, per the roadmap */
|
|
10
|
+
export type LevelShape = 'square' | 'hex';
|
|
11
|
+
/** the four or eight cell offsets around a point, shared by every square-grid algorithm here */
|
|
12
|
+
export declare function neighbourOffsets(topology: 4 | 8): ReadonlyArray<readonly [number, number]>;
|
|
13
|
+
export interface TerrainKind {
|
|
14
|
+
/** can a creature walk onto it */
|
|
15
|
+
passable: boolean;
|
|
16
|
+
/** can something be seen through it */
|
|
17
|
+
transparent: boolean;
|
|
18
|
+
}
|
|
19
|
+
/** the two that every map needs; a game adds its own alongside */
|
|
20
|
+
export declare const WALL: TerrainKind;
|
|
21
|
+
export declare const FLOOR: TerrainKind;
|
|
22
|
+
export interface Rect {
|
|
23
|
+
left: number;
|
|
24
|
+
top: number;
|
|
25
|
+
right: number;
|
|
26
|
+
bottom: number;
|
|
27
|
+
}
|
|
28
|
+
export declare class Level {
|
|
29
|
+
readonly width: number;
|
|
30
|
+
readonly height: number;
|
|
31
|
+
readonly shape: LevelShape;
|
|
32
|
+
/** terrain id per cell, indexing into `kinds` */
|
|
33
|
+
readonly terrain: Uint8Array;
|
|
34
|
+
private kinds;
|
|
35
|
+
/** rooms the generator carved, for placing stairs, monsters and treasure */
|
|
36
|
+
rooms: Rect[];
|
|
37
|
+
constructor(width: number, height: number, kinds: TerrainKind[], fill?: number, shape?: LevelShape);
|
|
38
|
+
get cellCount(): number;
|
|
39
|
+
index(x: number, y: number): number;
|
|
40
|
+
xOf(cell: number): number;
|
|
41
|
+
yOf(cell: number): number;
|
|
42
|
+
inside(x: number, y: number): boolean;
|
|
43
|
+
/**
|
|
44
|
+
* The cells adjacent to `(x, y)` - six of them on a hex `Level`, four or eight on a
|
|
45
|
+
* square one, regardless of which. This is the seam that lets `Pathfinder` and
|
|
46
|
+
* `FieldOfView` work over either shape unchanged: they walk neighbours, and only this
|
|
47
|
+
* method knows what a neighbour is.
|
|
48
|
+
*
|
|
49
|
+
* @param topology ignored on a hex `Level` - it only has the one neighbourhood shape
|
|
50
|
+
*/
|
|
51
|
+
neighbors(x: number, y: number, topology?: 4 | 8): Array<{
|
|
52
|
+
x: number;
|
|
53
|
+
y: number;
|
|
54
|
+
}>;
|
|
55
|
+
/**
|
|
56
|
+
* True only for cells with a full ring of neighbours.
|
|
57
|
+
*
|
|
58
|
+
* Anything that inspects a cell's surroundings should use this rather than `inside`,
|
|
59
|
+
* because a cell on the very edge has no neighbour on one side and every such check
|
|
60
|
+
* then needs its own bounds test. Generators keep the border solid for the same reason.
|
|
61
|
+
*/
|
|
62
|
+
insideWithBorder(x: number, y: number): boolean;
|
|
63
|
+
get(x: number, y: number): number;
|
|
64
|
+
set(x: number, y: number, kind: number): void;
|
|
65
|
+
kindAt(x: number, y: number): TerrainKind;
|
|
66
|
+
passable(x: number, y: number): boolean;
|
|
67
|
+
transparent(x: number, y: number): boolean;
|
|
68
|
+
fillRect(rect: Rect, kind: number): void;
|
|
69
|
+
/** every passable cell, as indices — the pool to place things in */
|
|
70
|
+
passableCells(): number[];
|
|
71
|
+
toJSON(): {
|
|
72
|
+
width: number;
|
|
73
|
+
height: number;
|
|
74
|
+
shape: LevelShape;
|
|
75
|
+
terrain: number[];
|
|
76
|
+
rooms: Rect[];
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* Rebuilds a level from save data - the `kinds` table is supplied fresh (it holds a
|
|
80
|
+
* game's own terrain meanings, the same way `QuestLog` takes its definitions fresh),
|
|
81
|
+
* so only the terrain ids and rooms are ever save data.
|
|
82
|
+
*/
|
|
83
|
+
static fromJSON(kinds: TerrainKind[], data: {
|
|
84
|
+
width: number;
|
|
85
|
+
height: number;
|
|
86
|
+
shape: LevelShape;
|
|
87
|
+
terrain: number[];
|
|
88
|
+
rooms: Rect[];
|
|
89
|
+
}): Level;
|
|
90
|
+
}
|
|
91
|
+
export declare function rectCenter(rect: Rect): {
|
|
92
|
+
x: number;
|
|
93
|
+
y: number;
|
|
94
|
+
};
|
|
95
|
+
export declare function rectsOverlap(a: Rect, b: Rect, margin?: number): boolean;
|
|
96
|
+
//# sourceMappingURL=Level.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Level.d.ts","sourceRoot":"","sources":["../../src/roguelike/Level.ts"],"names":[],"mappings":"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"}
|