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)