public bool CreateGame(List<User> users)
 {
     List<Player> players = new List<Player>();
     List<ServerUser> serverUsers = new List<ServerUser>();
     int idCounter = 0;
     foreach (User targetUser in users)
     {
         ServerUser user = targetUser as ServerUser;
         players.Add(user.player = new ServerPlayer(idCounter++, targetUser.userName));
         serverUsers.Add(user);
     }
     ServerGame game = new ServerGame(20000, players, serverUsers);
     game.OnGameOver += CloseGame;
     game.canRollDice = true;
     foreach (Block block in game.map.blocks)
     {
         if (block is LandBlock)
         {
             block.OnTokenPlaceInto += PayForTollEventTask;
             block.OnTokenPlaceInto += UpgradeLandSelectionEventTask;
             block.OnTokenPlaceInto += BuyLandSelectionEventTask;
         }
         else if (block is StartBlock)
         {
             block.OnTokenPass += PassStartBlockEventTask;
         }
         else if (block is CardBlock)
         {
             block.OnTokenPlaceInto += DrawCardEventTask;
         }
     }
     gameDictionary.Add(game.id, game);
     foreach (User targetUser in users)
     {
         (targetUser as ServerUser).playingGame = game;
     }
     Dictionary<byte, object> parameter = new Dictionary<byte, object>
     {
         {(byte)GameStartBroadcastParameterItem.GameDataString, JsonConvert.SerializeObject(game.Serialize(), new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto }) }
     };
     List<Peer> peers = new List<Peer>();
     foreach (ServerUser targetUser in game.users)
     {
         peers.Add(targetUser.Peer);
     }
     Broadcast(peers.ToArray(), BroadcastType.GameStart, parameter);
     return true;
 }
 private void CloseGame(ServerGame game)
 {
     Player winner = game.GameOverReturnWinnner();
     Dictionary<byte, object> parameter = new Dictionary<byte, object>
     {
         {(byte)EndGameBroadcastParameterItem.WinerName, winner.username },
         {(byte)EndGameBroadcastParameterItem.WinerMoney, winner.money },
         {(byte)EndGameBroadcastParameterItem.GameDataString, JsonConvert.SerializeObject(game.Serialize(), new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto }) }
     };
     List<Peer> peers = new List<Peer>();
     foreach (ServerUser targetUser in game.users)
     {
         peers.Add(targetUser.Peer);
         targetUser.playingGame = null;
         if(targetUser == (targetUser.userGroup as Room).host)
             targetUser.ready = true;
         else
             targetUser.ready = false;
     }
     Broadcast(peers.ToArray(), BroadcastType.EndGame, parameter);
     gameDictionary.Remove(game.id);
 }