module Waterdeep.Intrigues ( defaultIntrigueDeck ) where import Control.Applicative import Control.Arrow ((&&&)) import Control.Monad import Data.List import Data.Foldable (toList) import Data.Monoid import Data.Traversable (traverse) import Lens.Family2 import Lens.Family2.Stock import Lens.Family2.State import Lens.Family2.TH import Waterdeep.Actions import Waterdeep.Types import Waterdeep.Util import qualified Data.IntMap as IM import qualified Data.Map as M import qualified Data.MultiSet as MS defaultIntrigueDeck :: [IntrigueCard] defaultIntrigueDeck = concat $ map (uncurry replicate) $ [ (1, mandatoryQuestCard $ Quest { _questType = Mandatory , _questTitle = "Repel Drow Invaders" , _questQuote = "" , _questCost = clerics 1 <> rogues 2 , _questReward = scorePoints 2 , _questPlotActions = [] }) , (1, mandatoryQuestCard $ Quest { _questType = Mandatory , _questTitle = "Fend Off Bandits" , _questQuote = "" , _questCost = fighters 2 <> wizards 1 , _questReward = scorePoints 2 , _questPlotActions = [] }) , (1, mandatoryQuestCard $ Quest { _questType = Mandatory , _questTitle = "Foil the Zhentarim" , _questQuote = "" , _questCost = fighters 1 <> rogues 1 <> wizards 1 , _questReward = scorePoints 2 , _questPlotActions = [] }) , (1, mandatoryQuestCard $ Quest { _questType = Mandatory , _questTitle = "Stamp Out Cultists" , _questQuote = "" , _questCost = clerics 1 <> fighters 1 <> rogues 1 , _questReward = scorePoints 2 , _questPlotActions = [] }) , (1, mandatoryQuestCard $ Quest { _questType = Mandatory , _questTitle = "Placate Angry Merchants" , _questQuote = "" , _questCost = clerics 1 <> fighters 1 <> wizards 1 , _questReward = scorePoints 4 , _questPlotActions = [] }) , (1, mandatoryQuestCard $ Quest { _questType = Mandatory , _questTitle = "Quell Riots" , _questQuote = "" , _questCost = clerics 2 <> fighters 1 , _questReward = scorePoints 4 , _questPlotActions = [] }) , (1, IntrigueCard { _intrigueTitle = "Accelerate Plans" , _intrigueType = Utility , _intrigueAction = do returnAgentFromHarbor assignAgent assignAgent , _intrigueQuote = "" }) , (2, IntrigueCard { _intrigueTitle = "Arcane Mishap" , _intrigueType = Attack , _intrigueAction = actionProvidedSet <=< forEachOpponent $ do result <- filterChoices $ returnResources 1 [Wizard] snd <$$> forCurrentPlayer $ when (result == Nothing) $ drawIntrigue , _intrigueQuote = "" }) , (2, IntrigueCard { _intrigueTitle = "Assassination" , _intrigueType = Attack , _intrigueAction = actionProvidedSet <=< forEachOpponent $ do result <- filterChoices $ returnResources 1 [Rogue] snd <$$> forCurrentPlayer $ when (result == Nothing) $ takeResources 2 [Gold] , _intrigueQuote = "" }) , (2, IntrigueCard { _intrigueTitle = "Ambush" , _intrigueType = Attack , _intrigueAction = actionProvidedSet <=< forEachOpponent $ do result <- filterChoices $ returnResources 1 [Fighter] snd <$$> forCurrentPlayer $ when (result == Nothing) $ takeResources 1 [Fighter] , _intrigueQuote = "" }) , (3, IntrigueCard { _intrigueTitle = "Bidding War" , _intrigueType = Utility , _intrigueAction = distributeQuests , _intrigueQuote = "" }) , (2, IntrigueCard { _intrigueTitle = "Bribe Agent" , _intrigueType = Attack , _intrigueAction = do returnResources 2 [Gold] useOpponentsSpace , _intrigueQuote = "" }) , (2, IntrigueCard { _intrigueTitle = "Call in a Favor" , _intrigueType = Utility , _intrigueAction = do join . solicitChoice "Choose one:" $ [ ("4 Gold", takeResources 4 [Gold]) , ("2 Fighters", takeResources 2 [Fighter]) , ("2 Rogues", takeResources 2 [Rogue]) , ("1 Wizard", takeResources 1 [Wizard]) , ("1 Cleric", takeResources 1 [Cleric]) ] , _intrigueQuote = "" }) , (2, IntrigueCard { _intrigueTitle = "Call for Adventurers" , _intrigueType = Utility , _intrigueAction = do takeResources 2 [Cleric, Fighter, Rogue, Wizard] forEachOpponent $ takeResources 1 [Cleric, Fighter, Rogue, Wizard] , _intrigueQuote = "" }) , (1, IntrigueCard { _intrigueTitle = "Change of Plans" , _intrigueType = Utility , _intrigueAction = do discardUncompletedQuest scorePoints 6 forEachOpponent $ do join . solicitChoice "Discard uncompleted quest for 3 points?" $ [ ("Yes", discardUncompletedQuest >> scorePoints 3) , ("No", return ()) ] , _intrigueQuote = "" }) , (2, IntrigueCard { _intrigueTitle = "Conscription" , _intrigueType = Utility , _intrigueAction = do takeResources 2 [Fighter] forOneOpponent $ takeResources 1 [Fighter] , _intrigueQuote = "" }) , (2, IntrigueCard { _intrigueTitle = "Crime Wave" , _intrigueType = Utility , _intrigueAction = do takeResources 2 [Rogue] forOneOpponent $ takeResources 1 [Rogue] , _intrigueQuote = "" }) , (2, IntrigueCard { _intrigueTitle = "Free Drinks!" , _intrigueType = Attack , _intrigueAction = do r <- solicitChoice "Choose one:" $ map (show &&& id) $ [Cleric, Fighter, Rogue, Wizard] forOneOpponent $ returnResources 1 [r] takeResources 1 [r] , _intrigueQuote = "" }) , (2, IntrigueCard { _intrigueTitle = "Good Faith" , _intrigueType = Utility , _intrigueAction = do takeResources 2 [Cleric] forOneOpponent $ takeResources 1 [Cleric] , _intrigueQuote = "" }) , (2, IntrigueCard { _intrigueTitle = "Graduation Day" , _intrigueType = Utility , _intrigueAction = do takeResources 2 [Wizard] forOneOpponent $ takeResources 1 [Wizard] , _intrigueQuote = "" }) , (2, IntrigueCard { _intrigueTitle = "Lack of Faith" , _intrigueType = Attack , _intrigueAction = actionProvidedSet <=< forEachOpponent $ do result <- filterChoices $ returnResources 1 [Cleric] snd <$$> forCurrentPlayer $ when (result == Nothing) $ scorePoints 2 , _intrigueQuote = "" }) , (1, IntrigueCard { _intrigueTitle = "Real Estate Deal" , _intrigueType = Utility , _intrigueAction = do discardUnoccupiedBuilding chooseFreeBuilding , _intrigueQuote = "" }) , (2, IntrigueCard { _intrigueTitle = "Recall Agent" , _intrigueType = Utility , _intrigueAction = returnAgent , _intrigueQuote = "" }) , (1, IntrigueCard { _intrigueTitle = "Recruit Spies" , _intrigueType = Utility , _intrigueAction = do takeResources 2 [Rogue] name <- use activePlayerName actionProvidedSet <=< forEachOpponent $ do join . solicitChoice ("Give " ++ name ++ " 1 Rogue for 3 points?") $ [ ("Yes", do { returnResources 1 [Rogue] ; (_, p) <- forCurrentPlayer $ takeResources 1 [Rogue] ; scorePoints 3 ; return p }) , ("No", return mempty) ] , _intrigueQuote = "" }) , (1, IntrigueCard { _intrigueTitle = "Request Assistance" , _intrigueType = Utility , _intrigueAction = do takeResources 2 [Fighter] name <- use activePlayerName actionProvidedSet <=< forEachOpponent $ do join . solicitChoice ("Give " ++ name ++ " 1 Fighter for 3 points?") $ [ ("Yes", do { returnResources 1 [Fighter] ; (_, p) <- forCurrentPlayer $ takeResources 1 [Fighter] ; scorePoints 3 ; return p }) , ("No", return mempty) ] , _intrigueQuote = "" }) , (1, IntrigueCard { _intrigueTitle = "Research Agreement" , _intrigueType = Utility , _intrigueAction = do takeResources 1 [Wizard] name <- use activePlayerName actionProvidedSet <=< forEachOpponent $ do join . solicitChoice ("Give " ++ name ++ " 1 Wizard for 5 points?") $ [ ("Yes", do { returnResources 1 [Wizard] ; (_, p) <- forCurrentPlayer $ takeResources 1 [Wizard] ; scorePoints 5 ; return p }) , ("No", return mempty) ] , _intrigueQuote = "" }) , (2, IntrigueCard { _intrigueTitle = "Sample Wares" , _intrigueType = Utility , _intrigueAction = assignAgentToBuildersHall , _intrigueQuote = "" }) , (2, IntrigueCard { _intrigueTitle = "Special Assignment" , _intrigueType = Utility , _intrigueAction = drawNamedQuestType , _intrigueQuote = "" }) , (2, IntrigueCard { _intrigueTitle = "Spread the Wealth" , _intrigueType = Utility , _intrigueAction = do takeResources 4 [Gold] forOneOpponent $ takeResources 2 [Gold] , _intrigueQuote = "" }) , (1, IntrigueCard { _intrigueTitle = "Summon the Faithful" , _intrigueType = Utility , _intrigueAction = do takeResources 1 [Cleric] name <- use activePlayerName actionProvidedSet <=< forEachOpponent $ do join . solicitChoice ("Give " ++ name ++ " 1 Cleric for 5 points?") $ [ ("Yes", do { returnResources 1 [Cleric] ; (_, p) <- forCurrentPlayer $ takeResources 1 [Cleric] ; scorePoints 5 ; return p }) , ("No", return mempty) ] , _intrigueQuote = "" }) , (2, IntrigueCard { _intrigueTitle = "Tax Collection" , _intrigueType = Utility , _intrigueAction = do takeResources 4 [Gold] name <- use activePlayerName actionProvidedSet <=< forEachOpponent $ do join . solicitChoice ("Give " ++ name ++ " 4 Gold for 4 points?") $ [ ("Yes", do { returnResources 4 [Gold] ; (_, p) <- forCurrentPlayer $ takeResources 4 [Gold] ; scorePoints 4 ; return p }) , ("No", return mempty) ] , _intrigueQuote = "" }) ]