module Language.Nomyx.Players (
PlayerNumber,
PlayerName,
PlayerInfo(..),
Player(..),
playerNumber, playerName,
getPlayers, getPlayer, getPlayerName,
setPlayerName,
modifyPlayerName,
getPlayersNumber, getAllPlayerNumbers,
delPlayer,
forEachPlayer, forEachPlayer_,
createValueForEachPlayer, createValueForEachPlayer_,
getValueOfPlayer,
modifyValueOfPlayer, modifyAllValues,
showPlayer,
getProposerNumber, getProposerNumber_,
setVictory,
giveVictory
) where
import Language.Nomyx.Expression
import Language.Nomyx.Events
import Language.Nomyx.Variables
import Language.Nomyx.Rules
import Data.Typeable
import Data.List
import Data.Lens
import Control.Applicative
import Control.Arrow
import Control.Monad
getPlayers :: NomexNE [PlayerInfo]
getPlayers = GetPlayers
getPlayer :: PlayerNumber -> NomexNE (Maybe PlayerInfo)
getPlayer pn = do
pls <- GetPlayers
return $ find ((== pn) . getL playerNumber) pls
getPlayerName :: PlayerNumber -> NomexNE (Maybe PlayerName)
getPlayerName pn = do
p <- getPlayer pn
return $ _playerName <$> p
setPlayerName :: PlayerNumber -> PlayerName -> Nomex Bool
setPlayerName = SetPlayerName
modifyPlayerName :: PlayerNumber -> (PlayerName -> PlayerName) -> Nomex Bool
modifyPlayerName pn f = do
mn <- liftEffect $ getPlayerName pn
case mn of
Just name -> setPlayerName pn (f name)
Nothing -> return False
getPlayersNumber :: NomexNE Int
getPlayersNumber = length <$> getPlayers
getAllPlayerNumbers :: NomexNE [PlayerNumber]
getAllPlayerNumbers = map _playerNumber <$> getPlayers
delPlayer :: PlayerNumber -> Nomex Bool
delPlayer = DelPlayer
forEachPlayer :: (PlayerNumber -> Nomex ()) -> (PlayerNumber -> Nomex ()) -> (PlayerNumber -> Nomex ()) -> Nomex (EventNumber, EventNumber)
forEachPlayer action actionWhenArrive actionWhenLeave = do
pns <- liftEffect getAllPlayerNumbers
mapM_ action pns
an <- onEvent_ (Player Arrive) $ \(PlayerData p) -> actionWhenArrive $ _playerNumber p
ln <- onEvent_ (Player Leave) $ \(PlayerData p) -> actionWhenLeave $ _playerNumber p
return (an, ln)
forEachPlayer_ :: (PlayerNumber -> Nomex ()) -> Nomex (EventNumber, EventNumber)
forEachPlayer_ action = forEachPlayer action action (\_ -> return ())
createValueForEachPlayer :: forall a. (Typeable a, Show a, Eq a) => a -> MsgVar [(PlayerNumber, a)] -> Nomex (EventNumber, EventNumber)
createValueForEachPlayer initialValue mv = do
pns <- liftEffect getAllPlayerNumbers
v <- newMsgVar_ (getMsgVarName mv) $ map (,initialValue::a) pns
forEachPlayer (const $ return ())
(\p -> void $ modifyMsgVar v ((p, initialValue) : ))
(\p -> void $ modifyMsgVar v $ filter $ (/= p) . fst)
createValueForEachPlayer_ :: MsgVar [(PlayerNumber, Int)] -> Nomex (EventNumber, EventNumber)
createValueForEachPlayer_ = createValueForEachPlayer 0
getValueOfPlayer :: forall a. (Typeable a, Show a, Eq a) => PlayerNumber -> MsgVar [(PlayerNumber, a)] -> NomexNE (Maybe a)
getValueOfPlayer pn var = do
mvalue <- readMsgVar var
return $ do
value <- mvalue
lookup pn value
modifyValueOfPlayer :: (Eq a, Show a, Typeable a) => PlayerNumber -> MsgVar [(PlayerNumber, a)] -> (a -> a) -> Nomex Bool
modifyValueOfPlayer pn var f = modifyMsgVar var $ map (\(a,b) -> if a == pn then (a, f b) else (a,b))
modifyAllValues :: (Eq a, Show a, Typeable a) => MsgVar [(PlayerNumber, a)] -> (a -> a) -> Nomex ()
modifyAllValues var f = void $ modifyMsgVar var $ map $ second f
showPlayer :: PlayerNumber -> NomexNE String
showPlayer pn = do
mn <- getPlayerName pn
case mn of
Just name -> return name
Nothing -> return ("Player " ++ show pn)
setVictory :: NomexNE [PlayerNumber] -> Nomex ()
setVictory = SetVictory
giveVictory :: PlayerNumber -> Nomex ()
giveVictory pn = SetVictory $ return [pn]
getProposerNumber :: NomexNE PlayerNumber
getProposerNumber = _rProposedBy <$> getSelfRule
getProposerNumber_ :: Nomex PlayerNumber
getProposerNumber_ = liftEffect getProposerNumber