enter details for the Building tiles
This commit is contained in:
parent
c788c563fa
commit
97aa7a53e4
|
|
@ -23,6 +23,7 @@ import System.Random
|
||||||
import System.Random.Shuffle
|
import System.Random.Shuffle
|
||||||
import Text.Printf
|
import Text.Printf
|
||||||
import Waterdeep.Actions
|
import Waterdeep.Actions
|
||||||
|
import Waterdeep.Buildings
|
||||||
import Waterdeep.Logic
|
import Waterdeep.Logic
|
||||||
import Waterdeep.Quests
|
import Waterdeep.Quests
|
||||||
import Waterdeep.Types
|
import Waterdeep.Types
|
||||||
|
|
@ -47,41 +48,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)
|
||||||
|
|
||||||
b1 = Building { _buildingCost = 6
|
|
||||||
, _buildingTitle = "Monastary"
|
|
||||||
, _buildingAction = takeResources 2 [Cleric]
|
|
||||||
, _buildingOwnerAction = takeResources 1 [Cleric]
|
|
||||||
, _buildingAccumType = NoAccumulation
|
|
||||||
}
|
|
||||||
|
|
||||||
b2 = Building { _buildingCost = 4
|
|
||||||
, _buildingTitle = "Training Hall"
|
|
||||||
, _buildingAction = takeResources 2 [Fighter]
|
|
||||||
, _buildingOwnerAction = takeResources 1 [Fighter]
|
|
||||||
, _buildingAccumType = NoAccumulation
|
|
||||||
}
|
|
||||||
|
|
||||||
b3 = Building { _buildingCost = 4
|
|
||||||
, _buildingTitle = "Prison Yard"
|
|
||||||
, _buildingAction = takeResources 2 [Rogue]
|
|
||||||
, _buildingOwnerAction = takeResources 1 [Rogue]
|
|
||||||
, _buildingAccumType = NoAccumulation
|
|
||||||
}
|
|
||||||
|
|
||||||
b4 = Building { _buildingCost = 6
|
|
||||||
, _buildingTitle = "Wizard School"
|
|
||||||
, _buildingAction = takeResources 2 [Wizard]
|
|
||||||
, _buildingOwnerAction = takeResources 1 [Wizard]
|
|
||||||
, _buildingAccumType = NoAccumulation
|
|
||||||
}
|
|
||||||
|
|
||||||
b5 = Building { _buildingCost = 4
|
|
||||||
, _buildingTitle = "Gold Mine"
|
|
||||||
, _buildingAction = takeResources 4 [Gold]
|
|
||||||
, _buildingOwnerAction = takeResources 2 [Gold]
|
|
||||||
, _buildingAccumType = NoAccumulation
|
|
||||||
}
|
|
||||||
|
|
||||||
i1 = IntrigueCard { _intrigueTitle = "Graduation Day"
|
i1 = IntrigueCard { _intrigueTitle = "Graduation Day"
|
||||||
, _intrigueType = Utility
|
, _intrigueType = Utility
|
||||||
, _intrigueAction = do
|
, _intrigueAction = do
|
||||||
|
|
@ -197,8 +163,7 @@ printMenu cs = do
|
||||||
|
|
||||||
main :: IO ()
|
main :: IO ()
|
||||||
main = do
|
main = do
|
||||||
w0 <- newGame [p1, p2] defaultQuestDeck (mrepeat 4 [i1, i2]) [b1, b2, b3, b4, b5] <$> getSplit
|
w0 <- newGame [p1, p2] defaultQuestDeck (mrepeat 4 [i1, i2]) defaultBuildingDeck <$> getSplit
|
||||||
ref <- newIORef (DisplayState { _gameState = w0, _gameMessages = [] })
|
ref <- newIORef (DisplayState { _gameState = w0, _gameMessages = [] })
|
||||||
Just (winners, w') <- runWaterdeepM (menuPrompt ref (drawState ref)) waterdeepGame w0
|
runWaterdeepM (menuPrompt ref (drawState ref)) waterdeepGame w0
|
||||||
let playerIDToName n = w0 ^. gamePlayerName n
|
return ()
|
||||||
putStrLn ("Winner(s): " ++ intercalate ", " (winners ^.. traverse . to playerIDToName))
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,214 @@
|
||||||
|
module Waterdeep.Buildings
|
||||||
|
( basicBuildings
|
||||||
|
, defaultBuildingDeck
|
||||||
|
) 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
|
||||||
|
|
||||||
|
basicBuildings :: [Building]
|
||||||
|
basicBuildings =
|
||||||
|
[ basicBuilding "Aurora's Realms Shop" (takeResources 4 [Gold])
|
||||||
|
, basicBuilding "Blackstaff Tower" (takeResources 1 [Wizard])
|
||||||
|
, basicBuilding "Builder's Hall" buyBuilding
|
||||||
|
, basicBuilding "Castle Waterdeep" (becomeFirstPlayer >> drawIntrigue)
|
||||||
|
, basicBuilding "Field of Triumph" (takeResources 2 [Fighter])
|
||||||
|
, basicBuilding "The Grinning Lion Tavern" (takeResources 2 [Rogue])
|
||||||
|
, basicBuilding "The Plinth" (takeResources 1 [Cleric])
|
||||||
|
, basicBuilding "Cliffwatch Inn (2 Gold)" (chooseQuest >> takeResources 2 [Gold])
|
||||||
|
, basicBuilding "Cliffwatch Inn (Intrigue)" (chooseQuest >> drawIntrigue)
|
||||||
|
, basicBuilding "Cliffwatch Inn (Reset)" (replaceQuests >> chooseQuest)
|
||||||
|
]
|
||||||
|
|
||||||
|
basicBuilding :: String -> GameAction -> Building
|
||||||
|
basicBuilding title action =
|
||||||
|
Building
|
||||||
|
{ _buildingCost = 0
|
||||||
|
, _buildingTitle = title
|
||||||
|
, _buildingAction = action
|
||||||
|
, _buildingOwnerAction = noAction
|
||||||
|
, _buildingAccumType = NoAccumulation
|
||||||
|
}
|
||||||
|
|
||||||
|
defaultBuildingDeck :: [Building]
|
||||||
|
defaultBuildingDeck =
|
||||||
|
[ Building { _buildingCost = 4
|
||||||
|
, _buildingTitle = "The Palace of Waterdeep"
|
||||||
|
, _buildingAction = gainAmbassador
|
||||||
|
, _buildingOwnerAction = scorePoints 2
|
||||||
|
, _buildingAccumType = NoAccumulation
|
||||||
|
}
|
||||||
|
, Building { _buildingCost = 4
|
||||||
|
, _buildingTitle = "Heroes' Garden"
|
||||||
|
, _buildingAction = chooseAndCompleteQuest $ scorePoints 4
|
||||||
|
, _buildingOwnerAction = scorePoints 2
|
||||||
|
, _buildingAccumType = NoAccumulation
|
||||||
|
}
|
||||||
|
, Building { _buildingCost = 4
|
||||||
|
, _buildingTitle = "The Golden Horn"
|
||||||
|
, _buildingAction = noAction
|
||||||
|
, _buildingOwnerAction = takeResources 2 [Gold]
|
||||||
|
, _buildingAccumType = AccumulateResource Gold 4
|
||||||
|
}
|
||||||
|
, Building { _buildingCost = 4
|
||||||
|
, _buildingTitle = "The Waymoot"
|
||||||
|
, _buildingAction = chooseQuest
|
||||||
|
, _buildingOwnerAction = scorePoints 2
|
||||||
|
, _buildingAccumType = AccumulatePoints 3
|
||||||
|
}
|
||||||
|
, Building { _buildingCost = 3
|
||||||
|
, _buildingTitle = "House of Good Spirits"
|
||||||
|
, _buildingAction = do
|
||||||
|
takeResources 1 [Fighter]
|
||||||
|
takeResources 1 [Cleric, Fighter, Rogue, Wizard]
|
||||||
|
, _buildingOwnerAction = takeResources 1 [Fighter]
|
||||||
|
, _buildingAccumType = NoAccumulation
|
||||||
|
}
|
||||||
|
, Building { _buildingCost = 3
|
||||||
|
, _buildingTitle = "Helmstar Warehouse"
|
||||||
|
, _buildingAction = do
|
||||||
|
takeResources 2 [Rogue]
|
||||||
|
takeResources 2 [Gold]
|
||||||
|
, _buildingOwnerAction = takeResources 1 [Rogue]
|
||||||
|
, _buildingAccumType = NoAccumulation
|
||||||
|
}
|
||||||
|
, Building { _buildingCost = 4
|
||||||
|
, _buildingTitle = "Smuggler's Dock"
|
||||||
|
, _buildingAction = do
|
||||||
|
returnResources 2 [Gold]
|
||||||
|
takeResources 4 [Fighter, Rogue]
|
||||||
|
, _buildingOwnerAction = takeResources 2 [Gold]
|
||||||
|
, _buildingAccumType = NoAccumulation
|
||||||
|
}
|
||||||
|
, Building { _buildingCost = 4
|
||||||
|
, _buildingTitle = "House of Wonder"
|
||||||
|
, _buildingAction = do
|
||||||
|
returnResources 2 [Gold]
|
||||||
|
takeResources 2 [Cleric, Wizard]
|
||||||
|
, _buildingOwnerAction = takeResources 2 [Gold]
|
||||||
|
, _buildingAccumType = NoAccumulation
|
||||||
|
}
|
||||||
|
, Building { _buildingCost = 4
|
||||||
|
, _buildingTitle = "The Three Pearls"
|
||||||
|
, _buildingAction = do
|
||||||
|
returnResources 2 [Cleric, Fighter, Rogue, Wizard]
|
||||||
|
takeResources 3 [Cleric, Fighter, Rogue, Wizard]
|
||||||
|
, _buildingOwnerAction = takeResources 2 [Gold]
|
||||||
|
, _buildingAccumType = NoAccumulation
|
||||||
|
}
|
||||||
|
, Building { _buildingCost = 8
|
||||||
|
, _buildingTitle = "The Zoarstar"
|
||||||
|
, _buildingAction = do
|
||||||
|
useOpponentsSpace
|
||||||
|
, _buildingOwnerAction = scorePoints 2
|
||||||
|
, _buildingAccumType = NoAccumulation
|
||||||
|
}
|
||||||
|
, Building { _buildingCost = 4
|
||||||
|
, _buildingTitle = "The Stone House"
|
||||||
|
, _buildingAction = do
|
||||||
|
forEachBuilding $ takeResources 1 [Gold]
|
||||||
|
, _buildingOwnerAction = takeResources 2 [Gold]
|
||||||
|
, _buildingAccumType = NoAccumulation
|
||||||
|
}
|
||||||
|
, Building { _buildingCost = 8
|
||||||
|
, _buildingTitle = "Fetlock Court"
|
||||||
|
, _buildingAction = do
|
||||||
|
takeResources 2 [Fighter]
|
||||||
|
takeResources 1 [Wizard]
|
||||||
|
, _buildingOwnerAction = takeResources 1 [Fighter, Wizard]
|
||||||
|
, _buildingAccumType = NoAccumulation
|
||||||
|
}
|
||||||
|
, Building { _buildingCost = 4
|
||||||
|
, _buildingTitle = "The Yawning Portal"
|
||||||
|
, _buildingAction = do
|
||||||
|
takeResources 2 [Cleric, Fighter, Rogue, Wizard]
|
||||||
|
, _buildingOwnerAction = takeResources 1 [Cleric, Fighter, Rogue, Wizard]
|
||||||
|
, _buildingAccumType = NoAccumulation
|
||||||
|
}
|
||||||
|
, Building { _buildingCost = 8
|
||||||
|
, _buildingTitle = "House of Heroes"
|
||||||
|
, _buildingAction = do
|
||||||
|
takeResources 1 [Cleric]
|
||||||
|
takeResources 2 [Fighter]
|
||||||
|
, _buildingOwnerAction = takeResources 1 [Cleric, Fighter]
|
||||||
|
, _buildingAccumType = NoAccumulation
|
||||||
|
}
|
||||||
|
, Building { _buildingCost = 8
|
||||||
|
, _buildingTitle = "The Tower of Luck"
|
||||||
|
, _buildingAction = do
|
||||||
|
takeResources 1 [Cleric]
|
||||||
|
takeResources 2 [Rogue]
|
||||||
|
, _buildingOwnerAction = takeResources 1 [Cleric, Rogue]
|
||||||
|
, _buildingAccumType = NoAccumulation
|
||||||
|
}
|
||||||
|
, Building { _buildingCost = 4
|
||||||
|
, _buildingTitle = "Jester's Court"
|
||||||
|
, _buildingAction = noAction
|
||||||
|
, _buildingOwnerAction = takeResources 1 [Rogue]
|
||||||
|
, _buildingAccumType = AccumulateResource Rogue 2
|
||||||
|
}
|
||||||
|
, Building { _buildingCost = 4
|
||||||
|
, _buildingTitle = "Caravan Court"
|
||||||
|
, _buildingAction = noAction
|
||||||
|
, _buildingOwnerAction = takeResources 1 [Fighter]
|
||||||
|
, _buildingAccumType = AccumulateResource Fighter 2
|
||||||
|
}
|
||||||
|
, Building { _buildingCost = 4
|
||||||
|
, _buildingTitle = "Spires of the Morning"
|
||||||
|
, _buildingAction = noAction
|
||||||
|
, _buildingOwnerAction = scorePoints 2
|
||||||
|
, _buildingAccumType = AccumulateResource Cleric 1
|
||||||
|
}
|
||||||
|
, Building { _buildingCost = 8
|
||||||
|
, _buildingTitle = "New Olamn"
|
||||||
|
, _buildingAction = do
|
||||||
|
takeResources 2 [Rogue]
|
||||||
|
takeResources 1 [Wizard]
|
||||||
|
, _buildingOwnerAction = takeResources 1 [Rogue, Wizard]
|
||||||
|
, _buildingAccumType = NoAccumulation
|
||||||
|
}
|
||||||
|
, Building { _buildingCost = 4
|
||||||
|
, _buildingTitle = "Tower of the Order"
|
||||||
|
, _buildingAction = noAction
|
||||||
|
, _buildingOwnerAction = drawIntrigue
|
||||||
|
, _buildingAccumType = AccumulateResource Wizard 1
|
||||||
|
}
|
||||||
|
, Building { _buildingCost = 3
|
||||||
|
, _buildingTitle = "Dragon Tower"
|
||||||
|
, _buildingAction = do
|
||||||
|
takeResources 1 [Wizard]
|
||||||
|
drawIntrigue
|
||||||
|
, _buildingOwnerAction = drawIntrigue
|
||||||
|
, _buildingAccumType = NoAccumulation
|
||||||
|
}
|
||||||
|
, Building { _buildingCost = 3
|
||||||
|
, _buildingTitle = "House of the Moon"
|
||||||
|
, _buildingAction = do
|
||||||
|
takeResources 1 [Cleric]
|
||||||
|
chooseQuest
|
||||||
|
, _buildingOwnerAction = takeResources 2 [Gold]
|
||||||
|
, _buildingAccumType = NoAccumulation
|
||||||
|
}
|
||||||
|
, Building { _buildingCost = 3
|
||||||
|
, _buildingTitle = "Northgate"
|
||||||
|
, _buildingAction = do
|
||||||
|
takeResources 1 [Cleric, Fighter, Rogue, Wizard]
|
||||||
|
takeResources 2 [Gold]
|
||||||
|
, _buildingOwnerAction = scorePoints 2
|
||||||
|
, _buildingAccumType = NoAccumulation
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
@ -25,6 +25,7 @@ import Lens.Family2.Stock
|
||||||
import System.Random.Shuffle
|
import System.Random.Shuffle
|
||||||
import Text.Printf
|
import Text.Printf
|
||||||
import Waterdeep.Actions
|
import Waterdeep.Actions
|
||||||
|
import Waterdeep.Buildings (basicBuildings)
|
||||||
import Waterdeep.Types
|
import Waterdeep.Types
|
||||||
import Waterdeep.Util
|
import Waterdeep.Util
|
||||||
|
|
||||||
|
|
@ -64,30 +65,6 @@ newGame players quests intrigues buildings rndgen =
|
||||||
buildingStates = zipWith (\i b -> (i, newBuildingState np b)) [1..] basicBuildings
|
buildingStates = zipWith (\i b -> (i, newBuildingState np b)) [1..] basicBuildings
|
||||||
np = noPlayerID
|
np = noPlayerID
|
||||||
|
|
||||||
basicBuildings :: [Building]
|
|
||||||
basicBuildings =
|
|
||||||
[ basicBuilding "Aurora's Realms Shop" (takeResources 4 [Gold])
|
|
||||||
, basicBuilding "Blackstaff Tower" (takeResources 1 [Wizard])
|
|
||||||
, basicBuilding "Builder's Hall" buyBuilding
|
|
||||||
, basicBuilding "Castle Waterdeep" (becomeFirstPlayer >> drawIntrigue)
|
|
||||||
, basicBuilding "Field of Triumph" (takeResources 2 [Fighter])
|
|
||||||
, basicBuilding "The Grinning Lion Tavern" (takeResources 2 [Rogue])
|
|
||||||
, basicBuilding "The Plinth" (takeResources 1 [Cleric])
|
|
||||||
, basicBuilding "Cliffwatch Inn (2 Gold)" (chooseQuest >> takeResources 2 [Gold])
|
|
||||||
, basicBuilding "Cliffwatch Inn (Intrigue)" (chooseQuest >> drawIntrigue)
|
|
||||||
, basicBuilding "Cliffwatch Inn (Reset)" (replaceQuests >> chooseQuest)
|
|
||||||
]
|
|
||||||
|
|
||||||
basicBuilding :: String -> GameAction -> Building
|
|
||||||
basicBuilding title action =
|
|
||||||
Building
|
|
||||||
{ _buildingCost = 0
|
|
||||||
, _buildingTitle = title
|
|
||||||
, _buildingAction = action
|
|
||||||
, _buildingOwnerAction = noAction
|
|
||||||
, _buildingAccumType = NoAccumulation
|
|
||||||
}
|
|
||||||
|
|
||||||
waterdeepGame :: Waterdeep [PlayerID]
|
waterdeepGame :: Waterdeep [PlayerID]
|
||||||
waterdeepGame = do
|
waterdeepGame = do
|
||||||
np <- use gameNumberOfPlayers
|
np <- use gameNumberOfPlayers
|
||||||
|
|
@ -186,7 +163,9 @@ 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))
|
if null (drop 1 winners2)
|
||||||
|
then broadcast $ "Winner: " ++ (head winners2 ^. playerName)
|
||||||
|
else 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
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue