1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
|
-- | Monadic operations on game messages.
module Game.LambdaHack.Client.UI.MsgM
( msgAddDuplicate, msgAddDistinct, msgAdd, msgLnAdd
, promptMainKeys, recordHistory, tutorialHintMsgAdd
) where
import Prelude ()
import Game.LambdaHack.Core.Prelude
import Game.LambdaHack.Client.MonadClient
import Game.LambdaHack.Client.State
import qualified Game.LambdaHack.Client.UI.HumanCmd as HumanCmd
import qualified Game.LambdaHack.Client.UI.Key as K
import Game.LambdaHack.Client.UI.MonadClientUI
import Game.LambdaHack.Client.UI.Msg
import Game.LambdaHack.Client.UI.SessionUI
import Game.LambdaHack.Client.UI.TutorialHints
(TutorialHints, renderTutorialHints)
import Game.LambdaHack.Client.UI.UIOptions
import Game.LambdaHack.Common.ActorState
import Game.LambdaHack.Common.MonadStateRead
import Game.LambdaHack.Common.State
import Game.LambdaHack.Definition.Defs
sniffMessages :: Bool
sniffMessages = False
-- | Add a shared message to the current report. Say if it was a duplicate.
msgAddDuplicate :: (MonadClientUI m, MsgShared a) => a -> Text -> m Bool
msgAddDuplicate msgClass t = do
sUIOptions <- getsSession sUIOptions
time <- getsState stime
history <- getsSession shistory
curTutorial <- getsSession scurTutorial
overrideTut <- getsSession soverrideTut
usedHints <- getsSession susedHints
lid <- getArenaUI
condInMelee <- condInMeleeM lid
smuteMessages <- getsSession smuteMessages
let displayHints = fromMaybe curTutorial overrideTut
msg = toMsgShared (uMessageColors sUIOptions) msgClass t
(nusedHints, nhistory, duplicate) =
addToReport usedHints displayHints condInMelee history msg time
unless smuteMessages $ do
modifySession $ \sess -> sess {shistory = nhistory, susedHints = nusedHints}
when sniffMessages $ clientPrintUI t
return duplicate
-- | Add a message comprising of two different texts, one to show, the other
-- to save to messages log, to the current report.
msgAddDistinct :: MonadClientUI m => MsgClassDistinct -> (Text, Text) -> m ()
msgAddDistinct msgClass (t1, t2) = do
sUIOptions <- getsSession sUIOptions
time <- getsState stime
history <- getsSession shistory
curTutorial <- getsSession scurTutorial
overrideTut <- getsSession soverrideTut
usedHints <- getsSession susedHints
lid <- getArenaUI
condInMelee <- condInMeleeM lid
smuteMessages <- getsSession smuteMessages
let displayHints = fromMaybe curTutorial overrideTut
msg = toMsgDistinct (uMessageColors sUIOptions) msgClass t1 t2
(nusedHints, nhistory, _) =
addToReport usedHints displayHints condInMelee history msg time
unless smuteMessages $ do
modifySession $ \sess -> sess {shistory = nhistory, susedHints = nusedHints}
when sniffMessages $ clientPrintUI t1
-- | Add a message to the current report.
msgAdd :: (MonadClientUI m, MsgShared a) => a -> Text -> m ()
msgAdd msgClass t = void $ msgAddDuplicate msgClass t
-- | Add a tutorial hint message to the current report.
tutorialHintMsgAdd :: MonadClientUI m => TutorialHints -> m ()
tutorialHintMsgAdd = msgAdd MsgTutorialHint . renderTutorialHints
-- | Add a message to the current report. End previously collected report,
-- if any, with newline.
msgLnAdd :: (MonadClientUI m, MsgShared a) => a -> Text -> m ()
msgLnAdd msgClass t = do
smuteMessages <- getsSession smuteMessages
unless smuteMessages $
modifySession $ \sess -> sess {shistory = addEolToNewReport $ shistory sess}
msgAdd msgClass t
-- | Add a prompt with basic keys description.
promptMainKeys :: MonadClientUI m => m ()
promptMainKeys = do
side <- getsClient sside
ours <- getsState $ fidActorNotProjGlobalAssocs side
revCmd <- revCmdMap
let kmHelp = revCmd HumanCmd.Hint
kmViewStash = revCmd (HumanCmd.ChooseItemMenu (MStore CStash))
kmItemStash = revCmd (HumanCmd.MoveItem [CGround, CEqp] CStash
Nothing False)
kmXhairPointerFloor = revCmd HumanCmd.XhairPointerFloor
saimMode <- getsSession saimMode
UIOptions{uVi, uLeftHand} <- getsSession sUIOptions
xhair <- getsSession sxhair
miniHintAiming <- getMiniHintAiming
-- The silly "axwdqezc" name of keys is chosen to match "hjklyubn",
-- which the usual way of writing them.
let moveKeys | uVi && uLeftHand = "keypad or axwdqezc or hjklyubn"
| uLeftHand = "keypad or axwdqezc"
| uVi = "keypad or hjklyubn"
| otherwise = "keypad"
manyTeammates = length ours > 1
-- @Tab@ here is not a button, which we would write consistently
-- as @TAB@, just as in our internal in-game key naming, but a key name
-- as written on the keyboard, hence most useful to a newbie.
keepTab = if manyTeammates
then "Switch to another teammate with Tab, while all others auto-melee foes, if adjacent, but normally don't chase them."
else ""
describePos = if describeIsNormal
then "Describe map position with MMB or RMB."
else ""
viewEquip = if stashKeysAreNormal
then "View shared 'I'nventory stash and stash items into the 'i'nventory."
else ""
moreHelp = "Press '" <> tshow kmHelp <> "' for more help."
describeIsNormal = kmXhairPointerFloor == K.middleButtonReleaseKM
stashKeysAreNormal = kmViewStash == K.mkChar 'I'
&& kmItemStash == K.mkChar 'i'
keys | isNothing saimMode =
"Explore with" <+> moveKeys <+> "or mouse."
<+> describePos
<+> viewEquip
<+> keepTab
<+> moreHelp
| otherwise =
miniHintAiming
<+> tgtKindVerb xhair
<+> "with" <+> moveKeys <+> "keys or mouse."
<+> keepTab
<+> moreHelp
void $ msgAdd MsgPromptGeneric keys
tgtKindVerb :: Maybe Target -> Text
tgtKindVerb mtgt = case mtgt of
Just TEnemy{} -> "Aim at enemy"
Just TNonEnemy{} -> "Aim at non-enemy"
Just TPoint{} -> "Aim at position"
Just TVector{} -> "Indicate a move vector"
Nothing -> "Start aiming"
-- | Store new report in the history and archive old report.
recordHistory :: MonadClientUI m => m ()
recordHistory =
modifySession $ \sess -> sess {shistory = archiveReport $ shistory sess}
|