module Game.LambdaHack.Client.UI.HandleHumanLocalM
(
macroHuman, macroHumanTransition
, chooseItemHuman, chooseItemDialogMode
, chooseItemProjectHuman, chooseItemApplyHuman
, psuitReq, triggerSymbols, pickLeaderHuman, pickLeaderWithPointerHuman
, pointmanCycleHuman, pointmanCycleLevelHuman
, selectActorHuman, selectNoneHuman, selectWithPointerHuman
, repeatHuman, repeatHumanTransition
, repeatLastHuman, repeatLastHumanTransition
, recordHuman, recordHumanTransition
, allHistoryHuman, lastHistoryHuman
, markVisionHuman, markSmellHuman, markSuspectHuman, markAnimHuman
, overrideTutHuman
, printScreenHuman
, cancelHuman, acceptHuman, detailCycleHuman
, clearTargetIfItemClearHuman, itemClearHuman
, moveXhairHuman, aimTgtHuman, aimFloorHuman, aimEnemyHuman, aimItemHuman
, aimAscendHuman, epsIncrHuman
, xhairUnknownHuman, xhairItemHuman, xhairStairHuman
, xhairPointerFloorHuman, xhairPointerMuteHuman, xhairPointerEnemyHuman
, aimPointerFloorHuman, aimPointerEnemyHuman
#ifdef EXPOSE_INTERNAL
, chooseItemDialogModeLore, permittedProjectClient, projectCheck
, xhairLegalEps, posFromXhair
, permittedApplyClient, eitherHistory, endAiming, endAimingMsg
, doLook, flashAiming
#endif
) where
import Prelude ()
import Game.LambdaHack.Core.Prelude
import Data.Either
import qualified Data.EnumMap.Strict as EM
import qualified Data.EnumSet as ES
import qualified Data.Map.Strict as M
import qualified Data.Text as T
import qualified NLP.Miniutter.English as MU
import Game.LambdaHack.Client.BfsM
import Game.LambdaHack.Client.CommonM
import Game.LambdaHack.Client.MonadClient
import Game.LambdaHack.Client.State
import Game.LambdaHack.Client.UI.ActorUI
import Game.LambdaHack.Client.UI.Animation
import Game.LambdaHack.Client.UI.Content.Screen
import Game.LambdaHack.Client.UI.ContentClientUI
import Game.LambdaHack.Client.UI.DrawM
import Game.LambdaHack.Client.UI.EffectDescription
import Game.LambdaHack.Client.UI.Frame
import Game.LambdaHack.Client.UI.FrameM
import Game.LambdaHack.Client.UI.HandleHelperM
import qualified Game.LambdaHack.Client.UI.HumanCmd as HumanCmd
import Game.LambdaHack.Client.UI.InventoryM
import Game.LambdaHack.Client.UI.ItemSlot
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.MsgM
import Game.LambdaHack.Client.UI.Overlay
import Game.LambdaHack.Client.UI.PointUI
import Game.LambdaHack.Client.UI.SessionUI
import Game.LambdaHack.Client.UI.Slideshow
import Game.LambdaHack.Client.UI.SlideshowM
import Game.LambdaHack.Common.Actor
import Game.LambdaHack.Common.ActorState
import Game.LambdaHack.Common.ClientOptions
import Game.LambdaHack.Common.Faction
import Game.LambdaHack.Common.Item
import qualified Game.LambdaHack.Common.ItemAspect as IA
import Game.LambdaHack.Common.Kind
import Game.LambdaHack.Common.Level
import Game.LambdaHack.Common.Misc
import Game.LambdaHack.Common.MonadStateRead
import Game.LambdaHack.Common.Point
import Game.LambdaHack.Common.ReqFailure
import Game.LambdaHack.Common.State
import qualified Game.LambdaHack.Common.Tile as Tile
import Game.LambdaHack.Common.Time
import Game.LambdaHack.Common.Types
import Game.LambdaHack.Common.Vector
import qualified Game.LambdaHack.Content.ItemKind as IK
import qualified Game.LambdaHack.Content.ModeKind as MK
import Game.LambdaHack.Content.RuleKind
import qualified Game.LambdaHack.Definition.Ability as Ability
import qualified Game.LambdaHack.Definition.Color as Color
import Game.LambdaHack.Definition.Defs
macroHuman :: MonadClientUI m => [String] -> m ()
macroHuman :: [String] -> m ()
macroHuman [String]
ks = do
(SessionUI -> SessionUI) -> m ()
forall (m :: * -> *).
MonadClientUI m =>
(SessionUI -> SessionUI) -> m ()
modifySession ((SessionUI -> SessionUI) -> m ())
-> (SessionUI -> SessionUI) -> m ()
forall a b. (a -> b) -> a -> b
$ \SessionUI
sess ->
let kms :: [KM]
kms = String -> KM
K.mkKM (String -> KM) -> [String] -> [KM]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [String]
ks
(KeyMacroFrame
smacroFrameNew, [KeyMacroFrame]
smacroStackMew) =
[KM]
-> KeyMacroFrame
-> [KeyMacroFrame]
-> (KeyMacroFrame, [KeyMacroFrame])
macroHumanTransition [KM]
kms (SessionUI -> KeyMacroFrame
smacroFrame SessionUI
sess) (SessionUI -> [KeyMacroFrame]
smacroStack SessionUI
sess)
in SessionUI
sess { smacroFrame :: KeyMacroFrame
smacroFrame = KeyMacroFrame
smacroFrameNew
, smacroStack :: [KeyMacroFrame]
smacroStack = [KeyMacroFrame]
smacroStackMew }
MsgClassIgnore -> Text -> m ()
forall (m :: * -> *) a.
(MonadClientUI m, MsgShared a) =>
a -> Text -> m ()
msgAdd MsgClassIgnore
MsgMacroOperation (Text -> m ()) -> Text -> m ()
forall a b. (a -> b) -> a -> b
$ Text
"Macro activated:" Text -> Text -> Text
<+> String -> Text
T.pack ([String] -> String
unwords [String]
ks)
macroHumanTransition :: [K.KM] -> KeyMacroFrame -> [KeyMacroFrame]
-> (KeyMacroFrame, [KeyMacroFrame])
macroHumanTransition :: [KM]
-> KeyMacroFrame
-> [KeyMacroFrame]
-> (KeyMacroFrame, [KeyMacroFrame])
macroHumanTransition [KM]
kms KeyMacroFrame
macroFrame [KeyMacroFrame]
macroFrames =
let smacroFrameNew :: KeyMacroFrame
smacroFrameNew = KeyMacroFrame
emptyMacroFrame {keyPending :: KeyMacro
keyPending = [KM] -> KeyMacro
KeyMacro [KM]
kms}
in (KeyMacroFrame
smacroFrameNew, KeyMacroFrame
macroFrame KeyMacroFrame -> [KeyMacroFrame] -> [KeyMacroFrame]
forall a. a -> [a] -> [a]
: [KeyMacroFrame]
macroFrames)
chooseItemHuman :: MonadClientUI m => ActorId -> ItemDialogMode -> m MError
chooseItemHuman :: ActorId -> ItemDialogMode -> m MError
chooseItemHuman ActorId
leader ItemDialogMode
c =
(FailError -> MError)
-> (ActorId -> MError) -> Either FailError ActorId -> MError
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either FailError -> MError
forall a. a -> Maybe a
Just (MError -> ActorId -> MError
forall a b. a -> b -> a
const MError
forall a. Maybe a
Nothing) (Either FailError ActorId -> MError)
-> m (Either FailError ActorId) -> m MError
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ActorId -> Bool -> ItemDialogMode -> m (Either FailError ActorId)
forall (m :: * -> *).
MonadClientUI m =>
ActorId -> Bool -> ItemDialogMode -> m (Either FailError ActorId)
chooseItemDialogMode ActorId
leader Bool
False ItemDialogMode
c
chooseItemDialogModeLore :: MonadClientUI m => m (Maybe ResultItemDialogMode)
chooseItemDialogModeLore :: m (Maybe ResultItemDialogMode)
chooseItemDialogModeLore = do
ChosenLore
schosenLore <- (SessionUI -> ChosenLore) -> m ChosenLore
forall (m :: * -> *) a. MonadClientUI m => (SessionUI -> a) -> m a
getsSession SessionUI -> ChosenLore
schosenLore
([(ActorId, Actor)]
inhabitants, [(ItemId, ItemQuant)]
embeds) <- case ChosenLore
schosenLore of
ChosenLore [(ActorId, Actor)]
inh [(ItemId, ItemQuant)]
emb -> ([(ActorId, Actor)], [(ItemId, ItemQuant)])
-> m ([(ActorId, Actor)], [(ItemId, ItemQuant)])
forall (m :: * -> *) a. Monad m => a -> m a
return ([(ActorId, Actor)]
inh, [(ItemId, ItemQuant)]
emb)
ChosenLore
ChosenNothing -> m ([(ActorId, Actor)], [(ItemId, ItemQuant)])
forall (m :: * -> *).
MonadClientUI m =>
m ([(ActorId, Actor)], [(ItemId, ItemQuant)])
computeChosenLore
EnumMap ItemId ItemQuant
bagAll <- (State -> EnumMap ItemId ItemQuant) -> m (EnumMap ItemId ItemQuant)
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState ((State -> EnumMap ItemId ItemQuant)
-> m (EnumMap ItemId ItemQuant))
-> (State -> EnumMap ItemId ItemQuant)
-> m (EnumMap ItemId ItemQuant)
forall a b. (a -> b) -> a -> b
$ (Item -> ItemQuant)
-> EnumMap ItemId Item -> EnumMap ItemId ItemQuant
forall a b k. (a -> b) -> EnumMap k a -> EnumMap k b
EM.map (ItemQuant -> Item -> ItemQuant
forall a b. a -> b -> a
const ItemQuant
quantSingle) (EnumMap ItemId Item -> EnumMap ItemId ItemQuant)
-> (State -> EnumMap ItemId Item)
-> State
-> EnumMap ItemId ItemQuant
forall b c a. (b -> c) -> (a -> b) -> a -> c
. State -> EnumMap ItemId Item
sitemD
case [(ActorId, Actor)]
inhabitants of
(ActorId
_, Actor
b) : [(ActorId, Actor)]
rest -> do
let iid :: ItemId
iid = Actor -> ItemId
btrunk Actor
b
AspectRecord
arItem <- (State -> AspectRecord) -> m AspectRecord
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState ((State -> AspectRecord) -> m AspectRecord)
-> (State -> AspectRecord) -> m AspectRecord
forall a b. (a -> b) -> a -> b
$ ItemId -> State -> AspectRecord
aspectRecordFromIid ItemId
iid
let slore :: SLore
slore | Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ Actor -> Bool
bproj Actor
b = SLore
STrunk
| Flag -> AspectRecord -> Bool
IA.checkFlag Flag
Ability.Blast AspectRecord
arItem = SLore
SBlast
| Bool
otherwise = SLore
SItem
SingleItemSlots
lSlots <- ItemDialogMode -> m SingleItemSlots
forall (m :: * -> *).
MonadClientUI m =>
ItemDialogMode -> m SingleItemSlots
slotsOfItemDialogMode (ItemDialogMode -> m SingleItemSlots)
-> ItemDialogMode -> m SingleItemSlots
forall a b. (a -> b) -> a -> b
$ SLore -> ItemDialogMode
MLore SLore
slore
(SessionUI -> SessionUI) -> m ()
forall (m :: * -> *).
MonadClientUI m =>
(SessionUI -> SessionUI) -> m ()
modifySession ((SessionUI -> SessionUI) -> m ())
-> (SessionUI -> SessionUI) -> m ()
forall a b. (a -> b) -> a -> b
$ \SessionUI
sess -> SessionUI
sess {schosenLore :: ChosenLore
schosenLore = [(ActorId, Actor)] -> [(ItemId, ItemQuant)] -> ChosenLore
ChosenLore [(ActorId, Actor)]
rest [(ItemId, ItemQuant)]
embeds}
Maybe ResultItemDialogMode -> m (Maybe ResultItemDialogMode)
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe ResultItemDialogMode -> m (Maybe ResultItemDialogMode))
-> Maybe ResultItemDialogMode -> m (Maybe ResultItemDialogMode)
forall a b. (a -> b) -> a -> b
$ ResultItemDialogMode -> Maybe ResultItemDialogMode
forall a. a -> Maybe a
Just (ResultItemDialogMode -> Maybe ResultItemDialogMode)
-> ResultItemDialogMode -> Maybe ResultItemDialogMode
forall a b. (a -> b) -> a -> b
$ SLore
-> ItemId
-> EnumMap ItemId ItemQuant
-> SingleItemSlots
-> ResultItemDialogMode
RLore SLore
slore ItemId
iid EnumMap ItemId ItemQuant
bagAll SingleItemSlots
lSlots
[] ->
case [(ItemId, ItemQuant)]
embeds of
(ItemId
iid, ItemQuant
_) : [(ItemId, ItemQuant)]
rest -> do
let slore :: SLore
slore = SLore
SEmbed
SingleItemSlots
lSlots <- ItemDialogMode -> m SingleItemSlots
forall (m :: * -> *).
MonadClientUI m =>
ItemDialogMode -> m SingleItemSlots
slotsOfItemDialogMode (ItemDialogMode -> m SingleItemSlots)
-> ItemDialogMode -> m SingleItemSlots
forall a b. (a -> b) -> a -> b
$ SLore -> ItemDialogMode
MLore SLore
slore
(SessionUI -> SessionUI) -> m ()
forall (m :: * -> *).
MonadClientUI m =>
(SessionUI -> SessionUI) -> m ()
modifySession ((SessionUI -> SessionUI) -> m ())
-> (SessionUI -> SessionUI) -> m ()
forall a b. (a -> b) -> a -> b
$ \SessionUI
sess ->
SessionUI
sess {schosenLore :: ChosenLore
schosenLore = [(ActorId, Actor)] -> [(ItemId, ItemQuant)] -> ChosenLore
ChosenLore [(ActorId, Actor)]
inhabitants [(ItemId, ItemQuant)]
rest}
Maybe ResultItemDialogMode -> m (Maybe ResultItemDialogMode)
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe ResultItemDialogMode -> m (Maybe ResultItemDialogMode))
-> Maybe ResultItemDialogMode -> m (Maybe ResultItemDialogMode)
forall a b. (a -> b) -> a -> b
$ ResultItemDialogMode -> Maybe ResultItemDialogMode
forall a. a -> Maybe a
Just (ResultItemDialogMode -> Maybe ResultItemDialogMode)
-> ResultItemDialogMode -> Maybe ResultItemDialogMode
forall a b. (a -> b) -> a -> b
$ SLore
-> ItemId
-> EnumMap ItemId ItemQuant
-> SingleItemSlots
-> ResultItemDialogMode
RLore SLore
slore ItemId
iid EnumMap ItemId ItemQuant
bagAll SingleItemSlots
lSlots
[] -> do
(SessionUI -> SessionUI) -> m ()
forall (m :: * -> *).
MonadClientUI m =>
(SessionUI -> SessionUI) -> m ()
modifySession ((SessionUI -> SessionUI) -> m ())
-> (SessionUI -> SessionUI) -> m ()
forall a b. (a -> b) -> a -> b
$ \SessionUI
sess -> SessionUI
sess {schosenLore :: ChosenLore
schosenLore = ChosenLore
ChosenNothing}
Maybe ResultItemDialogMode -> m (Maybe ResultItemDialogMode)
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe ResultItemDialogMode
forall a. Maybe a
Nothing
chooseItemDialogMode :: MonadClientUI m
=> ActorId -> Bool -> ItemDialogMode
-> m (FailOrCmd ActorId)
chooseItemDialogMode :: ActorId -> Bool -> ItemDialogMode -> m (Either FailError ActorId)
chooseItemDialogMode ActorId
leader0 Bool
permitLoreCycle ItemDialogMode
c = do
CCUI{coscreen :: CCUI -> ScreenContent
coscreen=ScreenContent{X
rwidth :: ScreenContent -> X
rwidth :: X
rwidth, X
rheight :: ScreenContent -> X
rheight :: X
rheight}} <- (SessionUI -> CCUI) -> m CCUI
forall (m :: * -> *) a. MonadClientUI m => (SessionUI -> a) -> m a
getsSession SessionUI -> CCUI
sccui
FontSetup{DisplayFont
propFont :: FontSetup -> DisplayFont
monoFont :: FontSetup -> DisplayFont
squareFont :: FontSetup -> DisplayFont
propFont :: DisplayFont
monoFont :: DisplayFont
squareFont :: DisplayFont
..} <- m FontSetup
forall (m :: * -> *). MonadClientUI m => m FontSetup
getFontSetup
FactionId
side <- (StateClient -> FactionId) -> m FactionId
forall (m :: * -> *) a.
MonadClientRead m =>
(StateClient -> a) -> m a
getsClient StateClient -> FactionId
sside
Faction
fact <- (State -> Faction) -> m Faction
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState ((State -> Faction) -> m Faction)
-> (State -> Faction) -> m Faction
forall a b. (a -> b) -> a -> b
$ (EnumMap FactionId Faction -> FactionId -> Faction
forall k a. Enum k => EnumMap k a -> k -> a
EM.! FactionId
side) (EnumMap FactionId Faction -> Faction)
-> (State -> EnumMap FactionId Faction) -> State -> Faction
forall b c a. (b -> c) -> (a -> b) -> a -> c
. State -> EnumMap FactionId Faction
sfactionD
(Either Text ResultItemDialogMode
ggi, Bool
loreFound) <- do
Maybe ResultItemDialogMode
mggiLore <- if Bool
permitLoreCycle Bool -> Bool -> Bool
&& ItemDialogMode
c ItemDialogMode -> ItemDialogMode -> Bool
forall a. Eq a => a -> a -> Bool
== SLore -> ItemDialogMode
MLore SLore
SItem
then m (Maybe ResultItemDialogMode)
forall (m :: * -> *).
MonadClientUI m =>
m (Maybe ResultItemDialogMode)
chooseItemDialogModeLore
else Maybe ResultItemDialogMode -> m (Maybe ResultItemDialogMode)
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe ResultItemDialogMode
forall a. Maybe a
Nothing
case Maybe ResultItemDialogMode
mggiLore of
Just ResultItemDialogMode
rlore -> (Either Text ResultItemDialogMode, Bool)
-> m (Either Text ResultItemDialogMode, Bool)
forall (m :: * -> *) a. Monad m => a -> m a
return (ResultItemDialogMode -> Either Text ResultItemDialogMode
forall a b. b -> Either a b
Right ResultItemDialogMode
rlore, Bool
True)
Maybe ResultItemDialogMode
Nothing -> do
Either Text ResultItemDialogMode
ggi <- ActorId -> ItemDialogMode -> m (Either Text ResultItemDialogMode)
forall (m :: * -> *).
MonadClientUI m =>
ActorId -> ItemDialogMode -> m (Either Text ResultItemDialogMode)
getStoreItem ActorId
leader0 ItemDialogMode
c
(Either Text ResultItemDialogMode, Bool)
-> m (Either Text ResultItemDialogMode, Bool)
forall (m :: * -> *) a. Monad m => a -> m a
return (Either Text ResultItemDialogMode
ggi, Bool
False)
Maybe ActorId
mleader <- (StateClient -> Maybe ActorId) -> m (Maybe ActorId)
forall (m :: * -> *) a.
MonadClientRead m =>
(StateClient -> a) -> m a
getsClient StateClient -> Maybe ActorId
sleader
let leader :: ActorId
leader = ActorId -> Maybe ActorId -> ActorId
forall a. a -> Maybe a -> a
fromMaybe (String -> ActorId
forall a. HasCallStack => String -> a
error String
"UI manipulation killed the pointman") Maybe ActorId
mleader
m ()
forall (m :: * -> *). MonadClientUI m => m ()
recordHistory
Skills
actorCurAndMaxSk <- (State -> Skills) -> m Skills
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState ((State -> Skills) -> m Skills) -> (State -> Skills) -> m Skills
forall a b. (a -> b) -> a -> b
$ ActorId -> State -> Skills
getActorMaxSkills ActorId
leader
let meleeSkill :: X
meleeSkill = Skill -> Skills -> X
Ability.getSk Skill
Ability.SkHurtMelee Skills
actorCurAndMaxSk
ActorUI
bUI <- (SessionUI -> ActorUI) -> m ActorUI
forall (m :: * -> *) a. MonadClientUI m => (SessionUI -> a) -> m a
getsSession ((SessionUI -> ActorUI) -> m ActorUI)
-> (SessionUI -> ActorUI) -> m ActorUI
forall a b. (a -> b) -> a -> b
$ ActorId -> SessionUI -> ActorUI
getActorUI ActorId
leader
case Either Text ResultItemDialogMode
ggi of
Right ResultItemDialogMode
result -> case ResultItemDialogMode
result of
RStore CStore
fromCStore [ItemId
iid] -> do
(SessionUI -> SessionUI) -> m ()
forall (m :: * -> *).
MonadClientUI m =>
(SessionUI -> SessionUI) -> m ()
modifySession ((SessionUI -> SessionUI) -> m ())
-> (SessionUI -> SessionUI) -> m ()
forall a b. (a -> b) -> a -> b
$ \SessionUI
sess ->
SessionUI
sess {sitemSel :: Maybe (ItemId, CStore, Bool)
sitemSel = (ItemId, CStore, Bool) -> Maybe (ItemId, CStore, Bool)
forall a. a -> Maybe a
Just (ItemId
iid, CStore
fromCStore, Bool
False)}
Either FailError ActorId -> m (Either FailError ActorId)
forall (m :: * -> *) a. Monad m => a -> m a
return (Either FailError ActorId -> m (Either FailError ActorId))
-> Either FailError ActorId -> m (Either FailError ActorId)
forall a b. (a -> b) -> a -> b
$ ActorId -> Either FailError ActorId
forall a b. b -> Either a b
Right ActorId
leader
RStore{} -> String -> m (Either FailError ActorId)
forall a. HasCallStack => String -> a
error (String -> m (Either FailError ActorId))
-> String -> m (Either FailError ActorId)
forall a b. (a -> b) -> a -> b
$ String
"" String -> ResultItemDialogMode -> String
forall v. Show v => String -> v -> String
`showFailure` ResultItemDialogMode
result
ROrgans ItemId
iid EnumMap ItemId ItemQuant
itemBag SingleItemSlots
lSlots -> do
let blurb :: ItemFull -> p
blurb ItemFull
itemFull =
if Flag -> AspectRecord -> Bool
IA.checkFlag Flag
Ability.Condition (AspectRecord -> Bool) -> AspectRecord -> Bool
forall a b. (a -> b) -> a -> b
$ ItemFull -> AspectRecord
aspectRecordFull ItemFull
itemFull
then p
"condition"
else p
"organ"
promptFun :: ItemId -> ItemFull -> X -> Text
promptFun ItemId
_ ItemFull
itemFull X
_ =
[Part] -> Text
makeSentence [ ActorUI -> Part
partActor ActorUI
bUI, Part
"is aware of"
, Part -> Part
MU.AW (Part -> Part) -> Part -> Part
forall a b. (a -> b) -> a -> b
$ ItemFull -> Part
forall p. IsString p => ItemFull -> p
blurb ItemFull
itemFull ]
ix0 :: X
ix0 = X -> Maybe X -> X
forall a. a -> Maybe a -> a
fromMaybe (String -> X
forall a. HasCallStack => String -> a
error (String -> X) -> String -> X
forall a b. (a -> b) -> a -> b
$ String
"" String -> ResultItemDialogMode -> String
forall v. Show v => String -> v -> String
`showFailure` ResultItemDialogMode
result)
(Maybe X -> X) -> Maybe X -> X
forall a b. (a -> b) -> a -> b
$ ItemId -> [ItemId] -> Maybe X
forall a. Eq a => a -> [a] -> Maybe X
elemIndex ItemId
iid ([ItemId] -> Maybe X) -> [ItemId] -> Maybe X
forall a b. (a -> b) -> a -> b
$ SingleItemSlots -> [ItemId]
forall k a. EnumMap k a -> [a]
EM.elems SingleItemSlots
lSlots
KM
km <- EnumMap ItemId ItemQuant
-> X
-> (ItemId -> ItemFull -> X -> Text)
-> X
-> SingleItemSlots
-> Bool
-> m KM
forall (m :: * -> *).
MonadClientUI m =>
EnumMap ItemId ItemQuant
-> X
-> (ItemId -> ItemFull -> X -> Text)
-> X
-> SingleItemSlots
-> Bool
-> m KM
displayItemLore EnumMap ItemId ItemQuant
itemBag X
meleeSkill ItemId -> ItemFull -> X -> Text
promptFun X
ix0 SingleItemSlots
lSlots Bool
False
case KM -> Key
K.key KM
km of
Key
K.Space -> ActorId -> Bool -> ItemDialogMode -> m (Either FailError ActorId)
forall (m :: * -> *).
MonadClientUI m =>
ActorId -> Bool -> ItemDialogMode -> m (Either FailError ActorId)
chooseItemDialogMode ActorId
leader Bool
False ItemDialogMode
MOrgans
Key
K.Esc -> Text -> m (Either FailError ActorId)
forall (m :: * -> *) a. MonadClientUI m => Text -> m (FailOrCmd a)
failWith Text
"never mind"
Key
_ -> String -> m (Either FailError ActorId)
forall a. HasCallStack => String -> a
error (String -> m (Either FailError ActorId))
-> String -> m (Either FailError ActorId)
forall a b. (a -> b) -> a -> b
$ String
"" String -> KM -> String
forall v. Show v => String -> v -> String
`showFailure` KM
km
ROwned ItemId
iid -> do
[(ActorId, (Actor, CStore))]
found <- (State -> [(ActorId, (Actor, CStore))])
-> m [(ActorId, (Actor, CStore))]
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState ((State -> [(ActorId, (Actor, CStore))])
-> m [(ActorId, (Actor, CStore))])
-> (State -> [(ActorId, (Actor, CStore))])
-> m [(ActorId, (Actor, CStore))]
forall a b. (a -> b) -> a -> b
$ ActorId
-> FactionId -> ItemId -> State -> [(ActorId, (Actor, CStore))]
findIid ActorId
leader FactionId
side ItemId
iid
let (ActorId
newAid, CStore
bestStore) = case ActorId
leader ActorId -> [(ActorId, (Actor, CStore))] -> Maybe (Actor, CStore)
forall a b. Eq a => a -> [(a, b)] -> Maybe b
`lookup` [(ActorId, (Actor, CStore))]
found of
Just (Actor
_, CStore
store) -> (ActorId
leader, CStore
store)
Maybe (Actor, CStore)
Nothing -> case [(ActorId, (Actor, CStore))]
found of
(ActorId
aid, (Actor
_, CStore
store)) : [(ActorId, (Actor, CStore))]
_ -> (ActorId
aid, CStore
store)
[] -> String -> (ActorId, CStore)
forall a. HasCallStack => String -> a
error (String -> (ActorId, CStore)) -> String -> (ActorId, CStore)
forall a b. (a -> b) -> a -> b
$ String
"" String -> ResultItemDialogMode -> String
forall v. Show v => String -> v -> String
`showFailure` ResultItemDialogMode
result
(SessionUI -> SessionUI) -> m ()
forall (m :: * -> *).
MonadClientUI m =>
(SessionUI -> SessionUI) -> m ()
modifySession ((SessionUI -> SessionUI) -> m ())
-> (SessionUI -> SessionUI) -> m ()
forall a b. (a -> b) -> a -> b
$ \SessionUI
sess ->
SessionUI
sess {sitemSel :: Maybe (ItemId, CStore, Bool)
sitemSel = (ItemId, CStore, Bool) -> Maybe (ItemId, CStore, Bool)
forall a. a -> Maybe a
Just (ItemId
iid, CStore
bestStore, Bool
False)}
LevelId
arena <- m LevelId
forall (m :: * -> *). MonadClientUI m => m LevelId
getArenaUI
Actor
b2 <- (State -> Actor) -> m Actor
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState ((State -> Actor) -> m Actor) -> (State -> Actor) -> m Actor
forall a b. (a -> b) -> a -> b
$ ActorId -> State -> Actor
getActorBody ActorId
newAid
let (Bool
autoDun, Bool
_) = Faction -> (Bool, Bool)
autoDungeonLevel Faction
fact
if | ActorId
newAid ActorId -> ActorId -> Bool
forall a. Eq a => a -> a -> Bool
== ActorId
leader -> Either FailError ActorId -> m (Either FailError ActorId)
forall (m :: * -> *) a. Monad m => a -> m a
return (Either FailError ActorId -> m (Either FailError ActorId))
-> Either FailError ActorId -> m (Either FailError ActorId)
forall a b. (a -> b) -> a -> b
$ ActorId -> Either FailError ActorId
forall a b. b -> Either a b
Right ActorId
leader
| Actor -> LevelId
blid Actor
b2 LevelId -> LevelId -> Bool
forall a. Eq a => a -> a -> Bool
/= LevelId
arena Bool -> Bool -> Bool
&& Bool
autoDun ->
ReqFailure -> m (Either FailError ActorId)
forall (m :: * -> *) a.
MonadClientUI m =>
ReqFailure -> m (FailOrCmd a)
failSer ReqFailure
NoChangeDunLeader
| Bool
otherwise -> do
m Bool -> m ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (m Bool -> m ()) -> m Bool -> m ()
forall a b. (a -> b) -> a -> b
$ Bool -> ActorId -> m Bool
forall (m :: * -> *). MonadClientUI m => Bool -> ActorId -> m Bool
pickLeader Bool
True ActorId
newAid
Either FailError ActorId -> m (Either FailError ActorId)
forall (m :: * -> *) a. Monad m => a -> m a
return (Either FailError ActorId -> m (Either FailError ActorId))
-> Either FailError ActorId -> m (Either FailError ActorId)
forall a b. (a -> b) -> a -> b
$ ActorId -> Either FailError ActorId
forall a b. b -> Either a b
Right ActorId
newAid
RSkills X
slotIndex0 -> do
let slotListBound :: X
slotListBound = [Skill] -> X
forall a. [a] -> X
length [Skill]
skillSlots X -> X -> X
forall a. Num a => a -> a -> a
- X
1
displayOneSlot :: X -> m (Either FailError ActorId)
displayOneSlot X
slotIndex = do
(Text
prompt2, AttrString
attrString) <- ActorId -> X -> m (Text, AttrString)
forall (m :: * -> *).
MonadClientUI m =>
ActorId -> X -> m (Text, AttrString)
skillCloseUp ActorId
leader X
slotIndex
let ov0 :: EnumMap DisplayFont Overlay
ov0 = DisplayFont -> Overlay -> EnumMap DisplayFont Overlay
forall k a. Enum k => k -> a -> EnumMap k a
EM.singleton DisplayFont
propFont
(Overlay -> EnumMap DisplayFont Overlay)
-> Overlay -> EnumMap DisplayFont Overlay
forall a b. (a -> b) -> a -> b
$ [AttrLine] -> Overlay
offsetOverlay
([AttrLine] -> Overlay) -> [AttrLine] -> Overlay
forall a b. (a -> b) -> a -> b
$ X -> X -> AttrString -> [AttrLine]
splitAttrString X
rwidth X
rwidth AttrString
attrString
keys :: [KM]
keys = [KM
K.spaceKM, KM
K.escKM]
[KM] -> [KM] -> [KM]
forall a. [a] -> [a] -> [a]
++ [KM
K.upKM | X
slotIndex X -> X -> Bool
forall a. Eq a => a -> a -> Bool
/= X
0]
[KM] -> [KM] -> [KM]
forall a. [a] -> [a] -> [a]
++ [KM
K.downKM | X
slotIndex X -> X -> Bool
forall a. Eq a => a -> a -> Bool
/= X
slotListBound]
MsgClassShow -> Text -> m ()
forall (m :: * -> *) a.
(MonadClientUI m, MsgShared a) =>
a -> Text -> m ()
msgAdd MsgClassShow
MsgPromptGeneric Text
prompt2
Slideshow
slides <- X -> [KM] -> OKX -> m Slideshow
forall (m :: * -> *).
MonadClientUI m =>
X -> [KM] -> OKX -> m Slideshow
overlayToSlideshow (X
rheight X -> X -> X
forall a. Num a => a -> a -> a
- X
2) [KM]
keys (EnumMap DisplayFont Overlay
ov0, [])
KM
km <- ColorMode -> [KM] -> Slideshow -> m KM
forall (m :: * -> *).
MonadClientUI m =>
ColorMode -> [KM] -> Slideshow -> m KM
getConfirms ColorMode
ColorFull [KM]
keys Slideshow
slides
case KM -> Key
K.key KM
km of
Key
K.Space -> ActorId -> Bool -> ItemDialogMode -> m (Either FailError ActorId)
forall (m :: * -> *).
MonadClientUI m =>
ActorId -> Bool -> ItemDialogMode -> m (Either FailError ActorId)
chooseItemDialogMode ActorId
leader Bool
False ItemDialogMode
MSkills
Key
K.Up -> X -> m (Either FailError ActorId)
displayOneSlot (X -> m (Either FailError ActorId))
-> X -> m (Either FailError ActorId)
forall a b. (a -> b) -> a -> b
$ X
slotIndex X -> X -> X
forall a. Num a => a -> a -> a
- X
1
Key
K.Down -> X -> m (Either FailError ActorId)
displayOneSlot (X -> m (Either FailError ActorId))
-> X -> m (Either FailError ActorId)
forall a b. (a -> b) -> a -> b
$ X
slotIndex X -> X -> X
forall a. Num a => a -> a -> a
+ X
1
Key
K.Esc -> Text -> m (Either FailError ActorId)
forall (m :: * -> *) a. MonadClientUI m => Text -> m (FailOrCmd a)
failWith Text
"never mind"
Key
_ -> String -> m (Either FailError ActorId)
forall a. HasCallStack => String -> a
error (String -> m (Either FailError ActorId))
-> String -> m (Either FailError ActorId)
forall a b. (a -> b) -> a -> b
$ String
"" String -> KM -> String
forall v. Show v => String -> v -> String
`showFailure` KM
km
X -> m (Either FailError ActorId)
displayOneSlot X
slotIndex0
RLore SLore
slore ItemId
iid EnumMap ItemId ItemQuant
itemBag SingleItemSlots
lSlots -> do
let ix0 :: X
ix0 = X -> Maybe X -> X
forall a. a -> Maybe a -> a
fromMaybe (String -> X
forall a. HasCallStack => String -> a
error (String -> X) -> String -> X
forall a b. (a -> b) -> a -> b
$ String
"" String -> ResultItemDialogMode -> String
forall v. Show v => String -> v -> String
`showFailure` ResultItemDialogMode
result)
(Maybe X -> X) -> Maybe X -> X
forall a b. (a -> b) -> a -> b
$ ItemId -> [ItemId] -> Maybe X
forall a. Eq a => a -> [a] -> Maybe X
elemIndex ItemId
iid ([ItemId] -> Maybe X) -> [ItemId] -> Maybe X
forall a b. (a -> b) -> a -> b
$ SingleItemSlots -> [ItemId]
forall k a. EnumMap k a -> [a]
EM.elems SingleItemSlots
lSlots
promptFun :: ItemId -> ItemFull -> X -> Text
promptFun ItemId
_ ItemFull
_ X
_ =
[Part] -> Text
makeSentence [ Part -> Part -> Part
MU.SubjectVerbSg (ActorUI -> Part
partActor ActorUI
bUI) Part
"remember"
, Part -> Part
MU.AW (Part -> Part) -> Part -> Part
forall a b. (a -> b) -> a -> b
$ Text -> Part
MU.Text (SLore -> Text
headingSLore SLore
slore) ]
ChosenLore
schosenLore <- (SessionUI -> ChosenLore) -> m ChosenLore
forall (m :: * -> *) a. MonadClientUI m => (SessionUI -> a) -> m a
getsSession SessionUI -> ChosenLore
schosenLore
let lorePending :: Bool
lorePending = Bool
loreFound Bool -> Bool -> Bool
&& case ChosenLore
schosenLore of
ChosenLore [] [] -> Bool
False
ChosenLore
_ -> Bool
True
KM
km <- EnumMap ItemId ItemQuant
-> X
-> (ItemId -> ItemFull -> X -> Text)
-> X
-> SingleItemSlots
-> Bool
-> m KM
forall (m :: * -> *).
MonadClientUI m =>
EnumMap ItemId ItemQuant
-> X
-> (ItemId -> ItemFull -> X -> Text)
-> X
-> SingleItemSlots
-> Bool
-> m KM
displayItemLore EnumMap ItemId ItemQuant
itemBag X
meleeSkill ItemId -> ItemFull -> X -> Text
promptFun X
ix0
SingleItemSlots
lSlots Bool
lorePending
case KM -> Key
K.key KM
km of
Key
K.Space -> do
(SessionUI -> SessionUI) -> m ()
forall (m :: * -> *).
MonadClientUI m =>
(SessionUI -> SessionUI) -> m ()
modifySession ((SessionUI -> SessionUI) -> m ())
-> (SessionUI -> SessionUI) -> m ()
forall a b. (a -> b) -> a -> b
$ \SessionUI
sess -> SessionUI
sess {schosenLore :: ChosenLore
schosenLore = ChosenLore
ChosenNothing}
ActorId -> Bool -> ItemDialogMode -> m (Either FailError ActorId)
forall (m :: * -> *).
MonadClientUI m =>
ActorId -> Bool -> ItemDialogMode -> m (Either FailError ActorId)
chooseItemDialogMode ActorId
leader Bool
False (SLore -> ItemDialogMode
MLore SLore
slore)
K.Char Char
'~' -> ActorId -> Bool -> ItemDialogMode -> m (Either FailError ActorId)
forall (m :: * -> *).
MonadClientUI m =>
ActorId -> Bool -> ItemDialogMode -> m (Either FailError ActorId)
chooseItemDialogMode ActorId
leader Bool
True ItemDialogMode
c
Key
K.Esc -> do
(SessionUI -> SessionUI) -> m ()
forall (m :: * -> *).
MonadClientUI m =>
(SessionUI -> SessionUI) -> m ()
modifySession ((SessionUI -> SessionUI) -> m ())
-> (SessionUI -> SessionUI) -> m ()
forall a b. (a -> b) -> a -> b
$ \SessionUI
sess -> SessionUI
sess {schosenLore :: ChosenLore
schosenLore = ChosenLore
ChosenNothing}
Text -> m (Either FailError ActorId)
forall (m :: * -> *) a. MonadClientUI m => Text -> m (FailOrCmd a)
failWith Text
"never mind"
Key
_ -> String -> m (Either FailError ActorId)
forall a. HasCallStack => String -> a
error (String -> m (Either FailError ActorId))
-> String -> m (Either FailError ActorId)
forall a b. (a -> b) -> a -> b
$ String
"" String -> KM -> String
forall v. Show v => String -> v -> String
`showFailure` KM
km
RPlaces X
slotIndex0 -> do
COps{ContentData PlaceKind
coplace :: COps -> ContentData PlaceKind
coplace :: ContentData PlaceKind
coplace} <- (State -> COps) -> m COps
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState State -> COps
scops
ClientOptions
soptions <- (StateClient -> ClientOptions) -> m ClientOptions
forall (m :: * -> *) a.
MonadClientRead m =>
(StateClient -> a) -> m a
getsClient StateClient -> ClientOptions
soptions
[(ContentId PlaceKind, (EnumSet LevelId, X, X, X))]
places <- (State -> [(ContentId PlaceKind, (EnumSet LevelId, X, X, X))])
-> m [(ContentId PlaceKind, (EnumSet LevelId, X, X, X))]
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState ((State -> [(ContentId PlaceKind, (EnumSet LevelId, X, X, X))])
-> m [(ContentId PlaceKind, (EnumSet LevelId, X, X, X))])
-> (State -> [(ContentId PlaceKind, (EnumSet LevelId, X, X, X))])
-> m [(ContentId PlaceKind, (EnumSet LevelId, X, X, X))]
forall a b. (a -> b) -> a -> b
$ EnumMap (ContentId PlaceKind) (EnumSet LevelId, X, X, X)
-> [(ContentId PlaceKind, (EnumSet LevelId, X, X, X))]
forall k a. Enum k => EnumMap k a -> [(k, a)]
EM.assocs
(EnumMap (ContentId PlaceKind) (EnumSet LevelId, X, X, X)
-> [(ContentId PlaceKind, (EnumSet LevelId, X, X, X))])
-> (State
-> EnumMap (ContentId PlaceKind) (EnumSet LevelId, X, X, X))
-> State
-> [(ContentId PlaceKind, (EnumSet LevelId, X, X, X))]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ContentData PlaceKind
-> Bool
-> State
-> EnumMap (ContentId PlaceKind) (EnumSet LevelId, X, X, X)
placesFromState ContentData PlaceKind
coplace (ClientOptions -> Bool
sexposePlaces ClientOptions
soptions)
let slotListBound :: X
slotListBound = [(ContentId PlaceKind, (EnumSet LevelId, X, X, X))] -> X
forall a. [a] -> X
length [(ContentId PlaceKind, (EnumSet LevelId, X, X, X))]
places X -> X -> X
forall a. Num a => a -> a -> a
- X
1
displayOneSlot :: X -> m (Either FailError ActorId)
displayOneSlot X
slotIndex = do
(Text
prompt2, [(DisplayFont, [Text])]
blurbs) <-
[(ContentId PlaceKind, (EnumSet LevelId, X, X, X))]
-> Bool -> X -> m (Text, [(DisplayFont, [Text])])
forall (m :: * -> *).
MonadClientUI m =>
[(ContentId PlaceKind, (EnumSet LevelId, X, X, X))]
-> Bool -> X -> m (Text, [(DisplayFont, [Text])])
placeCloseUp [(ContentId PlaceKind, (EnumSet LevelId, X, X, X))]
places (ClientOptions -> Bool
sexposePlaces ClientOptions
soptions) X
slotIndex
let splitText :: Text -> [AttrLine]
splitText = X -> X -> AttrString -> [AttrLine]
splitAttrString X
rwidth X
rwidth (AttrString -> [AttrLine])
-> (Text -> AttrString) -> Text -> [AttrLine]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> AttrString
textToAS
ov0 :: EnumMap DisplayFont Overlay
ov0 = [(DisplayFont, [AttrLine])] -> EnumMap DisplayFont Overlay
attrLinesToFontMap
([(DisplayFont, [AttrLine])] -> EnumMap DisplayFont Overlay)
-> [(DisplayFont, [AttrLine])] -> EnumMap DisplayFont Overlay
forall a b. (a -> b) -> a -> b
$ ((DisplayFont, [Text]) -> (DisplayFont, [AttrLine]))
-> [(DisplayFont, [Text])] -> [(DisplayFont, [AttrLine])]
forall a b. (a -> b) -> [a] -> [b]
map (([Text] -> [AttrLine])
-> (DisplayFont, [Text]) -> (DisplayFont, [AttrLine])
forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (d, b) (d, c)
second ((Text -> [AttrLine]) -> [Text] -> [AttrLine]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap Text -> [AttrLine]
splitText)) [(DisplayFont, [Text])]
blurbs
keys :: [KM]
keys = [KM
K.spaceKM, KM
K.escKM]
[KM] -> [KM] -> [KM]
forall a. [a] -> [a] -> [a]
++ [KM
K.upKM | X
slotIndex X -> X -> Bool
forall a. Eq a => a -> a -> Bool
/= X
0]
[KM] -> [KM] -> [KM]
forall a. [a] -> [a] -> [a]
++ [KM
K.downKM | X
slotIndex X -> X -> Bool
forall a. Eq a => a -> a -> Bool
/= X
slotListBound]
MsgClassShow -> Text -> m ()
forall (m :: * -> *) a.
(MonadClientUI m, MsgShared a) =>
a -> Text -> m ()
msgAdd MsgClassShow
MsgPromptGeneric Text
prompt2
Slideshow
slides <- X -> [KM] -> OKX -> m Slideshow
forall (m :: * -> *).
MonadClientUI m =>
X -> [KM] -> OKX -> m Slideshow
overlayToSlideshow (X
rheight X -> X -> X
forall a. Num a => a -> a -> a
- X
2) [KM]
keys (EnumMap DisplayFont Overlay
ov0, [])
KM
km <- ColorMode -> [KM] -> Slideshow -> m KM
forall (m :: * -> *).
MonadClientUI m =>
ColorMode -> [KM] -> Slideshow -> m KM
getConfirms ColorMode
ColorFull [KM]
keys Slideshow
slides
case KM -> Key
K.key KM
km of
Key
K.Space -> ActorId -> Bool -> ItemDialogMode -> m (Either FailError ActorId)
forall (m :: * -> *).
MonadClientUI m =>
ActorId -> Bool -> ItemDialogMode -> m (Either FailError ActorId)
chooseItemDialogMode ActorId
leader Bool
False ItemDialogMode
MPlaces
Key
K.Up -> X -> m (Either FailError ActorId)
displayOneSlot (X -> m (Either FailError ActorId))
-> X -> m (Either FailError ActorId)
forall a b. (a -> b) -> a -> b
$ X
slotIndex X -> X -> X
forall a. Num a => a -> a -> a
- X
1
Key
K.Down -> X -> m (Either FailError ActorId)
displayOneSlot (X -> m (Either FailError ActorId))
-> X -> m (Either FailError ActorId)
forall a b. (a -> b) -> a -> b
$ X
slotIndex X -> X -> X
forall a. Num a => a -> a -> a
+ X
1
Key
K.Esc -> Text -> m (Either FailError ActorId)
forall (m :: * -> *) a. MonadClientUI m => Text -> m (FailOrCmd a)
failWith Text
"never mind"
Key
_ -> String -> m (Either FailError ActorId)
forall a. HasCallStack => String -> a
error (String -> m (Either FailError ActorId))
-> String -> m (Either FailError ActorId)
forall a b. (a -> b) -> a -> b
$ String
"" String -> KM -> String
forall v. Show v => String -> v -> String
`showFailure` KM
km
X -> m (Either FailError ActorId)
displayOneSlot X
slotIndex0
RModes X
slotIndex0 -> do
COps{ContentData ModeKind
comode :: COps -> ContentData ModeKind
comode :: ContentData ModeKind
comode} <- (State -> COps) -> m COps
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState State -> COps
scops
EnumMap (ContentId ModeKind) (Map Challenge X)
svictories <- (StateClient -> EnumMap (ContentId ModeKind) (Map Challenge X))
-> m (EnumMap (ContentId ModeKind) (Map Challenge X))
forall (m :: * -> *) a.
MonadClientRead m =>
(StateClient -> a) -> m a
getsClient StateClient -> EnumMap (ContentId ModeKind) (Map Challenge X)
svictories
Challenge
nxtChal <- (StateClient -> Challenge) -> m Challenge
forall (m :: * -> *) a.
MonadClientRead m =>
(StateClient -> a) -> m a
getsClient StateClient -> Challenge
snxtChal
let f :: [(a, b)] -> p -> a -> b -> [(a, b)]
f ![(a, b)]
acc p
_p !a
i !b
a = (a
i, b
a) (a, b) -> [(a, b)] -> [(a, b)]
forall a. a -> [a] -> [a]
: [(a, b)]
acc
campaignModes :: [(ContentId ModeKind, ModeKind)]
campaignModes = ContentData ModeKind
-> GroupName ModeKind
-> ([(ContentId ModeKind, ModeKind)]
-> X
-> ContentId ModeKind
-> ModeKind
-> [(ContentId ModeKind, ModeKind)])
-> [(ContentId ModeKind, ModeKind)]
-> [(ContentId ModeKind, ModeKind)]
forall a b.
ContentData a
-> GroupName a -> (b -> X -> ContentId a -> a -> b) -> b -> b
ofoldlGroup' ContentData ModeKind
comode GroupName ModeKind
MK.CAMPAIGN_SCENARIO [(ContentId ModeKind, ModeKind)]
-> X
-> ContentId ModeKind
-> ModeKind
-> [(ContentId ModeKind, ModeKind)]
forall a b p. [(a, b)] -> p -> a -> b -> [(a, b)]
f []
slotListBound :: X
slotListBound = [(ContentId ModeKind, ModeKind)] -> X
forall a. [a] -> X
length [(ContentId ModeKind, ModeKind)]
campaignModes X -> X -> X
forall a. Num a => a -> a -> a
- X
1
displayOneSlot :: X -> m (Either FailError ActorId)
displayOneSlot X
slotIndex = do
let (ContentId ModeKind
gameModeId, ModeKind
gameMode) = [(ContentId ModeKind, ModeKind)]
campaignModes [(ContentId ModeKind, ModeKind)]
-> X -> (ContentId ModeKind, ModeKind)
forall a. [a] -> X -> a
!! X
slotIndex
EnumMap DisplayFont Overlay
modeOKX <- Bool -> ContentId ModeKind -> m (EnumMap DisplayFont Overlay)
forall (m :: * -> *).
MonadClientUI m =>
Bool -> ContentId ModeKind -> m (EnumMap DisplayFont Overlay)
describeMode Bool
False ContentId ModeKind
gameModeId
let victories :: X
victories = case ContentId ModeKind
-> EnumMap (ContentId ModeKind) (Map Challenge X)
-> Maybe (Map Challenge X)
forall k a. Enum k => k -> EnumMap k a -> Maybe a
EM.lookup ContentId ModeKind
gameModeId EnumMap (ContentId ModeKind) (Map Challenge X)
svictories of
Maybe (Map Challenge X)
Nothing -> X
0
Just Map Challenge X
cm -> X -> Maybe X -> X
forall a. a -> Maybe a -> a
fromMaybe X
0 (Challenge -> Map Challenge X -> Maybe X
forall k a. Ord k => k -> Map k a -> Maybe a
M.lookup Challenge
nxtChal Map Challenge X
cm)
verb :: Part
verb = if X
victories X -> X -> Bool
forall a. Ord a => a -> a -> Bool
> X
0 then Part
"remember" else Part
"forsee"
prompt2 :: Text
prompt2 = [Part] -> Text
makeSentence
[ Part -> Part -> Part
MU.SubjectVerbSg Part
"you" Part
verb
, Text -> Part
MU.Text (Text -> Part) -> Text -> Part
forall a b. (a -> b) -> a -> b
$ Text
"the '" Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> ModeKind -> Text
MK.mname ModeKind
gameMode Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"' adventure" ]
keys :: [KM]
keys = [KM
K.spaceKM, KM
K.escKM]
[KM] -> [KM] -> [KM]
forall a. [a] -> [a] -> [a]
++ [KM
K.upKM | X
slotIndex X -> X -> Bool
forall a. Eq a => a -> a -> Bool
/= X
0]
[KM] -> [KM] -> [KM]
forall a. [a] -> [a] -> [a]
++ [KM
K.downKM | X
slotIndex X -> X -> Bool
forall a. Eq a => a -> a -> Bool
/= X
slotListBound]
MsgClassShow -> Text -> m ()
forall (m :: * -> *) a.
(MonadClientUI m, MsgShared a) =>
a -> Text -> m ()
msgAdd MsgClassShow
MsgPromptGeneric Text
prompt2
Slideshow
slides <- X -> [KM] -> OKX -> m Slideshow
forall (m :: * -> *).
MonadClientUI m =>
X -> [KM] -> OKX -> m Slideshow
overlayToSlideshow X
rheight [KM]
keys (EnumMap DisplayFont Overlay
modeOKX, [])
KeyOrSlot
ekm2 <- String -> ColorMode -> Bool -> Slideshow -> [KM] -> m KeyOrSlot
forall (m :: * -> *).
MonadClientUI m =>
String -> ColorMode -> Bool -> Slideshow -> [KM] -> m KeyOrSlot
displayChoiceScreen String
"" ColorMode
ColorFull Bool
True Slideshow
slides [KM]
keys
let km :: KM
km = (KM -> KM) -> (SlotChar -> KM) -> KeyOrSlot -> KM
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either KM -> KM
forall a. a -> a
id (String -> SlotChar -> KM
forall a. HasCallStack => String -> a
error (String -> SlotChar -> KM) -> String -> SlotChar -> KM
forall a b. (a -> b) -> a -> b
$ String
"" String -> KeyOrSlot -> String
forall v. Show v => String -> v -> String
`showFailure` KeyOrSlot
ekm2) KeyOrSlot
ekm2
case KM -> Key
K.key KM
km of
Key
K.Space -> ActorId -> Bool -> ItemDialogMode -> m (Either FailError ActorId)
forall (m :: * -> *).
MonadClientUI m =>
ActorId -> Bool -> ItemDialogMode -> m (Either FailError ActorId)
chooseItemDialogMode ActorId
leader Bool
False ItemDialogMode
MModes
Key
K.Up -> X -> m (Either FailError ActorId)
displayOneSlot (X -> m (Either FailError ActorId))
-> X -> m (Either FailError ActorId)
forall a b. (a -> b) -> a -> b
$ X
slotIndex X -> X -> X
forall a. Num a => a -> a -> a
- X
1
Key
K.Down -> X -> m (Either FailError ActorId)
displayOneSlot (X -> m (Either FailError ActorId))
-> X -> m (Either FailError ActorId)
forall a b. (a -> b) -> a -> b
$ X
slotIndex X -> X -> X
forall a. Num a => a -> a -> a
+ X
1
Key
K.Esc -> Text -> m (Either FailError ActorId)
forall (m :: * -> *) a. MonadClientUI m => Text -> m (FailOrCmd a)
failWith Text
"never mind"
Key
_ -> String -> m (Either FailError ActorId)
forall a. HasCallStack => String -> a
error (String -> m (Either FailError ActorId))
-> String -> m (Either FailError ActorId)
forall a b. (a -> b) -> a -> b
$ String
"" String -> KM -> String
forall v. Show v => String -> v -> String
`showFailure` KM
km
X -> m (Either FailError ActorId)
displayOneSlot X
slotIndex0
Left Text
err -> Text -> m (Either FailError ActorId)
forall (m :: * -> *) a. MonadClientUI m => Text -> m (FailOrCmd a)
failWith Text
err
chooseItemProjectHuman :: forall m. (MonadClient m, MonadClientUI m)
=> ActorId -> [HumanCmd.TriggerItem] -> m MError
chooseItemProjectHuman :: ActorId -> [TriggerItem] -> m MError
chooseItemProjectHuman ActorId
leader [TriggerItem]
ts = do
Actor
b <- (State -> Actor) -> m Actor
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState ((State -> Actor) -> m Actor) -> (State -> Actor) -> m Actor
forall a b. (a -> b) -> a -> b
$ ActorId -> State -> Actor
getActorBody ActorId
leader
Maybe (LevelId, Point)
mstash <- (State -> Maybe (LevelId, Point)) -> m (Maybe (LevelId, Point))
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState ((State -> Maybe (LevelId, Point)) -> m (Maybe (LevelId, Point)))
-> (State -> Maybe (LevelId, Point)) -> m (Maybe (LevelId, Point))
forall a b. (a -> b) -> a -> b
$ \State
s -> Faction -> Maybe (LevelId, Point)
gstash (Faction -> Maybe (LevelId, Point))
-> Faction -> Maybe (LevelId, Point)
forall a b. (a -> b) -> a -> b
$ State -> EnumMap FactionId Faction
sfactionD State
s EnumMap FactionId Faction -> FactionId -> Faction
forall k a. Enum k => EnumMap k a -> k -> a
EM.! Actor -> FactionId
bfid Actor
b
let overStash :: Bool
overStash = Maybe (LevelId, Point)
mstash Maybe (LevelId, Point) -> Maybe (LevelId, Point) -> Bool
forall a. Eq a => a -> a -> Bool
== (LevelId, Point) -> Maybe (LevelId, Point)
forall a. a -> Maybe a
Just (Actor -> LevelId
blid Actor
b, Actor -> Point
bpos Actor
b)
storesBase :: [CStore]
storesBase = [CStore
CStash, CStore
CEqp]
stores :: [CStore]
stores | Bool
overStash = [CStore]
storesBase [CStore] -> [CStore] -> [CStore]
forall a. [a] -> [a] -> [a]
++ [CStore
CGround]
| Bool
otherwise = CStore
CGround CStore -> [CStore] -> [CStore]
forall a. a -> [a] -> [a]
: [CStore]
storesBase
(Part
verb1, Part
object1) = case [TriggerItem]
ts of
[] -> (Part
"aim", Part
"item")
TriggerItem
tr : [TriggerItem]
_ -> (TriggerItem -> Part
HumanCmd.tiverb TriggerItem
tr, TriggerItem -> Part
HumanCmd.tiobject TriggerItem
tr)
verb :: Text
verb = [Part] -> Text
makePhrase [Part
verb1]
triggerSyms :: String
triggerSyms = [TriggerItem] -> String
triggerSymbols [TriggerItem]
ts
Either Text (ItemFull -> Either ReqFailure (Point, Bool))
mpsuitReq <- ActorId
-> m (Either Text (ItemFull -> Either ReqFailure (Point, Bool)))
forall (m :: * -> *).
(MonadClient m, MonadClientUI m) =>
ActorId
-> m (Either Text (ItemFull -> Either ReqFailure (Point, Bool)))
psuitReq ActorId
leader
case Either Text (ItemFull -> Either ReqFailure (Point, Bool))
mpsuitReq of
Left Text
err -> Text -> m MError
forall (m :: * -> *). MonadClientUI m => Text -> m MError
failMsg Text
err
Right ItemFull -> Either ReqFailure (Point, Bool)
psuitReqFun -> do
Maybe (ItemId, CStore, Bool)
itemSel <- (SessionUI -> Maybe (ItemId, CStore, Bool))
-> m (Maybe (ItemId, CStore, Bool))
forall (m :: * -> *) a. MonadClientUI m => (SessionUI -> a) -> m a
getsSession SessionUI -> Maybe (ItemId, CStore, Bool)
sitemSel
case Maybe (ItemId, CStore, Bool)
itemSel of
Just (ItemId
_, CStore
_, Bool
True) -> MError -> m MError
forall (m :: * -> *) a. Monad m => a -> m a
return MError
forall a. Maybe a
Nothing
Just (ItemId
iid, CStore
fromCStore, Bool
False) -> do
ItemFull
itemFull <- (State -> ItemFull) -> m ItemFull
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState ((State -> ItemFull) -> m ItemFull)
-> (State -> ItemFull) -> m ItemFull
forall a b. (a -> b) -> a -> b
$ ItemId -> State -> ItemFull
itemToFull ItemId
iid
EnumMap ItemId ItemQuant
bag <- (State -> EnumMap ItemId ItemQuant) -> m (EnumMap ItemId ItemQuant)
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState ((State -> EnumMap ItemId ItemQuant)
-> m (EnumMap ItemId ItemQuant))
-> (State -> EnumMap ItemId ItemQuant)
-> m (EnumMap ItemId ItemQuant)
forall a b. (a -> b) -> a -> b
$ Actor -> CStore -> State -> EnumMap ItemId ItemQuant
getBodyStoreBag Actor
b CStore
fromCStore
case ItemId
iid ItemId -> EnumMap ItemId ItemQuant -> Maybe ItemQuant
forall k a. Enum k => k -> EnumMap k a -> Maybe a
`EM.lookup` EnumMap ItemId ItemQuant
bag of
Just ItemQuant
_ | Either ReqFailure (Point, Bool) -> Bool
forall a b. Either a b -> Bool
isRight (ItemFull -> Either ReqFailure (Point, Bool)
psuitReqFun ItemFull
itemFull) ->
MError -> m MError
forall (m :: * -> *) a. Monad m => a -> m a
return MError
forall a. Maybe a
Nothing
Maybe ItemQuant
_ -> do
(SessionUI -> SessionUI) -> m ()
forall (m :: * -> *).
MonadClientUI m =>
(SessionUI -> SessionUI) -> m ()
modifySession ((SessionUI -> SessionUI) -> m ())
-> (SessionUI -> SessionUI) -> m ()
forall a b. (a -> b) -> a -> b
$ \SessionUI
sess -> SessionUI
sess {sitemSel :: Maybe (ItemId, CStore, Bool)
sitemSel = Maybe (ItemId, CStore, Bool)
forall a. Maybe a
Nothing}
ActorId -> [TriggerItem] -> m MError
forall (m :: * -> *).
(MonadClient m, MonadClientUI m) =>
ActorId -> [TriggerItem] -> m MError
chooseItemProjectHuman ActorId
leader [TriggerItem]
ts
Maybe (ItemId, CStore, Bool)
Nothing -> do
let psuit :: m Suitability
psuit =
Suitability -> m Suitability
forall (m :: * -> *) a. Monad m => a -> m a
return (Suitability -> m Suitability) -> Suitability -> m Suitability
forall a b. (a -> b) -> a -> b
$ (Maybe CStore -> ItemFull -> ItemQuant -> Bool) -> Suitability
SuitsSomething ((Maybe CStore -> ItemFull -> ItemQuant -> Bool) -> Suitability)
-> (Maybe CStore -> ItemFull -> ItemQuant -> Bool) -> Suitability
forall a b. (a -> b) -> a -> b
$ \Maybe CStore
_ ItemFull
itemFull ItemQuant
_kit ->
(ReqFailure -> Bool)
-> ((Point, Bool) -> Bool)
-> Either ReqFailure (Point, Bool)
-> Bool
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (Bool -> ReqFailure -> Bool
forall a b. a -> b -> a
const Bool
False) (Point, Bool) -> Bool
forall a b. (a, b) -> b
snd (ItemFull -> Either ReqFailure (Point, Bool)
psuitReqFun ItemFull
itemFull)
Bool -> Bool -> Bool
&& (String -> Bool
forall a. [a] -> Bool
null String
triggerSyms
Bool -> Bool -> Bool
|| ItemKind -> Char
IK.isymbol (ItemFull -> ItemKind
itemKind ItemFull
itemFull) Char -> String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` String
triggerSyms)
prompt :: Text
prompt = [Part] -> Text
makePhrase [Part
"What", Part
object1, Part
"to"]
promptGeneric :: Text
promptGeneric = Text
"What to"
Either Text (CStore, ItemId)
ggi <- ActorId
-> m Suitability
-> Text
-> Text
-> Text
-> Text
-> [CStore]
-> m (Either Text (CStore, ItemId))
forall (m :: * -> *).
MonadClientUI m =>
ActorId
-> m Suitability
-> Text
-> Text
-> Text
-> Text
-> [CStore]
-> m (Either Text (CStore, ItemId))
getGroupItem ActorId
leader m Suitability
psuit Text
prompt Text
promptGeneric Text
verb Text
"fling"
[CStore]
stores
case Either Text (CStore, ItemId)
ggi of
Right (CStore
fromCStore, ItemId
iid) -> do
(SessionUI -> SessionUI) -> m ()
forall (m :: * -> *).
MonadClientUI m =>
(SessionUI -> SessionUI) -> m ()
modifySession ((SessionUI -> SessionUI) -> m ())
-> (SessionUI -> SessionUI) -> m ()
forall a b. (a -> b) -> a -> b
$ \SessionUI
sess ->
SessionUI
sess {sitemSel :: Maybe (ItemId, CStore, Bool)
sitemSel = (ItemId, CStore, Bool) -> Maybe (ItemId, CStore, Bool)
forall a. a -> Maybe a
Just (ItemId
iid, CStore
fromCStore, Bool
False)}
MError -> m MError
forall (m :: * -> *) a. Monad m => a -> m a
return MError
forall a. Maybe a
Nothing
Left Text
err -> Text -> m MError
forall (m :: * -> *). MonadClientUI m => Text -> m MError
failMsg Text
err
permittedProjectClient :: MonadClientUI m
=> ActorId -> m (ItemFull -> Either ReqFailure Bool)
permittedProjectClient :: ActorId -> m (ItemFull -> Either ReqFailure Bool)
permittedProjectClient ActorId
leader = do
Skills
actorCurAndMaxSk <- (State -> Skills) -> m Skills
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState ((State -> Skills) -> m Skills) -> (State -> Skills) -> m Skills
forall a b. (a -> b) -> a -> b
$ ActorId -> State -> Skills
getActorMaxSkills ActorId
leader
Actor
b <- (State -> Actor) -> m Actor
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState ((State -> Actor) -> m Actor) -> (State -> Actor) -> m Actor
forall a b. (a -> b) -> a -> b
$ ActorId -> State -> Actor
getActorBody ActorId
leader
let skill :: X
skill = Skill -> Skills -> X
Ability.getSk Skill
Ability.SkProject Skills
actorCurAndMaxSk
calmE :: Bool
calmE = Actor -> Skills -> Bool
calmEnough Actor
b Skills
actorCurAndMaxSk
(ItemFull -> Either ReqFailure Bool)
-> m (ItemFull -> Either ReqFailure Bool)
forall (m :: * -> *) a. Monad m => a -> m a
return ((ItemFull -> Either ReqFailure Bool)
-> m (ItemFull -> Either ReqFailure Bool))
-> (ItemFull -> Either ReqFailure Bool)
-> m (ItemFull -> Either ReqFailure Bool)
forall a b. (a -> b) -> a -> b
$ Bool -> X -> Bool -> ItemFull -> Either ReqFailure Bool
permittedProject Bool
False X
skill Bool
calmE
projectCheck :: MonadClientUI m => ActorId -> Point -> m (Maybe ReqFailure)
projectCheck :: ActorId -> Point -> m (Maybe ReqFailure)
projectCheck ActorId
leader Point
tpos = do
COps{TileSpeedup
coTileSpeedup :: COps -> TileSpeedup
coTileSpeedup :: TileSpeedup
coTileSpeedup} <- (State -> COps) -> m COps
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState State -> COps
scops
X
eps <- (StateClient -> X) -> m X
forall (m :: * -> *) a.
MonadClientRead m =>
(StateClient -> a) -> m a
getsClient StateClient -> X
seps
Actor
sb <- (State -> Actor) -> m Actor
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState ((State -> Actor) -> m Actor) -> (State -> Actor) -> m Actor
forall a b. (a -> b) -> a -> b
$ ActorId -> State -> Actor
getActorBody ActorId
leader
let lid :: LevelId
lid = Actor -> LevelId
blid Actor
sb
spos :: Point
spos = Actor -> Point
bpos Actor
sb
case X -> Point -> Point -> Maybe [Point]
bla X
eps Point
spos Point
tpos of
Maybe [Point]
Nothing -> Maybe ReqFailure -> m (Maybe ReqFailure)
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe ReqFailure -> m (Maybe ReqFailure))
-> Maybe ReqFailure -> m (Maybe ReqFailure)
forall a b. (a -> b) -> a -> b
$ ReqFailure -> Maybe ReqFailure
forall a. a -> Maybe a
Just ReqFailure
ProjectAimOnself
Just [] -> String -> m (Maybe ReqFailure)
forall a. HasCallStack => String -> a
error (String -> m (Maybe ReqFailure)) -> String -> m (Maybe ReqFailure)
forall a b. (a -> b) -> a -> b
$ String
"project from the edge of level"
String -> (Point, Point, Actor) -> String
forall v. Show v => String -> v -> String
`showFailure` (Point
spos, Point
tpos, Actor
sb)
Just (Point
pos : [Point]
_) -> do
Level
lvl <- LevelId -> m Level
forall (m :: * -> *). MonadStateRead m => LevelId -> m Level
getLevel LevelId
lid
let t :: ContentId TileKind
t = Level
lvl Level -> Point -> ContentId TileKind
`at` Point
pos
if Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ TileSpeedup -> ContentId TileKind -> Bool
Tile.isWalkable TileSpeedup
coTileSpeedup ContentId TileKind
t
then Maybe ReqFailure -> m (Maybe ReqFailure)
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe ReqFailure -> m (Maybe ReqFailure))
-> Maybe ReqFailure -> m (Maybe ReqFailure)
forall a b. (a -> b) -> a -> b
$ ReqFailure -> Maybe ReqFailure
forall a. a -> Maybe a
Just ReqFailure
ProjectBlockTerrain
else if Point -> Level -> Bool
occupiedBigLvl Point
pos Level
lvl
then Maybe ReqFailure -> m (Maybe ReqFailure)
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe ReqFailure -> m (Maybe ReqFailure))
-> Maybe ReqFailure -> m (Maybe ReqFailure)
forall a b. (a -> b) -> a -> b
$ ReqFailure -> Maybe ReqFailure
forall a. a -> Maybe a
Just ReqFailure
ProjectBlockActor
else Maybe ReqFailure -> m (Maybe ReqFailure)
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe ReqFailure
forall a. Maybe a
Nothing
xhairLegalEps :: MonadClientUI m => ActorId -> m (Either Text Int)
xhairLegalEps :: ActorId -> m (Either Text X)
xhairLegalEps ActorId
leader = do
cops :: COps
cops@COps{corule :: COps -> RuleContent
corule=RuleContent{X
rWidthMax :: RuleContent -> X
rWidthMax :: X
rWidthMax, X
rHeightMax :: RuleContent -> X
rHeightMax :: X
rHeightMax}} <- (State -> COps) -> m COps
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState State -> COps
scops
Actor
b <- (State -> Actor) -> m Actor
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState ((State -> Actor) -> m Actor) -> (State -> Actor) -> m Actor
forall a b. (a -> b) -> a -> b
$ ActorId -> State -> Actor
getActorBody ActorId
leader
LevelId
lidV <- m LevelId
forall (m :: * -> *). MonadClientUI m => m LevelId
viewedLevelUI
let !_A :: ()
_A = Bool -> () -> ()
forall a. HasCallStack => Bool -> a -> a
assert (LevelId
lidV LevelId -> LevelId -> Bool
forall a. Eq a => a -> a -> Bool
== Actor -> LevelId
blid Actor
b) ()
findNewEps :: Bool -> Point -> m (Either Text X)
findNewEps Bool
onlyFirst Point
pos = do
Level
lvl <- LevelId -> m Level
forall (m :: * -> *). MonadStateRead m => LevelId -> m Level
getLevel (Actor -> LevelId
blid Actor
b)
X
oldEps <- (StateClient -> X) -> m X
forall (m :: * -> *) a.
MonadClientRead m =>
(StateClient -> a) -> m a
getsClient StateClient -> X
seps
Either Text X -> m (Either Text X)
forall (m :: * -> *) a. Monad m => a -> m a
return (Either Text X -> m (Either Text X))
-> Either Text X -> m (Either Text X)
forall a b. (a -> b) -> a -> b
$! case Bool -> Actor -> Point -> X -> COps -> Level -> Maybe X
makeLine Bool
onlyFirst Actor
b Point
pos X
oldEps COps
cops Level
lvl of
Just X
newEps -> X -> Either Text X
forall a b. b -> Either a b
Right X
newEps
Maybe X
Nothing -> Text -> Either Text X
forall a b. a -> Either a b
Left (Text -> Either Text X) -> Text -> Either Text X
forall a b. (a -> b) -> a -> b
$ if Bool
onlyFirst
then Text
"aiming blocked at the first step"
else Text
"aiming line blocked somewhere"
Maybe Target
xhair <- (SessionUI -> Maybe Target) -> m (Maybe Target)
forall (m :: * -> *) a. MonadClientUI m => (SessionUI -> a) -> m a
getsSession SessionUI -> Maybe Target
sxhair
case Maybe Target
xhair of
Maybe Target
Nothing -> Either Text X -> m (Either Text X)
forall (m :: * -> *) a. Monad m => a -> m a
return (Either Text X -> m (Either Text X))
-> Either Text X -> m (Either Text X)
forall a b. (a -> b) -> a -> b
$ Text -> Either Text X
forall a b. a -> Either a b
Left Text
"no aim designated"
Just (TEnemy ActorId
a) -> do
Actor
body <- (State -> Actor) -> m Actor
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState ((State -> Actor) -> m Actor) -> (State -> Actor) -> m Actor
forall a b. (a -> b) -> a -> b
$ ActorId -> State -> Actor
getActorBody ActorId
a
let pos :: Point
pos = Actor -> Point
bpos Actor
body
if Actor -> LevelId
blid Actor
body LevelId -> LevelId -> Bool
forall a. Eq a => a -> a -> Bool
== LevelId
lidV
then Bool -> Point -> m (Either Text X)
findNewEps Bool
False Point
pos
else Either Text X -> m (Either Text X)
forall (m :: * -> *) a. Monad m => a -> m a
return (Either Text X -> m (Either Text X))
-> Either Text X -> m (Either Text X)
forall a b. (a -> b) -> a -> b
$ Text -> Either Text X
forall a b. a -> Either a b
Left Text
"can't fling at an enemy on remote level"
Just (TNonEnemy ActorId
a) -> do
Actor
body <- (State -> Actor) -> m Actor
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState ((State -> Actor) -> m Actor) -> (State -> Actor) -> m Actor
forall a b. (a -> b) -> a -> b
$ ActorId -> State -> Actor
getActorBody ActorId
a
let pos :: Point
pos = Actor -> Point
bpos Actor
body
if Actor -> LevelId
blid Actor
body LevelId -> LevelId -> Bool
forall a. Eq a => a -> a -> Bool
== LevelId
lidV
then Bool -> Point -> m (Either Text X)
findNewEps Bool
False Point
pos
else Either Text X -> m (Either Text X)
forall (m :: * -> *) a. Monad m => a -> m a
return (Either Text X -> m (Either Text X))
-> Either Text X -> m (Either Text X)
forall a b. (a -> b) -> a -> b
$ Text -> Either Text X
forall a b. a -> Either a b
Left Text
"can't fling at a non-enemy on remote level"
Just (TPoint TEnemyPos{} LevelId
_ Point
_) ->
Either Text X -> m (Either Text X)
forall (m :: * -> *) a. Monad m => a -> m a
return (Either Text X -> m (Either Text X))
-> Either Text X -> m (Either Text X)
forall a b. (a -> b) -> a -> b
$ Text -> Either Text X
forall a b. a -> Either a b
Left Text
"selected opponent not visible"
Just (TPoint TGoal
_ LevelId
lid Point
pos) ->
if LevelId
lid LevelId -> LevelId -> Bool
forall a. Eq a => a -> a -> Bool
== LevelId
lidV
then Bool -> Point -> m (Either Text X)
findNewEps Bool
True Point
pos
else Either Text X -> m (Either Text X)
forall (m :: * -> *) a. Monad m => a -> m a
return (Either Text X -> m (Either Text X))
-> Either Text X -> m (Either Text X)
forall a b. (a -> b) -> a -> b
$ Text -> Either Text X
forall a b. a -> Either a b
Left Text
"can't fling at a target on remote level"
Just (TVector Vector
v) -> do
let shifted :: Point
shifted = X -> X -> Point -> Vector -> Point
shiftBounded X
rWidthMax X
rHeightMax (Actor -> Point
bpos Actor
b) Vector
v
if Point
shifted Point -> Point -> Bool
forall a. Eq a => a -> a -> Bool
== Actor -> Point
bpos Actor
b Bool -> Bool -> Bool
&& Vector
v Vector -> Vector -> Bool
forall a. Eq a => a -> a -> Bool
/= X -> X -> Vector
Vector X
0 X
0
then Either Text X -> m (Either Text X)
forall (m :: * -> *) a. Monad m => a -> m a
return (Either Text X -> m (Either Text X))
-> Either Text X -> m (Either Text X)
forall a b. (a -> b) -> a -> b
$ Text -> Either Text X
forall a b. a -> Either a b
Left Text
"selected translation is void"
else Bool -> Point -> m (Either Text X)
findNewEps Bool
True Point
shifted
posFromXhair :: (MonadClient m, MonadClientUI m)
=> ActorId -> m (Either Text Point)
posFromXhair :: ActorId -> m (Either Text Point)
posFromXhair ActorId
leader = do
Either Text X
canAim <- ActorId -> m (Either Text X)
forall (m :: * -> *).
MonadClientUI m =>
ActorId -> m (Either Text X)
xhairLegalEps ActorId
leader
case Either Text X
canAim of
Right X
newEps -> do
(StateClient -> StateClient) -> m ()
forall (m :: * -> *).
MonadClient m =>
(StateClient -> StateClient) -> m ()
modifyClient ((StateClient -> StateClient) -> m ())
-> (StateClient -> StateClient) -> m ()
forall a b. (a -> b) -> a -> b
$ \StateClient
cli -> StateClient
cli {seps :: X
seps = X
newEps}
Maybe Point
mxhairPos <- m (Maybe Point)
forall (m :: * -> *). MonadClientUI m => m (Maybe Point)
mxhairToPos
case Maybe Point
mxhairPos of
Maybe Point
Nothing -> String -> m (Either Text Point)
forall a. HasCallStack => String -> a
error (String -> m (Either Text Point))
-> String -> m (Either Text Point)
forall a b. (a -> b) -> a -> b
$ String
"" String -> Maybe Point -> String
forall v. Show v => String -> v -> String
`showFailure` Maybe Point
mxhairPos
Just Point
pos -> do
Maybe ReqFailure
munit <- ActorId -> Point -> m (Maybe ReqFailure)
forall (m :: * -> *).
MonadClientUI m =>
ActorId -> Point -> m (Maybe ReqFailure)
projectCheck ActorId
leader Point
pos
case Maybe ReqFailure
munit of
Maybe ReqFailure
Nothing -> Either Text Point -> m (Either Text Point)
forall (m :: * -> *) a. Monad m => a -> m a
return (Either Text Point -> m (Either Text Point))
-> Either Text Point -> m (Either Text Point)
forall a b. (a -> b) -> a -> b
$ Point -> Either Text Point
forall a b. b -> Either a b
Right Point
pos
Just ReqFailure
reqFail -> Either Text Point -> m (Either Text Point)
forall (m :: * -> *) a. Monad m => a -> m a
return (Either Text Point -> m (Either Text Point))
-> Either Text Point -> m (Either Text Point)
forall a b. (a -> b) -> a -> b
$ Text -> Either Text Point
forall a b. a -> Either a b
Left (Text -> Either Text Point) -> Text -> Either Text Point
forall a b. (a -> b) -> a -> b
$ ReqFailure -> Text
showReqFailure ReqFailure
reqFail
Left Text
cause -> Either Text Point -> m (Either Text Point)
forall (m :: * -> *) a. Monad m => a -> m a
return (Either Text Point -> m (Either Text Point))
-> Either Text Point -> m (Either Text Point)
forall a b. (a -> b) -> a -> b
$ Text -> Either Text Point
forall a b. a -> Either a b
Left Text
cause
psuitReq :: (MonadClient m, MonadClientUI m)
=> ActorId
-> m (Either Text (ItemFull -> Either ReqFailure (Point, Bool)))
psuitReq :: ActorId
-> m (Either Text (ItemFull -> Either ReqFailure (Point, Bool)))
psuitReq ActorId
leader = do
Actor
b <- (State -> Actor) -> m Actor
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState ((State -> Actor) -> m Actor) -> (State -> Actor) -> m Actor
forall a b. (a -> b) -> a -> b
$ ActorId -> State -> Actor
getActorBody ActorId
leader
LevelId
lidV <- m LevelId
forall (m :: * -> *). MonadClientUI m => m LevelId
viewedLevelUI
if LevelId
lidV LevelId -> LevelId -> Bool
forall a. Eq a => a -> a -> Bool
/= Actor -> LevelId
blid Actor
b
then Either Text (ItemFull -> Either ReqFailure (Point, Bool))
-> m (Either Text (ItemFull -> Either ReqFailure (Point, Bool)))
forall (m :: * -> *) a. Monad m => a -> m a
return (Either Text (ItemFull -> Either ReqFailure (Point, Bool))
-> m (Either Text (ItemFull -> Either ReqFailure (Point, Bool))))
-> Either Text (ItemFull -> Either ReqFailure (Point, Bool))
-> m (Either Text (ItemFull -> Either ReqFailure (Point, Bool)))
forall a b. (a -> b) -> a -> b
$ Text -> Either Text (ItemFull -> Either ReqFailure (Point, Bool))
forall a b. a -> Either a b
Left Text
"can't fling on remote level"
else do
Either Text Point
mpos <- ActorId -> m (Either Text Point)
forall (m :: * -> *).
(MonadClient m, MonadClientUI m) =>
ActorId -> m (Either Text Point)
posFromXhair ActorId
leader
ItemFull -> Either ReqFailure Bool
p <- ActorId -> m (ItemFull -> Either ReqFailure Bool)
forall (m :: * -> *).
MonadClientUI m =>
ActorId -> m (ItemFull -> Either ReqFailure Bool)
permittedProjectClient ActorId
leader
case Either Text Point
mpos of
Left Text
err -> Either Text (ItemFull -> Either ReqFailure (Point, Bool))
-> m (Either Text (ItemFull -> Either ReqFailure (Point, Bool)))
forall (m :: * -> *) a. Monad m => a -> m a
return (Either Text (ItemFull -> Either ReqFailure (Point, Bool))
-> m (Either Text (ItemFull -> Either ReqFailure (Point, Bool))))
-> Either Text (ItemFull -> Either ReqFailure (Point, Bool))
-> m (Either Text (ItemFull -> Either ReqFailure (Point, Bool)))
forall a b. (a -> b) -> a -> b
$ Text -> Either Text (ItemFull -> Either ReqFailure (Point, Bool))
forall a b. a -> Either a b
Left Text
err
Right Point
pos -> Either Text (ItemFull -> Either ReqFailure (Point, Bool))
-> m (Either Text (ItemFull -> Either ReqFailure (Point, Bool)))
forall (m :: * -> *) a. Monad m => a -> m a
return (Either Text (ItemFull -> Either ReqFailure (Point, Bool))
-> m (Either Text (ItemFull -> Either ReqFailure (Point, Bool))))
-> Either Text (ItemFull -> Either ReqFailure (Point, Bool))
-> m (Either Text (ItemFull -> Either ReqFailure (Point, Bool)))
forall a b. (a -> b) -> a -> b
$ (ItemFull -> Either ReqFailure (Point, Bool))
-> Either Text (ItemFull -> Either ReqFailure (Point, Bool))
forall a b. b -> Either a b
Right ((ItemFull -> Either ReqFailure (Point, Bool))
-> Either Text (ItemFull -> Either ReqFailure (Point, Bool)))
-> (ItemFull -> Either ReqFailure (Point, Bool))
-> Either Text (ItemFull -> Either ReqFailure (Point, Bool))
forall a b. (a -> b) -> a -> b
$ \ItemFull
itemFull ->
case ItemFull -> Either ReqFailure Bool
p ItemFull
itemFull of
Left ReqFailure
err -> ReqFailure -> Either ReqFailure (Point, Bool)
forall a b. a -> Either a b
Left ReqFailure
err
Right Bool
False -> (Point, Bool) -> Either ReqFailure (Point, Bool)
forall a b. b -> Either a b
Right (Point
pos, Bool
False)
Right Bool
True ->
let arItem :: AspectRecord
arItem = ItemFull -> AspectRecord
aspectRecordFull ItemFull
itemFull
in (Point, Bool) -> Either ReqFailure (Point, Bool)
forall a b. b -> Either a b
Right (Point
pos, X
1 X -> X -> X
forall a. Num a => a -> a -> a
+ AspectRecord -> ItemKind -> X
IA.totalRange AspectRecord
arItem (ItemFull -> ItemKind
itemKind ItemFull
itemFull)
X -> X -> Bool
forall a. Ord a => a -> a -> Bool
>= Point -> Point -> X
chessDist (Actor -> Point
bpos Actor
b) Point
pos)
triggerSymbols :: [HumanCmd.TriggerItem] -> [Char]
triggerSymbols :: [TriggerItem] -> String
triggerSymbols [] = []
triggerSymbols (HumanCmd.TriggerItem{String
tisymbols :: TriggerItem -> String
tisymbols :: String
tisymbols} : [TriggerItem]
ts) =
String
tisymbols String -> String -> String
forall a. [a] -> [a] -> [a]
++ [TriggerItem] -> String
triggerSymbols [TriggerItem]
ts
chooseItemApplyHuman :: forall m. MonadClientUI m
=> ActorId -> [HumanCmd.TriggerItem] -> m MError
chooseItemApplyHuman :: ActorId -> [TriggerItem] -> m MError
chooseItemApplyHuman ActorId
leader [TriggerItem]
ts = do
Actor
b <- (State -> Actor) -> m Actor
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState ((State -> Actor) -> m Actor) -> (State -> Actor) -> m Actor
forall a b. (a -> b) -> a -> b
$ ActorId -> State -> Actor
getActorBody ActorId
leader
Maybe (LevelId, Point)
mstash <- (State -> Maybe (LevelId, Point)) -> m (Maybe (LevelId, Point))
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState ((State -> Maybe (LevelId, Point)) -> m (Maybe (LevelId, Point)))
-> (State -> Maybe (LevelId, Point)) -> m (Maybe (LevelId, Point))
forall a b. (a -> b) -> a -> b
$ \State
s -> Faction -> Maybe (LevelId, Point)
gstash (Faction -> Maybe (LevelId, Point))
-> Faction -> Maybe (LevelId, Point)
forall a b. (a -> b) -> a -> b
$ State -> EnumMap FactionId Faction
sfactionD State
s EnumMap FactionId Faction -> FactionId -> Faction
forall k a. Enum k => EnumMap k a -> k -> a
EM.! Actor -> FactionId
bfid Actor
b
let overStash :: Bool
overStash = Maybe (LevelId, Point)
mstash Maybe (LevelId, Point) -> Maybe (LevelId, Point) -> Bool
forall a. Eq a => a -> a -> Bool
== (LevelId, Point) -> Maybe (LevelId, Point)
forall a. a -> Maybe a
Just (Actor -> LevelId
blid Actor
b, Actor -> Point
bpos Actor
b)
storesBase :: [CStore]
storesBase = [CStore
CStash, CStore
CEqp, CStore
COrgan]
stores :: [CStore]
stores | Bool
overStash = [CStore]
storesBase [CStore] -> [CStore] -> [CStore]
forall a. [a] -> [a] -> [a]
++ [CStore
CGround]
| Bool
otherwise = CStore
CGround CStore -> [CStore] -> [CStore]
forall a. a -> [a] -> [a]
: [CStore]
storesBase
(Part
verb1, Part
object1) = case [TriggerItem]
ts of
[] -> (Part
"trigger", Part
"item")
TriggerItem
tr : [TriggerItem]
_ -> (TriggerItem -> Part
HumanCmd.tiverb TriggerItem
tr, TriggerItem -> Part
HumanCmd.tiobject TriggerItem
tr)
verb :: Text
verb = [Part] -> Text
makePhrase [Part
verb1]
triggerSyms :: String
triggerSyms = [TriggerItem] -> String
triggerSymbols [TriggerItem]
ts
prompt :: Text
prompt = [Part] -> Text
makePhrase [Part
"What", Part
object1, Part
"to"]
promptGeneric :: Text
promptGeneric = Text
"What to"
Maybe (ItemId, CStore, Bool)
itemSel <- (SessionUI -> Maybe (ItemId, CStore, Bool))
-> m (Maybe (ItemId, CStore, Bool))
forall (m :: * -> *) a. MonadClientUI m => (SessionUI -> a) -> m a
getsSession SessionUI -> Maybe (ItemId, CStore, Bool)
sitemSel
case Maybe (ItemId, CStore, Bool)
itemSel of
Just (ItemId
_, CStore
_, Bool
True) -> MError -> m MError
forall (m :: * -> *) a. Monad m => a -> m a
return MError
forall a. Maybe a
Nothing
Just (ItemId
iid, CStore
fromCStore, Bool
False) -> do
ItemFull
itemFull <- (State -> ItemFull) -> m ItemFull
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState ((State -> ItemFull) -> m ItemFull)
-> (State -> ItemFull) -> m ItemFull
forall a b. (a -> b) -> a -> b
$ ItemId -> State -> ItemFull
itemToFull ItemId
iid
EnumMap ItemId ItemQuant
bag <- (State -> EnumMap ItemId ItemQuant) -> m (EnumMap ItemId ItemQuant)
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState ((State -> EnumMap ItemId ItemQuant)
-> m (EnumMap ItemId ItemQuant))
-> (State -> EnumMap ItemId ItemQuant)
-> m (EnumMap ItemId ItemQuant)
forall a b. (a -> b) -> a -> b
$ Actor -> CStore -> State -> EnumMap ItemId ItemQuant
getBodyStoreBag Actor
b CStore
fromCStore
Maybe CStore -> ItemFull -> ItemQuant -> Either ReqFailure Bool
mp <- ActorId
-> m (Maybe CStore
-> ItemFull -> ItemQuant -> Either ReqFailure Bool)
forall (m :: * -> *).
MonadClientUI m =>
ActorId
-> m (Maybe CStore
-> ItemFull -> ItemQuant -> Either ReqFailure Bool)
permittedApplyClient ActorId
leader
case ItemId
iid ItemId -> EnumMap ItemId ItemQuant -> Maybe ItemQuant
forall k a. Enum k => k -> EnumMap k a -> Maybe a
`EM.lookup` EnumMap ItemId ItemQuant
bag of
Just ItemQuant
kit | Bool -> Either ReqFailure Bool -> Bool
forall b a. b -> Either a b -> b
fromRight Bool
False (Maybe CStore -> ItemFull -> ItemQuant -> Either ReqFailure Bool
mp (CStore -> Maybe CStore
forall a. a -> Maybe a
Just CStore
fromCStore) ItemFull
itemFull ItemQuant
kit) ->
MError -> m MError
forall (m :: * -> *) a. Monad m => a -> m a
return MError
forall a. Maybe a
Nothing
Maybe ItemQuant
_ -> do
(SessionUI -> SessionUI) -> m ()
forall (m :: * -> *).
MonadClientUI m =>
(SessionUI -> SessionUI) -> m ()
modifySession ((SessionUI -> SessionUI) -> m ())
-> (SessionUI -> SessionUI) -> m ()
forall a b. (a -> b) -> a -> b
$ \SessionUI
sess -> SessionUI
sess {sitemSel :: Maybe (ItemId, CStore, Bool)
sitemSel = Maybe (ItemId, CStore, Bool)
forall a. Maybe a
Nothing}
ActorId -> [TriggerItem] -> m MError
forall (m :: * -> *).
MonadClientUI m =>
ActorId -> [TriggerItem] -> m MError
chooseItemApplyHuman ActorId
leader [TriggerItem]
ts
Maybe (ItemId, CStore, Bool)
Nothing -> do
let psuit :: m Suitability
psuit :: m Suitability
psuit = do
Maybe CStore -> ItemFull -> ItemQuant -> Either ReqFailure Bool
mp <- ActorId
-> m (Maybe CStore
-> ItemFull -> ItemQuant -> Either ReqFailure Bool)
forall (m :: * -> *).
MonadClientUI m =>
ActorId
-> m (Maybe CStore
-> ItemFull -> ItemQuant -> Either ReqFailure Bool)
permittedApplyClient ActorId
leader
Suitability -> m Suitability
forall (m :: * -> *) a. Monad m => a -> m a
return (Suitability -> m Suitability) -> Suitability -> m Suitability
forall a b. (a -> b) -> a -> b
$ (Maybe CStore -> ItemFull -> ItemQuant -> Bool) -> Suitability
SuitsSomething ((Maybe CStore -> ItemFull -> ItemQuant -> Bool) -> Suitability)
-> (Maybe CStore -> ItemFull -> ItemQuant -> Bool) -> Suitability
forall a b. (a -> b) -> a -> b
$ \Maybe CStore
cstore ItemFull
itemFull ItemQuant
kit ->
Bool -> Either ReqFailure Bool -> Bool
forall b a. b -> Either a b -> b
fromRight Bool
False (Maybe CStore -> ItemFull -> ItemQuant -> Either ReqFailure Bool
mp Maybe CStore
cstore ItemFull
itemFull ItemQuant
kit)
Bool -> Bool -> Bool
&& (String -> Bool
forall a. [a] -> Bool
null String
triggerSyms
Bool -> Bool -> Bool
|| ItemKind -> Char
IK.isymbol (ItemFull -> ItemKind
itemKind ItemFull
itemFull) Char -> String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` String
triggerSyms)
Either Text (CStore, ItemId)
ggi <- ActorId
-> m Suitability
-> Text
-> Text
-> Text
-> Text
-> [CStore]
-> m (Either Text (CStore, ItemId))
forall (m :: * -> *).
MonadClientUI m =>
ActorId
-> m Suitability
-> Text
-> Text
-> Text
-> Text
-> [CStore]
-> m (Either Text (CStore, ItemId))
getGroupItem ActorId
leader m Suitability
psuit Text
prompt Text
promptGeneric Text
verb Text
"trigger"
[CStore]
stores
case Either Text (CStore, ItemId)
ggi of
Right (CStore
fromCStore, ItemId
iid) -> do
(SessionUI -> SessionUI) -> m ()
forall (m :: * -> *).
MonadClientUI m =>
(SessionUI -> SessionUI) -> m ()
modifySession ((SessionUI -> SessionUI) -> m ())
-> (SessionUI -> SessionUI) -> m ()
forall a b. (a -> b) -> a -> b
$ \SessionUI
sess ->
SessionUI
sess {sitemSel :: Maybe (ItemId, CStore, Bool)
sitemSel = (ItemId, CStore, Bool) -> Maybe (ItemId, CStore, Bool)
forall a. a -> Maybe a
Just (ItemId
iid, CStore
fromCStore, Bool
False)}
MError -> m MError
forall (m :: * -> *) a. Monad m => a -> m a
return MError
forall a. Maybe a
Nothing
Left Text
err -> Text -> m MError
forall (m :: * -> *). MonadClientUI m => Text -> m MError
failMsg Text
err
permittedApplyClient :: MonadClientUI m
=> ActorId
-> m (Maybe CStore -> ItemFull -> ItemQuant
-> Either ReqFailure Bool)
permittedApplyClient :: ActorId
-> m (Maybe CStore
-> ItemFull -> ItemQuant -> Either ReqFailure Bool)
permittedApplyClient ActorId
leader = do
COps{RuleContent
corule :: RuleContent
corule :: COps -> RuleContent
corule} <- (State -> COps) -> m COps
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState State -> COps
scops
Skills
actorCurAndMaxSk <- (State -> Skills) -> m Skills
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState ((State -> Skills) -> m Skills) -> (State -> Skills) -> m Skills
forall a b. (a -> b) -> a -> b
$ ActorId -> State -> Skills
getActorMaxSkills ActorId
leader
Actor
b <- (State -> Actor) -> m Actor
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState ((State -> Actor) -> m Actor) -> (State -> Actor) -> m Actor
forall a b. (a -> b) -> a -> b
$ ActorId -> State -> Actor
getActorBody ActorId
leader
let skill :: X
skill = Skill -> Skills -> X
Ability.getSk Skill
Ability.SkApply Skills
actorCurAndMaxSk
calmE :: Bool
calmE = Actor -> Skills -> Bool
calmEnough Actor
b Skills
actorCurAndMaxSk
Time
localTime <- (State -> Time) -> m Time
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState ((State -> Time) -> m Time) -> (State -> Time) -> m Time
forall a b. (a -> b) -> a -> b
$ LevelId -> State -> Time
getLocalTime (Actor -> LevelId
blid Actor
b)
(Maybe CStore -> ItemFull -> ItemQuant -> Either ReqFailure Bool)
-> m (Maybe CStore
-> ItemFull -> ItemQuant -> Either ReqFailure Bool)
forall (m :: * -> *) a. Monad m => a -> m a
return ((Maybe CStore -> ItemFull -> ItemQuant -> Either ReqFailure Bool)
-> m (Maybe CStore
-> ItemFull -> ItemQuant -> Either ReqFailure Bool))
-> (Maybe CStore
-> ItemFull -> ItemQuant -> Either ReqFailure Bool)
-> m (Maybe CStore
-> ItemFull -> ItemQuant -> Either ReqFailure Bool)
forall a b. (a -> b) -> a -> b
$ RuleContent
-> Time
-> X
-> Bool
-> Maybe CStore
-> ItemFull
-> ItemQuant
-> Either ReqFailure Bool
permittedApply RuleContent
corule Time
localTime X
skill Bool
calmE
pickLeaderHuman :: MonadClientUI m => Int -> m MError
pickLeaderHuman :: X -> m MError
pickLeaderHuman X
k = do
FactionId
side <- (StateClient -> FactionId) -> m FactionId
forall (m :: * -> *) a.
MonadClientRead m =>
(StateClient -> a) -> m a
getsClient StateClient -> FactionId
sside
Faction
fact <- (State -> Faction) -> m Faction
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState ((State -> Faction) -> m Faction)
-> (State -> Faction) -> m Faction
forall a b. (a -> b) -> a -> b
$ (EnumMap FactionId Faction -> FactionId -> Faction
forall k a. Enum k => EnumMap k a -> k -> a
EM.! FactionId
side) (EnumMap FactionId Faction -> Faction)
-> (State -> EnumMap FactionId Faction) -> State -> Faction
forall b c a. (b -> c) -> (a -> b) -> a -> c
. State -> EnumMap FactionId Faction
sfactionD
LevelId
arena <- m LevelId
forall (m :: * -> *). MonadClientUI m => m LevelId
getArenaUI
ActorDictUI
sactorUI <- (SessionUI -> ActorDictUI) -> m ActorDictUI
forall (m :: * -> *) a. MonadClientUI m => (SessionUI -> a) -> m a
getsSession SessionUI -> ActorDictUI
sactorUI
Maybe (ActorId, Actor)
mhero <- (State -> Maybe (ActorId, Actor)) -> m (Maybe (ActorId, Actor))
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState ((State -> Maybe (ActorId, Actor)) -> m (Maybe (ActorId, Actor)))
-> (State -> Maybe (ActorId, Actor)) -> m (Maybe (ActorId, Actor))
forall a b. (a -> b) -> a -> b
$ ActorDictUI -> FactionId -> X -> State -> Maybe (ActorId, Actor)
tryFindHeroK ActorDictUI
sactorUI FactionId
side X
k
[(ActorId, Actor)]
allOurs <- (State -> [(ActorId, Actor)]) -> m [(ActorId, Actor)]
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState ((State -> [(ActorId, Actor)]) -> m [(ActorId, Actor)])
-> (State -> [(ActorId, Actor)]) -> m [(ActorId, Actor)]
forall a b. (a -> b) -> a -> b
$ FactionId -> State -> [(ActorId, Actor)]
fidActorNotProjGlobalAssocs FactionId
side
let allOursUI :: [(ActorId, Actor, ActorUI)]
allOursUI = ((ActorId, Actor) -> (ActorId, Actor, ActorUI))
-> [(ActorId, Actor)] -> [(ActorId, Actor, ActorUI)]
forall a b. (a -> b) -> [a] -> [b]
map (\(ActorId
aid, Actor
b) -> (ActorId
aid, Actor
b, ActorDictUI
sactorUI ActorDictUI -> ActorId -> ActorUI
forall k a. Enum k => EnumMap k a -> k -> a
EM.! ActorId
aid)) [(ActorId, Actor)]
allOurs
hs :: [(ActorId, Actor, ActorUI)]
hs = ((ActorId, Actor, ActorUI)
-> (Bool, Bool, Bool, Char, Color, ActorId))
-> [(ActorId, Actor, ActorUI)] -> [(ActorId, Actor, ActorUI)]
forall b a. Ord b => (a -> b) -> [a] -> [a]
sortOn (ActorId, Actor, ActorUI)
-> (Bool, Bool, Bool, Char, Color, ActorId)
keySelected [(ActorId, Actor, ActorUI)]
allOursUI
mactor :: Maybe (ActorId, Actor)
mactor = case X -> [(ActorId, Actor, ActorUI)] -> [(ActorId, Actor, ActorUI)]
forall a. X -> [a] -> [a]
drop X
k [(ActorId, Actor, ActorUI)]
hs of
[] -> Maybe (ActorId, Actor)
forall a. Maybe a
Nothing
(ActorId
aid, Actor
b, ActorUI
_) : [(ActorId, Actor, ActorUI)]
_ -> (ActorId, Actor) -> Maybe (ActorId, Actor)
forall a. a -> Maybe a
Just (ActorId
aid, Actor
b)
mchoice :: Maybe (ActorId, Actor)
mchoice = if Player -> Bool
MK.fhasGender (Faction -> Player
gplayer Faction
fact) then Maybe (ActorId, Actor)
mhero else Maybe (ActorId, Actor)
mactor
(Bool
autoDun, Bool
_) = Faction -> (Bool, Bool)
autoDungeonLevel Faction
fact
case Maybe (ActorId, Actor)
mchoice of
Maybe (ActorId, Actor)
Nothing -> Text -> m MError
forall (m :: * -> *). MonadClientUI m => Text -> m MError
failMsg Text
"no such member of the party"
Just (ActorId
aid, Actor
b)
| Actor -> LevelId
blid Actor
b LevelId -> LevelId -> Bool
forall a. Eq a => a -> a -> Bool
/= LevelId
arena Bool -> Bool -> Bool
&& Bool
autoDun ->
Text -> m MError
forall (m :: * -> *). MonadClientUI m => Text -> m MError
failMsg (Text -> m MError) -> Text -> m MError
forall a b. (a -> b) -> a -> b
$ ReqFailure -> Text
showReqFailure ReqFailure
NoChangeDunLeader
| Bool
otherwise -> do
m Bool -> m ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (m Bool -> m ()) -> m Bool -> m ()
forall a b. (a -> b) -> a -> b
$ Bool -> ActorId -> m Bool
forall (m :: * -> *). MonadClientUI m => Bool -> ActorId -> m Bool
pickLeader Bool
True ActorId
aid
MError -> m MError
forall (m :: * -> *) a. Monad m => a -> m a
return MError
forall a. Maybe a
Nothing
pickLeaderWithPointerHuman :: MonadClientUI m => ActorId -> m MError
pickLeaderWithPointerHuman :: ActorId -> m MError
pickLeaderWithPointerHuman = ActorId -> m MError
forall (m :: * -> *). MonadClientUI m => ActorId -> m MError
pickLeaderWithPointer
pointmanCycleLevelHuman :: MonadClientUI m => ActorId -> Direction -> m MError
pointmanCycleLevelHuman :: ActorId -> Direction -> m MError
pointmanCycleLevelHuman ActorId
leader = ActorId -> Bool -> Direction -> m MError
forall (m :: * -> *).
MonadClientUI m =>
ActorId -> Bool -> Direction -> m MError
pointmanCycleLevel ActorId
leader Bool
True
pointmanCycleHuman :: MonadClientUI m => ActorId -> Direction -> m MError
pointmanCycleHuman :: ActorId -> Direction -> m MError
pointmanCycleHuman ActorId
leader = ActorId -> Bool -> Direction -> m MError
forall (m :: * -> *).
MonadClientUI m =>
ActorId -> Bool -> Direction -> m MError
pointmanCycle ActorId
leader Bool
True
selectActorHuman :: MonadClientUI m => ActorId -> m ()
selectActorHuman :: ActorId -> m ()
selectActorHuman ActorId
leader = do
ActorUI
bodyUI <- (SessionUI -> ActorUI) -> m ActorUI
forall (m :: * -> *) a. MonadClientUI m => (SessionUI -> a) -> m a
getsSession ((SessionUI -> ActorUI) -> m ActorUI)
-> (SessionUI -> ActorUI) -> m ActorUI
forall a b. (a -> b) -> a -> b
$ ActorId -> SessionUI -> ActorUI
getActorUI ActorId
leader
Bool
wasMemeber <- (SessionUI -> Bool) -> m Bool
forall (m :: * -> *) a. MonadClientUI m => (SessionUI -> a) -> m a
getsSession ((SessionUI -> Bool) -> m Bool) -> (SessionUI -> Bool) -> m Bool
forall a b. (a -> b) -> a -> b
$ ActorId -> EnumSet ActorId -> Bool
forall k. Enum k => k -> EnumSet k -> Bool
ES.member ActorId
leader (EnumSet ActorId -> Bool)
-> (SessionUI -> EnumSet ActorId) -> SessionUI -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SessionUI -> EnumSet ActorId
sselected
let upd :: EnumSet ActorId -> EnumSet ActorId
upd = if Bool
wasMemeber
then ActorId -> EnumSet ActorId -> EnumSet ActorId
forall k. Enum k => k -> EnumSet k -> EnumSet k
ES.delete ActorId
leader
else ActorId -> EnumSet ActorId -> EnumSet ActorId
forall k. Enum k => k -> EnumSet k -> EnumSet k
ES.insert ActorId
leader
(SessionUI -> SessionUI) -> m ()
forall (m :: * -> *).
MonadClientUI m =>
(SessionUI -> SessionUI) -> m ()
modifySession ((SessionUI -> SessionUI) -> m ())
-> (SessionUI -> SessionUI) -> m ()
forall a b. (a -> b) -> a -> b
$ \SessionUI
sess -> SessionUI
sess {sselected :: EnumSet ActorId
sselected = EnumSet ActorId -> EnumSet ActorId
upd (EnumSet ActorId -> EnumSet ActorId)
-> EnumSet ActorId -> EnumSet ActorId
forall a b. (a -> b) -> a -> b
$ SessionUI -> EnumSet ActorId
sselected SessionUI
sess}
let subject :: Part
subject = ActorUI -> Part
partActor ActorUI
bodyUI
MsgClassShow -> Text -> m ()
forall (m :: * -> *) a.
(MonadClientUI m, MsgShared a) =>
a -> Text -> m ()
msgAdd MsgClassShow
MsgActionAlert (Text -> m ()) -> Text -> m ()
forall a b. (a -> b) -> a -> b
$ [Part] -> Text
makeSentence [Part
subject, if Bool
wasMemeber
then Part
"deselected"
else Part
"selected"]
selectNoneHuman :: MonadClientUI m => m ()
selectNoneHuman :: m ()
selectNoneHuman = do
FactionId
side <- (StateClient -> FactionId) -> m FactionId
forall (m :: * -> *) a.
MonadClientRead m =>
(StateClient -> a) -> m a
getsClient StateClient -> FactionId
sside
LevelId
lidV <- m LevelId
forall (m :: * -> *). MonadClientUI m => m LevelId
viewedLevelUI
[ActorId]
oursIds <- (State -> [ActorId]) -> m [ActorId]
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState ((State -> [ActorId]) -> m [ActorId])
-> (State -> [ActorId]) -> m [ActorId]
forall a b. (a -> b) -> a -> b
$ FactionId -> LevelId -> State -> [ActorId]
fidActorRegularIds FactionId
side LevelId
lidV
let ours :: EnumSet ActorId
ours = [ActorId] -> EnumSet ActorId
forall k. Enum k => [k] -> EnumSet k
ES.fromDistinctAscList [ActorId]
oursIds
EnumSet ActorId
oldSel <- (SessionUI -> EnumSet ActorId) -> m (EnumSet ActorId)
forall (m :: * -> *) a. MonadClientUI m => (SessionUI -> a) -> m a
getsSession SessionUI -> EnumSet ActorId
sselected
let wasNone :: Bool
wasNone = EnumSet ActorId -> Bool
forall k. EnumSet k -> Bool
ES.null (EnumSet ActorId -> Bool) -> EnumSet ActorId -> Bool
forall a b. (a -> b) -> a -> b
$ EnumSet ActorId -> EnumSet ActorId -> EnumSet ActorId
forall k. EnumSet k -> EnumSet k -> EnumSet k
ES.intersection EnumSet ActorId
ours EnumSet ActorId
oldSel
upd :: EnumSet ActorId -> EnumSet ActorId -> EnumSet ActorId
upd = if Bool
wasNone
then EnumSet ActorId -> EnumSet ActorId -> EnumSet ActorId
forall k. EnumSet k -> EnumSet k -> EnumSet k
ES.union
else EnumSet ActorId -> EnumSet ActorId -> EnumSet ActorId
forall k. EnumSet k -> EnumSet k -> EnumSet k
ES.difference
(SessionUI -> SessionUI) -> m ()
forall (m :: * -> *).
MonadClientUI m =>
(SessionUI -> SessionUI) -> m ()
modifySession ((SessionUI -> SessionUI) -> m ())
-> (SessionUI -> SessionUI) -> m ()
forall a b. (a -> b) -> a -> b
$ \SessionUI
sess -> SessionUI
sess {sselected :: EnumSet ActorId
sselected = EnumSet ActorId -> EnumSet ActorId -> EnumSet ActorId
upd (SessionUI -> EnumSet ActorId
sselected SessionUI
sess) EnumSet ActorId
ours}
let subject :: Part
subject = Part
"all party members on the level"
MsgClassShow -> Text -> m ()
forall (m :: * -> *) a.
(MonadClientUI m, MsgShared a) =>
a -> Text -> m ()
msgAdd MsgClassShow
MsgActionAlert (Text -> m ()) -> Text -> m ()
forall a b. (a -> b) -> a -> b
$ [Part] -> Text
makeSentence [Part
subject, if Bool
wasNone
then Part
"selected"
else Part
"deselected"]
selectWithPointerHuman :: MonadClientUI m => m MError
selectWithPointerHuman :: m MError
selectWithPointerHuman = do
COps{corule :: COps -> RuleContent
corule=RuleContent{X
rHeightMax :: X
rHeightMax :: RuleContent -> X
rHeightMax}} <- (State -> COps) -> m COps
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState State -> COps
scops
LevelId
lidV <- m LevelId
forall (m :: * -> *). MonadClientUI m => m LevelId
viewedLevelUI
FactionId
side <- (StateClient -> FactionId) -> m FactionId
forall (m :: * -> *) a.
MonadClientRead m =>
(StateClient -> a) -> m a
getsClient StateClient -> FactionId
sside
[(ActorId, Actor)]
ours <- (State -> [(ActorId, Actor)]) -> m [(ActorId, Actor)]
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState ((State -> [(ActorId, Actor)]) -> m [(ActorId, Actor)])
-> (State -> [(ActorId, Actor)]) -> m [(ActorId, Actor)]
forall a b. (a -> b) -> a -> b
$ ((ActorId, Actor) -> Bool)
-> [(ActorId, Actor)] -> [(ActorId, Actor)]
forall a. (a -> Bool) -> [a] -> [a]
filter (Bool -> Bool
not (Bool -> Bool)
-> ((ActorId, Actor) -> Bool) -> (ActorId, Actor) -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Actor -> Bool
bproj (Actor -> Bool)
-> ((ActorId, Actor) -> Actor) -> (ActorId, Actor) -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ActorId, Actor) -> Actor
forall a b. (a, b) -> b
snd)
([(ActorId, Actor)] -> [(ActorId, Actor)])
-> (State -> [(ActorId, Actor)]) -> State -> [(ActorId, Actor)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (FactionId -> Bool) -> LevelId -> State -> [(ActorId, Actor)]
actorAssocs (FactionId -> FactionId -> Bool
forall a. Eq a => a -> a -> Bool
== FactionId
side) LevelId
lidV
ActorDictUI
sactorUI <- (SessionUI -> ActorDictUI) -> m ActorDictUI
forall (m :: * -> *) a. MonadClientUI m => (SessionUI -> a) -> m a
getsSession SessionUI -> ActorDictUI
sactorUI
let oursUI :: [(ActorId, Actor, ActorUI)]
oursUI = ((ActorId, Actor) -> (ActorId, Actor, ActorUI))
-> [(ActorId, Actor)] -> [(ActorId, Actor, ActorUI)]
forall a b. (a -> b) -> [a] -> [b]
map (\(ActorId
aid, Actor
b) -> (ActorId
aid, Actor
b, ActorDictUI
sactorUI ActorDictUI -> ActorId -> ActorUI
forall k a. Enum k => EnumMap k a -> k -> a
EM.! ActorId
aid)) [(ActorId, Actor)]
ours
viewed :: [(ActorId, Actor, ActorUI)]
viewed = ((ActorId, Actor, ActorUI)
-> (Bool, Bool, Bool, Char, Color, ActorId))
-> [(ActorId, Actor, ActorUI)] -> [(ActorId, Actor, ActorUI)]
forall b a. Ord b => (a -> b) -> [a] -> [a]
sortOn (ActorId, Actor, ActorUI)
-> (Bool, Bool, Bool, Char, Color, ActorId)
keySelected [(ActorId, Actor, ActorUI)]
oursUI
PointUI
pUI <- (SessionUI -> PointUI) -> m PointUI
forall (m :: * -> *) a. MonadClientUI m => (SessionUI -> a) -> m a
getsSession SessionUI -> PointUI
spointer
let p :: Point
p@(Point X
px X
py) = PointSquare -> Point
squareToMap (PointSquare -> Point) -> PointSquare -> Point
forall a b. (a -> b) -> a -> b
$ PointUI -> PointSquare
uiToSquare PointUI
pUI
if | X
py X -> X -> Bool
forall a. Eq a => a -> a -> Bool
== X
rHeightMax X -> X -> X
forall a. Num a => a -> a -> a
+ X
1 Bool -> Bool -> Bool
&& X
px X -> X -> Bool
forall a. Eq a => a -> a -> Bool
== X
0 -> m ()
forall (m :: * -> *). MonadClientUI m => m ()
selectNoneHuman m () -> m MError -> m MError
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> MError -> m MError
forall (m :: * -> *) a. Monad m => a -> m a
return MError
forall a. Maybe a
Nothing
| X
py X -> X -> Bool
forall a. Eq a => a -> a -> Bool
== X
rHeightMax X -> X -> X
forall a. Num a => a -> a -> a
+ X
1 ->
case X -> [(ActorId, Actor, ActorUI)] -> [(ActorId, Actor, ActorUI)]
forall a. X -> [a] -> [a]
drop (X
px X -> X -> X
forall a. Num a => a -> a -> a
- X
1) [(ActorId, Actor, ActorUI)]
viewed of
[] -> Text -> m MError
forall (m :: * -> *). MonadClientUI m => Text -> m MError
failMsg Text
"not pointing at an actor"
(ActorId
aid, Actor
_, ActorUI
_) : [(ActorId, Actor, ActorUI)]
_ -> ActorId -> m ()
forall (m :: * -> *). MonadClientUI m => ActorId -> m ()
selectActorHuman ActorId
aid m () -> m MError -> m MError
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> MError -> m MError
forall (m :: * -> *) a. Monad m => a -> m a
return MError
forall a. Maybe a
Nothing
| Bool
otherwise ->
case ((ActorId, Actor) -> Bool)
-> [(ActorId, Actor)] -> Maybe (ActorId, Actor)
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Maybe a
find (\(ActorId
_, Actor
b) -> Actor -> Point
bpos Actor
b Point -> Point -> Bool
forall a. Eq a => a -> a -> Bool
== Point
p) [(ActorId, Actor)]
ours of
Maybe (ActorId, Actor)
Nothing -> Text -> m MError
forall (m :: * -> *). MonadClientUI m => Text -> m MError
failMsg Text
"not pointing at an actor"
Just (ActorId
aid, Actor
_) -> ActorId -> m ()
forall (m :: * -> *). MonadClientUI m => ActorId -> m ()
selectActorHuman ActorId
aid m () -> m MError -> m MError
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> MError -> m MError
forall (m :: * -> *) a. Monad m => a -> m a
return MError
forall a. Maybe a
Nothing
repeatHuman :: MonadClientUI m => Int -> m ()
repeatHuman :: X -> m ()
repeatHuman X
n =
(SessionUI -> SessionUI) -> m ()
forall (m :: * -> *).
MonadClientUI m =>
(SessionUI -> SessionUI) -> m ()
modifySession ((SessionUI -> SessionUI) -> m ())
-> (SessionUI -> SessionUI) -> m ()
forall a b. (a -> b) -> a -> b
$ \SessionUI
sess ->
let (KeyMacroFrame
smacroFrameNew, [KeyMacroFrame]
smacroStackMew) =
X
-> KeyMacroFrame
-> [KeyMacroFrame]
-> (KeyMacroFrame, [KeyMacroFrame])
repeatHumanTransition X
n (SessionUI -> KeyMacroFrame
smacroFrame SessionUI
sess) (SessionUI -> [KeyMacroFrame]
smacroStack SessionUI
sess)
in SessionUI
sess { smacroFrame :: KeyMacroFrame
smacroFrame = KeyMacroFrame
smacroFrameNew
, smacroStack :: [KeyMacroFrame]
smacroStack = [KeyMacroFrame]
smacroStackMew }
repeatHumanTransition :: Int -> KeyMacroFrame -> [KeyMacroFrame]
-> (KeyMacroFrame, [KeyMacroFrame])
repeatHumanTransition :: X
-> KeyMacroFrame
-> [KeyMacroFrame]
-> (KeyMacroFrame, [KeyMacroFrame])
repeatHumanTransition X
n KeyMacroFrame
macroFrame [KeyMacroFrame]
macroFrames =
let kms :: [KM]
kms = [[KM]] -> [KM]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([[KM]] -> [KM])
-> (Either [KM] KeyMacro -> [[KM]]) -> Either [KM] KeyMacro -> [KM]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. X -> [KM] -> [[KM]]
forall a. X -> a -> [a]
replicate X
n ([KM] -> [[KM]])
-> (Either [KM] KeyMacro -> [KM]) -> Either [KM] KeyMacro -> [[KM]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. KeyMacro -> [KM]
unKeyMacro (KeyMacro -> [KM])
-> (Either [KM] KeyMacro -> KeyMacro)
-> Either [KM] KeyMacro
-> [KM]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. KeyMacro -> Either [KM] KeyMacro -> KeyMacro
forall b a. b -> Either a b -> b
fromRight KeyMacro
forall a. Monoid a => a
mempty
(Either [KM] KeyMacro -> [KM]) -> Either [KM] KeyMacro -> [KM]
forall a b. (a -> b) -> a -> b
$ KeyMacroFrame -> Either [KM] KeyMacro
keyMacroBuffer KeyMacroFrame
macroFrame
in [KM]
-> KeyMacroFrame
-> [KeyMacroFrame]
-> (KeyMacroFrame, [KeyMacroFrame])
macroHumanTransition [KM]
kms KeyMacroFrame
macroFrame [KeyMacroFrame]
macroFrames
repeatLastHuman :: MonadClientUI m => Int -> m ()
repeatLastHuman :: X -> m ()
repeatLastHuman X
n = (SessionUI -> SessionUI) -> m ()
forall (m :: * -> *).
MonadClientUI m =>
(SessionUI -> SessionUI) -> m ()
modifySession ((SessionUI -> SessionUI) -> m ())
-> (SessionUI -> SessionUI) -> m ()
forall a b. (a -> b) -> a -> b
$ \SessionUI
sess ->
SessionUI
sess {smacroFrame :: KeyMacroFrame
smacroFrame = X -> KeyMacroFrame -> KeyMacroFrame
repeatLastHumanTransition X
n (SessionUI -> KeyMacroFrame
smacroFrame SessionUI
sess) }
repeatLastHumanTransition :: Int -> KeyMacroFrame -> KeyMacroFrame
repeatLastHumanTransition :: X -> KeyMacroFrame -> KeyMacroFrame
repeatLastHumanTransition X
n KeyMacroFrame
macroFrame =
let macro :: KeyMacro
macro = [KM] -> KeyMacro
KeyMacro ([KM] -> KeyMacro) -> (Maybe KM -> [KM]) -> Maybe KM -> KeyMacro
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [[KM]] -> [KM]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([[KM]] -> [KM]) -> (Maybe KM -> [[KM]]) -> Maybe KM -> [KM]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. X -> [KM] -> [[KM]]
forall a. X -> a -> [a]
replicate X
n ([KM] -> [[KM]]) -> (Maybe KM -> [KM]) -> Maybe KM -> [[KM]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Maybe KM -> [KM]
forall a. Maybe a -> [a]
maybeToList (Maybe KM -> KeyMacro) -> Maybe KM -> KeyMacro
forall a b. (a -> b) -> a -> b
$ KeyMacroFrame -> Maybe KM
keyLast KeyMacroFrame
macroFrame
in KeyMacroFrame
macroFrame { keyPending :: KeyMacro
keyPending = KeyMacro
macro KeyMacro -> KeyMacro -> KeyMacro
forall a. Semigroup a => a -> a -> a
<> KeyMacroFrame -> KeyMacro
keyPending KeyMacroFrame
macroFrame }
recordHuman :: MonadClientUI m => m ()
recordHuman :: m ()
recordHuman = do
KeyMacroFrame
smacroFrameOld <- (SessionUI -> KeyMacroFrame) -> m KeyMacroFrame
forall (m :: * -> *) a. MonadClientUI m => (SessionUI -> a) -> m a
getsSession SessionUI -> KeyMacroFrame
smacroFrame
let (KeyMacroFrame
smacroFrameNew, Text
msg) = KeyMacroFrame -> (KeyMacroFrame, Text)
recordHumanTransition KeyMacroFrame
smacroFrameOld
(SessionUI -> SessionUI) -> m ()
forall (m :: * -> *).
MonadClientUI m =>
(SessionUI -> SessionUI) -> m ()
modifySession ((SessionUI -> SessionUI) -> m ())
-> (SessionUI -> SessionUI) -> m ()
forall a b. (a -> b) -> a -> b
$ \SessionUI
sess -> SessionUI
sess {smacroFrame :: KeyMacroFrame
smacroFrame = KeyMacroFrame
smacroFrameNew}
[KeyMacroFrame]
macroStack <- (SessionUI -> [KeyMacroFrame]) -> m [KeyMacroFrame]
forall (m :: * -> *) a. MonadClientUI m => (SessionUI -> a) -> m a
getsSession SessionUI -> [KeyMacroFrame]
smacroStack
Bool -> m () -> m ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (Text -> Bool
T.null Text
msg Bool -> Bool -> Bool
|| Bool -> Bool
not ([KeyMacroFrame] -> Bool
forall a. [a] -> Bool
null [KeyMacroFrame]
macroStack)) (m () -> m ()) -> m () -> m ()
forall a b. (a -> b) -> a -> b
$ MsgClassShow -> Text -> m ()
forall (m :: * -> *) a.
(MonadClientUI m, MsgShared a) =>
a -> Text -> m ()
msgAdd MsgClassShow
MsgPromptGeneric Text
msg
recordHumanTransition :: KeyMacroFrame -> (KeyMacroFrame, Text)
recordHumanTransition :: KeyMacroFrame -> (KeyMacroFrame, Text)
recordHumanTransition KeyMacroFrame
macroFrame =
let (Either [KM] KeyMacro
buffer, Text
msg) = case KeyMacroFrame -> Either [KM] KeyMacro
keyMacroBuffer KeyMacroFrame
macroFrame of
Right KeyMacro
_ ->
([KM] -> Either [KM] KeyMacro
forall a b. a -> Either a b
Left [], Text
"Recording a macro. Stop recording with the same key.")
Left [KM]
xs ->
(KeyMacro -> Either [KM] KeyMacro
forall a b. b -> Either a b
Right (KeyMacro -> Either [KM] KeyMacro)
-> ([KM] -> KeyMacro) -> [KM] -> Either [KM] KeyMacro
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [KM] -> KeyMacro
KeyMacro ([KM] -> KeyMacro) -> ([KM] -> [KM]) -> [KM] -> KeyMacro
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [KM] -> [KM]
forall a. [a] -> [a]
reverse ([KM] -> Either [KM] KeyMacro) -> [KM] -> Either [KM] KeyMacro
forall a b. (a -> b) -> a -> b
$ [KM]
xs, Text
"Macro recording stopped.")
smacroFrameNew :: KeyMacroFrame
smacroFrameNew = KeyMacroFrame
macroFrame {keyMacroBuffer :: Either [KM] KeyMacro
keyMacroBuffer = Either [KM] KeyMacro
buffer}
in (KeyMacroFrame
smacroFrameNew, Text
msg)
allHistoryHuman :: MonadClientUI m => m ()
allHistoryHuman :: m ()
allHistoryHuman = Bool -> m ()
forall (m :: * -> *). MonadClientUI m => Bool -> m ()
eitherHistory Bool
True
eitherHistory :: forall m. MonadClientUI m => Bool -> m ()
eitherHistory :: Bool -> m ()
eitherHistory Bool
showAll = do
CCUI{coscreen :: CCUI -> ScreenContent
coscreen=ScreenContent{X
rwidth :: X
rwidth :: ScreenContent -> X
rwidth, X
rheight :: X
rheight :: ScreenContent -> X
rheight}} <- (SessionUI -> CCUI) -> m CCUI
forall (m :: * -> *) a. MonadClientUI m => (SessionUI -> a) -> m a
getsSession SessionUI -> CCUI
sccui
History
history <- (SessionUI -> History) -> m History
forall (m :: * -> *) a. MonadClientUI m => (SessionUI -> a) -> m a
getsSession SessionUI -> History
shistory
LevelId
arena <- m LevelId
forall (m :: * -> *). MonadClientUI m => m LevelId
getArenaUI
Time
localTime <- (State -> Time) -> m Time
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState ((State -> Time) -> m Time) -> (State -> Time) -> m Time
forall a b. (a -> b) -> a -> b
$ LevelId -> State -> Time
getLocalTime LevelId
arena
Time
global <- (State -> Time) -> m Time
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState State -> Time
stime
FontSetup{DisplayFont
propFont :: DisplayFont
monoFont :: DisplayFont
squareFont :: DisplayFont
propFont :: FontSetup -> DisplayFont
monoFont :: FontSetup -> DisplayFont
squareFont :: FontSetup -> DisplayFont
..} <- m FontSetup
forall (m :: * -> *). MonadClientUI m => m FontSetup
getFontSetup
let renderedHistoryRaw :: [AttrString]
renderedHistoryRaw = History -> [AttrString]
renderHistory History
history
histBoundRaw :: X
histBoundRaw = [AttrString] -> X
forall a. [a] -> X
length [AttrString]
renderedHistoryRaw
placeholderLine :: AttrString
placeholderLine = Color -> Text -> AttrString
textFgToAS Color
Color.BrBlack
Text
"Newest_messages_are_at_the_bottom._Press_END_to_get_there."
placeholderCount :: X
placeholderCount =
(- X
histBoundRaw X -> X -> X
forall a. Integral a => a -> a -> a
`mod` (X
rheight X -> X -> X
forall a. Num a => a -> a -> a
- X
4)) X -> X -> X
forall a. Integral a => a -> a -> a
`mod` (X
rheight X -> X -> X
forall a. Num a => a -> a -> a
- X
4)
renderedHistory :: [AttrString]
renderedHistory = X -> AttrString -> [AttrString]
forall a. X -> a -> [a]
replicate X
placeholderCount AttrString
placeholderLine
[AttrString] -> [AttrString] -> [AttrString]
forall a. [a] -> [a] -> [a]
++ [AttrString]
renderedHistoryRaw
histBound :: X
histBound = X
placeholderCount X -> X -> X
forall a. Num a => a -> a -> a
+ X
histBoundRaw
splitRow :: AttrString -> (AttrLine, (X, AttrLine))
splitRow AttrString
as =
let (AttrString
tLab, AttrString
tDesc) = (AttrCharW32 -> Bool) -> AttrString -> (AttrString, AttrString)
forall a. (a -> Bool) -> [a] -> ([a], [a])
span (AttrCharW32 -> AttrCharW32 -> Bool
forall a. Eq a => a -> a -> Bool
/= AttrCharW32
Color.spaceAttrW32) AttrString
as
labLen :: X
labLen = DisplayFont -> AttrString -> X
forall a. DisplayFont -> [a] -> X
textSize DisplayFont
monoFont AttrString
tLab
par1 :: AttrLine
par1 = case (AttrLine -> Bool) -> [AttrLine] -> [AttrLine]
forall a. (a -> Bool) -> [a] -> [a]
filter (AttrLine -> AttrLine -> Bool
forall a. Eq a => a -> a -> Bool
/= AttrLine
emptyAttrLine) ([AttrLine] -> [AttrLine]) -> [AttrLine] -> [AttrLine]
forall a b. (a -> b) -> a -> b
$ AttrString -> [AttrLine]
linesAttr AttrString
tDesc of
[] -> AttrLine
emptyAttrLine
[AttrLine
l] -> AttrLine
l
[AttrLine]
ls -> AttrString -> AttrLine
attrStringToAL (AttrString -> AttrLine) -> AttrString -> AttrLine
forall a b. (a -> b) -> a -> b
$ AttrString -> [AttrString] -> AttrString
forall a. [a] -> [[a]] -> [a]
intercalate [AttrCharW32
Color.spaceAttrW32]
([AttrString] -> AttrString) -> [AttrString] -> AttrString
forall a b. (a -> b) -> a -> b
$ (AttrLine -> AttrString) -> [AttrLine] -> [AttrString]
forall a b. (a -> b) -> [a] -> [b]
map AttrLine -> AttrString
attrLine [AttrLine]
ls
in (AttrString -> AttrLine
attrStringToAL AttrString
tLab, (X
labLen, AttrLine
par1))
([AttrLine]
tsLab, [(X, AttrLine)]
tsDesc) = [(AttrLine, (X, AttrLine))] -> ([AttrLine], [(X, AttrLine)])
forall a b. [(a, b)] -> ([a], [b])
unzip ([(AttrLine, (X, AttrLine))] -> ([AttrLine], [(X, AttrLine)]))
-> [(AttrLine, (X, AttrLine))] -> ([AttrLine], [(X, AttrLine)])
forall a b. (a -> b) -> a -> b
$ (AttrString -> (AttrLine, (X, AttrLine)))
-> [AttrString] -> [(AttrLine, (X, AttrLine))]
forall a b. (a -> b) -> [a] -> [b]
map AttrString -> (AttrLine, (X, AttrLine))
splitRow [AttrString]
renderedHistory
ovs :: EnumMap DisplayFont Overlay
ovs = (Overlay -> Overlay -> Overlay)
-> DisplayFont
-> Overlay
-> EnumMap DisplayFont Overlay
-> EnumMap DisplayFont Overlay
forall k a.
Enum k =>
(a -> a -> a) -> k -> a -> EnumMap k a -> EnumMap k a
EM.insertWith Overlay -> Overlay -> Overlay
forall a. [a] -> [a] -> [a]
(++) DisplayFont
monoFont ([AttrLine] -> Overlay
offsetOverlay [AttrLine]
tsLab)
(EnumMap DisplayFont Overlay -> EnumMap DisplayFont Overlay)
-> EnumMap DisplayFont Overlay -> EnumMap DisplayFont Overlay
forall a b. (a -> b) -> a -> b
$ DisplayFont -> Overlay -> EnumMap DisplayFont Overlay
forall k a. Enum k => k -> a -> EnumMap k a
EM.singleton DisplayFont
propFont (Overlay -> EnumMap DisplayFont Overlay)
-> Overlay -> EnumMap DisplayFont Overlay
forall a b. (a -> b) -> a -> b
$ [(X, AttrLine)] -> Overlay
offsetOverlayX [(X, AttrLine)]
tsDesc
turnsGlobal :: X
turnsGlobal = Time
global Time -> Time -> X
`timeFitUp` Time
timeTurn
turnsLocal :: X
turnsLocal = Time
localTime Time -> Time -> X
`timeFitUp` Time
timeTurn
msg :: Text
msg = [Part] -> Text
makeSentence
[ Part
"You survived for"
, X -> Part -> Part
MU.CarWs X
turnsGlobal Part
"half-second turn"
, Part
"(this level:"
, X -> Part
MU.Car X
turnsLocal Part -> Part -> Part
forall a. Semigroup a => a -> a -> a
<> Part
")" ]
kxs :: [KYX]
kxs = [ (SlotChar -> KeyOrSlot
forall a b. b -> Either a b
Right SlotChar
sn, ( X -> X -> PointUI
PointUI X
0 (SlotChar -> X
slotPrefix SlotChar
sn)
, DisplayFont -> X -> ButtonWidth
ButtonWidth DisplayFont
propFont X
1000 ))
| SlotChar
sn <- X -> [SlotChar] -> [SlotChar]
forall a. X -> [a] -> [a]
take X
histBound [SlotChar]
intSlots ]
MsgClassShow -> Text -> m ()
forall (m :: * -> *) a.
(MonadClientUI m, MsgShared a) =>
a -> Text -> m ()
msgAdd MsgClassShow
MsgPromptGeneric Text
msg
let keysAllHistory :: [KM]
keysAllHistory =
KM
K.returnKM
#ifndef USE_JSFILE
KM -> [KM] -> [KM]
forall a. a -> [a] -> [a]
: Char -> KM
K.mkChar Char
'.'
#endif
KM -> [KM] -> [KM]
forall a. a -> [a] -> [a]
: [KM
K.escKM]
Slideshow
slides <- X -> [KM] -> OKX -> m Slideshow
forall (m :: * -> *).
MonadClientUI m =>
X -> [KM] -> OKX -> m Slideshow
overlayToSlideshow (X
rheight X -> X -> X
forall a. Num a => a -> a -> a
- X
2) [KM]
keysAllHistory (EnumMap DisplayFont Overlay
ovs, [KYX]
kxs)
let maxIx :: X
maxIx = [KYX] -> X
forall a. [a] -> X
length ((OKX -> [KYX]) -> [OKX] -> [KYX]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap OKX -> [KYX]
forall a b. (a, b) -> b
snd ([OKX] -> [KYX]) -> [OKX] -> [KYX]
forall a b. (a -> b) -> a -> b
$ Slideshow -> [OKX]
slideshow Slideshow
slides) X -> X -> X
forall a. Num a => a -> a -> a
- X
1
menuName :: String
menuName = String
"history"
(SessionUI -> SessionUI) -> m ()
forall (m :: * -> *).
MonadClientUI m =>
(SessionUI -> SessionUI) -> m ()
modifySession ((SessionUI -> SessionUI) -> m ())
-> (SessionUI -> SessionUI) -> m ()
forall a b. (a -> b) -> a -> b
$ \SessionUI
sess ->
SessionUI
sess {smenuIxMap :: Map String X
smenuIxMap = String -> X -> Map String X -> Map String X
forall k a. Ord k => k -> a -> Map k a -> Map k a
M.insert String
menuName X
maxIx (Map String X -> Map String X) -> Map String X -> Map String X
forall a b. (a -> b) -> a -> b
$ SessionUI -> Map String X
smenuIxMap SessionUI
sess}
let displayAllHistory :: m ()
displayAllHistory = do
KeyOrSlot
ekm <- String -> ColorMode -> Bool -> Slideshow -> [KM] -> m KeyOrSlot
forall (m :: * -> *).
MonadClientUI m =>
String -> ColorMode -> Bool -> Slideshow -> [KM] -> m KeyOrSlot
displayChoiceScreen String
menuName ColorMode
ColorFull Bool
False Slideshow
slides
[KM]
keysAllHistory
case KeyOrSlot
ekm of
Left KM
km | KM
km KM -> KM -> Bool
forall a. Eq a => a -> a -> Bool
== Char -> KM
K.mkChar Char
'.' -> do
let t :: Text
t = [Text] -> Text
T.unlines ([Text] -> Text) -> [Text] -> Text
forall a b. (a -> b) -> a -> b
$ (AttrString -> Text) -> [AttrString] -> [Text]
forall a b. (a -> b) -> [a] -> [b]
map (String -> Text
T.pack (String -> Text) -> (AttrString -> String) -> AttrString -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (AttrCharW32 -> Char) -> AttrString -> String
forall a b. (a -> b) -> [a] -> [b]
map AttrCharW32 -> Char
Color.charFromW32)
[AttrString]
renderedHistoryRaw
String
path <- Text -> String -> m String
forall (m :: * -> *).
MonadClientRead m =>
Text -> String -> m String
dumpTextFile Text
t String
"history.txt"
MsgClassShow -> Text -> m ()
forall (m :: * -> *) a.
(MonadClientUI m, MsgShared a) =>
a -> Text -> m ()
msgAdd MsgClassShow
MsgPromptGeneric (Text -> m ()) -> Text -> m ()
forall a b. (a -> b) -> a -> b
$ Text
"All of history dumped to file" Text -> Text -> Text
<+> String -> Text
T.pack String
path Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
"."
Left KM
km | KM
km KM -> KM -> Bool
forall a. Eq a => a -> a -> Bool
== KM
K.escKM ->
MsgClassShow -> Text -> m ()
forall (m :: * -> *) a.
(MonadClientUI m, MsgShared a) =>
a -> Text -> m ()
msgAdd MsgClassShow
MsgPromptGeneric Text
"Try to survive a few seconds more, if you can."
Left KM
km | KM
km KM -> KM -> Bool
forall a. Eq a => a -> a -> Bool
== KM
K.spaceKM ->
MsgClassShow -> Text -> m ()
forall (m :: * -> *) a.
(MonadClientUI m, MsgShared a) =>
a -> Text -> m ()
msgAdd MsgClassShow
MsgPromptGeneric Text
"Steady on."
Right SlotChar{Char
X
slotChar :: SlotChar -> Char
slotChar :: Char
slotPrefix :: X
slotPrefix :: SlotChar -> X
..} | Char
slotChar Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'a' ->
X -> m ()
displayOneReport (X -> m ()) -> X -> m ()
forall a b. (a -> b) -> a -> b
$ X -> X -> X
forall a. Ord a => a -> a -> a
max X
0 (X -> X) -> X -> X
forall a b. (a -> b) -> a -> b
$ X
slotPrefix X -> X -> X
forall a. Num a => a -> a -> a
- X
placeholderCount
KeyOrSlot
_ -> String -> m ()
forall a. HasCallStack => String -> a
error (String -> m ()) -> String -> m ()
forall a b. (a -> b) -> a -> b
$ String
"" String -> KeyOrSlot -> String
forall v. Show v => String -> v -> String
`showFailure` KeyOrSlot
ekm
displayOneReport :: Int -> m ()
displayOneReport :: X -> m ()
displayOneReport X
histSlot = do
let timeReport :: AttrString
timeReport = case X -> [AttrString] -> [AttrString]
forall a. X -> [a] -> [a]
drop X
histSlot [AttrString]
renderedHistoryRaw of
[] -> String -> AttrString
forall a. HasCallStack => String -> a
error (String -> AttrString) -> String -> AttrString
forall a b. (a -> b) -> a -> b
$ String
"" String -> X -> String
forall v. Show v => String -> v -> String
`showFailure` X
histSlot
AttrString
tR : [AttrString]
_ -> AttrString
tR
(Overlay
ovLab, Overlay
ovDesc) = DisplayFont -> X -> AttrString -> (Overlay, Overlay)
labDescOverlay DisplayFont
monoFont X
rwidth AttrString
timeReport
ov0 :: EnumMap DisplayFont Overlay
ov0 = (Overlay -> Overlay -> Overlay)
-> DisplayFont
-> Overlay
-> EnumMap DisplayFont Overlay
-> EnumMap DisplayFont Overlay
forall k a.
Enum k =>
(a -> a -> a) -> k -> a -> EnumMap k a -> EnumMap k a
EM.insertWith Overlay -> Overlay -> Overlay
forall a. [a] -> [a] -> [a]
(++) DisplayFont
monoFont Overlay
ovLab
(EnumMap DisplayFont Overlay -> EnumMap DisplayFont Overlay)
-> EnumMap DisplayFont Overlay -> EnumMap DisplayFont Overlay
forall a b. (a -> b) -> a -> b
$ DisplayFont -> Overlay -> EnumMap DisplayFont Overlay
forall k a. Enum k => k -> a -> EnumMap k a
EM.singleton DisplayFont
propFont Overlay
ovDesc
prompt :: Text
prompt = [Part] -> Text
makeSentence
[ Part
"the", X -> Part
MU.Ordinal (X -> Part) -> X -> Part
forall a b. (a -> b) -> a -> b
$ X
histSlot X -> X -> X
forall a. Num a => a -> a -> a
+ X
1
, Part
"most recent record follows" ]
keys :: [KM]
keys = [KM
K.spaceKM, KM
K.escKM]
[KM] -> [KM] -> [KM]
forall a. [a] -> [a] -> [a]
++ [KM
K.upKM | X
histSlot X -> X -> Bool
forall a. Eq a => a -> a -> Bool
/= X
0]
[KM] -> [KM] -> [KM]
forall a. [a] -> [a] -> [a]
++ [KM
K.downKM | X
histSlot X -> X -> Bool
forall a. Eq a => a -> a -> Bool
/= X
histBoundRaw X -> X -> X
forall a. Num a => a -> a -> a
- X
1]
MsgClassShow -> Text -> m ()
forall (m :: * -> *) a.
(MonadClientUI m, MsgShared a) =>
a -> Text -> m ()
msgAdd MsgClassShow
MsgPromptGeneric Text
prompt
Slideshow
slides2 <- X -> [KM] -> OKX -> m Slideshow
forall (m :: * -> *).
MonadClientUI m =>
X -> [KM] -> OKX -> m Slideshow
overlayToSlideshow (X
rheight X -> X -> X
forall a. Num a => a -> a -> a
- X
2) [KM]
keys (EnumMap DisplayFont Overlay
ov0, [])
KM
km <- ColorMode -> [KM] -> Slideshow -> m KM
forall (m :: * -> *).
MonadClientUI m =>
ColorMode -> [KM] -> Slideshow -> m KM
getConfirms ColorMode
ColorFull [KM]
keys Slideshow
slides2
case KM -> Key
K.key KM
km of
Key
K.Space -> m ()
displayAllHistory
Key
K.Up -> X -> m ()
displayOneReport (X -> m ()) -> X -> m ()
forall a b. (a -> b) -> a -> b
$ X
histSlot X -> X -> X
forall a. Num a => a -> a -> a
- X
1
Key
K.Down -> X -> m ()
displayOneReport (X -> m ()) -> X -> m ()
forall a b. (a -> b) -> a -> b
$ X
histSlot X -> X -> X
forall a. Num a => a -> a -> a
+ X
1
Key
K.Esc -> MsgClassShow -> Text -> m ()
forall (m :: * -> *) a.
(MonadClientUI m, MsgShared a) =>
a -> Text -> m ()
msgAdd MsgClassShow
MsgPromptGeneric Text
"Try to learn from your previous mistakes."
Key
_ -> String -> m ()
forall a. HasCallStack => String -> a
error (String -> m ()) -> String -> m ()
forall a b. (a -> b) -> a -> b
$ String
"" String -> KM -> String
forall v. Show v => String -> v -> String
`showFailure` KM
km
if Bool
showAll
then m ()
displayAllHistory
else X -> m ()
displayOneReport (X
histBoundRaw X -> X -> X
forall a. Num a => a -> a -> a
- X
1)
lastHistoryHuman :: MonadClientUI m => m ()
lastHistoryHuman :: m ()
lastHistoryHuman = Bool -> m ()
forall (m :: * -> *). MonadClientUI m => Bool -> m ()
eitherHistory Bool
False
markVisionHuman :: MonadClientUI m => m ()
markVisionHuman :: m ()
markVisionHuman = (SessionUI -> SessionUI) -> m ()
forall (m :: * -> *).
MonadClientUI m =>
(SessionUI -> SessionUI) -> m ()
modifySession SessionUI -> SessionUI
cycleMarkVision
markSmellHuman :: MonadClientUI m => m ()
markSmellHuman :: m ()
markSmellHuman = (SessionUI -> SessionUI) -> m ()
forall (m :: * -> *).
MonadClientUI m =>
(SessionUI -> SessionUI) -> m ()
modifySession SessionUI -> SessionUI
toggleMarkSmell
markSuspectHuman :: MonadClient m => m ()
markSuspectHuman :: m ()
markSuspectHuman = do
m ()
forall (m :: * -> *). MonadClient m => m ()
invalidateBfsAll
(StateClient -> StateClient) -> m ()
forall (m :: * -> *).
MonadClient m =>
(StateClient -> StateClient) -> m ()
modifyClient StateClient -> StateClient
cycleMarkSuspect
markAnimHuman :: MonadClient m => m ()
markAnimHuman :: m ()
markAnimHuman = do
Bool
noAnim <- (StateClient -> Bool) -> m Bool
forall (m :: * -> *) a.
MonadClientRead m =>
(StateClient -> a) -> m a
getsClient ((StateClient -> Bool) -> m Bool)
-> (StateClient -> Bool) -> m Bool
forall a b. (a -> b) -> a -> b
$ Bool -> Maybe Bool -> Bool
forall a. a -> Maybe a -> a
fromMaybe Bool
False (Maybe Bool -> Bool)
-> (StateClient -> Maybe Bool) -> StateClient -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ClientOptions -> Maybe Bool
snoAnim (ClientOptions -> Maybe Bool)
-> (StateClient -> ClientOptions) -> StateClient -> Maybe Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. StateClient -> ClientOptions
soptions
(StateClient -> StateClient) -> m ()
forall (m :: * -> *).
MonadClient m =>
(StateClient -> StateClient) -> m ()
modifyClient ((StateClient -> StateClient) -> m ())
-> (StateClient -> StateClient) -> m ()
forall a b. (a -> b) -> a -> b
$ \StateClient
cli ->
StateClient
cli {soptions :: ClientOptions
soptions = (StateClient -> ClientOptions
soptions StateClient
cli) {snoAnim :: Maybe Bool
snoAnim = Bool -> Maybe Bool
forall a. a -> Maybe a
Just (Bool -> Maybe Bool) -> Bool -> Maybe Bool
forall a b. (a -> b) -> a -> b
$ Bool -> Bool
not Bool
noAnim}}
overrideTutHuman :: MonadClientUI m => m ()
overrideTutHuman :: m ()
overrideTutHuman = (SessionUI -> SessionUI) -> m ()
forall (m :: * -> *).
MonadClientUI m =>
(SessionUI -> SessionUI) -> m ()
modifySession SessionUI -> SessionUI
cycleOverrideTut
printScreenHuman :: MonadClientUI m => m ()
printScreenHuman :: m ()
printScreenHuman = do
MsgClassShow -> Text -> m ()
forall (m :: * -> *) a.
(MonadClientUI m, MsgShared a) =>
a -> Text -> m ()
msgAdd MsgClassShow
MsgActionAlert Text
"Screenshot printed."
m ()
forall (m :: * -> *). MonadClientUI m => m ()
printScreen
cancelHuman :: MonadClientUI m => m ()
cancelHuman :: m ()
cancelHuman = do
Maybe AimMode
maimMode <- (SessionUI -> Maybe AimMode) -> m (Maybe AimMode)
forall (m :: * -> *) a. MonadClientUI m => (SessionUI -> a) -> m a
getsSession SessionUI -> Maybe AimMode
saimMode
case Maybe AimMode
maimMode of
Just AimMode
aimMode -> do
let lidV :: LevelId
lidV = AimMode -> LevelId
aimLevelId AimMode
aimMode
LevelId
lidOur <- m LevelId
forall (m :: * -> *). MonadClientUI m => m LevelId
getArenaUI
if LevelId
lidV LevelId -> LevelId -> Bool
forall a. Eq a => a -> a -> Bool
== LevelId
lidOur
then m ()
forall (m :: * -> *). MonadClientUI m => m ()
clearAimMode
else do
Point
xhairPos <- m Point
forall (m :: * -> *). MonadClientUI m => m Point
xhairToPos
let sxhair :: Maybe Target
sxhair = Target -> Maybe Target
forall a. a -> Maybe a
Just (Target -> Maybe Target) -> Target -> Maybe Target
forall a b. (a -> b) -> a -> b
$ TGoal -> LevelId -> Point -> Target
TPoint TGoal
TKnown LevelId
lidOur Point
xhairPos
(SessionUI -> SessionUI) -> m ()
forall (m :: * -> *).
MonadClientUI m =>
(SessionUI -> SessionUI) -> m ()
modifySession ((SessionUI -> SessionUI) -> m ())
-> (SessionUI -> SessionUI) -> m ()
forall a b. (a -> b) -> a -> b
$ \SessionUI
sess ->
SessionUI
sess {saimMode :: Maybe AimMode
saimMode = AimMode -> Maybe AimMode
forall a. a -> Maybe a
Just AimMode
aimMode {aimLevelId :: LevelId
aimLevelId = LevelId
lidOur}}
Maybe Target -> m ()
forall (m :: * -> *). MonadClientUI m => Maybe Target -> m ()
setXHairFromGUI Maybe Target
sxhair
m ()
forall (m :: * -> *). MonadClientUI m => m ()
doLook
Maybe AimMode
Nothing -> () -> m ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
acceptHuman :: (MonadClient m, MonadClientUI m) => ActorId -> m ()
acceptHuman :: ActorId -> m ()
acceptHuman ActorId
leader = do
ActorId -> m ()
forall (m :: * -> *).
(MonadClient m, MonadClientUI m) =>
ActorId -> m ()
endAiming ActorId
leader
ActorId -> m ()
forall (m :: * -> *). MonadClientUI m => ActorId -> m ()
endAimingMsg ActorId
leader
m ()
forall (m :: * -> *). MonadClientUI m => m ()
clearAimMode
endAiming :: (MonadClient m, MonadClientUI m) => ActorId -> m ()
endAiming :: ActorId -> m ()
endAiming ActorId
leader = do
Maybe Target
sxhair <- (SessionUI -> Maybe Target) -> m (Maybe Target)
forall (m :: * -> *) a. MonadClientUI m => (SessionUI -> a) -> m a
getsSession SessionUI -> Maybe Target
sxhair
(StateClient -> StateClient) -> m ()
forall (m :: * -> *).
MonadClient m =>
(StateClient -> StateClient) -> m ()
modifyClient ((StateClient -> StateClient) -> m ())
-> (StateClient -> StateClient) -> m ()
forall a b. (a -> b) -> a -> b
$ ActorId
-> (Maybe Target -> Maybe Target) -> StateClient -> StateClient
updateTarget ActorId
leader ((Maybe Target -> Maybe Target) -> StateClient -> StateClient)
-> (Maybe Target -> Maybe Target) -> StateClient -> StateClient
forall a b. (a -> b) -> a -> b
$ Maybe Target -> Maybe Target -> Maybe Target
forall a b. a -> b -> a
const Maybe Target
sxhair
endAimingMsg :: MonadClientUI m => ActorId -> m ()
endAimingMsg :: ActorId -> m ()
endAimingMsg ActorId
leader = do
Part
subject <- ActorId -> m Part
forall (m :: * -> *). MonadClientUI m => ActorId -> m Part
partActorLeader ActorId
leader
Maybe Target
tgt <- (StateClient -> Maybe Target) -> m (Maybe Target)
forall (m :: * -> *) a.
MonadClientRead m =>
(StateClient -> a) -> m a
getsClient ((StateClient -> Maybe Target) -> m (Maybe Target))
-> (StateClient -> Maybe Target) -> m (Maybe Target)
forall a b. (a -> b) -> a -> b
$ ActorId -> StateClient -> Maybe Target
getTarget ActorId
leader
(Maybe Text
mtargetMsg, Maybe Text
_) <- Maybe Target -> m (Maybe Text, Maybe Text)
forall (m :: * -> *).
MonadClientUI m =>
Maybe Target -> m (Maybe Text, Maybe Text)
targetDesc Maybe Target
tgt
MsgClassShow -> Text -> m ()
forall (m :: * -> *) a.
(MonadClientUI m, MsgShared a) =>
a -> Text -> m ()
msgAdd MsgClassShow
MsgActionAlert (Text -> m ()) -> Text -> m ()
forall a b. (a -> b) -> a -> b
$ case Maybe Text
mtargetMsg of
Maybe Text
Nothing ->
[Part] -> Text
makeSentence [Part -> Part -> Part
MU.SubjectVerbSg Part
subject Part
"clear target"]
Just Text
targetMsg ->
[Part] -> Text
makeSentence [Part -> Part -> Part
MU.SubjectVerbSg Part
subject Part
"target", Text -> Part
MU.Text Text
targetMsg]
detailCycleHuman :: MonadClientUI m => m ()
detailCycleHuman :: m ()
detailCycleHuman = do
(SessionUI -> SessionUI) -> m ()
forall (m :: * -> *).
MonadClientUI m =>
(SessionUI -> SessionUI) -> m ()
modifySession ((SessionUI -> SessionUI) -> m ())
-> (SessionUI -> SessionUI) -> m ()
forall a b. (a -> b) -> a -> b
$ \SessionUI
sess -> SessionUI
sess {saimMode :: Maybe AimMode
saimMode =
(\AimMode
aimMode -> AimMode
aimMode {detailLevel :: DetailLevel
detailLevel = DetailLevel -> DetailLevel
detailCycle (DetailLevel -> DetailLevel) -> DetailLevel -> DetailLevel
forall a b. (a -> b) -> a -> b
$ AimMode -> DetailLevel
detailLevel AimMode
aimMode})
(AimMode -> AimMode) -> Maybe AimMode -> Maybe AimMode
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> SessionUI -> Maybe AimMode
saimMode SessionUI
sess}
m ()
forall (m :: * -> *). MonadClientUI m => m ()
doLook
detailCycle :: DetailLevel -> DetailLevel
detailCycle :: DetailLevel -> DetailLevel
detailCycle DetailLevel
detail = if DetailLevel
detail DetailLevel -> DetailLevel -> Bool
forall a. Eq a => a -> a -> Bool
== DetailLevel
forall a. Bounded a => a
maxBound then DetailLevel
forall a. Bounded a => a
minBound else DetailLevel -> DetailLevel
forall a. Enum a => a -> a
succ DetailLevel
detail
clearTargetIfItemClearHuman :: (MonadClient m, MonadClientUI m)
=> ActorId -> m ()
clearTargetIfItemClearHuman :: ActorId -> m ()
clearTargetIfItemClearHuman ActorId
leader = do
Maybe (ItemId, CStore, Bool)
itemSel <- (SessionUI -> Maybe (ItemId, CStore, Bool))
-> m (Maybe (ItemId, CStore, Bool))
forall (m :: * -> *) a. MonadClientUI m => (SessionUI -> a) -> m a
getsSession SessionUI -> Maybe (ItemId, CStore, Bool)
sitemSel
Bool -> m () -> m ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Maybe (ItemId, CStore, Bool) -> Bool
forall a. Maybe a -> Bool
isNothing Maybe (ItemId, CStore, Bool)
itemSel) (m () -> m ()) -> m () -> m ()
forall a b. (a -> b) -> a -> b
$ do
Maybe Target -> m ()
forall (m :: * -> *). MonadClientUI m => Maybe Target -> m ()
setXHairFromGUI Maybe Target
forall a. Maybe a
Nothing
(StateClient -> StateClient) -> m ()
forall (m :: * -> *).
MonadClient m =>
(StateClient -> StateClient) -> m ()
modifyClient ((StateClient -> StateClient) -> m ())
-> (StateClient -> StateClient) -> m ()
forall a b. (a -> b) -> a -> b
$ ActorId
-> (Maybe Target -> Maybe Target) -> StateClient -> StateClient
updateTarget ActorId
leader (Maybe Target -> Maybe Target -> Maybe Target
forall a b. a -> b -> a
const Maybe Target
forall a. Maybe a
Nothing)
m ()
forall (m :: * -> *). MonadClientUI m => m ()
doLook
doLook :: MonadClientUI m => m ()
doLook :: m ()
doLook = do
Maybe AimMode
saimMode <- (SessionUI -> Maybe AimMode) -> m (Maybe AimMode)
forall (m :: * -> *) a. MonadClientUI m => (SessionUI -> a) -> m a
getsSession SessionUI -> Maybe AimMode
saimMode
case Maybe AimMode
saimMode of
Just AimMode
aimMode -> do
let lidV :: LevelId
lidV = AimMode -> LevelId
aimLevelId AimMode
aimMode
Maybe Point
mxhairPos <- m (Maybe Point)
forall (m :: * -> *). MonadClientUI m => m (Maybe Point)
mxhairToPos
Point
xhairPos <- m Point
forall (m :: * -> *). MonadClientUI m => m Point
xhairToPos
[(MsgClassShow, Text)]
blurb <- Point -> LevelId -> m [(MsgClassShow, Text)]
forall (m :: * -> *).
MonadClientUI m =>
Point -> LevelId -> m [(MsgClassShow, Text)]
lookAtPosition Point
xhairPos LevelId
lidV
Maybe (ItemId, CStore, Bool)
itemSel <- (SessionUI -> Maybe (ItemId, CStore, Bool))
-> m (Maybe (ItemId, CStore, Bool))
forall (m :: * -> *) a. MonadClientUI m => (SessionUI -> a) -> m a
getsSession SessionUI -> Maybe (ItemId, CStore, Bool)
sitemSel
Maybe ActorId
mleader <- (StateClient -> Maybe ActorId) -> m (Maybe ActorId)
forall (m :: * -> *) a.
MonadClientRead m =>
(StateClient -> a) -> m a
getsClient StateClient -> Maybe ActorId
sleader
[(MsgClassShow, Text)]
outOfRangeBlurb <- case (Maybe (ItemId, CStore, Bool)
itemSel, Maybe Point
mxhairPos, Maybe ActorId
mleader) of
(Just (ItemId
iid, CStore
_, Bool
_), Just Point
pos, Just ActorId
leader) -> do
Actor
b <- (State -> Actor) -> m Actor
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState ((State -> Actor) -> m Actor) -> (State -> Actor) -> m Actor
forall a b. (a -> b) -> a -> b
$ ActorId -> State -> Actor
getActorBody ActorId
leader
if LevelId
lidV LevelId -> LevelId -> Bool
forall a. Eq a => a -> a -> Bool
/= Actor -> LevelId
blid Actor
b
Bool -> Bool -> Bool
|| AimMode -> DetailLevel
detailLevel AimMode
aimMode DetailLevel -> DetailLevel -> Bool
forall a. Ord a => a -> a -> Bool
< DetailLevel
DetailAll
then [(MsgClassShow, Text)] -> m [(MsgClassShow, Text)]
forall (m :: * -> *) a. Monad m => a -> m a
return []
else do
ItemFull
itemFull <- (State -> ItemFull) -> m ItemFull
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState ((State -> ItemFull) -> m ItemFull)
-> (State -> ItemFull) -> m ItemFull
forall a b. (a -> b) -> a -> b
$ ItemId -> State -> ItemFull
itemToFull ItemId
iid
let arItem :: AspectRecord
arItem = ItemFull -> AspectRecord
aspectRecordFull ItemFull
itemFull
[(MsgClassShow, Text)] -> m [(MsgClassShow, Text)]
forall (m :: * -> *) a. Monad m => a -> m a
return [ (MsgClassShow
MsgPromptGeneric, Text
"This position is out of range when flinging the selected item.")
| X
1 X -> X -> X
forall a. Num a => a -> a -> a
+ AspectRecord -> ItemKind -> X
IA.totalRange AspectRecord
arItem (ItemFull -> ItemKind
itemKind ItemFull
itemFull)
X -> X -> Bool
forall a. Ord a => a -> a -> Bool
< Point -> Point -> X
chessDist (Actor -> Point
bpos Actor
b) Point
pos ]
(Maybe (ItemId, CStore, Bool), Maybe Point, Maybe ActorId)
_ -> [(MsgClassShow, Text)] -> m [(MsgClassShow, Text)]
forall (m :: * -> *) a. Monad m => a -> m a
return []
((MsgClassShow, Text) -> m ()) -> [(MsgClassShow, Text)] -> m ()
forall (t :: * -> *) (m :: * -> *) a.
(Foldable t, Monad m) =>
(a -> m ()) -> t a -> m ()
mapM_ ((MsgClassShow -> Text -> m ()) -> (MsgClassShow, Text) -> m ()
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry MsgClassShow -> Text -> m ()
forall (m :: * -> *) a.
(MonadClientUI m, MsgShared a) =>
a -> Text -> m ()
msgAdd) ([(MsgClassShow, Text)] -> m ()) -> [(MsgClassShow, Text)] -> m ()
forall a b. (a -> b) -> a -> b
$ [(MsgClassShow, Text)]
blurb [(MsgClassShow, Text)]
-> [(MsgClassShow, Text)] -> [(MsgClassShow, Text)]
forall a. [a] -> [a] -> [a]
++ [(MsgClassShow, Text)]
outOfRangeBlurb
Maybe AimMode
_ -> () -> m ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
itemClearHuman :: MonadClientUI m => m ()
itemClearHuman :: m ()
itemClearHuman = (SessionUI -> SessionUI) -> m ()
forall (m :: * -> *).
MonadClientUI m =>
(SessionUI -> SessionUI) -> m ()
modifySession ((SessionUI -> SessionUI) -> m ())
-> (SessionUI -> SessionUI) -> m ()
forall a b. (a -> b) -> a -> b
$ \SessionUI
sess -> SessionUI
sess {sitemSel :: Maybe (ItemId, CStore, Bool)
sitemSel = Maybe (ItemId, CStore, Bool)
forall a. Maybe a
Nothing}
moveXhairHuman :: MonadClientUI m => Vector -> Int -> m MError
moveXhairHuman :: Vector -> X -> m MError
moveXhairHuman Vector
dir X
n = do
COps{corule :: COps -> RuleContent
corule=RuleContent{X
rWidthMax :: X
rWidthMax :: RuleContent -> X
rWidthMax, X
rHeightMax :: X
rHeightMax :: RuleContent -> X
rHeightMax}} <- (State -> COps) -> m COps
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState State -> COps
scops
Maybe AimMode
saimMode <- (SessionUI -> Maybe AimMode) -> m (Maybe AimMode)
forall (m :: * -> *) a. MonadClientUI m => (SessionUI -> a) -> m a
getsSession SessionUI -> Maybe AimMode
saimMode
let lidV :: LevelId
lidV = LevelId -> (AimMode -> LevelId) -> Maybe AimMode -> LevelId
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (String -> LevelId
forall a. HasCallStack => String -> a
error (String -> LevelId) -> String -> LevelId
forall a b. (a -> b) -> a -> b
$ String
"" String -> (Vector, X) -> String
forall v. Show v => String -> v -> String
`showFailure` (Vector
dir, X
n)) AimMode -> LevelId
aimLevelId Maybe AimMode
saimMode
Maybe Target
xhair <- (SessionUI -> Maybe Target) -> m (Maybe Target)
forall (m :: * -> *) a. MonadClientUI m => (SessionUI -> a) -> m a
getsSession SessionUI -> Maybe Target
sxhair
Point
xhairPos <- m Point
forall (m :: * -> *). MonadClientUI m => m Point
xhairToPos
let shiftB :: Point -> Point
shiftB Point
pos = X -> X -> Point -> Vector -> Point
shiftBounded X
rWidthMax X
rHeightMax Point
pos Vector
dir
newPos :: Point
newPos = (Point -> Point) -> Point -> [Point]
forall a. (a -> a) -> a -> [a]
iterate Point -> Point
shiftB Point
xhairPos [Point] -> X -> Point
forall a. [a] -> X -> a
!! X
n
if Point
newPos Point -> Point -> Bool
forall a. Eq a => a -> a -> Bool
== Point
xhairPos then Text -> m MError
forall (m :: * -> *). MonadClientUI m => Text -> m MError
failMsg Text
"never mind"
else do
Maybe ActorId
mleader <- (StateClient -> Maybe ActorId) -> m (Maybe ActorId)
forall (m :: * -> *) a.
MonadClientRead m =>
(StateClient -> a) -> m a
getsClient StateClient -> Maybe ActorId
sleader
Maybe Target
sxhair <- case (Maybe Target
xhair, Maybe ActorId
mleader) of
(Just TVector{}, Just ActorId
leader) -> do
Point
lpos <- (State -> Point) -> m Point
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState ((State -> Point) -> m Point) -> (State -> Point) -> m Point
forall a b. (a -> b) -> a -> b
$ Actor -> Point
bpos (Actor -> Point) -> (State -> Actor) -> State -> Point
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ActorId -> State -> Actor
getActorBody ActorId
leader
Maybe Target -> m (Maybe Target)
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe Target -> m (Maybe Target))
-> Maybe Target -> m (Maybe Target)
forall a b. (a -> b) -> a -> b
$ Target -> Maybe Target
forall a. a -> Maybe a
Just (Target -> Maybe Target) -> Target -> Maybe Target
forall a b. (a -> b) -> a -> b
$ Vector -> Target
TVector (Vector -> Target) -> Vector -> Target
forall a b. (a -> b) -> a -> b
$ Point
newPos Point -> Point -> Vector
`vectorToFrom` Point
lpos
(Maybe Target, Maybe ActorId)
_ -> Maybe Target -> m (Maybe Target)
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe Target -> m (Maybe Target))
-> Maybe Target -> m (Maybe Target)
forall a b. (a -> b) -> a -> b
$ Target -> Maybe Target
forall a. a -> Maybe a
Just (Target -> Maybe Target) -> Target -> Maybe Target
forall a b. (a -> b) -> a -> b
$ TGoal -> LevelId -> Point -> Target
TPoint TGoal
TKnown LevelId
lidV Point
newPos
Maybe Target -> m ()
forall (m :: * -> *). MonadClientUI m => Maybe Target -> m ()
setXHairFromGUI Maybe Target
sxhair
m ()
forall (m :: * -> *). MonadClientUI m => m ()
doLook
MError -> m MError
forall (m :: * -> *) a. Monad m => a -> m a
return MError
forall a. Maybe a
Nothing
aimTgtHuman :: MonadClientUI m => m ()
aimTgtHuman :: m ()
aimTgtHuman = do
LevelId
lidV <- m LevelId
forall (m :: * -> *). MonadClientUI m => m LevelId
viewedLevelUI
(SessionUI -> SessionUI) -> m ()
forall (m :: * -> *).
MonadClientUI m =>
(SessionUI -> SessionUI) -> m ()
modifySession ((SessionUI -> SessionUI) -> m ())
-> (SessionUI -> SessionUI) -> m ()
forall a b. (a -> b) -> a -> b
$ \SessionUI
sess -> SessionUI
sess {saimMode :: Maybe AimMode
saimMode =
let newDetail :: DetailLevel
newDetail = DetailLevel
-> (AimMode -> DetailLevel) -> Maybe AimMode -> DetailLevel
forall b a. b -> (a -> b) -> Maybe a -> b
maybe DetailLevel
defaultDetailLevel AimMode -> DetailLevel
detailLevel (SessionUI -> Maybe AimMode
saimMode SessionUI
sess)
in AimMode -> Maybe AimMode
forall a. a -> Maybe a
Just (AimMode -> Maybe AimMode) -> AimMode -> Maybe AimMode
forall a b. (a -> b) -> a -> b
$ LevelId -> DetailLevel -> AimMode
AimMode LevelId
lidV DetailLevel
newDetail}
m ()
forall (m :: * -> *). MonadClientUI m => m ()
doLook
MsgClassShow -> Text -> m ()
forall (m :: * -> *) a.
(MonadClientUI m, MsgShared a) =>
a -> Text -> m ()
msgAdd MsgClassShow
MsgPromptAction Text
"*flinging started; press again to project*"
aimFloorHuman :: MonadClientUI m => m ()
aimFloorHuman :: m ()
aimFloorHuman = do
LevelId
lidV <- m LevelId
forall (m :: * -> *). MonadClientUI m => m LevelId
viewedLevelUI
Maybe ActorId
mleader <- (StateClient -> Maybe ActorId) -> m (Maybe ActorId)
forall (m :: * -> *) a.
MonadClientRead m =>
(StateClient -> a) -> m a
getsClient StateClient -> Maybe ActorId
sleader
Maybe Point
mlpos <- case Maybe ActorId
mleader of
Maybe ActorId
Nothing -> Maybe Point -> m (Maybe Point)
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe Point
forall a. Maybe a
Nothing
Just ActorId
leader -> (State -> Maybe Point) -> m (Maybe Point)
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState ((State -> Maybe Point) -> m (Maybe Point))
-> (State -> Maybe Point) -> m (Maybe Point)
forall a b. (a -> b) -> a -> b
$ Point -> Maybe Point
forall a. a -> Maybe a
Just (Point -> Maybe Point) -> (State -> Point) -> State -> Maybe Point
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Actor -> Point
bpos (Actor -> Point) -> (State -> Actor) -> State -> Point
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ActorId -> State -> Actor
getActorBody ActorId
leader
Point
xhairPos <- m Point
forall (m :: * -> *). MonadClientUI m => m Point
xhairToPos
Maybe Target
xhair <- (SessionUI -> Maybe Target) -> m (Maybe Target)
forall (m :: * -> *) a. MonadClientUI m => (SessionUI -> a) -> m a
getsSession SessionUI -> Maybe Target
sxhair
Maybe AimMode
saimMode <- (SessionUI -> Maybe AimMode) -> m (Maybe AimMode)
forall (m :: * -> *) a. MonadClientUI m => (SessionUI -> a) -> m a
getsSession SessionUI -> Maybe AimMode
saimMode
[(ActorId, Actor)]
bsAll <- (State -> [(ActorId, Actor)]) -> m [(ActorId, Actor)]
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState ((State -> [(ActorId, Actor)]) -> m [(ActorId, Actor)])
-> (State -> [(ActorId, Actor)]) -> m [(ActorId, Actor)]
forall a b. (a -> b) -> a -> b
$ (FactionId -> Bool) -> LevelId -> State -> [(ActorId, Actor)]
actorAssocs (Bool -> FactionId -> Bool
forall a b. a -> b -> a
const Bool
True) LevelId
lidV
FactionId
side <- (StateClient -> FactionId) -> m FactionId
forall (m :: * -> *) a.
MonadClientRead m =>
(StateClient -> a) -> m a
getsClient StateClient -> FactionId
sside
Faction
fact <- (State -> Faction) -> m Faction
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState ((State -> Faction) -> m Faction)
-> (State -> Faction) -> m Faction
forall a b. (a -> b) -> a -> b
$ (EnumMap FactionId Faction -> FactionId -> Faction
forall k a. Enum k => EnumMap k a -> k -> a
EM.! FactionId
side) (EnumMap FactionId Faction -> Faction)
-> (State -> EnumMap FactionId Faction) -> State -> Faction
forall b c a. (b -> c) -> (a -> b) -> a -> c
. State -> EnumMap FactionId Faction
sfactionD
let sxhair :: Maybe Target
sxhair = case Maybe Target
xhair of
Maybe Target
_ | Maybe AimMode -> Bool
forall a. Maybe a -> Bool
isNothing Maybe AimMode
saimMode ->
Maybe Target
xhair
Just TEnemy{} -> Target -> Maybe Target
forall a. a -> Maybe a
Just (Target -> Maybe Target) -> Target -> Maybe Target
forall a b. (a -> b) -> a -> b
$ TGoal -> LevelId -> Point -> Target
TPoint TGoal
TKnown LevelId
lidV Point
xhairPos
Just TNonEnemy{} -> Target -> Maybe Target
forall a. a -> Maybe a
Just (Target -> Maybe Target) -> Target -> Maybe Target
forall a b. (a -> b) -> a -> b
$ TGoal -> LevelId -> Point -> Target
TPoint TGoal
TKnown LevelId
lidV Point
xhairPos
Just TPoint{} | Just Point
lpos <- Maybe Point
mlpos, Point
xhairPos Point -> Point -> Bool
forall a. Eq a => a -> a -> Bool
/= Point
lpos ->
Target -> Maybe Target
forall a. a -> Maybe a
Just (Target -> Maybe Target) -> Target -> Maybe Target
forall a b. (a -> b) -> a -> b
$ Vector -> Target
TVector (Vector -> Target) -> Vector -> Target
forall a b. (a -> b) -> a -> b
$ Point
xhairPos Point -> Point -> Vector
`vectorToFrom` Point
lpos
Just TVector{} ->
case ((ActorId, Actor) -> Bool)
-> [(ActorId, Actor)] -> Maybe (ActorId, Actor)
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Maybe a
find (\(ActorId
_, Actor
b) -> Actor -> Point
bpos Actor
b Point -> Point -> Bool
forall a. Eq a => a -> a -> Bool
== Point
xhairPos) [(ActorId, Actor)]
bsAll of
Just (ActorId
aid, Actor
b) -> Target -> Maybe Target
forall a. a -> Maybe a
Just (Target -> Maybe Target) -> Target -> Maybe Target
forall a b. (a -> b) -> a -> b
$ if FactionId -> Faction -> FactionId -> Bool
isFoe FactionId
side Faction
fact (Actor -> FactionId
bfid Actor
b)
then ActorId -> Target
TEnemy ActorId
aid
else ActorId -> Target
TNonEnemy ActorId
aid
Maybe (ActorId, Actor)
Nothing -> Target -> Maybe Target
forall a. a -> Maybe a
Just (Target -> Maybe Target) -> Target -> Maybe Target
forall a b. (a -> b) -> a -> b
$ TGoal -> LevelId -> Point -> Target
TPoint TGoal
TUnknown LevelId
lidV Point
xhairPos
Maybe Target
_ -> Maybe Target
xhair
(SessionUI -> SessionUI) -> m ()
forall (m :: * -> *).
MonadClientUI m =>
(SessionUI -> SessionUI) -> m ()
modifySession ((SessionUI -> SessionUI) -> m ())
-> (SessionUI -> SessionUI) -> m ()
forall a b. (a -> b) -> a -> b
$ \SessionUI
sess -> SessionUI
sess {saimMode :: Maybe AimMode
saimMode =
let newDetail :: DetailLevel
newDetail = DetailLevel
-> (AimMode -> DetailLevel) -> Maybe AimMode -> DetailLevel
forall b a. b -> (a -> b) -> Maybe a -> b
maybe DetailLevel
defaultDetailLevel AimMode -> DetailLevel
detailLevel Maybe AimMode
saimMode
in AimMode -> Maybe AimMode
forall a. a -> Maybe a
Just (AimMode -> Maybe AimMode) -> AimMode -> Maybe AimMode
forall a b. (a -> b) -> a -> b
$ LevelId -> DetailLevel -> AimMode
AimMode LevelId
lidV DetailLevel
newDetail}
Maybe Target -> m ()
forall (m :: * -> *). MonadClientUI m => Maybe Target -> m ()
setXHairFromGUI Maybe Target
sxhair
m ()
forall (m :: * -> *). MonadClientUI m => m ()
doLook
aimEnemyHuman :: MonadClientUI m => m ()
aimEnemyHuman :: m ()
aimEnemyHuman = do
LevelId
lidV <- m LevelId
forall (m :: * -> *). MonadClientUI m => m LevelId
viewedLevelUI
Maybe ActorId
mleader <- (StateClient -> Maybe ActorId) -> m (Maybe ActorId)
forall (m :: * -> *) a.
MonadClientRead m =>
(StateClient -> a) -> m a
getsClient StateClient -> Maybe ActorId
sleader
Maybe Point
mlpos <- case Maybe ActorId
mleader of
Maybe ActorId
Nothing -> Maybe Point -> m (Maybe Point)
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe Point
forall a. Maybe a
Nothing
Just ActorId
leader -> (State -> Maybe Point) -> m (Maybe Point)
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState ((State -> Maybe Point) -> m (Maybe Point))
-> (State -> Maybe Point) -> m (Maybe Point)
forall a b. (a -> b) -> a -> b
$ Point -> Maybe Point
forall a. a -> Maybe a
Just (Point -> Maybe Point) -> (State -> Point) -> State -> Maybe Point
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Actor -> Point
bpos (Actor -> Point) -> (State -> Actor) -> State -> Point
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ActorId -> State -> Actor
getActorBody ActorId
leader
Maybe Point
mxhairPos <- m (Maybe Point)
forall (m :: * -> *). MonadClientUI m => m (Maybe Point)
mxhairToPos
Maybe Target
xhair <- (SessionUI -> Maybe Target) -> m (Maybe Target)
forall (m :: * -> *) a. MonadClientUI m => (SessionUI -> a) -> m a
getsSession SessionUI -> Maybe Target
sxhair
Maybe AimMode
saimMode <- (SessionUI -> Maybe AimMode) -> m (Maybe AimMode)
forall (m :: * -> *) a. MonadClientUI m => (SessionUI -> a) -> m a
getsSession SessionUI -> Maybe AimMode
saimMode
FactionId
side <- (StateClient -> FactionId) -> m FactionId
forall (m :: * -> *) a.
MonadClientRead m =>
(StateClient -> a) -> m a
getsClient StateClient -> FactionId
sside
Faction
fact <- (State -> Faction) -> m Faction
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState ((State -> Faction) -> m Faction)
-> (State -> Faction) -> m Faction
forall a b. (a -> b) -> a -> b
$ (EnumMap FactionId Faction -> FactionId -> Faction
forall k a. Enum k => EnumMap k a -> k -> a
EM.! FactionId
side) (EnumMap FactionId Faction -> Faction)
-> (State -> EnumMap FactionId Faction) -> State -> Faction
forall b c a. (b -> c) -> (a -> b) -> a -> c
. State -> EnumMap FactionId Faction
sfactionD
[(ActorId, Actor)]
bsAll <- (State -> [(ActorId, Actor)]) -> m [(ActorId, Actor)]
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState ((State -> [(ActorId, Actor)]) -> m [(ActorId, Actor)])
-> (State -> [(ActorId, Actor)]) -> m [(ActorId, Actor)]
forall a b. (a -> b) -> a -> b
$ (FactionId -> Bool) -> LevelId -> State -> [(ActorId, Actor)]
actorAssocs (Bool -> FactionId -> Bool
forall a b. a -> b -> a
const Bool
True) LevelId
lidV
let
ordPos :: Point -> (a, Actor) -> (X, Point, Bool)
ordPos Point
lpos (a
_, Actor
b) = (Point -> Point -> X
chessDist Point
lpos (Point -> X) -> Point -> X
forall a b. (a -> b) -> a -> b
$ Actor -> Point
bpos Actor
b, Actor -> Point
bpos Actor
b, Actor -> Bool
bproj Actor
b)
dbs :: [(ActorId, Actor)]
dbs = case Maybe Point
mlpos of
Maybe Point
Nothing -> [(ActorId, Actor)]
bsAll
Just Point
lpos -> ((ActorId, Actor) -> (X, Point, Bool))
-> [(ActorId, Actor)] -> [(ActorId, Actor)]
forall b a. Ord b => (a -> b) -> [a] -> [a]
sortOn (Point -> (ActorId, Actor) -> (X, Point, Bool)
forall a. Point -> (a, Actor) -> (X, Point, Bool)
ordPos Point
lpos) [(ActorId, Actor)]
bsAll
pickUnderXhair :: X
pickUnderXhair =
X -> Maybe X -> X
forall a. a -> Maybe a -> a
fromMaybe (-X
1) (Maybe X -> X) -> Maybe X -> X
forall a b. (a -> b) -> a -> b
$ ((ActorId, Actor) -> Bool) -> [(ActorId, Actor)] -> Maybe X
forall a. (a -> Bool) -> [a] -> Maybe X
findIndex ((Maybe Point -> Maybe Point -> Bool
forall a. Eq a => a -> a -> Bool
== Maybe Point
mxhairPos) (Maybe Point -> Bool)
-> ((ActorId, Actor) -> Maybe Point) -> (ActorId, Actor) -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Point -> Maybe Point
forall a. a -> Maybe a
Just (Point -> Maybe Point)
-> ((ActorId, Actor) -> Point) -> (ActorId, Actor) -> Maybe Point
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Actor -> Point
bpos (Actor -> Point)
-> ((ActorId, Actor) -> Actor) -> (ActorId, Actor) -> Point
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ActorId, Actor) -> Actor
forall a b. (a, b) -> b
snd) [(ActorId, Actor)]
dbs
(Bool
pickEnemies, X
i) = case Maybe Target
xhair of
Just (TEnemy ActorId
a) | Maybe AimMode -> Bool
forall a. Maybe a -> Bool
isJust Maybe AimMode
saimMode ->
(Bool
True, X
1 X -> X -> X
forall a. Num a => a -> a -> a
+ X -> Maybe X -> X
forall a. a -> Maybe a -> a
fromMaybe (-X
1) (((ActorId, Actor) -> Bool) -> [(ActorId, Actor)] -> Maybe X
forall a. (a -> Bool) -> [a] -> Maybe X
findIndex ((ActorId -> ActorId -> Bool
forall a. Eq a => a -> a -> Bool
== ActorId
a) (ActorId -> Bool)
-> ((ActorId, Actor) -> ActorId) -> (ActorId, Actor) -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ActorId, Actor) -> ActorId
forall a b. (a, b) -> a
fst) [(ActorId, Actor)]
dbs))
Just (TEnemy ActorId
a) ->
(Bool
True, X -> Maybe X -> X
forall a. a -> Maybe a -> a
fromMaybe (-X
1) (Maybe X -> X) -> Maybe X -> X
forall a b. (a -> b) -> a -> b
$ ((ActorId, Actor) -> Bool) -> [(ActorId, Actor)] -> Maybe X
forall a. (a -> Bool) -> [a] -> Maybe X
findIndex ((ActorId -> ActorId -> Bool
forall a. Eq a => a -> a -> Bool
== ActorId
a) (ActorId -> Bool)
-> ((ActorId, Actor) -> ActorId) -> (ActorId, Actor) -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ActorId, Actor) -> ActorId
forall a b. (a, b) -> a
fst) [(ActorId, Actor)]
dbs)
Just (TNonEnemy ActorId
a) | Maybe AimMode -> Bool
forall a. Maybe a -> Bool
isJust Maybe AimMode
saimMode ->
(Bool
False, X
1 X -> X -> X
forall a. Num a => a -> a -> a
+ X -> Maybe X -> X
forall a. a -> Maybe a -> a
fromMaybe (-X
1) (((ActorId, Actor) -> Bool) -> [(ActorId, Actor)] -> Maybe X
forall a. (a -> Bool) -> [a] -> Maybe X
findIndex ((ActorId -> ActorId -> Bool
forall a. Eq a => a -> a -> Bool
== ActorId
a) (ActorId -> Bool)
-> ((ActorId, Actor) -> ActorId) -> (ActorId, Actor) -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ActorId, Actor) -> ActorId
forall a b. (a, b) -> a
fst) [(ActorId, Actor)]
dbs))
Just (TNonEnemy ActorId
a) ->
(Bool
False, X -> Maybe X -> X
forall a. a -> Maybe a -> a
fromMaybe (-X
1) (Maybe X -> X) -> Maybe X -> X
forall a b. (a -> b) -> a -> b
$ ((ActorId, Actor) -> Bool) -> [(ActorId, Actor)] -> Maybe X
forall a. (a -> Bool) -> [a] -> Maybe X
findIndex ((ActorId -> ActorId -> Bool
forall a. Eq a => a -> a -> Bool
== ActorId
a) (ActorId -> Bool)
-> ((ActorId, Actor) -> ActorId) -> (ActorId, Actor) -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ActorId, Actor) -> ActorId
forall a b. (a, b) -> a
fst) [(ActorId, Actor)]
dbs)
Maybe Target
_ -> (Bool
True, X
pickUnderXhair)
([(ActorId, Actor)]
lt, [(ActorId, Actor)]
gt) = X -> [(ActorId, Actor)] -> ([(ActorId, Actor)], [(ActorId, Actor)])
forall a. X -> [a] -> ([a], [a])
splitAt X
i [(ActorId, Actor)]
dbs
isEnemy :: Actor -> Bool
isEnemy Actor
b = FactionId -> Faction -> FactionId -> Bool
isFoe FactionId
side Faction
fact (Actor -> FactionId
bfid Actor
b)
Bool -> Bool -> Bool
&& Bool -> Bool
not (Actor -> Bool
bproj Actor
b)
Bool -> Bool -> Bool
&& Actor -> Int64
bhp Actor
b Int64 -> Int64 -> Bool
forall a. Ord a => a -> a -> Bool
> Int64
0
cond :: Actor -> Bool
cond = if Bool
pickEnemies then Actor -> Bool
isEnemy else Bool -> Bool
not (Bool -> Bool) -> (Actor -> Bool) -> Actor -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Actor -> Bool
isEnemy
lf :: [(ActorId, Actor)]
lf = ((ActorId, Actor) -> Bool)
-> [(ActorId, Actor)] -> [(ActorId, Actor)]
forall a. (a -> Bool) -> [a] -> [a]
filter (Actor -> Bool
cond (Actor -> Bool)
-> ((ActorId, Actor) -> Actor) -> (ActorId, Actor) -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ActorId, Actor) -> Actor
forall a b. (a, b) -> b
snd) ([(ActorId, Actor)] -> [(ActorId, Actor)])
-> [(ActorId, Actor)] -> [(ActorId, Actor)]
forall a b. (a -> b) -> a -> b
$ [(ActorId, Actor)]
gt [(ActorId, Actor)] -> [(ActorId, Actor)] -> [(ActorId, Actor)]
forall a. [a] -> [a] -> [a]
++ [(ActorId, Actor)]
lt
sxhair :: Maybe Target
sxhair = case [(ActorId, Actor)]
lf of
(ActorId
a, Actor
_) : [(ActorId, Actor)]
_ -> Target -> Maybe Target
forall a. a -> Maybe a
Just (Target -> Maybe Target) -> Target -> Maybe Target
forall a b. (a -> b) -> a -> b
$ if Bool
pickEnemies then ActorId -> Target
TEnemy ActorId
a else ActorId -> Target
TNonEnemy ActorId
a
[] -> Maybe Target
xhair
(SessionUI -> SessionUI) -> m ()
forall (m :: * -> *).
MonadClientUI m =>
(SessionUI -> SessionUI) -> m ()
modifySession ((SessionUI -> SessionUI) -> m ())
-> (SessionUI -> SessionUI) -> m ()
forall a b. (a -> b) -> a -> b
$ \SessionUI
sess -> SessionUI
sess {saimMode :: Maybe AimMode
saimMode =
let newDetail :: DetailLevel
newDetail = DetailLevel
-> (AimMode -> DetailLevel) -> Maybe AimMode -> DetailLevel
forall b a. b -> (a -> b) -> Maybe a -> b
maybe DetailLevel
defaultDetailLevel AimMode -> DetailLevel
detailLevel Maybe AimMode
saimMode
in AimMode -> Maybe AimMode
forall a. a -> Maybe a
Just (AimMode -> Maybe AimMode) -> AimMode -> Maybe AimMode
forall a b. (a -> b) -> a -> b
$ LevelId -> DetailLevel -> AimMode
AimMode LevelId
lidV DetailLevel
newDetail}
Maybe Target -> m ()
forall (m :: * -> *). MonadClientUI m => Maybe Target -> m ()
setXHairFromGUI Maybe Target
sxhair
m ()
forall (m :: * -> *). MonadClientUI m => m ()
doLook
aimItemHuman :: MonadClientUI m => m ()
aimItemHuman :: m ()
aimItemHuman = do
FactionId
side <- (StateClient -> FactionId) -> m FactionId
forall (m :: * -> *) a.
MonadClientRead m =>
(StateClient -> a) -> m a
getsClient StateClient -> FactionId
sside
LevelId
lidV <- m LevelId
forall (m :: * -> *). MonadClientUI m => m LevelId
viewedLevelUI
Maybe ActorId
mleader <- (StateClient -> Maybe ActorId) -> m (Maybe ActorId)
forall (m :: * -> *) a.
MonadClientRead m =>
(StateClient -> a) -> m a
getsClient StateClient -> Maybe ActorId
sleader
Maybe Point
mlpos <- case Maybe ActorId
mleader of
Maybe ActorId
Nothing -> Maybe Point -> m (Maybe Point)
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe Point
forall a. Maybe a
Nothing
Just ActorId
leader -> (State -> Maybe Point) -> m (Maybe Point)
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState ((State -> Maybe Point) -> m (Maybe Point))
-> (State -> Maybe Point) -> m (Maybe Point)
forall a b. (a -> b) -> a -> b
$ Point -> Maybe Point
forall a. a -> Maybe a
Just (Point -> Maybe Point) -> (State -> Point) -> State -> Maybe Point
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Actor -> Point
bpos (Actor -> Point) -> (State -> Actor) -> State -> Point
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ActorId -> State -> Actor
getActorBody ActorId
leader
Maybe Point
mxhairPos <- m (Maybe Point)
forall (m :: * -> *). MonadClientUI m => m (Maybe Point)
mxhairToPos
Maybe Target
xhair <- (SessionUI -> Maybe Target) -> m (Maybe Target)
forall (m :: * -> *) a. MonadClientUI m => (SessionUI -> a) -> m a
getsSession SessionUI -> Maybe Target
sxhair
Maybe AimMode
saimMode <- (SessionUI -> Maybe AimMode) -> m (Maybe AimMode)
forall (m :: * -> *) a. MonadClientUI m => (SessionUI -> a) -> m a
getsSession SessionUI -> Maybe AimMode
saimMode
Level{ItemFloor
lfloor :: Level -> ItemFloor
lfloor :: ItemFloor
lfloor} <- LevelId -> m Level
forall (m :: * -> *). MonadStateRead m => LevelId -> m Level
getLevel LevelId
lidV
Maybe (LevelId, Point)
mstash <- (State -> Maybe (LevelId, Point)) -> m (Maybe (LevelId, Point))
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState ((State -> Maybe (LevelId, Point)) -> m (Maybe (LevelId, Point)))
-> (State -> Maybe (LevelId, Point)) -> m (Maybe (LevelId, Point))
forall a b. (a -> b) -> a -> b
$ \State
s -> Faction -> Maybe (LevelId, Point)
gstash (Faction -> Maybe (LevelId, Point))
-> Faction -> Maybe (LevelId, Point)
forall a b. (a -> b) -> a -> b
$ State -> EnumMap FactionId Faction
sfactionD State
s EnumMap FactionId Faction -> FactionId -> Faction
forall k a. Enum k => EnumMap k a -> k -> a
EM.! FactionId
side
let lfloorBarStash :: ItemFloor
lfloorBarStash = case Maybe (LevelId, Point)
mstash of
Just (LevelId
lid, Point
pos) | LevelId
lid LevelId -> LevelId -> Bool
forall a. Eq a => a -> a -> Bool
== LevelId
lidV -> Point -> ItemFloor -> ItemFloor
forall k a. Enum k => k -> EnumMap k a -> EnumMap k a
EM.delete Point
pos ItemFloor
lfloor
Maybe (LevelId, Point)
_ -> ItemFloor
lfloor
bsAll :: [Point]
bsAll = ItemFloor -> [Point]
forall k a. Enum k => EnumMap k a -> [k]
EM.keys ItemFloor
lfloorBarStash
ordPos :: Point -> Point -> (X, Point)
ordPos Point
lpos Point
p = (Point -> Point -> X
chessDist Point
lpos Point
p, Point
p)
dbs :: [Point]
dbs = case Maybe Point
mlpos of
Maybe Point
Nothing -> [Point]
bsAll
Just Point
lpos -> (Point -> (X, Point)) -> [Point] -> [Point]
forall b a. Ord b => (a -> b) -> [a] -> [a]
sortOn (Point -> Point -> (X, Point)
ordPos Point
lpos) [Point]
bsAll
pickUnderXhair :: ([Point], [Point])
pickUnderXhair =
let i :: X
i = X -> Maybe X -> X
forall a. a -> Maybe a -> a
fromMaybe (-X
1)
(Maybe X -> X) -> Maybe X -> X
forall a b. (a -> b) -> a -> b
$ (Point -> Bool) -> [Point] -> Maybe X
forall a. (a -> Bool) -> [a] -> Maybe X
findIndex ((Maybe Point -> Maybe Point -> Bool
forall a. Eq a => a -> a -> Bool
== Maybe Point
mxhairPos) (Maybe Point -> Bool) -> (Point -> Maybe Point) -> Point -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Point -> Maybe Point
forall a. a -> Maybe a
Just) [Point]
dbs
in X -> [Point] -> ([Point], [Point])
forall a. X -> [a] -> ([a], [a])
splitAt X
i [Point]
dbs
([Point]
lt, [Point]
gt) = case Maybe Target
xhair of
Just (TPoint TGoal
_ LevelId
lid Point
pos)
| Maybe AimMode -> Bool
forall a. Maybe a -> Bool
isJust Maybe AimMode
saimMode Bool -> Bool -> Bool
&& LevelId
lid LevelId -> LevelId -> Bool
forall a. Eq a => a -> a -> Bool
== LevelId
lidV ->
let i :: X
i = X -> Maybe X -> X
forall a. a -> Maybe a -> a
fromMaybe (-X
1) (Maybe X -> X) -> Maybe X -> X
forall a b. (a -> b) -> a -> b
$ Point -> [Point] -> Maybe X
forall a. Eq a => a -> [a] -> Maybe X
elemIndex Point
pos [Point]
dbs
in X -> [Point] -> ([Point], [Point])
forall a. X -> [a] -> ([a], [a])
splitAt (X
i X -> X -> X
forall a. Num a => a -> a -> a
+ X
1) [Point]
dbs
Just (TPoint TGoal
_ LevelId
lid Point
pos)
| LevelId
lid LevelId -> LevelId -> Bool
forall a. Eq a => a -> a -> Bool
== LevelId
lidV ->
let i :: X
i = X -> Maybe X -> X
forall a. a -> Maybe a -> a
fromMaybe (-X
1) (Maybe X -> X) -> Maybe X -> X
forall a b. (a -> b) -> a -> b
$ Point -> [Point] -> Maybe X
forall a. Eq a => a -> [a] -> Maybe X
elemIndex Point
pos [Point]
dbs
in X -> [Point] -> ([Point], [Point])
forall a. X -> [a] -> ([a], [a])
splitAt X
i [Point]
dbs
Maybe Target
_ -> ([Point], [Point])
pickUnderXhair
gtlt :: [Point]
gtlt = [Point]
gt [Point] -> [Point] -> [Point]
forall a. [a] -> [a] -> [a]
++ [Point]
lt
sxhair :: Maybe Target
sxhair = case [Point]
gtlt of
Point
p : [Point]
_ -> Target -> Maybe Target
forall a. a -> Maybe a
Just (Target -> Maybe Target) -> Target -> Maybe Target
forall a b. (a -> b) -> a -> b
$ TGoal -> LevelId -> Point -> Target
TPoint TGoal
TKnown LevelId
lidV Point
p
[] -> Maybe Target
xhair
(SessionUI -> SessionUI) -> m ()
forall (m :: * -> *).
MonadClientUI m =>
(SessionUI -> SessionUI) -> m ()
modifySession ((SessionUI -> SessionUI) -> m ())
-> (SessionUI -> SessionUI) -> m ()
forall a b. (a -> b) -> a -> b
$ \SessionUI
sess -> SessionUI
sess {saimMode :: Maybe AimMode
saimMode =
let newDetail :: DetailLevel
newDetail = DetailLevel
-> (AimMode -> DetailLevel) -> Maybe AimMode -> DetailLevel
forall b a. b -> (a -> b) -> Maybe a -> b
maybe DetailLevel
defaultDetailLevel AimMode -> DetailLevel
detailLevel Maybe AimMode
saimMode
in AimMode -> Maybe AimMode
forall a. a -> Maybe a
Just (AimMode -> Maybe AimMode) -> AimMode -> Maybe AimMode
forall a b. (a -> b) -> a -> b
$ LevelId -> DetailLevel -> AimMode
AimMode LevelId
lidV DetailLevel
newDetail}
Maybe Target -> m ()
forall (m :: * -> *). MonadClientUI m => Maybe Target -> m ()
setXHairFromGUI Maybe Target
sxhair
m ()
forall (m :: * -> *). MonadClientUI m => m ()
doLook
aimAscendHuman :: MonadClientUI m => Int -> m MError
aimAscendHuman :: X -> m MError
aimAscendHuman X
k = do
Dungeon
dungeon <- (State -> Dungeon) -> m Dungeon
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState State -> Dungeon
sdungeon
LevelId
lidV <- m LevelId
forall (m :: * -> *). MonadClientUI m => m LevelId
viewedLevelUI
let up :: Bool
up = X
k X -> X -> Bool
forall a. Ord a => a -> a -> Bool
> X
0
case Dungeon -> Bool -> LevelId -> [LevelId]
ascendInBranch Dungeon
dungeon Bool
up LevelId
lidV of
[] -> Text -> m MError
forall (m :: * -> *). MonadClientUI m => Text -> m MError
failMsg Text
"no more levels in this direction"
LevelId
_ : [LevelId]
_ -> do
let ascendOne :: LevelId -> LevelId
ascendOne LevelId
lid = case Dungeon -> Bool -> LevelId -> [LevelId]
ascendInBranch Dungeon
dungeon Bool
up LevelId
lid of
[] -> LevelId
lid
LevelId
nlid : [LevelId]
_ -> LevelId
nlid
lidK :: LevelId
lidK = (LevelId -> LevelId) -> LevelId -> [LevelId]
forall a. (a -> a) -> a -> [a]
iterate LevelId -> LevelId
ascendOne LevelId
lidV [LevelId] -> X -> LevelId
forall a. [a] -> X -> a
!! X -> X
forall a. Num a => a -> a
abs X
k
Point
xhairPos <- m Point
forall (m :: * -> *). MonadClientUI m => m Point
xhairToPos
let sxhair :: Maybe Target
sxhair = Target -> Maybe Target
forall a. a -> Maybe a
Just (Target -> Maybe Target) -> Target -> Maybe Target
forall a b. (a -> b) -> a -> b
$ TGoal -> LevelId -> Point -> Target
TPoint TGoal
TKnown LevelId
lidK Point
xhairPos
(SessionUI -> SessionUI) -> m ()
forall (m :: * -> *).
MonadClientUI m =>
(SessionUI -> SessionUI) -> m ()
modifySession ((SessionUI -> SessionUI) -> m ())
-> (SessionUI -> SessionUI) -> m ()
forall a b. (a -> b) -> a -> b
$ \SessionUI
sess -> SessionUI
sess {saimMode :: Maybe AimMode
saimMode =
let newDetail :: DetailLevel
newDetail = DetailLevel
-> (AimMode -> DetailLevel) -> Maybe AimMode -> DetailLevel
forall b a. b -> (a -> b) -> Maybe a -> b
maybe DetailLevel
defaultDetailLevel AimMode -> DetailLevel
detailLevel (SessionUI -> Maybe AimMode
saimMode SessionUI
sess)
in AimMode -> Maybe AimMode
forall a. a -> Maybe a
Just (AimMode -> Maybe AimMode) -> AimMode -> Maybe AimMode
forall a b. (a -> b) -> a -> b
$ LevelId -> DetailLevel -> AimMode
AimMode LevelId
lidK DetailLevel
newDetail}
Maybe Target -> m ()
forall (m :: * -> *). MonadClientUI m => Maybe Target -> m ()
setXHairFromGUI Maybe Target
sxhair
m ()
forall (m :: * -> *). MonadClientUI m => m ()
doLook
MError -> m MError
forall (m :: * -> *) a. Monad m => a -> m a
return MError
forall a. Maybe a
Nothing
epsIncrHuman :: (MonadClient m, MonadClientUI m) => Direction -> m ()
epsIncrHuman :: Direction -> m ()
epsIncrHuman Direction
d = do
let sepsDelta :: X
sepsDelta = case Direction
d of
Direction
Forward -> X
1
Direction
Backward -> -X
1
(StateClient -> StateClient) -> m ()
forall (m :: * -> *).
MonadClient m =>
(StateClient -> StateClient) -> m ()
modifyClient ((StateClient -> StateClient) -> m ())
-> (StateClient -> StateClient) -> m ()
forall a b. (a -> b) -> a -> b
$ \StateClient
cli -> StateClient
cli {seps :: X
seps = StateClient -> X
seps StateClient
cli X -> X -> X
forall a. Num a => a -> a -> a
+ X
sepsDelta}
m ()
forall (m :: * -> *). MonadClient m => m ()
invalidateBfsPathAll
(SessionUI -> SessionUI) -> m ()
forall (m :: * -> *).
MonadClientUI m =>
(SessionUI -> SessionUI) -> m ()
modifySession ((SessionUI -> SessionUI) -> m ())
-> (SessionUI -> SessionUI) -> m ()
forall a b. (a -> b) -> a -> b
$ \SessionUI
sess -> SessionUI
sess {sreportNull :: Bool
sreportNull = Bool
False}
Maybe AimMode
saimMode <- (SessionUI -> Maybe AimMode) -> m (Maybe AimMode)
forall (m :: * -> *) a. MonadClientUI m => (SessionUI -> a) -> m a
getsSession SessionUI -> Maybe AimMode
saimMode
LevelId
lidV <- m LevelId
forall (m :: * -> *). MonadClientUI m => m LevelId
viewedLevelUI
(SessionUI -> SessionUI) -> m ()
forall (m :: * -> *).
MonadClientUI m =>
(SessionUI -> SessionUI) -> m ()
modifySession ((SessionUI -> SessionUI) -> m ())
-> (SessionUI -> SessionUI) -> m ()
forall a b. (a -> b) -> a -> b
$ \SessionUI
sess -> SessionUI
sess {saimMode :: Maybe AimMode
saimMode =
let newDetail :: DetailLevel
newDetail = DetailLevel
-> (AimMode -> DetailLevel) -> Maybe AimMode -> DetailLevel
forall b a. b -> (a -> b) -> Maybe a -> b
maybe DetailLevel
DetailLow AimMode -> DetailLevel
detailLevel Maybe AimMode
saimMode
in AimMode -> Maybe AimMode
forall a. a -> Maybe a
Just (AimMode -> Maybe AimMode) -> AimMode -> Maybe AimMode
forall a b. (a -> b) -> a -> b
$ LevelId -> DetailLevel -> AimMode
AimMode LevelId
lidV DetailLevel
newDetail}
m ()
forall (m :: * -> *). MonadClientUI m => m ()
flashAiming
(SessionUI -> SessionUI) -> m ()
forall (m :: * -> *).
MonadClientUI m =>
(SessionUI -> SessionUI) -> m ()
modifySession ((SessionUI -> SessionUI) -> m ())
-> (SessionUI -> SessionUI) -> m ()
forall a b. (a -> b) -> a -> b
$ \SessionUI
sess -> SessionUI
sess {Maybe AimMode
saimMode :: Maybe AimMode
saimMode :: Maybe AimMode
saimMode}
MsgClassShow -> Text -> m ()
forall (m :: * -> *) a.
(MonadClientUI m, MsgShared a) =>
a -> Text -> m ()
msgAdd MsgClassShow
MsgPromptAction Text
"Aiming line (possibly) modified."
flashAiming :: MonadClientUI m => m ()
flashAiming :: m ()
flashAiming = do
LevelId
lidV <- m LevelId
forall (m :: * -> *). MonadClientUI m => m LevelId
viewedLevelUI
LevelId -> Animation -> m ()
forall (m :: * -> *).
MonadClientUI m =>
LevelId -> Animation -> m ()
animate LevelId
lidV Animation
pushAndDelay
xhairUnknownHuman :: (MonadClient m, MonadClientUI m) => ActorId -> m MError
xhairUnknownHuman :: ActorId -> m MError
xhairUnknownHuman ActorId
leader = do
Actor
b <- (State -> Actor) -> m Actor
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState ((State -> Actor) -> m Actor) -> (State -> Actor) -> m Actor
forall a b. (a -> b) -> a -> b
$ ActorId -> State -> Actor
getActorBody ActorId
leader
Maybe Point
mpos <- ActorId -> m (Maybe Point)
forall (m :: * -> *). MonadClient m => ActorId -> m (Maybe Point)
closestUnknown ActorId
leader
case Maybe Point
mpos of
Maybe Point
Nothing -> Text -> m MError
forall (m :: * -> *). MonadClientUI m => Text -> m MError
failMsg Text
"no more unknown spots left"
Just Point
p -> do
let sxhair :: Maybe Target
sxhair = Target -> Maybe Target
forall a. a -> Maybe a
Just (Target -> Maybe Target) -> Target -> Maybe Target
forall a b. (a -> b) -> a -> b
$ TGoal -> LevelId -> Point -> Target
TPoint TGoal
TUnknown (Actor -> LevelId
blid Actor
b) Point
p
Maybe Target -> m ()
forall (m :: * -> *). MonadClientUI m => Maybe Target -> m ()
setXHairFromGUI Maybe Target
sxhair
m ()
forall (m :: * -> *). MonadClientUI m => m ()
doLook
MError -> m MError
forall (m :: * -> *) a. Monad m => a -> m a
return MError
forall a. Maybe a
Nothing
xhairItemHuman :: (MonadClient m, MonadClientUI m) => ActorId -> m MError
xhairItemHuman :: ActorId -> m MError
xhairItemHuman ActorId
leader = do
Actor
b <- (State -> Actor) -> m Actor
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState ((State -> Actor) -> m Actor) -> (State -> Actor) -> m Actor
forall a b. (a -> b) -> a -> b
$ ActorId -> State -> Actor
getActorBody ActorId
leader
[(X, (Point, EnumMap ItemId ItemQuant))]
items <- ActorId -> m [(X, (Point, EnumMap ItemId ItemQuant))]
forall (m :: * -> *).
MonadClient m =>
ActorId -> m [(X, (Point, EnumMap ItemId ItemQuant))]
closestItems ActorId
leader
case [(X, (Point, EnumMap ItemId ItemQuant))]
items of
[] -> Text -> m MError
forall (m :: * -> *). MonadClientUI m => Text -> m MError
failMsg Text
"no more reachable items remembered or visible"
[(X, (Point, EnumMap ItemId ItemQuant))]
_ -> do
let (X
_, (Point
p, EnumMap ItemId ItemQuant
bag)) = ((X, (Point, EnumMap ItemId ItemQuant))
-> (X, (Point, EnumMap ItemId ItemQuant)) -> Ordering)
-> [(X, (Point, EnumMap ItemId ItemQuant))]
-> (X, (Point, EnumMap ItemId ItemQuant))
forall (t :: * -> *) a.
Foldable t =>
(a -> a -> Ordering) -> t a -> a
maximumBy (((X, (Point, EnumMap ItemId ItemQuant)) -> X)
-> (X, (Point, EnumMap ItemId ItemQuant))
-> (X, (Point, EnumMap ItemId ItemQuant))
-> Ordering
forall a b. Ord a => (b -> a) -> b -> b -> Ordering
comparing (X, (Point, EnumMap ItemId ItemQuant)) -> X
forall a b. (a, b) -> a
fst) [(X, (Point, EnumMap ItemId ItemQuant))]
items
sxhair :: Maybe Target
sxhair = Target -> Maybe Target
forall a. a -> Maybe a
Just (Target -> Maybe Target) -> Target -> Maybe Target
forall a b. (a -> b) -> a -> b
$ TGoal -> LevelId -> Point -> Target
TPoint (EnumMap ItemId ItemQuant -> TGoal
TItem EnumMap ItemId ItemQuant
bag) (Actor -> LevelId
blid Actor
b) Point
p
Maybe Target -> m ()
forall (m :: * -> *). MonadClientUI m => Maybe Target -> m ()
setXHairFromGUI Maybe Target
sxhair
m ()
forall (m :: * -> *). MonadClientUI m => m ()
doLook
MError -> m MError
forall (m :: * -> *) a. Monad m => a -> m a
return MError
forall a. Maybe a
Nothing
xhairStairHuman :: (MonadClient m, MonadClientUI m)
=> ActorId -> Bool -> m MError
xhairStairHuman :: ActorId -> Bool -> m MError
xhairStairHuman ActorId
leader Bool
up = do
Actor
b <- (State -> Actor) -> m Actor
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState ((State -> Actor) -> m Actor) -> (State -> Actor) -> m Actor
forall a b. (a -> b) -> a -> b
$ ActorId -> State -> Actor
getActorBody ActorId
leader
[(X, (Point, (Point, EnumMap ItemId ItemQuant)))]
stairs <- FleeViaStairsOrEscape
-> ActorId -> m [(X, (Point, (Point, EnumMap ItemId ItemQuant)))]
forall (m :: * -> *).
MonadClient m =>
FleeViaStairsOrEscape
-> ActorId -> m [(X, (Point, (Point, EnumMap ItemId ItemQuant)))]
closestTriggers (if Bool
up then FleeViaStairsOrEscape
ViaStairsUp else FleeViaStairsOrEscape
ViaStairsDown) ActorId
leader
case [(X, (Point, (Point, EnumMap ItemId ItemQuant)))]
stairs of
[] -> Text -> m MError
forall (m :: * -> *). MonadClientUI m => Text -> m MError
failMsg (Text -> m MError) -> Text -> m MError
forall a b. (a -> b) -> a -> b
$ Text
"no reachable stairs" Text -> Text -> Text
<+> if Bool
up then Text
"up" else Text
"down"
[(X, (Point, (Point, EnumMap ItemId ItemQuant)))]
_ -> do
let (X
_, (Point
p, (Point
p0, EnumMap ItemId ItemQuant
bag))) = ((X, (Point, (Point, EnumMap ItemId ItemQuant)))
-> (X, (Point, (Point, EnumMap ItemId ItemQuant))) -> Ordering)
-> [(X, (Point, (Point, EnumMap ItemId ItemQuant)))]
-> (X, (Point, (Point, EnumMap ItemId ItemQuant)))
forall (t :: * -> *) a.
Foldable t =>
(a -> a -> Ordering) -> t a -> a
maximumBy (((X, (Point, (Point, EnumMap ItemId ItemQuant))) -> X)
-> (X, (Point, (Point, EnumMap ItemId ItemQuant)))
-> (X, (Point, (Point, EnumMap ItemId ItemQuant)))
-> Ordering
forall a b. Ord a => (b -> a) -> b -> b -> Ordering
comparing (X, (Point, (Point, EnumMap ItemId ItemQuant))) -> X
forall a b. (a, b) -> a
fst) [(X, (Point, (Point, EnumMap ItemId ItemQuant)))]
stairs
sxhair :: Maybe Target
sxhair = Target -> Maybe Target
forall a. a -> Maybe a
Just (Target -> Maybe Target) -> Target -> Maybe Target
forall a b. (a -> b) -> a -> b
$ TGoal -> LevelId -> Point -> Target
TPoint (EnumMap ItemId ItemQuant -> Point -> TGoal
TEmbed EnumMap ItemId ItemQuant
bag Point
p0) (Actor -> LevelId
blid Actor
b) Point
p
Maybe Target -> m ()
forall (m :: * -> *). MonadClientUI m => Maybe Target -> m ()
setXHairFromGUI Maybe Target
sxhair
m ()
forall (m :: * -> *). MonadClientUI m => m ()
doLook
MError -> m MError
forall (m :: * -> *) a. Monad m => a -> m a
return MError
forall a. Maybe a
Nothing
xhairPointerFloorHuman :: MonadClientUI m => m ()
xhairPointerFloorHuman :: m ()
xhairPointerFloorHuman = do
Maybe AimMode
saimMode <- (SessionUI -> Maybe AimMode) -> m (Maybe AimMode)
forall (m :: * -> *) a. MonadClientUI m => (SessionUI -> a) -> m a
getsSession SessionUI -> Maybe AimMode
saimMode
m ()
forall (m :: * -> *). MonadClientUI m => m ()
aimPointerFloorHuman
Bool -> m () -> m ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Maybe AimMode -> Bool
forall a. Maybe a -> Bool
isNothing Maybe AimMode
saimMode) (m () -> m ()) -> m () -> m ()
forall a b. (a -> b) -> a -> b
$
(SessionUI -> SessionUI) -> m ()
forall (m :: * -> *).
MonadClientUI m =>
(SessionUI -> SessionUI) -> m ()
modifySession ((SessionUI -> SessionUI) -> m ())
-> (SessionUI -> SessionUI) -> m ()
forall a b. (a -> b) -> a -> b
$ \SessionUI
sess -> SessionUI
sess {Maybe AimMode
saimMode :: Maybe AimMode
saimMode :: Maybe AimMode
saimMode}
xhairPointerMuteHuman :: MonadClientUI m => m ()
xhairPointerMuteHuman :: m ()
xhairPointerMuteHuman = do
Maybe AimMode
saimMode <- (SessionUI -> Maybe AimMode) -> m (Maybe AimMode)
forall (m :: * -> *) a. MonadClientUI m => (SessionUI -> a) -> m a
getsSession SessionUI -> Maybe AimMode
saimMode
Bool -> m ()
forall (m :: * -> *). MonadClientUI m => Bool -> m ()
aimPointerFloorLoud Bool
False
Bool -> m () -> m ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Maybe AimMode -> Bool
forall a. Maybe a -> Bool
isNothing Maybe AimMode
saimMode) (m () -> m ()) -> m () -> m ()
forall a b. (a -> b) -> a -> b
$
(SessionUI -> SessionUI) -> m ()
forall (m :: * -> *).
MonadClientUI m =>
(SessionUI -> SessionUI) -> m ()
modifySession ((SessionUI -> SessionUI) -> m ())
-> (SessionUI -> SessionUI) -> m ()
forall a b. (a -> b) -> a -> b
$ \SessionUI
sess -> SessionUI
sess {Maybe AimMode
saimMode :: Maybe AimMode
saimMode :: Maybe AimMode
saimMode}
xhairPointerEnemyHuman :: MonadClientUI m => m ()
xhairPointerEnemyHuman :: m ()
xhairPointerEnemyHuman = do
Maybe AimMode
saimMode <- (SessionUI -> Maybe AimMode) -> m (Maybe AimMode)
forall (m :: * -> *) a. MonadClientUI m => (SessionUI -> a) -> m a
getsSession SessionUI -> Maybe AimMode
saimMode
m ()
forall (m :: * -> *). MonadClientUI m => m ()
aimPointerEnemyHuman
Bool -> m () -> m ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Maybe AimMode -> Bool
forall a. Maybe a -> Bool
isNothing Maybe AimMode
saimMode) (m () -> m ()) -> m () -> m ()
forall a b. (a -> b) -> a -> b
$
(SessionUI -> SessionUI) -> m ()
forall (m :: * -> *).
MonadClientUI m =>
(SessionUI -> SessionUI) -> m ()
modifySession ((SessionUI -> SessionUI) -> m ())
-> (SessionUI -> SessionUI) -> m ()
forall a b. (a -> b) -> a -> b
$ \SessionUI
sess -> SessionUI
sess {Maybe AimMode
saimMode :: Maybe AimMode
saimMode :: Maybe AimMode
saimMode}
aimPointerFloorHuman :: MonadClientUI m => m ()
aimPointerFloorHuman :: m ()
aimPointerFloorHuman = Bool -> m ()
forall (m :: * -> *). MonadClientUI m => Bool -> m ()
aimPointerFloorLoud Bool
True
aimPointerFloorLoud :: MonadClientUI m => Bool -> m ()
aimPointerFloorLoud :: Bool -> m ()
aimPointerFloorLoud Bool
loud = do
COps{corule :: COps -> RuleContent
corule=RuleContent{X
rWidthMax :: X
rWidthMax :: RuleContent -> X
rWidthMax, X
rHeightMax :: X
rHeightMax :: RuleContent -> X
rHeightMax}} <- (State -> COps) -> m COps
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState State -> COps
scops
LevelId
lidV <- m LevelId
forall (m :: * -> *). MonadClientUI m => m LevelId
viewedLevelUI
PointUI
pUI <- (SessionUI -> PointUI) -> m PointUI
forall (m :: * -> *) a. MonadClientUI m => (SessionUI -> a) -> m a
getsSession SessionUI -> PointUI
spointer
let p :: Point
p = PointSquare -> Point
squareToMap (PointSquare -> Point) -> PointSquare -> Point
forall a b. (a -> b) -> a -> b
$ PointUI -> PointSquare
uiToSquare PointUI
pUI
if (X, X, X, X) -> Point -> Bool
insideP (X
0, X
0, X
rWidthMax X -> X -> X
forall a. Num a => a -> a -> a
- X
1, X
rHeightMax X -> X -> X
forall a. Num a => a -> a -> a
- X
1) Point
p
then do
Maybe Target
oldXhair <- (SessionUI -> Maybe Target) -> m (Maybe Target)
forall (m :: * -> *) a. MonadClientUI m => (SessionUI -> a) -> m a
getsSession SessionUI -> Maybe Target
sxhair
let sxhair :: Maybe Target
sxhair = Target -> Maybe Target
forall a. a -> Maybe a
Just (Target -> Maybe Target) -> Target -> Maybe Target
forall a b. (a -> b) -> a -> b
$ TGoal -> LevelId -> Point -> Target
TPoint TGoal
TUnknown LevelId
lidV Point
p
sxhairMoused :: Bool
sxhairMoused = Maybe Target
sxhair Maybe Target -> Maybe Target -> Bool
forall a. Eq a => a -> a -> Bool
/= Maybe Target
oldXhair
detailSucc :: AimMode -> DetailLevel
detailSucc = if Bool
sxhairMoused
then AimMode -> DetailLevel
detailLevel
else DetailLevel -> DetailLevel
detailCycle (DetailLevel -> DetailLevel)
-> (AimMode -> DetailLevel) -> AimMode -> DetailLevel
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AimMode -> DetailLevel
detailLevel
(SessionUI -> SessionUI) -> m ()
forall (m :: * -> *).
MonadClientUI m =>
(SessionUI -> SessionUI) -> m ()
modifySession ((SessionUI -> SessionUI) -> m ())
-> (SessionUI -> SessionUI) -> m ()
forall a b. (a -> b) -> a -> b
$ \SessionUI
sess ->
SessionUI
sess { saimMode :: Maybe AimMode
saimMode =
let newDetail :: DetailLevel
newDetail = DetailLevel
-> (AimMode -> DetailLevel) -> Maybe AimMode -> DetailLevel
forall b a. b -> (a -> b) -> Maybe a -> b
maybe DetailLevel
defaultDetailLevel AimMode -> DetailLevel
detailSucc
(SessionUI -> Maybe AimMode
saimMode SessionUI
sess)
in AimMode -> Maybe AimMode
forall a. a -> Maybe a
Just (AimMode -> Maybe AimMode) -> AimMode -> Maybe AimMode
forall a b. (a -> b) -> a -> b
$ LevelId -> DetailLevel -> AimMode
AimMode LevelId
lidV DetailLevel
newDetail
, Bool
sxhairMoused :: Bool
sxhairMoused :: Bool
sxhairMoused }
Maybe Target -> m ()
forall (m :: * -> *). MonadClientUI m => Maybe Target -> m ()
setXHairFromGUI Maybe Target
sxhair
Bool -> m () -> m ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when Bool
loud m ()
forall (m :: * -> *). MonadClientUI m => m ()
doLook
else m ()
forall (m :: * -> *). MonadClientUI m => m ()
stopPlayBack
aimPointerEnemyHuman :: MonadClientUI m => m ()
aimPointerEnemyHuman :: m ()
aimPointerEnemyHuman = do
COps{corule :: COps -> RuleContent
corule=RuleContent{X
rWidthMax :: X
rWidthMax :: RuleContent -> X
rWidthMax, X
rHeightMax :: X
rHeightMax :: RuleContent -> X
rHeightMax}} <- (State -> COps) -> m COps
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState State -> COps
scops
LevelId
lidV <- m LevelId
forall (m :: * -> *). MonadClientUI m => m LevelId
viewedLevelUI
PointUI
pUI <- (SessionUI -> PointUI) -> m PointUI
forall (m :: * -> *) a. MonadClientUI m => (SessionUI -> a) -> m a
getsSession SessionUI -> PointUI
spointer
let p :: Point
p = PointSquare -> Point
squareToMap (PointSquare -> Point) -> PointSquare -> Point
forall a b. (a -> b) -> a -> b
$ PointUI -> PointSquare
uiToSquare PointUI
pUI
if (X, X, X, X) -> Point -> Bool
insideP (X
0, X
0, X
rWidthMax X -> X -> X
forall a. Num a => a -> a -> a
- X
1, X
rHeightMax X -> X -> X
forall a. Num a => a -> a -> a
- X
1) Point
p
then do
[(ActorId, Actor)]
bsAll <- (State -> [(ActorId, Actor)]) -> m [(ActorId, Actor)]
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState ((State -> [(ActorId, Actor)]) -> m [(ActorId, Actor)])
-> (State -> [(ActorId, Actor)]) -> m [(ActorId, Actor)]
forall a b. (a -> b) -> a -> b
$ (FactionId -> Bool) -> LevelId -> State -> [(ActorId, Actor)]
actorAssocs (Bool -> FactionId -> Bool
forall a b. a -> b -> a
const Bool
True) LevelId
lidV
Maybe Target
oldXhair <- (SessionUI -> Maybe Target) -> m (Maybe Target)
forall (m :: * -> *) a. MonadClientUI m => (SessionUI -> a) -> m a
getsSession SessionUI -> Maybe Target
sxhair
FactionId
side <- (StateClient -> FactionId) -> m FactionId
forall (m :: * -> *) a.
MonadClientRead m =>
(StateClient -> a) -> m a
getsClient StateClient -> FactionId
sside
Faction
fact <- (State -> Faction) -> m Faction
forall (m :: * -> *) a. MonadStateRead m => (State -> a) -> m a
getsState ((State -> Faction) -> m Faction)
-> (State -> Faction) -> m Faction
forall a b. (a -> b) -> a -> b
$ (EnumMap FactionId Faction -> FactionId -> Faction
forall k a. Enum k => EnumMap k a -> k -> a
EM.! FactionId
side) (EnumMap FactionId Faction -> Faction)
-> (State -> EnumMap FactionId Faction) -> State -> Faction
forall b c a. (b -> c) -> (a -> b) -> a -> c
. State -> EnumMap FactionId Faction
sfactionD
let sxhair :: Maybe Target
sxhair =
case ((ActorId, Actor) -> Bool)
-> [(ActorId, Actor)] -> Maybe (ActorId, Actor)
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Maybe a
find (\(ActorId
_, Actor
b) -> Actor -> Point
bpos Actor
b Point -> Point -> Bool
forall a. Eq a => a -> a -> Bool
== Point
p) [(ActorId, Actor)]
bsAll of
Just (ActorId
aid, Actor
b) -> Target -> Maybe Target
forall a. a -> Maybe a
Just (Target -> Maybe Target) -> Target -> Maybe Target
forall a b. (a -> b) -> a -> b
$ if FactionId -> Faction -> FactionId -> Bool
isFoe FactionId
side Faction
fact (Actor -> FactionId
bfid Actor
b)
then ActorId -> Target
TEnemy ActorId
aid
else ActorId -> Target
TNonEnemy ActorId
aid
Maybe (ActorId, Actor)
Nothing -> Target -> Maybe Target
forall a. a -> Maybe a
Just (Target -> Maybe Target) -> Target -> Maybe Target
forall a b. (a -> b) -> a -> b
$ TGoal -> LevelId -> Point -> Target
TPoint TGoal
TUnknown LevelId
lidV Point
p
sxhairMoused :: Bool
sxhairMoused = Maybe Target
sxhair Maybe Target -> Maybe Target -> Bool
forall a. Eq a => a -> a -> Bool
/= Maybe Target
oldXhair
detailSucc :: AimMode -> DetailLevel
detailSucc = if Bool
sxhairMoused
then AimMode -> DetailLevel
detailLevel
else DetailLevel -> DetailLevel
detailCycle (DetailLevel -> DetailLevel)
-> (AimMode -> DetailLevel) -> AimMode -> DetailLevel
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AimMode -> DetailLevel
detailLevel
(SessionUI -> SessionUI) -> m ()
forall (m :: * -> *).
MonadClientUI m =>
(SessionUI -> SessionUI) -> m ()
modifySession ((SessionUI -> SessionUI) -> m ())
-> (SessionUI -> SessionUI) -> m ()
forall a b. (a -> b) -> a -> b
$ \SessionUI
sess ->
SessionUI
sess { saimMode :: Maybe AimMode
saimMode =
let newDetail :: DetailLevel
newDetail = DetailLevel
-> (AimMode -> DetailLevel) -> Maybe AimMode -> DetailLevel
forall b a. b -> (a -> b) -> Maybe a -> b
maybe DetailLevel
defaultDetailLevel AimMode -> DetailLevel
detailSucc
(SessionUI -> Maybe AimMode
saimMode SessionUI
sess)
in AimMode -> Maybe AimMode
forall a. a -> Maybe a
Just (AimMode -> Maybe AimMode) -> AimMode -> Maybe AimMode
forall a b. (a -> b) -> a -> b
$ LevelId -> DetailLevel -> AimMode
AimMode LevelId
lidV DetailLevel
newDetail
, Bool
sxhairMoused :: Bool
sxhairMoused :: Bool
sxhairMoused }
Maybe Target -> m ()
forall (m :: * -> *). MonadClientUI m => Maybe Target -> m ()
setXHairFromGUI Maybe Target
sxhair
m ()
forall (m :: * -> *). MonadClientUI m => m ()
doLook
else m ()
forall (m :: * -> *). MonadClientUI m => m ()
stopPlayBack