enter details for the cards in the Quest deck
This commit is contained in:
parent
349472da78
commit
c788c563fa
|
|
@ -24,6 +24,7 @@ import System.Random.Shuffle
|
|||
import Text.Printf
|
||||
import Waterdeep.Actions
|
||||
import Waterdeep.Logic
|
||||
import Waterdeep.Quests
|
||||
import Waterdeep.Types
|
||||
import Waterdeep.Util
|
||||
|
||||
|
|
@ -46,30 +47,6 @@ f2 = Faction "Pilots" Green
|
|||
l2 = Lord "Princess Anastasia" "" (QuestBonus [Arcana, Warfare] 4)
|
||||
p2 = ("Ned", f2, l2)
|
||||
|
||||
q1 = Quest { _questType = Arcana
|
||||
, _questTitle = "Research Palantirs"
|
||||
, _questQuote = ""
|
||||
, _questAction = do
|
||||
returnResources 1 [Cleric]
|
||||
returnResources 1 [Rogue]
|
||||
returnResources 1 [Rogue]
|
||||
returnResources 1 [Wizard]
|
||||
returnResources 4 [Gold]
|
||||
scorePoints 15
|
||||
takeResources 8 [Gold]
|
||||
, _questPlotActions = []
|
||||
}
|
||||
|
||||
q2 = Quest { _questType = Skullduggery
|
||||
, _questTitle = "Rob Waterdeep Bank"
|
||||
, _questQuote = ""
|
||||
, _questAction = do
|
||||
returnResources 8 [Rogue]
|
||||
scorePoints 10
|
||||
takeResources 16 [Gold]
|
||||
, _questPlotActions = []
|
||||
}
|
||||
|
||||
b1 = Building { _buildingCost = 6
|
||||
, _buildingTitle = "Monastary"
|
||||
, _buildingAction = takeResources 2 [Cleric]
|
||||
|
|
@ -181,7 +158,7 @@ menuPrompt ref redraw (NotifyState w) = do
|
|||
modifyIORef ref (gameState .~ w)
|
||||
redraw
|
||||
menuPrompt ref redraw (Broadcast s) = do
|
||||
modifyIORef ref (gameMessages %~ ((s:) . take 2))
|
||||
modifyIORef ref (gameMessages %~ ((s:) . take 4))
|
||||
redraw
|
||||
menuPrompt ref redraw prm@(SolicitChoice p t cs) = do
|
||||
let menuSize = length cs
|
||||
|
|
@ -220,7 +197,7 @@ printMenu cs = do
|
|||
|
||||
main :: IO ()
|
||||
main = do
|
||||
w0 <- newGame [p1, p2] (mrepeat 4 [q1, q2]) (mrepeat 4 [i1, i2]) [b1, b2, b3, b4, b5] <$> getSplit
|
||||
w0 <- newGame [p1, p2] defaultQuestDeck (mrepeat 4 [i1, i2]) [b1, b2, b3, b4, b5] <$> getSplit
|
||||
ref <- newIORef (DisplayState { _gameState = w0, _gameMessages = [] })
|
||||
Just (winners, w') <- runWaterdeepM (menuPrompt ref (drawState ref)) waterdeepGame w0
|
||||
let playerIDToName n = w0 ^. gamePlayerName n
|
||||
|
|
|
|||
|
|
@ -32,14 +32,15 @@ module Waterdeep.Actions
|
|||
, gainAmbassador
|
||||
, assignMandatoryQuest
|
||||
, becomeFirstPlayer
|
||||
, enableAssignOnceToOpponentsSpace
|
||||
, forOneOpponent
|
||||
, forEachOpponent
|
||||
, forCurrentPlayer
|
||||
, forEachBuilding
|
||||
, forEachControlledBuilding
|
||||
, restockCliffwatchInn
|
||||
, restockBuildersHall
|
||||
, getOpponents
|
||||
, getNumberOfBuildings
|
||||
, getNumberOfControlledBuildings
|
||||
) where
|
||||
|
||||
import Control.Applicative
|
||||
|
|
@ -171,12 +172,13 @@ 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 ^. questAction
|
||||
quest ^. questCost
|
||||
name <- use activePlayerName
|
||||
broadcast $ name ++ " completed the " ++ (quest ^. questTitle) ++ " quest."
|
||||
quest ^. questReward
|
||||
if null (quest ^. questPlotActions)
|
||||
then activePlayerState . playerCompletedQuests <>= [quest]
|
||||
else activePlayerState . playerActivePlotQuests <>= [quest]
|
||||
name <- use $ activePlayerName
|
||||
broadcast $ name ++ " completed the " ++ (quest ^. questTitle) ++ " quest."
|
||||
|
||||
chooseAndCompleteQuest :: GameAction -> GameAction
|
||||
chooseAndCompleteQuest bonusAction = do
|
||||
|
|
@ -187,12 +189,13 @@ chooseAndCompleteQuest bonusAction = do
|
|||
True -> do
|
||||
incompleteQuests <- use (activePlayerState . playerIncompleteQuests)
|
||||
guard . not . or $ map ((== Mandatory) . view questType) incompleteQuests
|
||||
quest ^. questAction
|
||||
quest ^. questCost
|
||||
name <- use $ activePlayerName
|
||||
broadcast $ name ++ " completed the " ++ (quest ^. questTitle) ++ " quest."
|
||||
quest ^. questReward
|
||||
if null (quest ^. questPlotActions)
|
||||
then activePlayerState . playerCompletedQuests <>= [quest]
|
||||
else activePlayerState . playerActivePlotQuests <>= [quest]
|
||||
name <- use $ activePlayerName
|
||||
broadcast $ name ++ " completed the " ++ (quest ^. questTitle) ++ " quest."
|
||||
bonusAction
|
||||
False -> do
|
||||
activePlayerState . playerIncompleteQuests <>= [quest]
|
||||
|
|
@ -379,6 +382,10 @@ becomeFirstPlayer = do
|
|||
name <- use $ activePlayerName
|
||||
broadcast $ name ++ " is now the first player."
|
||||
|
||||
enableAssignOnceToOpponentsSpace :: GameAction
|
||||
enableAssignOnceToOpponentsSpace = do
|
||||
activePlayerState . playerCanUseOpSpace .= True
|
||||
|
||||
forOneOpponent :: GameAction -> GameAction
|
||||
forOneOpponent a1 = do
|
||||
opponents <- getOpponents
|
||||
|
|
@ -469,14 +476,17 @@ getOpponents = do
|
|||
p <- use gameActivePlayer
|
||||
filter (\p1 -> (p1 ^. playerNumber) /= p) . toListOf traverse <$> use gamePlayerStates
|
||||
|
||||
getNumberOfBuildings :: Waterdeep Int
|
||||
getNumberOfBuildings = countOf traverse isOwned <$> use gameBuildings
|
||||
forEachBuilding :: GameAction -> GameAction
|
||||
forEachBuilding m = do
|
||||
advancedBuildings <- countOf traverse isAdvanced <$> use gameBuildings
|
||||
replicateM_ advancedBuildings m
|
||||
where
|
||||
isOwned b = b ^. buildingOwner /= noPlayerID
|
||||
isAdvanced b = b ^. buildingOwner /= noPlayerID
|
||||
|
||||
getNumberOfControlledBuildings :: Waterdeep Int
|
||||
getNumberOfControlledBuildings = do
|
||||
forEachControlledBuilding :: GameAction -> GameAction
|
||||
forEachControlledBuilding m = do
|
||||
p <- use gameActivePlayer
|
||||
countOf traverse (`isOwnedBy` p) <$> use gameBuildings
|
||||
controlledBuildings <- countOf traverse (`isControlledBy` p) <$> use gameBuildings
|
||||
replicateM_ controlledBuildings m
|
||||
where
|
||||
b `isOwnedBy` p = b ^. buildingOwner == p
|
||||
b `isControlledBy` p = b ^. buildingOwner == p
|
||||
|
|
|
|||
|
|
@ -118,8 +118,8 @@ waterdeepGame = do
|
|||
when (passes < np) $ do
|
||||
advanceToNextPlayer
|
||||
loop
|
||||
broadcast $ "Game over!"
|
||||
scoreFinalPoints
|
||||
notifyState
|
||||
determineWinners
|
||||
|
||||
advanceToNextPlayer :: Waterdeep ()
|
||||
|
|
@ -144,9 +144,11 @@ beginRound round = do
|
|||
activePlayerState . playerUsedPlotQuests .= []
|
||||
activePlayerState . playerActivePlotQuests <>= qs
|
||||
activePlayerState . playerAgentsInPool .= agents
|
||||
activePlayerState . playerCanUseOpSpace .= False
|
||||
use (activePlayerState . playerHasLieutenant) >>= \case
|
||||
True -> activePlayerState . playerAgentsInPool += 1 >> return ()
|
||||
False -> return ()
|
||||
--TODO: Start-of-round plot actions
|
||||
|
||||
scoreFinalPoints :: Waterdeep ()
|
||||
scoreFinalPoints = do
|
||||
|
|
@ -184,6 +186,7 @@ determineWinners = do
|
|||
let winners1 = filter ((== bestScore) . view playerScore) playerStates
|
||||
let bestGold = maximum $ map playerGold winners1
|
||||
let winners2 = filter ((== bestGold) . playerGold) winners1
|
||||
broadcast $ "Winners: " ++ (intercalate ", " (winners2 ^.. traverse . playerName))
|
||||
return (winners2 ^.. traverse . playerNumber)
|
||||
where
|
||||
playerGold = MS.occur Gold . view playerTavern
|
||||
|
|
|
|||
|
|
@ -0,0 +1,754 @@
|
|||
module Waterdeep.Quests
|
||||
( defaultQuestDeck
|
||||
) where
|
||||
|
||||
import Control.Applicative
|
||||
import Control.Monad
|
||||
import Data.List
|
||||
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
|
||||
|
||||
defaultQuestDeck :: [Quest]
|
||||
defaultQuestDeck =
|
||||
[ Quest { _questType = Piety
|
||||
, _questTitle = "Recruit Paladins for Tyr"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 2 [Cleric]
|
||||
returnResources 4 [Fighter]
|
||||
returnResources 4 [Gold]
|
||||
, _questReward = do
|
||||
scorePoints 10
|
||||
takeResources 3 [Cleric]
|
||||
, _questPlotActions = []
|
||||
}
|
||||
, Quest { _questType = Piety
|
||||
, _questTitle = "Defend the Tower of Luck"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 2 [Cleric]
|
||||
returnResources 1 [Fighter]
|
||||
returnResources 1 [Rogue]
|
||||
returnResources 1 [Wizard]
|
||||
, _questReward = do
|
||||
takeResources 1 [Cleric,Fighter,Rogue,Wizard]
|
||||
, _questPlotActions =
|
||||
[(StartOfRound, takeResources 1 [Cleric,Fighter,Rogue,Wizard])]
|
||||
}
|
||||
, Quest { _questType = Piety
|
||||
, _questTitle = "Protect the House of Wonder"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 2 [Cleric]
|
||||
returnResources 1 [Fighter]
|
||||
returnResources 2 [Gold]
|
||||
, _questReward = do
|
||||
scorePoints 8
|
||||
, _questPlotActions =
|
||||
[(Whenever (CompletesQuest [Piety]), scorePoints 2)]
|
||||
}
|
||||
, Quest { _questType = Piety
|
||||
, _questTitle = "Produce a Miracle for the Masses"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 2 [Cleric]
|
||||
returnResources 4 [Gold]
|
||||
, _questReward = do
|
||||
scorePoints 5
|
||||
, _questPlotActions =
|
||||
[( OncePerRoundWhen (ActionProvides [Cleric])
|
||||
, do { returnResources 1 [Fighter, Rogue, Wizard]
|
||||
; takeResources 1 [Cleric]
|
||||
})]
|
||||
}
|
||||
, Quest { _questType = Piety
|
||||
, _questTitle = "Convert a Noble to Lathander"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 2 [Cleric]
|
||||
returnResources 1 [Fighter]
|
||||
, _questReward = do
|
||||
scorePoints 8
|
||||
chooseQuest
|
||||
, _questPlotActions = []
|
||||
}
|
||||
, Quest { _questType = Piety
|
||||
, _questTitle = "Heal Fallen Gray Hand Soldiers"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 2 [Cleric]
|
||||
returnResources 1 [Wizard]
|
||||
returnResources 4 [Gold]
|
||||
, _questReward = do
|
||||
scorePoints 6
|
||||
takeResources 6 [Fighter]
|
||||
, _questPlotActions = []
|
||||
}
|
||||
, Quest { _questType = Piety
|
||||
, _questTitle = "Create a Shrine to Oghma"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 5 [Cleric]
|
||||
returnResources 2 [Gold]
|
||||
, _questReward = do
|
||||
scorePoints 25
|
||||
, _questPlotActions = []
|
||||
}
|
||||
, Quest { _questType = Piety
|
||||
, _questTitle = "Seal Gate to Cyric's Realm"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 2 [Cleric]
|
||||
returnResources 3 [Rogue]
|
||||
returnResources 4 [Gold]
|
||||
, _questReward = do
|
||||
scorePoints 20
|
||||
, _questPlotActions = []
|
||||
}
|
||||
, Quest { _questType = Piety
|
||||
, _questTitle = "Perform the Penance of Duty"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 2 [Cleric]
|
||||
returnResources 2 [Fighter]
|
||||
returnResources 4 [Gold]
|
||||
, _questReward = do
|
||||
scorePoints 12
|
||||
takeResources 1 [Cleric]
|
||||
takeResources 1 [Fighter]
|
||||
, _questPlotActions = []
|
||||
}
|
||||
, Quest { _questType = Piety
|
||||
, _questTitle = "Form an Alliance with the Rashemi"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 2 [Cleric]
|
||||
returnResources 1 [Wizard]
|
||||
, _questReward = do
|
||||
scorePoints 10
|
||||
chooseQuest
|
||||
, _questPlotActions = []
|
||||
}
|
||||
, Quest { _questType = Piety
|
||||
, _questTitle = "Eliminate Vampire Coven"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 2 [Cleric]
|
||||
returnResources 2 [Fighter]
|
||||
returnResources 1 [Rogue]
|
||||
, _questReward = do
|
||||
scorePoints 11
|
||||
takeResources 4 [Gold]
|
||||
, _questPlotActions = []
|
||||
}
|
||||
, Quest { _questType = Piety
|
||||
, _questTitle = "Discover Hidden Temple of Lolth"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 2 [Cleric]
|
||||
returnResources 1 [Fighter]
|
||||
returnResources 1 [Rogue]
|
||||
, _questReward = do
|
||||
scorePoints 10
|
||||
chooseQuest
|
||||
, _questPlotActions = []
|
||||
}
|
||||
, 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]
|
||||
, _questReward = do
|
||||
scorePoints 9
|
||||
takeResources 2 [Cleric]
|
||||
, _questPlotActions = []
|
||||
}
|
||||
, Quest { _questType = Warfare
|
||||
, _questTitle = "Raid Orc Stronghold"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 4 [Fighter]
|
||||
returnResources 2 [Rogue]
|
||||
, _questReward = do
|
||||
scorePoints 8
|
||||
takeResources 4 [Gold]
|
||||
, _questPlotActions = []
|
||||
}
|
||||
, Quest { _questType = Warfare
|
||||
, _questTitle = "Bolster City Guard"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 9 [Fighter]
|
||||
returnResources 2 [Rogue]
|
||||
, _questReward = do
|
||||
scorePoints 25
|
||||
, _questPlotActions = []
|
||||
}
|
||||
, Quest { _questType = Warfare
|
||||
, _questTitle = "Recruit Lieutenant"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 1 [Cleric]
|
||||
returnResources 5 [Fighter]
|
||||
returnResources 1 [Rogue]
|
||||
returnResources 1 [Wizard]
|
||||
, _questReward = do
|
||||
noAction
|
||||
, _questPlotActions =
|
||||
[(Immediately, gainLieutenant)]
|
||||
}
|
||||
, Quest { _questType = Warfare
|
||||
, _questTitle = "Train Bladesingers"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 3 [Fighter]
|
||||
returnResources 1 [Wizard]
|
||||
, _questReward = do
|
||||
scorePoints 4
|
||||
takeResources 1 [Fighter]
|
||||
takeResources 1 [Wizard]
|
||||
, _questPlotActions = []
|
||||
}
|
||||
, Quest { _questType = Warfare
|
||||
, _questTitle = "Repel Seawraiths"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 1 [Cleric]
|
||||
returnResources 4 [Fighter]
|
||||
returnResources 1 [Wizard]
|
||||
, _questReward = do
|
||||
scorePoints 15
|
||||
takeResources 2 [Gold]
|
||||
, _questPlotActions = []
|
||||
}
|
||||
, Quest { _questType = Warfare
|
||||
, _questTitle = "Bolster Griffon Cavalry"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 4 [Fighter]
|
||||
returnResources 4 [Gold]
|
||||
, _questReward = do
|
||||
scorePoints 6
|
||||
, _questPlotActions =
|
||||
[(Whenever (ActionProvides [Fighter])
|
||||
, takeResources 1 [Fighter])]
|
||||
}
|
||||
, Quest { _questType = Warfare
|
||||
, _questTitle = "Deliver an Ultimatum"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 4 [Fighter]
|
||||
returnResources 1 [Rogue]
|
||||
returnResources 1 [Wizard]
|
||||
, _questReward = do
|
||||
scorePoints 11
|
||||
takeResources 4 [Gold]
|
||||
, _questPlotActions = []
|
||||
}
|
||||
, Quest { _questType = Warfare
|
||||
, _questTitle = "Ambush Artor Morlin"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 1 [Cleric]
|
||||
returnResources 3 [Fighter]
|
||||
returnResources 1 [Rogue]
|
||||
, _questReward = do
|
||||
scorePoints 8
|
||||
takeResources 4 [Gold]
|
||||
, _questPlotActions = []
|
||||
}
|
||||
, Quest { _questType = Warfare
|
||||
, _questTitle = "Quell Mercenary Uprising"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 1 [Cleric]
|
||||
returnResources 4 [Fighter]
|
||||
, _questReward = do
|
||||
scorePoints 8
|
||||
takeResources 4 [Gold]
|
||||
, _questPlotActions =
|
||||
[(Whenever (CompletesQuest [Warfare]), scorePoints 2)]
|
||||
}
|
||||
, Quest { _questType = Warfare
|
||||
, _questTitle = "Confront the Xanathar"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 1 [Cleric]
|
||||
returnResources 4 [Fighter]
|
||||
returnResources 2 [Rogue]
|
||||
returnResources 1 [Wizard]
|
||||
, _questReward = do
|
||||
scorePoints 20
|
||||
takeResources 2 [Gold]
|
||||
, _questPlotActions = []
|
||||
}
|
||||
, Quest { _questType = Warfare
|
||||
, _questTitle = "Defeat Uprising from Undermountain"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 1 [Cleric]
|
||||
returnResources 3 [Fighter]
|
||||
returnResources 1 [Rogue]
|
||||
returnResources 2 [Gold]
|
||||
, _questReward = do
|
||||
scorePoints 11
|
||||
takeResources 2 [Fighter]
|
||||
, _questPlotActions = []
|
||||
}
|
||||
, Quest { _questType = Skullduggery
|
||||
, _questTitle = "Place a Sleeper Agent in Skullport"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 1 [Fighter]
|
||||
returnResources 4 [Rogue]
|
||||
returnResources 1 [Wizard]
|
||||
, _questReward = do
|
||||
noAction
|
||||
, _questPlotActions =
|
||||
[(Whenever PlaysIntrigue, scorePoints 2)]
|
||||
}
|
||||
, Quest { _questType = Skullduggery
|
||||
, _questTitle = "Establish Shadow Thieves' Guild"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 1 [Fighter]
|
||||
returnResources 8 [Rogue]
|
||||
returnResources 1 [Wizard]
|
||||
, _questReward = do
|
||||
scorePoints 25
|
||||
, _questPlotActions = []
|
||||
}
|
||||
, Quest { _questType = Skullduggery
|
||||
, _questTitle = "Build a Reputation in Skullport"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 1 [Fighter]
|
||||
returnResources 3 [Rogue]
|
||||
returnResources 4 [Gold]
|
||||
, _questReward = do
|
||||
scorePoints 10
|
||||
drawIntrigue
|
||||
, _questPlotActions = []
|
||||
}
|
||||
, Quest { _questType = Skullduggery
|
||||
, _questTitle = "Fence Goods for Duke of Darkness"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 1 [Fighter]
|
||||
returnResources 3 [Rogue]
|
||||
returnResources 4 [Gold]
|
||||
, _questReward = do
|
||||
scorePoints 6
|
||||
, _questPlotActions =
|
||||
[(Whenever (ActionProvides [Rogue]), takeResources 2 [Gold])]
|
||||
}
|
||||
, Quest { _questType = Skullduggery
|
||||
, _questTitle = "Raid on Undermountain"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 1 [Cleric]
|
||||
returnResources 2 [Fighter]
|
||||
returnResources 4 [Rogue]
|
||||
returnResources 1 [Wizard]
|
||||
, _questReward = do
|
||||
scorePoints 20
|
||||
takeResources 2 [Gold]
|
||||
, _questPlotActions = []
|
||||
}
|
||||
, Quest { _questType = Skullduggery
|
||||
, _questTitle = "Steal from House Adarbrent"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 1 [Fighter]
|
||||
returnResources 4 [Rogue]
|
||||
returnResources 1 [Wizard]
|
||||
, _questReward = do
|
||||
scorePoints 10
|
||||
takeResources 6 [Gold]
|
||||
, _questPlotActions = []
|
||||
}
|
||||
, Quest { _questType = Skullduggery
|
||||
, _questTitle = "Prison Break"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 4 [Rogue]
|
||||
returnResources 2 [Wizard]
|
||||
returnResources 2 [Gold]
|
||||
, _questReward = do
|
||||
scorePoints 14
|
||||
takeResources 2 [Fighter]
|
||||
playIntrigue
|
||||
, _questPlotActions = []
|
||||
}
|
||||
, Quest { _questType = Skullduggery
|
||||
, _questTitle = "Take Over Rival Organization"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 1 [Fighter]
|
||||
returnResources 2 [Rogue]
|
||||
returnResources 1 [Wizard]
|
||||
returnResources 6 [Gold]
|
||||
, _questReward = do
|
||||
scorePoints 10
|
||||
takeResources 4 [Rogue]
|
||||
playIntrigue
|
||||
, _questPlotActions = []
|
||||
}
|
||||
, Quest { _questType = Skullduggery
|
||||
, _questTitle = "Procure Stolen Goods"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 3 [Rogue]
|
||||
returnResources 6 [Gold]
|
||||
, _questReward = do
|
||||
scorePoints 8
|
||||
drawIntrigue
|
||||
drawIntrigue
|
||||
, _questPlotActions = []
|
||||
}
|
||||
, Quest { _questType = Skullduggery
|
||||
, _questTitle = "Establish Harpers Safe House"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 2 [Fighter]
|
||||
returnResources 3 [Rogue]
|
||||
returnResources 2 [Gold]
|
||||
, _questReward = do
|
||||
scorePoints 8
|
||||
forEachControlledBuilding $
|
||||
scorePoints 2
|
||||
, _questPlotActions = []
|
||||
}
|
||||
, Quest { _questType = Skullduggery
|
||||
, _questTitle = "Expose Cult Corruption"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 1 [Cleric]
|
||||
returnResources 4 [Rogue]
|
||||
, _questReward = do
|
||||
scorePoints 4
|
||||
takeResources 2 [Cleric]
|
||||
, _questPlotActions = []
|
||||
}
|
||||
, Quest { _questType = Skullduggery
|
||||
, _questTitle = "Install a Spy in Castle Waterdeep"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 4 [Rogue]
|
||||
returnResources 4 [Gold]
|
||||
, _questReward = do
|
||||
scorePoints 8
|
||||
, _questPlotActions =
|
||||
[(Whenever (CompletesQuest [Skullduggery]), scorePoints 2)]
|
||||
}
|
||||
, 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]
|
||||
, _questReward = do
|
||||
scorePoints 20
|
||||
drawIntrigue
|
||||
, _questPlotActions = []
|
||||
}
|
||||
, Quest { _questType = Arcana
|
||||
, _questTitle = "Host Festival for Sune"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 2 [Fighter]
|
||||
returnResources 2 [Wizard]
|
||||
returnResources 4 [Gold]
|
||||
, _questReward = do
|
||||
scorePoints 9
|
||||
takeResources 2 [Cleric]
|
||||
, _questPlotActions = []
|
||||
}
|
||||
, Quest { _questType = Arcana
|
||||
, _questTitle = "Steal Spellbook from Silverhand"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 1 [Fighter]
|
||||
returnResources 2 [Rogue]
|
||||
returnResources 2 [Wizard]
|
||||
, _questReward = do
|
||||
scorePoints 7
|
||||
drawIntrigue
|
||||
drawIntrigue
|
||||
takeResources 4 [Gold]
|
||||
, _questPlotActions = []
|
||||
}
|
||||
, Quest { _questType = Arcana
|
||||
, _questTitle = "Recruit for Blackstaff Academy"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 1 [Fighter]
|
||||
returnResources 1 [Rogue]
|
||||
returnResources 2 [Wizard]
|
||||
returnResources 4 [Gold]
|
||||
, _questReward = do
|
||||
scorePoints 6
|
||||
takeResources 3 [Wizard]
|
||||
, _questPlotActions = []
|
||||
}
|
||||
, Quest { _questType = Arcana
|
||||
, _questTitle = "Retrieve Ancient Artifacts"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 2 [Fighter]
|
||||
returnResources 1 [Rogue]
|
||||
returnResources 2 [Wizard]
|
||||
, _questReward = do
|
||||
scorePoints 11
|
||||
takeResources 4 [Gold]
|
||||
, _questPlotActions = []
|
||||
}
|
||||
, Quest { _questType = Arcana
|
||||
, _questTitle = "Recover the Magister's Orb"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 3 [Rogue]
|
||||
returnResources 2 [Wizard]
|
||||
, _questReward = do
|
||||
scorePoints 6
|
||||
enableAssignOnceToOpponentsSpace
|
||||
, _questPlotActions =
|
||||
[(StartOfRound, enableAssignOnceToOpponentsSpace)]
|
||||
}
|
||||
, Quest { _questType = Arcana
|
||||
, _questTitle = "Study the Illusk Arch"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 1 [Cleric]
|
||||
returnResources 2 [Wizard]
|
||||
, _questReward = do
|
||||
scorePoints 8
|
||||
, _questPlotActions =
|
||||
[(Whenever (CompletesQuest [Arcana]), scorePoints 2)]
|
||||
}
|
||||
, Quest { _questType = Arcana
|
||||
, _questTitle = "Explore Ahghairon's Tower"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 1 [Fighter]
|
||||
returnResources 2 [Wizard]
|
||||
returnResources 2 [Gold]
|
||||
, _questReward = do
|
||||
scorePoints 6
|
||||
, _questPlotActions =
|
||||
[(Whenever (ActionProvides [Wizard]), drawIntrigue)]
|
||||
}
|
||||
, Quest { _questType = Arcana
|
||||
, _questTitle = "Infiltrate Halaster's Circle"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 5 [Wizard]
|
||||
returnResources 2 [Gold]
|
||||
, _questReward = do
|
||||
scorePoints 25
|
||||
, _questPlotActions = []
|
||||
}
|
||||
, Quest { _questType = Arcana
|
||||
, _questTitle = "Domesticate Owlbears"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 1 [Cleric]
|
||||
returnResources 2 [Wizard]
|
||||
, _questReward = do
|
||||
scorePoints 8
|
||||
takeResources 1 [Fighter]
|
||||
takeResources 2 [Gold]
|
||||
, _questPlotActions = []
|
||||
}
|
||||
, Quest { _questType = Arcana
|
||||
, _questTitle = "Investigate Aberrant Infestation"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 1 [Cleric]
|
||||
returnResources 1 [Fighter]
|
||||
returnResources 2 [Wizard]
|
||||
, _questReward = do
|
||||
scorePoints 13
|
||||
drawIntrigue
|
||||
, _questPlotActions = []
|
||||
}
|
||||
, Quest { _questType = Arcana
|
||||
, _questTitle = "Research Chronomancy"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 2 [Wizard]
|
||||
returnResources 4 [Gold]
|
||||
, _questReward = do
|
||||
scorePoints 4
|
||||
takeResources 1 [Wizard]
|
||||
returnAgent
|
||||
, _questPlotActions = []
|
||||
}
|
||||
, Quest { _questType = Commerce
|
||||
, _questTitle = "Infiltrate Builder's Hall"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 2 [Fighter]
|
||||
returnResources 2 [Rogue]
|
||||
returnResources 4 [Gold]
|
||||
, _questReward = do
|
||||
scorePoints 6
|
||||
, _questPlotActions =
|
||||
[(Whenever BuysBuilding, scorePoints 4)]
|
||||
}
|
||||
, Quest { _questType = Commerce
|
||||
, _questTitle = "Loot the Crypt of Chauntea"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 1 [Cleric]
|
||||
returnResources 3 [Rogue]
|
||||
returnResources 2 [Gold]
|
||||
, _questReward = do
|
||||
scorePoints 7
|
||||
drawIntrigue
|
||||
drawQuest
|
||||
, _questPlotActions = []
|
||||
}
|
||||
, 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]
|
||||
, _questReward = do
|
||||
scorePoints 18
|
||||
drawIntrigue
|
||||
drawIntrigue
|
||||
, _questPlotActions = []
|
||||
}
|
||||
, Quest { _questType = Commerce
|
||||
, _questTitle = "Safeguard Eltorchul Mage"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 1 [Fighter]
|
||||
returnResources 1 [Rogue]
|
||||
returnResources 1 [Wizard]
|
||||
returnResources 4 [Gold]
|
||||
, _questReward = do
|
||||
scorePoints 4
|
||||
takeResources 2 [Wizard]
|
||||
, _questPlotActions = []
|
||||
}
|
||||
, Quest { _questType = Commerce
|
||||
, _questTitle = "Thin the City Watch"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 1 [Cleric]
|
||||
returnResources 1 [Fighter]
|
||||
returnResources 1 [Rogue]
|
||||
returnResources 4 [Gold]
|
||||
, _questReward = do
|
||||
scorePoints 9
|
||||
takeResources 4 [Rogue]
|
||||
, _questPlotActions = []
|
||||
}
|
||||
, Quest { _questType = Commerce
|
||||
, _questTitle = "Bribe the Shipwrights"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 4 [Rogue]
|
||||
returnResources 1 [Wizard]
|
||||
returnResources 4 [Gold]
|
||||
, _questReward = do
|
||||
scorePoints 10
|
||||
, _questPlotActions =
|
||||
[(Whenever (ActionProvides [Gold]), takeResources 1 [Rogue])]
|
||||
}
|
||||
, Quest { _questType = Commerce
|
||||
, _questTitle = "Lure Artisans of Mirabar"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 1 [Cleric]
|
||||
returnResources 1 [Fighter]
|
||||
returnResources 1 [Rogue]
|
||||
, _questReward = do
|
||||
scorePoints 4
|
||||
chooseFreeBuilding
|
||||
, _questPlotActions = []
|
||||
}
|
||||
, Quest { _questType = Commerce
|
||||
, _questTitle = "Placate the Walking Statue"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 2 [Cleric]
|
||||
returnResources 2 [Rogue]
|
||||
, _questReward = do
|
||||
scorePoints 10
|
||||
drawFreeBuilding
|
||||
, _questPlotActions = []
|
||||
}
|
||||
, Quest { _questType = Commerce
|
||||
, _questTitle = "Establish New Merchant Guild"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 1 [Cleric]
|
||||
returnResources 2 [Fighter]
|
||||
returnResources 4 [Gold]
|
||||
, _questReward = do
|
||||
scorePoints 8
|
||||
, _questPlotActions =
|
||||
[(Whenever (CompletesQuest [Commerce]), scorePoints 2)]
|
||||
}
|
||||
, Quest { _questType = Commerce
|
||||
, _questTitle = "Send Aid to the Harpers"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 1 [Cleric]
|
||||
returnResources 1 [Fighter]
|
||||
returnResources 1 [Rogue]
|
||||
returnResources 4 [Gold]
|
||||
, _questReward = do
|
||||
scorePoints 15
|
||||
forOneOpponent $ takeResources 4 [Gold]
|
||||
, _questPlotActions = []
|
||||
}
|
||||
, Quest { _questType = Commerce
|
||||
, _questTitle = "Ally with House Thann"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 1 [Cleric]
|
||||
returnResources 3 [Rogue]
|
||||
returnResources 1 [Wizard]
|
||||
returnResources 8 [Gold]
|
||||
, _questReward = do
|
||||
scorePoints 25
|
||||
, _questPlotActions = []
|
||||
}
|
||||
, Quest { _questType = Commerce
|
||||
, _questTitle = "Spy on the House of Light"
|
||||
, _questQuote = ""
|
||||
, _questCost = do
|
||||
returnResources 3 [Fighter]
|
||||
returnResources 2 [Rogue]
|
||||
returnResources 2 [Gold]
|
||||
, _questReward = do
|
||||
scorePoints 6
|
||||
takeResources 6 [Gold]
|
||||
, _questPlotActions = []
|
||||
}
|
||||
]
|
||||
|
|
@ -39,7 +39,8 @@ module Waterdeep.Types
|
|||
, questType
|
||||
, questTitle
|
||||
, questQuote
|
||||
, questAction
|
||||
, questCost
|
||||
, questReward
|
||||
, questPlotActions
|
||||
, intrigueTitle
|
||||
, intrigueType
|
||||
|
|
@ -59,6 +60,7 @@ module Waterdeep.Types
|
|||
, playerAgentsInPool
|
||||
, playerHasLieutenant
|
||||
, playerHasAmbassador
|
||||
, playerCanUseOpSpace
|
||||
, building
|
||||
, buildingAgents
|
||||
, buildingOwner
|
||||
|
|
@ -156,7 +158,8 @@ data Quest =
|
|||
{ _questType :: QuestType
|
||||
, _questTitle :: String
|
||||
, _questQuote :: String
|
||||
, _questAction :: GameAction
|
||||
, _questCost :: GameAction
|
||||
, _questReward :: GameAction
|
||||
, _questPlotActions :: [(PlotCondition, GameAction)]
|
||||
}
|
||||
|
||||
|
|
@ -184,6 +187,7 @@ data PlayerState =
|
|||
, _playerAgentsInPool :: Int
|
||||
, _playerHasLieutenant :: Bool
|
||||
, _playerHasAmbassador :: Bool
|
||||
, _playerCanUseOpSpace :: Bool
|
||||
}
|
||||
|
||||
data BuildingState =
|
||||
|
|
@ -243,7 +247,8 @@ data PlotQualifier = ActionProvides [Resource]
|
|||
| BuysBuilding
|
||||
deriving (Eq,Show)
|
||||
|
||||
data PlotCondition = StartOfRound
|
||||
data PlotCondition = Immediately
|
||||
| StartOfRound
|
||||
| OncePerRound
|
||||
| OncePerRoundWhen PlotQualifier
|
||||
| Whenever PlotQualifier
|
||||
|
|
@ -356,6 +361,7 @@ newPlayerState i (name, faction, lord) =
|
|||
, _playerAgentsInPool = 0
|
||||
, _playerHasLieutenant = False
|
||||
, _playerHasAmbassador = False
|
||||
, _playerCanUseOpSpace = False
|
||||
}
|
||||
|
||||
newBuildingState :: PlayerID -> Building -> BuildingState
|
||||
|
|
|
|||
Loading…
Reference in New Issue