packages feed

crem-0.1.1.0: hobbit-game/Main.hs

{-# LANGUAGE DataKinds #-}

module Main where

import "base" Data.Functor.Identity
import "base" System.IO.Error
import "crem" Crem.Example.TheHobbit
import "crem" Crem.StateMachine

main :: IO ()
main = do
  putStrLn "Welcome to the Hobbit adventure game!"
  let
    initialState :: HobbitState 'TunnelLikeHall
    initialState = TunnelLikeHallState

    initialMessage :: String
    initialMessage = getMessage $ stateMessage initialState
  putStrLn initialMessage
  loop (Basic $ hobbitMachine initialState)
  where
    commandLoop :: IO HobbitCommand
    commandLoop = catchIOError readLn . const $ do
      putStrLn "The command you provided is invalid. The valid commands are GoEast, GoWest, GoNorth, GoSouth, Wait, GetKey and UnlockDoor. Please try again."
      commandLoop

    loop :: StateMachineT Identity HobbitCommand HobbitMessage -> IO ()
    loop machine = do
      command <- commandLoop
      let
        (message, machine') = runIdentity $ run machine command
      putStrLn $ getMessage message
      loop machine'