aboutsummaryrefslogtreecommitdiff
path: root/server
diff options
context:
space:
mode:
Diffstat (limited to 'server')
-rw-r--r--server/lib/Cafp/Game.hs31
-rw-r--r--server/lib/Cafp/Messages.hs3
2 files changed, 22 insertions, 12 deletions
diff --git a/server/lib/Cafp/Game.hs b/server/lib/Cafp/Game.hs
index 16350ab..8475a90 100644
--- a/server/lib/Cafp/Game.hs
+++ b/server/lib/Cafp/Game.hs
@@ -21,7 +21,7 @@ module Cafp.Game
import Cafp.Messages
import Control.Lens (Lens', at, ix, over, to, traverseOf,
(%%=), (%=), (%~), (&), (.~), (^.),
- (^..), (^?), _1, _2, (.=))
+ (^..), (^?), _1, _2, (.=), _3)
import Control.Lens.TH (makeLenses, makePrisms)
import Control.Monad (guard, replicateM, (>=>))
import Control.Monad.State (State, state, execState, runState)
@@ -44,7 +44,6 @@ data Table
!(HMS.HashMap PlayerId Proposal)
| TableVoting
!BlackCard
- !(HMS.HashMap PlayerId Proposal)
!(V.Vector (Proposal, [PlayerId]))
!(HMS.HashMap PlayerId Int)
deriving (Show)
@@ -127,9 +126,9 @@ stepGame game = case game ^. gameTable of
(shuffled, seed) = shuffle
(V.fromList $ HMS.toList proposalsMap) (game ^. gameSeed) in
game & gameSeed .~ seed
- & gameTable .~ TableVoting black proposals shuffled HMS.empty
+ & gameTable .~ TableVoting black shuffled HMS.empty
| otherwise -> game
- TableVoting _ _ _ _ -> game
+ TableVoting _ _ _ -> game
processClientMessage :: PlayerId -> ClientMessage -> Game -> Game
processClientMessage pid msg game = case msg of
@@ -146,6 +145,19 @@ processClientMessage pid msg game = case msg of
-- All good.
| otherwise -> stepGame $
game & gameTable . _TableProposing . _2 . at pid .~ Just cs
+
+ SubmitVote i -> case game ^. gameTable of
+ TableProposing _ _ -> game
+ TableVoting _ shuffled votes
+ -- Vote out of bounds.
+ | i < 0 || i >= V.length shuffled -> game
+ -- Already voted.
+ | pid `HMS.member` votes -> game
+ -- Can't vote for self.
+ | pid `elem` snd (shuffled V.! i) -> game
+ -- Ok vote.
+ | otherwise -> stepGame $ game
+ & gameTable . _TableVoting . _3 . at pid .~ Just i
where
hand = game ^.. gamePlayers . ix pid . playerHand . traverse
@@ -156,20 +168,17 @@ gameViewForPlayer self game =
guard $ pid /= self
pure $ Opponent (p ^. playerName) $ case game ^. gameTable of
TableProposing _ proposals -> HMS.member pid proposals
- TableVoting _ _ _ votes -> HMS.member pid votes
+ TableVoting _ _ votes -> HMS.member pid votes
player = game ^. gamePlayers . at self
table = case game ^. gameTable of
TableProposing black proposals ->
Proposing black . fromMaybe [] $ HMS.lookup self proposals
- TableVoting black proposals shuffled votes -> Voting
+ TableVoting black shuffled votes -> Voting
black
- (fromMaybe [] $ HMS.lookup self proposals)
- [ proposal
- | (proposal, players) <- V.toList shuffled
- , not $ self `elem` players
- ]
+ (fst <$> V.toList shuffled)
+ (fromMaybe 0 $ V.findIndex ((self `elem`) . snd) shuffled)
(HMS.lookup self votes) in
GameView
{ gameViewOpponents = opponents
diff --git a/server/lib/Cafp/Messages.hs b/server/lib/Cafp/Messages.hs
index ea6361c..df447c3 100644
--- a/server/lib/Cafp/Messages.hs
+++ b/server/lib/Cafp/Messages.hs
@@ -39,8 +39,8 @@ data TableView
= Proposing BlackCard [WhiteCard]
| Voting
BlackCard
- [WhiteCard] -- ^ My proposal
[[WhiteCard]] -- ^ Proposals to vote for
+ Int -- ^ My proposal
(Maybe Int) -- ^ My vote
deriving (Show)
@@ -61,6 +61,7 @@ data ServerMessage
data ClientMessage
= ChangeMyName Text
| ProposeWhiteCards [WhiteCard]
+ | SubmitVote Int
deriving (Show)
deriveBoth defaultOptions ''BlackCard