waterdeep/src/Waterdeep/Intrigues.hs

304 lines
15 KiB
Haskell

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 = ""
})
]