use Data.MultiSet to represent resources in place of Data.Map

This commit is contained in:
Jesse D. McDonald 2014-05-10 18:48:08 -05:00
parent e7802f17bd
commit 0f035e74cc
4 changed files with 20 additions and 18 deletions

View File

@ -25,6 +25,7 @@ import Waterdeep.Util
import qualified Data.IntMap as IM import qualified Data.IntMap as IM
import qualified Data.Map as M import qualified Data.Map as M
import qualified Data.MultiSet as MS
data DisplayState = data DisplayState =
DisplayState DisplayState
@ -119,8 +120,8 @@ i2 = IntrigueCard { _intrigueTitle = "Call for Adventurers"
clearScreen :: IO () clearScreen :: IO ()
clearScreen = putStr "\o033[H\o033[2J" >> hFlush stdout clearScreen = putStr "\o033[H\o033[2J" >> hFlush stdout
showTavern :: M.Map Resource Int -> String showTavern :: MS.MultiSet Resource -> String
showTavern = intercalate ", " . map showResource . M.toAscList showTavern = intercalate ", " . map showResource . MS.toAscOccurList
where showResource (r, n) = show n ++ " " ++ show r where showResource (r, n) = show n ++ " " ++ show r
printWaterdeep :: WaterdeepState -> IO () printWaterdeep :: WaterdeepState -> IO ()

View File

@ -59,6 +59,7 @@ import Waterdeep.Util
import qualified Data.IntMap as IM import qualified Data.IntMap as IM
import qualified Data.Map as M import qualified Data.Map as M
import qualified Data.MultiSet as MS
noAction :: GameAction noAction :: GameAction
noAction = return () noAction = return ()
@ -73,7 +74,7 @@ takeResources :: Int -> [Resource] -> GameAction
takeResources n rs = do takeResources n rs = do
received <- map (head &&& length) . group . sort <$$> replicateM n $ do received <- map (head &&& length) . group . sort <$$> replicateM n $ do
r <- solicitChoice "Take one item:" $ map (show &&& id) rs r <- solicitChoice "Take one item:" $ map (show &&& id) rs
activePlayerState . playerTavern %= M.insertWith' (+) r 1 activePlayerState . playerTavern <>= MS.singleton r
return r return r
let items = joinStrings $ map (\(r,n) -> show n ++ " " ++ show r) received let items = joinStrings $ map (\(r,n) -> show n ++ " " ++ show r) received
name <- use $ activePlayerName name <- use $ activePlayerName
@ -82,11 +83,9 @@ takeResources n rs = do
returnResources :: Int -> [Resource] -> GameAction returnResources :: Int -> [Resource] -> GameAction
returnResources n rs = do returnResources n rs = do
returned <- replicateM n $ do returned <- replicateM n $ do
tavern <- use $ activePlayerState . playerTavern r <- solicitChoice "Return one item:" $ map (show &&& id) rs
let rs' = filter ((>= 1) . maybe 0 id . flip M.lookup tavern) rs guard . (r `MS.member`) =<< use (activePlayerState . playerTavern)
r <- solicitChoice "Return one item:" $ map (show &&& id) rs' activePlayerState . playerTavern %= (`MS.difference` MS.singleton r)
let removeOne x = if x > 1 then Just (x-1) else Nothing
activePlayerState . playerTavern %= M.update removeOne r
return r return r
let groups = map (head &&& length) $ group returned let groups = map (head &&& length) $ group returned
let items = joinStrings $ map (\(r,n) -> show n ++ " " ++ show r) groups let items = joinStrings $ map (\(r,n) -> show n ++ " " ++ show r) groups

View File

@ -27,6 +27,7 @@ import Waterdeep.Util
import qualified Data.IntMap as IM import qualified Data.IntMap as IM
import qualified Data.Map as M import qualified Data.Map as M
import qualified Data.MultiSet as MS
newGame :: [(String,Faction,Lord)] newGame :: [(String,Faction,Lord)]
-> [Quest] -> [Quest]
@ -139,7 +140,7 @@ scoreFinalPoints :: Waterdeep ()
scoreFinalPoints = do scoreFinalPoints = do
np <- use gameNumberOfPlayers np <- use gameNumberOfPlayers
forM_ [1..np] $ \p -> withActivePlayer p $ do forM_ [1..np] $ \p -> withActivePlayer p $ do
rs <- M.toAscList <$> use (activePlayerState . playerTavern) rs <- MS.toAscOccurList <$> use (activePlayerState . playerTavern)
name <- use activePlayerName name <- use activePlayerName
forM_ rs $ \(r, n) -> do forM_ rs $ \(r, n) -> do
let pts = case r of { Gold -> n `div` 2; _ -> n; } let pts = case r of { Gold -> n `div` 2; _ -> n; }
@ -173,7 +174,7 @@ determineWinners = do
let winners2 = filter ((== bestGold) . playerGold) winners1 let winners2 = filter ((== bestGold) . playerGold) winners1
return (winners2 ^.. each . playerNumber) return (winners2 ^.. each . playerNumber)
where where
playerGold = maybe 0 id . M.lookup Gold . view playerTavern playerGold = MS.occur Gold . view playerTavern
initialAgents :: Int -> Int -> Int initialAgents :: Int -> Int -> Int
initialAgents players round = initialAgents players round =

View File

@ -117,6 +117,7 @@ import System.Random (StdGen)
import qualified Data.IntMap as IM import qualified Data.IntMap as IM
import qualified Data.Map as M import qualified Data.Map as M
import qualified Data.MultiSet as MS
import qualified System.Random as R import qualified System.Random as R
type PlayerID = Int type PlayerID = Int
@ -169,7 +170,7 @@ data PlayerState =
, _playerFaction :: Faction , _playerFaction :: Faction
, _playerLord :: Lord , _playerLord :: Lord
, _playerScore :: Int , _playerScore :: Int
, _playerTavern :: Map Resource Int , _playerTavern :: MS.MultiSet Resource
, _playerIncompleteQuests :: [Quest] , _playerIncompleteQuests :: [Quest]
, _playerCompletedQuests :: [Quest] , _playerCompletedQuests :: [Quest]
, _playerActivePlotQuests :: [Quest] , _playerActivePlotQuests :: [Quest]
@ -340,7 +341,7 @@ newPlayerState i (name, faction, lord) =
, _playerFaction = faction , _playerFaction = faction
, _playerLord = lord , _playerLord = lord
, _playerScore = 0 , _playerScore = 0
, _playerTavern = M.empty , _playerTavern = mempty
, _playerIncompleteQuests = [] , _playerIncompleteQuests = []
, _playerCompletedQuests = [] , _playerCompletedQuests = []
, _playerActivePlotQuests = [] , _playerActivePlotQuests = []