using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine; namespace TowerDefense.Towers.Data { /// /// The asset which holds the list of different towers /// [CreateAssetMenu(fileName = "TowerLibrary.asset", menuName = "TowerDefense/Tower Library", order = 1)] public class TowerLibrary : ScriptableObject, IList, IDictionary { /// /// The list of all the towers /// public List configurations; /// /// The internal reference to the dictionary made from the list of towers /// with the name of tower as the key /// Dictionary m_ConfigurationDictionary; /// /// The accessor to the towers by index /// /// public Tower this[int index] { get { return configurations[index]; } } public void OnBeforeSerialize() { } /// /// Convert the list (m_Configurations) to a dictionary for access via name /// public void OnAfterDeserialize() { if (configurations == null) { return; } m_ConfigurationDictionary = configurations.ToDictionary(t => t.towerName); } public bool ContainsKey(string key) { return m_ConfigurationDictionary.ContainsKey(key); } public void Add(string key, Tower value) { m_ConfigurationDictionary.Add(key, value); } public bool Remove(string key) { return m_ConfigurationDictionary.Remove(key); } public bool TryGetValue(string key, out Tower value) { return m_ConfigurationDictionary.TryGetValue(key, out value); } Tower IDictionary.this[string key] { get { return m_ConfigurationDictionary[key]; } set { m_ConfigurationDictionary[key] = value; } } public ICollection Keys { get { return ((IDictionary) m_ConfigurationDictionary).Keys; } } ICollection IDictionary.Values { get { return m_ConfigurationDictionary.Values; } } IEnumerator> IEnumerable>.GetEnumerator() { return m_ConfigurationDictionary.GetEnumerator(); } public void Add(KeyValuePair item) { m_ConfigurationDictionary.Add(item.Key, item.Value); } public bool Remove(KeyValuePair item) { return m_ConfigurationDictionary.Remove(item.Key); } public bool Contains(KeyValuePair item) { return m_ConfigurationDictionary.Contains(item); } public void CopyTo(KeyValuePair[] array, int arrayIndex) { int count = array.Length; for (int i = arrayIndex; i < count; i++) { Tower config = configurations[i - arrayIndex]; KeyValuePair current = new KeyValuePair(config.towerName, config); array[i] = current; } } public int IndexOf(Tower item) { return configurations.IndexOf(item); } public void Insert(int index, Tower item) { configurations.Insert(index, item); } public void RemoveAt(int index) { configurations.RemoveAt(index); } Tower IList.this[int index] { get { return configurations[index]; } set { configurations[index] = value; } } public IEnumerator GetEnumerator() { return configurations.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable) configurations).GetEnumerator(); } public void Add(Tower item) { configurations.Add(item); } public void Clear() { configurations.Clear(); } public bool Contains(Tower item) { return configurations.Contains(item); } public void CopyTo(Tower[] array, int arrayIndex) { configurations.CopyTo(array, arrayIndex); } public bool Remove(Tower item) { return configurations.Remove(item); } public int Count { get { return configurations.Count; } } public bool IsReadOnly { get { return ((ICollection) configurations).IsReadOnly; } } } }