about summary refs log tree commit diff
path: root/src/Xanthous/App.hs
diff options
context:
space:
mode:
authorGriffin Smith <root@gws.fyi>2020-01-25T16·38-0500
committerGriffin Smith <root@gws.fyi>2020-01-25T16·38-0500
commit308c7eb4f6cd1e7bb333e438bb4e6c904d9c20ee (patch)
tree299e5788dd029ae9258b1af9101ba42c0e77cdc6 /src/Xanthous/App.hs
parent9256c976edec462af26f33317df6171045e68aa5 (diff)
Add a close command
Add a close command, to close doors, that works basically the same as
the open command.
Diffstat (limited to 'src/Xanthous/App.hs')
-rw-r--r--src/Xanthous/App.hs18
1 files changed, 17 insertions, 1 deletions
diff --git a/src/Xanthous/App.hs b/src/Xanthous/App.hs
index 1c2fbf86f3..0d4f973d71 100644
--- a/src/Xanthous/App.hs
+++ b/src/Xanthous/App.hs
@@ -52,7 +52,7 @@ import qualified Xanthous.Entities.Item as Item
 import           Xanthous.Entities.Creature (Creature)
 import qualified Xanthous.Entities.Creature as Creature
 import           Xanthous.Entities.Environment
-                 (Door, open, locked, GroundMessage(..), Staircase(..))
+                 (Door, open, closed, locked, GroundMessage(..), Staircase(..))
 import           Xanthous.Entities.RawTypes
                  ( edible, eatMessage, hitpointsHealed
                  , attackMessage
@@ -182,6 +182,7 @@ handleCommand Open = do
       doors <- uses entities $ entitiesAtPositionWithType @Door pos
       if | null doors -> say_ ["open", "nothingToOpen"]
          | any (view $ _2 . locked) doors -> say_ ["open", "locked"]
+         | all (view $ _2 . open) doors   -> say_ ["open", "alreadyOpen"]
          | otherwise -> do
              for_ doors $ \(eid, _) ->
                entities . ix eid . positioned . _SomeEntity . open .= True
@@ -190,6 +191,21 @@ handleCommand Open = do
   stepGame -- TODO
   continue
 
+handleCommand Close = do
+  prompt_ @'DirectionPrompt ["close", "prompt"] Cancellable
+    $ \(DirectionResult dir) -> do
+      pos <- move dir <$> use characterPosition
+      doors <- uses entities $ entitiesAtPositionWithType @Door pos
+      if | null doors -> say_ ["close", "nothingToClose"]
+         | all (view $ _2 . closed) doors -> say_ ["close", "alreadyClosed"]
+         | otherwise -> do
+             for_ doors $ \(eid, _) ->
+               entities . ix eid . positioned . _SomeEntity . closed .= True
+             say_ ["close", "success"]
+      pure ()
+  stepGame -- TODO
+  continue
+
 handleCommand Look = do
   prompt_ @'PointOnMap ["look", "prompt"] Cancellable
     $ \(PointOnMapResult pos) ->