Modification start date
[BattleCats.git] / Assets / Scripts / Imported / Tilemap / GridInformation / Scripts / GridInformation.cs
blob9510e3aa8bf1b6f37312ad0a97d1cfcbd154474b
1 using System;
2 using System.Collections;
3 using System.Collections.Generic;
4 using System.Linq;
6 namespace UnityEngine.Tilemaps
8 [Serializable]
9 internal enum GridInformationType
11 Integer,
12 String,
13 Float,
14 Double,
15 UnityObject,
16 Color
19 [Serializable]
20 [AddComponentMenu("Tilemap/Grid Information")]
21 public class GridInformation : MonoBehaviour, ISerializationCallbackReceiver
23 internal struct GridInformationValue
25 public GridInformationType type;
26 public object data;
29 [Serializable]
30 internal struct GridInformationKey
32 public Vector3Int position;
33 public String name;
36 private Dictionary<GridInformationKey, GridInformationValue> m_PositionProperties = new Dictionary<GridInformationKey, GridInformationValue>();
37 internal Dictionary<GridInformationKey, GridInformationValue> PositionProperties
39 get { return m_PositionProperties; }
42 [SerializeField]
43 [HideInInspector]
44 private List<GridInformationKey> m_PositionIntKeys = new List<GridInformationKey>();
46 [SerializeField]
47 [HideInInspector]
48 private List<int> m_PositionIntValues = new List<int>();
50 [SerializeField]
51 [HideInInspector]
52 private List<GridInformationKey> m_PositionStringKeys = new List<GridInformationKey>();
54 [SerializeField]
55 [HideInInspector]
56 private List<String> m_PositionStringValues = new List<String>();
58 [SerializeField]
59 [HideInInspector]
60 private List<GridInformationKey> m_PositionFloatKeys = new List<GridInformationKey>();
62 [SerializeField]
63 [HideInInspector]
64 private List<float> m_PositionFloatValues = new List<float>();
66 [SerializeField]
67 [HideInInspector]
68 private List<GridInformationKey> m_PositionDoubleKeys = new List<GridInformationKey>();
70 [SerializeField]
71 [HideInInspector]
72 private List<Double> m_PositionDoubleValues = new List<Double>();
74 [SerializeField]
75 [HideInInspector]
76 private List<GridInformationKey> m_PositionObjectKeys = new List<GridInformationKey>();
78 [SerializeField]
79 [HideInInspector]
80 private List<Object> m_PositionObjectValues = new List<Object>();
82 [SerializeField]
83 [HideInInspector]
84 private List<GridInformationKey> m_PositionColorKeys = new List<GridInformationKey>();
86 [SerializeField]
87 [HideInInspector]
88 private List<Color> m_PositionColorValues = new List<Color>();
90 void ISerializationCallbackReceiver.OnBeforeSerialize()
92 Grid grid = GetComponentInParent<Grid>();
93 if (grid == null)
94 return;
96 m_PositionIntKeys.Clear();
97 m_PositionIntValues.Clear();
98 m_PositionStringKeys.Clear();
99 m_PositionStringValues.Clear();
100 m_PositionFloatKeys.Clear();
101 m_PositionFloatValues.Clear();
102 m_PositionDoubleKeys.Clear();
103 m_PositionDoubleValues.Clear();
104 m_PositionObjectKeys.Clear();
105 m_PositionObjectValues.Clear();
106 m_PositionColorKeys.Clear();
107 m_PositionColorValues.Clear();
109 foreach (var kvp in m_PositionProperties)
111 switch (kvp.Value.type)
113 case GridInformationType.Integer:
114 m_PositionIntKeys.Add(kvp.Key);
115 m_PositionIntValues.Add((int)kvp.Value.data);
116 break;
117 case GridInformationType.String:
118 m_PositionStringKeys.Add(kvp.Key);
119 m_PositionStringValues.Add(kvp.Value.data as String);
120 break;
121 case GridInformationType.Float:
122 m_PositionFloatKeys.Add(kvp.Key);
123 m_PositionFloatValues.Add((float)kvp.Value.data);
124 break;
125 case GridInformationType.Double:
126 m_PositionDoubleKeys.Add(kvp.Key);
127 m_PositionDoubleValues.Add((double)kvp.Value.data);
128 break;
129 case GridInformationType.Color:
130 m_PositionColorKeys.Add(kvp.Key);
131 m_PositionColorValues.Add((Color)kvp.Value.data);
132 break;
133 default:
134 m_PositionObjectKeys.Add(kvp.Key);
135 m_PositionObjectValues.Add(kvp.Value.data as Object);
136 break;
141 void ISerializationCallbackReceiver.OnAfterDeserialize()
143 m_PositionProperties.Clear();
144 for (int i = 0; i != Math.Min(m_PositionIntKeys.Count, m_PositionIntValues.Count); i++)
146 GridInformationValue positionValue;
147 positionValue.type = GridInformationType.Integer;
148 positionValue.data = m_PositionIntValues[i];
149 m_PositionProperties.Add(m_PositionIntKeys[i], positionValue);
151 for (int i = 0; i != Math.Min(m_PositionStringKeys.Count, m_PositionStringValues.Count); i++)
153 GridInformationValue positionValue;
154 positionValue.type = GridInformationType.String;
155 positionValue.data = m_PositionStringValues[i];
156 m_PositionProperties.Add(m_PositionStringKeys[i], positionValue);
158 for (int i = 0; i != Math.Min(m_PositionFloatKeys.Count, m_PositionFloatValues.Count); i++)
160 GridInformationValue positionValue;
161 positionValue.type = GridInformationType.Float;
162 positionValue.data = m_PositionFloatValues[i];
163 m_PositionProperties.Add(m_PositionFloatKeys[i], positionValue);
165 for (int i = 0; i != Math.Min(m_PositionDoubleKeys.Count, m_PositionDoubleValues.Count); i++)
167 GridInformationValue positionValue;
168 positionValue.type = GridInformationType.Double;
169 positionValue.data = m_PositionDoubleValues[i];
170 m_PositionProperties.Add(m_PositionDoubleKeys[i], positionValue);
172 for (int i = 0; i != Math.Min(m_PositionObjectKeys.Count, m_PositionObjectValues.Count); i++)
174 GridInformationValue positionValue;
175 positionValue.type = GridInformationType.UnityObject;
176 positionValue.data = m_PositionObjectValues[i];
177 m_PositionProperties.Add(m_PositionObjectKeys[i], positionValue);
179 for (int i = 0; i != Math.Min(m_PositionColorKeys.Count, m_PositionColorValues.Count); i++)
181 GridInformationValue positionValue;
182 positionValue.type = GridInformationType.Color;
183 positionValue.data = m_PositionColorValues[i];
184 m_PositionProperties.Add(m_PositionColorKeys[i], positionValue);
188 public bool SetPositionProperty<T>(Vector3Int position, String name, T positionProperty)
190 throw new NotImplementedException("Storing this type is not accepted in GridInformation");
193 public bool SetPositionProperty(Vector3Int position, String name, int positionProperty)
195 return SetPositionProperty(position, name, GridInformationType.Integer, positionProperty);
198 public bool SetPositionProperty(Vector3Int position, String name, string positionProperty)
200 return SetPositionProperty(position, name, GridInformationType.String, positionProperty);
203 public bool SetPositionProperty(Vector3Int position, String name, float positionProperty)
205 return SetPositionProperty(position, name, GridInformationType.Float, positionProperty);
208 public bool SetPositionProperty(Vector3Int position, String name, double positionProperty)
210 return SetPositionProperty(position, name, GridInformationType.Double, positionProperty);
213 public bool SetPositionProperty(Vector3Int position, String name, UnityEngine.Object positionProperty)
215 return SetPositionProperty(position, name, GridInformationType.UnityObject, positionProperty);
218 public bool SetPositionProperty(Vector3Int position, String name, Color positionProperty)
220 return SetPositionProperty(position, name, GridInformationType.Color, positionProperty);
223 private bool SetPositionProperty(Vector3Int position, String name, GridInformationType dataType, System.Object positionProperty)
225 Grid grid = GetComponentInParent<Grid>();
226 if (grid != null && positionProperty != null)
228 GridInformationKey positionKey;
229 positionKey.position = position;
230 positionKey.name = name;
232 GridInformationValue positionValue;
233 positionValue.type = dataType;
234 positionValue.data = positionProperty;
236 m_PositionProperties[positionKey] = positionValue;
237 return true;
239 return false;
242 public T GetPositionProperty<T>(Vector3Int position, String name, T defaultValue) where T : UnityEngine.Object
244 GridInformationKey positionKey;
245 positionKey.position = position;
246 positionKey.name = name;
248 GridInformationValue positionValue;
249 if (m_PositionProperties.TryGetValue(positionKey, out positionValue))
251 if (positionValue.type != GridInformationType.UnityObject)
252 throw new InvalidCastException("Value stored in GridInformation is not of the right type");
253 return positionValue.data as T;
255 return defaultValue;
258 public int GetPositionProperty(Vector3Int position, String name, int defaultValue)
260 GridInformationKey positionKey;
261 positionKey.position = position;
262 positionKey.name = name;
264 GridInformationValue positionValue;
265 if (m_PositionProperties.TryGetValue(positionKey, out positionValue))
267 if (positionValue.type != GridInformationType.Integer)
268 throw new InvalidCastException("Value stored in GridInformation is not of the right type");
269 return (int)positionValue.data;
271 return defaultValue;
274 public string GetPositionProperty(Vector3Int position, String name, string defaultValue)
276 GridInformationKey positionKey;
277 positionKey.position = position;
278 positionKey.name = name;
280 GridInformationValue positionValue;
281 if (m_PositionProperties.TryGetValue(positionKey, out positionValue))
283 if (positionValue.type != GridInformationType.String)
284 throw new InvalidCastException("Value stored in GridInformation is not of the right type");
285 return (string)positionValue.data;
287 return defaultValue;
290 public float GetPositionProperty(Vector3Int position, String name, float defaultValue)
292 GridInformationKey positionKey;
293 positionKey.position = position;
294 positionKey.name = name;
296 GridInformationValue positionValue;
297 if (m_PositionProperties.TryGetValue(positionKey, out positionValue))
299 if (positionValue.type != GridInformationType.Float)
300 throw new InvalidCastException("Value stored in GridInformation is not of the right type");
301 return (float)positionValue.data;
303 return defaultValue;
306 public double GetPositionProperty(Vector3Int position, String name, double defaultValue)
308 GridInformationKey positionKey;
309 positionKey.position = position;
310 positionKey.name = name;
312 GridInformationValue positionValue;
313 if (m_PositionProperties.TryGetValue(positionKey, out positionValue))
315 if (positionValue.type != GridInformationType.Double)
316 throw new InvalidCastException("Value stored in GridInformation is not of the right type");
317 return (double)positionValue.data;
319 return defaultValue;
322 public Color GetPositionProperty(Vector3Int position, String name, Color defaultValue)
324 GridInformationKey positionKey;
325 positionKey.position = position;
326 positionKey.name = name;
328 GridInformationValue positionValue;
329 if (m_PositionProperties.TryGetValue(positionKey, out positionValue))
331 if (positionValue.type != GridInformationType.Color)
332 throw new InvalidCastException("Value stored in GridInformation is not of the right type");
333 return (Color)positionValue.data;
335 return defaultValue;
338 public bool ErasePositionProperty(Vector3Int position, String name)
340 GridInformationKey positionKey;
341 positionKey.position = position;
342 positionKey.name = name;
343 return m_PositionProperties.Remove(positionKey);
346 public virtual void Reset()
348 m_PositionProperties.Clear();
351 public Vector3Int[] GetAllPositions(string propertyName)
353 return m_PositionProperties.Keys.ToList().FindAll(x => x.name == propertyName).Select(x => x.position).ToArray();