module Game.LambdaHack.Client.Action.ActionClass where
import Control.Monad.Writer.Strict (WriterT (WriterT), lift, runWriterT)
import Data.Monoid
import qualified Game.LambdaHack.Common.Key as K
import Game.LambdaHack.Client.Binding
import Game.LambdaHack.Client.State
import Game.LambdaHack.Common.Action
import Game.LambdaHack.Common.Faction
import Game.LambdaHack.Common.Msg
import Game.LambdaHack.Frontend (FrontReq)
data SessionUI = SessionUI
{ sfconn :: !ConnFrontend
, sbinding :: !Binding
}
data ConnFrontend = ConnFrontend
{ readConnFrontend :: MonadClientUI m => m K.KM
, writeConnFrontend :: MonadClientUI m => FrontReq -> m ()
}
class MonadActionRO m => MonadClient m where
getClient :: m StateClient
getsClient :: (StateClient -> a) -> m a
modifyClient :: (StateClient -> StateClient) -> m ()
putClient :: StateClient -> m ()
liftIO :: IO a -> m a
saveClient :: m ()
instance (Monoid a, MonadClient m) => MonadClient (WriterT a m) where
getClient = lift getClient
getsClient = lift . getsClient
modifyClient = lift . modifyClient
putClient = lift . putClient
liftIO = lift . liftIO
saveClient = lift saveClient
class MonadClient m => MonadClientUI m where
getsSession :: (SessionUI -> a) -> m a
instance (Monoid a, MonadClientUI m) => MonadClientUI (WriterT a m) where
getsSession = lift . getsSession
class MonadClient m => MonadClientReadServer c m | m -> c where
readServer :: m c
class MonadClient m => MonadClientWriteServer d m | m -> d where
writeServer :: d -> m ()
class MonadClient m => MonadClientAbort m where
tryWith :: (Msg -> m a) -> m a -> m a
abortWith :: Msg -> m a
instance (Monoid a, MonadClientAbort m) => MonadClientAbort (WriterT a m) where
tryWith exc m = WriterT $ tryWith (runWriterT . exc) (runWriterT m)
abortWith = lift . abortWith
saveName :: FactionId -> Bool -> String
saveName side isAI =
let n = fromEnum side
in (if n > 0
then "human_" ++ show n
else "computer_" ++ show (n))
++ if isAI then ".ai.sav" else ".ui.sav"