add end-of-game scoring, including Lord of Waterdeep card bonuses
This commit is contained in:
parent
b0d20dff3d
commit
d02c06addc
|
|
@ -110,6 +110,7 @@ waterdeepGame = do
|
||||||
beginRound round
|
beginRound round
|
||||||
performAction 1 $ TakeResource [Cleric, Fighter, Rogue, Wizard, Gold]
|
performAction 1 $ TakeResource [Cleric, Fighter, Rogue, Wizard, Gold]
|
||||||
performAction 2 $ ChooseQuest
|
performAction 2 $ ChooseQuest
|
||||||
|
scoreFinalPoints
|
||||||
notifyState
|
notifyState
|
||||||
determineWinners
|
determineWinners
|
||||||
|
|
||||||
|
|
@ -170,6 +171,23 @@ performAction p a = case a of
|
||||||
return True
|
return True
|
||||||
_ -> return False
|
_ -> return False
|
||||||
|
|
||||||
|
scoreFinalPoints :: Waterdeep ()
|
||||||
|
scoreFinalPoints = do
|
||||||
|
ps <- toListOf traverse <$> use gamePlayers
|
||||||
|
forM_ ps $ \p -> do
|
||||||
|
let rs = p ^. playerTavern . to M.toAscList
|
||||||
|
forM_ rs $ \(r, n) -> do
|
||||||
|
let pts = case r of { Gold -> n `div` 2; _ -> n; }
|
||||||
|
gamePlayer (p ^. playerNumber) . playerScore += pts
|
||||||
|
case p ^. playerLord . lordBonus of
|
||||||
|
QuestBonus types pts -> do
|
||||||
|
let (cqs, apqs, upqs) = (p ^. playerCompletedQuests, p ^. playerActivePlotQuests, p ^. playerUsedPlotQuests)
|
||||||
|
let matches = length $ filter ((`elem` types) . (view questType)) (cqs ++ apqs ++ upqs)
|
||||||
|
gamePlayer (p ^. playerNumber) . playerScore += matches * pts
|
||||||
|
BuildingBonus pts -> do
|
||||||
|
ownedBuildings <- length <$> filter ((== (p ^. playerNumber)) . (view buildingOwner)) <$> use gameAdvancedBuildings
|
||||||
|
gamePlayer (p ^. playerNumber) . playerScore += ownedBuildings * pts
|
||||||
|
|
||||||
determineWinners :: Waterdeep [PlayerID]
|
determineWinners :: Waterdeep [PlayerID]
|
||||||
determineWinners = do
|
determineWinners = do
|
||||||
-- TODO: Implement tie-breaker(s)
|
-- TODO: Implement tie-breaker(s)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue