module Game.Werewolf.Game (
Game(..), turn, players,
newGame,
killPlayer,
isSeersTurn, isVillagersTurn, isWerewolvesTurn, isGameOver,
Turn(..), sees, votes,
turnRotation,
) where
import Control.Lens
import Data.Map (Map)
import qualified Data.Map as Map
import Data.Text (Text)
import Game.Werewolf.Player
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 turnRotation) players Map.empty Map.empty
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]