From c788c563faf963b125a350a4cd208cae2a750c72 Mon Sep 17 00:00:00 2001 From: Jesse McDonald Date: Sun, 11 May 2014 17:08:33 -0500 Subject: [PATCH] enter details for the cards in the Quest deck --- src/ConsoleUI.hs | 29 +- src/Waterdeep/Actions.hs | 40 ++- src/Waterdeep/Logic.hs | 5 +- src/Waterdeep/Quests.hs | 754 +++++++++++++++++++++++++++++++++++++++ src/Waterdeep/Types.hs | 12 +- 5 files changed, 795 insertions(+), 45 deletions(-) create mode 100644 src/Waterdeep/Quests.hs diff --git a/src/ConsoleUI.hs b/src/ConsoleUI.hs index 416e3c8..454116e 100755 --- a/src/ConsoleUI.hs +++ b/src/ConsoleUI.hs @@ -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 diff --git a/src/Waterdeep/Actions.hs b/src/Waterdeep/Actions.hs index 0696eb2..af458d2 100644 --- a/src/Waterdeep/Actions.hs +++ b/src/Waterdeep/Actions.hs @@ -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 diff --git a/src/Waterdeep/Logic.hs b/src/Waterdeep/Logic.hs index bdee97d..6f68ff0 100644 --- a/src/Waterdeep/Logic.hs +++ b/src/Waterdeep/Logic.hs @@ -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 diff --git a/src/Waterdeep/Quests.hs b/src/Waterdeep/Quests.hs new file mode 100644 index 0000000..956996e --- /dev/null +++ b/src/Waterdeep/Quests.hs @@ -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 = [] + } + ] diff --git a/src/Waterdeep/Types.hs b/src/Waterdeep/Types.hs index 2333c51..674c50c 100644 --- a/src/Waterdeep/Types.hs +++ b/src/Waterdeep/Types.hs @@ -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