packages feed

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"