From dce2ecbab8db403080c9c81473f9642f566c6b7a Mon Sep 17 00:00:00 2001 From: Jesse McDonald Date: Tue, 13 May 2014 00:02:35 -0500 Subject: [PATCH] represent the cost of a quest with a MultiSet rather than an action --- src/Waterdeep/Actions.hs | 54 +++---- src/Waterdeep/Intrigues.hs | 27 +--- src/Waterdeep/Quests.hs | 298 ++++++++----------------------------- src/Waterdeep/Types.hs | 2 +- 4 files changed, 96 insertions(+), 285 deletions(-) diff --git a/src/Waterdeep/Actions.hs b/src/Waterdeep/Actions.hs index 90e3864..d236dee 100644 --- a/src/Waterdeep/Actions.hs +++ b/src/Waterdeep/Actions.hs @@ -173,7 +173,9 @@ completeQuest = do let choices = map (\(i,q) -> (q ^. questTitle, (i, q))) availQuests (i, quest) <- solicitChoice "Complete one quest:" $ nubOn fst choices activePlayerState . playerIncompleteQuests %= deleteAt i - quest ^. questCost + tavern <- use $ activePlayerState . playerTavern + guard $ ((quest ^. questCost) `MS.isSubsetOf` tavern) + activePlayerState . playerTavern %= (`MS.difference` (quest ^. questCost)) name <- use activePlayerName broadcast $ name ++ " completed the " ++ (quest ^. questTitle) ++ " quest." quest ^. questReward @@ -191,8 +193,10 @@ chooseAndCompleteQuest bonusAction = do case doQuest of True -> do incompleteQuests <- use (activePlayerState . playerIncompleteQuests) - guard . not . or $ map ((== Mandatory) . view questType) incompleteQuests - quest ^. questCost + guard . and $ map ((/= Mandatory) . view questType) incompleteQuests + tavern <- use $ activePlayerState . playerTavern + guard $ ((quest ^. questCost) `MS.isSubsetOf` tavern) + activePlayerState . playerTavern %= (`MS.difference` (quest ^. questCost)) name <- use $ activePlayerName broadcast $ name ++ " completed the " ++ (quest ^. questTitle) ++ " quest." quest ^. questReward @@ -295,10 +299,10 @@ playIntrigue = do return () returnAgent :: GameAction -returnAgent = return () -- TODO +returnAgent = fail "TODO - not implemented" returnAgentFromHarbor :: GameAction -returnAgentFromHarbor = return () -- TODO +returnAgentFromHarbor = fail "TODO - not implemented" assignAgentToBuilding :: Traversal' WaterdeepState BuildingState -> Waterdeep () assignAgentToBuilding bt = do @@ -322,37 +326,37 @@ assignAgentToHarbor t = do broadcast $ name ++ " assigned an agent to Waterdeep Harbor." playIntrigue +findAssignableBuildings :: WaterdeepState -> [(String, Waterdeep ())] +findAssignableBuildings w = execWriter $ do + forM_ (w ^. gameBuildings . to IM.keys) $ \i -> do + let t :: Traversal' WaterdeepState BuildingState + t = gameBuildings . intAt i . traverse + let b = fromJust $ firstOf t w + tell [(b ^. building . buildingTitle, assignAgentToBuilding t)] + let harbor = getFirst $ flip F.foldMap [1,2,3] $ \i -> First $ + let t :: Traversal' WaterdeepState [PlayerID] + t = gameWaterdeepHarbor . intAt i . traverse + agents = fromJust $ firstOf t w + in if null agents then Just (assignAgentToHarbor t) else Nothing + case harbor of + Just f -> tell [("Waterdeep Harbor", f)] + Nothing -> return () + assignAgent :: GameAction assignAgent = do agents <- use (activePlayerState . playerAgentsInPool) guard (agents > 0) - w <- get - let buildings = execWriter $ do - forM_ (w ^. gameBuildings . to IM.keys) $ \i -> do - let t :: Traversal' WaterdeepState BuildingState - t = gameBuildings . intAt i . traverse - when (anyOf (t . buildingAgents) null w) $ do - let title = fromJust $ firstOf (t.building.buildingTitle) w - tell [(title, assignAgentToBuilding t)] - let harbor = getFirst $ flip F.foldMap [1,2,3] $ \i -> First $ - let t :: Traversal' WaterdeepState [PlayerID] - t = gameWaterdeepHarbor . intAt i . traverse - in if (anyOf t null w) - then Just (assignAgentToHarbor t) - else Nothing - case harbor of - Just f -> tell [("Waterdeep Harbor", f)] - Nothing -> return () + buildings <- findAssignableBuildings <$> get join $ solicitChoice "Assign one agent to:" $ nubOn fst buildings assignAgentToBuildersHall :: GameAction -assignAgentToBuildersHall = return () -- TODO +assignAgentToBuildersHall = fail "TODO - not implemented" assignAgentToOpponentsSpace :: GameAction -assignAgentToOpponentsSpace = return () -- TODO +assignAgentToOpponentsSpace = fail "TODO - not implemented" useOpponentsSpace :: GameAction -useOpponentsSpace = return () -- TODO +useOpponentsSpace = fail "TODO - not implemented" gainLieutenant :: GameAction gainLieutenant = do diff --git a/src/Waterdeep/Intrigues.hs b/src/Waterdeep/Intrigues.hs index 41ab4e3..9f59fd6 100644 --- a/src/Waterdeep/Intrigues.hs +++ b/src/Waterdeep/Intrigues.hs @@ -26,9 +26,7 @@ defaultIntrigueDeck = concat $ map (uncurry replicate) $ Quest { _questType = Mandatory , _questTitle = "Repel Drow Invaders" , _questQuote = "" - , _questCost = do - returnResources 1 [Cleric] - returnResources 2 [Rogue] + , _questCost = MS.fromList [Cleric, Rogue, Rogue] , _questReward = scorePoints 2 , _questPlotActions = [] }) @@ -36,9 +34,7 @@ defaultIntrigueDeck = concat $ map (uncurry replicate) $ Quest { _questType = Mandatory , _questTitle = "Fend Off Bandits" , _questQuote = "" - , _questCost = do - returnResources 2 [Fighter] - returnResources 2 [Wizard] + , _questCost = MS.fromList [Fighter, Fighter, Wizard] , _questReward = scorePoints 2 , _questPlotActions = [] }) @@ -46,10 +42,7 @@ defaultIntrigueDeck = concat $ map (uncurry replicate) $ Quest { _questType = Mandatory , _questTitle = "Foil the Zhentarim" , _questQuote = "" - , _questCost = do - returnResources 1 [Fighter] - returnResources 1 [Rogue] - returnResources 1 [Wizard] + , _questCost = MS.fromList [Fighter, Rogue, Wizard] , _questReward = scorePoints 2 , _questPlotActions = [] }) @@ -57,10 +50,7 @@ defaultIntrigueDeck = concat $ map (uncurry replicate) $ Quest { _questType = Mandatory , _questTitle = "Stamp Out Cultists" , _questQuote = "" - , _questCost = do - returnResources 1 [Cleric] - returnResources 1 [Fighter] - returnResources 1 [Rogue] + , _questCost = MS.fromList [Cleric, Fighter, Rogue] , _questReward = scorePoints 2 , _questPlotActions = [] }) @@ -68,10 +58,7 @@ defaultIntrigueDeck = concat $ map (uncurry replicate) $ Quest { _questType = Mandatory , _questTitle = "Placate Angry Merchants" , _questQuote = "" - , _questCost = do - returnResources 1 [Cleric] - returnResources 1 [Fighter] - returnResources 1 [Wizard] + , _questCost = MS.fromList [Cleric, Fighter, Wizard] , _questReward = scorePoints 4 , _questPlotActions = [] }) @@ -79,9 +66,7 @@ defaultIntrigueDeck = concat $ map (uncurry replicate) $ Quest { _questType = Mandatory , _questTitle = "Quell Riots" , _questQuote = "" - , _questCost = do - returnResources 2 [Cleric] - returnResources 1 [Fighter] + , _questCost = MS.fromList [Cleric, Cleric, Fighter] , _questReward = scorePoints 4 , _questPlotActions = [] }) diff --git a/src/Waterdeep/Quests.hs b/src/Waterdeep/Quests.hs index 956996e..10d084a 100644 --- a/src/Waterdeep/Quests.hs +++ b/src/Waterdeep/Quests.hs @@ -24,10 +24,7 @@ defaultQuestDeck = [ Quest { _questType = Piety , _questTitle = "Recruit Paladins for Tyr" , _questQuote = "" - , _questCost = do - returnResources 2 [Cleric] - returnResources 4 [Fighter] - returnResources 4 [Gold] + , _questCost = MS.fromOccurList [(Cleric, 2), (Fighter, 4), (Gold, 4)] , _questReward = do scorePoints 10 takeResources 3 [Cleric] @@ -36,11 +33,7 @@ defaultQuestDeck = , Quest { _questType = Piety , _questTitle = "Defend the Tower of Luck" , _questQuote = "" - , _questCost = do - returnResources 2 [Cleric] - returnResources 1 [Fighter] - returnResources 1 [Rogue] - returnResources 1 [Wizard] + , _questCost = MS.fromOccurList [(Cleric, 2), (Fighter, 1), (Rogue, 1), (Wizard, 1)] , _questReward = do takeResources 1 [Cleric,Fighter,Rogue,Wizard] , _questPlotActions = @@ -49,10 +42,7 @@ defaultQuestDeck = , Quest { _questType = Piety , _questTitle = "Protect the House of Wonder" , _questQuote = "" - , _questCost = do - returnResources 2 [Cleric] - returnResources 1 [Fighter] - returnResources 2 [Gold] + , _questCost = MS.fromOccurList [(Cleric, 2), (Fighter, 1), (Gold, 2)] , _questReward = do scorePoints 8 , _questPlotActions = @@ -61,9 +51,7 @@ defaultQuestDeck = , Quest { _questType = Piety , _questTitle = "Produce a Miracle for the Masses" , _questQuote = "" - , _questCost = do - returnResources 2 [Cleric] - returnResources 4 [Gold] + , _questCost = MS.fromOccurList [(Cleric, 2), (Gold, 4)] , _questReward = do scorePoints 5 , _questPlotActions = @@ -75,9 +63,7 @@ defaultQuestDeck = , Quest { _questType = Piety , _questTitle = "Convert a Noble to Lathander" , _questQuote = "" - , _questCost = do - returnResources 2 [Cleric] - returnResources 1 [Fighter] + , _questCost = MS.fromOccurList [(Cleric, 2), (Fighter, 1)] , _questReward = do scorePoints 8 chooseQuest @@ -86,10 +72,7 @@ defaultQuestDeck = , Quest { _questType = Piety , _questTitle = "Heal Fallen Gray Hand Soldiers" , _questQuote = "" - , _questCost = do - returnResources 2 [Cleric] - returnResources 1 [Wizard] - returnResources 4 [Gold] + , _questCost = MS.fromOccurList [(Cleric, 2), (Wizard, 1), (Gold, 4)] , _questReward = do scorePoints 6 takeResources 6 [Fighter] @@ -98,9 +81,7 @@ defaultQuestDeck = , Quest { _questType = Piety , _questTitle = "Create a Shrine to Oghma" , _questQuote = "" - , _questCost = do - returnResources 5 [Cleric] - returnResources 2 [Gold] + , _questCost = MS.fromOccurList [(Cleric, 5), (Gold, 2)] , _questReward = do scorePoints 25 , _questPlotActions = [] @@ -108,10 +89,7 @@ defaultQuestDeck = , Quest { _questType = Piety , _questTitle = "Seal Gate to Cyric's Realm" , _questQuote = "" - , _questCost = do - returnResources 2 [Cleric] - returnResources 3 [Rogue] - returnResources 4 [Gold] + , _questCost = MS.fromOccurList [(Cleric, 2), (Rogue, 3), (Gold, 4)] , _questReward = do scorePoints 20 , _questPlotActions = [] @@ -119,10 +97,7 @@ defaultQuestDeck = , Quest { _questType = Piety , _questTitle = "Perform the Penance of Duty" , _questQuote = "" - , _questCost = do - returnResources 2 [Cleric] - returnResources 2 [Fighter] - returnResources 4 [Gold] + , _questCost = MS.fromOccurList [(Cleric, 2), (Fighter, 2), (Gold, 4)] , _questReward = do scorePoints 12 takeResources 1 [Cleric] @@ -132,9 +107,7 @@ defaultQuestDeck = , Quest { _questType = Piety , _questTitle = "Form an Alliance with the Rashemi" , _questQuote = "" - , _questCost = do - returnResources 2 [Cleric] - returnResources 1 [Wizard] + , _questCost = MS.fromOccurList [(Cleric, 2), (Wizard, 1)] , _questReward = do scorePoints 10 chooseQuest @@ -143,10 +116,7 @@ defaultQuestDeck = , Quest { _questType = Piety , _questTitle = "Eliminate Vampire Coven" , _questQuote = "" - , _questCost = do - returnResources 2 [Cleric] - returnResources 2 [Fighter] - returnResources 1 [Rogue] + , _questCost = MS.fromOccurList [(Cleric, 2), (Fighter, 2), (Rogue, 1)] , _questReward = do scorePoints 11 takeResources 4 [Gold] @@ -155,10 +125,7 @@ defaultQuestDeck = , Quest { _questType = Piety , _questTitle = "Discover Hidden Temple of Lolth" , _questQuote = "" - , _questCost = do - returnResources 2 [Cleric] - returnResources 1 [Fighter] - returnResources 1 [Rogue] + , _questCost = MS.fromOccurList [(Cleric, 2), (Fighter, 1), (Rogue, 1)] , _questReward = do scorePoints 10 chooseQuest @@ -167,11 +134,7 @@ defaultQuestDeck = , Quest { _questType = Warfare , _questTitle = "Deliver Weapons to Selûne's Temple" , _questQuote = "" - , _questCost = do - returnResources 4 [Fighter] - returnResources 1 [Rogue] - returnResources 1 [Wizard] - returnResources 2 [Gold] + , _questCost = MS.fromOccurList [(Fighter, 4), (Rogue, 1), (Wizard, 1), (Gold, 2)] , _questReward = do scorePoints 9 takeResources 2 [Cleric] @@ -180,9 +143,7 @@ defaultQuestDeck = , Quest { _questType = Warfare , _questTitle = "Raid Orc Stronghold" , _questQuote = "" - , _questCost = do - returnResources 4 [Fighter] - returnResources 2 [Rogue] + , _questCost = MS.fromOccurList [(Fighter, 4), (Rogue, 2)] , _questReward = do scorePoints 8 takeResources 4 [Gold] @@ -191,9 +152,7 @@ defaultQuestDeck = , Quest { _questType = Warfare , _questTitle = "Bolster City Guard" , _questQuote = "" - , _questCost = do - returnResources 9 [Fighter] - returnResources 2 [Rogue] + , _questCost = MS.fromOccurList [(Fighter, 9), (Rogue, 2)] , _questReward = do scorePoints 25 , _questPlotActions = [] @@ -201,11 +160,7 @@ defaultQuestDeck = , Quest { _questType = Warfare , _questTitle = "Recruit Lieutenant" , _questQuote = "" - , _questCost = do - returnResources 1 [Cleric] - returnResources 5 [Fighter] - returnResources 1 [Rogue] - returnResources 1 [Wizard] + , _questCost = MS.fromOccurList [(Cleric, 1), (Fighter, 5), (Rogue, 1), (Wizard, 1)] , _questReward = do noAction , _questPlotActions = @@ -214,9 +169,7 @@ defaultQuestDeck = , Quest { _questType = Warfare , _questTitle = "Train Bladesingers" , _questQuote = "" - , _questCost = do - returnResources 3 [Fighter] - returnResources 1 [Wizard] + , _questCost = MS.fromOccurList [(Fighter, 3), (Wizard, 1)] , _questReward = do scorePoints 4 takeResources 1 [Fighter] @@ -226,10 +179,7 @@ defaultQuestDeck = , Quest { _questType = Warfare , _questTitle = "Repel Seawraiths" , _questQuote = "" - , _questCost = do - returnResources 1 [Cleric] - returnResources 4 [Fighter] - returnResources 1 [Wizard] + , _questCost = MS.fromOccurList [(Cleric, 1), (Fighter, 4), (Wizard, 1)] , _questReward = do scorePoints 15 takeResources 2 [Gold] @@ -238,9 +188,7 @@ defaultQuestDeck = , Quest { _questType = Warfare , _questTitle = "Bolster Griffon Cavalry" , _questQuote = "" - , _questCost = do - returnResources 4 [Fighter] - returnResources 4 [Gold] + , _questCost = MS.fromOccurList [(Fighter, 4), (Gold, 4)] , _questReward = do scorePoints 6 , _questPlotActions = @@ -250,10 +198,7 @@ defaultQuestDeck = , Quest { _questType = Warfare , _questTitle = "Deliver an Ultimatum" , _questQuote = "" - , _questCost = do - returnResources 4 [Fighter] - returnResources 1 [Rogue] - returnResources 1 [Wizard] + , _questCost = MS.fromOccurList [(Fighter, 4), (Rogue, 1), (Wizard, 1)] , _questReward = do scorePoints 11 takeResources 4 [Gold] @@ -262,10 +207,7 @@ defaultQuestDeck = , Quest { _questType = Warfare , _questTitle = "Ambush Artor Morlin" , _questQuote = "" - , _questCost = do - returnResources 1 [Cleric] - returnResources 3 [Fighter] - returnResources 1 [Rogue] + , _questCost = MS.fromOccurList [(Cleric, 1), (Fighter, 3), (Rogue, 1)] , _questReward = do scorePoints 8 takeResources 4 [Gold] @@ -274,9 +216,7 @@ defaultQuestDeck = , Quest { _questType = Warfare , _questTitle = "Quell Mercenary Uprising" , _questQuote = "" - , _questCost = do - returnResources 1 [Cleric] - returnResources 4 [Fighter] + , _questCost = MS.fromOccurList [(Cleric, 1), (Fighter, 4)] , _questReward = do scorePoints 8 takeResources 4 [Gold] @@ -286,11 +226,7 @@ defaultQuestDeck = , Quest { _questType = Warfare , _questTitle = "Confront the Xanathar" , _questQuote = "" - , _questCost = do - returnResources 1 [Cleric] - returnResources 4 [Fighter] - returnResources 2 [Rogue] - returnResources 1 [Wizard] + , _questCost = MS.fromOccurList [(Cleric, 1), (Fighter, 4), (Rogue, 2), (Wizard, 1)] , _questReward = do scorePoints 20 takeResources 2 [Gold] @@ -299,11 +235,7 @@ defaultQuestDeck = , Quest { _questType = Warfare , _questTitle = "Defeat Uprising from Undermountain" , _questQuote = "" - , _questCost = do - returnResources 1 [Cleric] - returnResources 3 [Fighter] - returnResources 1 [Rogue] - returnResources 2 [Gold] + , _questCost = MS.fromOccurList [(Cleric, 1), (Fighter, 3), (Rogue, 1), (Gold, 2)] , _questReward = do scorePoints 11 takeResources 2 [Fighter] @@ -312,10 +244,7 @@ defaultQuestDeck = , Quest { _questType = Skullduggery , _questTitle = "Place a Sleeper Agent in Skullport" , _questQuote = "" - , _questCost = do - returnResources 1 [Fighter] - returnResources 4 [Rogue] - returnResources 1 [Wizard] + , _questCost = MS.fromOccurList [(Fighter, 1), (Rogue, 4), (Wizard, 1)] , _questReward = do noAction , _questPlotActions = @@ -324,10 +253,7 @@ defaultQuestDeck = , Quest { _questType = Skullduggery , _questTitle = "Establish Shadow Thieves' Guild" , _questQuote = "" - , _questCost = do - returnResources 1 [Fighter] - returnResources 8 [Rogue] - returnResources 1 [Wizard] + , _questCost = MS.fromOccurList [(Fighter, 1), (Rogue, 8), (Wizard, 1)] , _questReward = do scorePoints 25 , _questPlotActions = [] @@ -335,10 +261,7 @@ defaultQuestDeck = , Quest { _questType = Skullduggery , _questTitle = "Build a Reputation in Skullport" , _questQuote = "" - , _questCost = do - returnResources 1 [Fighter] - returnResources 3 [Rogue] - returnResources 4 [Gold] + , _questCost = MS.fromOccurList [(Fighter, 1), (Rogue, 3), (Gold, 4)] , _questReward = do scorePoints 10 drawIntrigue @@ -347,10 +270,7 @@ defaultQuestDeck = , Quest { _questType = Skullduggery , _questTitle = "Fence Goods for Duke of Darkness" , _questQuote = "" - , _questCost = do - returnResources 1 [Fighter] - returnResources 3 [Rogue] - returnResources 4 [Gold] + , _questCost = MS.fromOccurList [(Fighter, 1), (Rogue, 3), (Gold, 4)] , _questReward = do scorePoints 6 , _questPlotActions = @@ -359,11 +279,7 @@ defaultQuestDeck = , Quest { _questType = Skullduggery , _questTitle = "Raid on Undermountain" , _questQuote = "" - , _questCost = do - returnResources 1 [Cleric] - returnResources 2 [Fighter] - returnResources 4 [Rogue] - returnResources 1 [Wizard] + , _questCost = MS.fromOccurList [(Cleric, 1), (Fighter, 2), (Rogue, 4), (Wizard, 1)] , _questReward = do scorePoints 20 takeResources 2 [Gold] @@ -372,10 +288,7 @@ defaultQuestDeck = , Quest { _questType = Skullduggery , _questTitle = "Steal from House Adarbrent" , _questQuote = "" - , _questCost = do - returnResources 1 [Fighter] - returnResources 4 [Rogue] - returnResources 1 [Wizard] + , _questCost = MS.fromOccurList [(Fighter, 1), (Rogue, 4), (Wizard, 1)] , _questReward = do scorePoints 10 takeResources 6 [Gold] @@ -384,10 +297,7 @@ defaultQuestDeck = , Quest { _questType = Skullduggery , _questTitle = "Prison Break" , _questQuote = "" - , _questCost = do - returnResources 4 [Rogue] - returnResources 2 [Wizard] - returnResources 2 [Gold] + , _questCost = MS.fromOccurList [(Rogue, 4), (Wizard, 2), (Gold, 2)] , _questReward = do scorePoints 14 takeResources 2 [Fighter] @@ -397,11 +307,7 @@ defaultQuestDeck = , Quest { _questType = Skullduggery , _questTitle = "Take Over Rival Organization" , _questQuote = "" - , _questCost = do - returnResources 1 [Fighter] - returnResources 2 [Rogue] - returnResources 1 [Wizard] - returnResources 6 [Gold] + , _questCost = MS.fromOccurList [(Fighter, 1), (Rogue, 2), (Wizard, 1), (Gold, 6)] , _questReward = do scorePoints 10 takeResources 4 [Rogue] @@ -411,9 +317,7 @@ defaultQuestDeck = , Quest { _questType = Skullduggery , _questTitle = "Procure Stolen Goods" , _questQuote = "" - , _questCost = do - returnResources 3 [Rogue] - returnResources 6 [Gold] + , _questCost = MS.fromOccurList [(Rogue, 3), (Gold, 6)] , _questReward = do scorePoints 8 drawIntrigue @@ -423,10 +327,7 @@ defaultQuestDeck = , Quest { _questType = Skullduggery , _questTitle = "Establish Harpers Safe House" , _questQuote = "" - , _questCost = do - returnResources 2 [Fighter] - returnResources 3 [Rogue] - returnResources 2 [Gold] + , _questCost = MS.fromOccurList [(Fighter, 2), (Rogue, 3), (Gold, 2)] , _questReward = do scorePoints 8 forEachControlledBuilding $ @@ -436,9 +337,7 @@ defaultQuestDeck = , Quest { _questType = Skullduggery , _questTitle = "Expose Cult Corruption" , _questQuote = "" - , _questCost = do - returnResources 1 [Cleric] - returnResources 4 [Rogue] + , _questCost = MS.fromOccurList [(Cleric, 1), (Rogue, 4)] , _questReward = do scorePoints 4 takeResources 2 [Cleric] @@ -447,9 +346,7 @@ defaultQuestDeck = , Quest { _questType = Skullduggery , _questTitle = "Install a Spy in Castle Waterdeep" , _questQuote = "" - , _questCost = do - returnResources 4 [Rogue] - returnResources 4 [Gold] + , _questCost = MS.fromOccurList [(Rogue, 4), (Gold, 4)] , _questReward = do scorePoints 8 , _questPlotActions = @@ -458,12 +355,7 @@ defaultQuestDeck = , Quest { _questType = Arcana , _questTitle = "Expose Red Wizards' Spies" , _questQuote = "" - , _questCost = do - returnResources 1 [Cleric] - returnResources 1 [Fighter] - returnResources 2 [Rogue] - returnResources 2 [Wizard] - returnResources 2 [Gold] + , _questCost = MS.fromOccurList [(Cleric, 1), (Fighter, 1), (Rogue, 2), (Wizard, 2), (Gold, 2)] , _questReward = do scorePoints 20 drawIntrigue @@ -472,10 +364,7 @@ defaultQuestDeck = , Quest { _questType = Arcana , _questTitle = "Host Festival for Sune" , _questQuote = "" - , _questCost = do - returnResources 2 [Fighter] - returnResources 2 [Wizard] - returnResources 4 [Gold] + , _questCost = MS.fromOccurList [(Fighter, 2), (Wizard, 2), (Gold, 4)] , _questReward = do scorePoints 9 takeResources 2 [Cleric] @@ -484,10 +373,7 @@ defaultQuestDeck = , Quest { _questType = Arcana , _questTitle = "Steal Spellbook from Silverhand" , _questQuote = "" - , _questCost = do - returnResources 1 [Fighter] - returnResources 2 [Rogue] - returnResources 2 [Wizard] + , _questCost = MS.fromOccurList [(Fighter, 1), (Rogue, 2), (Wizard, 2)] , _questReward = do scorePoints 7 drawIntrigue @@ -498,11 +384,7 @@ defaultQuestDeck = , Quest { _questType = Arcana , _questTitle = "Recruit for Blackstaff Academy" , _questQuote = "" - , _questCost = do - returnResources 1 [Fighter] - returnResources 1 [Rogue] - returnResources 2 [Wizard] - returnResources 4 [Gold] + , _questCost = MS.fromOccurList [(Fighter, 1), (Rogue, 1), (Wizard, 2), (Gold, 4)] , _questReward = do scorePoints 6 takeResources 3 [Wizard] @@ -511,10 +393,7 @@ defaultQuestDeck = , Quest { _questType = Arcana , _questTitle = "Retrieve Ancient Artifacts" , _questQuote = "" - , _questCost = do - returnResources 2 [Fighter] - returnResources 1 [Rogue] - returnResources 2 [Wizard] + , _questCost = MS.fromOccurList [(Fighter, 2), (Rogue, 1), (Wizard, 2)] , _questReward = do scorePoints 11 takeResources 4 [Gold] @@ -523,9 +402,7 @@ defaultQuestDeck = , Quest { _questType = Arcana , _questTitle = "Recover the Magister's Orb" , _questQuote = "" - , _questCost = do - returnResources 3 [Rogue] - returnResources 2 [Wizard] + , _questCost = MS.fromOccurList [(Rogue, 3), (Wizard, 2)] , _questReward = do scorePoints 6 enableAssignOnceToOpponentsSpace @@ -535,9 +412,7 @@ defaultQuestDeck = , Quest { _questType = Arcana , _questTitle = "Study the Illusk Arch" , _questQuote = "" - , _questCost = do - returnResources 1 [Cleric] - returnResources 2 [Wizard] + , _questCost = MS.fromOccurList [(Cleric, 1), (Wizard, 2)] , _questReward = do scorePoints 8 , _questPlotActions = @@ -546,10 +421,7 @@ defaultQuestDeck = , Quest { _questType = Arcana , _questTitle = "Explore Ahghairon's Tower" , _questQuote = "" - , _questCost = do - returnResources 1 [Fighter] - returnResources 2 [Wizard] - returnResources 2 [Gold] + , _questCost = MS.fromOccurList [(Fighter, 1), (Wizard, 2), (Gold, 2)] , _questReward = do scorePoints 6 , _questPlotActions = @@ -558,9 +430,7 @@ defaultQuestDeck = , Quest { _questType = Arcana , _questTitle = "Infiltrate Halaster's Circle" , _questQuote = "" - , _questCost = do - returnResources 5 [Wizard] - returnResources 2 [Gold] + , _questCost = MS.fromOccurList [(Wizard, 5), (Gold, 2)] , _questReward = do scorePoints 25 , _questPlotActions = [] @@ -568,9 +438,7 @@ defaultQuestDeck = , Quest { _questType = Arcana , _questTitle = "Domesticate Owlbears" , _questQuote = "" - , _questCost = do - returnResources 1 [Cleric] - returnResources 2 [Wizard] + , _questCost = MS.fromOccurList [(Cleric, 1), (Wizard, 2)] , _questReward = do scorePoints 8 takeResources 1 [Fighter] @@ -580,10 +448,7 @@ defaultQuestDeck = , Quest { _questType = Arcana , _questTitle = "Investigate Aberrant Infestation" , _questQuote = "" - , _questCost = do - returnResources 1 [Cleric] - returnResources 1 [Fighter] - returnResources 2 [Wizard] + , _questCost = MS.fromOccurList [(Cleric, 1), (Fighter, 1), (Wizard, 2)] , _questReward = do scorePoints 13 drawIntrigue @@ -592,9 +457,7 @@ defaultQuestDeck = , Quest { _questType = Arcana , _questTitle = "Research Chronomancy" , _questQuote = "" - , _questCost = do - returnResources 2 [Wizard] - returnResources 4 [Gold] + , _questCost = MS.fromOccurList [(Wizard, 2), (Gold, 4)] , _questReward = do scorePoints 4 takeResources 1 [Wizard] @@ -604,10 +467,7 @@ defaultQuestDeck = , Quest { _questType = Commerce , _questTitle = "Infiltrate Builder's Hall" , _questQuote = "" - , _questCost = do - returnResources 2 [Fighter] - returnResources 2 [Rogue] - returnResources 4 [Gold] + , _questCost = MS.fromOccurList [(Fighter, 2), (Rogue, 2), (Gold, 4)] , _questReward = do scorePoints 6 , _questPlotActions = @@ -616,10 +476,7 @@ defaultQuestDeck = , Quest { _questType = Commerce , _questTitle = "Loot the Crypt of Chauntea" , _questQuote = "" - , _questCost = do - returnResources 1 [Cleric] - returnResources 3 [Rogue] - returnResources 2 [Gold] + , _questCost = MS.fromOccurList [(Cleric, 1), (Rogue, 3), (Gold, 2)] , _questReward = do scorePoints 7 drawIntrigue @@ -629,12 +486,7 @@ defaultQuestDeck = , Quest { _questType = Commerce , _questTitle = "Impersonate Adarbrent Noble" , _questQuote = "" - , _questCost = do - returnResources 1 [Cleric] - returnResources 2 [Fighter] - returnResources 2 [Rogue] - returnResources 1 [Wizard] - returnResources 4 [Gold] + , _questCost = MS.fromOccurList [(Cleric, 1), (Fighter, 2), (Rogue, 2), (Wizard, 1), (Gold, 4)] , _questReward = do scorePoints 18 drawIntrigue @@ -644,11 +496,7 @@ defaultQuestDeck = , Quest { _questType = Commerce , _questTitle = "Safeguard Eltorchul Mage" , _questQuote = "" - , _questCost = do - returnResources 1 [Fighter] - returnResources 1 [Rogue] - returnResources 1 [Wizard] - returnResources 4 [Gold] + , _questCost = MS.fromOccurList [(Fighter, 1), (Rogue, 1), (Wizard, 1), (Gold, 4)] , _questReward = do scorePoints 4 takeResources 2 [Wizard] @@ -657,11 +505,7 @@ defaultQuestDeck = , Quest { _questType = Commerce , _questTitle = "Thin the City Watch" , _questQuote = "" - , _questCost = do - returnResources 1 [Cleric] - returnResources 1 [Fighter] - returnResources 1 [Rogue] - returnResources 4 [Gold] + , _questCost = MS.fromOccurList [(Cleric, 1), (Fighter, 1), (Rogue, 1), (Gold, 4)] , _questReward = do scorePoints 9 takeResources 4 [Rogue] @@ -670,10 +514,7 @@ defaultQuestDeck = , Quest { _questType = Commerce , _questTitle = "Bribe the Shipwrights" , _questQuote = "" - , _questCost = do - returnResources 4 [Rogue] - returnResources 1 [Wizard] - returnResources 4 [Gold] + , _questCost = MS.fromOccurList [(Rogue, 4), (Wizard, 1), (Gold, 4)] , _questReward = do scorePoints 10 , _questPlotActions = @@ -682,10 +523,7 @@ defaultQuestDeck = , Quest { _questType = Commerce , _questTitle = "Lure Artisans of Mirabar" , _questQuote = "" - , _questCost = do - returnResources 1 [Cleric] - returnResources 1 [Fighter] - returnResources 1 [Rogue] + , _questCost = MS.fromOccurList [(Cleric, 1), (Fighter, 1), (Rogue, 1)] , _questReward = do scorePoints 4 chooseFreeBuilding @@ -694,9 +532,7 @@ defaultQuestDeck = , Quest { _questType = Commerce , _questTitle = "Placate the Walking Statue" , _questQuote = "" - , _questCost = do - returnResources 2 [Cleric] - returnResources 2 [Rogue] + , _questCost = MS.fromOccurList [(Cleric, 2), (Rogue, 2)] , _questReward = do scorePoints 10 drawFreeBuilding @@ -705,10 +541,7 @@ defaultQuestDeck = , Quest { _questType = Commerce , _questTitle = "Establish New Merchant Guild" , _questQuote = "" - , _questCost = do - returnResources 1 [Cleric] - returnResources 2 [Fighter] - returnResources 4 [Gold] + , _questCost = MS.fromOccurList [(Cleric, 1), (Fighter, 2), (Gold, 4)] , _questReward = do scorePoints 8 , _questPlotActions = @@ -717,11 +550,7 @@ defaultQuestDeck = , Quest { _questType = Commerce , _questTitle = "Send Aid to the Harpers" , _questQuote = "" - , _questCost = do - returnResources 1 [Cleric] - returnResources 1 [Fighter] - returnResources 1 [Rogue] - returnResources 4 [Gold] + , _questCost = MS.fromOccurList [(Cleric, 1), (Fighter, 1), (Rogue, 1), (Gold, 4)] , _questReward = do scorePoints 15 forOneOpponent $ takeResources 4 [Gold] @@ -730,11 +559,7 @@ defaultQuestDeck = , Quest { _questType = Commerce , _questTitle = "Ally with House Thann" , _questQuote = "" - , _questCost = do - returnResources 1 [Cleric] - returnResources 3 [Rogue] - returnResources 1 [Wizard] - returnResources 8 [Gold] + , _questCost = MS.fromOccurList [(Cleric, 1), (Rogue, 3), (Wizard, 1), (Gold, 8)] , _questReward = do scorePoints 25 , _questPlotActions = [] @@ -742,10 +567,7 @@ defaultQuestDeck = , Quest { _questType = Commerce , _questTitle = "Spy on the House of Light" , _questQuote = "" - , _questCost = do - returnResources 3 [Fighter] - returnResources 2 [Rogue] - returnResources 2 [Gold] + , _questCost = MS.fromOccurList [(Fighter, 3), (Rogue, 2), (Gold, 2)] , _questReward = do scorePoints 6 takeResources 6 [Gold] diff --git a/src/Waterdeep/Types.hs b/src/Waterdeep/Types.hs index 02d91e8..0940c35 100644 --- a/src/Waterdeep/Types.hs +++ b/src/Waterdeep/Types.hs @@ -158,7 +158,7 @@ data Quest = { _questType :: QuestType , _questTitle :: String , _questQuote :: String - , _questCost :: GameAction + , _questCost :: MS.MultiSet Resource , _questReward :: GameAction , _questPlotActions :: [(PlotCondition, GameAction)] }