module Game.LambdaHack.Server.State
( StateServer(..), emptyStateServer
, DebugModeSer(..), defDebugModeSer
, RNGs(..)
, ActorTime, updateActorTime, ageActor
) where
import Prelude ()
import Game.LambdaHack.Common.Prelude
import Data.Binary
import qualified Data.EnumMap.Strict as EM
import qualified Data.EnumSet as ES
import qualified Data.HashMap.Strict as HM
import qualified System.Random as R
import Game.LambdaHack.Atomic
import Game.LambdaHack.Common.Actor
import Game.LambdaHack.Common.ClientOptions
import Game.LambdaHack.Common.Faction
import Game.LambdaHack.Common.Item
import Game.LambdaHack.Common.Level
import Game.LambdaHack.Common.Misc
import Game.LambdaHack.Common.Perception
import Game.LambdaHack.Common.Time
import Game.LambdaHack.Content.ModeKind
import Game.LambdaHack.Server.Fov
import Game.LambdaHack.Server.ItemRev
data StateServer = StateServer
{ sactorTime :: ActorTime
, sdiscoKind :: DiscoveryKind
, sdiscoKindRev :: DiscoveryKindRev
, suniqueSet :: UniqueSet
, sdiscoAspect :: DiscoveryAspect
, sitemSeedD :: ItemSeedDict
, sitemRev :: ItemRev
, sflavour :: FlavourMap
, sacounter :: ActorId
, sicounter :: ItemId
, snumSpawned :: EM.EnumMap LevelId Int
, sundo :: [CmdAtomic]
, sperFid :: PerFid
, sperValidFid :: PerValidFid
, sperCacheFid :: PerCacheFid
, sactorAspect :: ActorAspect
, sfovLucidLid :: FovLucidLid
, sfovClearLid :: FovClearLid
, sfovLitLid :: FovLitLid
, sarenas :: [LevelId]
, svalidArenas :: Bool
, srandom :: R.StdGen
, srngs :: RNGs
, squit :: Bool
, swriteSave :: Bool
, sdebugSer :: DebugModeSer
, sdebugNxt :: DebugModeSer
}
deriving (Show)
data DebugModeSer = DebugModeSer
{ sknowMap :: Bool
, sknowEvents :: Bool
, sknowItems :: Bool
, sniffIn :: Bool
, sniffOut :: Bool
, sallClear :: Bool
, sboostRandomItem :: Bool
, sgameMode :: Maybe (GroupName ModeKind)
, sautomateAll :: Bool
, skeepAutomated :: Bool
, sdungeonRng :: Maybe R.StdGen
, smainRng :: Maybe R.StdGen
, snewGameSer :: Bool
, scurChalSer :: Challenge
, sdumpInitRngs :: Bool
, ssavePrefixSer :: String
, sdbgMsgSer :: Bool
, sdebugCli :: DebugModeCli
}
deriving Show
data RNGs = RNGs
{ dungeonRandomGenerator :: Maybe R.StdGen
, startingRandomGenerator :: Maybe R.StdGen
}
instance Show RNGs where
show RNGs{..} =
let args = [ maybe "" (\gen -> "--setDungeonRng \"" ++ show gen ++ "\"")
dungeonRandomGenerator
, maybe "" (\gen -> "--setMainRng \"" ++ show gen ++ "\"")
startingRandomGenerator ]
in unwords args
type ActorTime =
EM.EnumMap FactionId (EM.EnumMap LevelId (EM.EnumMap ActorId Time))
updateActorTime :: FactionId -> LevelId -> ActorId -> Time -> ActorTime
-> ActorTime
updateActorTime !fid !lid !aid !time =
EM.adjust (EM.adjust (EM.insert aid time) lid) fid
ageActor :: FactionId -> LevelId -> ActorId -> Delta Time -> ActorTime
-> ActorTime
ageActor !fid !lid !aid !delta =
EM.adjust (EM.adjust (EM.adjust (`timeShift` delta) aid) lid) fid
emptyStateServer :: StateServer
emptyStateServer =
StateServer
{ sactorTime = EM.empty
, sdiscoKind = EM.empty
, sdiscoKindRev = EM.empty
, suniqueSet = ES.empty
, sdiscoAspect = EM.empty
, sitemSeedD = EM.empty
, sitemRev = HM.empty
, sflavour = emptyFlavourMap
, sacounter = toEnum 0
, sicounter = toEnum 0
, snumSpawned = EM.empty
, sundo = []
, sperFid = EM.empty
, sperValidFid = EM.empty
, sperCacheFid = EM.empty
, sactorAspect = EM.empty
, sfovLucidLid = EM.empty
, sfovClearLid = EM.empty
, sfovLitLid = EM.empty
, sarenas = []
, svalidArenas = False
, srandom = R.mkStdGen 42
, srngs = RNGs { dungeonRandomGenerator = Nothing
, startingRandomGenerator = Nothing }
, squit = False
, swriteSave = False
, sdebugSer = defDebugModeSer
, sdebugNxt = defDebugModeSer
}
defDebugModeSer :: DebugModeSer
defDebugModeSer = DebugModeSer { sknowMap = False
, sknowEvents = False
, sknowItems = False
, sniffIn = False
, sniffOut = False
, sallClear = False
, sboostRandomItem = False
, sgameMode = Nothing
, sautomateAll = False
, skeepAutomated = False
, sdungeonRng = Nothing
, smainRng = Nothing
, snewGameSer = False
, scurChalSer = defaultChallenge
#ifdef USE_BROWSER
, sdumpInitRngs = True
#else
, sdumpInitRngs = False
#endif
, ssavePrefixSer = ""
, sdbgMsgSer = False
, sdebugCli = defDebugModeCli
}
instance Binary StateServer where
put StateServer{..} = do
put sactorTime
put sdiscoKind
put sdiscoKindRev
put suniqueSet
put sdiscoAspect
put sitemSeedD
put sitemRev
put sflavour
put sacounter
put sicounter
put snumSpawned
put sundo
put (show srandom)
put srngs
put sdebugSer
get = do
sactorTime <- get
sdiscoKind <- get
sdiscoKindRev <- get
suniqueSet <- get
sdiscoAspect <- get
sitemSeedD <- get
sitemRev <- get
sflavour <- get
sacounter <- get
sicounter <- get
snumSpawned <- get
sundo <- get
g <- get
srngs <- get
sdebugSer <- get
let srandom = read g
sperFid = EM.empty
sperValidFid = EM.empty
sperCacheFid = EM.empty
sactorAspect = EM.empty
sfovLucidLid = EM.empty
sfovClearLid = EM.empty
sfovLitLid = EM.empty
sarenas = []
svalidArenas = False
squit = False
swriteSave = False
sdebugNxt = defDebugModeSer
return $! StateServer{..}
instance Binary DebugModeSer where
put DebugModeSer{..} = do
put sknowMap
put sknowEvents
put sknowItems
put sniffIn
put sniffOut
put sallClear
put sboostRandomItem
put sgameMode
put sautomateAll
put skeepAutomated
put scurChalSer
put ssavePrefixSer
put sdbgMsgSer
put sdebugCli
get = do
sknowMap <- get
sknowEvents <- get
sknowItems <- get
sniffIn <- get
sniffOut <- get
sallClear <- get
sboostRandomItem <- get
sgameMode <- get
sautomateAll <- get
skeepAutomated <- get
scurChalSer <- get
ssavePrefixSer <- get
sdbgMsgSer <- get
sdebugCli <- get
let sdungeonRng = Nothing
smainRng = Nothing
snewGameSer = False
sdumpInitRngs = False
return $! DebugModeSer{..}
instance Binary RNGs where
put RNGs{..} = do
put (show dungeonRandomGenerator)
put (show startingRandomGenerator)
get = do
dg <- get
sg <- get
let dungeonRandomGenerator = read dg
startingRandomGenerator = read sg
return $! RNGs{..}