aboutsummaryrefslogtreecommitdiff
path: root/server/lib/Cafp/Game.hs
diff options
context:
space:
mode:
authorJasper Van der Jeugt2020-08-06 12:49:31 +0200
committerJasper Van der Jeugt2020-08-06 12:49:31 +0200
commitf57f7ff6ca1441cfabb921bdf7267012bae3b172 (patch)
tree1052ddee60032bad99a109354c359c5d24c8d12b /server/lib/Cafp/Game.hs
parent8e6186f7db23642fae80f80357c921d7f9e316aa (diff)
Winner logs
Diffstat (limited to '')
-rw-r--r--server/lib/Cafp/Game.hs18
1 files changed, 17 insertions, 1 deletions
diff --git a/server/lib/Cafp/Game.hs b/server/lib/Cafp/Game.hs
index 96b24dc..2df1ee5 100644
--- a/server/lib/Cafp/Game.hs
+++ b/server/lib/Cafp/Game.hs
@@ -8,7 +8,7 @@ module Cafp.Game
, Table (..)
, Player (..)
, Game (..)
- , gameCards, gamePlayers, gameNextPlayerId
+ , gameLog, gameCards, gamePlayers, gameNextPlayerId
, newGame
, joinGame
@@ -70,6 +70,7 @@ data Player = Player
data Game = Game
{ _gameCards :: !Cards
, _gameSeed :: !StdGen
+ , _gameLog :: ![Text]
, _gameBlack :: ![BlackCard]
, _gameWhite :: ![WhiteCard]
, _gamePlayers :: !(HMS.HashMap PlayerId Player)
@@ -108,6 +109,7 @@ newGame cards gen = flip execState state0 $ do
state0 = Game
{ _gameCards = cards
, _gameSeed = gen
+ , _gameLog = []
, _gameBlack = []
, _gameWhite = []
, _gamePlayers = HMS.empty
@@ -191,6 +193,19 @@ tallyVotes game shuffled votes =
where
byScore = V.modify $ V.sortBy . comparing $ Down . votedScore
+-- | Create nice messages about the winners in the logs.
+votedMessages :: Cards -> BlackCard -> V.Vector VotedView -> [T.Text]
+votedMessages cards (BlackCard black) voteds = do
+ voted <- V.toList voteds
+ guard $ V.length (votedWinners voted) > 0
+ pure $
+ T.intercalate ", " (V.toList $ votedWinners voted) <> " won with " <>
+ cardsBlack cards V.! black <> " | " <>
+ T.intercalate " / "
+ [ cardsWhite cards V.! i
+ | WhiteCard i <- V.toList $ votedProposal voted
+ ]
+
stepGame :: Game -> Game
stepGame game = case game ^. gameTable of
TableProposing black proposals
@@ -218,6 +233,7 @@ stepGame game = case game ^. gameTable of
flip execState game $ do
for_ wins $ \win -> gamePlayers . ix win . playerPoints += 1
gameTable .= TableTally black voted
+ gameLog %= (votedMessages (game ^. gameCards) black voted ++)
| otherwise -> game
where
hasVoted pid _ = HMS.member pid votes ||