--- /dev/null
+using Content.Shared.IconSmoothing;
+using Robust.Client.GameObjects;
+
+namespace Content.Client.IconSmoothing;
+
+public sealed class ClientRandomIconSmoothSystem : SharedRandomIconSmoothSystem
+{
+ [Dependency] private readonly IconSmoothSystem _iconSmooth = default!;
+ [Dependency] private readonly AppearanceSystem _appearance = default!;
+
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ SubscribeLocalEvent<RandomIconSmoothComponent, AppearanceChangeEvent>(OnAppearanceChange);
+ }
+
+ private void OnAppearanceChange(Entity<RandomIconSmoothComponent> ent, ref AppearanceChangeEvent args)
+ {
+ if (!TryComp<IconSmoothComponent>(ent, out var smooth))
+ return;
+
+ if (!_appearance.TryGetData<string>(ent, RandomIconSmoothState.State, out var state, args.Component))
+ return;
+
+ smooth.StateBase = state;
+ _iconSmooth.SetStateBase(ent, smooth, state);
+ }
+}
/// Prepended to the RSI state.
/// </summary>
[ViewVariables(VVAccess.ReadWrite), DataField("base")]
- public string StateBase { get; private set; } = string.Empty;
+ public string StateBase { get; set; } = string.Empty;
[DataField("shader", customTypeSerializer:typeof(PrototypeIdSerializer<ShaderPrototype>))]
public string? Shader;
if (component.Mode != IconSmoothingMode.Corners || !TryComp(uid, out SpriteComponent? sprite))
return;
+ SetCornerLayers(sprite, component);
+
+ if (component.Shader != null)
+ {
+ sprite.LayerSetShader(CornerLayers.SE, component.Shader);
+ sprite.LayerSetShader(CornerLayers.NE, component.Shader);
+ sprite.LayerSetShader(CornerLayers.NW, component.Shader);
+ sprite.LayerSetShader(CornerLayers.SW, component.Shader);
+ }
+ }
+
+ public void SetStateBase(EntityUid uid, IconSmoothComponent component, string newState)
+ {
+ if (!TryComp<SpriteComponent>(uid, out var sprite))
+ return;
+
+ component.StateBase = newState;
+ SetCornerLayers(sprite, component);
+ }
+
+ private void SetCornerLayers(SpriteComponent sprite, IconSmoothComponent component)
+ {
+ sprite.LayerMapRemove(CornerLayers.SE);
+ sprite.LayerMapRemove(CornerLayers.NE);
+ sprite.LayerMapRemove(CornerLayers.NW);
+ sprite.LayerMapRemove(CornerLayers.SW);
+
var state0 = $"{component.StateBase}0";
sprite.LayerMapSet(CornerLayers.SE, sprite.AddLayerState(state0));
sprite.LayerSetDirOffset(CornerLayers.SE, DirectionOffset.None);
sprite.LayerSetDirOffset(CornerLayers.NW, DirectionOffset.Flip);
sprite.LayerMapSet(CornerLayers.SW, sprite.AddLayerState(state0));
sprite.LayerSetDirOffset(CornerLayers.SW, DirectionOffset.Clockwise);
-
- if (component.Shader != null)
- {
- sprite.LayerSetShader(CornerLayers.SE, component.Shader);
- sprite.LayerSetShader(CornerLayers.NE, component.Shader);
- sprite.LayerSetShader(CornerLayers.NW, component.Shader);
- sprite.LayerSetShader(CornerLayers.SW, component.Shader);
- }
}
private void OnShutdown(EntityUid uid, IconSmoothComponent component, ComponentShutdown args)
--- /dev/null
+using Content.Shared.IconSmoothing;
+using Robust.Shared.Random;
+
+namespace Content.Server.IconSmoothing;
+
+public sealed partial class RandomIconSmoothSystem : SharedRandomIconSmoothSystem
+{
+ [Dependency] private readonly IRobustRandom _random = default!;
+ [Dependency] private readonly SharedAppearanceSystem _appearance = default!;
+
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ SubscribeLocalEvent<RandomIconSmoothComponent, MapInitEvent>(OnMapInit);
+ }
+
+ private void OnMapInit(Entity<RandomIconSmoothComponent> ent, ref MapInitEvent args)
+ {
+ if (ent.Comp.RandomStates.Count == 0)
+ return;
+
+ var state = _random.Pick(ent.Comp.RandomStates);
+ _appearance.SetData(ent, RandomIconSmoothState.State, state);
+ }
+}
--- /dev/null
+using Robust.Shared.GameStates;
+
+namespace Content.Shared.IconSmoothing;
+
+/// <summary>
+/// Allow randomize StateBase of IconSmoothComponent for random visual variation
+/// </summary>
+[RegisterComponent, NetworkedComponent]
+public sealed partial class RandomIconSmoothComponent : Component
+{
+ /// <summary>
+ /// StateBase will be randomly selected from this list. Allows to randomize the visual.
+ /// </summary>
+ [DataField(required: true)]
+ public List<string> RandomStates = new();
+}
--- /dev/null
+using Robust.Shared.Serialization;
+
+namespace Content.Shared.IconSmoothing;
+
+public abstract class SharedRandomIconSmoothSystem : EntitySystem
+{
+}
+[Serializable, NetSerializable]
+public enum RandomIconSmoothState : byte
+{
+ State
+}
- type: IconSmooth
key: walls
base: mining
+ - type: RandomIconSmooth
+ randomStates:
+ - mining
+ - miningB
+ - type: Appearance
- type: entity
parent: WallShuttleDiagonal
"y": 32
},
"states": [
- {
+ {
"name": "full"
},
- {
+ {
"name": "mining0",
- "directions": 4
+ "directions": 4
},
- {
+ {
"name": "mining1",
- "directions": 4
+ "directions": 4
},
- {
+ {
"name": "mining2",
- "directions": 4
+ "directions": 4
},
- {
+ {
"name": "mining3",
- "directions": 4
+ "directions": 4
},
- {
+ {
"name": "mining4",
- "directions": 4
+ "directions": 4
},
- {
+ {
"name": "mining5",
- "directions": 4
+ "directions": 4
},
- {
+ {
"name": "mining6",
- "directions": 4
+ "directions": 4
},
- {
+ {
"name": "mining7",
- "directions": 4
+ "directions": 4
+ },
+ {
+ "name": "miningB0",
+ "directions": 4
+ },
+ {
+ "name": "miningB1",
+ "directions": 4
+ },
+ {
+ "name": "miningB2",
+ "directions": 4
+ },
+ {
+ "name": "miningB3",
+ "directions": 4
+ },
+ {
+ "name": "miningB4",
+ "directions": 4
+ },
+ {
+ "name": "miningB5",
+ "directions": 4
+ },
+ {
+ "name": "miningB6",
+ "directions": 4
+ },
+ {
+ "name": "miningB7",
+ "directions": 4
}
]
}