using System; using System.Diagnostics.CodeAnalysis; using Robust.Shared.GameObjects; using static Robust.Client.GameObjects.SpriteComponent; namespace Robust.Client.GameObjects; // This partial class contains various public methods for manipulating layer mappings. public sealed partial class SpriteSystem { /// /// Map an enum to a layer index. /// public void LayerMapSet(Entity sprite, Enum key, int index) { if (!_query.Resolve(sprite.Owner, ref sprite.Comp)) return; if (index < 0 || index >= sprite.Comp.Layers.Count) throw new ArgumentOutOfRangeException(nameof(index)); sprite.Comp.LayerMap[key] = index; } /// /// Map string to a layer index. If possible, it is preferred to use an enum key. /// string keys mainly exist to make it easier to define custom layer keys in yaml. /// public void LayerMapSet(Entity sprite, string key, int index) { if (!_query.Resolve(sprite.Owner, ref sprite.Comp)) return; if (index < 0 || index >= sprite.Comp.Layers.Count) throw new ArgumentOutOfRangeException(nameof(index)); sprite.Comp.LayerMap[key] = index; } /// /// Map an enum to a layer index. /// public void LayerMapAdd(Entity sprite, Enum key, int index) { if (!_query.Resolve(sprite.Owner, ref sprite.Comp)) return; if (index < 0 || index >= sprite.Comp.Layers.Count) throw new ArgumentOutOfRangeException(nameof(index)); sprite.Comp.LayerMap.Add(key, index); } /// /// Map a string to a layer index. If possible, it is preferred to use an enum key. /// string keys mainly exist to make it easier to define custom layer keys in yaml. /// public void LayerMapAdd(Entity sprite, string key, int index) { if (!_query.Resolve(sprite.Owner, ref sprite.Comp)) return; if (index < 0 || index >= sprite.Comp.Layers.Count) throw new ArgumentOutOfRangeException(nameof(index)); sprite.Comp.LayerMap.Add(key, index); } /// /// Remove an enum mapping. /// public bool LayerMapRemove(Entity sprite, Enum key) { if (!_query.Resolve(sprite.Owner, ref sprite.Comp)) return false; return sprite.Comp.LayerMap.Remove(key); } /// /// Remove a string mapping. /// public bool LayerMapRemove(Entity sprite, string key) { if (!_query.Resolve(sprite.Owner, ref sprite.Comp)) return false; return sprite.Comp.LayerMap.Remove(key); } /// /// Remove an enum mapping. /// public bool LayerMapRemove(Entity sprite, Enum key, out int index) { if (_query.Resolve(sprite.Owner, ref sprite.Comp)) return sprite.Comp.LayerMap.Remove(key, out index); index = 0; return false; } /// /// Remove a string mapping. /// public bool LayerMapRemove(Entity sprite, string key, out int index) { if (_query.Resolve(sprite.Owner, ref sprite.Comp)) return sprite.Comp.LayerMap.Remove(key, out index); index = 0; return false; } /// /// Attempt to resolve an enum mapping. /// public bool LayerMapTryGet(Entity sprite, Enum key, out int index, bool logMissing) { if (!_query.Resolve(sprite.Owner, ref sprite.Comp, logMissing)) { index = 0; return false; } if (sprite.Comp.LayerMap.TryGetValue(key, out index)) return true; if (logMissing) Log.Error($"Layer with key '{key}' does not exist on entity {ToPrettyString(sprite)}! Trace:\n{Environment.StackTrace}"); return false; } /// /// Attempt to resolve a string mapping. /// public bool LayerMapTryGet(Entity sprite, string key, out int index, bool logMissing) { if (!_query.Resolve(sprite.Owner, ref sprite.Comp, logMissing)) { index = 0; return false; } if (sprite.Comp.LayerMap.TryGetValue(key, out index)) return true; if (logMissing) Log.Error($"Layer with key '{key}' does not exist on entity {ToPrettyString(sprite)}! Trace:\n{Environment.StackTrace}"); return false; } /// /// Attempt to resolve an enum mapping. /// public bool TryGetLayer(Entity sprite, Enum key, [NotNullWhen(true)] out Layer? layer, bool logMissing) { layer = null; if (!_query.Resolve(sprite.Owner, ref sprite.Comp, logMissing)) return false; return LayerMapTryGet(sprite, key, out var index, logMissing) && TryGetLayer(sprite, index, out layer, logMissing); } /// /// Attempt to resolve a string mapping. /// public bool TryGetLayer(Entity sprite, string key, [NotNullWhen(true)] out Layer? layer, bool logMissing) { layer = null; if (!_query.Resolve(sprite.Owner, ref sprite.Comp, logMissing)) return false; return LayerMapTryGet(sprite, key, out var index, logMissing) && TryGetLayer(sprite, index, out layer, logMissing); } public int LayerMapGet(Entity sprite, Enum key) { if (!_query.Resolve(sprite.Owner, ref sprite.Comp)) return -1; return sprite.Comp.LayerMap[key]; } public int LayerMapGet(Entity sprite, string key) { if (!_query.Resolve(sprite.Owner, ref sprite.Comp)) return -1; return sprite.Comp.LayerMap[key]; } public bool LayerExists(Entity sprite, string key) { if (!_query.Resolve(sprite.Owner, ref sprite.Comp)) return false; return sprite.Comp.LayerMap.TryGetValue(key, out var index) && LayerExists(sprite, index); } public bool LayerExists(Entity sprite, Enum key) { if (!_query.Resolve(sprite.Owner, ref sprite.Comp)) return false; return sprite.Comp.LayerMap.TryGetValue(key, out var index) && LayerExists(sprite, index); } /// /// Ensures that a layer with the given key exists and return the layer's index. /// If the layer does not yet exist, this will create and add a blank layer. /// public int LayerMapReserve(Entity sprite, Enum key) { if (!_query.Resolve(sprite.Owner, ref sprite.Comp)) return -1; if (LayerMapTryGet(sprite, key, out var layerIndex, false)) return layerIndex; var layer = AddBlankLayer(sprite!); LayerMapSet(sprite, key, layer.Index); return layer.Index; } /// public int LayerMapReserve(Entity sprite, string key) { if (!_query.Resolve(sprite.Owner, ref sprite.Comp)) return -1; if (LayerMapTryGet(sprite, key, out var layerIndex, false)) return layerIndex; var layer = AddBlankLayer(sprite!); LayerMapSet(sprite, key, layer.Index); return layer.Index; } public bool RemoveLayer(Entity sprite, string key, bool logMissing = true) { if (!_query.Resolve(sprite.Owner, ref sprite.Comp, logMissing)) return false; if (!LayerMapTryGet(sprite, key, out var index, logMissing)) return false; return RemoveLayer(sprite, index, logMissing); } public bool RemoveLayer(Entity sprite, Enum key, bool logMissing = true) { if (!_query.Resolve(sprite.Owner, ref sprite.Comp, logMissing)) return false; if (!LayerMapTryGet(sprite, key, out var index, logMissing)) return false; return RemoveLayer(sprite, index, logMissing); } public bool RemoveLayer( Entity sprite, string key, [NotNullWhen(true)] out Layer? layer, bool logMissing = true) { layer = null; if (!_query.Resolve(sprite.Owner, ref sprite.Comp, logMissing)) return false; if (!LayerMapTryGet(sprite, key, out var index, logMissing)) return false; return RemoveLayer(sprite, index, out layer, logMissing); } public bool RemoveLayer( Entity sprite, Enum key, [NotNullWhen(true)] out Layer? layer, bool logMissing = true) { layer = null; if (!_query.Resolve(sprite.Owner, ref sprite.Comp, logMissing)) return false; if (!LayerMapTryGet(sprite, key, out var index, logMissing)) return false; return RemoveLayer(sprite, index, out layer, logMissing); } }