module Game.Werewolf.Game (
Game(..), turn, players, sees, votes,
newGame,
killPlayer,
isSeersTurn, isVillagersTurn, isWerewolvesTurn, isGameOver,
Turn(..),
turnRotation, turnAvailable,
) where
import Control.Lens
import Data.Map (Map)
import qualified Data.Map as Map
import Data.Text (Text)
import Game.Werewolf.Player
import Game.Werewolf.Role hiding (Villagers, Werewolves)
data Game = Game
{ _turn :: Turn
, _players :: [Player]
, _sees :: Map Text Text
, _votes :: Map Text Text
} deriving (Eq, Read, Show)
data Turn = Seers | Villagers | Werewolves | NoOne
deriving (Eq, Read, Show)
makeLenses ''Game
makeLenses ''Turn
newGame :: [Player] -> Game
newGame players = Game (head $ filter (turnAvailable aliveRoles) turnRotation) players Map.empty Map.empty
where
aliveRoles = map _role $ filterAlive players
killPlayer :: Game -> Player -> Game
killPlayer game player = game & players %~ map (\player' -> if player' == player then player' & state .~ Dead else player')
isSeersTurn :: Game -> Bool
isSeersTurn game = game ^. turn == Seers
isVillagersTurn :: Game -> Bool
isVillagersTurn game = game ^. turn == Villagers
isWerewolvesTurn :: Game -> Bool
isWerewolvesTurn game = game ^. turn == Werewolves
isGameOver :: Game -> Bool
isGameOver game = game ^. turn == NoOne
turnRotation :: [Turn]
turnRotation = cycle [Seers, Werewolves, Villagers, NoOne]
turnAvailable :: [Role] -> Turn -> Bool
turnAvailable aliveRoles Seers = seerRole `elem` aliveRoles
turnAvailable _ Villagers = True
turnAvailable _ Werewolves = True
turnAvailable _ NoOne = False