diff --git a/osu.Game/Beatmaps/Formats/OsuLegacyDecoder.cs b/osu.Game/Beatmaps/Formats/OsuLegacyDecoder.cs
index e2884dc5e2..8856d58d37 100644
--- a/osu.Game/Beatmaps/Formats/OsuLegacyDecoder.cs
+++ b/osu.Game/Beatmaps/Formats/OsuLegacyDecoder.cs
@@ -10,6 +10,7 @@ using osu.Game.Beatmaps.Timing;
using osu.Game.Beatmaps.Legacy;
using osu.Game.Rulesets.Objects.Legacy;
using osu.Game.Beatmaps.ControlPoints;
+using System.Linq;
namespace osu.Game.Beatmaps.Formats
{
@@ -206,18 +207,29 @@ namespace osu.Game.Beatmaps.Formats
}
}
+ ///
+ /// Decodes any beatmap variables present in a string value.
+ ///
+ /// The value which contains variables.
+ private void decodeVariables(ref string val)
+ {
+ while (val.IndexOf('$') >= 0)
+ {
+ string[] split = val.Split(',');
+ for (int i = 0; i < split.Length; i++)
+ {
+ var item = split[i];
+ if (item.StartsWith("$") && variables.ContainsKey(item))
+ item = variables[item];
+ }
+
+ val = string.Join(",", split);
+ }
+ }
+
private void handleEvents(Beatmap beatmap, string val)
{
- do
- {
- string[] valSplit = val.Split(',');
- for (int i = 0; i < valSplit.Length; i++)
- {
- if (valSplit[i][0] == '$' && variables.ContainsKey(valSplit[i]))
- valSplit[i] = variables[valSplit[i]];
- }
- val = string.Join(",", valSplit);
- } while (val.IndexOf('$') != -1);
+ decodeVariables(ref val);
string[] split = val.Split(',');
@@ -405,46 +417,56 @@ namespace osu.Game.Beatmaps.Formats
continue;
}
- string val = line, key = null;
- if (section != Section.Events && section != Section.TimingPoints && section != Section.HitObjects && section != Section.Variables)
- {
- key = val.Remove(val.IndexOf(':')).Trim();
- val = val.Substring(val.IndexOf(':') + 1).Trim();
- }
+ string key = null, value = null;
+
switch (section)
{
case Section.General:
- handleGeneral(beatmap, key, val);
+ case Section.Editor:
+ case Section.Metadata:
+ case Section.Difficulty:
+ case Section.Colours:
+ key = line.Remove(line.IndexOf(':')).Trim();
+ value = line.Substring(line.IndexOf(':') + 1).Trim();
+ break;
+ case Section.Variables:
+ key = line.Remove(line.IndexOf('=')).Trim();
+ value = line.Substring(line.IndexOf('=') + 1).Trim();
+ break;
+ }
+
+ switch (section)
+ {
+ case Section.General:
+ handleGeneral(beatmap, key, value);
break;
case Section.Editor:
- handleEditor(beatmap, key, val);
+ handleEditor(beatmap, key, value);
break;
case Section.Metadata:
- handleMetadata(beatmap, key, val);
+ handleMetadata(beatmap, key, value);
break;
case Section.Difficulty:
- handleDifficulty(beatmap, key, val);
+ handleDifficulty(beatmap, key, value);
break;
case Section.Events:
- handleEvents(beatmap, val);
+ handleEvents(beatmap, line);
break;
case Section.TimingPoints:
- handleTimingPoints(beatmap, val);
+ handleTimingPoints(beatmap, line);
break;
case Section.Colours:
- handleColours(beatmap, key, val, ref hasCustomColours);
+ handleColours(beatmap, key, value, ref hasCustomColours);
break;
case Section.HitObjects:
- var obj = parser.Parse(val);
+ var obj = parser.Parse(line);
if (obj != null)
beatmap.HitObjects.Add(obj);
break;
case Section.Variables:
- key = val.Remove(val.IndexOf('=')).Trim();
- val = val.Substring(val.IndexOf('=') + 1).Trim();
- variables[key] = val;
+ variables[key] = value;
break;
}
}