data DayMessage = DayStarts
| DayEndsIn Int
| DayEnds
+ | GotHint Player Hint
deriving (Show, Eq)
-- Events that we want to send to the user code and that
| NightEndsIn Int
| NightEnds
| GotScore Score
+ | NewContact Player
+ | LostContact Player
deriving (Show, Eq)
-- Pure bookkeeping events
data InternalMessage = MyPlayerId Player
| Welcome
| PlayerJoined String
+ | PlayerLeft String
| GameStarting
+ | GameEnds
| MyIdIs Player
| PlayerEnter Player Place
| PlayerLeave Player Place
deriving (Show, Eq)
-{- Einzusortieren:
- | PlayerJoined Player -- the game
- | PlayerLeft Player
- | PlayerEnters Player Place
- | PlayerLeaves Player Place
- | GotHint Hint
- | PlayerList [Player]
- | PlayerScore [(Player, Int)]
- | PlayerNames [(Player, String)]
- | GameStarted
- | DayStarts
- | DayEndsIn Int
- | DayEnds
- | NightStarts
- | NightEndsIn Int
- | NightEnds
- | GameEnded
- | PartyHint Place
- | PlayerPosition Player Place -- wann bekommt man das?
- | ActionsLeft Int
- | NewContact Player
--}
-
data ClientMessage = Tell Player Hint
| Goto Place
deriving (Show, Eq)
-- Regular Messages
71 -> InternalMessage (Welcome)
20 -> InternalMessage (PlayerJoined s1)
+ 21 -> InternalMessage (PlayerLeft s1)
70 -> InternalMessage (Noise) -- welcome
40 -> InternalMessage (Noise) -- waiting for at least .. players
41 -> InternalMessage (Noise) -- game will start in...
42 -> InternalMessage (GameStarting)
+ 56 -> InternalMessage (GameEnds)
43 -> InternalMessage (MyIdIs s1)
22 -> InternalMessage (PlayerEnter s1 int2)
23 -> InternalMessage (PlayerLeave s1 int2)
50 -> DayMessage (DayStarts)
51 -> DayMessage (DayEndsIn int1)
52 -> DayMessage (DayEnds)
+ 24 -> DayMessage (if int2 == 0 then GotHint s1 (NoPartyAt int3)
+ else GotHint s1 (PartyAt int3) )
+ 25 -> DayMessage (if int2 == 0 then GotHint s1 (Liar s3)
+ else GotHint s1 (NoLiar s3) )
53 -> NightMessage (NightStarts)
54 -> NightMessage (NightEndsIn int1)
62 -> NightMessage (GotScore NoScore)
63 -> NightMessage (GotScore ToFew)
64 -> NightMessage (GotScore Scored)
+ 66 -> NightMessage (NewContact s1)
+ 67 -> NightMessage (LostContact s1)
60 -> NightMessage (PartyHint int1)
- _ -> UnknownMessage msg
- --_ -> error $ "Unkown or unparseable message:\n" ++ msg
+ --_ -> UnknownMessage msg
+ _ -> error $ "Unkown or unparseable message:\n" ++ msg
where (id_s : num_params : rest) = words msg
id = read id_s
param_s = take (read num_params) rest
+ -- This works thanks to laziness:
s1 = read (param_s !! 0) :: String
int1 = read (param_s !! 0) :: Int
s2 = read (param_s !! 1) :: String
int2 = read (param_s !! 1) :: Int
+ s3 = read (param_s !! 2) :: String
+ int3 = read (param_s !! 2) :: Int
sendClientMessage :: Handle -> ClientMessage -> IO ()
sendClientMessage h msg = do putStrLn $ "Client says: " ++ (show msg)