From d02c06addc8c301632b7fa3c0493e0415722b50e Mon Sep 17 00:00:00 2001 From: Jesse McDonald Date: Wed, 2 Apr 2014 19:40:07 -0500 Subject: [PATCH] add end-of-game scoring, including Lord of Waterdeep card bonuses --- src/Waterdeep/Logic.hs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/Waterdeep/Logic.hs b/src/Waterdeep/Logic.hs index fdbfdfa..44386d8 100644 --- a/src/Waterdeep/Logic.hs +++ b/src/Waterdeep/Logic.hs @@ -110,6 +110,7 @@ waterdeepGame = do beginRound round performAction 1 $ TakeResource [Cleric, Fighter, Rogue, Wizard, Gold] performAction 2 $ ChooseQuest + scoreFinalPoints notifyState determineWinners @@ -170,6 +171,23 @@ performAction p a = case a of return True _ -> 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 = do -- TODO: Implement tie-breaker(s)