304 lines
15 KiB
Haskell
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 = ""
|
|
})
|
|
]
|