diff options
Diffstat (limited to 'src/Sequence')
| -rw-r--r-- | src/Sequence/Contact/Types.hs | 8 | ||||
| -rw-r--r-- | src/Sequence/Formula.hs | 2 | ||||
| -rw-r--r-- | src/Sequence/Utils.hs | 21 |
3 files changed, 27 insertions, 4 deletions
diff --git a/src/Sequence/Contact/Types.hs b/src/Sequence/Contact/Types.hs index 9854d92..80d4360 100644 --- a/src/Sequence/Contact/Types.hs +++ b/src/Sequence/Contact/Types.hs | |||
| @@ -181,4 +181,10 @@ sDead :: Fold Stats (FormulaM Stats Bool) | |||
| 181 | sDead = folding $ do | 181 | sDead = folding $ do |
| 182 | maxVitality <- preview sMaxVitality | 182 | maxVitality <- preview sMaxVitality |
| 183 | damage <- view sTotalDamage | 183 | damage <- view sTotalDamage |
| 184 | return $ liftM2 (>) <$> Just (return damage) <*> maxVitality | 184 | return $ liftM2 (>=) <$> Just (return damage) <*> maxVitality |
| 185 | |||
| 186 | sUnconscious :: Fold Stats (FormulaM Stats Bool) | ||
| 187 | sUnconscious = folding $ do | ||
| 188 | maxVitality <- preview sMaxVitality | ||
| 189 | damage <- view sFatigue | ||
| 190 | return $ liftM2 (>=) <$> Just (return damage) <*> maxVitality | ||
diff --git a/src/Sequence/Formula.hs b/src/Sequence/Formula.hs index 4f2e61b..4830788 100644 --- a/src/Sequence/Formula.hs +++ b/src/Sequence/Formula.hs | |||
| @@ -3,7 +3,7 @@ | |||
| 3 | module Sequence.Formula | 3 | module Sequence.Formula |
| 4 | ( FormulaM, Formula, quot' | 4 | ( FormulaM, Formula, quot' |
| 5 | , (:<:)(..), Context(..), ctx | 5 | , (:<:)(..), Context(..), ctx |
| 6 | , evalFormula | 6 | , evalFormula, evalFormula' |
| 7 | , val | 7 | , val |
| 8 | , d, z | 8 | , d, z |
| 9 | , Table, table | 9 | , Table, table |
diff --git a/src/Sequence/Utils.hs b/src/Sequence/Utils.hs index 8b205ea..1b52630 100644 --- a/src/Sequence/Utils.hs +++ b/src/Sequence/Utils.hs | |||
| @@ -1,8 +1,9 @@ | |||
| 1 | {-# LANGUAGE ViewPatterns, FlexibleContexts, MultiParamTypeClasses, FunctionalDependencies, FlexibleInstances, UndecidableInstances, OverloadedStrings #-} | 1 | {-# LANGUAGE ViewPatterns, FlexibleContexts, MultiParamTypeClasses, FunctionalDependencies, FlexibleInstances, UndecidableInstances, OverloadedStrings, RankNTypes #-} |
| 2 | 2 | ||
| 3 | module Sequence.Utils | 3 | module Sequence.Utils |
| 4 | ( withArg, withFocus, withFocus' | 4 | ( withArg, withFocus, withFocus' |
| 5 | , toName | 5 | , focusState |
| 6 | , toName, toDesc | ||
| 6 | , Argument(..) | 7 | , Argument(..) |
| 7 | , Completion(..) | 8 | , Completion(..) |
| 8 | , module Sequence.Utils.Ask | 9 | , module Sequence.Utils.Ask |
| @@ -44,6 +45,7 @@ import System.Console.Shell.Backend.Haskeline | |||
| 44 | 45 | ||
| 45 | import Sequence.Utils.Ask | 46 | import Sequence.Utils.Ask |
| 46 | import Sequence.Contact.Types | 47 | import Sequence.Contact.Types |
| 48 | import Sequence.Formula | ||
| 47 | 49 | ||
| 48 | class Argument a st | a -> st where | 50 | class Argument a st | a -> st where |
| 49 | arg :: String -> Sh st (Maybe a) | 51 | arg :: String -> Sh st (Maybe a) |
| @@ -59,6 +61,9 @@ withFocus f = use gFocus >>= maybe (shellPutErrLn $ "Currently not focusing any | |||
| 59 | withFocus' :: (Entity -> Sh GameState a) -> Sh GameState (Maybe a) | 61 | withFocus' :: (Entity -> Sh GameState a) -> Sh GameState (Maybe a) |
| 60 | withFocus' f = preuse gFocus' >>= maybe (Nothing <$ shellPutErrLn "Currently not focusing any entity") (fmap Just . f) | 62 | withFocus' f = preuse gFocus' >>= maybe (Nothing <$ shellPutErrLn "Currently not focusing any entity") (fmap Just . f) |
| 61 | 63 | ||
| 64 | focusState :: MonadState GameState m => Traversal' GameState a -> StateT a (MaybeT m) b -> m (Maybe b) | ||
| 65 | focusState lens action = runMaybeT $ uncurry (<$) . over _2 (lens .=) =<< runStateT action =<< MaybeT (preuse lens) | ||
| 66 | |||
| 62 | unaligned = view faction' def | 67 | unaligned = view faction' def |
| 63 | 68 | ||
| 64 | toName :: MonadState GameState m => EntityIdentifier -> m String | 69 | toName :: MonadState GameState m => EntityIdentifier -> m String |
| @@ -68,6 +73,18 @@ toName ident = do | |||
| 68 | let number' = bool id ('#':) isShadowed $ number | 73 | let number' = bool id ('#':) isShadowed $ number |
| 69 | fromMaybe number' . fmap (review entityName) . Bimap.lookup ident <$> use gEntityNames | 74 | fromMaybe number' . fmap (review entityName) . Bimap.lookup ident <$> use gEntityNames |
| 70 | 75 | ||
| 76 | toDesc :: (MonadState GameState m, MonadIO m) => EntityIdentifier -> m String | ||
| 77 | toDesc ident = do | ||
| 78 | name <- toName ident | ||
| 79 | health <- runMaybeT $ do | ||
| 80 | maxVit <- MaybeT . focusState (gEntities . ix ident) . evalFormula' name =<< (MaybeT . preuse $ gEntities . ix ident . eStats . sMaxVitality) | ||
| 81 | hDamage <- MaybeT . preuse $ gEntities . ix ident . eStats . sTotalDamage | ||
| 82 | fDamage <- MaybeT . preuse $ gEntities . ix ident . eStats . sFatigue | ||
| 83 | return $ (maxVit - hDamage, maxVit - fDamage) | ||
| 84 | case health of | ||
| 85 | Just dmg -> return $ name ++ " " ++ show dmg | ||
| 86 | Nothing -> return name | ||
| 87 | |||
| 71 | instance Completion EntityIdentifier GameState where | 88 | instance Completion EntityIdentifier GameState where |
| 72 | completableLabel _ = "<entity>" | 89 | completableLabel _ = "<entity>" |
| 73 | complete _ st prefix = return . filter ((isPrefixOf `on` CI.foldCase) prefix) . map ((evalState ?? st) . toName) . Map.keys $ st ^. gEntities | 90 | complete _ st prefix = return . filter ((isPrefixOf `on` CI.foldCase) prefix) . map ((evalState ?? st) . toName) . Map.keys $ st ^. gEntities |
