public Oppai.pp_calc GetIfFcPP(ModsInfo mods, int n300, int n100, int n50, int nmiss)
        {
            double acc = Oppai.acc_calc(n300, n100, n50, nmiss) * 100.0;

            Oppai.acc_round(acc, m_cache.nobjects, nmiss, out n300, out n100, out n50);

            bool need_update = false;

            need_update = need_update || _fc_n100 != n100;
            need_update = need_update || _fc_n50 != n50;


            if (need_update)
            {
                _fc_n100 = n100;
                _fc_n50  = n50;

                Oppai.rtpp_params args;
                args.combo = Oppai.FullCombo;
                args.mods  = (uint)mods.Mod;
                args.n100  = n100;
                args.n50   = n50;
                args.nmiss = 0;

                Oppai.get_ppv2(m_beatmap_raw, (uint)m_beatmap_raw.Length, ref args, true, m_cache, ref _fc_result);
            }

            return(_fc_result);
        }
        public Oppai.pp_calc GetRealTimePP(int end_time, ModsInfo mods, int n100, int n50, int nmiss, int max_combo)
        {
            int pos = GetPosition(end_time);

            bool need_update = false;

            need_update = need_update || _pos != pos;
            need_update = need_update || _n100 != n100;
            need_update = need_update || _n50 != n50;
            need_update = need_update || _nmiss != nmiss;
            need_update = need_update || _max_combo != max_combo;

            if (need_update)
            {
                _pos       = pos;
                _n100      = n100;
                _n50       = n50;
                _nmiss     = nmiss;
                _max_combo = max_combo;

                Oppai.rtpp_params args;
                args.combo = max_combo;
                args.mods  = (uint)mods.Mod;
                args.n100  = n100;
                args.n50   = n50;
                args.nmiss = nmiss;

                if (!Oppai.get_ppv2(m_beatmap_raw, (uint)pos, ref args, false, null, ref _rtpp_result))
                {
                    return(Oppai.pp_calc.Empty);
                }
            }

            return(_rtpp_result);
        }
        public Oppai.pp_calc GetMaxPP(ModsInfo mods)
        {
            bool need_update = false;

            need_update = need_update || mods != _max_mods;

            if (need_update)
            {
                _max_mods = mods;

                Oppai.rtpp_params args;
                args.combo = Oppai.FullCombo;
                args.mods  = (uint)mods.Mod;
                args.n100  = 0;
                args.n50   = 0;
                args.nmiss = 0;

                //Cache Beatmap
                Oppai.get_ppv2(m_beatmap_raw, (uint)m_beatmap_raw.Length, ref args, false, m_cache, ref _max_result);
            }
            return(_max_result);
        }