module Game.Antisplice.SingleUser where
import Text.Chatty.Printer
import Text.Chatty.Finalizer
import Text.Chatty.Interactor
import Text.Chatty.Expansion
import Text.Chatty.Expansion.Vars
import Text.Chatty.Expansion.History
import Text.Chatty.Extended.Printer
import Text.Chatty.Extended.ANSI
import Text.Chatty.Channel.Printer
import Game.Antisplice.Monad.Dungeon
import Game.Antisplice.Monad.Vocab
import Game.Antisplice.Utils.Fail
import Game.Antisplice.Utils.Counter
import Game.Antisplice.Utils.Atoms
import Game.Antisplice.Utils.None
import Game.Antisplice.Errors
import Game.Antisplice.Monad
import Game.Antisplice.Rooms
import Game.Antisplice.Lang
import Game.Antisplice.Terminal.Repl
import Text.Printf
import System.IO
import Control.Monad
import Control.Monad.IO.Class
singleUser :: DungeonT (FailT SplErr (VocabT (AtomStoreT (CounterT (AnsiPrinterT (JoinerT (HistoryT (ExpanderT (NullExpanderT (HandleCloserT IO)))))))))) () -> IO ()
singleUser init =
void $
withLazyIO $
withExpansion $
localEnvironment $
flip runHistoryT [] $
runJoinerT $
flip runAnsiPrinterT [] $
withCounter $
flip runAtomStoreT none $
flip runVocabT defVocab $
do
mputv "prompt" $ Literal "$user #{health}H#?{ #{otitle} #{ohealth}H}> "
r <- runFailT $ flip runDungeonT none $ do
init
reenterCurrentRoom
roomTriggerOnAnnounceOf =<< getRoomState
roomTriggerOnLookOf =<< getRoomState
mputv "prompt" . Literal =<< expand "$prompt> "
repl
case r :: Either SplErr ((),DungeonState) of
Left QuitError -> mprintLn "Bye bye!"
Left e -> mprintLn $ printf "Error occured: %s\n" $ show e
Right x -> noneM