Пример #1
0
        // Caution: The subjective values are strong with this one
        private static double spacingWeight(double distance, VitaruDifficultyCalculator.DifficultyType type)
        {
            switch (type)
            {
            case VitaruDifficultyCalculator.DifficultyType.Speed:
                if (distance > single_spacing_threshold)
                {
                    return(2.5);
                }
                else if (distance > stream_spacing_threshold)
                {
                    return(1.6 + 0.9 * (distance - stream_spacing_threshold) / (single_spacing_threshold - stream_spacing_threshold));
                }
                else if (distance > almost_diameter)
                {
                    return(1.2 + 0.4 * (distance - almost_diameter) / (stream_spacing_threshold - almost_diameter));
                }
                else if (distance > almost_diameter / 2)
                {
                    return(0.95 + 0.25 * (distance - almost_diameter / 2) / (almost_diameter / 2));
                }
                else
                {
                    return(0.95);
                }

            case VitaruDifficultyCalculator.DifficultyType.Aim:
                return(Math.Pow(distance, 0.99));
            }

            Debug.Assert(false, "Invalid vitaru difficulty hit object type.");
            return(0);
        }
Пример #2
0
        private void calculateSpecificStrain(VitaruHitObjectDifficulty previousHitObject, VitaruDifficultyCalculator.DifficultyType type, double timeRate)
        {
            double addition    = 0;
            double timeElapsed = (BaseHitObject.StartTime - previousHitObject.BaseHitObject.StartTime) / timeRate;
            double decay       = Math.Pow(DECAY_BASE[(int)type], timeElapsed / 1000);

            if (BaseHitObject.Type == HitObjectType.Enemy)
            {
                addition = spacingWeight(DistanceTo(previousHitObject), type) * spacing_weight_scaling[(int)type];
            }

            // You will never find maps that require this amongst ranked maps.
            addition /= Math.Max(timeElapsed, 50);

            Strains[(int)type] = previousHitObject.Strains[(int)type] * decay + addition;
        }