module Game.LambdaHack.Common.Action
(
MonadActionRO(..), MonadAction(..), MonadAtomic(..)
, getLevel, nUI
, serverSaveName
) where
import Control.Monad.Writer.Strict (WriterT, lift)
import qualified Data.EnumMap.Strict as EM
import Data.Monoid
import Game.LambdaHack.Common.AtomicCmd
import Game.LambdaHack.Common.Faction
import Game.LambdaHack.Common.Level
import Game.LambdaHack.Common.State
import Game.LambdaHack.Content.ModeKind
class (Monad m, Functor m) => MonadActionRO m where
getState :: m State
getsState :: (State -> a) -> m a
instance (Monoid a, MonadActionRO m) => MonadActionRO (WriterT a m) where
getState = lift getState
getsState = lift . getsState
instance MonadActionRO m => Show (WriterT a m b) where
show _ = "an action"
class MonadActionRO m => MonadAction m where
modifyState :: (State -> State) -> m ()
putState :: State -> m ()
class MonadActionRO m => MonadAtomic m where
execAtomic :: Atomic -> m ()
execCmdAtomic :: CmdAtomic -> m ()
execCmdAtomic = execAtomic . CmdAtomic
execSfxAtomic :: SfxAtomic -> m ()
execSfxAtomic = execAtomic . SfxAtomic
getLevel :: MonadActionRO m => LevelId -> m Level
getLevel lid = getsState $ (EM.! lid) . sdungeon
nUI :: MonadActionRO m => m Int
nUI = do
factionD <- getsState sfactionD
return $ length $ filter (playerUI . gplayer) $ EM.elems factionD
serverSaveName :: String
serverSaveName = "server.sav"