示例#1
0
        public Mods GeteModsFromInt(int mods)
        {
            Mods eMods = Mods.Omod;

            foreach (var key in ModsConv.Keys)
            {
                if ((mods & key) > 0)
                {
                    eMods = eMods | ModsConv[key].Item1;
                }
            }
            return(eMods);
        }
                       ar_ms_step2 = 150; // ar5-10

        public Dictionary <string, float> ApplyMods(Beatmap map, Mods mods)
        {
            float od       = map.OverallDifficulty;
            float ar       = map.ApproachRate;
            float cs       = map.CircleSize;
            var   retValue = new Dictionary <string, float>();

            if ((mods & Mods.MapChanging) == 0)
            {
                retValue.Add("AR", ar);
                retValue.Add("CS", cs);
                retValue.Add("OD", od);
                return(retValue);
            }

            float speed = 1;

            if ((mods & Mods.Dt) != 0 || (mods & Mods.Nc) != 0)
            {
                speed *= 1.5f;
            }
            if ((mods & Mods.Ht) != 0)
            {
                speed *= 0.75f;
            }

            float od_multiplier = 1;

            if ((mods & Mods.Hr) != 0)
            {
                od_multiplier *= 1.4f;
            }
            if ((mods & Mods.Ez) != 0)
            {
                od_multiplier *= 0.5f;
            }

            od *= od_multiplier;
            float odms = od0_ms - (float)Math.Ceiling(od_ms_step * od);

            //ar
            float ar_multiplier = 1;

            if ((mods & Mods.Hr) != 0)
            {
                ar_multiplier *= 1.4f;
            }
            if ((mods & Mods.Ez) != 0)
            {
                ar_multiplier *= 0.5f;
            }

            ar *= ar_multiplier;
            float arms = ar <= 5
            ? (ar0_ms - ar_ms_step1 * ar)
            : (ar5_ms - ar_ms_step2 * (ar - 5));

            //cs
            float cs_multiplier = 1;

            if ((mods & Mods.Hr) != 0)
            {
                cs_multiplier *= 1.3f;
            }
            if ((mods & Mods.Ez) != 0)
            {
                cs_multiplier *= 0.5f;
            }

            // stats must be capped to 0-10 before HT/DT which bring them to a range
            // of -4.42 to 11.08 for OD and -5 to 11 for AR
            odms = Math.Min(od0_ms, Math.Max(od10_ms, odms));
            arms = Math.Min(ar0_ms, Math.Max(ar10_ms, arms));

            // apply speed-changing mods
            odms /= speed;
            arms /= speed;

            // convert OD and AR back into their stat form
            //od = (-(odms - od0_ms)) / od_ms_step;
            od = (od0_ms - odms) / od_ms_step;
            ar = ar <= 5.0f
                ? ((ar0_ms - arms) / ar_ms_step1)
                : (5.0f + (ar5_ms - arms) / ar_ms_step2);

            cs *= cs_multiplier;
            cs  = Math.Max(0.0f, Math.Min(10.0f, cs));

            retValue.Add("AR", ar);
            retValue.Add("CS", cs);
            retValue.Add("OD", od);

            if ((mods & Mods.SpeedChanging) == 0)
            {
                return(retValue);
            }

            return(retValue);
        }