make newGame a pure function
This commit is contained in:
parent
6acc6a150b
commit
f7b7a6dc00
|
|
@ -8,6 +8,7 @@ import Control.Applicative
|
||||||
import Control.Lens
|
import Control.Lens
|
||||||
import Control.Monad
|
import Control.Monad
|
||||||
import Control.Monad.Prompt
|
import Control.Monad.Prompt
|
||||||
|
import Control.Monad.Random
|
||||||
import Control.Monad.State
|
import Control.Monad.State
|
||||||
import Data.List
|
import Data.List
|
||||||
import Text.Printf
|
import Text.Printf
|
||||||
|
|
@ -141,7 +142,8 @@ menuPrompt prm@(SolicitChoice w p t cs) = do
|
||||||
|
|
||||||
main :: IO ()
|
main :: IO ()
|
||||||
main = do
|
main = do
|
||||||
w <- newGame [p1, p2] [q1, q2] [] [b1, b2, b3, b4, b5]
|
g <- getSplit
|
||||||
|
let w = newGame [p1, p2] [q1, q2] [] [b1, b2, b3, b4, b5] g
|
||||||
let gamePlayerName n = w ^. gamePlayer n . playerName
|
let gamePlayerName n = w ^. gamePlayer n . playerName
|
||||||
(winners, w') <- runWaterdeepM menuPrompt waterdeepGame w
|
(winners, w') <- runWaterdeepM menuPrompt waterdeepGame w
|
||||||
putStrLn ("Winner(s): " ++ intercalate ", " (winners ^.. traverse . to gamePlayerName))
|
putStrLn ("Winner(s): " ++ intercalate ", " (winners ^.. traverse . to gamePlayerName))
|
||||||
|
|
|
||||||
|
|
@ -23,58 +23,40 @@ import Waterdeep.Monad
|
||||||
import qualified Data.IntMap as IM
|
import qualified Data.IntMap as IM
|
||||||
import qualified Data.Map as M
|
import qualified Data.Map as M
|
||||||
|
|
||||||
newGame :: (MonadRandom m, MonadSplit StdGen m)
|
newGame :: [(String,Faction,Lord)]
|
||||||
=> [(String,Faction,Lord)]
|
|
||||||
-> [Quest]
|
-> [Quest]
|
||||||
-> [IntrigueCard]
|
-> [IntrigueCard]
|
||||||
-> [Building]
|
-> [Building]
|
||||||
-> m WaterdeepState
|
-> StdGen
|
||||||
newGame players quests intrigues buildings
|
-> WaterdeepState
|
||||||
| length players < 2 || length players > 5 = error "This game requires 2-5 players."
|
newGame players quests intrigues buildings rndgen
|
||||||
| otherwise = do
|
| length players < 2 || length players > 5 =
|
||||||
let playerStates = IM.fromList $ flip map (zip [1..] players) $
|
error "This game requires 2-5 players."
|
||||||
\(i,(n,f,l)) -> (i, newPlayerState i n f l)
|
| otherwise =
|
||||||
quests' <- shuffleM quests
|
WaterdeepState
|
||||||
intrigues' <- shuffleM intrigues
|
{ _gamePlayers = IM.fromAscList playerStates
|
||||||
buildings' <- shuffleM buildings
|
|
||||||
splitGen <- getSplit
|
|
||||||
return $ snd $ runWaterdeep batchMode setupGame $ WaterdeepState
|
|
||||||
{ _gamePlayers = playerStates
|
|
||||||
, _gameFirstPlayer = 1
|
, _gameFirstPlayer = 1
|
||||||
, _gameCurrentRound = 0
|
, _gameCurrentRound = 0
|
||||||
, _gameCurrentPlayer = 1
|
, _gameCurrentPlayer = noPlayerID
|
||||||
, _gameConsecutivePasses = 0
|
, _gameConsecutivePasses = 0
|
||||||
, _gameQuestDeck = quests'
|
, _gameQuestDeck = []
|
||||||
, _gameQuestDiscard = []
|
, _gameQuestDiscard = quests
|
||||||
, _gameCliffwatchInn = []
|
, _gameCliffwatchInn = []
|
||||||
, _gameIntrigueDeck = intrigues'
|
, _gameIntrigueDeck = []
|
||||||
, _gameIntrigueDiscard = []
|
, _gameIntrigueDiscard = intrigues
|
||||||
, _gameBuildingDeck = buildings'
|
, _gameBuildingDeck = []
|
||||||
, _gameBuildingDiscard = []
|
, _gameBuildingDiscard = buildings
|
||||||
, _gameBasicBuildings = map (newBuildingState noPlayerID) basicBuildings
|
, _gameBasicBuildings = map (newBuildingState noPlayerID) basicBuildings
|
||||||
, _gameBuildersHall = []
|
, _gameBuildersHall = []
|
||||||
, _gameAdvancedBuildings = []
|
, _gameAdvancedBuildings = []
|
||||||
, _gameWaterdeepHarbor = ([], [], [])
|
, _gameWaterdeepHarbor = ([], [], [])
|
||||||
, _gameStdGen = splitGen
|
, _gameStdGen = rndgen
|
||||||
}
|
}
|
||||||
where
|
where
|
||||||
batchMode :: WaterdeepPrompt a -> a
|
playerStates = [ (i, newPlayerState i p) | (i, p) <- zip [1..] players ]
|
||||||
batchMode (NotifyState _) = ()
|
|
||||||
batchMode (SolicitChoice _ _ _ _) = error "No choices during setup."
|
|
||||||
|
|
||||||
setupGame :: Waterdeep ()
|
newPlayerState :: PlayerID -> (String, Faction, Lord) -> PlayerState
|
||||||
setupGame = do
|
newPlayerState i (name, faction, lord) =
|
||||||
restockBuildersHall
|
|
||||||
restockCliffwatchInn
|
|
||||||
let ps = [1 .. length players]
|
|
||||||
forM_ (zip ps [4..]) $ \(p, g) -> do
|
|
||||||
replicateM_ 2 $ performAction p DrawQuest
|
|
||||||
replicateM_ 2 $ performAction p DrawIntrigue
|
|
||||||
replicateM_ g $ performAction p $ TakeResource [Gold]
|
|
||||||
return ()
|
|
||||||
|
|
||||||
newPlayerState :: PlayerID -> String -> Faction -> Lord -> PlayerState
|
|
||||||
newPlayerState i name faction lord =
|
|
||||||
PlayerState
|
PlayerState
|
||||||
{ _playerNumber = i
|
{ _playerNumber = i
|
||||||
, _playerName = name
|
, _playerName = name
|
||||||
|
|
@ -106,6 +88,13 @@ basicBuildings = []
|
||||||
|
|
||||||
waterdeepGame :: Waterdeep [PlayerID]
|
waterdeepGame :: Waterdeep [PlayerID]
|
||||||
waterdeepGame = do
|
waterdeepGame = do
|
||||||
|
ps <- sort . IM.keys <$> use gamePlayers
|
||||||
|
restockBuildersHall
|
||||||
|
restockCliffwatchInn
|
||||||
|
forM_ ps $ \p -> do
|
||||||
|
replicateM_ 2 $ performAction p DrawQuest
|
||||||
|
replicateM_ 2 $ performAction p DrawIntrigue
|
||||||
|
replicateM_ (3 + p) $ performAction p $ TakeResource [Gold]
|
||||||
forM_ [1..8] $ \round -> do
|
forM_ [1..8] $ \round -> do
|
||||||
beginRound round
|
beginRound round
|
||||||
performAction 1 $ TakeResource [Cleric, Fighter, Rogue, Wizard, Gold]
|
performAction 1 $ TakeResource [Cleric, Fighter, Rogue, Wizard, Gold]
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue