1 import Control.Monad.Trans
2 import Control.Monad.State
3 import Control.Monad.Reader
7 import qualified Data.Map as M
14 - Nice Guy: Spreads Hints, follows Hints
17 type UserData = ([(Player,Place)])
19 tellThem :: Place -> [Player] -> DayMonad UserData ()
20 tellThem room = mapM_ $ \friend -> do
21 actionsLeft <- asks psActionsLeft
23 then do send (Tell friend (PartyAt room))
24 say $ "Told " ++ show friend ++ " about the party."
25 else do say $ "Can not tell " ++ show friend ++ " any more."
27 dcb :: DayCallback UserData
28 dcb (DayStarts _) = do
29 mbp <- asks psPartyPlace
32 say $ "No idea where to go, waiting for hints..."
34 say $ "Yay, I know where to go! (" ++ show room ++")"
36 friends <- asks psFriends
37 players <- asks psPlayersHere
38 tellThem room (nub (sort (friends ++ players)))
40 dcb (GotHint player (PartyAt room)) = do
41 say $ "The " ++ show player ++ " told me about a party at " ++ show room ++"."
42 modify ((player,room):)
44 dcb (DayEndsIn 1) = do
45 mbp <- asks psPartyPlace
47 when (isNothing mbp && not (null hints)) $ do
48 friends <- asks psFriends
49 selected_hints <- case partition (\(p,_) -> p `elem` friends) hints of
50 ([],bad) -> do say $ "Some hints from non-friends " ++ show bad
52 (good,_) -> do say $ "Some hints from friends " ++ show good
54 let choices = map snd selected_hints
55 pick <- liftIO $ randomRIO (0,length choices - 1)
56 say $ "Choosing " ++ show (choices !! pick)
57 send (Goto (choices !! pick))
61 ncb :: NightCallback UserData
62 ncb (NightResult {nrScore = score }) = do
63 say $ "Got score: " ++ show score
64 say $ "New Day, forget about yesterday"
67 main = parttyMain dcb ncb []