예제 #1
0
        /// <summary>
        /// Saves user settings and database data to disk.
        /// </summary>
        internal bool Save()
        {
            try
            {
                ConfigManager.SaveConfig();

                BeatmapManager.DatabaseSerialize();
                PresenceCache.DatabaseSerialize();

                CollectionManager.SaveToDisk();
                ScoreManager.SaveToDisk();
                return(true);
            }
            catch (Exception e)
            {
                ErrorSubmission.Submit(new OsuError(e)
                {
                    Feedback = "background-save"
                });
                return(false);
            }
            finally
            {
                lastSave        = GameBase.Time;
                modeChangeCount = 0;
            }
        }
예제 #2
0
        internal bool RequestPresence(bool fill = true, bool force = false)
        {
            if (InitialLoadComplete && !force)
            {
                return(false);
            }

            PresenceCacheItem i = PresenceCache.Query(Id, fill);

            if (i != null)
            {
                ReceivePresence(i.Presence);
                return(true);
            }

            return(false);
        }
예제 #3
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;
        }
    }
예제 #4
0
        internal override void Update()
        {
            if (!ConfigManager.sFpsCounter || (!InputManager.HandleInput && monitor.FramesPerSecond == 0))
            {
                return;
            }

            base.Update();

            double decay = Math.Pow(0.05, GameBase.ElapsedMilliseconds / 1000.0);

            double targetFps = GameBase.TargetFrameRate;
            char   suffix    = '\\';

            if (targetFps > 1000)
            {
                //We don't want to display unlimited target FPS, so let's use the user's refresh rate instead.
                targetFps = GameBase.RefreshRate;

                //In this case we change the suffix displayed for the cap from 'fps' to 'hz' to make things a bit easier to understand.
                suffix = '+';
            }

            if (GameBase.TotalFramesRendered % targetFps == 0)
            {
#if DEBUG
                float drawTimes = SpriteManager.PixelCount / (GameBase.WindowManager.Width * GameBase.WindowManager.Height);

                backgroundDelay.HandleInput = true;
                if (SpriteManager.Placement && SpriteManager.ClickHandledSprite != null)
                {
                    backgroundDelay.ToolTip = SpriteManager.ClickHandledSprite.ToString();
                }
                else
                {
                    backgroundDelay.ToolTip = string.Format(
                        "FPS {0:#,#}fps {15}sfps | NET ↑{5:#,0}kb ↓{6:#,0}kb {28}pkt {27}ms  | MOUSE ({7:0.0},{8:0.0}) POLL{29}\n" +
                        "SPRITES man:{1} sk:{9} bm:{10} osu:{12} dyn:{13}/{14} vbo:{32} rbo:{34} fbo:{35} tex:{33}\n" +
                        "TIME a{16} g{17} v{18}{19} | GC {24}/{23}/{22} | MON {21}hz\n" +
                        "PERF cpu:{20}ms fill:{2:n}m ({3:n}x) {4} sprites:{30} vis:{31}\n" +
                        "{25}",
                        monitor.FramesPerSecond, SpriteManager.InstanceCount, SpriteManager.PixelCount / 1000000f, drawTimes, string.Empty,    /*  4 */
                        BanchoClient.SentBytes / 1024, BanchoClient.ReceivedBytes / 1024,                                                      /*  6 */
                        MouseManager.MousePositionWindow.X, MouseManager.MousePositionWindow.Y,                                                /*  8 */
                        TextureManager.GetCacheCount(SkinSource.Skin), TextureManager.GetCacheCount(SkinSource.Beatmap), 0,                    /* 11 */
                        TextureManager.GetCacheCount(SkinSource.Osu), DynamicSpriteCache.DynamicSprites.Count,                                 /* 13 */
                        DynamicSpriteCache.DynamicSpritesNoUnload.Count, 0, AudioEngine.Time, GameBase.Time,                                   /* 17 */
                        AudioEngine.VirtualTimeAccumulated, AudioEngine.ExtendedTime ? "!" : string.Empty, string.Empty, GameBase.RefreshRate, /* 21 */
                        GC.CollectionCount(0), GC.CollectionCount(1), GC.CollectionCount(2),                                                   /* 24 */
                        PresenceCache.Status(), Player.Seed,                                                                                   /* 26 */
                        BanchoClient.RequestInterval, BanchoClient.SendCount,                                                                  /* 28 */
                        MouseManager.MousePollRate,                                                                                            /* 29 */
                        SpriteManager.TotalSprites, SpriteManager.TotalSpritesVisible, GameBase.AmountVBO, GameBase.AmountTextures,            /* 33 */
                        RenderTarget2D.TotalRenderBuffers, RenderTarget2D.TotalFrameBuffers                                                    /* 35 */
                        );
                }
#endif
            }

            if (Math.Abs(monitor.FramesPerSecond - fpsDisplayValue) > 0.5)
            {
                fpsDisplayValue          = fpsDisplayValue * decay + Math.Min(targetFps, monitor.FramesPerSecond) * (1.0 - decay);
                textFpsDisplay.Text      = String.Format(@"{0:#,#}\", (int)Math.Round(fpsDisplayValue));
                textFpsLimitDisplay.Text = @"/" + targetFps + suffix;
            }

            IsFaded = Math.Abs(fpsDisplayValue - targetFps) < 0.5;

            //format the frame time displace (three significant digits)
            if (monitor.AverageFrameTime >= 10)
            {
                textFrameDelay.Text = monitor.AverageFrameTime.ToString(@"0") + '=';
            }
            else if (monitor.AverageFrameTime >= 1)
            {
                textFrameDelay.Text = monitor.AverageFrameTime.ToString(@"0.0") + '=';
            }
            else
            {
                textFrameDelay.Text = monitor.AverageFrameTime.ToString(@"0.00") + '=';
            }

            if (IsFaded)
            {
                backgroundFps.InitialColour = colour_okay;
            }
            else if (fpsDisplayValue > targetFps - 10 && fpsDisplayValue > targetFps * 0.95f)
            {
                backgroundFps.InitialColour = colour_warning;
            }
            else
            {
                backgroundFps.InitialColour = colour_danger;
            }

            if (monitor.AverageFrameTime < 8)
            {
                backgroundDelay.InitialColour = colour_okay;
            }
            else if (monitor.AverageFrameTime < 16)
            {
                backgroundDelay.InitialColour = colour_warning;
            }
            else
            {
                backgroundDelay.InitialColour = colour_danger;
            }

            updateDroppedFrames();
        }