diff options
author | Gregor Kleen <gkleen@yggdrasil.li> | 2016-06-14 03:26:18 +0200 |
---|---|---|
committer | Gregor Kleen <gkleen@yggdrasil.li> | 2016-06-14 03:26:18 +0200 |
commit | d196ace4100ec5f8cfb0fad265d3baa44873fc9d (patch) | |
tree | 6f6714769e2d539b70aef2f06ea0d7e16e46855e /src | |
parent | 0c5fe56414a323f49d7b086c0a64a216443a22bb (diff) | |
download | 2017-01-16_17:13:37-d196ace4100ec5f8cfb0fad265d3baa44873fc9d.tar 2017-01-16_17:13:37-d196ace4100ec5f8cfb0fad265d3baa44873fc9d.tar.gz 2017-01-16_17:13:37-d196ace4100ec5f8cfb0fad265d3baa44873fc9d.tar.bz2 2017-01-16_17:13:37-d196ace4100ec5f8cfb0fad265d3baa44873fc9d.tar.xz 2017-01-16_17:13:37-d196ace4100ec5f8cfb0fad265d3baa44873fc9d.zip |
fixed questions
Diffstat (limited to 'src')
-rw-r--r-- | src/Main.hs | 14 | ||||
-rw-r--r-- | src/Sequence/Contact/Tests.hs | 5 | ||||
-rw-r--r-- | src/Sequence/Contact/Types.hs | 20 | ||||
-rw-r--r-- | src/Sequence/Formula.hs | 55 | ||||
-rw-r--r-- | src/Sequence/Utils.hs | 2 |
5 files changed, 51 insertions, 45 deletions
diff --git a/src/Main.hs b/src/Main.hs index 3e6b750..636e5ea 100644 --- a/src/Main.hs +++ b/src/Main.hs | |||
@@ -62,8 +62,6 @@ import qualified Data.Text.Lazy as Lazy (Text) | |||
62 | import qualified Data.Text.Lazy as Lazy.Text | 62 | import qualified Data.Text.Lazy as Lazy.Text |
63 | import Data.Text.Template | 63 | import Data.Text.Template |
64 | 64 | ||
65 | import Debug.Trace | ||
66 | |||
67 | main :: IO () | 65 | main :: IO () |
68 | main = do | 66 | main = do |
69 | historyFile <- getUserCacheFile "sequence" "history" | 67 | historyFile <- getUserCacheFile "sequence" "history" |
@@ -158,7 +156,7 @@ stateMaintenance = do | |||
158 | lStats = gEntities . ix focusId . eStats | 156 | lStats = gEntities . ix focusId . eStats |
159 | evalF formula = do | 157 | evalF formula = do |
160 | stats <- MaybeT $ preuse lStats | 158 | stats <- MaybeT $ preuse lStats |
161 | (nStats, x) <- (evalFormula name :: Stats -> FormulaM Stats a -> MaybeT (Sh GameState) (Stats, a)) stats formula | 159 | (nStats, x) <- (evalFormula [name] :: Stats -> FormulaM Stats a -> MaybeT (Sh GameState) (Stats, a)) stats formula |
162 | lStats .= nStats | 160 | lStats .= nStats |
163 | return x | 161 | return x |
164 | isDead <- evalF =<< MaybeT (preuse $ lStats . sDead) | 162 | isDead <- evalF =<< MaybeT (preuse $ lStats . sDead) |
@@ -182,7 +180,7 @@ stateMaintenance = do | |||
182 | cVal <- MaybeT . preuse $ eStats . sSequence . _Just . seqVal . _Just | 180 | cVal <- MaybeT . preuse $ eStats . sSequence . _Just . seqVal . _Just |
183 | name <- lift . lift $ toName ident | 181 | name <- lift . lift $ toName ident |
184 | nVal' <- MaybeT . preuse $ eStats . sSeqVal | 182 | nVal' <- MaybeT . preuse $ eStats . sSeqVal |
185 | nVal <- MaybeT . focusState eStats $ evalFormula' name nVal' | 183 | nVal <- MaybeT . focusState eStats $ evalFormula' [name] nVal' |
186 | eStats . sSequence . _Just . seqVal . _Just += nVal | 184 | eStats . sSequence . _Just . seqVal . _Just += nVal |
187 | eStats . sSequence . _Just . seqRound . _Wrapped += 1 | 185 | eStats . sSequence . _Just . seqRound . _Wrapped += 1 |
188 | gRounds -= 1 | 186 | gRounds -= 1 |
@@ -274,7 +272,7 @@ rollTest = withArg $ enactTest' >=> maybe (return ()) (shellPutStrLn . ppResult) | |||
274 | enactTest' :: (FormulaM Stats Test) -> Sh GameState (Maybe TestResult) | 272 | enactTest' :: (FormulaM Stats Test) -> Sh GameState (Maybe TestResult) |
275 | enactTest' test = withFocus' $ \focus -> do | 273 | enactTest' test = withFocus' $ \focus -> do |
276 | focusName <- use gFocus >>= toName . fromJust | 274 | focusName <- use gFocus >>= toName . fromJust |
277 | (newFocus, result) <- evalFormula focusName focus (enactTest =<< test) | 275 | (newFocus, result) <- evalFormula [focusName] focus (enactTest =<< test) |
278 | gFocus' .= newFocus | 276 | gFocus' .= newFocus |
279 | return result | 277 | return result |
280 | 278 | ||
@@ -290,7 +288,7 @@ entitySeqVal' ident = void . runMaybeT $ do | |||
290 | sVal <- MaybeT . return $ preview (eStats . sSeqVal) entity | 288 | sVal <- MaybeT . return $ preview (eStats . sSeqVal) entity |
291 | name <- toName ident | 289 | name <- toName ident |
292 | round <- use gRound | 290 | round <- use gRound |
293 | (newEntity, sNum) <- evalFormula name entity sVal | 291 | (newEntity, sNum) <- evalFormula [name] entity sVal |
294 | let val = Just $ def | 292 | let val = Just $ def |
295 | & set (seqRound . _Wrapped) round | 293 | & set (seqRound . _Wrapped) round |
296 | & set seqVal (Just sNum) | 294 | & set seqVal (Just sNum) |
@@ -329,7 +327,7 @@ doShock dmg efLens = withFocus $ \focusId -> do | |||
329 | -- (nStats, x) <- (evalFormula name :: Stats -> FormulaM Stats a -> MaybeT (Sh GameState) (Stats, a)) stats formula | 327 | -- (nStats, x) <- (evalFormula name :: Stats -> FormulaM Stats a -> MaybeT (Sh GameState) (Stats, a)) stats formula |
330 | -- lStats .= nStats | 328 | -- lStats .= nStats |
331 | -- return x | 329 | -- return x |
332 | evalF = MaybeT . focusState lStats . evalFormula' name | 330 | evalF = MaybeT . focusState lStats . evalFormula' [name] |
333 | cVar cLens = evalF =<< MaybeT (preuse $ lStats . (cripple ^. cLens)) | 331 | cVar cLens = evalF =<< MaybeT (preuse $ lStats . (cripple ^. cLens)) |
334 | bar <- cVar seBar | 332 | bar <- cVar seBar |
335 | val <- cVar seVal | 333 | val <- cVar seVal |
@@ -350,7 +348,7 @@ takeHit dmg a1 a2 = flip withArg a1 $ \zones -> flip withArg a2 $ \dType -> with | |||
350 | lStats = gEntities . ix focusId . eStats | 348 | lStats = gEntities . ix focusId . eStats |
351 | name <- toName focusId | 349 | name <- toName focusId |
352 | armor <- MaybeT . preuse $ lStats . sArmor . ix zone | 350 | armor <- MaybeT . preuse $ lStats . sArmor . ix zone |
353 | dmg' <- MaybeT . focusState lStats . evalFormula' name $ absorb armor dType dmg | 351 | dmg' <- MaybeT . focusState lStats . evalFormula' [name] $ absorb armor dType dmg |
354 | forM_ (Map.toList dmg') $ \(dType, dmg) -> lift . runMaybeT $ do | 352 | forM_ (Map.toList dmg') $ \(dType, dmg) -> lift . runMaybeT $ do |
355 | guard $ dmg > 0 | 353 | guard $ dmg > 0 |
356 | lift $ shellPutStrLn $ name ++ " took " ++ show dmg ++ " " ++ show dType | 354 | lift $ shellPutStrLn $ name ++ " took " ++ show dmg ++ " " ++ show dType |
diff --git a/src/Sequence/Contact/Tests.hs b/src/Sequence/Contact/Tests.hs index 8665186..c100ce9 100644 --- a/src/Sequence/Contact/Tests.hs +++ b/src/Sequence/Contact/Tests.hs | |||
@@ -40,7 +40,7 @@ tests = do | |||
40 | 40 | ||
41 | views sExtraSkills (baseTests <>) | 41 | views sExtraSkills (baseTests <>) |
42 | where | 42 | where |
43 | test k v = maybe mempty (Map.singleton k) <$> preview v | 43 | test k v = maybe mempty (Map.singleton k) <$> previews v (set (mapped . tName) k) |
44 | 44 | ||
45 | skillTest = to (\x -> flip (set tBaseDifficulty) def <$> x) | 45 | skillTest = to (\x -> flip (set tBaseDifficulty) def <$> x) |
46 | attributeTest = to (\x -> flip (set tBaseDifficulty) def . (* 10) <$> x) | 46 | attributeTest = to (\x -> flip (set tBaseDifficulty) def . (* 10) <$> x) |
@@ -61,10 +61,11 @@ instance Argument (FormulaM Stats Test) GameState where | |||
61 | enactTest :: Test -> FormulaM Stats TestResult | 61 | enactTest :: Test -> FormulaM Stats TestResult |
62 | enactTest rawTest = do | 62 | enactTest rawTest = do |
63 | test <- foldM (&) rawTest =<< toListOf (ctx . sModifiers . folded . _Modifier . _2) <$> ask | 63 | test <- foldM (&) rawTest =<< toListOf (ctx . sModifiers . folded . _Modifier . _2) <$> ask |
64 | manualMod <- val ignored [CI.original (rawTest ^. tName), "Modifier"] False | ||
64 | let | 65 | let |
65 | critFailureBar = 95 - test^.tCritFailureMod | 66 | critFailureBar = 95 - test^.tCritFailureMod |
66 | critSuccessBar = 5 + test^.tCritSuccessMod | 67 | critSuccessBar = 5 + test^.tCritSuccessMod |
67 | bar = test^.tBaseDifficulty + test^.tMod | 68 | bar = test^.tBaseDifficulty + test^.tMod + manualMod |
68 | toResult pw = (toResult' pw) pw (abs $ bar - pw) | 69 | toResult pw = (toResult' pw) pw (abs $ bar - pw) |
69 | toResult' pw | 70 | toResult' pw |
70 | | bar > critSuccessBar | 71 | | bar > critSuccessBar |
diff --git a/src/Sequence/Contact/Types.hs b/src/Sequence/Contact/Types.hs index 9bb9903..4bd9790 100644 --- a/src/Sequence/Contact/Types.hs +++ b/src/Sequence/Contact/Types.hs | |||
@@ -130,16 +130,16 @@ applyModifier effectName modifier = Effect (CI.mk effectName) $ previews ctx app | |||
130 | where | 130 | where |
131 | apply = sModifiers <>~ [Modifier (CI.mk $ effectName ++ " (modifier)") modifier] | 131 | apply = sModifiers <>~ [Modifier (CI.mk $ effectName ++ " (modifier)") modifier] |
132 | 132 | ||
133 | vStrength = val sAStrength "Stärke?" True | 133 | vStrength = val sAStrength ["Stärke"] True |
134 | vEndurance = val sAEndurance "Ausdauer?" True | 134 | vEndurance = val sAEndurance ["Ausdauer"] True |
135 | vMass = val sAMass "Masse?" True | 135 | vMass = val sAMass ["Masse"] True |
136 | vReflexes = val sAReflexes "Reflexe?" True | 136 | vReflexes = val sAReflexes ["Reflexe"] True |
137 | vMobility = val sAMobility "Beweglichkeit?" True | 137 | vMobility = val sAMobility ["Beweglichkeit"] True |
138 | vDexterity = val sADexterity "Geschicklichkeit?" True | 138 | vDexterity = val sADexterity ["Geschicklichkeit"] True |
139 | vIntelligence = val sAIntelligence "Intelligenz?" True | 139 | vIntelligence = val sAIntelligence ["Intelligenz"] True |
140 | vCharisma = val sACharisma "Charisma?" True | 140 | vCharisma = val sACharisma ["Charisma"] True |
141 | vPerception = val sAPerception "Wahrnehmung?" True | 141 | vPerception = val sAPerception ["Wahrnehmung"] True |
142 | vWillpower = val sAWillpower "Entschlossenheit?" True | 142 | vWillpower = val sAWillpower ["Entschlossenheit"] True |
143 | 143 | ||
144 | scaled :: Ratio Int -> Iso' Int Int | 144 | scaled :: Ratio Int -> Iso' Int Int |
145 | scaled r = iso (\x -> floor $ x % 1 * r) (\x -> round $ x % 1 / r) | 145 | scaled r = iso (\x -> floor $ x % 1 * r) (\x -> round $ x % 1 / r) |
diff --git a/src/Sequence/Formula.hs b/src/Sequence/Formula.hs index 4830788..be5032a 100644 --- a/src/Sequence/Formula.hs +++ b/src/Sequence/Formula.hs | |||
@@ -1,4 +1,4 @@ | |||
1 | {-# LANGUAGE RecordWildCards, RankNTypes, TypeSynonymInstances, FlexibleInstances, MultiParamTypeClasses, ViewPatterns, TypeFamilies, GADTs, TypeOperators, ExistentialQuantification, FlexibleContexts #-} | 1 | {-# LANGUAGE RecordWildCards, RankNTypes, TypeSynonymInstances, FlexibleInstances, MultiParamTypeClasses, ViewPatterns, TypeFamilies, GADTs, TypeOperators, ExistentialQuantification, FlexibleContexts, IncoherentInstances #-} |
2 | 2 | ||
3 | module Sequence.Formula | 3 | module Sequence.Formula |
4 | ( FormulaM, Formula, quot' | 4 | ( FormulaM, Formula, quot' |
@@ -30,12 +30,12 @@ import Data.Maybe | |||
30 | import Data.Either | 30 | import Data.Either |
31 | import Data.Tuple | 31 | import Data.Tuple |
32 | 32 | ||
33 | import Data.Set (Set) | ||
34 | import qualified Data.Set as Set | ||
35 | |||
36 | import Data.Map (Map) | 33 | import Data.Map (Map) |
37 | import qualified Data.Map as Map | 34 | import qualified Data.Map as Map |
38 | 35 | ||
36 | import Data.Set (Set) | ||
37 | import qualified Data.Set as Set | ||
38 | |||
39 | class (:<:) small large where | 39 | class (:<:) small large where |
40 | ctx' :: Traversal' large small | 40 | ctx' :: Traversal' large small |
41 | 41 | ||
@@ -45,21 +45,27 @@ instance a :<: a where | |||
45 | instance a :<: (a, a) where | 45 | instance a :<: (a, a) where |
46 | ctx' = both | 46 | ctx' = both |
47 | 47 | ||
48 | instance a :<: (a, b) where | 48 | instance a :<: b => a :<: (b, c) where |
49 | ctx' = _1 | 49 | ctx' = _1 . ctx' |
50 | 50 | ||
51 | instance a :<: (b, a) where | 51 | instance a :<: (c, a) where |
52 | ctx' = _2 | 52 | ctx' = _2 |
53 | 53 | ||
54 | instance () :<: a where | 54 | instance () :<: a where |
55 | ctx' = united | 55 | ctx' = united |
56 | 56 | ||
57 | data Context small = forall large. (small :<: large) => Context large | 57 | instance a :<: b => a :<: Maybe b where |
58 | ctx' = _Just . ctx' | ||
59 | |||
60 | data Context small = forall large. (small :<: large) => Context large (Maybe (Formula small)) | ||
58 | 61 | ||
59 | ctx :: Traversal' (Context input) input | 62 | ctx :: Traversal' (Context input) input |
60 | ctx modifySmall (Context large) = Context <$> ctx' modifySmall large | 63 | ctx modifySmall (Context large fSt) = flip Context fSt <$> ctx' modifySmall large |
64 | |||
65 | ctxStore :: Traversal' (Context input) (Formula input) | ||
66 | ctxStore modifyF (Context large fSt) = Context large <$> _Just modifyF fSt | ||
61 | 67 | ||
62 | type FormulaM input a = StateT (Set String) (ReaderT (Context input) (ExceptT (Question input) EventM)) a | 68 | type FormulaM input a = StateT (Set [String]) (ReaderT (Context input) (ExceptT (Question input) EventM)) a |
63 | 69 | ||
64 | type Formula input = FormulaM input Int | 70 | type Formula input = FormulaM input Int |
65 | 71 | ||
@@ -68,7 +74,7 @@ instance MonadBase EventM EventM where | |||
68 | 74 | ||
69 | data Question input = Question | 75 | data Question input = Question |
70 | { answer :: Traversal' input (Formula input) | 76 | { answer :: Traversal' input (Formula input) |
71 | , prompt :: String | 77 | , prompt :: [String] |
72 | , keepResult :: Bool | 78 | , keepResult :: Bool |
73 | } | 79 | } |
74 | 80 | ||
@@ -94,29 +100,30 @@ instance Integral a => Num (FormulaM input a) where | |||
94 | quot' :: Integral a => FormulaM input a -> FormulaM input a -> FormulaM input a | 100 | quot' :: Integral a => FormulaM input a -> FormulaM input a -> FormulaM input a |
95 | quot' = liftM2 quot | 101 | quot' = liftM2 quot |
96 | 102 | ||
97 | askQuestion :: (MonadIO m, sInput :<: lInput) => String -> lInput -> Question sInput -> m lInput | 103 | askQuestion :: (MonadIO m, sInput :<: lInput) => [String] -> (lInput, Maybe (Formula sInput)) -> Question sInput -> m (lInput, Maybe (Formula sInput)) |
98 | askQuestion promptPref input q@(Question{..}) = flip (set $ ctx' . answer) input . maybe (throwError q) return <$> askQ (promptPref' ++ prompt) (join . fmap readMaybe) | 104 | askQuestion promptPref input q@(Question{..}) = flip (if keepResult then set $ _1 . ctx' . answer else set _2 . Just) input . maybe (throwError q) return <$> askQ (wPromptPref $ promptPref ++ prompt) (join . fmap readMaybe) |
99 | where | 105 | where |
100 | promptPref' | 106 | wPromptPref [] = " »" |
101 | | null promptPref = "" | 107 | wPromptPref [x] = x ++ " »" |
102 | | otherwise = promptPref ++ " » " | 108 | wPromptPref (x:xs) = x ++ " » " ++ wPromptPref xs |
103 | 109 | ||
104 | evalFormula :: (MonadIO m, sInput :<: lInput) => String -> lInput -> FormulaM sInput a -> m (lInput, a) | 110 | evalFormula :: (MonadIO m, sInput :<: lInput) => [String] -> lInput -> FormulaM sInput a -> m (lInput, a) |
105 | evalFormula = evalFormula' [] | 111 | evalFormula promptPref input = evalFormula' [] promptPref (input, Nothing) |
106 | where | 112 | where |
107 | evalFormula' finalChanges promptPref input formula = do | 113 | evalFormula' :: (MonadIO m, sInput :<: lInput) => [lInput -> lInput] -> [String] -> (lInput, Maybe (Formula sInput)) -> FormulaM sInput a -> m (lInput, a) |
108 | result <- liftIO . enact . runExceptT . (runReaderT ?? (Context input)) . (evalStateT ?? Set.empty) $ formula | 114 | evalFormula' finalChanges promptPref (input, fSt) formula = do |
115 | result <- liftIO . enact . runExceptT . (runReaderT ?? (Context input fSt)) . (evalStateT ?? Set.empty) $ formula | ||
109 | case result of | 116 | case result of |
110 | Left q@(Question{..}) -> askQuestion promptPref input q >>= flip (flip evalFormula' promptPref $ bool (pure . set (ctx' . answer) $ throwError q) mempty keepResult ++ finalChanges) formula | 117 | Left q@(Question{..}) -> askQuestion promptPref (input, fSt) q >>= flip (flip evalFormula' promptPref $ set (ctx' . answer) (throwError q) : finalChanges) formula |
111 | Right result -> return (foldr ($) input finalChanges, result) | 118 | Right result -> return (foldr ($) input finalChanges, result) |
112 | 119 | ||
113 | evalFormula' :: (MonadIO m, sInput :<: lInput, MonadState lInput m) => String -> FormulaM sInput a -> m a | 120 | evalFormula' :: (MonadIO m, sInput :<: lInput, MonadState lInput m) => [String] -> FormulaM sInput a -> m a |
114 | evalFormula' promptPref formula = uncurry (<$) . over _2 put . swap =<< flip (evalFormula promptPref) formula =<< get | 121 | evalFormula' promptPref formula = uncurry (<$) . over _2 put . swap =<< flip (evalFormula promptPref) formula =<< get |
115 | 122 | ||
116 | val :: Integral a => Traversal' input (Formula input) -> String -> Bool -> Formula input | 123 | val :: Traversal' input (Formula input) -> [String] -> Bool -> Formula input |
117 | val answer prompt keepResult = do | 124 | val answer prompt keepResult = do |
118 | gets (Set.member prompt) >>= bool (modify $ Set.insert prompt) (modify (Set.delete prompt) >> throwError Question{..}) | 125 | gets (Set.member prompt) >>= bool (modify $ Set.insert prompt) (modify (Set.delete prompt) >> throwError Question{..}) |
119 | preview (ctx . answer) >>= maybe (throwError Question{..}) id | 126 | preview (if keepResult then ctx . answer else ctxStore) >>= (modify (Set.delete prompt) >>) . fromMaybe (throwError Question{..}) |
120 | 127 | ||
121 | d, z :: Integral a => Int -> FormulaM input a | 128 | d, z :: Integral a => Int -> FormulaM input a |
122 | d n = liftBase . fmap fromIntegral $ D.d n | 129 | d n = liftBase . fmap fromIntegral $ D.d n |
diff --git a/src/Sequence/Utils.hs b/src/Sequence/Utils.hs index 513cb0b..929189e 100644 --- a/src/Sequence/Utils.hs +++ b/src/Sequence/Utils.hs | |||
@@ -77,7 +77,7 @@ toDesc :: (MonadState GameState m, MonadIO m) => EntityIdentifier -> m String | |||
77 | toDesc ident = do | 77 | toDesc ident = do |
78 | name <- toName ident | 78 | name <- toName ident |
79 | health <- runMaybeT $ do | 79 | health <- runMaybeT $ do |
80 | maxVit <- MaybeT . focusState (gEntities . ix ident) . evalFormula' name =<< (MaybeT . preuse $ gEntities . ix ident . eStats . sMaxVitality) | 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 | 81 | hDamage <- MaybeT . preuse $ gEntities . ix ident . eStats . sTotalDamage |
82 | fDamage <- MaybeT . preuse $ gEntities . ix ident . eStats . sFatigue | 82 | fDamage <- MaybeT . preuse $ gEntities . ix ident . eStats . sFatigue |
83 | return $ (maxVit - hDamage, maxVit - fDamage) | 83 | return $ (maxVit - hDamage, maxVit - fDamage) |