@datamoc/mw_games 0.4.0 → 0.4.2
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 +2 -2
- package/dist/actors/Advancement.d.ts +17 -0
- package/dist/actors/Advancement.d.ts.map +1 -1
- package/dist/actors/Advancement.js +17 -0
- package/dist/actors/Advancement.js.map +1 -1
- package/dist/actors/Affix.d.ts +20 -0
- package/dist/actors/Affix.d.ts.map +1 -1
- package/dist/actors/Affix.js.map +1 -1
- package/dist/actors/Appearances.d.ts +12 -0
- package/dist/actors/Appearances.d.ts.map +1 -1
- package/dist/actors/Appearances.js +12 -0
- package/dist/actors/Appearances.js.map +1 -1
- package/dist/actors/Aura.d.ts +16 -0
- package/dist/actors/Aura.d.ts.map +1 -1
- package/dist/actors/Aura.js +16 -0
- package/dist/actors/Aura.js.map +1 -1
- package/dist/actors/Barrier.d.ts +13 -0
- package/dist/actors/Barrier.d.ts.map +1 -1
- package/dist/actors/Barrier.js.map +1 -1
- package/dist/actors/Charges.d.ts +13 -0
- package/dist/actors/Charges.d.ts.map +1 -1
- package/dist/actors/Charges.js.map +1 -1
- package/dist/actors/Equipment.d.ts +18 -0
- package/dist/actors/Equipment.d.ts.map +1 -1
- package/dist/actors/Equipment.js +18 -0
- package/dist/actors/Equipment.js.map +1 -1
- package/dist/actors/Inventory.d.ts +12 -0
- package/dist/actors/Inventory.d.ts.map +1 -1
- package/dist/actors/Inventory.js +12 -0
- package/dist/actors/Inventory.js.map +1 -1
- package/dist/actors/ItemState.d.ts +13 -0
- package/dist/actors/ItemState.d.ts.map +1 -1
- package/dist/actors/ItemState.js +13 -0
- package/dist/actors/ItemState.js.map +1 -1
- package/dist/actors/ItemStatusEffect.d.ts +13 -0
- package/dist/actors/ItemStatusEffect.d.ts.map +1 -1
- package/dist/actors/ItemStatusEffect.js +13 -0
- package/dist/actors/ItemStatusEffect.js.map +1 -1
- package/dist/actors/Loot.d.ts +15 -1
- package/dist/actors/Loot.d.ts.map +1 -1
- package/dist/actors/Loot.js +15 -1
- package/dist/actors/Loot.js.map +1 -1
- package/dist/actors/Progression.d.ts +14 -1
- package/dist/actors/Progression.d.ts.map +1 -1
- package/dist/actors/Progression.js +14 -1
- package/dist/actors/Progression.js.map +1 -1
- package/dist/actors/Resource.d.ts +14 -0
- package/dist/actors/Resource.d.ts.map +1 -1
- package/dist/actors/Resource.js.map +1 -1
- package/dist/actors/Scaling.d.ts +8 -0
- package/dist/actors/Scaling.d.ts.map +1 -1
- package/dist/actors/Scaling.js.map +1 -1
- package/dist/actors/Shop.d.ts +15 -0
- package/dist/actors/Shop.d.ts.map +1 -1
- package/dist/actors/Shop.js.map +1 -1
- package/dist/actors/SkillPoints.d.ts +13 -0
- package/dist/actors/SkillPoints.d.ts.map +1 -1
- package/dist/actors/SkillPoints.js +13 -0
- package/dist/actors/SkillPoints.js.map +1 -1
- package/dist/actors/StatusEffect.d.ts +18 -0
- package/dist/actors/StatusEffect.d.ts.map +1 -1
- package/dist/actors/StatusEffect.js +18 -0
- package/dist/actors/StatusEffect.js.map +1 -1
- package/dist/actors/Support.d.ts +11 -0
- package/dist/actors/Support.d.ts.map +1 -1
- package/dist/actors/Support.js +11 -0
- package/dist/actors/Support.js.map +1 -1
- package/dist/actors/Traits.d.ts +14 -0
- package/dist/actors/Traits.d.ts.map +1 -1
- package/dist/actors/Traits.js +14 -0
- package/dist/actors/Traits.js.map +1 -1
- package/dist/actors/craft.d.ts +16 -0
- package/dist/actors/craft.d.ts.map +1 -1
- package/dist/actors/craft.js +16 -0
- package/dist/actors/craft.js.map +1 -1
- package/dist/actors/skillCheck.d.ts +8 -0
- package/dist/actors/skillCheck.d.ts.map +1 -1
- package/dist/actors/skillCheck.js +8 -0
- package/dist/actors/skillCheck.js.map +1 -1
- package/dist/assets/ByteProgress.d.ts +10 -0
- package/dist/assets/ByteProgress.d.ts.map +1 -1
- package/dist/assets/ByteProgress.js +10 -0
- package/dist/assets/ByteProgress.js.map +1 -1
- package/dist/assets/Streaming.d.ts +10 -0
- package/dist/assets/Streaming.d.ts.map +1 -1
- package/dist/assets/Streaming.js +10 -0
- package/dist/assets/Streaming.js.map +1 -1
- package/dist/assets/binary.d.ts +52 -0
- package/dist/assets/binary.d.ts.map +1 -0
- package/dist/assets/binary.js +57 -0
- package/dist/assets/binary.js.map +1 -0
- package/dist/assets/index.d.ts +10 -5
- package/dist/assets/index.d.ts.map +1 -1
- package/dist/assets/index.js +9 -5
- package/dist/assets/index.js.map +1 -1
- package/dist/assets/loader.d.ts +11 -0
- package/dist/assets/loader.d.ts.map +1 -1
- package/dist/assets/loader.js +11 -0
- package/dist/assets/loader.js.map +1 -1
- package/dist/assets/paths.d.ts +10 -0
- package/dist/assets/paths.d.ts.map +1 -1
- package/dist/assets/paths.js +10 -0
- package/dist/assets/paths.js.map +1 -1
- package/dist/audio/Captions.d.ts +13 -1
- package/dist/audio/Captions.d.ts.map +1 -1
- package/dist/audio/Captions.js +13 -1
- package/dist/audio/Captions.js.map +1 -1
- package/dist/audio/Midi.d.ts +19 -1
- package/dist/audio/Midi.d.ts.map +1 -1
- package/dist/audio/Midi.js +19 -1
- package/dist/audio/Midi.js.map +1 -1
- package/dist/audio/Music.d.ts +11 -0
- package/dist/audio/Music.d.ts.map +1 -1
- package/dist/audio/Music.js +11 -0
- package/dist/audio/Music.js.map +1 -1
- package/dist/audio/Orchestrator.d.ts +14 -0
- package/dist/audio/Orchestrator.d.ts.map +1 -1
- package/dist/audio/Orchestrator.js +14 -0
- package/dist/audio/Orchestrator.js.map +1 -1
- package/dist/audio/Playable.d.ts +11 -1
- package/dist/audio/Playable.d.ts.map +1 -1
- package/dist/audio/Playable.js +11 -1
- package/dist/audio/Playable.js.map +1 -1
- package/dist/audio/Sound.d.ts +8 -0
- package/dist/audio/Sound.d.ts.map +1 -1
- package/dist/audio/Sound.js +8 -0
- package/dist/audio/Sound.js.map +1 -1
- package/dist/audio/Synth.d.ts +15 -0
- package/dist/audio/Synth.d.ts.map +1 -1
- package/dist/audio/Synth.js +15 -0
- package/dist/audio/Synth.js.map +1 -1
- package/dist/battle/BattleAI.d.ts +18 -2
- package/dist/battle/BattleAI.d.ts.map +1 -1
- package/dist/battle/BattleAI.js +18 -2
- package/dist/battle/BattleAI.js.map +1 -1
- package/dist/battle/Evolution.d.ts +12 -0
- package/dist/battle/Evolution.d.ts.map +1 -1
- package/dist/battle/Evolution.js +12 -0
- package/dist/battle/Evolution.js.map +1 -1
- package/dist/battle/Field.d.ts +11 -0
- package/dist/battle/Field.d.ts.map +1 -1
- package/dist/battle/Field.js.map +1 -1
- package/dist/battle/Hooks.d.ts +16 -0
- package/dist/battle/Hooks.d.ts.map +1 -1
- package/dist/battle/Hooks.js +16 -0
- package/dist/battle/Hooks.js.map +1 -1
- package/dist/battle/Move.d.ts +13 -0
- package/dist/battle/Move.d.ts.map +1 -1
- package/dist/battle/Move.js +13 -0
- package/dist/battle/Move.js.map +1 -1
- package/dist/battle/Party.d.ts +11 -0
- package/dist/battle/Party.d.ts.map +1 -1
- package/dist/battle/Party.js +11 -0
- package/dist/battle/Party.js.map +1 -1
- package/dist/battle/Species.d.ts +10 -0
- package/dist/battle/Species.d.ts.map +1 -1
- package/dist/battle/Species.js +10 -0
- package/dist/battle/Species.js.map +1 -1
- package/dist/battle/StatStages.d.ts +14 -0
- package/dist/battle/StatStages.d.ts.map +1 -1
- package/dist/battle/StatStages.js.map +1 -1
- package/dist/battle/TypeMatrix.d.ts +11 -0
- package/dist/battle/TypeMatrix.d.ts.map +1 -1
- package/dist/battle/TypeMatrix.js +11 -0
- package/dist/battle/TypeMatrix.js.map +1 -1
- package/dist/board/Army.d.ts +75 -0
- package/dist/board/Army.d.ts.map +1 -1
- package/dist/board/Army.js +75 -0
- package/dist/board/Army.js.map +1 -1
- package/dist/board/Classics.d.ts +297 -1
- package/dist/board/Classics.d.ts.map +1 -1
- package/dist/board/Classics.js +297 -1
- package/dist/board/Classics.js.map +1 -1
- package/dist/board/Engine.d.ts +23 -0
- package/dist/board/Engine.d.ts.map +1 -1
- package/dist/board/Engine.js +23 -0
- package/dist/board/Engine.js.map +1 -1
- package/dist/board/FogOfWar.d.ts +20 -0
- package/dist/board/FogOfWar.d.ts.map +1 -1
- package/dist/board/FogOfWar.js +20 -0
- package/dist/board/FogOfWar.js.map +1 -1
- package/dist/board/Tactics.d.ts +158 -1
- package/dist/board/Tactics.d.ts.map +1 -1
- package/dist/board/Tactics.js +125 -1
- package/dist/board/Tactics.js.map +1 -1
- package/dist/board/chess.d.ts +87 -3
- package/dist/board/chess.d.ts.map +1 -1
- package/dist/board/chess.js +96 -4
- package/dist/board/chess.js.map +1 -1
- package/dist/core/Achievements.d.ts +15 -0
- package/dist/core/Achievements.d.ts.map +1 -1
- package/dist/core/Achievements.js +15 -0
- package/dist/core/Achievements.js.map +1 -1
- package/dist/core/Collection.d.ts +12 -0
- package/dist/core/Collection.d.ts.map +1 -1
- package/dist/core/Collection.js +12 -0
- package/dist/core/Collection.js.map +1 -1
- package/dist/core/Entity.d.ts +42 -0
- package/dist/core/Entity.d.ts.map +1 -0
- package/dist/core/Entity.js +47 -0
- package/dist/core/Entity.js.map +1 -0
- package/dist/core/Feedback.d.ts +11 -1
- package/dist/core/Feedback.d.ts.map +1 -1
- package/dist/core/Feedback.js +11 -1
- package/dist/core/Feedback.js.map +1 -1
- package/dist/core/Hex.d.ts +14 -0
- package/dist/core/Hex.d.ts.map +1 -1
- package/dist/core/Hex.js +14 -0
- package/dist/core/Hex.js.map +1 -1
- package/dist/core/Hooks.d.ts +14 -0
- package/dist/core/Hooks.d.ts.map +1 -1
- package/dist/core/Hooks.js.map +1 -1
- package/dist/core/Input.d.ts +12 -0
- package/dist/core/Input.d.ts.map +1 -1
- package/dist/core/Input.js.map +1 -1
- package/dist/core/Loading.d.ts +17 -0
- package/dist/core/Loading.d.ts.map +1 -1
- package/dist/core/Loading.js +17 -0
- package/dist/core/Loading.js.map +1 -1
- package/dist/core/Log.d.ts +9 -0
- package/dist/core/Log.d.ts.map +1 -1
- package/dist/core/Log.js +9 -0
- package/dist/core/Log.js.map +1 -1
- package/dist/core/Multiplayer.d.ts +12 -0
- package/dist/core/Multiplayer.d.ts.map +1 -1
- package/dist/core/Multiplayer.js +12 -0
- package/dist/core/Multiplayer.js.map +1 -1
- package/dist/core/News.d.ts +12 -0
- package/dist/core/News.d.ts.map +1 -1
- package/dist/core/News.js.map +1 -1
- package/dist/core/PlayerInput.d.ts +14 -0
- package/dist/core/PlayerInput.d.ts.map +1 -1
- package/dist/core/PlayerInput.js +14 -0
- package/dist/core/PlayerInput.js.map +1 -1
- package/dist/core/Presentation.d.ts +56 -0
- package/dist/core/Presentation.d.ts.map +1 -0
- package/dist/core/Presentation.js +78 -0
- package/dist/core/Presentation.js.map +1 -0
- package/dist/core/Random.d.ts +24 -0
- package/dist/core/Random.d.ts.map +1 -1
- package/dist/core/Random.js +24 -0
- package/dist/core/Random.js.map +1 -1
- package/dist/core/Replay.d.ts +31 -0
- package/dist/core/Replay.d.ts.map +1 -1
- package/dist/core/Replay.js +31 -0
- package/dist/core/Replay.js.map +1 -1
- package/dist/core/RunHistory.d.ts +12 -0
- package/dist/core/RunHistory.d.ts.map +1 -1
- package/dist/core/RunHistory.js.map +1 -1
- package/dist/core/Sanitize.d.ts +18 -0
- package/dist/core/Sanitize.d.ts.map +1 -1
- package/dist/core/Sanitize.js +18 -0
- package/dist/core/Sanitize.js.map +1 -1
- package/dist/core/Save.d.ts.map +1 -1
- package/dist/core/Save.js +13 -0
- package/dist/core/Save.js.map +1 -1
- package/dist/core/SaveSync.d.ts +14 -0
- package/dist/core/SaveSync.d.ts.map +1 -1
- package/dist/core/SaveSync.js.map +1 -1
- package/dist/core/Scene.d.ts +13 -0
- package/dist/core/Scene.d.ts.map +1 -1
- package/dist/core/Scene.js +13 -0
- package/dist/core/Scene.js.map +1 -1
- package/dist/core/SceneStack.d.ts +20 -0
- package/dist/core/SceneStack.d.ts.map +1 -1
- package/dist/core/SceneStack.js +20 -0
- package/dist/core/SceneStack.js.map +1 -1
- package/dist/core/Scramble.d.ts +8 -0
- package/dist/core/Scramble.d.ts.map +1 -1
- package/dist/core/Scramble.js +8 -0
- package/dist/core/Scramble.js.map +1 -1
- package/dist/core/Session.d.ts +10 -0
- package/dist/core/Session.d.ts.map +1 -1
- package/dist/core/Session.js.map +1 -1
- package/dist/core/Signal.d.ts +11 -0
- package/dist/core/Signal.d.ts.map +1 -1
- package/dist/core/Signal.js.map +1 -1
- package/dist/core/Spawner.d.ts +17 -0
- package/dist/core/Spawner.d.ts.map +1 -1
- package/dist/core/Spawner.js +17 -0
- package/dist/core/Spawner.js.map +1 -1
- package/dist/core/Stats.d.ts +14 -0
- package/dist/core/Stats.d.ts.map +1 -1
- package/dist/core/Stats.js +14 -0
- package/dist/core/Stats.js.map +1 -1
- package/dist/core/Telemetry.d.ts +11 -0
- package/dist/core/Telemetry.d.ts.map +1 -1
- package/dist/core/Telemetry.js +11 -0
- package/dist/core/Telemetry.js.map +1 -1
- package/dist/core/Tween.d.ts +16 -1
- package/dist/core/Tween.d.ts.map +1 -1
- package/dist/core/Tween.js +16 -1
- package/dist/core/Tween.js.map +1 -1
- package/dist/core/UndoHistory.d.ts +15 -0
- package/dist/core/UndoHistory.d.ts.map +1 -1
- package/dist/core/UndoHistory.js.map +1 -1
- package/dist/core/index.d.ts +4 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +2 -0
- package/dist/core/index.js.map +1 -1
- package/dist/i18n/Content.d.ts +151 -0
- package/dist/i18n/Content.d.ts.map +1 -0
- package/dist/i18n/Content.js +219 -0
- package/dist/i18n/Content.js.map +1 -0
- package/dist/i18n/Format.d.ts +25 -0
- package/dist/i18n/Format.d.ts.map +1 -0
- package/dist/i18n/Format.js +32 -0
- package/dist/i18n/Format.js.map +1 -0
- package/dist/i18n/SemanticMessage.d.ts +71 -0
- package/dist/i18n/SemanticMessage.d.ts.map +1 -0
- package/dist/i18n/SemanticMessage.js +40 -0
- package/dist/i18n/SemanticMessage.js.map +1 -0
- package/dist/i18n/Validate.d.ts +56 -0
- package/dist/i18n/Validate.d.ts.map +1 -0
- package/dist/i18n/Validate.js +65 -0
- package/dist/i18n/Validate.js.map +1 -0
- package/dist/i18n/index.d.ts +74 -3
- package/dist/i18n/index.d.ts.map +1 -1
- package/dist/i18n/index.js +136 -7
- package/dist/i18n/index.js.map +1 -1
- package/dist/mw_games.global.js +153 -88
- package/dist/roguelike/Blob.d.ts +11 -0
- package/dist/roguelike/Blob.d.ts.map +1 -1
- package/dist/roguelike/Blob.js +11 -0
- package/dist/roguelike/Blob.js.map +1 -1
- package/dist/roguelike/Boss.d.ts +12 -0
- package/dist/roguelike/Boss.d.ts.map +1 -1
- package/dist/roguelike/Boss.js +12 -0
- package/dist/roguelike/Boss.js.map +1 -1
- package/dist/roguelike/Combat.d.ts +13 -0
- package/dist/roguelike/Combat.d.ts.map +1 -1
- package/dist/roguelike/Combat.js +13 -0
- package/dist/roguelike/Combat.js.map +1 -1
- package/dist/roguelike/ContentRoll.d.ts +10 -0
- package/dist/roguelike/ContentRoll.d.ts.map +1 -1
- package/dist/roguelike/ContentRoll.js +10 -0
- package/dist/roguelike/ContentRoll.js.map +1 -1
- package/dist/roguelike/Doors.d.ts +13 -0
- package/dist/roguelike/Doors.d.ts.map +1 -1
- package/dist/roguelike/Doors.js +13 -0
- package/dist/roguelike/Doors.js.map +1 -1
- package/dist/roguelike/DungeonParity.d.ts +15 -0
- package/dist/roguelike/DungeonParity.d.ts.map +1 -1
- package/dist/roguelike/DungeonParity.js +15 -0
- package/dist/roguelike/DungeonParity.js.map +1 -1
- package/dist/roguelike/Elevation.d.ts +15 -0
- package/dist/roguelike/Elevation.d.ts.map +1 -1
- package/dist/roguelike/Elevation.js +15 -0
- package/dist/roguelike/Elevation.js.map +1 -1
- package/dist/roguelike/Features.d.ts +17 -0
- package/dist/roguelike/Features.d.ts.map +1 -1
- package/dist/roguelike/Features.js +17 -0
- package/dist/roguelike/Features.js.map +1 -1
- package/dist/roguelike/FieldOfView.d.ts +13 -0
- package/dist/roguelike/FieldOfView.d.ts.map +1 -1
- package/dist/roguelike/FieldOfView.js +13 -0
- package/dist/roguelike/FieldOfView.js.map +1 -1
- package/dist/roguelike/Level.d.ts +26 -1
- package/dist/roguelike/Level.d.ts.map +1 -1
- package/dist/roguelike/Level.js +26 -1
- package/dist/roguelike/Level.js.map +1 -1
- package/dist/roguelike/MonsterAI.d.ts +14 -0
- package/dist/roguelike/MonsterAI.d.ts.map +1 -1
- package/dist/roguelike/MonsterAI.js +14 -0
- package/dist/roguelike/MonsterAI.js.map +1 -1
- package/dist/roguelike/MultiStageAbility.d.ts +16 -0
- package/dist/roguelike/MultiStageAbility.d.ts.map +1 -1
- package/dist/roguelike/MultiStageAbility.js +16 -0
- package/dist/roguelike/MultiStageAbility.js.map +1 -1
- package/dist/roguelike/Pathfinder.d.ts +23 -2
- package/dist/roguelike/Pathfinder.d.ts.map +1 -1
- package/dist/roguelike/Pathfinder.js +23 -2
- package/dist/roguelike/Pathfinder.js.map +1 -1
- package/dist/roguelike/Placement.d.ts +62 -0
- package/dist/roguelike/Placement.d.ts.map +1 -0
- package/dist/roguelike/Placement.js +79 -0
- package/dist/roguelike/Placement.js.map +1 -0
- package/dist/roguelike/RoomBuilders.d.ts +18 -1
- package/dist/roguelike/RoomBuilders.d.ts.map +1 -1
- package/dist/roguelike/RoomBuilders.js +18 -1
- package/dist/roguelike/RoomBuilders.js.map +1 -1
- package/dist/roguelike/Scheduler.d.ts +48 -1
- package/dist/roguelike/Scheduler.d.ts.map +1 -1
- package/dist/roguelike/Scheduler.js +58 -1
- package/dist/roguelike/Scheduler.js.map +1 -1
- package/dist/roguelike/Secrets.d.ts +13 -0
- package/dist/roguelike/Secrets.d.ts.map +1 -1
- package/dist/roguelike/Secrets.js +13 -0
- package/dist/roguelike/Secrets.js.map +1 -1
- package/dist/roguelike/Stealth.d.ts +13 -0
- package/dist/roguelike/Stealth.d.ts.map +1 -1
- package/dist/roguelike/Stealth.js +13 -0
- package/dist/roguelike/Stealth.js.map +1 -1
- package/dist/roguelike/Targeting.d.ts +45 -1
- package/dist/roguelike/Targeting.d.ts.map +1 -1
- package/dist/roguelike/Targeting.js +33 -1
- package/dist/roguelike/Targeting.js.map +1 -1
- package/dist/roguelike/TriggerTracker.d.ts +10 -0
- package/dist/roguelike/TriggerTracker.d.ts.map +1 -1
- package/dist/roguelike/TriggerTracker.js +10 -0
- package/dist/roguelike/TriggerTracker.js.map +1 -1
- package/dist/roguelike/generate.d.ts +41 -1
- package/dist/roguelike/generate.d.ts.map +1 -1
- package/dist/roguelike/generate.js +41 -1
- package/dist/roguelike/generate.js.map +1 -1
- package/dist/roguelike/index.d.ts +3 -1
- package/dist/roguelike/index.d.ts.map +1 -1
- package/dist/roguelike/index.js +1 -0
- package/dist/roguelike/index.js.map +1 -1
- package/dist/rpg/Collision.d.ts +19 -0
- package/dist/rpg/Collision.d.ts.map +1 -1
- package/dist/rpg/Collision.js +19 -0
- package/dist/rpg/Collision.js.map +1 -1
- package/dist/rpg/Event.d.ts +17 -0
- package/dist/rpg/Event.d.ts.map +1 -1
- package/dist/rpg/Event.js +17 -0
- package/dist/rpg/Event.js.map +1 -1
- package/dist/rpg/EventRunner.d.ts +14 -0
- package/dist/rpg/EventRunner.d.ts.map +1 -1
- package/dist/rpg/EventRunner.js +14 -0
- package/dist/rpg/EventRunner.js.map +1 -1
- package/dist/rpg/FreeMover.d.ts +14 -0
- package/dist/rpg/FreeMover.d.ts.map +1 -1
- package/dist/rpg/FreeMover.js +14 -0
- package/dist/rpg/FreeMover.js.map +1 -1
- package/dist/rpg/GameState.d.ts +14 -0
- package/dist/rpg/GameState.d.ts.map +1 -1
- package/dist/rpg/GameState.js +14 -0
- package/dist/rpg/GameState.js.map +1 -1
- package/dist/rpg/GridMover.d.ts +14 -0
- package/dist/rpg/GridMover.d.ts.map +1 -1
- package/dist/rpg/GridMover.js +14 -0
- package/dist/rpg/GridMover.js.map +1 -1
- package/dist/rpg/Marshal.d.ts +16 -0
- package/dist/rpg/Marshal.d.ts.map +1 -1
- package/dist/rpg/Marshal.js +16 -0
- package/dist/rpg/Marshal.js.map +1 -1
- package/dist/rpg/Quest.d.ts +15 -0
- package/dist/rpg/Quest.d.ts.map +1 -1
- package/dist/rpg/Quest.js +15 -0
- package/dist/rpg/Quest.js.map +1 -1
- package/dist/rpg/automap.d.ts +15 -0
- package/dist/rpg/automap.d.ts.map +1 -1
- package/dist/rpg/automap.js +15 -0
- package/dist/rpg/automap.js.map +1 -1
- package/dist/simulation/Runtime.d.ts +98 -0
- package/dist/simulation/Runtime.d.ts.map +1 -0
- package/dist/simulation/Runtime.js +91 -0
- package/dist/simulation/Runtime.js.map +1 -0
- package/dist/simulation/Scenario.d.ts +15 -0
- package/dist/simulation/Scenario.d.ts.map +1 -1
- package/dist/simulation/Scenario.js +15 -0
- package/dist/simulation/Scenario.js.map +1 -1
- package/dist/simulation/Turns.d.ts +11 -0
- package/dist/simulation/Turns.d.ts.map +1 -1
- package/dist/simulation/Turns.js +11 -0
- package/dist/simulation/Turns.js.map +1 -1
- package/dist/simulation/index.d.ts +10 -0
- package/dist/simulation/index.d.ts.map +1 -1
- package/dist/simulation/index.js +8 -0
- package/dist/simulation/index.js.map +1 -1
- package/dist/three-d/Models.d.ts +38 -1
- package/dist/three-d/Models.d.ts.map +1 -1
- package/dist/three-d/Models.js +66 -3
- package/dist/three-d/Models.js.map +1 -1
- package/dist/two-d/Game.d.ts +8 -11
- package/dist/two-d/Game.d.ts.map +1 -1
- package/dist/two-d/Game.js.map +1 -1
- package/dist/two-d/Scene2D.d.ts +2 -2
- package/dist/two-d/Scene2D.d.ts.map +1 -1
- package/dist/two-d/Scene2D.js.map +1 -1
- package/dist/two-d/pixi-interop.d.ts +13 -0
- package/dist/two-d/pixi-interop.d.ts.map +1 -0
- package/dist/two-d/pixi-interop.js +12 -0
- package/dist/two-d/pixi-interop.js.map +1 -0
- package/dist/two-d/render/ActorAnimator.d.ts +32 -0
- package/dist/two-d/render/ActorAnimator.d.ts.map +1 -1
- package/dist/two-d/render/ActorAnimator.js +21 -0
- package/dist/two-d/render/ActorAnimator.js.map +1 -1
- package/dist/two-d/render/AnimatedSprite.d.ts +28 -8
- package/dist/two-d/render/AnimatedSprite.d.ts.map +1 -1
- package/dist/two-d/render/AnimatedSprite.js +24 -4
- package/dist/two-d/render/AnimatedSprite.js.map +1 -1
- package/dist/two-d/render/Autotile.d.ts +33 -1
- package/dist/two-d/render/Autotile.d.ts.map +1 -1
- package/dist/two-d/render/Autotile.js +33 -1
- package/dist/two-d/render/Autotile.js.map +1 -1
- package/dist/two-d/render/Camera.d.ts +53 -1
- package/dist/two-d/render/Camera.d.ts.map +1 -1
- package/dist/two-d/render/Camera.js +36 -1
- package/dist/two-d/render/Camera.js.map +1 -1
- package/dist/two-d/render/Capabilities.d.ts +33 -0
- package/dist/two-d/render/Capabilities.d.ts.map +1 -1
- package/dist/two-d/render/Capabilities.js +33 -0
- package/dist/two-d/render/Capabilities.js.map +1 -1
- package/dist/two-d/render/ColorBlindness.d.ts +23 -0
- package/dist/two-d/render/ColorBlindness.d.ts.map +1 -1
- package/dist/two-d/render/ColorBlindness.js +23 -4
- package/dist/two-d/render/ColorBlindness.js.map +1 -1
- package/dist/two-d/render/ColorTransformBatcher.d.ts +75 -4
- package/dist/two-d/render/ColorTransformBatcher.d.ts.map +1 -1
- package/dist/two-d/render/ColorTransformBatcher.js +65 -4
- package/dist/two-d/render/ColorTransformBatcher.js.map +1 -1
- package/dist/two-d/render/LayeredSprite.d.ts +22 -3
- package/dist/two-d/render/LayeredSprite.d.ts.map +1 -1
- package/dist/two-d/render/LayeredSprite.js +19 -0
- package/dist/two-d/render/LayeredSprite.js.map +1 -1
- package/dist/two-d/render/Minimap.d.ts +25 -1
- package/dist/two-d/render/Minimap.d.ts.map +1 -1
- package/dist/two-d/render/Minimap.js +25 -1
- package/dist/two-d/render/Minimap.js.map +1 -1
- package/dist/two-d/render/Particles.d.ts +26 -2
- package/dist/two-d/render/Particles.d.ts.map +1 -1
- package/dist/two-d/render/Particles.js +23 -0
- package/dist/two-d/render/Particles.js.map +1 -1
- package/dist/two-d/render/Projectile.d.ts +14 -0
- package/dist/two-d/render/Projectile.d.ts.map +1 -1
- package/dist/two-d/render/Projectile.js +14 -0
- package/dist/two-d/render/Projectile.js.map +1 -1
- package/dist/two-d/render/ScreenEffects.d.ts +15 -0
- package/dist/two-d/render/ScreenEffects.d.ts.map +1 -1
- package/dist/two-d/render/ScreenEffects.js +15 -0
- package/dist/two-d/render/ScreenEffects.js.map +1 -1
- package/dist/two-d/render/Shape2D.d.ts +97 -0
- package/dist/two-d/render/Shape2D.d.ts.map +1 -0
- package/dist/two-d/render/Shape2D.js +97 -0
- package/dist/two-d/render/Shape2D.js.map +1 -0
- package/dist/two-d/render/SpriteSheet.d.ts +9 -6
- package/dist/two-d/render/SpriteSheet.d.ts.map +1 -1
- package/dist/two-d/render/SpriteSheet.js +7 -0
- package/dist/two-d/render/SpriteSheet.js.map +1 -1
- package/dist/two-d/render/StatusVisuals.d.ts +22 -0
- package/dist/two-d/render/StatusVisuals.d.ts.map +1 -1
- package/dist/two-d/render/StatusVisuals.js +22 -0
- package/dist/two-d/render/StatusVisuals.js.map +1 -1
- package/dist/two-d/render/TileMap.d.ts +65 -3
- package/dist/two-d/render/TileMap.d.ts.map +1 -1
- package/dist/two-d/render/TileMap.js +65 -3
- package/dist/two-d/render/TileMap.js.map +1 -1
- package/dist/two-d/render/TiledMap.d.ts +9 -3
- package/dist/two-d/render/TiledMap.d.ts.map +1 -1
- package/dist/two-d/render/TiledMap.js +9 -3
- package/dist/two-d/render/TiledMap.js.map +1 -1
- package/dist/two-d/render/TintedSprite.d.ts +12 -4
- package/dist/two-d/render/TintedSprite.d.ts.map +1 -1
- package/dist/two-d/render/TintedSprite.js +14 -3
- package/dist/two-d/render/TintedSprite.js.map +1 -1
- package/dist/two-d/render/Types2D.d.ts +39 -0
- package/dist/two-d/render/Types2D.d.ts.map +1 -0
- package/dist/two-d/render/Types2D.js +18 -0
- package/dist/two-d/render/Types2D.js.map +1 -0
- package/dist/two-d/render/Viewport.d.ts +22 -0
- package/dist/two-d/render/Viewport.d.ts.map +1 -1
- package/dist/two-d/render/Viewport.js +22 -0
- package/dist/two-d/render/Viewport.js.map +1 -1
- package/dist/two-d/render/index.d.ts +3 -0
- package/dist/two-d/render/index.d.ts.map +1 -1
- package/dist/two-d/render/index.js +2 -0
- package/dist/two-d/render/index.js.map +1 -1
- package/dist/two-d/stage/DialogueStage.d.ts +16 -0
- package/dist/two-d/stage/DialogueStage.d.ts.map +1 -1
- package/dist/two-d/stage/DialogueStage.js +16 -0
- package/dist/two-d/stage/DialogueStage.js.map +1 -1
- package/dist/two-d/stage/script.d.ts +20 -0
- package/dist/two-d/stage/script.d.ts.map +1 -1
- package/dist/two-d/stage/script.js +20 -0
- package/dist/two-d/stage/script.js.map +1 -1
- package/dist/two-d/stage/twee.d.ts +11 -0
- package/dist/two-d/stage/twee.d.ts.map +1 -1
- package/dist/two-d/stage/twee.js +11 -0
- package/dist/two-d/stage/twee.js.map +1 -1
- package/dist/two-d/ui/Bar.d.ts +16 -3
- package/dist/two-d/ui/Bar.d.ts.map +1 -1
- package/dist/two-d/ui/Bar.js +16 -1
- package/dist/two-d/ui/Bar.js.map +1 -1
- package/dist/two-d/ui/BitmapLabel.d.ts +23 -1
- package/dist/two-d/ui/BitmapLabel.d.ts.map +1 -1
- package/dist/two-d/ui/BitmapLabel.js +23 -1
- package/dist/two-d/ui/BitmapLabel.js.map +1 -1
- package/dist/two-d/ui/Button.d.ts +19 -3
- package/dist/two-d/ui/Button.d.ts.map +1 -1
- package/dist/two-d/ui/Button.js +15 -0
- package/dist/two-d/ui/Button.js.map +1 -1
- package/dist/two-d/ui/FloatingText.d.ts +15 -0
- package/dist/two-d/ui/FloatingText.d.ts.map +1 -1
- package/dist/two-d/ui/FloatingText.js +15 -0
- package/dist/two-d/ui/FloatingText.js.map +1 -1
- package/dist/two-d/ui/HelpScreen.d.ts +16 -0
- package/dist/two-d/ui/HelpScreen.d.ts.map +1 -1
- package/dist/two-d/ui/HelpScreen.js +23 -3
- package/dist/two-d/ui/HelpScreen.js.map +1 -1
- package/dist/two-d/ui/IconGrid.d.ts +27 -1
- package/dist/two-d/ui/IconGrid.d.ts.map +1 -1
- package/dist/two-d/ui/IconGrid.js +37 -5
- package/dist/two-d/ui/IconGrid.js.map +1 -1
- package/dist/two-d/ui/Label.d.ts +10 -0
- package/dist/two-d/ui/Label.d.ts.map +1 -1
- package/dist/two-d/ui/Label.js +10 -0
- package/dist/two-d/ui/Label.js.map +1 -1
- package/dist/two-d/ui/ListView.d.ts +21 -1
- package/dist/two-d/ui/ListView.d.ts.map +1 -1
- package/dist/two-d/ui/ListView.js +19 -0
- package/dist/two-d/ui/ListView.js.map +1 -1
- package/dist/two-d/ui/LoadingScreen.d.ts +24 -1
- package/dist/two-d/ui/LoadingScreen.d.ts.map +1 -1
- package/dist/two-d/ui/LoadingScreen.js +24 -1
- package/dist/two-d/ui/LoadingScreen.js.map +1 -1
- package/dist/two-d/ui/MessageBox.d.ts +21 -2
- package/dist/two-d/ui/MessageBox.d.ts.map +1 -1
- package/dist/two-d/ui/MessageBox.js +19 -0
- package/dist/two-d/ui/MessageBox.js.map +1 -1
- package/dist/two-d/ui/NinePatch.d.ts +15 -2
- package/dist/two-d/ui/NinePatch.d.ts.map +1 -1
- package/dist/two-d/ui/NinePatch.js +13 -1
- package/dist/two-d/ui/NinePatch.js.map +1 -1
- package/dist/two-d/ui/RebindScreen.d.ts +15 -0
- package/dist/two-d/ui/RebindScreen.d.ts.map +1 -1
- package/dist/two-d/ui/RebindScreen.js +15 -0
- package/dist/two-d/ui/RebindScreen.js.map +1 -1
- package/dist/two-d/ui/StatsScreen.d.ts +15 -0
- package/dist/two-d/ui/StatsScreen.d.ts.map +1 -1
- package/dist/two-d/ui/StatsScreen.js +15 -0
- package/dist/two-d/ui/StatsScreen.js.map +1 -1
- package/dist/two-d/ui/Toast.d.ts +14 -1
- package/dist/two-d/ui/Toast.d.ts.map +1 -1
- package/dist/two-d/ui/Toast.js +12 -0
- package/dist/two-d/ui/Toast.js.map +1 -1
- package/dist/two-d/ui/Tooltip.d.ts +14 -0
- package/dist/two-d/ui/Tooltip.d.ts.map +1 -1
- package/dist/two-d/ui/Tooltip.js +14 -0
- package/dist/two-d/ui/Tooltip.js.map +1 -1
- package/dist/two-d/ui/VerticalLabel.d.ts +18 -0
- package/dist/two-d/ui/VerticalLabel.d.ts.map +1 -1
- package/dist/two-d/ui/VerticalLabel.js +18 -0
- package/dist/two-d/ui/VerticalLabel.js.map +1 -1
- package/dist/two-d/ui/Window.d.ts +12 -0
- package/dist/two-d/ui/Window.d.ts.map +1 -1
- package/dist/two-d/ui/Window.js +12 -0
- package/dist/two-d/ui/Window.js.map +1 -1
- package/dist/two-d/ui/theme.d.ts +47 -3
- package/dist/two-d/ui/theme.d.ts.map +1 -1
- package/dist/two-d/ui/theme.js +45 -1
- package/dist/two-d/ui/theme.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/world/Encounters.d.ts +12 -0
- package/dist/world/Encounters.d.ts.map +1 -1
- package/dist/world/Encounters.js.map +1 -1
- package/dist/world/Environment.d.ts +15 -1
- package/dist/world/Environment.d.ts.map +1 -1
- package/dist/world/Environment.js +15 -1
- package/dist/world/Environment.js.map +1 -1
- package/dist/world/Overworld.d.ts +14 -0
- package/dist/world/Overworld.d.ts.map +1 -1
- package/dist/world/Overworld.js +14 -0
- package/dist/world/Overworld.js.map +1 -1
- package/dist/world/TurnClock.d.ts +16 -0
- package/dist/world/TurnClock.d.ts.map +1 -1
- package/dist/world/TurnClock.js +16 -0
- package/dist/world/TurnClock.js.map +1 -1
- package/dist/world/World.d.ts +14 -0
- package/dist/world/World.d.ts.map +1 -1
- package/dist/world/World.js +14 -0
- package/dist/world/World.js.map +1 -1
- package/package.json +10 -3
|
@@ -8,11 +8,35 @@
|
|
|
8
8
|
*
|
|
9
9
|
* The queue is ordered by the time at which each actor next acts. `now` only ever moves
|
|
10
10
|
* forward, so effects that expire can be timestamped against it.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```ts
|
|
14
|
+
* import { Scheduler, type Actor } from '@datamoc/mw_games/roguelike';
|
|
15
|
+
*
|
|
16
|
+
* interface Monster extends Actor { name: string }
|
|
17
|
+
*
|
|
18
|
+
* const scheduler = new Scheduler<Monster>();
|
|
19
|
+
* scheduler.add({ name: 'hero', speed: 1 });
|
|
20
|
+
* scheduler.add({ name: 'fast rat', speed: 2 }); // acts twice as often
|
|
21
|
+
*
|
|
22
|
+
* const acting = scheduler.peek(); // whoever's turn it is
|
|
23
|
+
* scheduler.spend(1); // charge them for a normal-speed action, hand the turn on
|
|
24
|
+
* ```
|
|
11
25
|
*/
|
|
12
26
|
export interface Actor {
|
|
13
27
|
/** actions per unit of time; 2 acts twice as often as 1 */
|
|
14
28
|
speed?: number;
|
|
15
29
|
}
|
|
30
|
+
/** A serialisable record of a scheduler's queue, keyed by caller-supplied actor ids. */
|
|
31
|
+
export interface SchedulerSnapshot {
|
|
32
|
+
now: number;
|
|
33
|
+
sequence: number;
|
|
34
|
+
entries: Array<{
|
|
35
|
+
id: string;
|
|
36
|
+
time: number;
|
|
37
|
+
sequence: number;
|
|
38
|
+
}>;
|
|
39
|
+
}
|
|
16
40
|
export declare class Scheduler<A extends Actor> {
|
|
17
41
|
private entries;
|
|
18
42
|
private sequence;
|
|
@@ -35,11 +59,34 @@ export declare class Scheduler<A extends Actor> {
|
|
|
35
59
|
/**
|
|
36
60
|
* Charges the current actor for what it did, and hands the turn on.
|
|
37
61
|
*
|
|
38
|
-
* @param cost time the action took at speed 1; divided by the actor's speed
|
|
62
|
+
* @param cost time the action took at speed 1; divided by the actor's speed. A cost of 0
|
|
63
|
+
* is a free action: the actor keeps its place at `now` but still goes behind any other
|
|
64
|
+
* actor already tied with it, since its sequence number is refreshed like any other spend.
|
|
39
65
|
*/
|
|
40
66
|
spend(cost: number): void;
|
|
67
|
+
/**
|
|
68
|
+
* Pushes a specific actor's next turn back, independent of whose turn it currently is -
|
|
69
|
+
* a stun or slow effect landing on someone other than the current actor, for instance.
|
|
70
|
+
*
|
|
71
|
+
* @param delay time added to that actor's next scheduled turn
|
|
72
|
+
*/
|
|
73
|
+
postpone(actor: A, delay: number): void;
|
|
41
74
|
/** the time at which an actor next acts, for a debug view or an interface */
|
|
42
75
|
timeOf(actor: A): number | null;
|
|
76
|
+
/**
|
|
77
|
+
* Captures the queue as plain data, identifying each actor by whatever id the caller
|
|
78
|
+
* assigns it - the scheduler holds actor references, not ids, so it cannot invent one
|
|
79
|
+
* itself.
|
|
80
|
+
*/
|
|
81
|
+
toJSON(actorId: (actor: A) => string): SchedulerSnapshot;
|
|
82
|
+
/**
|
|
83
|
+
* Rebuilds a scheduler from a snapshot taken by `toJSON`, restoring `now` and the
|
|
84
|
+
* sequence counter so that ties among actors added afterwards resolve exactly as they
|
|
85
|
+
* would have if the scheduler had never been serialised.
|
|
86
|
+
*
|
|
87
|
+
* @param actorOf resolves a snapshot id back to the live actor object it names
|
|
88
|
+
*/
|
|
89
|
+
static restore<A extends Actor>(snapshot: SchedulerSnapshot, actorOf: (id: string) => A): Scheduler<A>;
|
|
43
90
|
private sort;
|
|
44
91
|
}
|
|
45
92
|
//# sourceMappingURL=Scheduler.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Scheduler.d.ts","sourceRoot":"","sources":["../../src/roguelike/Scheduler.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"Scheduler.d.ts","sourceRoot":"","sources":["../../src/roguelike/Scheduler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,MAAM,WAAW,KAAK;IACrB,2DAA2D;IAC3D,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wFAAwF;AACxF,MAAM,WAAW,iBAAiB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC/D;AAUD,qBAAa,SAAS,CAAC,CAAC,SAAS,KAAK;IACrC,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,QAAQ,CAAK;IAErB,qEAAqE;IACrE,GAAG,SAAK;IAER,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,MAAM,IAAI,CAAC,EAAE,CAEhB;IAED,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAErB;IAED;;;;;OAKG;IACH,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,SAAI,GAAG,IAAI,CAG7B;IAED,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAGrB;IAED,KAAK,IAAI,IAAI,CAIZ;IAED,4EAA4E;IAC5E,IAAI,IAAI,CAAC,GAAG,IAAI,CAOf;IAED;;;;;;OAMG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CASxB;IAED;;;;;OAKG;IACH,QAAQ,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAOtC;IAED,6EAA6E;IAC7E,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,MAAM,GAAG,IAAI,CAE9B;IAED;;;;OAIG;IACH,MAAM,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,GAAG,iBAAiB,CAMvD;IAED;;;;;;OAMG;IACH,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,KAAK,EAAE,QAAQ,EAAE,iBAAiB,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAOrG;IAED,OAAO,CAAC,IAAI;CAKZ"}
|
|
@@ -8,6 +8,20 @@
|
|
|
8
8
|
*
|
|
9
9
|
* The queue is ordered by the time at which each actor next acts. `now` only ever moves
|
|
10
10
|
* forward, so effects that expire can be timestamped against it.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```ts
|
|
14
|
+
* import { Scheduler, type Actor } from '@datamoc/mw_games/roguelike';
|
|
15
|
+
*
|
|
16
|
+
* interface Monster extends Actor { name: string }
|
|
17
|
+
*
|
|
18
|
+
* const scheduler = new Scheduler<Monster>();
|
|
19
|
+
* scheduler.add({ name: 'hero', speed: 1 });
|
|
20
|
+
* scheduler.add({ name: 'fast rat', speed: 2 }); // acts twice as often
|
|
21
|
+
*
|
|
22
|
+
* const acting = scheduler.peek(); // whoever's turn it is
|
|
23
|
+
* scheduler.spend(1); // charge them for a normal-speed action, hand the turn on
|
|
24
|
+
* ```
|
|
11
25
|
*/
|
|
12
26
|
export class Scheduler {
|
|
13
27
|
constructor() {
|
|
@@ -57,7 +71,9 @@ export class Scheduler {
|
|
|
57
71
|
/**
|
|
58
72
|
* Charges the current actor for what it did, and hands the turn on.
|
|
59
73
|
*
|
|
60
|
-
* @param cost time the action took at speed 1; divided by the actor's speed
|
|
74
|
+
* @param cost time the action took at speed 1; divided by the actor's speed. A cost of 0
|
|
75
|
+
* is a free action: the actor keeps its place at `now` but still goes behind any other
|
|
76
|
+
* actor already tied with it, since its sequence number is refreshed like any other spend.
|
|
61
77
|
*/
|
|
62
78
|
spend(cost) {
|
|
63
79
|
const entry = this.entries[0];
|
|
@@ -69,10 +85,51 @@ export class Scheduler {
|
|
|
69
85
|
entry.sequence = this.sequence++;
|
|
70
86
|
this.sort();
|
|
71
87
|
}
|
|
88
|
+
/**
|
|
89
|
+
* Pushes a specific actor's next turn back, independent of whose turn it currently is -
|
|
90
|
+
* a stun or slow effect landing on someone other than the current actor, for instance.
|
|
91
|
+
*
|
|
92
|
+
* @param delay time added to that actor's next scheduled turn
|
|
93
|
+
*/
|
|
94
|
+
postpone(actor, delay) {
|
|
95
|
+
const entry = this.entries.find((entry) => entry.actor === actor);
|
|
96
|
+
if (!entry)
|
|
97
|
+
return;
|
|
98
|
+
entry.time += delay;
|
|
99
|
+
entry.sequence = this.sequence++;
|
|
100
|
+
this.sort();
|
|
101
|
+
}
|
|
72
102
|
/** the time at which an actor next acts, for a debug view or an interface */
|
|
73
103
|
timeOf(actor) {
|
|
74
104
|
return this.entries.find((entry) => entry.actor === actor)?.time ?? null;
|
|
75
105
|
}
|
|
106
|
+
/**
|
|
107
|
+
* Captures the queue as plain data, identifying each actor by whatever id the caller
|
|
108
|
+
* assigns it - the scheduler holds actor references, not ids, so it cannot invent one
|
|
109
|
+
* itself.
|
|
110
|
+
*/
|
|
111
|
+
toJSON(actorId) {
|
|
112
|
+
return {
|
|
113
|
+
now: this.now,
|
|
114
|
+
sequence: this.sequence,
|
|
115
|
+
entries: this.entries.map((entry) => ({ id: actorId(entry.actor), time: entry.time, sequence: entry.sequence })),
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Rebuilds a scheduler from a snapshot taken by `toJSON`, restoring `now` and the
|
|
120
|
+
* sequence counter so that ties among actors added afterwards resolve exactly as they
|
|
121
|
+
* would have if the scheduler had never been serialised.
|
|
122
|
+
*
|
|
123
|
+
* @param actorOf resolves a snapshot id back to the live actor object it names
|
|
124
|
+
*/
|
|
125
|
+
static restore(snapshot, actorOf) {
|
|
126
|
+
const scheduler = new Scheduler();
|
|
127
|
+
scheduler.now = snapshot.now;
|
|
128
|
+
scheduler.sequence = snapshot.sequence;
|
|
129
|
+
scheduler.entries = snapshot.entries.map((entry) => ({ actor: actorOf(entry.id), time: entry.time, sequence: entry.sequence }));
|
|
130
|
+
scheduler.sort();
|
|
131
|
+
return scheduler;
|
|
132
|
+
}
|
|
76
133
|
sort() {
|
|
77
134
|
//few actors are ever queued, so a sort per action is cheaper than a heap and far
|
|
78
135
|
//easier to reason about; swap it out if a level ever holds thousands
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Scheduler.js","sourceRoot":"","sources":["../../src/roguelike/Scheduler.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"Scheduler.js","sourceRoot":"","sources":["../../src/roguelike/Scheduler.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,6 +13,19 @@ import type { Level } from './Level.ts';
|
|
|
13
13
|
* Discovery itself is a game's call, not this class's: a search action rolling against a
|
|
14
14
|
* distance, a trap firing the moment a creature steps onto it, a wand of revealing. This
|
|
15
15
|
* only does the bookkeeping once that decision has been made.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts
|
|
19
|
+
* import { Secrets, Level, WALL, FLOOR } from '@datamoc/mw_games/roguelike';
|
|
20
|
+
*
|
|
21
|
+
* const level = new Level(20, 20, [WALL, FLOOR], 1);
|
|
22
|
+
* const secrets = new Secrets(level);
|
|
23
|
+
*
|
|
24
|
+
* secrets.conceal(5, 5, 0, 1); // disguised as WALL (0), reveals as FLOOR (1) once found
|
|
25
|
+
* console.log(secrets.isSecret(5, 5)); // true - the cell reads as solid rock until found
|
|
26
|
+
*
|
|
27
|
+
* secrets.discover(5, 5); // a search action succeeded
|
|
28
|
+
* ```
|
|
16
29
|
*/
|
|
17
30
|
export declare class Secrets {
|
|
18
31
|
private level;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Secrets.d.ts","sourceRoot":"","sources":["../../src/roguelike/Secrets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC
|
|
1
|
+
{"version":3,"file":"Secrets.d.ts","sourceRoot":"","sources":["../../src/roguelike/Secrets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,qBAAa,OAAO;IACnB,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,UAAU,CAAqB;IAEvC,YAAY,KAAK,EAAE,KAAK,EAEvB;IAED,yFAAyF;IACzF,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAKtE;IAED,0FAA0F;IAC1F,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAGtC;IAED,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAE1C;IAED;;;;;OAKG;IACH,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAOtC;IAED,MAAM,IAAI;QAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;QAAC,UAAU,EAAE,MAAM,EAAE,CAAA;KAAE,CAE/D;IAED,yEAAyE;IACzE,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE;QAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;QAAC,UAAU,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,OAAO,CAKnG;CACD"}
|
|
@@ -12,6 +12,19 @@
|
|
|
12
12
|
* Discovery itself is a game's call, not this class's: a search action rolling against a
|
|
13
13
|
* distance, a trap firing the moment a creature steps onto it, a wand of revealing. This
|
|
14
14
|
* only does the bookkeeping once that decision has been made.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```ts
|
|
18
|
+
* import { Secrets, Level, WALL, FLOOR } from '@datamoc/mw_games/roguelike';
|
|
19
|
+
*
|
|
20
|
+
* const level = new Level(20, 20, [WALL, FLOOR], 1);
|
|
21
|
+
* const secrets = new Secrets(level);
|
|
22
|
+
*
|
|
23
|
+
* secrets.conceal(5, 5, 0, 1); // disguised as WALL (0), reveals as FLOOR (1) once found
|
|
24
|
+
* console.log(secrets.isSecret(5, 5)); // true - the cell reads as solid rock until found
|
|
25
|
+
*
|
|
26
|
+
* secrets.discover(5, 5); // a search action succeeded
|
|
27
|
+
* ```
|
|
15
28
|
*/
|
|
16
29
|
export class Secrets {
|
|
17
30
|
constructor(level) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Secrets.js","sourceRoot":"","sources":["../../src/roguelike/Secrets.ts"],"names":[],"mappings":"AAEA
|
|
1
|
+
{"version":3,"file":"Secrets.js","sourceRoot":"","sources":["../../src/roguelike/Secrets.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,OAAO,OAAO;IAKnB,YAAY,KAAY;QAHhB,iBAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;QACzC,eAAU,GAAG,IAAI,GAAG,EAAU,CAAC;QAGtC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACpB,CAAC;IAED,yFAAyF;IACzF,OAAO,CAAC,CAAS,EAAE,CAAS,EAAE,QAAgB,EAAE,QAAgB;QAC/D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACpC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACtC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;IAChC,CAAC;IAED,0FAA0F;IAC1F,QAAQ,CAAC,CAAS,EAAE,CAAS;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClE,CAAC;IAED,YAAY,CAAC,CAAS,EAAE,CAAS;QAChC,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC;IAED;;;;;OAKG;IACH,QAAQ,CAAC,CAAS,EAAE,CAAS;QAC5B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QAEvC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACpC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC;IACb,CAAC;IAED,MAAM;QACL,OAAO,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,EAAE,UAAU,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;IAC/E,CAAC;IAED,yEAAyE;IACzE,MAAM,CAAC,QAAQ,CAAC,KAAY,EAAE,IAA4D;QACzF,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC;QACnC,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACvF,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,UAAU;YAAE,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACjE,OAAO,OAAO,CAAC;IAChB,CAAC;CACD"}
|
|
@@ -14,6 +14,19 @@ export interface StealthOptions {
|
|
|
14
14
|
* Tracks one hidden unit's detection state. Detection is one-way and sticky: once found, a
|
|
15
15
|
* unit stays found until something explicitly re-hides it (`reset`), the same way a real
|
|
16
16
|
* ambush does not un-happen because the enemy that spotted you wandered off again.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```ts
|
|
20
|
+
* import { Stealth } from '@datamoc/mw_games/roguelike';
|
|
21
|
+
*
|
|
22
|
+
* const assassin = new Stealth({ radius: 2 });
|
|
23
|
+
* const guards = [{ x: 10, y: 10 }, { x: 5, y: 5 }];
|
|
24
|
+
*
|
|
25
|
+
* if (assassin.checkDetection({ x: 4, y: 5 }, guards)) {
|
|
26
|
+
* console.log('spotted! that guard spends its move noticing');
|
|
27
|
+
* }
|
|
28
|
+
* console.log(assassin.isDetected);
|
|
29
|
+
* ```
|
|
17
30
|
*/
|
|
18
31
|
export declare class Stealth {
|
|
19
32
|
private detected;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Stealth.d.ts","sourceRoot":"","sources":["../../src/roguelike/Stealth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAE5C;;;;;;GAMG;AACH,MAAM,WAAW,cAAc;IAC9B,sFAAsF;IACtF,MAAM,EAAE,MAAM,CAAC;CACf;AAED
|
|
1
|
+
{"version":3,"file":"Stealth.d.ts","sourceRoot":"","sources":["../../src/roguelike/Stealth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAE5C;;;;;;GAMG;AACH,MAAM,WAAW,cAAc;IAC9B,sFAAsF;IACtF,MAAM,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,OAAO;IACnB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAS;IAEvB,YAAY,OAAO,EAAE,cAAc,EAElC;IAED,IAAI,UAAU,IAAI,OAAO,CAExB;IAED;;;;;;OAMG;IACH,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,IAAI,EAAE,GAAG,OAAO,CAKhE;IAED,+FAA+F;IAC/F,KAAK,IAAI,IAAI,CAEZ;CACD"}
|
|
@@ -3,6 +3,19 @@ import { chebyshevDistance } from './Targeting.js';
|
|
|
3
3
|
* Tracks one hidden unit's detection state. Detection is one-way and sticky: once found, a
|
|
4
4
|
* unit stays found until something explicitly re-hides it (`reset`), the same way a real
|
|
5
5
|
* ambush does not un-happen because the enemy that spotted you wandered off again.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```ts
|
|
9
|
+
* import { Stealth } from '@datamoc/mw_games/roguelike';
|
|
10
|
+
*
|
|
11
|
+
* const assassin = new Stealth({ radius: 2 });
|
|
12
|
+
* const guards = [{ x: 10, y: 10 }, { x: 5, y: 5 }];
|
|
13
|
+
*
|
|
14
|
+
* if (assassin.checkDetection({ x: 4, y: 5 }, guards)) {
|
|
15
|
+
* console.log('spotted! that guard spends its move noticing');
|
|
16
|
+
* }
|
|
17
|
+
* console.log(assassin.isDetected);
|
|
18
|
+
* ```
|
|
6
19
|
*/
|
|
7
20
|
export class Stealth {
|
|
8
21
|
constructor(options) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Stealth.js","sourceRoot":"","sources":["../../src/roguelike/Stealth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAenD
|
|
1
|
+
{"version":3,"file":"Stealth.js","sourceRoot":"","sources":["../../src/roguelike/Stealth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAenD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,OAAO,OAAO;IAInB,YAAY,OAAuB;QAH3B,aAAQ,GAAG,KAAK,CAAC;QAIxB,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC9B,CAAC;IAED,IAAI,UAAU;QACb,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC;IAED;;;;;;OAMG;IACH,cAAc,CAAC,MAAY,EAAE,SAA0B;QACtD,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO,KAAK,CAAC;QAChC,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,iBAAiB,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/F,IAAI,KAAK;YAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QAChC,OAAO,KAAK,CAAC;IACd,CAAC;IAED,+FAA+F;IAC/F,KAAK;QACJ,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IACvB,CAAC;CACD"}
|
|
@@ -26,7 +26,26 @@ export interface TargetingOptions {
|
|
|
26
26
|
/** whether a wall in the way blocks the shot; on by default, since most things do not arc */
|
|
27
27
|
requireLineOfSight?: boolean;
|
|
28
28
|
}
|
|
29
|
-
/**
|
|
29
|
+
/**
|
|
30
|
+
* The straight-line ruler distance a roguelike uses: diagonals cost the same as a step.
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```ts
|
|
34
|
+
* import { chebyshevDistance, traceLine, hasLineOfSight, canTarget, resolveArea, Level, WALL, FLOOR } from '@datamoc/mw_games/roguelike';
|
|
35
|
+
*
|
|
36
|
+
* const level = new Level(20, 20, [WALL, FLOOR], 1); // an open floor
|
|
37
|
+
* const origin = { x: 2, y: 2 };
|
|
38
|
+
* const target = { x: 8, y: 5 };
|
|
39
|
+
*
|
|
40
|
+
* chebyshevDistance(origin, target); // 6
|
|
41
|
+
* traceLine(origin, target); // every cell the shot crosses
|
|
42
|
+
* hasLineOfSight(level, origin, target); // true - nothing blocks it
|
|
43
|
+
*
|
|
44
|
+
* if (canTarget(level, origin, target, { range: 10 })) {
|
|
45
|
+
* const hit = resolveArea(origin, target, { kind: 'burst', radius: 2 });
|
|
46
|
+
* }
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
30
49
|
export declare function chebyshevDistance(a: Step, b: Step): number;
|
|
31
50
|
/**
|
|
32
51
|
* Every cell a straight line crosses from `from` to `to`, `from` included and `to` included.
|
|
@@ -47,6 +66,19 @@ export declare function resolveArea(origin: Step, target: Step, shape: AreaShape
|
|
|
47
66
|
* nearest of the 8 directions, the length is the distance aimed, and step `i` of `length`
|
|
48
67
|
* spans `round(i / length * width)` cells to each side of the centre line. A width of 0
|
|
49
68
|
* is a single-file beam, the same cells `line` would trace along that snapped direction.
|
|
69
|
+
*
|
|
70
|
+
* @example
|
|
71
|
+
* ```ts
|
|
72
|
+
* import { coneCells, chainTargets, knockbackPath, Level, WALL, FLOOR } from '@datamoc/mw_games/roguelike';
|
|
73
|
+
*
|
|
74
|
+
* const breath = coneCells({ x: 5, y: 5 }, { x: 5, y: 0 }, 3); // a dragon's breath, aimed north
|
|
75
|
+
*
|
|
76
|
+
* const monsters = [{ x: 5, y: 4 }, { x: 5, y: 3 }, { x: 6, y: 2 }];
|
|
77
|
+
* const arc = chainTargets(monsters, { x: 5, y: 5 }, 3, 2); // a lightning bolt hopping between them
|
|
78
|
+
*
|
|
79
|
+
* const level = new Level(20, 20, [WALL, FLOOR], 1);
|
|
80
|
+
* const shovedTo = knockbackPath(level, { x: 5, y: 5 }, { x: 1, y: 0 }, 3); // shoved 3 cells east
|
|
81
|
+
* ```
|
|
50
82
|
*/
|
|
51
83
|
export declare function coneCells(origin: Step, target: Step, width: number): Step[];
|
|
52
84
|
/**
|
|
@@ -62,6 +94,18 @@ export declare function chainTargets(candidates: readonly Step[], origin: Step,
|
|
|
62
94
|
* once its distance is known. `mwg` supplies no default bands or multipliers, only the lookup:
|
|
63
95
|
* bands are checked in order, the first whose `max` is at or above `distance` applies, and a
|
|
64
96
|
* distance past every band's `max` falls back to `beyond`.
|
|
97
|
+
*
|
|
98
|
+
* @example
|
|
99
|
+
* ```ts
|
|
100
|
+
* import { rangeMultiplier, areaFalloffMultiplier, type RangeBand } from '@datamoc/mw_games/roguelike';
|
|
101
|
+
*
|
|
102
|
+
* const bands: RangeBand[] = [{ max: 2, multiplier: 1.5 }, { max: 6, multiplier: 1 }];
|
|
103
|
+
* rangeMultiplier(1, bands); // 1.5 - point-blank bonus
|
|
104
|
+
* rangeMultiplier(10, bands, 0.5); // 0.5 - past every band, falls back to `beyond`
|
|
105
|
+
*
|
|
106
|
+
* areaFalloffMultiplier(0, [1, 0.5]); // 1 - first target hit, full damage
|
|
107
|
+
* areaFalloffMultiplier(1, [1, 0.5]); // 0.5 - second target
|
|
108
|
+
* ```
|
|
65
109
|
*/
|
|
66
110
|
export interface RangeBand {
|
|
67
111
|
/** the greatest distance this band covers */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Targeting.d.ts","sourceRoot":"","sources":["../../src/roguelike/Targeting.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAE5C;;;;;;;;GAQG;AACH,MAAM,MAAM,SAAS,GAClB;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnC,MAAM,WAAW,gBAAgB;IAChC,2FAA2F;IAC3F,KAAK,EAAE,MAAM,CAAC;IAEd,6FAA6F;IAC7F,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED
|
|
1
|
+
{"version":3,"file":"Targeting.d.ts","sourceRoot":"","sources":["../../src/roguelike/Targeting.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAE5C;;;;;;;;GAQG;AACH,MAAM,MAAM,SAAS,GAClB;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnC,MAAM,WAAW,gBAAgB;IAChC,2FAA2F;IAC3F,KAAK,EAAE,MAAM,CAAC;IAEd,6FAA6F;IAC7F,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,MAAM,CAE1D;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,GAAG,IAAI,EAAE,CA2BtD;AAED,8FAA8F;AAC9F,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,GAAG,OAAO,CAM1E;AAED,gGAAgG;AAChG,wBAAgB,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAItG;AAED,+EAA+E;AAC/E,wBAAgB,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI,EAAE,CAuBhF;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,CAoB3E;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,SAAS,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,CAsB5G;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,WAAW,SAAS;IACzB,6CAA6C;IAC7C,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,SAAS,EAAE,EAAE,MAAM,SAAI,GAAG,MAAM,CAKjG;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAGrF;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,CAQjG"}
|
|
@@ -1,4 +1,23 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/**
|
|
2
|
+
* The straight-line ruler distance a roguelike uses: diagonals cost the same as a step.
|
|
3
|
+
*
|
|
4
|
+
* @example
|
|
5
|
+
* ```ts
|
|
6
|
+
* import { chebyshevDistance, traceLine, hasLineOfSight, canTarget, resolveArea, Level, WALL, FLOOR } from '@datamoc/mw_games/roguelike';
|
|
7
|
+
*
|
|
8
|
+
* const level = new Level(20, 20, [WALL, FLOOR], 1); // an open floor
|
|
9
|
+
* const origin = { x: 2, y: 2 };
|
|
10
|
+
* const target = { x: 8, y: 5 };
|
|
11
|
+
*
|
|
12
|
+
* chebyshevDistance(origin, target); // 6
|
|
13
|
+
* traceLine(origin, target); // every cell the shot crosses
|
|
14
|
+
* hasLineOfSight(level, origin, target); // true - nothing blocks it
|
|
15
|
+
*
|
|
16
|
+
* if (canTarget(level, origin, target, { range: 10 })) {
|
|
17
|
+
* const hit = resolveArea(origin, target, { kind: 'burst', radius: 2 });
|
|
18
|
+
* }
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
2
21
|
export function chebyshevDistance(a, b) {
|
|
3
22
|
return Math.max(Math.abs(a.x - b.x), Math.abs(a.y - b.y));
|
|
4
23
|
}
|
|
@@ -79,6 +98,19 @@ export function resolveArea(origin, target, shape) {
|
|
|
79
98
|
* nearest of the 8 directions, the length is the distance aimed, and step `i` of `length`
|
|
80
99
|
* spans `round(i / length * width)` cells to each side of the centre line. A width of 0
|
|
81
100
|
* is a single-file beam, the same cells `line` would trace along that snapped direction.
|
|
101
|
+
*
|
|
102
|
+
* @example
|
|
103
|
+
* ```ts
|
|
104
|
+
* import { coneCells, chainTargets, knockbackPath, Level, WALL, FLOOR } from '@datamoc/mw_games/roguelike';
|
|
105
|
+
*
|
|
106
|
+
* const breath = coneCells({ x: 5, y: 5 }, { x: 5, y: 0 }, 3); // a dragon's breath, aimed north
|
|
107
|
+
*
|
|
108
|
+
* const monsters = [{ x: 5, y: 4 }, { x: 5, y: 3 }, { x: 6, y: 2 }];
|
|
109
|
+
* const arc = chainTargets(monsters, { x: 5, y: 5 }, 3, 2); // a lightning bolt hopping between them
|
|
110
|
+
*
|
|
111
|
+
* const level = new Level(20, 20, [WALL, FLOOR], 1);
|
|
112
|
+
* const shovedTo = knockbackPath(level, { x: 5, y: 5 }, { x: 1, y: 0 }, 3); // shoved 3 cells east
|
|
113
|
+
* ```
|
|
82
114
|
*/
|
|
83
115
|
export function coneCells(origin, target, width) {
|
|
84
116
|
const dx = target.x - origin.x;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Targeting.js","sourceRoot":"","sources":["../../src/roguelike/Targeting.ts"],"names":[],"mappings":"AA0BA
|
|
1
|
+
{"version":3,"file":"Targeting.js","sourceRoot":"","sources":["../../src/roguelike/Targeting.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,16 @@
|
|
|
5
5
|
* proc shares. `mwg` tracks only the streak and its turn-window; what counts as a qualifying
|
|
6
6
|
* event, and what a streak length unlocks, stay the game's own rule, fired from `trigger`'s
|
|
7
7
|
* own returned count.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* import { TriggerTracker } from '@datamoc/mw_games/roguelike';
|
|
12
|
+
*
|
|
13
|
+
* const combo = new TriggerTracker(2); // a hit must land within 2 turns of the last
|
|
14
|
+
* combo.trigger(1); // streak: 1
|
|
15
|
+
* combo.trigger(2); // streak: 2 - within the window
|
|
16
|
+
* combo.trigger(10); // streak restarts at 1 - the window lapsed
|
|
17
|
+
* ```
|
|
8
18
|
*/
|
|
9
19
|
export declare class TriggerTracker {
|
|
10
20
|
private readonly window;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TriggerTracker.d.ts","sourceRoot":"","sources":["../../src/roguelike/TriggerTracker.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"TriggerTracker.d.ts","sourceRoot":"","sources":["../../src/roguelike/TriggerTracker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,cAAc;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,QAAQ,CAAa;IAE7B,YAAY,MAAM,EAAE,MAAM,EAEzB;IAED,oFAAoF;IACpF,IAAI,KAAK,IAAI,MAAM,CAElB;IAED;;;;;OAKG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAI5B;IAED,4FAA4F;IAC5F,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE9B;IAED,uGAAuG;IACvG,KAAK,IAAI,IAAI,CAGZ;IAED,MAAM,IAAI;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAE7C;IAED,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,cAAc,CAK1F;CACD"}
|
|
@@ -5,6 +5,16 @@
|
|
|
5
5
|
* proc shares. `mwg` tracks only the streak and its turn-window; what counts as a qualifying
|
|
6
6
|
* event, and what a streak length unlocks, stay the game's own rule, fired from `trigger`'s
|
|
7
7
|
* own returned count.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* import { TriggerTracker } from '@datamoc/mw_games/roguelike';
|
|
12
|
+
*
|
|
13
|
+
* const combo = new TriggerTracker(2); // a hit must land within 2 turns of the last
|
|
14
|
+
* combo.trigger(1); // streak: 1
|
|
15
|
+
* combo.trigger(2); // streak: 2 - within the window
|
|
16
|
+
* combo.trigger(10); // streak restarts at 1 - the window lapsed
|
|
17
|
+
* ```
|
|
8
18
|
*/
|
|
9
19
|
export class TriggerTracker {
|
|
10
20
|
constructor(window) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TriggerTracker.js","sourceRoot":"","sources":["../../src/roguelike/TriggerTracker.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"TriggerTracker.js","sourceRoot":"","sources":["../../src/roguelike/TriggerTracker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,OAAO,cAAc;IAK1B,YAAY,MAAc;QAHlB,WAAM,GAAG,CAAC,CAAC;QACX,aAAQ,GAAG,CAAC,QAAQ,CAAC;QAG5B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACtB,CAAC;IAED,oFAAoF;IACpF,IAAI,KAAK;QACR,OAAO,IAAI,CAAC,MAAM,CAAC;IACpB,CAAC;IAED;;;;;OAKG;IACH,OAAO,CAAC,IAAY;QACnB,IAAI,CAAC,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,OAAO,IAAI,CAAC,MAAM,CAAC;IACpB,CAAC;IAED,4FAA4F;IAC5F,QAAQ,CAAC,IAAY;QACpB,OAAO,IAAI,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC;IAC5C,CAAC;IAED,uGAAuG;IACvG,KAAK;QACJ,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAChB,IAAI,CAAC,QAAQ,GAAG,CAAC,QAAQ,CAAC;IAC3B,CAAC;IAED,MAAM;QACL,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;IACzD,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,MAAc,EAAE,IAA0C;QACzE,MAAM,OAAO,GAAG,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;QAC3C,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC7B,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QACjC,OAAO,OAAO,CAAC;IAChB,CAAC;CACD"}
|
|
@@ -75,6 +75,17 @@ export interface DungeonResult {
|
|
|
75
75
|
*/
|
|
76
76
|
roomBuilders: string[];
|
|
77
77
|
}
|
|
78
|
+
/**
|
|
79
|
+
* The two terrain kinds every dungeon needs: wall (index 0) and floor (index 1). A game
|
|
80
|
+
* appends its own kinds (traps, doors) after these via `DungeonOptions.kinds`.
|
|
81
|
+
*
|
|
82
|
+
* @example
|
|
83
|
+
* ```ts
|
|
84
|
+
* import { DUNGEON_KINDS } from '@datamoc/mw_games/roguelike';
|
|
85
|
+
*
|
|
86
|
+
* const kinds = [...DUNGEON_KINDS, { passable: false, transparent: true }]; // + a window
|
|
87
|
+
* ```
|
|
88
|
+
*/
|
|
78
89
|
export declare const DUNGEON_KINDS: TerrainKind[];
|
|
79
90
|
/**
|
|
80
91
|
* The full pipeline result: the level, its room graph, and how many placement attempts were
|
|
@@ -82,8 +93,37 @@ export declare const DUNGEON_KINDS: TerrainKind[];
|
|
|
82
93
|
* for a caller that has no use for the graph or retry count.
|
|
83
94
|
*/
|
|
84
95
|
export declare function generateDungeonGraph(options: DungeonOptions): DungeonResult;
|
|
96
|
+
/**
|
|
97
|
+
* Rooms joined by corridors, seeded and reproducible.
|
|
98
|
+
*
|
|
99
|
+
* @example
|
|
100
|
+
* ```ts
|
|
101
|
+
* import { generateDungeon, generateDungeonGraph } from '@datamoc/mw_games/roguelike';
|
|
102
|
+
* import { Random } from '@datamoc/mw_games/core';
|
|
103
|
+
*
|
|
104
|
+
* Random.push(12345); // the same seed always produces the same floor
|
|
105
|
+
* const level = generateDungeon({ width: 60, height: 40, rooms: 12 });
|
|
106
|
+
* Random.pop();
|
|
107
|
+
*
|
|
108
|
+
* // generateDungeonGraph is the same pipeline, also returning the room graph and retries
|
|
109
|
+
* const { level: level2, graph, retries, roomBuilders } = generateDungeonGraph({ width: 60, height: 40 });
|
|
110
|
+
* ```
|
|
111
|
+
*/
|
|
85
112
|
export declare function generateDungeon(options: DungeonOptions): Level;
|
|
86
|
-
/**
|
|
113
|
+
/**
|
|
114
|
+
* A random passable cell, avoiding any listed as taken.
|
|
115
|
+
*
|
|
116
|
+
* @example
|
|
117
|
+
* ```ts
|
|
118
|
+
* import { generateDungeon, findFreeCell, furthestRoom, rectCenter } from '@datamoc/mw_games/roguelike';
|
|
119
|
+
*
|
|
120
|
+
* const level = generateDungeon({ width: 40, height: 30 });
|
|
121
|
+
* const start = rectCenter(level.rooms[0]);
|
|
122
|
+
*
|
|
123
|
+
* const stairsRoom = furthestRoom(level, start); // put the exit far from the entrance
|
|
124
|
+
* const monsterCell = findFreeCell(level, new Set([level.index(start.x, start.y)]));
|
|
125
|
+
* ```
|
|
126
|
+
*/
|
|
87
127
|
export declare function findFreeCell(level: Level, taken?: ReadonlySet<number>): number | null;
|
|
88
128
|
/** the room furthest from `from`, by straight-line distance between centres */
|
|
89
129
|
export declare function furthestRoom(level: Level, from: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/roguelike/generate.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAA4B,KAAK,IAAI,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAC1F,OAAO,EAA4B,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE/E;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,cAAc;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IAEf,yEAAyE;IACzE,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,iFAAiF;IACjF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,iGAAiG;IACjG,KAAK,CAAC,EAAE,WAAW,EAAE,CAAC;IAEtB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,sBAAsB,CAAC;IAE/B;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,sBAAsB;IACtC,6EAA6E;IAC7E,YAAY,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAE/C,yDAAyD;IACzD,gBAAgB,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,GAAG,IAAI,CAAC;CAC9D;AAED,gFAAgF;AAChF,MAAM,WAAW,QAAQ;IACxB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IAEV,wFAAwF;IACxF,KAAK,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC7B,KAAK,EAAE,KAAK,CAAC;IAEb,uEAAuE;IACvE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAElB,4FAA4F;IAC5F,OAAO,EAAE,MAAM,CAAC;IAEhB;;;;;OAKG;IACH,YAAY,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,eAAO,MAAM,aAAa,EAAE,WAAW,EAGtC,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,cAAc,GAAG,aAAa,CA4E3E;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,cAAc,GAAG,KAAK,CAE9D;AA0CD
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/roguelike/generate.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAA4B,KAAK,IAAI,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAC1F,OAAO,EAA4B,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE/E;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,cAAc;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IAEf,yEAAyE;IACzE,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,iFAAiF;IACjF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,iGAAiG;IACjG,KAAK,CAAC,EAAE,WAAW,EAAE,CAAC;IAEtB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,sBAAsB,CAAC;IAE/B;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,sBAAsB;IACtC,6EAA6E;IAC7E,YAAY,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAE/C,yDAAyD;IACzD,gBAAgB,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,GAAG,IAAI,CAAC;CAC9D;AAED,gFAAgF;AAChF,MAAM,WAAW,QAAQ;IACxB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IAEV,wFAAwF;IACxF,KAAK,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC7B,KAAK,EAAE,KAAK,CAAC;IAEb,uEAAuE;IACvE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAElB,4FAA4F;IAC5F,OAAO,EAAE,MAAM,CAAC;IAEhB;;;;;OAKG;IACH,YAAY,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,aAAa,EAAE,WAAW,EAGtC,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,cAAc,GAAG,aAAa,CA4E3E;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,cAAc,GAAG,KAAK,CAE9D;AA0CD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,GAAE,WAAW,CAAC,MAAM,CAAa,GAAG,MAAM,GAAG,IAAI,CAGhG;AAED,+EAA+E;AAC/E,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,GAAG,IAAI,CActF"}
|
|
@@ -1,6 +1,17 @@
|
|
|
1
1
|
import * as Random from '../core/Random.js';
|
|
2
2
|
import { Level, rectCenter, rectsOverlap } from './Level.js';
|
|
3
3
|
import { hallBuilder, pickBuilder } from './RoomBuilders.js';
|
|
4
|
+
/**
|
|
5
|
+
* The two terrain kinds every dungeon needs: wall (index 0) and floor (index 1). A game
|
|
6
|
+
* appends its own kinds (traps, doors) after these via `DungeonOptions.kinds`.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* import { DUNGEON_KINDS } from '@datamoc/mw_games/roguelike';
|
|
11
|
+
*
|
|
12
|
+
* const kinds = [...DUNGEON_KINDS, { passable: false, transparent: true }]; // + a window
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
4
15
|
export const DUNGEON_KINDS = [
|
|
5
16
|
{ passable: false, transparent: false }, //0 wall
|
|
6
17
|
{ passable: true, transparent: true }, //1 floor
|
|
@@ -64,6 +75,22 @@ export function generateDungeonGraph(options) {
|
|
|
64
75
|
level.rooms = placed;
|
|
65
76
|
return { level, graph, retries, roomBuilders };
|
|
66
77
|
}
|
|
78
|
+
/**
|
|
79
|
+
* Rooms joined by corridors, seeded and reproducible.
|
|
80
|
+
*
|
|
81
|
+
* @example
|
|
82
|
+
* ```ts
|
|
83
|
+
* import { generateDungeon, generateDungeonGraph } from '@datamoc/mw_games/roguelike';
|
|
84
|
+
* import { Random } from '@datamoc/mw_games/core';
|
|
85
|
+
*
|
|
86
|
+
* Random.push(12345); // the same seed always produces the same floor
|
|
87
|
+
* const level = generateDungeon({ width: 60, height: 40, rooms: 12 });
|
|
88
|
+
* Random.pop();
|
|
89
|
+
*
|
|
90
|
+
* // generateDungeonGraph is the same pipeline, also returning the room graph and retries
|
|
91
|
+
* const { level: level2, graph, retries, roomBuilders } = generateDungeonGraph({ width: 60, height: 40 });
|
|
92
|
+
* ```
|
|
93
|
+
*/
|
|
67
94
|
export function generateDungeon(options) {
|
|
68
95
|
return generateDungeonGraph(options).level;
|
|
69
96
|
}
|
|
@@ -94,7 +121,20 @@ function carveLine(level, fromCoord, toCoord, fixed, horizontal, floor) {
|
|
|
94
121
|
level.set(x, y, floor);
|
|
95
122
|
}
|
|
96
123
|
}
|
|
97
|
-
/**
|
|
124
|
+
/**
|
|
125
|
+
* A random passable cell, avoiding any listed as taken.
|
|
126
|
+
*
|
|
127
|
+
* @example
|
|
128
|
+
* ```ts
|
|
129
|
+
* import { generateDungeon, findFreeCell, furthestRoom, rectCenter } from '@datamoc/mw_games/roguelike';
|
|
130
|
+
*
|
|
131
|
+
* const level = generateDungeon({ width: 40, height: 30 });
|
|
132
|
+
* const start = rectCenter(level.rooms[0]);
|
|
133
|
+
*
|
|
134
|
+
* const stairsRoom = furthestRoom(level, start); // put the exit far from the entrance
|
|
135
|
+
* const monsterCell = findFreeCell(level, new Set([level.index(start.x, start.y)]));
|
|
136
|
+
* ```
|
|
137
|
+
*/
|
|
98
138
|
export function findFreeCell(level, taken = new Set()) {
|
|
99
139
|
const free = level.passableCells().filter((cell) => !taken.has(cell));
|
|
100
140
|
return free.length > 0 ? free[Random.int(free.length)] : null;
|