venzone-1.0.0.0: src/Gymnasium.hs
module Gymnasium ( playGymnasium,
recordGymnasium,
testGymnasium,
narrateGymnasium
)
where
-- Gymnasium testing utilities
import Venzone
import Story
import Menu
import Terminal.Game
import Lens.Micro.Platform
import qualified Data.List as L
import qualified NonEmptyZipper as Z
playGymnasium :: IO ()
playGymnasium = gymnasiumDo Nothing
recordGymnasium :: FilePath -> IO ()
recordGymnasium fp = gymnasiumDo (Just fp)
-- it is not pure only because load IO
testGymnasium :: FilePath -> IO Story
testGymnasium fp =
loadGymnasium >>= \vg ->
readRecord fp >>= \r ->
return (testGame vg r ^?! story . each)
narrateGymnasium :: FilePath -> IO ()
narrateGymnasium fp =
loadGymnasium >>= \vg ->
readRecord fp >>= \r ->
() <$ narrateGame vg r
-----------------
-- ANCILLARIES --
-----------------
gymnasiumDo :: Maybe FilePath -> IO ()
gymnasiumDo mf =
errorPress $
loadGymnasium >>= \vg ->
action vg
where
action :: Game s -> IO ()
action | (Just fp) <- mf = \g -> recordGame g fp >> return ()
| otherwise = playGame
loadGymnasium :: IO (Game Venzone)
loadGymnasium =
prepareVenzone >>= \gv ->
return (gv { gInitState = gInitState gv & story ?~ gym gv })
where
gym :: Game Venzone -> Story
gym g =
let ss = gInitState g ^. menu . stories . to Z.toList in
case L.find (\s -> (s ^. name) == "Gymnasium") ss of
Just s -> s
Nothing -> error "loadGymnasium: no Gymnasium found"