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 isLiar :: Player -> DayMonad UserData Bool
21 hist <- asks psHistory
22 hhist <- asks psHintHistory
24 any (\(d, player', h) ->
27 case h of PartyAt p' -> nrPartyAt nr /= p'
32 tellThem :: Place -> [Player] -> DayMonad UserData ()
33 tellThem room = mapM_ $ \friend -> do
34 actionsLeft <- asks psActionsLeft
36 then do send (Tell friend (PartyAt room))
37 say $ "Told " ++ show friend ++ " about the party."
38 else do say $ "Can not tell " ++ show friend ++ " any more."
40 dcb :: DayCallback UserData
41 dcb (DayStarts _) = do
42 mbp <- asks psPartyPlace
45 say $ "No idea where to go, waiting for hints..."
47 say $ "Yay, I know where to go! (" ++ show room ++")"
49 friends <- asks psFriends
50 players <- asks psPlayersHere
51 tellThem room (nub (sort (friends ++ players)))
53 dcb (GotHint player (PartyAt room)) = do
56 say $ "The Liar " ++ show player ++ " told me about a party at " ++ show room ++"."
58 say $ "The " ++ show player ++ " told me about a party at " ++ show room ++"."
59 modify ((player,room):)
61 dcb (DayEndsIn 1) = do
62 mbp <- asks psPartyPlace
64 when (isNothing mbp && not (null hints)) $ do
65 friends <- asks psFriends
66 selected_hints <- case partition (\(p,_) -> p `elem` friends) hints of
67 ([],bad) -> do say $ "Some hints from non-friends " ++ show bad
69 (good,_) -> do say $ "Some hints from friends " ++ show good
71 let choices = map snd selected_hints
72 pick <- liftIO $ randomRIO (0,length choices - 1)
73 say $ "Choosing " ++ show (choices !! pick)
74 send (Goto (choices !! pick))
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 []