1 import Control.Monad.Trans
2 import Control.Monad.State
3 import Control.Monad.Reader
7 import qualified Data.Map as M
13 - Groupie: Goes to the most successful player
15 type UserData = M.Map Player Place
17 bestPlayer :: DayMonad UserData Player
19 hist <- asks psHistory
21 let hits = filter (/= me) $ concatMap (\nr ->
22 map fst $ filter (\(_,p) -> p == nrPartyAt nr) $ nrPlayersAt nr)
26 else do let (who, count) = maximumBy (comparing snd)
27 $ map (\l -> (head l, length l))
29 say $ "Choosing " ++ show who ++ " with " ++ show count ++ "pts."
32 seeUsers :: DayMonad UserData ()
36 present <- asks psPlayersHere
37 say $ "Room " ++ show room ++ " has " ++ show (length present) ++ " people."
38 mapM_ (\player -> modify (M.insert player room)) present
40 nextRoom :: DayMonad UserData ()
42 lookingFor <- bestPlayer
46 case (lookingFor == me, lookingFor `M.member` map, room /= map ! lookingFor) of
47 (True, _, _) -> say $ "I am leading, going nowhere"
48 (False,True,True) -> do say $ "Meeting " ++ show lookingFor ++ " in "
50 goto (map ! lookingFor)
51 (False,True,False) -> do say $ "Already met " ++ show lookingFor ++ " in "
53 (False,False,_) -> do let room' = (room + 1) `mod` 10
54 say $ "Searching " ++ show room' ++ " for " ++
58 goto :: Place -> DayMonad UserData ()
60 actionsLeft <- asks psActionsLeft
63 else say $ "No actions left, got to stay where we are"
65 dcb :: DayCallback UserData
66 dcb (PlayerEnter player room) = do
68 when (myId == player) $ do
72 dcb (DayEndsIn 4) = do
78 ncb :: NightCallback UserData
79 ncb (NightResult {nrScore = score }) = do
80 say $ "Got score: " ++ show score
81 say $ "New Day, forget about yesterday"
84 main = parttyMain dcb ncb M.empty