Skip to content
This repository has been archived by the owner on May 20, 2024. It is now read-only.

Commit

Permalink
(#11) added getPendingVoters and getPlayerVote to Game
Browse files Browse the repository at this point in the history
  • Loading branch information
hjwylde committed Jan 30, 2016
1 parent d1a4e1b commit cff7527
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 14 deletions.
4 changes: 2 additions & 2 deletions src/Game/Werewolf/Command.hs
Expand Up @@ -32,8 +32,8 @@ import qualified Data.Map as Map
import Data.Text (Text)

import Game.Werewolf.Engine
import Game.Werewolf.Game hiding (isGameOver, isSeersTurn, isVillagesTurn, isWerewolvesTurn,
killPlayer)
import Game.Werewolf.Game hiding (getPendingVoters, getPlayerVote, isGameOver, isSeersTurn,
isVillagesTurn, isWerewolvesTurn, killPlayer)
import Game.Werewolf.Player hiding (doesPlayerExist)
import Game.Werewolf.Response

Expand Down
12 changes: 4 additions & 8 deletions src/Game/Werewolf/Engine.hs
Expand Up @@ -52,8 +52,8 @@ import qualified Data.Map as Map
import Data.Text (Text)
import qualified Data.Text as T

import Game.Werewolf.Game hiding (isGameOver, isSeersTurn, isVillagesTurn,
isWerewolvesTurn, killPlayer)
import Game.Werewolf.Game hiding (getPendingVoters, getPlayerVote, isGameOver,
isSeersTurn, isVillagesTurn, isWerewolvesTurn, killPlayer)
import qualified Game.Werewolf.Game as Game
import Game.Werewolf.Player hiding (doesPlayerExist)
import qualified Game.Werewolf.Player as Player
Expand Down Expand Up @@ -174,14 +174,10 @@ isGameOver :: MonadState Game m => m Bool
isGameOver = gets Game.isGameOver

getPlayerVote :: MonadState Game m => Text -> m (Maybe Text)
getPlayerVote playerName = use $ votes . at playerName
getPlayerVote playerName = gets $ Game.getPlayerVote playerName

getPendingVoters :: MonadState Game m => m [Player]
getPendingVoters = do
votes' <- use votes
alivePlayers <- uses players filterAlive

return $ filter (flip Map.notMember votes' . _name) alivePlayers
getPendingVoters = gets Game.getPendingVoters

defaultFilePath :: MonadIO m => m FilePath
defaultFilePath = (</> defaultFileName) <$> liftIO getHomeDirectory
Expand Down
14 changes: 12 additions & 2 deletions src/Game/Werewolf/Game.hs
Expand Up @@ -20,7 +20,8 @@ module Game.Werewolf.Game (
killPlayer,

-- ** Queries
isGameOver, isSeersTurn, isSunset, isVillagesTurn, isWerewolvesTurn,
isGameOver, isSeersTurn, isSunset, isVillagesTurn, isWerewolvesTurn, getPlayerVote,
getPendingVoters,

-- * Stage
Stage(..),
Expand All @@ -34,7 +35,7 @@ import qualified Data.Map as Map
import Data.Text (Text)

import Game.Werewolf.Player
import Game.Werewolf.Role hiding (Villagers, Werewolves)
import Game.Werewolf.Role hiding (Villagers, Werewolves, _name)

data Game = Game
{ _stage :: Stage
Expand Down Expand Up @@ -74,6 +75,15 @@ isVillagesTurn game = game ^. stage == VillagesTurn
isWerewolvesTurn :: Game -> Bool
isWerewolvesTurn game = game ^. stage == WerewolvesTurn

getPlayerVote :: Text -> Game -> Maybe Text
getPlayerVote playerName game = game ^. votes . at playerName

getPendingVoters :: Game -> [Player]
getPendingVoters game = filter (flip Map.notMember votes' . _name) alivePlayers
where
votes' = game ^. votes
alivePlayers = filterAlive $ game ^. players

stageCycle :: [Stage]
stageCycle = cycle [Sunset, SeersTurn, WerewolvesTurn, Sunrise, VillagesTurn]

Expand Down
4 changes: 2 additions & 2 deletions test/src/Game/Werewolf/Test/Arbitrary.hs
Expand Up @@ -52,7 +52,7 @@ arbitraryCommand game = case game ^. stage of

arbitraryDevourVoteCommand :: Game -> Gen Command
arbitraryDevourVoteCommand game = do
let applicableCallers = filter (flip Map.notMember (game ^. votes) . _name) (filterAlive . filterWerewolves $ game ^. players)
let applicableCallers = filterWerewolves $ getPendingVoters game
target <- suchThat (arbitraryPlayer game) $ not . isWerewolf

if null applicableCallers
Expand All @@ -61,7 +61,7 @@ arbitraryDevourVoteCommand game = do

arbitraryLynchVoteCommand :: Game -> Gen Command
arbitraryLynchVoteCommand game = do
let applicableCallers = filter (flip Map.notMember (game ^. votes) . _name) (filterAlive $ game ^. players)
let applicableCallers = getPendingVoters game
target <- arbitraryPlayer game

if null applicableCallers
Expand Down

0 comments on commit cff7527

Please sign in to comment.