mirror of
https://github.com/ppy/osu.git
synced 2024-12-14 15:33:05 +08:00
Merge pull request #2215 from peppy/fix-combo-colours
Fix beatmap combo colours not being applied
This commit is contained in:
commit
41036ab79e
@ -16,7 +16,7 @@ namespace osu.Game.Rulesets.Catch.Beatmaps
|
|||||||
{
|
{
|
||||||
public override void PostProcess(Beatmap<CatchHitObject> beatmap)
|
public override void PostProcess(Beatmap<CatchHitObject> beatmap)
|
||||||
{
|
{
|
||||||
if (beatmap.ComboColors.Count == 0)
|
if (beatmap.ComboColours.Count == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
int index = 0;
|
int index = 0;
|
||||||
@ -31,11 +31,11 @@ namespace osu.Game.Rulesets.Catch.Beatmaps
|
|||||||
if (obj.NewCombo)
|
if (obj.NewCombo)
|
||||||
{
|
{
|
||||||
if (lastObj != null) lastObj.LastInCombo = true;
|
if (lastObj != null) lastObj.LastInCombo = true;
|
||||||
colourIndex = (colourIndex + 1) % beatmap.ComboColors.Count;
|
colourIndex = (colourIndex + 1) % beatmap.ComboColours.Count;
|
||||||
}
|
}
|
||||||
|
|
||||||
obj.IndexInBeatmap = index++;
|
obj.IndexInBeatmap = index++;
|
||||||
obj.ComboColour = beatmap.ComboColors[colourIndex];
|
obj.ComboColour = beatmap.ComboColours[colourIndex];
|
||||||
|
|
||||||
lastObj = obj;
|
lastObj = obj;
|
||||||
}
|
}
|
||||||
|
@ -14,7 +14,7 @@ namespace osu.Game.Rulesets.Osu.Beatmaps
|
|||||||
{
|
{
|
||||||
applyStacking(beatmap);
|
applyStacking(beatmap);
|
||||||
|
|
||||||
if (beatmap.ComboColors.Count == 0)
|
if (beatmap.ComboColours.Count == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
int comboIndex = 0;
|
int comboIndex = 0;
|
||||||
@ -25,11 +25,11 @@ namespace osu.Game.Rulesets.Osu.Beatmaps
|
|||||||
if (obj.NewCombo)
|
if (obj.NewCombo)
|
||||||
{
|
{
|
||||||
comboIndex = 0;
|
comboIndex = 0;
|
||||||
colourIndex = (colourIndex + 1) % beatmap.ComboColors.Count;
|
colourIndex = (colourIndex + 1) % beatmap.ComboColours.Count;
|
||||||
}
|
}
|
||||||
|
|
||||||
obj.IndexInCurrentCombo = comboIndex++;
|
obj.IndexInCurrentCombo = comboIndex++;
|
||||||
obj.ComboColour = beatmap.ComboColors[colourIndex];
|
obj.ComboColour = beatmap.ComboColours[colourIndex];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -167,7 +167,7 @@ namespace osu.Game.Tests.Beatmaps.Formats
|
|||||||
using (var resStream = Resource.OpenResource("Soleily - Renatus (Gamu) [Insane].osu"))
|
using (var resStream = Resource.OpenResource("Soleily - Renatus (Gamu) [Insane].osu"))
|
||||||
using (var stream = new StreamReader(resStream))
|
using (var stream = new StreamReader(resStream))
|
||||||
{
|
{
|
||||||
var comboColors = decoder.Decode(stream).ComboColors;
|
var comboColors = decoder.Decode(stream).ComboColours;
|
||||||
|
|
||||||
Color4[] expectedColors =
|
Color4[] expectedColors =
|
||||||
{
|
{
|
||||||
|
@ -102,9 +102,9 @@ namespace osu.Game.Tests.Beatmaps.Formats
|
|||||||
new Color4(255, 187, 255, 255),
|
new Color4(255, 187, 255, 255),
|
||||||
new Color4(255, 177, 140, 255),
|
new Color4(255, 177, 140, 255),
|
||||||
};
|
};
|
||||||
Assert.AreEqual(expected.Length, beatmap.ComboColors.Count);
|
Assert.AreEqual(expected.Length, beatmap.ComboColours.Count);
|
||||||
for (int i = 0; i < expected.Length; i++)
|
for (int i = 0; i < expected.Length; i++)
|
||||||
Assert.AreEqual(expected[i], beatmap.ComboColors[i]);
|
Assert.AreEqual(expected[i], beatmap.ComboColours[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
@ -9,6 +9,7 @@ using System.Linq;
|
|||||||
using osu.Game.Beatmaps.ControlPoints;
|
using osu.Game.Beatmaps.ControlPoints;
|
||||||
using osu.Game.IO.Serialization;
|
using osu.Game.IO.Serialization;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
using osu.Game.Beatmaps.Formats;
|
||||||
using osu.Game.IO.Serialization.Converters;
|
using osu.Game.IO.Serialization.Converters;
|
||||||
|
|
||||||
namespace osu.Game.Beatmaps
|
namespace osu.Game.Beatmaps
|
||||||
@ -16,14 +17,14 @@ namespace osu.Game.Beatmaps
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// A Beatmap containing converted HitObjects.
|
/// A Beatmap containing converted HitObjects.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class Beatmap<T> : IJsonSerializable
|
public class Beatmap<T> : IJsonSerializable, IHasComboColours
|
||||||
where T : HitObject
|
where T : HitObject
|
||||||
{
|
{
|
||||||
public BeatmapInfo BeatmapInfo = new BeatmapInfo();
|
public BeatmapInfo BeatmapInfo = new BeatmapInfo();
|
||||||
public ControlPointInfo ControlPointInfo = new ControlPointInfo();
|
public ControlPointInfo ControlPointInfo = new ControlPointInfo();
|
||||||
public List<BreakPeriod> Breaks = new List<BreakPeriod>();
|
public List<BreakPeriod> Breaks = new List<BreakPeriod>();
|
||||||
|
|
||||||
public List<Color4> ComboColors = new List<Color4>
|
public List<Color4> ComboColours { get; set; } = new List<Color4>
|
||||||
{
|
{
|
||||||
new Color4(17, 136, 170, 255),
|
new Color4(17, 136, 170, 255),
|
||||||
new Color4(102, 136, 0, 255),
|
new Color4(102, 136, 0, 255),
|
||||||
@ -55,7 +56,7 @@ namespace osu.Game.Beatmaps
|
|||||||
BeatmapInfo = original?.BeatmapInfo.DeepClone() ?? BeatmapInfo;
|
BeatmapInfo = original?.BeatmapInfo.DeepClone() ?? BeatmapInfo;
|
||||||
ControlPointInfo = original?.ControlPointInfo ?? ControlPointInfo;
|
ControlPointInfo = original?.ControlPointInfo ?? ControlPointInfo;
|
||||||
Breaks = original?.Breaks ?? Breaks;
|
Breaks = original?.Breaks ?? Breaks;
|
||||||
ComboColors = original?.ComboColors ?? ComboColors;
|
ComboColours = original?.ComboColours ?? ComboColours;
|
||||||
HitObjects = original?.HitObjects ?? HitObjects;
|
HitObjects = original?.HitObjects ?? HitObjects;
|
||||||
|
|
||||||
if (original == null && Metadata == null)
|
if (original == null && Metadata == null)
|
||||||
|
@ -50,9 +50,14 @@ namespace osu.Game.Beatmaps
|
|||||||
protected virtual Beatmap<T> ConvertBeatmap(Beatmap original)
|
protected virtual Beatmap<T> ConvertBeatmap(Beatmap original)
|
||||||
{
|
{
|
||||||
var beatmap = CreateBeatmap();
|
var beatmap = CreateBeatmap();
|
||||||
|
|
||||||
|
// todo: this *must* share logic (or directly use) Beatmap<T>'s constructor.
|
||||||
|
// right now this isn't easily possible due to generic entanglement.
|
||||||
beatmap.BeatmapInfo = original.BeatmapInfo;
|
beatmap.BeatmapInfo = original.BeatmapInfo;
|
||||||
beatmap.ControlPointInfo = original.ControlPointInfo;
|
beatmap.ControlPointInfo = original.ControlPointInfo;
|
||||||
beatmap.HitObjects = original.HitObjects.SelectMany(h => convert(h, original)).ToList();
|
beatmap.HitObjects = original.HitObjects.SelectMany(h => convert(h, original)).ToList();
|
||||||
|
beatmap.Breaks = original.Breaks;
|
||||||
|
beatmap.ComboColours = original.ComboColours;
|
||||||
|
|
||||||
return beatmap;
|
return beatmap;
|
||||||
}
|
}
|
||||||
|
13
osu.Game/Beatmaps/Formats/IHasComboColours.cs
Normal file
13
osu.Game/Beatmaps/Formats/IHasComboColours.cs
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using OpenTK.Graphics;
|
||||||
|
|
||||||
|
namespace osu.Game.Beatmaps.Formats
|
||||||
|
{
|
||||||
|
public interface IHasComboColours
|
||||||
|
{
|
||||||
|
List<Color4> ComboColours { get; set; }
|
||||||
|
}
|
||||||
|
}
|
13
osu.Game/Beatmaps/Formats/IHasCustomColours.cs
Normal file
13
osu.Game/Beatmaps/Formats/IHasCustomColours.cs
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
// Copyright (c) 2007-2018 ppy Pty Ltd <contact@ppy.sh>.
|
||||||
|
// Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE
|
||||||
|
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using OpenTK.Graphics;
|
||||||
|
|
||||||
|
namespace osu.Game.Beatmaps.Formats
|
||||||
|
{
|
||||||
|
public interface IHasCustomColours
|
||||||
|
{
|
||||||
|
Dictionary<string, Color4> CustomColours { get; set; }
|
||||||
|
}
|
||||||
|
}
|
@ -5,7 +5,6 @@ using System;
|
|||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using OpenTK.Graphics;
|
|
||||||
using osu.Game.Beatmaps.Timing;
|
using osu.Game.Beatmaps.Timing;
|
||||||
using osu.Game.Rulesets.Objects.Legacy;
|
using osu.Game.Rulesets.Objects.Legacy;
|
||||||
using osu.Game.Beatmaps.ControlPoints;
|
using osu.Game.Beatmaps.ControlPoints;
|
||||||
@ -19,7 +18,6 @@ namespace osu.Game.Beatmaps.Formats
|
|||||||
|
|
||||||
private Beatmap beatmap;
|
private Beatmap beatmap;
|
||||||
|
|
||||||
private bool hasCustomColours;
|
|
||||||
private ConvertHitObjectParser parser;
|
private ConvertHitObjectParser parser;
|
||||||
|
|
||||||
private LegacySampleBank defaultSampleBank;
|
private LegacySampleBank defaultSampleBank;
|
||||||
@ -72,29 +70,28 @@ namespace osu.Game.Beatmaps.Formats
|
|||||||
{
|
{
|
||||||
case Section.General:
|
case Section.General:
|
||||||
handleGeneral(line);
|
handleGeneral(line);
|
||||||
break;
|
return;
|
||||||
case Section.Editor:
|
case Section.Editor:
|
||||||
handleEditor(line);
|
handleEditor(line);
|
||||||
break;
|
return;
|
||||||
case Section.Metadata:
|
case Section.Metadata:
|
||||||
handleMetadata(line);
|
handleMetadata(line);
|
||||||
break;
|
return;
|
||||||
case Section.Difficulty:
|
case Section.Difficulty:
|
||||||
handleDifficulty(line);
|
handleDifficulty(line);
|
||||||
break;
|
return;
|
||||||
case Section.Events:
|
case Section.Events:
|
||||||
handleEvents(line);
|
handleEvents(line);
|
||||||
break;
|
return;
|
||||||
case Section.TimingPoints:
|
case Section.TimingPoints:
|
||||||
handleTimingPoints(line);
|
handleTimingPoints(line);
|
||||||
break;
|
return;
|
||||||
case Section.Colours:
|
|
||||||
handleColours(line);
|
|
||||||
break;
|
|
||||||
case Section.HitObjects:
|
case Section.HitObjects:
|
||||||
handleHitObjects(line);
|
handleHitObjects(line);
|
||||||
break;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
base.ParseLine(beatmap, section, line);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void handleGeneral(string line)
|
private void handleGeneral(string line)
|
||||||
@ -364,38 +361,6 @@ namespace osu.Game.Beatmaps.Formats
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void handleColours(string line)
|
|
||||||
{
|
|
||||||
var pair = SplitKeyVal(line, ':');
|
|
||||||
|
|
||||||
string[] split = pair.Value.Split(',');
|
|
||||||
|
|
||||||
if (split.Length != 3)
|
|
||||||
throw new InvalidOperationException($@"Color specified in incorrect format (should be R,G,B): {pair.Value}");
|
|
||||||
|
|
||||||
byte r, g, b;
|
|
||||||
if (!byte.TryParse(split[0], out r) || !byte.TryParse(split[1], out g) || !byte.TryParse(split[2], out b))
|
|
||||||
throw new InvalidOperationException(@"Color must be specified with 8-bit integer components");
|
|
||||||
|
|
||||||
if (!hasCustomColours)
|
|
||||||
{
|
|
||||||
beatmap.ComboColors.Clear();
|
|
||||||
hasCustomColours = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Note: the combo index specified in the beatmap is discarded
|
|
||||||
if (pair.Key.StartsWith(@"Combo"))
|
|
||||||
{
|
|
||||||
beatmap.ComboColors.Add(new Color4
|
|
||||||
{
|
|
||||||
R = r / 255f,
|
|
||||||
G = g / 255f,
|
|
||||||
B = b / 255f,
|
|
||||||
A = 1f,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void handleHitObjects(string line)
|
private void handleHitObjects(string line)
|
||||||
{
|
{
|
||||||
// If the ruleset wasn't specified, assume the osu!standard ruleset.
|
// If the ruleset wasn't specified, assume the osu!standard ruleset.
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
using OpenTK.Graphics;
|
||||||
|
|
||||||
namespace osu.Game.Beatmaps.Formats
|
namespace osu.Game.Beatmaps.Formats
|
||||||
{
|
{
|
||||||
@ -40,7 +41,53 @@ namespace osu.Game.Beatmaps.Formats
|
|||||||
|
|
||||||
protected virtual bool ShouldSkipLine(string line) => string.IsNullOrWhiteSpace(line) || line.StartsWith("//");
|
protected virtual bool ShouldSkipLine(string line) => string.IsNullOrWhiteSpace(line) || line.StartsWith("//");
|
||||||
|
|
||||||
protected abstract void ParseLine(T output, Section section, string line);
|
protected virtual void ParseLine(T output, Section section, string line)
|
||||||
|
{
|
||||||
|
switch (section)
|
||||||
|
{
|
||||||
|
case Section.Colours:
|
||||||
|
handleColours(output, line);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool hasComboColours;
|
||||||
|
|
||||||
|
private void handleColours(T output, string line)
|
||||||
|
{
|
||||||
|
var pair = SplitKeyVal(line, ':');
|
||||||
|
|
||||||
|
bool isCombo = pair.Key.StartsWith(@"Combo");
|
||||||
|
|
||||||
|
string[] split = pair.Value.Split(',');
|
||||||
|
|
||||||
|
if (split.Length != 3)
|
||||||
|
throw new InvalidOperationException($@"Color specified in incorrect format (should be R,G,B): {pair.Value}");
|
||||||
|
|
||||||
|
if (!byte.TryParse(split[0], out var r) || !byte.TryParse(split[1], out var g) || !byte.TryParse(split[2], out var b))
|
||||||
|
throw new InvalidOperationException(@"Color must be specified with 8-bit integer components");
|
||||||
|
|
||||||
|
Color4 colour = new Color4(r, g, b, 255);
|
||||||
|
|
||||||
|
if (isCombo)
|
||||||
|
{
|
||||||
|
if (!(output is IHasComboColours tHasComboColours)) return;
|
||||||
|
|
||||||
|
if (!hasComboColours)
|
||||||
|
{
|
||||||
|
// remove default colours.
|
||||||
|
tHasComboColours.ComboColours.Clear();
|
||||||
|
hasComboColours = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
tHasComboColours.ComboColours.Add(colour);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!(output is IHasCustomColours tHasCustomColours)) return;
|
||||||
|
tHasCustomColours.CustomColours[pair.Key] = colour;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected KeyValuePair<string, string> SplitKeyVal(string line, char separator)
|
protected KeyValuePair<string, string> SplitKeyVal(string line, char separator)
|
||||||
{
|
{
|
||||||
@ -65,6 +112,7 @@ namespace osu.Game.Beatmaps.Formats
|
|||||||
Colours,
|
Colours,
|
||||||
HitObjects,
|
HitObjects,
|
||||||
Variables,
|
Variables,
|
||||||
|
Fonts
|
||||||
}
|
}
|
||||||
|
|
||||||
internal enum LegacySampleBank
|
internal enum LegacySampleBank
|
||||||
|
@ -46,11 +46,13 @@ namespace osu.Game.Beatmaps.Formats
|
|||||||
{
|
{
|
||||||
case Section.Events:
|
case Section.Events:
|
||||||
handleEvents(line);
|
handleEvents(line);
|
||||||
break;
|
return;
|
||||||
case Section.Variables:
|
case Section.Variables:
|
||||||
handleVariables(line);
|
handleVariables(line);
|
||||||
break;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
base.ParseLine(storyboard, section, line);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void handleEvents(string line)
|
private void handleEvents(string line)
|
||||||
|
@ -267,6 +267,8 @@
|
|||||||
<Compile Include="Beatmaps\DifficultyCalculator.cs" />
|
<Compile Include="Beatmaps\DifficultyCalculator.cs" />
|
||||||
<Compile Include="Beatmaps\Drawables\BeatmapBackgroundSprite.cs" />
|
<Compile Include="Beatmaps\Drawables\BeatmapBackgroundSprite.cs" />
|
||||||
<Compile Include="Beatmaps\Drawables\BeatmapSetCover.cs" />
|
<Compile Include="Beatmaps\Drawables\BeatmapSetCover.cs" />
|
||||||
|
<Compile Include="Beatmaps\Formats\IHasComboColours.cs" />
|
||||||
|
<Compile Include="Beatmaps\Formats\IHasCustomColours.cs" />
|
||||||
<Compile Include="Beatmaps\Formats\JsonBeatmapDecoder.cs" />
|
<Compile Include="Beatmaps\Formats\JsonBeatmapDecoder.cs" />
|
||||||
<Compile Include="Beatmaps\Formats\LegacyDecoder.cs" />
|
<Compile Include="Beatmaps\Formats\LegacyDecoder.cs" />
|
||||||
<Compile Include="Beatmaps\Formats\LegacyStoryboardDecoder.cs" />
|
<Compile Include="Beatmaps\Formats\LegacyStoryboardDecoder.cs" />
|
||||||
|
Loading…
Reference in New Issue
Block a user