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 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

View File

@ -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

View File

@ -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

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
, 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