6
StarHorizon_Public/Content.Server/Sprite/RandomSpriteSystem.cs
2025-11-05 11:11:22 +03:00

92 lines
2.9 KiB
C#

using Content.Shared.Decals;
using Content.Shared.Random.Helpers;
using Content.Shared.Sprite;
using Robust.Shared.GameStates;
using Robust.Shared.Prototypes;
using Robust.Shared.Random;
namespace Content.Server.Sprite;
public sealed class RandomSpriteSystem: SharedRandomSpriteSystem
{
[Dependency] private readonly IPrototypeManager _prototype = default!;
[Dependency] private readonly IRobustRandom _random = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<RandomSpriteComponent, ComponentGetState>(OnGetState);
SubscribeLocalEvent<RandomSpriteComponent, MapInitEvent>(OnMapInit);
}
private void OnMapInit(EntityUid uid, RandomSpriteComponent component, MapInitEvent args)
{
if (component.Selected.Count > 0)
return;
if (component.Available.Count == 0)
return;
// Frontier: select mapped colours
Dictionary<string, Color> mappedColors = new();
foreach (var (key, value) in component.MappedColors)
{
if (_prototype.TryIndex<ColorPalettePrototype>(value, out var palette))
mappedColors[key] = _random.Pick(palette.Colors.Values);
}
// End Frontier: select mapped colours
var groups = new List<Dictionary<string, Dictionary<string, string?>>>();
if (component.GetAllGroups)
{
groups = component.Available;
}
else
{
groups.Add(_random.Pick(component.Available));
}
component.Selected.EnsureCapacity(groups.Count);
Color? previousColor = null;
foreach (var group in groups)
{
foreach (var layer in group)
{
Color? color = null;
var selectedState = _random.Pick(layer.Value);
if (!string.IsNullOrEmpty(selectedState.Value))
{
if (selectedState.Value == $"Inherit")
color = previousColor;
// Frontier: mapped colours
else if (mappedColors.TryGetValue(selectedState.Value, out var mappedColor))
{
color = mappedColor;
}
// End Frontier
else
{
color = _random.Pick(_prototype.Index<ColorPalettePrototype>(selectedState.Value).Colors.Values);
previousColor = color;
}
}
component.Selected.Add(layer.Key, (selectedState.Key, color));
}
}
Dirty(uid, component);
}
private void OnGetState(EntityUid uid, RandomSpriteComponent component, ref ComponentGetState args)
{
args.State = new RandomSpriteColorComponentState()
{
Selected = component.Selected,
};
}
}