1
0
mirror of https://github.com/ppy/osu.git synced 2024-12-21 07:53:38 +08:00
osu-lazer/osu.Game/Skinning/LegacyManiaSkinDecoder.cs

155 lines
6.0 KiB
C#
Raw Normal View History

2020-03-30 16:18:09 +08:00
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
2022-06-17 15:37:17 +08:00
#nullable disable
using System;
2020-03-30 16:18:09 +08:00
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
2020-03-30 16:36:57 +08:00
using System.Linq;
2020-03-30 16:18:09 +08:00
using osu.Game.Beatmaps.Formats;
namespace osu.Game.Skinning
{
public class LegacyManiaSkinDecoder : LegacyDecoder<List<LegacyManiaSkinConfiguration>>
{
public LegacyManiaSkinDecoder()
: base(1)
{
}
private readonly List<string> pendingLines = new List<string>();
private LegacyManiaSkinConfiguration currentConfig;
protected override void OnBeginNewSection(Section section)
{
base.OnBeginNewSection(section);
// If a new section is reached with pending lines remaining, they can all be discarded as there isn't a valid configuration to parse them into.
pendingLines.Clear();
currentConfig = null;
}
protected override void ParseLine(List<LegacyManiaSkinConfiguration> output, Section section, string line)
{
switch (section)
{
case Section.Mania:
var pair = SplitKeyVal(line);
switch (pair.Key)
{
case "Keys":
currentConfig = new LegacyManiaSkinConfiguration(int.Parse(pair.Value, CultureInfo.InvariantCulture));
2020-03-30 16:36:57 +08:00
// Silently ignore duplicate configurations.
if (output.All(c => c.Keys != currentConfig.Keys))
output.Add(currentConfig);
2020-03-30 16:18:09 +08:00
// All existing lines can be flushed now that we have a valid configuration.
flushPendingLines();
break;
default:
pendingLines.Add(line);
// Hold all lines until a "Keys" item is found.
if (currentConfig != null)
flushPendingLines();
break;
}
break;
}
}
private void flushPendingLines()
{
Debug.Assert(currentConfig != null);
foreach (string line in pendingLines)
2020-03-30 16:18:09 +08:00
{
var pair = SplitKeyVal(line);
switch (pair.Key)
{
case "ColumnLineWidth":
parseArrayValue(pair.Value, currentConfig.ColumnLineWidth, false);
2020-03-30 16:18:09 +08:00
break;
case "ColumnSpacing":
parseArrayValue(pair.Value, currentConfig.ColumnSpacing);
break;
case "ColumnWidth":
parseArrayValue(pair.Value, currentConfig.ColumnWidth);
break;
case "HitPosition":
currentConfig.HitPosition = (480 - Math.Clamp(float.Parse(pair.Value, CultureInfo.InvariantCulture), 240, 480)) * LegacyManiaSkinConfiguration.POSITION_SCALE_FACTOR;
2020-03-30 16:18:09 +08:00
break;
2020-03-31 11:26:31 +08:00
case "LightPosition":
2020-04-02 13:24:09 +08:00
currentConfig.LightPosition = (480 - float.Parse(pair.Value, CultureInfo.InvariantCulture)) * LegacyManiaSkinConfiguration.POSITION_SCALE_FACTOR;
break;
case "ScorePosition":
currentConfig.ScorePosition = (float.Parse(pair.Value, CultureInfo.InvariantCulture)) * LegacyManiaSkinConfiguration.POSITION_SCALE_FACTOR;
break;
2020-03-31 11:26:31 +08:00
case "JudgementLine":
currentConfig.ShowJudgementLine = pair.Value == "1";
break;
2020-04-02 13:29:16 +08:00
case "KeysUnderNotes":
currentConfig.KeysUnderNotes = pair.Value == "1";
break;
2020-04-02 13:29:16 +08:00
case "LightingNWidth":
parseArrayValue(pair.Value, currentConfig.ExplosionWidth);
break;
2020-08-26 19:21:41 +08:00
case "LightingLWidth":
parseArrayValue(pair.Value, currentConfig.HoldNoteLightWidth);
break;
case "WidthForNoteHeightScale":
2020-04-08 17:17:45 +08:00
float minWidth = float.Parse(pair.Value, CultureInfo.InvariantCulture) * LegacyManiaSkinConfiguration.POSITION_SCALE_FACTOR;
if (minWidth > 0)
currentConfig.MinimumColumnWidth = minWidth;
break;
2022-06-24 20:25:23 +08:00
case string when pair.Key.StartsWith("Colour", StringComparison.Ordinal):
HandleColours(currentConfig, line, true);
break;
2020-06-12 22:48:18 +08:00
// Custom sprite paths
2022-06-24 20:25:23 +08:00
case string when pair.Key.StartsWith("NoteImage", StringComparison.Ordinal):
case string when pair.Key.StartsWith("KeyImage", StringComparison.Ordinal):
case string when pair.Key.StartsWith("Hit", StringComparison.Ordinal):
case string when pair.Key.StartsWith("Stage", StringComparison.Ordinal):
case string when pair.Key.StartsWith("Lighting", StringComparison.Ordinal):
currentConfig.ImageLookups[pair.Key] = pair.Value;
break;
2020-03-30 16:18:09 +08:00
}
}
pendingLines.Clear();
2020-03-30 16:18:09 +08:00
}
private void parseArrayValue(string value, float[] output, bool applyScaleFactor = true)
2020-03-30 16:18:09 +08:00
{
string[] values = value.Split(',');
for (int i = 0; i < values.Length; i++)
{
if (i >= output.Length)
break;
output[i] = float.Parse(values[i], CultureInfo.InvariantCulture) * (applyScaleFactor ? LegacyManiaSkinConfiguration.POSITION_SCALE_FACTOR : 1);
2020-03-30 16:18:09 +08:00
}
}
}
}