diff --git a/OpenRA.Game/Map/CellLayer.cs b/OpenRA.Game/Map/CellLayer.cs index fbebff2cc3..d46d84c10b 100644 --- a/OpenRA.Game/Map/CellLayer.cs +++ b/OpenRA.Game/Map/CellLayer.cs @@ -10,42 +10,28 @@ #endregion using System; -using System.Collections; -using System.Collections.Generic; using OpenRA.Primitives; namespace OpenRA { // Represents a layer of "something" that covers the map - public class CellLayer : IEnumerable + public sealed class CellLayer : CellLayerBase { - public readonly Size Size; - readonly Rectangle bounds; - public readonly MapGridType GridType; public event Action CellEntryChanged = null; - readonly T[] entries; - public CellLayer(Map map) - : this(map.Grid.Type, new Size(map.MapSize.X, map.MapSize.Y)) { } + : base(map) { } public CellLayer(MapGridType gridType, Size size) - { - Size = size; - bounds = new Rectangle(0, 0, Size.Width, Size.Height); - GridType = gridType; - entries = new T[size.Width * size.Height]; - } + : base(gridType, size) { } - public void CopyValuesFrom(CellLayer anotherLayer) + public override void CopyValuesFrom(CellLayerBase anotherLayer) { - if (Size != anotherLayer.Size || GridType != anotherLayer.GridType) - throw new ArgumentException( - "layers must have a matching size and shape (grid type).", "anotherLayer"); if (CellEntryChanged != null) throw new InvalidOperationException( "Cannot copy values when there are listeners attached to the CellEntryChanged event."); - Array.Copy(anotherLayer.entries, entries, entries.Length); + + base.CopyValuesFrom(anotherLayer); } public static CellLayer CreateInstance(Func initialCellValueFactory, Size size, MapGridType mapGridType) @@ -109,23 +95,6 @@ namespace OpenRA } } - /// Clears the layer contents with a known value - public void Clear(T clearValue) - { - for (var i = 0; i < entries.Length; i++) - entries[i] = clearValue; - } - - public IEnumerator GetEnumerator() - { - return ((IEnumerable)entries).GetEnumerator(); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - public bool Contains(CPos cell) { // .ToMPos() returns the same result if the X and Y coordinates diff --git a/OpenRA.Game/Map/CellLayerBase.cs b/OpenRA.Game/Map/CellLayerBase.cs new file mode 100644 index 0000000000..6cb5411a28 --- /dev/null +++ b/OpenRA.Game/Map/CellLayerBase.cs @@ -0,0 +1,63 @@ +#region Copyright & License Information +/* + * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. For more + * information, see COPYING. + */ +#endregion + +using System; +using System.Collections; +using System.Collections.Generic; +using OpenRA.Primitives; + +namespace OpenRA +{ + public abstract class CellLayerBase : IEnumerable + { + public readonly Size Size; + public readonly MapGridType GridType; + + protected readonly T[] entries; + protected readonly Rectangle bounds; + + public CellLayerBase(Map map) + : this(map.Grid.Type, new Size(map.MapSize.X, map.MapSize.Y)) { } + + public CellLayerBase(MapGridType gridType, Size size) + { + Size = size; + bounds = new Rectangle(0, 0, Size.Width, Size.Height); + GridType = gridType; + entries = new T[size.Width * size.Height]; + } + + public virtual void CopyValuesFrom(CellLayerBase anotherLayer) + { + if (Size != anotherLayer.Size || GridType != anotherLayer.GridType) + throw new ArgumentException("Layers must have a matching size and shape (grid type).", "anotherLayer"); + + Array.Copy(anotherLayer.entries, entries, entries.Length); + } + + /// Clears the layer contents with a known value + public void Clear(T clearValue) + { + for (var i = 0; i < entries.Length; i++) + entries[i] = clearValue; + } + + public IEnumerator GetEnumerator() + { + return ((IEnumerable)entries).GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + } +}