예제 #1
0
 protected override void Dispose(bool disposing)
 {
     if (GameBase.QueuedMode != OsuModes.RankingVs)
     {
         PlayerVs.DisposeStatic();
         base.Dispose(disposing);
     }
 }
예제 #2
0
        internal MultiRulesetTagCoop(PlayerVs player)
            : base(player)
        {
            InputManager.ReplayCursorFollow = false;

            combinedScore.InvalidateSubmission();
            combinedScore.Pass = true;
        }
예제 #3
0
        protected override void Dispose(bool disposing)
        {
            if (Player.ScoreBoard != null)
            {
                Player.ScoreBoard.Dispose();
            }

            PlayerVs.DisposeStatic();

            base.Dispose(disposing);
        }
예제 #4
0
        internal TeamplayOverlay(PlayerVs playerVs, SpriteManager spriteManager)
        {
            player             = playerVs;
            this.spriteManager = spriteManager;

            team1header            = new pText("Blue Team", 16, new Vector2(0, 100), 1, true, Color.White);
            team1header.TextBold   = true;
            team1header.TextShadow = true;
            spriteManager.Add(team1header);

            team2header            = new pText("Red Team", 16, new Vector2(GameBase.WindowManager.WidthScaled, 100), 1, true, Color.White);
            team2header.TextShadow = true;
            team2header.TextBold   = true;
            team2header.Origin     = Origins.TopRight;
            spriteManager.Add(team2header);

            accuracyMatch = PlayerVs.Match.matchScoringType == MatchScoringTypes.Accuracy;

            team1display = new ScoreDisplay(spriteManager, new Vector2(0, 120), false, 0.7f, !accuracyMatch, accuracyMatch);
            team2display = new ScoreDisplay(spriteManager, new Vector2(0, 120), true, 0.7f, !accuracyMatch, accuracyMatch);

            metre = new pSprite(TextureManager.Load(@"lobby-crown", SkinSource.Osu), Origins.Centre,
                                new Vector2(GameBase.WindowManager.WidthScaled / 2, 90), 0.99f, true, Color.Yellow);
            metre.Scale = 1.2f;
            spriteManager.Add(metre);

            metre2 = new pSprite(TextureManager.Load(@"lobby-crown", SkinSource.Osu), Origins.Centre,
                                 new Vector2(GameBase.WindowManager.WidthScaled / 2, 90), 1, true, Color.Yellow);
            metre2.Additive = true;
            Transformation t = new Transformation(TransformationType.Scale, 1.2f, 1.3f, GameBase.Time, GameBase.Time + 1000, EasingTypes.In);

            t.Loop      = true;
            t.LoopDelay = 1000;
            metre2.Transformations.Add(t);
            t           = new Transformation(TransformationType.Scale, 1.3f, 1.2f, GameBase.Time + 1000, GameBase.Time + 2000, EasingTypes.Out);
            t.Loop      = true;
            t.LoopDelay = 1000;
            metre2.Transformations.Add(t);
            metre2.Scale = 1.2f;
            spriteManager.Add(metre2);
        }
예제 #5
0
        internal void UpdateScores()
        {
            if (!accuracyMatch)
            {
                bool comboHack = PlayerVs.Match.matchScoringType == MatchScoringTypes.Combo;
                int  team1     = comboHack ? getTeamCombo(SlotTeams.Blue) : getTeamScore(SlotTeams.Blue);
                int  team2     = comboHack ? getTeamCombo(SlotTeams.Red) : getTeamScore(SlotTeams.Red);

                team1display.Update(team1);
                team2display.Update(team2);

                //Accuracy is shown too...
                team1display.Update(getTeamAccuracy(SlotTeams.Blue) * 100);
                team2display.Update(getTeamAccuracy(SlotTeams.Red) * 100);

                //team1score.Text = team1.ToString("00000000");
                //team2score.Text = team2.ToString("00000000");
                bool  teamBlueWinner = (team1 > team2 && !PlayerVs.TeamFailed(SlotTeams.Blue)) || PlayerVs.TeamFailed(SlotTeams.Red);
                float offset         = teamBlueWinner ? -Math.Min(300, ((float)team1 / Math.Max(1, team2) - 1) * 100) : Math.Min(300, ((float)team2 / Math.Max(1, team1) - 1) * 100);
                float x = GameBase.WindowManager.WidthScaled / 2 + offset;

                metre.MoveTo(new Vector2(x, 90), 1000, EasingTypes.Out);
                metre2.MoveTo(new Vector2(x, 90), 1000, EasingTypes.Out);
            }
            else
            {
                float team1 = getTeamAccuracy(SlotTeams.Blue);
                float team2 = getTeamAccuracy(SlotTeams.Red);

                team1display.Update(team1 * 100);
                team2display.Update(team2 * 100);

                float offset = team1 > team2 ? -Math.Min(300, ((float)team1 / Math.Max(1, team2) - 1) * 300) : Math.Min(300, ((float)team2 / Math.Max(1, team1) - 1) * 300);
                float x      = GameBase.WindowManager.WidthScaled / 2 + offset;

                metre.MoveTo(new Vector2(x, 90), 1000, EasingTypes.Out);
                metre2.MoveTo(new Vector2(x, 90), 1000, EasingTypes.Out);
            }
        }
예제 #6
0
 protected override void Dispose(bool disposing)
 {
     PlayerVs.DisposeStatic();
     base.Dispose(disposing);
 }
예제 #7
0
        public override void Initialize()
        {
            base.Initialize();

            Player.ScoreBoard.spriteManager.WidescreenAutoOffset = true;
            Player.ScoreBoard.spriteManager.Alpha = 1;

            lock (StreamingManager.LockReplayScore)
            {
                InputManager.ReplayMode      = false;
                InputManager.ReplayStreaming = false;
                InputManager.ReplayStartTime = 0;
            }

            pText     text   = null;
            SlotTeams winner = PlayerVs.TeamOverlay.winner;

            if (PlayerVs.TeamFailed(SlotTeams.Blue))
            {
                text = new pText("Blue team failed!", 20, new Vector2(GameBase.WindowManager.WidthScaled / 2, 85), Vector2.Zero, 1, true, Color.Blue, false);
            }
            else if (PlayerVs.TeamFailed(SlotTeams.Red))
            {
                text = new pText("Red team failed!", 20, new Vector2(GameBase.WindowManager.WidthScaled / 2, 85), Vector2.Zero, 1, true, Color.Red, false);
            }
            else
            {
                switch (winner)
                {
                case SlotTeams.Blue:
                    text = new pText("Blue team wins!", 20, new Vector2(GameBase.WindowManager.WidthScaled / 2, 85), Vector2.Zero, 1, true, Color.Blue,
                                     false);
                    break;

                case SlotTeams.Red:
                    text = new pText("Red team wins!", 20, new Vector2(GameBase.WindowManager.WidthScaled / 2, 85), Vector2.Zero, 1, true, Color.Red,
                                     false);
                    break;
                }
            }

            text.TextBold = true;
            text.Origin   = Origins.Centre;
            spriteManagerWideScrolling.Add(text);

            int tabHeight = 113;

            //add
            team1Tabs = new pTabCollection(spriteManagerWideScrolling, 3, new Vector2(56, tabHeight), 0.8f, true, Color.BlueViolet, 40);
            team2Tabs = new pTabCollection(spriteManagerWideScrolling, 3, new Vector2(GameBase.WindowManager.WidthScaled - 224, tabHeight), 0.8f, true, Color.BlueViolet, 40);
            team1Tabs.Add("Total", 0);
            team2Tabs.Add("Total", 0);
            team1Tabs.SetSelected(0);
            team2Tabs.SetSelected(0);
            team1Tabs.OnTabChanged +=
                delegate(object sender, EventArgs e) { loadScores(SlotTeams.Blue, (int)sender, false); };
            team2Tabs.OnTabChanged +=
                delegate(object sender, EventArgs e) { loadScores(SlotTeams.Red, (int)sender, false); };

            int count = PlayerVs.LastScoreEntries.Count;

            for (int i = 0; i < count; i++)
            {
                ScoreboardEntry entry = PlayerVs.LastScoreEntries[i];
                if (entry != null)
                {
                    (entry.Team == SlotTeams.Blue ? team1Tabs : team2Tabs).Add(entry.name, i + 1);
                }
            }

            pSprite scoreBackground1 = new pSprite(TextureManager.Load(@"ranking-panel"), Fields.TopLeft,
                                                   Origins.TopLeft,
                                                   Clocks.Game,
                                                   new Vector2(1, SkinManager.UseNewLayout ? 107 : 97), 0.79f, true, Color.White);

            scoreBackground1.Alpha       = 1.0f;
            scoreBackground1.VectorScale = new Vector2(0.715f, 0.77f);

            pSprite scoreBackground2 = new pSprite(TextureManager.Load(@"ranking-panel"), Fields.TopLeft,
                                                   Origins.TopLeft,
                                                   Clocks.Game,
                                                   new Vector2(GameBase.WindowManager.WidthScaled - 279, SkinManager.UseNewLayout ? 107 : 97), 0.79f, true, Color.White);

            scoreBackground2.Alpha       = 1.0f;
            scoreBackground2.VectorScale = new Vector2(0.715f, 0.77f);
            spriteManagerWideScrolling.Add(scoreBackground1);
            spriteManagerWideScrolling.Add(scoreBackground2);
            initializeStatics();

            //cache scores for more efficiency
            team1Score = getTeamScore(SlotTeams.Blue);
            team2Score = getTeamScore(SlotTeams.Red);

            loadScores(SlotTeams.Blue, 0, true);
            loadScores(SlotTeams.Red, 0, true);

            playMode = Player.Mode;
        }
예제 #8
0
 public MultiRulesetTeamVs(PlayerVs player)
     : base(player)
 {
 }
예제 #9
0
 internal MultiRuleset(PlayerVs player)
 {
     this.player = player;
 }
예제 #10
0
        public static void IncomingMatch(bMatch match)
        {
            if (match.inProgress)
            {
                for (int i = 0; i < 8; i++)
                {
                    if (Match.slotId[i] >= 0 && match.slotId[i] < 0)
                    {
                        PlayerVs.MatchPlayerLeft(i);
                    }
                }
            }
            else
            {
                for (int i = 0; i < 8; i++)
                {
                    bool newPlayer = true;
                    for (int j = 0; j < 8; j++)
                    {
                        if (match.slotId[i] == Match.slotId[j])
                        {
                            newPlayer = false;
                            break;
                        }
                    }
                    if (newPlayer)
                    {
                        User u = BanchoClient.GetUserById(match.slotId[i]);
                        if (u != null)
                        {
                            GameBase.ShowMessage(u.Name + " joined the game.", Color.YellowGreen, 3000);
                            AudioEngine.PlaySample("match-join");
                        }
                    }
                }

                for (int i = 0; i < 8; i++)
                {
                    bool leftPlayer = true;
                    for (int j = 0; j < 8; j++)
                    {
                        if (match.slotId[j] == Match.slotId[i])
                        {
                            leftPlayer = false;
                            break;
                        }
                    }
                    if (leftPlayer)
                    {
                        User u = BanchoClient.GetUserById(Match.slotId[i]);
                        if (u != null)
                        {
                            GameBase.ShowMessage(u.Name + " left the game.", Color.OrangeRed, 3000);
                            AudioEngine.PlaySample("match-leave");
                        }
                    }
                }
            }
            if (match.beatmapChecksum != Match.beatmapChecksum)
            {
                SongChangePending = true;
            }
            if (match.activeMods != Match.activeMods)
            {
                ModChangePending = true;
            }
            Match         = match;
            UpdatePending = true;
        }
예제 #11
0
        private static void Run()
        {
            Connect();
            while (true)
            {
                if (GameBase.Time - lastPingTime > pingTimeout)
                {
                    Connect();
                    Thread.Sleep(20);
                    continue;
                }

                if (client != null && client.Connected)
                {
                    try
                    {
                        //Send any waiting requests.
                        if (Requests.Count > 0 && stream.CanWrite && Authenticated)
                        {
                            Requests.Dequeue().Send(stream);
                            sendSequence = (sendSequence + 1) % ushort.MaxValue;
                        }

                        while (Connected && stream != null && stream.DataAvailable)
                        {
                            lastPingTime = GameBase.Time;

                            readBytes += stream.Read(readByteArray, readBytes, readByteArray.Length - readBytes);

                            //Read header data
                            if (readBytes == readByteArray.Length && readingHeader)
                            {
                                readType    = (RequestType)BitConverter.ToUInt16(readByteArray, 0);
                                compression = readByteArray[2] == 1;
                                uint length = BitConverter.ToUInt32(readByteArray, 3);

                                Console.WriteLine("R" + length + ": " + readType);

                                ResetReadArray(false);
                                readByteArray = new byte[length];
                            }

                            //Read payload data
                            if (readBytes != readByteArray.Length)
                            {
                                continue;
                            }

                            switch (readType)
                            {
                            /* CONNECTION MANAGEMENT */

                            case RequestType.Bancho_LoginReply:
                                GameBase.User.Id = new bInt(readStream).number;
                                switch (GameBase.User.Id)
                                {
                                case -1:
                                    GameBase.ShowMessage(
                                        "Bancho authentication failed.  Please check your username/password by clicking the user pane on the main menu.",
                                        Color.Red, 4400);
                                    Authenticated = false;
                                    Disconnect(true);
                                    if (LoginResult != null)
                                    {
                                        LoginResult(false, null);
                                    }
                                    break;

                                case -2:
                                    GameBase.ShowMessage(
                                        "Bancho connection failed: Version mismatch",
                                        Color.Red, 4400);
                                    GameBase.CheckForUpdates();
                                    Authenticated = false;
                                    Disconnect(true);
                                    return;

                                default:
                                    Console.WriteLine("login success userid:" + GameBase.User.Id);

                                    ChatEngine.BanchoConnected();
                                    GameBase.ShowMessage("Welcome to osu!Bancho.", Color.SlateBlue, 4400);

                                    Status = bStatus.Idle;
                                    UpdateStatus();

                                    Authenticated = true;
                                    if (OnConnect != null)
                                    {
                                        OnConnect();
                                    }
                                    if (LoginResult != null)
                                    {
                                        LoginResult(true, null);
                                    }
                                    break;
                                }
                                break;

                            case RequestType.Bancho_Ping:
                                SendRequest(RequestType.Osu_Pong, null);
                                break;

                            case RequestType.Bancho_VersionUpdate:
                                GameBase.CheckForUpdates();
                                break;

                            /* CHAT and MESSAGING */

                            case RequestType.Bancho_SendIrcMessage:
                                ChatEngine.HandleMessage(new bMessage(readStream), false);
                                break;

                            case RequestType.Bancho_HandleIrcChangeUsername:
                                string message = new bString(readStream).text;
                                string oldname = message.Substring(0, message.IndexOf(">>>>"));
                                string newname = message.Remove(0, message.IndexOf(">>>>") + 4);
                                ChatEngine.HandleChangeUsername(oldname, newname);
                                break;

                            case RequestType.Bancho_HandleIrcQuit:
                                ChatEngine.HandleQuit("#osu", new bString(readStream).text);
                                break;

                            case RequestType.Bancho_HandleIrcJoin:
                                ChatEngine.HandleJoin("#osu", new bString(readStream).text);
                                break;

                            case RequestType.Bancho_HandleOsuQuit:
                                ChatEngine.HandleUserQuit(new bInt(readStream).number);
                                break;

                            /* STATISTICS */

                            case RequestType.Bancho_HandleOsuUpdate:
                                if (readStream == null)
                                {
                                    break;
                                }
                                bUserStats stats = new bUserStats(readStream);
                                ChatEngine.HandleUserUpdate(stats);
                                if (stats.userId == GameBase.User.Id)
                                {
                                    if (stats.username != null)
                                    {
                                        ConfigManager.sUsername = stats.username;
                                    }
                                    GameBase.User.bancho_StatsReceived(null, stats);
                                }
                                break;

                            /* SPECTATING */
                            case RequestType.Bancho_FellowSpectatorJoined:
                                lock (StreamingManager.Spectators)
                                {
                                    User u = GetUserById(new bInt(readStream).number);
                                    StreamingManager.HasSpectators = true;
                                    if (!StreamingManager.FellowSpectators.Contains(u))
                                    {
                                        StreamingManager.FellowSpectators.Add(u);
                                    }
                                    StreamingManager.FellowSpectators.Sort();
                                }
                                break;

                            case RequestType.Bancho_FellowSpectatorLeft:
                                lock (StreamingManager.Spectators)
                                {
                                    User u = GetUserById(new bInt(readStream).number);
                                    StreamingManager.FellowSpectators.Remove(u);
                                    if (StreamingManager.Spectators.Count == 0)
                                    {
                                        StreamingManager.HasSpectators = false;
                                    }
                                }
                                break;

                            case RequestType.Bancho_SpectatorJoined:
                                //Start sending spectator frames.
                                lock (StreamingManager.Spectators)
                                {
                                    User u = GetUserById(new bInt(readStream).number);
                                    u.CantSpectate = false;
                                    if (!StreamingManager.Spectators.Contains(u))
                                    {
                                        StreamingManager.Spectators.Add(u);
                                    }
                                    StreamingManager.HasSpectators = true;
                                    StreamingManager.Spectators.Sort();
                                }
                                break;

                            case RequestType.Bancho_SpectatorCantSpectate:
                                GetUserById(new bInt(readStream).number).CantSpectate = true;
                                break;

                            case RequestType.Bancho_SpectatorLeft:
                                //Stop sending spectator frames.
                                lock (StreamingManager.Spectators)
                                {
                                    User u = GetUserById(new bInt(readStream).number);
                                    u.CantSpectate = false;
                                    StreamingManager.Spectators.Remove(u);
                                    if (StreamingManager.Spectators.Count == 0)
                                    {
                                        StreamingManager.HasSpectators = false;
                                    }
                                }
                                break;

                            case RequestType.Bancho_SpectateFrames:
                                StreamingManager.HandleFrames(new bReplayFrameBundle(readStream));
                                //Received some spectator frames.
                                break;

                            case RequestType.Bancho_GetAttention:
                                ChatEngine.PendingShow = true;
                                break;

                            case RequestType.Bancho_Announce:
                                GameBase.ShowMessage(new bString(readStream).text.Replace("\\n", "\n"), Color.DarkMagenta, 10000);
                                break;

                            case RequestType.Bancho_MatchUpdate:
                            case RequestType.Bancho_MatchNew:
                                Lobby.IncomingMatch(new bMatch(readStream));
                                break;

                            case RequestType.Bancho_MatchStart:
                                MatchSetup.MatchStart(new bMatch(readStream));
                                break;

                            case RequestType.Bancho_MatchDisband:
                                Lobby.DisbandedMatch(new bInt(readStream).number);
                                break;

                            case RequestType.Bancho_LobbyJoin:
                            case RequestType.Bancho_LobbyPart:
                                User f = GetUserById(new bInt(readStream).number);
                                if (f != null)
                                {
                                    f.InLobby = readType == RequestType.Bancho_LobbyJoin;
                                }
                                Lobby.LobbyUpdatePending = true;
                                break;

                            case RequestType.Bancho_MatchJoinFail:
                                Lobby.OnJoinFail();
                                break;

                            case RequestType.Bancho_MatchJoinSuccess:
                                MatchSetup.Match = new bMatch(readStream);
                                Lobby.OnJoinSuccess();
                                break;

                            case RequestType.Bancho_MatchScoreUpdate:
                                if (GameBase.Mode == Modes.Play && Lobby.Status == LobbyStatus.Play)
                                {
                                    PlayerVs.MatchScoreUpdate(new bScoreFrame(readStream));
                                }
                                break;

                            case RequestType.Bancho_MatchTransferHost:
                                MatchSetup.MatchTransferHost();
                                break;

                            case RequestType.Bancho_MatchAllPlayersLoaded:
                                if (GameBase.Mode == Modes.Play && Lobby.Status == LobbyStatus.Play)
                                {
                                    PlayerVs.AllPlayersLoaded = true;
                                }
                                break;

                            case RequestType.Bancho_MatchPlayerFailed:
                                if (GameBase.Mode == Modes.Play && Lobby.Status == LobbyStatus.Play)
                                {
                                    PlayerVs.MatchPlayerFailed(new bInt(readStream).number);
                                }
                                break;

                            case RequestType.Bancho_MatchComplete:
                                if (GameBase.Mode == Modes.Play && Lobby.Status == LobbyStatus.Play)
                                {
                                    PlayerVs.MatchComplete();
                                }
                                break;

                            case RequestType.Bancho_MatchSkip:
                                if (GameBase.Mode == Modes.Play && Lobby.Status == LobbyStatus.Play)
                                {
                                    Player.QueueSkip();
                                }
                                break;

                            case RequestType.Bancho_Unauthorised:

                                break;

                            case RequestType.Bancho_ChannelJoinSuccess:
                                string  match   = new bString(readStream).text;
                                Channel channel = ChatEngine.channels.Find(ch => ch.name == match);
                                if (channel != null)
                                {
                                    channel.HandleJoinSuccess();
                                }
                                break;

                            case RequestType.Bancho_ChannelAvailable:
                                ChatEngine.AddChannel(new bString(readStream).text, false);
                                break;

                            case RequestType.Bancho_ChannelAvailableAutojoin:
                                ChatEngine.AddChannel(new bString(readStream).text, true);
                                break;

                            case RequestType.Bancho_ChannelRevoked:
                                ChatEngine.RemoveChannel(new bString(readStream).text);
                                break;

                            case RequestType.Bancho_BeatmapInfoReply:
                                BeatmapManager.IncomingBeatmapInfoReply(new bBeatmapInfoReply(readStream));
                                break;
                            }
                            ResetReadArray(true);
                        }
                    }
                    catch (Exception e)
                    {
                        if (firstError)
                        {
                            firstError = false;
                            if (Connected)
                            {
                                StringBuilder report = new StringBuilder();
                                report.AppendLine("----------------------BANCHO--------------------------------");
                                report.AppendLine("Bancho error from " + ConfigManager.sUsername + " at " +
                                                  DateTime.UtcNow.ToString(GameBase.nfi));
                                report.AppendLine();
                                report.AppendLine("Mode: " + GameBase.Mode);
                                report.AppendLine();
                                report.Append(e + "\n");
                                report.AppendLine();
                                report.AppendLine("------------------------------------------------------------");
                                try
                                {
                                    new RequestGeneric(RequestType.Osu_ErrorReport, new bString(report.ToString())).Send
                                        (stream);
                                }
                                catch (Exception)
                                {
                                }
                            }
                        }
                        FailConnection("An error occurred somewhere in bancho comms.  Reconnecting!", errorRetry);
                        errorRetry = (int)(errorRetry * 1.5);
                    }
                }

                if (Connected)
                {
                    CheckAfk();
                }

                Thread.Sleep(20);
            }
        }
예제 #12
0
        private void InitializeTester()
        {
            if (!PREDEFINED_TEST)
            {
                return;
            }

            if (BeatmapManager.Beatmaps.Count > 0)
            {
                if (USE_LAST_PLAYED_BEATMAP)
                {
                    List <Beatmap> temp = new List <Beatmap>(BeatmapManager.Beatmaps);
                    temp.Sort((a, b) => { return(a.DateLastPlayed.CompareTo(b.DateLastPlayed)); });
                    BeatmapManager.Current = temp[temp.Count - 1];
                }
                else //Choose a random beatmap
                {
                    BeatmapManager.Current = BeatmapManager.Beatmaps[RNG.Next(0, BeatmapManager.Beatmaps.Count)];
                }
            }

            if (MULTIPLAYER_MATCH)
            {
                if (BeatmapManager.Current == null)
                {
                    NotificationManager.ShowMessage("Couldn't start in specified test mode because no beatmaps were available.");
                    return;
                }

                BanchoClient.Start();

                Mode = OsuModes.MatchSetup;

                const int player_count = 8;

                while (!BanchoClient.Connected || !BanchoClient.InitializationComplete)
                {
                    Scheduler.Update();
                }

                PresenceCache.QueryAll();

                while (User.Id <= 0 || BanchoClient.Users.Count < player_count)
                {
                    Scheduler.Update();
                }

                List <User> users = BanchoClient.Users.FindAll(u => u.InitialLoadComplete && u.Id != User.Id);
                users.Insert(0, User); //we are the first user.

                MatchSetup.Match = new ClientSideMatch(new bMatch(MatchTypes.Standard,
                                                                  MatchScoringTypes.Score,
                                                                  MatchTeamTypes.TeamVs,
                                                                  PlayModes.Osu,
                                                                  @"My test game",
                                                                  string.Empty,
                                                                  player_count,
                                                                  BeatmapManager.Current.SortTitle,
                                                                  BeatmapManager.Current.BeatmapChecksum,
                                                                  BeatmapManager.Current.BeatmapId,
                                                                  MODS_TO_USE,
                                                                  2,
                                                                  MultiSpecialModes.FreeMod
                                                                  ));

                for (int i = 0; i < player_count; i++)
                {
                    MatchSetup.Match.slotId[i]    = users[i].Id;
                    MatchSetup.Match.UserSlots[i] = users[i];

                    MatchSetup.Match.slotStatus[i] = SlotStatus.Playing;
                    switch (MatchSetup.Match.matchTeamType)
                    {
                    case MatchTeamTypes.TagTeamVs:
                    case MatchTeamTypes.TeamVs:
                        MatchSetup.Match.slotTeam[i] = i % 2 == 0 ? SlotTeams.Blue : SlotTeams.Red;
                        break;
                    }
                }

                bScoreFrame[] frames = new bScoreFrame[player_count];
                for (int i = 0; i < player_count; i++)
                {
                    frames[i] = new bScoreFrame {
                        id = (byte)i, pass = true, currentHp = 200
                    }
                }
                ;

                RunBackgroundThread(delegate
                {
                    Thread.Sleep(5000);

                    for (int i = 0; i < player_count; i++)
                    {
                        PlayerVs.MatchPlayerSkipped(i);
                        Thread.Sleep(100);
                    }

                    Thread.Sleep(2000);

                    Player.QueueSkip();
                    Player.Instance?.DoSkip();

                    PlayerVs.AllPlayersLoaded    = true;
                    PlayerVs.AllPlayersCompleted = true;

                    while (true)
                    {
                        byte player = (byte)RNG.Next(0, player_count);

                        switch (RNG.Next(0, 30))
                        {
                        default:
                            frames[player].count300 += 1;
                            frames[player].currentCombo++;
                            frames[player].currentHp += 3;
                            break;

                        case 1:
                        case 2:
                        case 3:
                            frames[player].count100 += 1;
                            frames[player].currentCombo++;
                            frames[player].currentHp += 2;
                            break;

                        case 4:
                        case 5:
                            frames[player].count50   += 1;
                            frames[player].currentHp += 1;
                            frames[player].currentCombo++;
                            break;

                        case 6:
                            frames[player].countMiss   += 1;
                            frames[player].currentHp   -= 50;
                            frames[player].currentCombo = 0;
                            break;
                        }

                        frames[player].currentHp = OsuMathHelper.Clamp(frames[player].currentHp, 0, 200);

                        if (frames[player].currentHp == 0)
                        {
                            frames[player].pass = false;
                        }
                        else if (frames[player].currentHp > 100)
                        {
                            frames[player].pass = true;
                        }

                        frames[player].totalScore += frames[player].currentCombo * 300;
                        frames[player].maxCombo    = Math.Max(frames[player].maxCombo, frames[player].currentCombo);


                        PlayerVs.MatchScoreUpdate(frames[player]);

                        Thread.Sleep(50);
                    }
                });
            }

            switch (INITIAL_MODE)
            {
            case OsuModes.Play:
                if (BeatmapManager.Current == null)
                {
                    NotificationManager.ShowMessage("Couldn't start in specified test mode because no beatmaps were available.");
                    return;
                }

                ModManager.ModStatus = MODS_TO_USE;

                if (AUTOMATIC_SKIP)
                {
                    GameBase.RunBackgroundThread(delegate
                    {
                        while (true)
                        {
                            if (Player.Instance != null && Player.Instance.Status != PlayerStatus.Busy)
                            {
                                Scheduler.Add(delegate { Player.Instance?.DoSkip(); });
                                if (Player.HasSkipped)
                                {
                                    break;
                                }
                            }

                            Thread.Sleep(200);
                        }
                    });
                }

                if (AUTOPLAY)
                {
                    ModManager.ModStatus |= Mods.Autoplay;
                }

                break;
            }

            QueuedMode  = INITIAL_MODE;
            Player.Mode = INITIAL_PLAY_MODE;
        }
    }