diff options
author | Griffin Smith <root@gws.fyi> | 2020-05-16T22·57-0400 |
---|---|---|
committer | Griffin Smith <root@gws.fyi> | 2020-05-16T22·57-0400 |
commit | 15b4f0e6a73987f9afbc46f46862b5120029e715 (patch) | |
tree | 780f05b979e2d01f473ea6a75cb7fc9242cc0b68 /src/Xanthous/App/Autocommands.hs | |
parent | 34cabba896507f2b6523d6aec344ec1c88e453be (diff) |
Stop auto-moving if there's an enemy nearby
If at any point during an auto-move there's an enemy in the character's line of sight, cancel the autocommand and send a message
Diffstat (limited to 'src/Xanthous/App/Autocommands.hs')
-rw-r--r-- | src/Xanthous/App/Autocommands.hs | 37 |
1 files changed, 29 insertions, 8 deletions
diff --git a/src/Xanthous/App/Autocommands.hs b/src/Xanthous/App/Autocommands.hs index e8d94ce741fd..35b92bba7289 100644 --- a/src/Xanthous/App/Autocommands.hs +++ b/src/Xanthous/App/Autocommands.hs @@ -4,16 +4,24 @@ module Xanthous.App.Autocommands , autoStep ) where -------------------------------------------------------------------------------- -import Xanthous.Prelude +import Xanthous.Prelude -------------------------------------------------------------------------------- -import Control.Concurrent (threadDelay) +import Control.Concurrent (threadDelay) +import qualified Data.Aeson as A +import Data.Aeson (object) +import Data.List.NonEmpty (nonEmpty) +import qualified Data.List.NonEmpty as NE +import Control.Monad.State (gets) -------------------------------------------------------------------------------- -import Xanthous.App.Common -import Xanthous.App.Time -import Xanthous.Data -import Xanthous.Data.App -import Xanthous.Entities.Character (speed) -import Xanthous.Game.State +import Xanthous.App.Common +import Xanthous.App.Time +import Xanthous.Data +import Xanthous.Data.App +import Xanthous.Entities.Character (speed) +import Xanthous.Entities.Creature (Creature, creatureType) +import Xanthous.Entities.RawTypes (hostile) +import Xanthous.Game.State +import Xanthous.Game.Lenses (characterVisibleEntities) -------------------------------------------------------------------------------- autoStep :: Autocommand -> AppM () @@ -24,7 +32,20 @@ autoStep (AutoMove dir) = do characterPosition .= newPos stepGameBy =<< uses (character . speed) (|*| 1) describeEntitiesAt newPos + maybeVisibleEnemies <- nonEmpty <$> enemiesInSight + for_ maybeVisibleEnemies $ \visibleEnemies -> do + say ["autoMove", "enemyInSight"] + $ object [ "firstEntity" A..= NE.head visibleEnemies ] + cancelAutocommand Just _ -> cancelAutocommand + where + enemiesInSight :: AppM [Creature] + enemiesInSight = do + ents <- gets characterVisibleEntities + pure $ ents + ^.. folded + . _SomeEntity @Creature + . filtered (view $ creatureType . hostile) -------------------------------------------------------------------------------- |