werewolf-0.2.0.0: src/Game/Werewolf/Game.hs
{-|
Module : Game.Werewolf.Game
Description : Game and turn data structures.
Copyright : (c) Henry J. Wylde, 2015
License : BSD3
Maintainer : public@hjwylde.com
Game and turn data structures.
-}
{-# LANGUAGE TemplateHaskell #-}
module Game.Werewolf.Game (
-- * Game
Game(..), turn, players,
newGame,
-- ** Manipulations
killPlayer,
-- ** Queries
isSeersTurn, isVillagersTurn, isWerewolvesTurn, isGameOver,
-- * Turn
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]