Exemple #1
0
        protected static bool TryGetChartType(Chart chart, out SMCommon.ChartType chartType)
        {
            // If the Chart's Type is already a supported ChartType, use that.
            if (SMCommon.TryGetChartType(chart.Type, out chartType))
            {
                return(true);
            }

            // Otherwise infer the ChartType from the number of inputs and players
            chartType = SMCommon.ChartType.dance_single;
            if (chart.NumPlayers == 1)
            {
                if (chart.NumInputs <= 3)
                {
                    chartType = SMCommon.ChartType.dance_threepanel;
                    return(true);
                }
                if (chart.NumInputs == 4)
                {
                    chartType = SMCommon.ChartType.dance_single;
                    return(true);
                }
                if (chart.NumInputs <= 6)
                {
                    chartType = SMCommon.ChartType.dance_solo;
                    return(true);
                }
                if (chart.NumInputs <= 8)
                {
                    chartType = SMCommon.ChartType.dance_double;
                    return(true);
                }
            }
            if (chart.NumPlayers == 2)
            {
                if (chart.NumInputs <= 8)
                {
                    chartType = SMCommon.ChartType.dance_routine;
                    return(true);
                }
            }

            return(false);
        }
        public override bool Parse(MSDFile.Value value)
        {
            // Only consider this line if it matches this property name.
            if (!ParseFirstParameter(value, out var type))
            {
                return(false);
            }

            Chart.Type = type;

            // Parse chart type and set number of players and inputs.
            if (!SMCommon.TryGetChartType(Chart.Type, out var smChartType))
            {
                Chart.Type = null;
                Logger?.Error($"{PropertyName}: Failed to parse {SMCommon.TagStepsType} value '{smChartType}'. This chart will be ignored.");
                return(true);
            }
            Chart.NumPlayers = SMCommon.Properties[(int)smChartType].NumPlayers;
            Chart.NumInputs  = SMCommon.Properties[(int)smChartType].NumInputs;

            Chart.Extras.AddSourceExtra(SMCommon.TagStepsType, Chart.Type, true);

            return(true);
        }
        public override bool Parse(MSDFile.Value value)
        {
            // Only consider this line if it matches this property name.
            if (!DoesValueMatchProperty(value))
            {
                return(false);
            }

            if (value.Params.Count < 7)
            {
                Logger?.Warn($"{PropertyName}: Expected at least 7 parameters. Found {value.Params.Count}. Ignoring all note data.");
                return(true);
            }

            var chart = new Chart
            {
                Type           = value.Params[1]?.Trim(SMCommon.SMAllWhiteSpace) ?? "",
                Description    = value.Params[2]?.Trim(SMCommon.SMAllWhiteSpace) ?? "",
                DifficultyType = value.Params[3]?.Trim(SMCommon.SMAllWhiteSpace) ?? ""
            };

            chart.Layers.Add(new Layer());

            // Record whether this chart was written under NOTES or NOTES2.
            chart.Extras.AddSourceExtra(SMCommon.TagFumenNotesType, PropertyName, true);

            // Parse the chart information before measure data.
            var chartDifficultyRatingStr = value.Params[4]?.Trim(SMCommon.SMAllWhiteSpace) ?? "";
            var chartRadarValuesStr      = value.Params[5]?.Trim(SMCommon.SMAllWhiteSpace) ?? "";

            // Parse the difficulty rating as a number.
            if (int.TryParse(chartDifficultyRatingStr, out var difficultyRatingInt))
            {
                chart.DifficultyRating = (double)difficultyRatingInt;
            }

            // Parse the radar values into a list.
            var radarValues    = new List <double>();
            var radarValuesStr = chartRadarValuesStr.Split(',');

            foreach (var radarValueStr in radarValuesStr)
            {
                if (double.TryParse(radarValueStr, out var d))
                {
                    radarValues.Add(d);
                }
            }
            chart.Extras.AddSourceExtra(SMCommon.TagRadarValues, radarValues, true);

            // Parse chart type and set number of players and inputs.
            if (!SMCommon.TryGetChartType(chart.Type, out var smChartType))
            {
                Logger?.Error($"{PropertyName}: Failed to parse {SMCommon.TagStepsType} value '{chart.Type}'. This chart will be ignored.");
                return(true);
            }
            chart.NumPlayers = SMCommon.Properties[(int)smChartType].NumPlayers;
            chart.NumInputs  = SMCommon.Properties[(int)smChartType].NumInputs;

            // Add a 4/4 time signature
            chart.Layers[0].Events.Add(new TimeSignature(new Fraction(SMCommon.NumBeatsPerMeasure, SMCommon.NumBeatsPerMeasure))
            {
                Position = new MetricPosition()
            });

            // Parse the notes.
            if (!ParseNotes(chart, value.Params[6] ?? ""))
            {
                return(true);
            }

            Song.Charts.Add(chart);

            return(true);
        }