LambdaHack-0.11.0.1: A game engine library for tactical squad ASCII roguelike dungeon crawlers

Safe Haskell | None
Language | Haskell2010

Game.LambdaHack.Client.UI

Contents

- Querying the human player
- UI monad operations
- UI session type
- Updating UI state wrt game state changes
- Startup and initialization
- Assorted operations and types
- Internal operations

Description

Ways for the client to use player input via UI to produce server requests, based on the client's view (visualized for the player) of the game state.

This module is leaking quite a bit of implementation details for the sake of Game.LambdaHack.Client.LoopM. After multiplayer is enabled again and the new requirements sorted out, this should be redesigned and some code moved down the module hierarhy tree, exposing a smaller API here.

Synopsis

- queryUI :: (MonadClient m, MonadClientUI m) => m (Maybe RequestUI)
- queryUIunderAI :: (MonadClient m, MonadClientUI m) => m RequestUI
- class MonadClientRead m => MonadClientUI (m :: Type -> Type) where
  - getsSession :: (SessionUI -> a) -> m a
  - modifySession :: (SessionUI -> SessionUI) -> m ()
  - updateClientLeader :: ActorId -> m ()
  - getCacheBfs :: ActorId -> m (Array BfsDistance)
  - getCachePath :: ActorId -> Point -> m (Maybe AndPath)
- putSession :: MonadClientUI m => SessionUI -> m ()
- anyKeyPressed :: MonadClientUI m => m Bool
- resetPressedKeys :: MonadClientUI m => m ()
- data SessionUI = SessionUI {
  - sreqPending :: Maybe RequestUI
  - sreqDelay :: ReqDelay
  - sreqQueried :: Bool
  - sregainControl :: Bool
  - sxhair :: Maybe Target
  - sxhairGoTo :: Maybe Target
  - sactorUI :: ActorDictUI
  - sitemUI :: ItemDictUI
  - sroles :: ItemRoles
  - slastItemMove :: Maybe (CStore, CStore)
  - schanF :: ChanFrontend
  - sccui :: CCUI
  - sUIOptions :: UIOptions
  - saimMode :: Maybe AimMode
  - sxhairMoused :: Bool
  - sitemSel :: Maybe (ItemId, CStore, Bool)
  - sselected :: EnumSet ActorId
  - srunning :: Maybe RunParams
  - shistory :: History
  - svictories :: EnumMap (ContentId ModeKind) (Map Challenge Int)
  - scampings :: EnumSet (ContentId ModeKind)
  - srestarts :: EnumSet (ContentId ModeKind)
  - spointer :: PointUI
  - sautoYes :: Bool
  - smacroFrame :: KeyMacroFrame
  - smacroStack :: [KeyMacroFrame]
  - slastLost :: EnumSet ActorId
  - swaitTimes :: Int
  - swasAutomated :: Bool
  - smarkVision :: Int
  - smarkSmell :: Bool
  - snxtScenario :: Int
  - scurTutorial :: Bool
  - snxtTutorial :: Bool
  - soverrideTut :: Maybe Bool
  - susedHints :: Set Msg
  - smuteMessages :: Bool
  - smenuIxMap :: Map String Int
  - schosenLore :: ChosenLore
  - sdisplayNeeded :: Bool
  - sturnDisplayed :: Bool
  - sreportNull :: Bool
  - sstart :: POSIXTime
  - sgstart :: POSIXTime
  - sallTime :: Time
  - snframes :: Int
  - sallNframes :: Int
  - srandomUI :: SMGen
  }
- data ReqDelay
  - = ReqDelayNot
  - | ReqDelayHandled
  - | ReqDelayAlarm
- emptySessionUI :: UIOptions -> SessionUI
- watchRespUpdAtomicUI :: MonadClientUI m => UpdAtomic -> m ()
- watchRespSfxAtomicUI :: MonadClientUI m => SfxAtomic -> m ()
- data CCUI = CCUI {
  - coinput :: InputContent
  - coscreen :: ScreenContent
  }
- data UIOptions
- applyUIOptions :: COps -> UIOptions -> ClientOptions -> ClientOptions
- uOverrideCmdline :: UIOptions -> [String]
- mkUIOptions :: RuleContent -> ClientOptions -> IO UIOptions
- data ChanFrontend
- chanFrontend :: MonadClientUI m => ScreenContent -> ClientOptions -> m ChanFrontend
- tryRestore :: MonadClientUI m => m (Maybe (StateClient, Maybe SessionUI))
- clientPrintUI :: MonadClientUI m => Text -> m ()
- pushReportFrame :: MonadClientUI m => m ()
- msgAdd :: (MonadClientUI m, MsgShared a) => a -> Text -> m ()
- data MsgClassShow
  - = MsgPromptGeneric
  - | MsgPromptFocus
  - | MsgPromptMention
  - | MsgPromptModify
  - | MsgPromptActors
  - | MsgPromptItems
  - | MsgPromptAction
  - | MsgActionAlert
  - | MsgSpottedThreat
- stepQueryUIwithLeader :: (MonadClient m, MonadClientUI m) => m (Maybe RequestUI)
- stepQueryUI :: (MonadClient m, MonadClientUI m) => m (Maybe ReqUI)

# Querying the human player

queryUI :: (MonadClient m, MonadClientUI m) => m (Maybe RequestUI) Source #

Handle the move of a human player.

queryUIunderAI :: (MonadClient m, MonadClientUI m) => m RequestUI Source #

# UI monad operations

class MonadClientRead m => MonadClientUI (m :: Type -> Type) where Source #

The monad that gives the client access to UI operations, but not to modifying client state, except for the client-side pointman (as opposed to pointman stores in faction data in main game state), which is more of a UI concept, but is shared with AI to be able to keep it when switching AI on/off and to save on typing.

Methods

getsSession :: (SessionUI -> a) -> m a Source #

modifySession :: (SessionUI -> SessionUI) -> m () Source #

updateClientLeader :: ActorId -> m () Source #

getCacheBfs :: ActorId -> m (Array BfsDistance) Source #

getCachePath :: ActorId -> Point -> m (Maybe AndPath) Source #

#### Instances

Instances details

MonadClientUI CliImplementation Source # |

Instance details

Defined in Implementation.MonadClientImplementation

Methods

getsSession :: (SessionUI -> a) -> CliImplementation a Source #

modifySession :: (SessionUI -> SessionUI) -> CliImplementation () Source #

updateClientLeader :: ActorId -> CliImplementation () Source #

getCacheBfs :: ActorId -> CliImplementation (Array BfsDistance) Source #

getCachePath :: ActorId -> Point -> CliImplementation (Maybe AndPath) Source #

putSession :: MonadClientUI m => SessionUI -> m () Source #

anyKeyPressed :: MonadClientUI m => m Bool Source #

resetPressedKeys :: MonadClientUI m => m () Source #

# UI session type

data SessionUI Source #

The information that is used across a human player playing session, including many consecutive games in a single session, including playing different teams. Some of it is saved, some is reset when a new playing session starts. Nothing is tied to a faction/team, but instead all to UI configuration and UI input and display history. An important component is the frontend session.

Constructors

SessionUI |

Fields

- sreqPending :: Maybe RequestUI

  request created by a UI query but not yet sent to the server

- sreqDelay :: ReqDelay

  server delayed sending query to client or receiving request from client

- sreqQueried :: Bool

  player is now queried for a command

- sregainControl :: Bool

  player requested to regain control from AI ASAP

- sxhair :: Maybe Target

  the common xhair

- sxhairGoTo :: Maybe Target

  xhair set for last GoTo

- sactorUI :: ActorDictUI

  assigned actor UI presentations

- sitemUI :: ItemDictUI

  assigned item first seen level

- sroles :: ItemRoles

  assignment of roles to items

- slastItemMove :: Maybe (CStore, CStore)

  last item move stores

- schanF :: ChanFrontend

  connection with the frontend

- sccui :: CCUI

  UI client content

- sUIOptions :: UIOptions

  UI options as set by the player

- saimMode :: Maybe AimMode

  aiming mode

- sxhairMoused :: Bool

  last mouse aiming not vacuus

- sitemSel :: Maybe (ItemId, CStore, Bool)

  selected item, if any, it's store and whether to override suitability check

- sselected :: EnumSet ActorId

  the set of currently selected actors

- srunning :: Maybe RunParams

  parameters of the current run, if any

- shistory :: History

  history of messages

- svictories :: EnumMap (ContentId ModeKind) (Map Challenge Int)

  the number of games won by the UI faction per game mode and per difficulty level

- scampings :: EnumSet (ContentId ModeKind)

  camped games

- srestarts :: EnumSet (ContentId ModeKind)

  restarted games

- spointer :: PointUI

  mouse pointer position

- sautoYes :: Bool

  whether to auto-clear prompts

- smacroFrame :: KeyMacroFrame

  the head of the key macro stack

- smacroStack :: [KeyMacroFrame]

  the tail of the key macro stack

- slastLost :: EnumSet ActorId

  actors that just got out of sight

- swaitTimes :: Int

  player just waited this many times

- swasAutomated :: Bool

  the player just exited AI automation

- smarkVision :: Int

  mark leader and party FOV

- smarkSmell :: Bool

  mark smell, if the leader can smell

- snxtScenario :: Int

  next game scenario number

- scurTutorial :: Bool

  whether current game is a tutorial

- snxtTutorial :: Bool

  whether next game is to be tutorial

- soverrideTut :: Maybe Bool

  override display of tutorial hints

- susedHints :: Set Msg

  tutorial hints already shown this game

- smuteMessages :: Bool

  whether to mute all new messages

- smenuIxMap :: Map String Int

  indices of last used menu items

- schosenLore :: ChosenLore

  last lore chosen to display

- sdisplayNeeded :: Bool

  current level needs displaying

- sturnDisplayed :: Bool

  a frame was already displayed this turn

- sreportNull :: Bool

  whether no visible report created last UI faction turn or the report wiped out from screen since

- sstart :: POSIXTime

  this session start time

- sgstart :: POSIXTime

  this game start time

- sallTime :: Time

  clips from start of session to current game start

- snframes :: Int

  this game current frame count

- sallNframes :: Int

  frame count from start of session to current game start

- srandomUI :: SMGen

  current random generator for UI

#### Instances

Instances details

Binary SessionUI Source # |
Instance details Defined in Game.LambdaHack.Client.UI.SessionUI Methods put :: SessionUI -> Put Source # get :: Get SessionUI Source # putList :: [SessionUI] -> Put Source #

data ReqDelay Source #

Constructors

ReqDelayNot |
ReqDelayHandled |
ReqDelayAlarm |

#### Instances

Instances details

Eq ReqDelay Source # |
Instance details Defined in Game.LambdaHack.Client.UI.SessionUI Methods (==) :: ReqDelay -> ReqDelay -> Bool Source # (/=) :: ReqDelay -> ReqDelay -> Bool Source #

emptySessionUI :: UIOptions -> SessionUI Source #

# Updating UI state wrt game state changes

watchRespUpdAtomicUI :: MonadClientUI m => UpdAtomic -> m () Source #

Visualize atomic updates sent to the client. This is done in the global state after the command is executed and after the client state is modified by the command. Doesn't modify client state (except a few fields), but only client session (e.g., by displaying messages). This is enforced by types.

watchRespSfxAtomicUI :: MonadClientUI m => SfxAtomic -> m () Source #

Display special effects (text, animation) sent to the client. Don't modify client state (except a few fields), but only client session (e.g., by displaying messages). This is enforced by types.

# Startup and initialization

data CCUI Source #

Operations for all UI content types, gathered together.

Constructors

CCUI |

Fields

- coinput :: InputContent
- coscreen :: ScreenContent

data UIOptions Source #

Options that affect the UI of the client, specified in the config file. More documentation is in the default config file.

#### Instances

Instances details

Binary UIOptions Source # |
Instance details Defined in Game.LambdaHack.Client.UI.UIOptions Methods put :: UIOptions -> Put Source # get :: Get UIOptions Source # putList :: [UIOptions] -> Put Source #
NFData UIOptions Source # |
Instance details Defined in Game.LambdaHack.Client.UI.UIOptions Methods rnf :: UIOptions -> () Source #
Generic UIOptions Source # |

Instance details

Defined in Game.LambdaHack.Client.UI.UIOptions

Associated Types

type Rep UIOptions |

Instance details

Defined in Game.LambdaHack.Client.UI.UIOptions

type Rep UIOptions = D1 ('MetaData "UIOptions" "Game.LambdaHack.Client.UI.UIOptions" "LambdaHack-0.11.0.1-BLuOaw8nuizISmzkanqI8h" 'False) (C1 ('MetaCons "UIOptions" 'PrefixI 'True) ((((S1 ('MetaSel ('Just "uCommands") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedStrict) (Rec0 [(KM, CmdTriple)]) :*: S1 ('MetaSel ('Just "uHeroNames") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedStrict) (Rec0 [(Int, (Text, Text))])) :*: (S1 ('MetaSel ('Just "uVi") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedStrict) (Rec0 Bool) :*: S1 ('MetaSel ('Just "uLeftHand") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedStrict) (Rec0 Bool))) :*: ((S1 ('MetaSel ('Just "uChosenFontset") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedStrict) (Rec0 Text) :*: S1 ('MetaSel ('Just "uAllFontsScale") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedStrict) (Rec0 Double)) :*: (S1 ('MetaSel ('Just "uFullscreenMode") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedStrict) (Rec0 FullscreenMode) :*: S1 ('MetaSel ('Just "uhpWarningPercent") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedStrict) (Rec0 Int)))) :*: (((S1 ('MetaSel ('Just "uMsgWrapColumn") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedStrict) (Rec0 X) :*: S1 ('MetaSel ('Just "uHistoryMax") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedStrict) (Rec0 Int)) :*: (S1 ('MetaSel ('Just "uMaxFps") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedStrict) (Rec0 Double) :*: S1 ('MetaSel ('Just "uNoAnim") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedStrict) (Rec0 Bool))) :*: ((S1 ('MetaSel ('Just "uOverrideCmdline") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedStrict) (Rec0 [String]) :*: S1 ('MetaSel ('Just "uFonts") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedStrict) (Rec0 [(Text, FontDefinition)])) :*: (S1 ('MetaSel ('Just "uFontsets") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedStrict) (Rec0 [(Text, FontSet)]) :*: S1 ('MetaSel ('Just "uMessageColors") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedStrict) (Rec0 [(String, Color)]))))))

Methods

from :: UIOptions -> Rep UIOptions x Source #

to :: Rep UIOptions x -> UIOptions Source #

Show UIOptions Source # |
Instance details Defined in Game.LambdaHack.Client.UI.UIOptions Methods showsPrec :: Int -> UIOptions -> ShowS Source # show :: UIOptions -> String Source # showList :: [UIOptions] -> ShowS Source #
type Rep UIOptions Source # |

Instance details

Defined in Game.LambdaHack.Client.UI.UIOptions

type Rep UIOptions = D1 ('MetaData "UIOptions" "Game.LambdaHack.Client.UI.UIOptions" "LambdaHack-0.11.0.1-BLuOaw8nuizISmzkanqI8h" 'False) (C1 ('MetaCons "UIOptions" 'PrefixI 'True) ((((S1 ('MetaSel ('Just "uCommands") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedStrict) (Rec0 [(KM, CmdTriple)]) :*: S1 ('MetaSel ('Just "uHeroNames") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedStrict) (Rec0 [(Int, (Text, Text))])) :*: (S1 ('MetaSel ('Just "uVi") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedStrict) (Rec0 Bool) :*: S1 ('MetaSel ('Just "uLeftHand") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedStrict) (Rec0 Bool))) :*: ((S1 ('MetaSel ('Just "uChosenFontset") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedStrict) (Rec0 Text) :*: S1 ('MetaSel ('Just "uAllFontsScale") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedStrict) (Rec0 Double)) :*: (S1 ('MetaSel ('Just "uFullscreenMode") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedStrict) (Rec0 FullscreenMode) :*: S1 ('MetaSel ('Just "uhpWarningPercent") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedStrict) (Rec0 Int)))) :*: (((S1 ('MetaSel ('Just "uMsgWrapColumn") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedStrict) (Rec0 X) :*: S1 ('MetaSel ('Just "uHistoryMax") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedStrict) (Rec0 Int)) :*: (S1 ('MetaSel ('Just "uMaxFps") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedStrict) (Rec0 Double) :*: S1 ('MetaSel ('Just "uNoAnim") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedStrict) (Rec0 Bool))) :*: ((S1 ('MetaSel ('Just "uOverrideCmdline") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedStrict) (Rec0 [String]) :*: S1 ('MetaSel ('Just "uFonts") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedStrict) (Rec0 [(Text, FontDefinition)])) :*: (S1 ('MetaSel ('Just "uFontsets") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedStrict) (Rec0 [(Text, FontSet)]) :*: S1 ('MetaSel ('Just "uMessageColors") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedStrict) (Rec0 [(String, Color)]))))))

applyUIOptions :: COps -> UIOptions -> ClientOptions -> ClientOptions Source #

Modify client options with UI options.

uOverrideCmdline :: UIOptions -> [String] Source #

mkUIOptions :: RuleContent -> ClientOptions -> IO UIOptions Source #

Read and parse UI config file.

# Assorted operations and types

data ChanFrontend Source #

Connection channel between a frontend and a client. Frontend acts as a server, serving keys, etc., when given frames to display.

chanFrontend :: MonadClientUI m => ScreenContent -> ClientOptions -> m ChanFrontend Source #

Initialize the frontend chosen by the player via client options.

tryRestore :: MonadClientUI m => m (Maybe (StateClient, Maybe SessionUI)) Source #

Try to read saved client game state from the file system.

clientPrintUI :: MonadClientUI m => Text -> m () Source #

pushReportFrame :: MonadClientUI m => m () Source #

msgAdd :: (MonadClientUI m, MsgShared a) => a -> Text -> m () Source #

Add a message to the current report.

data MsgClassShow Source #

Constructors

MsgPromptGeneric |
MsgPromptFocus |
MsgPromptMention |
MsgPromptModify |
MsgPromptActors |
MsgPromptItems |
MsgPromptAction |
MsgActionAlert |
MsgSpottedThreat |

#### Instances

Instances details

MsgShared MsgClassShow Source # |
Instance details Defined in Game.LambdaHack.Client.UI.Msg Methods toMsgShared :: [(String, Color)] -> MsgClassShow -> Text -> Msg Source #
Binary MsgClassShow Source # |
Instance details Defined in Game.LambdaHack.Client.UI.Msg Methods put :: MsgClassShow -> Put Source # get :: Get MsgClassShow Source # putList :: [MsgClassShow] -> Put Source #
Bounded MsgClassShow Source # |
Instance details Defined in Game.LambdaHack.Client.UI.Msg Methods minBound :: MsgClassShow Source # maxBound :: MsgClassShow Source #
Enum MsgClassShow Source # |

Instance details

Defined in Game.LambdaHack.Client.UI.Msg

Methods

succ :: MsgClassShow -> MsgClassShow Source #

pred :: MsgClassShow -> MsgClassShow Source #

toEnum :: Int -> MsgClassShow Source #

fromEnum :: MsgClassShow -> Int Source #

enumFrom :: MsgClassShow -> [MsgClassShow] Source #

enumFromThen :: MsgClassShow -> MsgClassShow -> [MsgClassShow] Source #

enumFromTo :: MsgClassShow -> MsgClassShow -> [MsgClassShow] Source #

enumFromThenTo :: MsgClassShow -> MsgClassShow -> MsgClassShow -> [MsgClassShow] Source #

Generic MsgClassShow Source # |

Instance details

Defined in Game.LambdaHack.Client.UI.Msg

Associated Types

type Rep MsgClassShow |

Instance details

Defined in Game.LambdaHack.Client.UI.Msg

type Rep MsgClassShow = D1 ('MetaData "MsgClassShow" "Game.LambdaHack.Client.UI.Msg" "LambdaHack-0.11.0.1-BLuOaw8nuizISmzkanqI8h" 'False) (((C1 ('MetaCons "MsgPromptGeneric" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "MsgPromptFocus" 'PrefixI 'False) (U1 :: Type -> Type)) :+: (C1 ('MetaCons "MsgPromptMention" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "MsgPromptModify" 'PrefixI 'False) (U1 :: Type -> Type))) :+: ((C1 ('MetaCons "MsgPromptActors" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "MsgPromptItems" 'PrefixI 'False) (U1 :: Type -> Type)) :+: (C1 ('MetaCons "MsgPromptAction" 'PrefixI 'False) (U1 :: Type -> Type) :+: (C1 ('MetaCons "MsgActionAlert" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "MsgSpottedThreat" 'PrefixI 'False) (U1 :: Type -> Type)))))

Methods

from :: MsgClassShow -> Rep MsgClassShow x Source #

to :: Rep MsgClassShow x -> MsgClassShow Source #

Show MsgClassShow Source # |
Instance details Defined in Game.LambdaHack.Client.UI.Msg Methods showsPrec :: Int -> MsgClassShow -> ShowS Source # show :: MsgClassShow -> String Source # showList :: [MsgClassShow] -> ShowS Source #
Eq MsgClassShow Source # |
Instance details Defined in Game.LambdaHack.Client.UI.Msg Methods (==) :: MsgClassShow -> MsgClassShow -> Bool Source # (/=) :: MsgClassShow -> MsgClassShow -> Bool Source #
Ord MsgClassShow Source # |

Instance details

Defined in Game.LambdaHack.Client.UI.Msg

Methods

compare :: MsgClassShow -> MsgClassShow -> Ordering Source #

(<) :: MsgClassShow -> MsgClassShow -> Bool Source #

(<=) :: MsgClassShow -> MsgClassShow -> Bool Source #

(>) :: MsgClassShow -> MsgClassShow -> Bool Source #

(>=) :: MsgClassShow -> MsgClassShow -> Bool Source #

max :: MsgClassShow -> MsgClassShow -> MsgClassShow Source #

min :: MsgClassShow -> MsgClassShow -> MsgClassShow Source #

type Rep MsgClassShow Source # |

Instance details

Defined in Game.LambdaHack.Client.UI.Msg

type Rep MsgClassShow = D1 ('MetaData "MsgClassShow" "Game.LambdaHack.Client.UI.Msg" "LambdaHack-0.11.0.1-BLuOaw8nuizISmzkanqI8h" 'False) (((C1 ('MetaCons "MsgPromptGeneric" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "MsgPromptFocus" 'PrefixI 'False) (U1 :: Type -> Type)) :+: (C1 ('MetaCons "MsgPromptMention" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "MsgPromptModify" 'PrefixI 'False) (U1 :: Type -> Type))) :+: ((C1 ('MetaCons "MsgPromptActors" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "MsgPromptItems" 'PrefixI 'False) (U1 :: Type -> Type)) :+: (C1 ('MetaCons "MsgPromptAction" 'PrefixI 'False) (U1 :: Type -> Type) :+: (C1 ('MetaCons "MsgActionAlert" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "MsgSpottedThreat" 'PrefixI 'False) (U1 :: Type -> Type)))))

# Internal operations

stepQueryUIwithLeader :: (MonadClient m, MonadClientUI m) => m (Maybe RequestUI) Source #

stepQueryUI :: (MonadClient m, MonadClientUI m) => m (Maybe ReqUI) Source #

Let the human player issue commands until any command takes time.