Fix layers displaying in cable stacks (#4028)
* Fix layers displaying in cable stacks Fixed stackVisualizer to use another round method * Fix ShadowCommander review * Change to expected Result
This commit is contained in:
@@ -8,7 +8,6 @@ using Robust.Client.GameObjects;
|
||||
using Robust.Shared.GameObjects;
|
||||
using Robust.Shared.Serialization.Manager.Attributes;
|
||||
using Robust.Shared.Utility;
|
||||
using YamlDotNet.RepresentationModel;
|
||||
|
||||
namespace Content.Client.GameObjects.Components
|
||||
{
|
||||
@@ -60,8 +59,7 @@ namespace Content.Client.GameObjects.Components
|
||||
/// Sprite layers used in stack visualizer. Sprites first in layer correspond to lower stack states
|
||||
/// e.g. <code>_spriteLayers[0]</code> is lower stack level than <code>_spriteLayers[1]</code>.
|
||||
/// </summary>
|
||||
[DataField("stackLayers")]
|
||||
private readonly List<string> _spriteLayers = new();
|
||||
[DataField("stackLayers")] private readonly List<string> _spriteLayers = new();
|
||||
|
||||
/// <summary>
|
||||
/// Determines if the visualizer uses composite or non-composite layers for icons. Defaults to false.
|
||||
@@ -76,10 +74,9 @@ namespace Content.Client.GameObjects.Components
|
||||
/// </list>
|
||||
///
|
||||
/// </summary>
|
||||
[DataField("composite")]
|
||||
private bool _isComposite;
|
||||
[DataField("sprite")]
|
||||
private ResourcePath? _spritePath;
|
||||
[DataField("composite")] private bool _isComposite;
|
||||
|
||||
[DataField("sprite")] private ResourcePath? _spritePath;
|
||||
|
||||
public override void InitializeEntity(IEntity entity)
|
||||
{
|
||||
@@ -126,7 +123,7 @@ namespace Content.Client.GameObjects.Components
|
||||
maxCount = _spriteLayers.Count;
|
||||
}
|
||||
|
||||
var activeLayer = ContentHelpers.RoundToNearestLevels(actual, maxCount, _spriteLayers.Count - 1);
|
||||
var activeLayer = ContentHelpers.RoundToEqualLevels(actual, maxCount, _spriteLayers.Count);
|
||||
spriteComponent.LayerSetState(IconLayer, _spriteLayers[activeLayer]);
|
||||
}
|
||||
|
||||
|
||||
@@ -78,7 +78,7 @@ namespace Content.Shared.Utility
|
||||
/// <param name="max">The maximum value of the scale.</param>
|
||||
/// <param name="levels">Number of segments the scale is subdivided into.</param>
|
||||
/// <returns>The segment <paramref name="actual"/> lies on.</returns>
|
||||
/// <exception cref="ArgumentException"></exception>
|
||||
/// <exception cref="ArgumentException">If level is 1 or less</exception>
|
||||
public static int RoundToNearestLevels(double actual, double max, int levels)
|
||||
{
|
||||
if (levels <= 1)
|
||||
@@ -98,5 +98,42 @@ namespace Content.Shared.Utility
|
||||
|
||||
return (int) Math.Round(actual / max * levels, MidpointRounding.AwayFromZero);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Basically helper for when you need to choose 0..N-1 element based on what
|
||||
/// percentage does actual/max takes.
|
||||
/// Example:
|
||||
/// We have a stack of 30 <paramref name="max"/> elements.
|
||||
/// When <paramref name="actual"/> is:
|
||||
/// - 0..9 we return 0.
|
||||
/// - 10..19 we return 1.
|
||||
/// - 20..30 we return 2.
|
||||
///
|
||||
/// Useful when selecting N sprites for display in stacks, etc.
|
||||
/// </summary>
|
||||
/// <param name="actual">How many out of max elements are there</param>
|
||||
/// <param name="max"></param>
|
||||
/// <param name="levels"></param>
|
||||
/// <returns>The </returns>
|
||||
/// <exception cref="ArgumentException">if level is one or less</exception>
|
||||
public static int RoundToEqualLevels(double actual, double max, int levels)
|
||||
{
|
||||
if (levels <= 1)
|
||||
{
|
||||
throw new ArgumentException("Levels must be greater than 1.", nameof(levels));
|
||||
}
|
||||
|
||||
if (actual >= max)
|
||||
{
|
||||
return levels - 1;
|
||||
}
|
||||
|
||||
if (actual <= 0)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
return (int) Math.Round(actual / max * levels, MidpointRounding.ToZero);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -97,5 +97,54 @@ namespace Content.Tests.Shared.Utility
|
||||
(double val, double max, int size, int expected) = data;
|
||||
Assert.That(ContentHelpers.RoundToNearestLevels(val, max, size), Is.EqualTo(expected));
|
||||
}
|
||||
|
||||
[Parallelizable]
|
||||
[Test]
|
||||
// Testing odd max on even levels
|
||||
[TestCase(0, 5, 2, ExpectedResult = 0)]
|
||||
[TestCase(1, 5, 2, ExpectedResult = 0)]
|
||||
[TestCase(2, 5, 2, ExpectedResult = 0)]
|
||||
[TestCase(3, 5, 2, ExpectedResult = 1)]
|
||||
[TestCase(4, 5, 2, ExpectedResult = 1)]
|
||||
[TestCase(5, 5, 2, ExpectedResult = 1)]
|
||||
// Testing even max on odd levels
|
||||
[TestCase(0, 6, 3, ExpectedResult = 0)]
|
||||
[TestCase(1, 6, 3, ExpectedResult = 0)]
|
||||
[TestCase(2, 6, 3, ExpectedResult = 1)]
|
||||
[TestCase(3, 6, 3, ExpectedResult = 1)]
|
||||
[TestCase(4, 6, 3, ExpectedResult = 2)]
|
||||
[TestCase(5, 6, 3, ExpectedResult = 2)]
|
||||
[TestCase(6, 6, 3, ExpectedResult = 2)]
|
||||
// Testing even max on even levels
|
||||
[TestCase(0, 4, 2, ExpectedResult = 0)]
|
||||
[TestCase(1, 4, 2, ExpectedResult = 0)]
|
||||
[TestCase(2, 4, 2, ExpectedResult = 1)]
|
||||
[TestCase(3, 4, 2, ExpectedResult = 1)]
|
||||
[TestCase(4, 4, 2, ExpectedResult = 1)]
|
||||
// Testing odd max on odd levels
|
||||
[TestCase(0, 5, 3, ExpectedResult = 0)]
|
||||
[TestCase(1, 5, 3, ExpectedResult = 0)]
|
||||
[TestCase(2, 5, 3, ExpectedResult = 1)]
|
||||
[TestCase(3, 5, 3, ExpectedResult = 1)]
|
||||
[TestCase(4, 5, 3, ExpectedResult = 2)]
|
||||
// Larger odd max on odd levels
|
||||
[TestCase(0, 7, 3, ExpectedResult = 0)]
|
||||
[TestCase(1, 7, 3, ExpectedResult = 0)]
|
||||
[TestCase(2, 7, 3, ExpectedResult = 0)]
|
||||
[TestCase(3, 7, 3, ExpectedResult = 1)]
|
||||
[TestCase(4, 7, 3, ExpectedResult = 1)]
|
||||
[TestCase(5, 7, 3, ExpectedResult = 2)]
|
||||
[TestCase(6, 7, 3, ExpectedResult = 2)]
|
||||
[TestCase(7, 7, 3, ExpectedResult = 2)]
|
||||
// Testing edge cases
|
||||
[TestCase(0.1, 6, 5, ExpectedResult = 0)]
|
||||
[TestCase(-32, 6, 5, ExpectedResult = 0)]
|
||||
[TestCase(2.4, 6, 5, ExpectedResult = 1)]
|
||||
[TestCase(2.5, 6, 5, ExpectedResult = 2)]
|
||||
[TestCase(320, 6, 5, ExpectedResult = 4)]
|
||||
public int TestEqual(double val, double max, int size)
|
||||
{
|
||||
return ContentHelpers.RoundToEqualLevels(val, max, size);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user