enter details for the cards in the Quest deck

This commit is contained in:
Jesse D. McDonald 2014-05-11 17:08:33 -05:00
parent 349472da78
commit c788c563fa
5 changed files with 795 additions and 45 deletions

View File

@ -24,6 +24,7 @@ import System.Random.Shuffle
import Text.Printf import Text.Printf
import Waterdeep.Actions import Waterdeep.Actions
import Waterdeep.Logic import Waterdeep.Logic
import Waterdeep.Quests
import Waterdeep.Types import Waterdeep.Types
import Waterdeep.Util import Waterdeep.Util
@ -46,30 +47,6 @@ f2 = Faction "Pilots" Green
l2 = Lord "Princess Anastasia" "" (QuestBonus [Arcana, Warfare] 4) l2 = Lord "Princess Anastasia" "" (QuestBonus [Arcana, Warfare] 4)
p2 = ("Ned", f2, l2) 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 b1 = Building { _buildingCost = 6
, _buildingTitle = "Monastary" , _buildingTitle = "Monastary"
, _buildingAction = takeResources 2 [Cleric] , _buildingAction = takeResources 2 [Cleric]
@ -181,7 +158,7 @@ menuPrompt ref redraw (NotifyState w) = do
modifyIORef ref (gameState .~ w) modifyIORef ref (gameState .~ w)
redraw redraw
menuPrompt ref redraw (Broadcast s) = do menuPrompt ref redraw (Broadcast s) = do
modifyIORef ref (gameMessages %~ ((s:) . take 2)) modifyIORef ref (gameMessages %~ ((s:) . take 4))
redraw redraw
menuPrompt ref redraw prm@(SolicitChoice p t cs) = do menuPrompt ref redraw prm@(SolicitChoice p t cs) = do
let menuSize = length cs let menuSize = length cs
@ -220,7 +197,7 @@ printMenu cs = do
main :: IO () main :: IO ()
main = do 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 = [] }) ref <- newIORef (DisplayState { _gameState = w0, _gameMessages = [] })
Just (winners, w') <- runWaterdeepM (menuPrompt ref (drawState ref)) waterdeepGame w0 Just (winners, w') <- runWaterdeepM (menuPrompt ref (drawState ref)) waterdeepGame w0
let playerIDToName n = w0 ^. gamePlayerName n let playerIDToName n = w0 ^. gamePlayerName n

View File

@ -32,14 +32,15 @@ module Waterdeep.Actions
, gainAmbassador , gainAmbassador
, assignMandatoryQuest , assignMandatoryQuest
, becomeFirstPlayer , becomeFirstPlayer
, enableAssignOnceToOpponentsSpace
, forOneOpponent , forOneOpponent
, forEachOpponent , forEachOpponent
, forCurrentPlayer , forCurrentPlayer
, forEachBuilding
, forEachControlledBuilding
, restockCliffwatchInn , restockCliffwatchInn
, restockBuildersHall , restockBuildersHall
, getOpponents , getOpponents
, getNumberOfBuildings
, getNumberOfControlledBuildings
) where ) where
import Control.Applicative import Control.Applicative
@ -171,12 +172,13 @@ completeQuest = do
let choices = map (\(i,q) -> (q ^. questTitle, (i, q))) availQuests let choices = map (\(i,q) -> (q ^. questTitle, (i, q))) availQuests
(i, quest) <- solicitChoice "Complete one quest:" $ nubOn fst choices (i, quest) <- solicitChoice "Complete one quest:" $ nubOn fst choices
activePlayerState . playerIncompleteQuests %= deleteAt i activePlayerState . playerIncompleteQuests %= deleteAt i
quest ^. questAction quest ^. questCost
name <- use activePlayerName
broadcast $ name ++ " completed the " ++ (quest ^. questTitle) ++ " quest."
quest ^. questReward
if null (quest ^. questPlotActions) if null (quest ^. questPlotActions)
then activePlayerState . playerCompletedQuests <>= [quest] then activePlayerState . playerCompletedQuests <>= [quest]
else activePlayerState . playerActivePlotQuests <>= [quest] else activePlayerState . playerActivePlotQuests <>= [quest]
name <- use $ activePlayerName
broadcast $ name ++ " completed the " ++ (quest ^. questTitle) ++ " quest."
chooseAndCompleteQuest :: GameAction -> GameAction chooseAndCompleteQuest :: GameAction -> GameAction
chooseAndCompleteQuest bonusAction = do chooseAndCompleteQuest bonusAction = do
@ -187,12 +189,13 @@ chooseAndCompleteQuest bonusAction = do
True -> do True -> do
incompleteQuests <- use (activePlayerState . playerIncompleteQuests) incompleteQuests <- use (activePlayerState . playerIncompleteQuests)
guard . not . or $ map ((== Mandatory) . view questType) incompleteQuests 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) if null (quest ^. questPlotActions)
then activePlayerState . playerCompletedQuests <>= [quest] then activePlayerState . playerCompletedQuests <>= [quest]
else activePlayerState . playerActivePlotQuests <>= [quest] else activePlayerState . playerActivePlotQuests <>= [quest]
name <- use $ activePlayerName
broadcast $ name ++ " completed the " ++ (quest ^. questTitle) ++ " quest."
bonusAction bonusAction
False -> do False -> do
activePlayerState . playerIncompleteQuests <>= [quest] activePlayerState . playerIncompleteQuests <>= [quest]
@ -379,6 +382,10 @@ becomeFirstPlayer = do
name <- use $ activePlayerName name <- use $ activePlayerName
broadcast $ name ++ " is now the first player." broadcast $ name ++ " is now the first player."
enableAssignOnceToOpponentsSpace :: GameAction
enableAssignOnceToOpponentsSpace = do
activePlayerState . playerCanUseOpSpace .= True
forOneOpponent :: GameAction -> GameAction forOneOpponent :: GameAction -> GameAction
forOneOpponent a1 = do forOneOpponent a1 = do
opponents <- getOpponents opponents <- getOpponents
@ -469,14 +476,17 @@ getOpponents = do
p <- use gameActivePlayer p <- use gameActivePlayer
filter (\p1 -> (p1 ^. playerNumber) /= p) . toListOf traverse <$> use gamePlayerStates filter (\p1 -> (p1 ^. playerNumber) /= p) . toListOf traverse <$> use gamePlayerStates
getNumberOfBuildings :: Waterdeep Int forEachBuilding :: GameAction -> GameAction
getNumberOfBuildings = countOf traverse isOwned <$> use gameBuildings forEachBuilding m = do
advancedBuildings <- countOf traverse isAdvanced <$> use gameBuildings
replicateM_ advancedBuildings m
where where
isOwned b = b ^. buildingOwner /= noPlayerID isAdvanced b = b ^. buildingOwner /= noPlayerID
getNumberOfControlledBuildings :: Waterdeep Int forEachControlledBuilding :: GameAction -> GameAction
getNumberOfControlledBuildings = do forEachControlledBuilding m = do
p <- use gameActivePlayer p <- use gameActivePlayer
countOf traverse (`isOwnedBy` p) <$> use gameBuildings controlledBuildings <- countOf traverse (`isControlledBy` p) <$> use gameBuildings
replicateM_ controlledBuildings m
where where
b `isOwnedBy` p = b ^. buildingOwner == p b `isControlledBy` p = b ^. buildingOwner == p

View File

@ -118,8 +118,8 @@ waterdeepGame = do
when (passes < np) $ do when (passes < np) $ do
advanceToNextPlayer advanceToNextPlayer
loop loop
broadcast $ "Game over!"
scoreFinalPoints scoreFinalPoints
notifyState
determineWinners determineWinners
advanceToNextPlayer :: Waterdeep () advanceToNextPlayer :: Waterdeep ()
@ -144,9 +144,11 @@ beginRound round = do
activePlayerState . playerUsedPlotQuests .= [] activePlayerState . playerUsedPlotQuests .= []
activePlayerState . playerActivePlotQuests <>= qs activePlayerState . playerActivePlotQuests <>= qs
activePlayerState . playerAgentsInPool .= agents activePlayerState . playerAgentsInPool .= agents
activePlayerState . playerCanUseOpSpace .= False
use (activePlayerState . playerHasLieutenant) >>= \case use (activePlayerState . playerHasLieutenant) >>= \case
True -> activePlayerState . playerAgentsInPool += 1 >> return () True -> activePlayerState . playerAgentsInPool += 1 >> return ()
False -> return () False -> return ()
--TODO: Start-of-round plot actions
scoreFinalPoints :: Waterdeep () scoreFinalPoints :: Waterdeep ()
scoreFinalPoints = do scoreFinalPoints = do
@ -184,6 +186,7 @@ determineWinners = do
let winners1 = filter ((== bestScore) . view playerScore) playerStates let winners1 = filter ((== bestScore) . view playerScore) playerStates
let bestGold = maximum $ map playerGold winners1 let bestGold = maximum $ map playerGold winners1
let winners2 = filter ((== bestGold) . playerGold) winners1 let winners2 = filter ((== bestGold) . playerGold) winners1
broadcast $ "Winners: " ++ (intercalate ", " (winners2 ^.. traverse . playerName))
return (winners2 ^.. traverse . playerNumber) return (winners2 ^.. traverse . playerNumber)
where where
playerGold = MS.occur Gold . view playerTavern playerGold = MS.occur Gold . view playerTavern

754
src/Waterdeep/Quests.hs Normal file
View File

@ -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 = []
}
]

View File

@ -39,7 +39,8 @@ module Waterdeep.Types
, questType , questType
, questTitle , questTitle
, questQuote , questQuote
, questAction , questCost
, questReward
, questPlotActions , questPlotActions
, intrigueTitle , intrigueTitle
, intrigueType , intrigueType
@ -59,6 +60,7 @@ module Waterdeep.Types
, playerAgentsInPool , playerAgentsInPool
, playerHasLieutenant , playerHasLieutenant
, playerHasAmbassador , playerHasAmbassador
, playerCanUseOpSpace
, building , building
, buildingAgents , buildingAgents
, buildingOwner , buildingOwner
@ -156,7 +158,8 @@ data Quest =
{ _questType :: QuestType { _questType :: QuestType
, _questTitle :: String , _questTitle :: String
, _questQuote :: String , _questQuote :: String
, _questAction :: GameAction , _questCost :: GameAction
, _questReward :: GameAction
, _questPlotActions :: [(PlotCondition, GameAction)] , _questPlotActions :: [(PlotCondition, GameAction)]
} }
@ -184,6 +187,7 @@ data PlayerState =
, _playerAgentsInPool :: Int , _playerAgentsInPool :: Int
, _playerHasLieutenant :: Bool , _playerHasLieutenant :: Bool
, _playerHasAmbassador :: Bool , _playerHasAmbassador :: Bool
, _playerCanUseOpSpace :: Bool
} }
data BuildingState = data BuildingState =
@ -243,7 +247,8 @@ data PlotQualifier = ActionProvides [Resource]
| BuysBuilding | BuysBuilding
deriving (Eq,Show) deriving (Eq,Show)
data PlotCondition = StartOfRound data PlotCondition = Immediately
| StartOfRound
| OncePerRound | OncePerRound
| OncePerRoundWhen PlotQualifier | OncePerRoundWhen PlotQualifier
| Whenever PlotQualifier | Whenever PlotQualifier
@ -356,6 +361,7 @@ newPlayerState i (name, faction, lord) =
, _playerAgentsInPool = 0 , _playerAgentsInPool = 0
, _playerHasLieutenant = False , _playerHasLieutenant = False
, _playerHasAmbassador = False , _playerHasAmbassador = False
, _playerCanUseOpSpace = False
} }
newBuildingState :: PlayerID -> Building -> BuildingState newBuildingState :: PlayerID -> Building -> BuildingState