{-# LANGUAGE GADTs #-} {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE NamedFieldPuns #-} {-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE StandaloneDeriving #-} -- | This module implements game engine (for the nomyx language, see Language.Nomyx) module Nomyx.Core.Engine.Game where import Prelude hiding (log) import Language.Nomyx.Expression import Data.Lens.Template import Data.Time import Data.Typeable import Data.Data -- * Game type GameName = String -- | The state of the game: data Game = Game { _gameName :: GameName, _gameDesc :: GameDesc, _rules :: [RuleInfo], _players :: [PlayerInfo], _variables :: [Var], _events :: [EventInfo], _outputs :: [Output], _victory :: Maybe VictoryCond, _logs :: [Log], _currentTime :: UTCTime} deriving (Typeable) data GameDesc = GameDesc { _desc :: String, _agora :: String} deriving (Eq, Show, Read, Ord) instance Eq Game where (Game {_gameName=gn1}) == (Game {_gameName=gn2}) = gn1 == gn2 instance Ord Game where compare (Game {_gameName=gn1}) (Game {_gameName=gn2}) = compare gn1 gn2 emptyGame name desc date = Game { _gameName = name, _gameDesc = desc, _rules = [], _players = [], _variables = [], _events = [], _outputs = [], _victory = Nothing, _logs = [], _currentTime = date} -- * Variables -- | stores the variable's data data Var = forall a . (Typeable a, Show a) => Var { _vRuleNumber :: RuleNumber, _vName :: String, vData :: a} instance Show Var where show (Var a b c) = "Rule number = " ++ (show a) ++ ", Name = " ++ (show b) ++ ", Value = " ++ (show c) ++ "\n" -- * Events type EventHandler e = (EventNumber, e) -> Nomex () data EventInfo = forall e. (Typeable e, Show e) => EventInfo {_eventNumber :: EventNumber, _ruleNumber :: RuleNumber, event :: Event e, handler :: EventHandler e, _evStatus :: Status, _env :: [EventEnv]} data EventEnv = forall e. (Typeable e, Show e) => EventEnv (Field e) e deriving instance Show EventEnv data Status = SActive | SDeleted deriving (Eq, Show) instance Eq EventInfo where (EventInfo {_eventNumber=e1}) == (EventInfo {_eventNumber=e2}) = e1 == e2 instance Ord EventInfo where (EventInfo {_eventNumber=e1}) <= (EventInfo {_eventNumber=e2}) = e1 <= e2 -- * Outputs data Output = Output { _outputNumber :: OutputNumber, -- number of the output _oRuleNumber :: RuleNumber, -- rule that triggered the output _oPlayerNumber :: (Maybe PlayerNumber), -- player to display the output to (Nothing means display to all players) _output :: NomexNE String, -- output string _oStatus :: Status} -- status of the output deriving (Show) -- * Logs data Log = Log { _lPlayerNumber :: Maybe PlayerNumber, _lTime :: UTCTime, _lMsg :: String} deriving (Show) -- * Rules data SubmitRule = SubmitRule RuleName RuleDesc RuleCode deriving (Show, Read, Eq, Ord, Data, Typeable) $( makeLenses [''Game, ''GameDesc, ''EventInfo, ''Var, ''Output] )