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"