-- | Semantics of human player commands.
module Game.LambdaHack.Client.UI.HandleHumanM
  ( cmdHumanSem
#ifdef EXPOSE_INTERNAL
    -- * Internal operations
  , noRemoteHumanCmd, cmdAction, addNoError
#endif
  ) where

import Prelude ()

import Game.LambdaHack.Core.Prelude

import Game.LambdaHack.Client.MonadClient
import Game.LambdaHack.Client.Request
import Game.LambdaHack.Client.UI.HandleHelperM
import Game.LambdaHack.Client.UI.HandleHumanGlobalM
import Game.LambdaHack.Client.UI.HandleHumanLocalM
import Game.LambdaHack.Client.UI.HumanCmd
import Game.LambdaHack.Client.UI.MonadClientUI

-- | The semantics of human player commands in terms of the client monad.
--
-- Some time cosuming commands are enabled even in aiming mode, but cannot be
-- invoked in aiming mode on a remote level (level different than
-- the level of the leader), which is caught here.
cmdHumanSem :: (MonadClient m, MonadClientUI m)
            => HumanCmd -> m (Either MError ReqUI)
cmdHumanSem :: HumanCmd -> m (Either MError ReqUI)
cmdHumanSem cmd :: HumanCmd
cmd =
  if HumanCmd -> Bool
noRemoteHumanCmd HumanCmd
cmd then do
    -- If in aiming mode, check if the current level is the same
    -- as player level and refuse performing the action otherwise.
    LevelId
arena <- m LevelId
forall (m :: * -> *). MonadClientUI m => m LevelId
getArenaUI
    LevelId
lidV <- m LevelId
forall (m :: * -> *). MonadClientUI m => m LevelId
viewedLevelUI
    if LevelId
arena LevelId -> LevelId -> Bool
forall a. Eq a => a -> a -> Bool
/= LevelId
lidV then
      FailOrCmd ReqUI -> Either MError ReqUI
forall a. FailOrCmd a -> Either MError a
weaveJust (FailOrCmd ReqUI -> Either MError ReqUI)
-> m (FailOrCmd ReqUI) -> m (Either MError ReqUI)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text -> m (FailOrCmd ReqUI)
forall (m :: * -> *) a. MonadClientUI m => Text -> m (FailOrCmd a)
failWith
        "command disabled on a remote level, press ESC to switch back"
    else HumanCmd -> m (Either MError ReqUI)
forall (m :: * -> *).
(MonadClient m, MonadClientUI m) =>
HumanCmd -> m (Either MError ReqUI)
cmdAction HumanCmd
cmd
  else HumanCmd -> m (Either MError ReqUI)
forall (m :: * -> *).
(MonadClient m, MonadClientUI m) =>
HumanCmd -> m (Either MError ReqUI)
cmdAction HumanCmd
cmd

-- | Commands that are forbidden on a remote level, because they
-- would usually take time when invoked on one, but not necessarily do
-- what the player expects. Note that some commands that normally take time
-- are not included, because they don't take time in aiming mode
-- or their individual sanity conditions include a remote level check.
noRemoteHumanCmd :: HumanCmd -> Bool
noRemoteHumanCmd :: HumanCmd -> Bool
noRemoteHumanCmd cmd :: HumanCmd
cmd = case HumanCmd
cmd of
  Wait          -> Bool
True
  Wait10        -> Bool
True
  MoveItem{}    -> Bool
True
  Apply{}       -> Bool
True
  AlterDir{}    -> Bool
True
  AlterWithPointer{} -> Bool
True
  MoveOnceToXhair -> Bool
True
  RunOnceToXhair -> Bool
True
  ContinueToXhair -> Bool
True
  _ -> Bool
False

cmdAction :: (MonadClient m, MonadClientUI m)
          => HumanCmd -> m (Either MError ReqUI)
cmdAction :: HumanCmd -> m (Either MError ReqUI)
cmdAction cmd :: HumanCmd
cmd = case HumanCmd
cmd of
  Macro kms :: [String]
kms -> m () -> m (Either MError ReqUI)
forall (m :: * -> *). Monad m => m () -> m (Either MError ReqUI)
addNoError (m () -> m (Either MError ReqUI))
-> m () -> m (Either MError ReqUI)
forall a b. (a -> b) -> a -> b
$ [String] -> m ()
forall (m :: * -> *). MonadClientUI m => [String] -> m ()
macroHuman [String]
kms
  ByArea l :: [(CmdArea, HumanCmd)]
l -> (HumanCmd -> m (Either MError ReqUI))
-> [(CmdArea, HumanCmd)] -> m (Either MError ReqUI)
forall (m :: * -> *).
MonadClientUI m =>
(HumanCmd -> m (Either MError ReqUI))
-> [(CmdArea, HumanCmd)] -> m (Either MError ReqUI)
byAreaHuman HumanCmd -> m (Either MError ReqUI)
forall (m :: * -> *).
(MonadClient m, MonadClientUI m) =>
HumanCmd -> m (Either MError ReqUI)
cmdAction [(CmdArea, HumanCmd)]
l
  ByAimMode AimModeCmd{..} ->
    m (Either MError ReqUI)
-> m (Either MError ReqUI) -> m (Either MError ReqUI)
forall (m :: * -> *).
MonadClientUI m =>
m (Either MError ReqUI)
-> m (Either MError ReqUI) -> m (Either MError ReqUI)
byAimModeHuman (HumanCmd -> m (Either MError ReqUI)
forall (m :: * -> *).
(MonadClient m, MonadClientUI m) =>
HumanCmd -> m (Either MError ReqUI)
cmdAction HumanCmd
exploration) (HumanCmd -> m (Either MError ReqUI)
forall (m :: * -> *).
(MonadClient m, MonadClientUI m) =>
HumanCmd -> m (Either MError ReqUI)
cmdAction HumanCmd
aiming)
  ComposeIfLocal cmd1 :: HumanCmd
cmd1 cmd2 :: HumanCmd
cmd2 ->
    m (Either MError ReqUI)
-> m (Either MError ReqUI) -> m (Either MError ReqUI)
forall (m :: * -> *).
MonadClientUI m =>
m (Either MError ReqUI)
-> m (Either MError ReqUI) -> m (Either MError ReqUI)
composeIfLocalHuman (HumanCmd -> m (Either MError ReqUI)
forall (m :: * -> *).
(MonadClient m, MonadClientUI m) =>
HumanCmd -> m (Either MError ReqUI)
cmdAction HumanCmd
cmd1) (HumanCmd -> m (Either MError ReqUI)
forall (m :: * -> *).
(MonadClient m, MonadClientUI m) =>
HumanCmd -> m (Either MError ReqUI)
cmdAction HumanCmd
cmd2)
  ComposeUnlessError cmd1 :: HumanCmd
cmd1 cmd2 :: HumanCmd
cmd2 ->
    m (Either MError ReqUI)
-> m (Either MError ReqUI) -> m (Either MError ReqUI)
forall (m :: * -> *).
MonadClientUI m =>
m (Either MError ReqUI)
-> m (Either MError ReqUI) -> m (Either MError ReqUI)
composeUnlessErrorHuman (HumanCmd -> m (Either MError ReqUI)
forall (m :: * -> *).
(MonadClient m, MonadClientUI m) =>
HumanCmd -> m (Either MError ReqUI)
cmdAction HumanCmd
cmd1) (HumanCmd -> m (Either MError ReqUI)
forall (m :: * -> *).
(MonadClient m, MonadClientUI m) =>
HumanCmd -> m (Either MError ReqUI)
cmdAction HumanCmd
cmd2)
  Compose2ndLocal cmd1 :: HumanCmd
cmd1 cmd2 :: HumanCmd
cmd2 ->
    m (Either MError ReqUI)
-> m (Either MError ReqUI) -> m (Either MError ReqUI)
forall (m :: * -> *).
MonadClientUI m =>
m (Either MError ReqUI)
-> m (Either MError ReqUI) -> m (Either MError ReqUI)
compose2ndLocalHuman (HumanCmd -> m (Either MError ReqUI)
forall (m :: * -> *).
(MonadClient m, MonadClientUI m) =>
HumanCmd -> m (Either MError ReqUI)
cmdAction HumanCmd
cmd1) (HumanCmd -> m (Either MError ReqUI)
forall (m :: * -> *).
(MonadClient m, MonadClientUI m) =>
HumanCmd -> m (Either MError ReqUI)
cmdAction HumanCmd
cmd2)
  LoopOnNothing cmd1 :: HumanCmd
cmd1 -> m (Either MError ReqUI) -> m (Either MError ReqUI)
forall (m :: * -> *).
MonadClientUI m =>
m (Either MError ReqUI) -> m (Either MError ReqUI)
loopOnNothingHuman (HumanCmd -> m (Either MError ReqUI)
forall (m :: * -> *).
(MonadClient m, MonadClientUI m) =>
HumanCmd -> m (Either MError ReqUI)
cmdAction HumanCmd
cmd1)
  ExecuteIfClear cmd1 :: HumanCmd
cmd1 -> m (Either MError ReqUI) -> m (Either MError ReqUI)
forall (m :: * -> *).
MonadClientUI m =>
m (Either MError ReqUI) -> m (Either MError ReqUI)
executeIfClearHuman (HumanCmd -> m (Either MError ReqUI)
forall (m :: * -> *).
(MonadClient m, MonadClientUI m) =>
HumanCmd -> m (Either MError ReqUI)
cmdAction HumanCmd
cmd1)

  Wait -> FailOrCmd ReqUI -> Either MError ReqUI
forall a. FailOrCmd a -> Either MError a
weaveJust (FailOrCmd ReqUI -> Either MError ReqUI)
-> m (FailOrCmd ReqUI) -> m (Either MError ReqUI)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (RequestTimed -> ReqUI
ReqUITimed (RequestTimed -> ReqUI)
-> m (Either FailError RequestTimed) -> m (FailOrCmd ReqUI)
forall (f :: * -> *) (g :: * -> *) a b.
(Functor f, Functor g) =>
(a -> b) -> f (g a) -> f (g b)
<$$> m (Either FailError RequestTimed)
forall (m :: * -> *).
MonadClientUI m =>
m (Either FailError RequestTimed)
waitHuman)
  Wait10 -> FailOrCmd ReqUI -> Either MError ReqUI
forall a. FailOrCmd a -> Either MError a
weaveJust (FailOrCmd ReqUI -> Either MError ReqUI)
-> m (FailOrCmd ReqUI) -> m (Either MError ReqUI)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (RequestTimed -> ReqUI
ReqUITimed (RequestTimed -> ReqUI)
-> m (Either FailError RequestTimed) -> m (FailOrCmd ReqUI)
forall (f :: * -> *) (g :: * -> *) a b.
(Functor f, Functor g) =>
(a -> b) -> f (g a) -> f (g b)
<$$> m (Either FailError RequestTimed)
forall (m :: * -> *).
MonadClientUI m =>
m (Either FailError RequestTimed)
waitHuman10)
  Yell -> FailOrCmd ReqUI -> Either MError ReqUI
forall a. FailOrCmd a -> Either MError a
weaveJust (FailOrCmd ReqUI -> Either MError ReqUI)
-> m (FailOrCmd ReqUI) -> m (Either MError ReqUI)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (RequestTimed -> ReqUI
ReqUITimed (RequestTimed -> ReqUI)
-> m (Either FailError RequestTimed) -> m (FailOrCmd ReqUI)
forall (f :: * -> *) (g :: * -> *) a b.
(Functor f, Functor g) =>
(a -> b) -> f (g a) -> f (g b)
<$$> m (Either FailError RequestTimed)
forall (m :: * -> *).
MonadClientUI m =>
m (Either FailError RequestTimed)
yellHuman)
  MoveDir v :: Vector
v ->
    FailOrCmd ReqUI -> Either MError ReqUI
forall a. FailOrCmd a -> Either MError a
weaveJust (FailOrCmd ReqUI -> Either MError ReqUI)
-> m (FailOrCmd ReqUI) -> m (Either MError ReqUI)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (RequestTimed -> ReqUI
ReqUITimed (RequestTimed -> ReqUI)
-> m (Either FailError RequestTimed) -> m (FailOrCmd ReqUI)
forall (f :: * -> *) (g :: * -> *) a b.
(Functor f, Functor g) =>
(a -> b) -> f (g a) -> f (g b)
<$$> Bool
-> Bool
-> Bool
-> Bool
-> Vector
-> m (Either FailError RequestTimed)
forall (m :: * -> *).
(MonadClient m, MonadClientUI m) =>
Bool
-> Bool
-> Bool
-> Bool
-> Vector
-> m (Either FailError RequestTimed)
moveRunHuman Bool
True Bool
True Bool
False Bool
False Vector
v)
  RunDir v :: Vector
v -> FailOrCmd ReqUI -> Either MError ReqUI
forall a. FailOrCmd a -> Either MError a
weaveJust (FailOrCmd ReqUI -> Either MError ReqUI)
-> m (FailOrCmd ReqUI) -> m (Either MError ReqUI)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (RequestTimed -> ReqUI
ReqUITimed (RequestTimed -> ReqUI)
-> m (Either FailError RequestTimed) -> m (FailOrCmd ReqUI)
forall (f :: * -> *) (g :: * -> *) a b.
(Functor f, Functor g) =>
(a -> b) -> f (g a) -> f (g b)
<$$> Bool
-> Bool
-> Bool
-> Bool
-> Vector
-> m (Either FailError RequestTimed)
forall (m :: * -> *).
(MonadClient m, MonadClientUI m) =>
Bool
-> Bool
-> Bool
-> Bool
-> Vector
-> m (Either FailError RequestTimed)
moveRunHuman Bool
True Bool
True Bool
True Bool
True Vector
v)
  RunOnceAhead -> RequestTimed -> ReqUI
ReqUITimed (RequestTimed -> ReqUI)
-> m (Either MError RequestTimed) -> m (Either MError ReqUI)
forall (f :: * -> *) (g :: * -> *) a b.
(Functor f, Functor g) =>
(a -> b) -> f (g a) -> f (g b)
<$$> m (Either MError RequestTimed)
forall (m :: * -> *).
MonadClientUI m =>
m (Either MError RequestTimed)
runOnceAheadHuman
  MoveOnceToXhair -> FailOrCmd ReqUI -> Either MError ReqUI
forall a. FailOrCmd a -> Either MError a
weaveJust (FailOrCmd ReqUI -> Either MError ReqUI)
-> m (FailOrCmd ReqUI) -> m (Either MError ReqUI)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (RequestTimed -> ReqUI
ReqUITimed (RequestTimed -> ReqUI)
-> m (Either FailError RequestTimed) -> m (FailOrCmd ReqUI)
forall (f :: * -> *) (g :: * -> *) a b.
(Functor f, Functor g) =>
(a -> b) -> f (g a) -> f (g b)
<$$> m (Either FailError RequestTimed)
forall (m :: * -> *).
(MonadClient m, MonadClientUI m) =>
m (Either FailError RequestTimed)
moveOnceToXhairHuman)
  RunOnceToXhair  -> FailOrCmd ReqUI -> Either MError ReqUI
forall a. FailOrCmd a -> Either MError a
weaveJust (FailOrCmd ReqUI -> Either MError ReqUI)
-> m (FailOrCmd ReqUI) -> m (Either MError ReqUI)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (RequestTimed -> ReqUI
ReqUITimed (RequestTimed -> ReqUI)
-> m (Either FailError RequestTimed) -> m (FailOrCmd ReqUI)
forall (f :: * -> *) (g :: * -> *) a b.
(Functor f, Functor g) =>
(a -> b) -> f (g a) -> f (g b)
<$$> m (Either FailError RequestTimed)
forall (m :: * -> *).
(MonadClient m, MonadClientUI m) =>
m (Either FailError RequestTimed)
runOnceToXhairHuman)
  ContinueToXhair -> FailOrCmd ReqUI -> Either MError ReqUI
forall a. FailOrCmd a -> Either MError a
weaveJust (FailOrCmd ReqUI -> Either MError ReqUI)
-> m (FailOrCmd ReqUI) -> m (Either MError ReqUI)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (RequestTimed -> ReqUI
ReqUITimed (RequestTimed -> ReqUI)
-> m (Either FailError RequestTimed) -> m (FailOrCmd ReqUI)
forall (f :: * -> *) (g :: * -> *) a b.
(Functor f, Functor g) =>
(a -> b) -> f (g a) -> f (g b)
<$$> m (Either FailError RequestTimed)
forall (m :: * -> *).
(MonadClient m, MonadClientUI m) =>
m (Either FailError RequestTimed)
continueToXhairHuman)
  MoveItem cLegalRaw :: [CStore]
cLegalRaw toCStore :: CStore
toCStore mverb :: Maybe Part
mverb auto :: Bool
auto ->
    FailOrCmd ReqUI -> Either MError ReqUI
forall a. FailOrCmd a -> Either MError a
weaveJust
    (FailOrCmd ReqUI -> Either MError ReqUI)
-> m (FailOrCmd ReqUI) -> m (Either MError ReqUI)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (RequestTimed -> ReqUI
ReqUITimed (RequestTimed -> ReqUI)
-> m (Either FailError RequestTimed) -> m (FailOrCmd ReqUI)
forall (f :: * -> *) (g :: * -> *) a b.
(Functor f, Functor g) =>
(a -> b) -> f (g a) -> f (g b)
<$$> [CStore]
-> CStore
-> Maybe Part
-> Bool
-> m (Either FailError RequestTimed)
forall (m :: * -> *).
MonadClientUI m =>
[CStore]
-> CStore
-> Maybe Part
-> Bool
-> m (Either FailError RequestTimed)
moveItemHuman [CStore]
cLegalRaw CStore
toCStore Maybe Part
mverb Bool
auto)
  Project -> FailOrCmd ReqUI -> Either MError ReqUI
forall a. FailOrCmd a -> Either MError a
weaveJust (FailOrCmd ReqUI -> Either MError ReqUI)
-> m (FailOrCmd ReqUI) -> m (Either MError ReqUI)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (RequestTimed -> ReqUI
ReqUITimed (RequestTimed -> ReqUI)
-> m (Either FailError RequestTimed) -> m (FailOrCmd ReqUI)
forall (f :: * -> *) (g :: * -> *) a b.
(Functor f, Functor g) =>
(a -> b) -> f (g a) -> f (g b)
<$$> m (Either FailError RequestTimed)
forall (m :: * -> *).
(MonadClient m, MonadClientUI m) =>
m (Either FailError RequestTimed)
projectHuman)
  Apply -> FailOrCmd ReqUI -> Either MError ReqUI
forall a. FailOrCmd a -> Either MError a
weaveJust (FailOrCmd ReqUI -> Either MError ReqUI)
-> m (FailOrCmd ReqUI) -> m (Either MError ReqUI)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (RequestTimed -> ReqUI
ReqUITimed (RequestTimed -> ReqUI)
-> m (Either FailError RequestTimed) -> m (FailOrCmd ReqUI)
forall (f :: * -> *) (g :: * -> *) a b.
(Functor f, Functor g) =>
(a -> b) -> f (g a) -> f (g b)
<$$> m (Either FailError RequestTimed)
forall (m :: * -> *).
MonadClientUI m =>
m (Either FailError RequestTimed)
applyHuman)
  AlterDir ts :: [TriggerTile]
ts -> FailOrCmd ReqUI -> Either MError ReqUI
forall a. FailOrCmd a -> Either MError a
weaveJust (FailOrCmd ReqUI -> Either MError ReqUI)
-> m (FailOrCmd ReqUI) -> m (Either MError ReqUI)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (RequestTimed -> ReqUI
ReqUITimed (RequestTimed -> ReqUI)
-> m (Either FailError RequestTimed) -> m (FailOrCmd ReqUI)
forall (f :: * -> *) (g :: * -> *) a b.
(Functor f, Functor g) =>
(a -> b) -> f (g a) -> f (g b)
<$$> [TriggerTile] -> m (Either FailError RequestTimed)
forall (m :: * -> *).
MonadClientUI m =>
[TriggerTile] -> m (Either FailError RequestTimed)
alterDirHuman [TriggerTile]
ts)
  AlterWithPointer ts :: [TriggerTile]
ts -> FailOrCmd ReqUI -> Either MError ReqUI
forall a. FailOrCmd a -> Either MError a
weaveJust
                         (FailOrCmd ReqUI -> Either MError ReqUI)
-> m (FailOrCmd ReqUI) -> m (Either MError ReqUI)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (RequestTimed -> ReqUI
ReqUITimed (RequestTimed -> ReqUI)
-> m (Either FailError RequestTimed) -> m (FailOrCmd ReqUI)
forall (f :: * -> *) (g :: * -> *) a b.
(Functor f, Functor g) =>
(a -> b) -> f (g a) -> f (g b)
<$$> [TriggerTile] -> m (Either FailError RequestTimed)
forall (m :: * -> *).
MonadClientUI m =>
[TriggerTile] -> m (Either FailError RequestTimed)
alterWithPointerHuman [TriggerTile]
ts)
  Help -> (HumanCmd -> m (Either MError ReqUI)) -> m (Either MError ReqUI)
forall (m :: * -> *).
MonadClientUI m =>
(HumanCmd -> m (Either MError ReqUI)) -> m (Either MError ReqUI)
helpHuman HumanCmd -> m (Either MError ReqUI)
forall (m :: * -> *).
(MonadClient m, MonadClientUI m) =>
HumanCmd -> m (Either MError ReqUI)
cmdAction
  Hint -> (HumanCmd -> m (Either MError ReqUI)) -> m (Either MError ReqUI)
forall (m :: * -> *).
MonadClientUI m =>
(HumanCmd -> m (Either MError ReqUI)) -> m (Either MError ReqUI)
hintHuman HumanCmd -> m (Either MError ReqUI)
forall (m :: * -> *).
(MonadClient m, MonadClientUI m) =>
HumanCmd -> m (Either MError ReqUI)
cmdAction
  ItemMenu -> (HumanCmd -> m (Either MError ReqUI)) -> m (Either MError ReqUI)
forall (m :: * -> *).
MonadClientUI m =>
(HumanCmd -> m (Either MError ReqUI)) -> m (Either MError ReqUI)
itemMenuHuman HumanCmd -> m (Either MError ReqUI)
forall (m :: * -> *).
(MonadClient m, MonadClientUI m) =>
HumanCmd -> m (Either MError ReqUI)
cmdAction
  ChooseItemMenu dialogMode :: ItemDialogMode
dialogMode -> (HumanCmd -> m (Either MError ReqUI))
-> ItemDialogMode -> m (Either MError ReqUI)
forall (m :: * -> *).
MonadClientUI m =>
(HumanCmd -> m (Either MError ReqUI))
-> ItemDialogMode -> m (Either MError ReqUI)
chooseItemMenuHuman HumanCmd -> m (Either MError ReqUI)
forall (m :: * -> *).
(MonadClient m, MonadClientUI m) =>
HumanCmd -> m (Either MError ReqUI)
cmdAction ItemDialogMode
dialogMode
  MainMenu -> (HumanCmd -> m (Either MError ReqUI)) -> m (Either MError ReqUI)
forall (m :: * -> *).
MonadClientUI m =>
(HumanCmd -> m (Either MError ReqUI)) -> m (Either MError ReqUI)
mainMenuHuman HumanCmd -> m (Either MError ReqUI)
forall (m :: * -> *).
(MonadClient m, MonadClientUI m) =>
HumanCmd -> m (Either MError ReqUI)
cmdAction
  MainMenuAutoOn -> (HumanCmd -> m (Either MError ReqUI)) -> m (Either MError ReqUI)
forall (m :: * -> *).
MonadClientUI m =>
(HumanCmd -> m (Either MError ReqUI)) -> m (Either MError ReqUI)
mainMenuAutoOnHuman HumanCmd -> m (Either MError ReqUI)
forall (m :: * -> *).
(MonadClient m, MonadClientUI m) =>
HumanCmd -> m (Either MError ReqUI)
cmdAction
  MainMenuAutoOff -> (HumanCmd -> m (Either MError ReqUI)) -> m (Either MError ReqUI)
forall (m :: * -> *).
MonadClientUI m =>
(HumanCmd -> m (Either MError ReqUI)) -> m (Either MError ReqUI)
mainMenuAutoOffHuman HumanCmd -> m (Either MError ReqUI)
forall (m :: * -> *).
(MonadClient m, MonadClientUI m) =>
HumanCmd -> m (Either MError ReqUI)
cmdAction
  Dashboard -> (HumanCmd -> m (Either MError ReqUI)) -> m (Either MError ReqUI)
forall (m :: * -> *).
MonadClientUI m =>
(HumanCmd -> m (Either MError ReqUI)) -> m (Either MError ReqUI)
dashboardHuman HumanCmd -> m (Either MError ReqUI)
forall (m :: * -> *).
(MonadClient m, MonadClientUI m) =>
HumanCmd -> m (Either MError ReqUI)
cmdAction
  GameDifficultyIncr -> m ()
forall (m :: * -> *). MonadClient m => m ()
gameDifficultyIncr m () -> m (Either MError ReqUI) -> m (Either MError ReqUI)
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> (HumanCmd -> m (Either MError ReqUI)) -> m (Either MError ReqUI)
forall (m :: * -> *).
MonadClientUI m =>
(HumanCmd -> m (Either MError ReqUI)) -> m (Either MError ReqUI)
challengesMenuHuman HumanCmd -> m (Either MError ReqUI)
forall (m :: * -> *).
(MonadClient m, MonadClientUI m) =>
HumanCmd -> m (Either MError ReqUI)
cmdAction
  GameWolfToggle -> m ()
forall (m :: * -> *). MonadClient m => m ()
gameWolfToggle m () -> m (Either MError ReqUI) -> m (Either MError ReqUI)
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> (HumanCmd -> m (Either MError ReqUI)) -> m (Either MError ReqUI)
forall (m :: * -> *).
MonadClientUI m =>
(HumanCmd -> m (Either MError ReqUI)) -> m (Either MError ReqUI)
challengesMenuHuman HumanCmd -> m (Either MError ReqUI)
forall (m :: * -> *).
(MonadClient m, MonadClientUI m) =>
HumanCmd -> m (Either MError ReqUI)
cmdAction
  GameFishToggle -> m ()
forall (m :: * -> *). MonadClient m => m ()
gameFishToggle m () -> m (Either MError ReqUI) -> m (Either MError ReqUI)
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> (HumanCmd -> m (Either MError ReqUI)) -> m (Either MError ReqUI)
forall (m :: * -> *).
MonadClientUI m =>
(HumanCmd -> m (Either MError ReqUI)) -> m (Either MError ReqUI)
challengesMenuHuman HumanCmd -> m (Either MError ReqUI)
forall (m :: * -> *).
(MonadClient m, MonadClientUI m) =>
HumanCmd -> m (Either MError ReqUI)
cmdAction
  GameScenarioIncr -> m ()
forall (m :: * -> *). MonadClient m => m ()
gameScenarioIncr m () -> m (Either MError ReqUI) -> m (Either MError ReqUI)
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> (HumanCmd -> m (Either MError ReqUI)) -> m (Either MError ReqUI)
forall (m :: * -> *).
MonadClientUI m =>
(HumanCmd -> m (Either MError ReqUI)) -> m (Either MError ReqUI)
mainMenuHuman HumanCmd -> m (Either MError ReqUI)
forall (m :: * -> *).
(MonadClient m, MonadClientUI m) =>
HumanCmd -> m (Either MError ReqUI)
cmdAction

  GameRestart -> FailOrCmd ReqUI -> Either MError ReqUI
forall a. FailOrCmd a -> Either MError a
weaveJust (FailOrCmd ReqUI -> Either MError ReqUI)
-> m (FailOrCmd ReqUI) -> m (Either MError ReqUI)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m (FailOrCmd ReqUI)
forall (m :: * -> *). MonadClientUI m => m (FailOrCmd ReqUI)
gameRestartHuman
  GameQuit -> FailOrCmd ReqUI -> Either MError ReqUI
forall a. FailOrCmd a -> Either MError a
weaveJust (FailOrCmd ReqUI -> Either MError ReqUI)
-> m (FailOrCmd ReqUI) -> m (Either MError ReqUI)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m (FailOrCmd ReqUI)
forall (m :: * -> *). MonadClientUI m => m (FailOrCmd ReqUI)
gameQuitHuman
  GameDrop -> FailOrCmd ReqUI -> Either MError ReqUI
forall a. FailOrCmd a -> Either MError a
weaveJust (FailOrCmd ReqUI -> Either MError ReqUI)
-> m (FailOrCmd ReqUI) -> m (Either MError ReqUI)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (ReqUI -> FailOrCmd ReqUI) -> m ReqUI -> m (FailOrCmd ReqUI)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ReqUI -> FailOrCmd ReqUI
forall a b. b -> Either a b
Right m ReqUI
forall (m :: * -> *). MonadClientUI m => m ReqUI
gameDropHuman
  GameExit -> FailOrCmd ReqUI -> Either MError ReqUI
forall a. FailOrCmd a -> Either MError a
weaveJust (FailOrCmd ReqUI -> Either MError ReqUI)
-> m (FailOrCmd ReqUI) -> m (Either MError ReqUI)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (ReqUI -> FailOrCmd ReqUI) -> m ReqUI -> m (FailOrCmd ReqUI)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ReqUI -> FailOrCmd ReqUI
forall a b. b -> Either a b
Right m ReqUI
forall (m :: * -> *). MonadClientUI m => m ReqUI
gameExitHuman
  GameSave -> FailOrCmd ReqUI -> Either MError ReqUI
forall a. FailOrCmd a -> Either MError a
weaveJust (FailOrCmd ReqUI -> Either MError ReqUI)
-> m (FailOrCmd ReqUI) -> m (Either MError ReqUI)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (ReqUI -> FailOrCmd ReqUI) -> m ReqUI -> m (FailOrCmd ReqUI)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ReqUI -> FailOrCmd ReqUI
forall a b. b -> Either a b
Right m ReqUI
forall (m :: * -> *). MonadClientUI m => m ReqUI
gameSaveHuman
  Tactic -> FailOrCmd ReqUI -> Either MError ReqUI
forall a. FailOrCmd a -> Either MError a
weaveJust (FailOrCmd ReqUI -> Either MError ReqUI)
-> m (FailOrCmd ReqUI) -> m (Either MError ReqUI)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m (FailOrCmd ReqUI)
forall (m :: * -> *). MonadClientUI m => m (FailOrCmd ReqUI)
tacticHuman
  Automate -> FailOrCmd ReqUI -> Either MError ReqUI
forall a. FailOrCmd a -> Either MError a
weaveJust (FailOrCmd ReqUI -> Either MError ReqUI)
-> m (FailOrCmd ReqUI) -> m (Either MError ReqUI)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m (FailOrCmd ReqUI)
forall (m :: * -> *). MonadClientUI m => m (FailOrCmd ReqUI)
automateHuman
  AutomateToggle -> FailOrCmd ReqUI -> Either MError ReqUI
forall a. FailOrCmd a -> Either MError a
weaveJust (FailOrCmd ReqUI -> Either MError ReqUI)
-> m (FailOrCmd ReqUI) -> m (Either MError ReqUI)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m (FailOrCmd ReqUI)
forall (m :: * -> *). MonadClientUI m => m (FailOrCmd ReqUI)
automateToggleHuman
  AutomateBack -> m (Either MError ReqUI)
forall (m :: * -> *). MonadClientUI m => m (Either MError ReqUI)
automateBackHuman

  ChooseItem dialogMode :: ItemDialogMode
dialogMode -> MError -> Either MError ReqUI
forall a b. a -> Either a b
Left (MError -> Either MError ReqUI)
-> m MError -> m (Either MError ReqUI)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ItemDialogMode -> m MError
forall (m :: * -> *). MonadClientUI m => ItemDialogMode -> m MError
chooseItemHuman ItemDialogMode
dialogMode
  ChooseItemProject ts :: [TriggerItem]
ts -> MError -> Either MError ReqUI
forall a b. a -> Either a b
Left (MError -> Either MError ReqUI)
-> m MError -> m (Either MError ReqUI)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [TriggerItem] -> m MError
forall (m :: * -> *).
(MonadClient m, MonadClientUI m) =>
[TriggerItem] -> m MError
chooseItemProjectHuman [TriggerItem]
ts
  ChooseItemApply ts :: [TriggerItem]
ts -> MError -> Either MError ReqUI
forall a b. a -> Either a b
Left (MError -> Either MError ReqUI)
-> m MError -> m (Either MError ReqUI)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [TriggerItem] -> m MError
forall (m :: * -> *). MonadClientUI m => [TriggerItem] -> m MError
chooseItemApplyHuman [TriggerItem]
ts
  PickLeader k :: Int
k -> MError -> Either MError ReqUI
forall a b. a -> Either a b
Left (MError -> Either MError ReqUI)
-> m MError -> m (Either MError ReqUI)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> m MError
forall (m :: * -> *). MonadClientUI m => Int -> m MError
pickLeaderHuman Int
k
  PickLeaderWithPointer -> MError -> Either MError ReqUI
forall a b. a -> Either a b
Left (MError -> Either MError ReqUI)
-> m MError -> m (Either MError ReqUI)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m MError
forall (m :: * -> *). MonadClientUI m => m MError
pickLeaderWithPointerHuman
  MemberCycle -> MError -> Either MError ReqUI
forall a b. a -> Either a b
Left (MError -> Either MError ReqUI)
-> m MError -> m (Either MError ReqUI)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m MError
forall (m :: * -> *). MonadClientUI m => m MError
memberCycleHuman
  MemberBack -> MError -> Either MError ReqUI
forall a b. a -> Either a b
Left (MError -> Either MError ReqUI)
-> m MError -> m (Either MError ReqUI)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m MError
forall (m :: * -> *). MonadClientUI m => m MError
memberBackHuman
  SelectActor -> m () -> m (Either MError ReqUI)
forall (m :: * -> *). Monad m => m () -> m (Either MError ReqUI)
addNoError m ()
forall (m :: * -> *). MonadClientUI m => m ()
selectActorHuman
  SelectNone -> m () -> m (Either MError ReqUI)
forall (m :: * -> *). Monad m => m () -> m (Either MError ReqUI)
addNoError m ()
forall (m :: * -> *). MonadClientUI m => m ()
selectNoneHuman
  SelectWithPointer -> MError -> Either MError ReqUI
forall a b. a -> Either a b
Left (MError -> Either MError ReqUI)
-> m MError -> m (Either MError ReqUI)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m MError
forall (m :: * -> *). MonadClientUI m => m MError
selectWithPointerHuman
  Repeat n :: Int
n -> m () -> m (Either MError ReqUI)
forall (m :: * -> *). Monad m => m () -> m (Either MError ReqUI)
addNoError (m () -> m (Either MError ReqUI))
-> m () -> m (Either MError ReqUI)
forall a b. (a -> b) -> a -> b
$ Int -> m ()
forall (m :: * -> *). MonadClientUI m => Int -> m ()
repeatHuman Int
n
  Record -> m () -> m (Either MError ReqUI)
forall (m :: * -> *). Monad m => m () -> m (Either MError ReqUI)
addNoError m ()
forall (m :: * -> *). MonadClientUI m => m ()
recordHuman
  AllHistory -> m () -> m (Either MError ReqUI)
forall (m :: * -> *). Monad m => m () -> m (Either MError ReqUI)
addNoError m ()
forall (m :: * -> *). MonadClientUI m => m ()
allHistoryHuman
  LastHistory -> m () -> m (Either MError ReqUI)
forall (m :: * -> *). Monad m => m () -> m (Either MError ReqUI)
addNoError m ()
forall (m :: * -> *). MonadClientUI m => m ()
lastHistoryHuman
  MarkVision -> m ()
forall (m :: * -> *). MonadClientUI m => m ()
markVisionHuman m () -> m (Either MError ReqUI) -> m (Either MError ReqUI)
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> (HumanCmd -> m (Either MError ReqUI)) -> m (Either MError ReqUI)
forall (m :: * -> *).
MonadClientUI m =>
(HumanCmd -> m (Either MError ReqUI)) -> m (Either MError ReqUI)
settingsMenuHuman HumanCmd -> m (Either MError ReqUI)
forall (m :: * -> *).
(MonadClient m, MonadClientUI m) =>
HumanCmd -> m (Either MError ReqUI)
cmdAction
  MarkSmell -> m ()
forall (m :: * -> *). MonadClientUI m => m ()
markSmellHuman m () -> m (Either MError ReqUI) -> m (Either MError ReqUI)
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> (HumanCmd -> m (Either MError ReqUI)) -> m (Either MError ReqUI)
forall (m :: * -> *).
MonadClientUI m =>
(HumanCmd -> m (Either MError ReqUI)) -> m (Either MError ReqUI)
settingsMenuHuman HumanCmd -> m (Either MError ReqUI)
forall (m :: * -> *).
(MonadClient m, MonadClientUI m) =>
HumanCmd -> m (Either MError ReqUI)
cmdAction
  MarkSuspect -> m ()
forall (m :: * -> *). MonadClient m => m ()
markSuspectHuman m () -> m (Either MError ReqUI) -> m (Either MError ReqUI)
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> (HumanCmd -> m (Either MError ReqUI)) -> m (Either MError ReqUI)
forall (m :: * -> *).
MonadClientUI m =>
(HumanCmd -> m (Either MError ReqUI)) -> m (Either MError ReqUI)
settingsMenuHuman HumanCmd -> m (Either MError ReqUI)
forall (m :: * -> *).
(MonadClient m, MonadClientUI m) =>
HumanCmd -> m (Either MError ReqUI)
cmdAction
  SettingsMenu -> (HumanCmd -> m (Either MError ReqUI)) -> m (Either MError ReqUI)
forall (m :: * -> *).
MonadClientUI m =>
(HumanCmd -> m (Either MError ReqUI)) -> m (Either MError ReqUI)
settingsMenuHuman HumanCmd -> m (Either MError ReqUI)
forall (m :: * -> *).
(MonadClient m, MonadClientUI m) =>
HumanCmd -> m (Either MError ReqUI)
cmdAction
  ChallengesMenu -> (HumanCmd -> m (Either MError ReqUI)) -> m (Either MError ReqUI)
forall (m :: * -> *).
MonadClientUI m =>
(HumanCmd -> m (Either MError ReqUI)) -> m (Either MError ReqUI)
challengesMenuHuman HumanCmd -> m (Either MError ReqUI)
forall (m :: * -> *).
(MonadClient m, MonadClientUI m) =>
HumanCmd -> m (Either MError ReqUI)
cmdAction
  PrintScreen -> m () -> m (Either MError ReqUI)
forall (m :: * -> *). Monad m => m () -> m (Either MError ReqUI)
addNoError m ()
forall (m :: * -> *). MonadClientUI m => m ()
printScreenHuman

  Cancel -> m () -> m (Either MError ReqUI)
forall (m :: * -> *). Monad m => m () -> m (Either MError ReqUI)
addNoError m ()
forall (m :: * -> *). MonadClientUI m => m ()
cancelHuman
  Accept -> m () -> m (Either MError ReqUI)
forall (m :: * -> *). Monad m => m () -> m (Either MError ReqUI)
addNoError m ()
forall (m :: * -> *). (MonadClient m, MonadClientUI m) => m ()
acceptHuman
  ClearTargetIfItemClear -> m () -> m (Either MError ReqUI)
forall (m :: * -> *). Monad m => m () -> m (Either MError ReqUI)
addNoError m ()
forall (m :: * -> *). (MonadClient m, MonadClientUI m) => m ()
clearTargetIfItemClearHuman
  ItemClear -> m () -> m (Either MError ReqUI)
forall (m :: * -> *). Monad m => m () -> m (Either MError ReqUI)
addNoError m ()
forall (m :: * -> *). MonadClientUI m => m ()
itemClearHuman
  MoveXhair v :: Vector
v k :: Int
k -> MError -> Either MError ReqUI
forall a b. a -> Either a b
Left (MError -> Either MError ReqUI)
-> m MError -> m (Either MError ReqUI)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Vector -> Int -> m MError
forall (m :: * -> *). MonadClientUI m => Vector -> Int -> m MError
moveXhairHuman Vector
v Int
k
  AimTgt -> MError -> Either MError ReqUI
forall a b. a -> Either a b
Left (MError -> Either MError ReqUI)
-> m MError -> m (Either MError ReqUI)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m MError
forall (m :: * -> *). MonadClientUI m => m MError
aimTgtHuman
  AimFloor -> m () -> m (Either MError ReqUI)
forall (m :: * -> *). Monad m => m () -> m (Either MError ReqUI)
addNoError m ()
forall (m :: * -> *). MonadClientUI m => m ()
aimFloorHuman
  AimEnemy -> m () -> m (Either MError ReqUI)
forall (m :: * -> *). Monad m => m () -> m (Either MError ReqUI)
addNoError m ()
forall (m :: * -> *). MonadClientUI m => m ()
aimEnemyHuman
  AimItem -> m () -> m (Either MError ReqUI)
forall (m :: * -> *). Monad m => m () -> m (Either MError ReqUI)
addNoError m ()
forall (m :: * -> *). MonadClientUI m => m ()
aimItemHuman
  AimAscend k :: Int
k -> MError -> Either MError ReqUI
forall a b. a -> Either a b
Left (MError -> Either MError ReqUI)
-> m MError -> m (Either MError ReqUI)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> m MError
forall (m :: * -> *). MonadClientUI m => Int -> m MError
aimAscendHuman Int
k
  EpsIncr b :: Bool
b -> m () -> m (Either MError ReqUI)
forall (m :: * -> *). Monad m => m () -> m (Either MError ReqUI)
addNoError (m () -> m (Either MError ReqUI))
-> m () -> m (Either MError ReqUI)
forall a b. (a -> b) -> a -> b
$ Bool -> m ()
forall (m :: * -> *).
(MonadClient m, MonadClientUI m) =>
Bool -> m ()
epsIncrHuman Bool
b
  XhairUnknown -> MError -> Either MError ReqUI
forall a b. a -> Either a b
Left (MError -> Either MError ReqUI)
-> m MError -> m (Either MError ReqUI)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m MError
forall (m :: * -> *). (MonadClient m, MonadClientUI m) => m MError
xhairUnknownHuman
  XhairItem -> MError -> Either MError ReqUI
forall a b. a -> Either a b
Left (MError -> Either MError ReqUI)
-> m MError -> m (Either MError ReqUI)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m MError
forall (m :: * -> *). (MonadClient m, MonadClientUI m) => m MError
xhairItemHuman
  XhairStair up :: Bool
up -> MError -> Either MError ReqUI
forall a b. a -> Either a b
Left (MError -> Either MError ReqUI)
-> m MError -> m (Either MError ReqUI)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Bool -> m MError
forall (m :: * -> *).
(MonadClient m, MonadClientUI m) =>
Bool -> m MError
xhairStairHuman Bool
up
  XhairPointerFloor -> m () -> m (Either MError ReqUI)
forall (m :: * -> *). Monad m => m () -> m (Either MError ReqUI)
addNoError m ()
forall (m :: * -> *). MonadClientUI m => m ()
xhairPointerFloorHuman
  XhairPointerEnemy -> m () -> m (Either MError ReqUI)
forall (m :: * -> *). Monad m => m () -> m (Either MError ReqUI)
addNoError m ()
forall (m :: * -> *). MonadClientUI m => m ()
xhairPointerEnemyHuman
  AimPointerFloor -> m () -> m (Either MError ReqUI)
forall (m :: * -> *). Monad m => m () -> m (Either MError ReqUI)
addNoError m ()
forall (m :: * -> *). MonadClientUI m => m ()
aimPointerFloorHuman
  AimPointerEnemy -> m () -> m (Either MError ReqUI)
forall (m :: * -> *). Monad m => m () -> m (Either MError ReqUI)
addNoError m ()
forall (m :: * -> *). MonadClientUI m => m ()
aimPointerEnemyHuman

addNoError :: Monad m => m () -> m (Either MError ReqUI)
addNoError :: m () -> m (Either MError ReqUI)
addNoError cmdCli :: m ()
cmdCli = m ()
cmdCli m () -> m (Either MError ReqUI) -> m (Either MError ReqUI)
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Either MError ReqUI -> m (Either MError ReqUI)
forall (m :: * -> *) a. Monad m => a -> m a
return (MError -> Either MError ReqUI
forall a b. a -> Either a b
Left MError
forall a. Maybe a
Nothing)