PageRenderTime 66ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 1ms

/ArtemisMissionEditor/SpaceMap/MapObjectNamed.cs

https://github.com/russjudge/ArtemisMissionEditor
C# | 1612 lines | 1219 code | 245 blank | 148 comment | 309 complexity | 8d5e8a0e0d81300ebdc84b6fa8d99e33 MD5 | raw file

Large files files are truncated, but you can click here to view the full file

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Reflection;
  6. using System.ComponentModel;
  7. using System.Globalization;
  8. using System.Windows.Forms;
  9. using System.Windows.Forms.Design;
  10. using System.Drawing;
  11. using System.Xml;
  12. namespace ArtemisMissionEditor.SpaceMap
  13. {
  14. public sealed class HullIDConverter : StringConverter
  15. {
  16. public override bool GetStandardValuesSupported(ITypeDescriptorContext context) { return true; }
  17. public override bool GetStandardValuesExclusive(ITypeDescriptorContext context) { return true; }
  18. public override TypeConverter.StandardValuesCollection
  19. GetStandardValues(ITypeDescriptorContext context)
  20. {
  21. List<string> tmp = new List<string>();
  22. tmp.Add("None");
  23. foreach (string id in VesselData.Current.VesselList.Keys)
  24. tmp.Add(VesselData.Current.VesselToString(id));
  25. return new StandardValuesCollection(tmp.ToArray());
  26. }
  27. }
  28. public class MapObjectNamed
  29. {
  30. //IMPORTED
  31. [Browsable(false)]
  32. public bool Imported { get; set; }
  33. //COORDINATES
  34. public Coordinates3D _coordinates;
  35. [DisplayName("Coordinates"), Description("The coordinates of the object's center on the space map"), Category("\t\t\tPosition")]
  36. public virtual Coordinates3D Coordinates { get { return _coordinates; } set { _coordinates = value; } }
  37. //NAME
  38. private string _name;
  39. [DisplayName("Name"), Description("Indicates object's name, if any"), Category("ID")]
  40. public string name { get { return _name; } set { _name = value; } }
  41. #region SHARED
  42. public object GetPropertyByName(string pName)
  43. {
  44. Type t = GetType();
  45. PropertyInfo p = t.GetProperty(pName);
  46. return p.GetValue(this, null);
  47. }
  48. public void SetPropertyByName(string pName, object value)
  49. {
  50. Type t = GetType();
  51. PropertyInfo p = t.GetProperty(pName);
  52. p.SetValue(this, value, null);
  53. }
  54. protected static void __AddNewAttribute(XmlDocument doc, XmlElement element, string name, string value)
  55. {
  56. XmlAttribute att = doc.CreateAttribute(name);
  57. att.Value = value;
  58. element.Attributes.Append(att);
  59. }
  60. protected static void __RememberPropertyIfMissing(List<string> missingProperties, string pName, bool required)
  61. {
  62. if (!required) return;
  63. missingProperties.Add(pName);
  64. }
  65. public static MapObjectNamed NewFromXml(XmlNode item)
  66. {
  67. if (!(item is XmlElement))
  68. return null;
  69. string type = "";
  70. MapObjectNamed mo = null;
  71. foreach (XmlAttribute att in item.Attributes)
  72. if (att.Name == "type") type = att.Value.ToString();
  73. switch (type)
  74. {
  75. case "anomaly":
  76. mo = new MapObjectNamed_anomaly();
  77. break;
  78. case "blackHole":
  79. mo = new MapObjectNamed_blackHole();
  80. break;
  81. case "enemy":
  82. mo = new MapObjectNamed_enemy();
  83. break;
  84. case "neutral":
  85. mo = new MapObjectNamed_neutral();
  86. break;
  87. case "station":
  88. mo = new MapObjectNamed_station();
  89. break;
  90. case "player":
  91. mo = new MapObjectNamed_player();
  92. break;
  93. case "genericMesh":
  94. mo = new MapObjectNamed_genericMesh();
  95. break;
  96. case "monster":
  97. mo = new MapObjectNamed_monster();
  98. break;
  99. case "whale":
  100. mo = new MapObjectNamed_whale();
  101. break;
  102. case "nebulas":
  103. return null;
  104. case "asteroids":
  105. return null;
  106. case "mines":
  107. return null;
  108. default:
  109. return null;
  110. }
  111. mo.FromXml(item);
  112. return mo;
  113. }
  114. public static bool IsPropertyPresent(string pName, MapObjectNamed[] selection)
  115. {
  116. foreach (MapObjectNamed item in selection)
  117. if (item.IsPropertyAvailable(pName))
  118. return true;
  119. return false;
  120. }
  121. #endregion
  122. #region INHERITANCE
  123. //SELECTION
  124. public bool Selected;
  125. //Selected flag
  126. [Browsable(false)]
  127. public virtual bool _selectionAbsolute { get { return false; } }
  128. [Browsable(false)]
  129. public virtual int _selectionSize { get { return 15; } }
  130. //PROPERTIES
  131. //Is property available for this type of object
  132. public virtual bool IsPropertyAvailable(string pName) { if (pName == "x" || pName == "y" || pName == "z" || pName == "coordinates" || pName == "name") return true; return false; }
  133. //Is property mandatory for this type of object (server crash w/o this property)
  134. public virtual bool IsPropertyMandatory(string pName) { if (pName == "x" || pName == "y" || pName == "z" || pName == "coordinates") return true; return false; }
  135. //TYPE
  136. [Browsable(false)]
  137. public virtual string TypeToString { get { return "null"; } }
  138. [Browsable(false)]
  139. public virtual string TypeToStringShort { get { return "null"; } }
  140. [DisplayName("Type"), Description("Indicates object's type (enemy, station, neutral etc.)"), Category("ID")]
  141. public string TypeToString_Display
  142. {
  143. get
  144. {
  145. int i;
  146. string s = TypeToString;
  147. if (string.IsNullOrEmpty(s)) return string.Empty;
  148. for (i = s.Length-1; i >=0; i--)
  149. {
  150. if (char.IsUpper(s[i]))
  151. {
  152. s = s.Insert(i, " ");
  153. }
  154. }
  155. return char.ToUpper(s[0]) + s.Substring(1);
  156. }
  157. }
  158. //COPIER
  159. public virtual void Copy(bool excludeCoordinates, params MapObjectNamed[] source)
  160. {
  161. bool same, found;
  162. if (source.Count() == 0)
  163. return;
  164. //Coordinates
  165. if (!excludeCoordinates)
  166. {
  167. Coordinates3D tmp1 = new Coordinates3D();
  168. same = true; found = false;
  169. foreach (MapObjectNamed item in source)
  170. if (item.IsPropertyAvailable("coordinates"))
  171. if (!found)
  172. {
  173. found = true;
  174. tmp1 = item.Coordinates;
  175. }
  176. else
  177. same = same && (item.Coordinates != tmp1);
  178. if (found && same)
  179. this._coordinates = tmp1;
  180. }
  181. //Name
  182. string tmp2 = "";
  183. same = true; found = false;
  184. foreach (MapObjectNamed item in source)
  185. if (item.IsPropertyAvailable("name"))
  186. if (!found)
  187. {
  188. found = true;
  189. tmp2 = item.name;
  190. }
  191. else
  192. same = same && (item.name != tmp2);
  193. if (found && same)
  194. this.name = tmp2;
  195. }
  196. //TO XML
  197. public virtual XmlElement ToXml(XmlDocument xDoc, List<string> missingProperties, string type = "")
  198. {
  199. XmlElement create = xDoc.CreateElement("create");
  200. __AddNewAttribute(xDoc, create, "type", type);
  201. __AddNewAttribute(xDoc, create, "x", Helper.DoubleToString(_coordinates.X));
  202. __AddNewAttribute(xDoc, create, "y", Helper.DoubleToString(_coordinates.Y));
  203. __AddNewAttribute(xDoc, create, "z", Helper.DoubleToString(_coordinates.Z));
  204. if (!String.IsNullOrEmpty(name))
  205. __AddNewAttribute(xDoc, create, "name", name);
  206. else
  207. __RememberPropertyIfMissing(missingProperties, "name", IsPropertyMandatory("name"));
  208. return create;
  209. }
  210. //FROM XML
  211. public virtual void FromXml(XmlNode item)
  212. {
  213. foreach (XmlAttribute att in item.Attributes)
  214. switch (att.Name)
  215. {
  216. case "x":
  217. _coordinates.X = Helper.StringToDouble(att.Value);
  218. break;
  219. case "y":
  220. _coordinates.Y = Helper.StringToDouble(att.Value);
  221. break;
  222. case "z":
  223. _coordinates.Z = Helper.StringToDouble(att.Value);
  224. break;
  225. case "name":
  226. _name = att.Value;
  227. break;
  228. }
  229. }
  230. //CONSTRUCTOR
  231. public MapObjectNamed(int posX = 0, int posY = 0, int posZ = 0, string name = "", bool makeSelected = false)
  232. { _coordinates = new Coordinates3D(true, posX, posY, posZ); Selected = makeSelected; _name = name; Imported = false; }
  233. #endregion
  234. }
  235. public class MapObjectNamedA : MapObjectNamed
  236. {
  237. //ANGLE
  238. private double _a;
  239. [DisplayName("Angle"), Description("Indicates object's angle in degrees relative to the upright position, clockwise rotation considered positive"), Category("\t\t\tPosition"), DefaultValue(0)]
  240. public double A_deg
  241. {
  242. get { return _a; }
  243. set
  244. {
  245. while (value < 0) value += 360;
  246. while (value >= 360) value -= 360;
  247. _a = value;
  248. }
  249. }
  250. [Browsable(false)]
  251. public double A_rad
  252. {
  253. get { return (_a) / 360.0 * Math.PI * 2.0; }
  254. set
  255. {
  256. while (value < 0.0) value += 2.0 * Math.PI;
  257. while (value > 2.0 * Math.PI) value -= 2.0 * Math.PI;
  258. _a = Math.Round(value / 2.0 / Math.PI * 3600.0)/10.0;
  259. }
  260. }
  261. #region INHERITANCE
  262. //SELECTION
  263. public override bool _selectionAbsolute { get { return base._selectionAbsolute; } }
  264. public override int _selectionSize { get { return base._selectionSize; } }
  265. //PROPERTIES
  266. public override bool IsPropertyAvailable(string pName)
  267. {
  268. if (pName == "angle") return true;
  269. return base.IsPropertyAvailable(pName);
  270. }
  271. public override bool IsPropertyMandatory(string pName) { return base.IsPropertyMandatory(pName); }
  272. //TYPE
  273. public override string TypeToString { get { return base.TypeToString; } }
  274. public override string TypeToStringShort { get { return base.TypeToString; } }
  275. //COPIER
  276. public override void Copy(bool excludeCoordinates, params MapObjectNamed[] source)
  277. {
  278. bool same, found;
  279. if (source.Count() == 0)
  280. return;
  281. //Angle
  282. double tmp1 = 0;
  283. same = true; found = false;
  284. foreach (MapObjectNamed item in source)
  285. if (item.IsPropertyAvailable("angle"))
  286. if (!found)
  287. {
  288. found = true;
  289. tmp1 = ((MapObjectNamedA)item).A_deg;
  290. }
  291. else
  292. same = same && (((MapObjectNamedA)item).A_deg != tmp1);
  293. if (found && same)
  294. this.A_deg = tmp1;
  295. base.Copy(excludeCoordinates, source);
  296. }
  297. //TO XML
  298. public override XmlElement ToXml(XmlDocument xDoc, List<string> missingProperties, string type = "")
  299. {
  300. if (String.IsNullOrEmpty(type)) type = TypeToString;//If this was the first called ToXml - set this object's type
  301. XmlElement create = base.ToXml(xDoc, missingProperties, type);
  302. __AddNewAttribute(xDoc, create, "angle", A_deg.ToString());
  303. return create;
  304. }
  305. //FROM XML
  306. public override void FromXml(XmlNode item)
  307. {
  308. base.FromXml(item);
  309. foreach (XmlAttribute att in item.Attributes)
  310. switch (att.Name)
  311. {
  312. case "angle":
  313. A_deg = Helper.StringToDouble(att.Value);
  314. break;
  315. }
  316. }
  317. //CONSTRUCTOR
  318. public MapObjectNamedA(int posX = 0, int posY = 0, int posZ = 0, bool makeSelected = false, int angle = 0, string name = "")
  319. : base(posX, posY, posZ, name, makeSelected)
  320. { this.A_rad = angle; }
  321. #endregion
  322. }
  323. public class MapObjectNamedAS : MapObjectNamedA
  324. {
  325. //Side
  326. private int? _sideValue;
  327. [DisplayName("Side"), Description("Side the entity is allied with (0 = none, 1 = enemy, 2+ = player)")]
  328. public int? sideValue { get { return _sideValue; } set { _sideValue = value; } }
  329. #region INHERITANCE
  330. //SELECTION
  331. public override bool _selectionAbsolute { get { return base._selectionAbsolute; } }
  332. public override int _selectionSize { get { return base._selectionSize; } }
  333. //PROPERTIES
  334. public override bool IsPropertyAvailable(string pName)
  335. {
  336. if (pName == "sideValue") return true;
  337. return base.IsPropertyAvailable(pName);
  338. }
  339. public override bool IsPropertyMandatory(string pName) { return base.IsPropertyMandatory(pName); }
  340. //TYPE
  341. public override string TypeToString { get { return base.TypeToString; } }
  342. public override string TypeToStringShort { get { return base.TypeToString; } }
  343. //COPIER
  344. public override void Copy(bool excludeCoordinates, params MapObjectNamed[] source)
  345. {
  346. bool same, found;
  347. if (source.Count() == 0)
  348. return;
  349. //Side
  350. int tmp1 = 0;
  351. same = true; found = false;
  352. foreach (MapObjectNamed item in source)
  353. {
  354. if (item.IsPropertyAvailable("sideValue"))
  355. {
  356. if (!found)
  357. {
  358. if (item as MapObjectNamedAS != null && ((MapObjectNamedAS)item).sideValue.HasValue)
  359. {
  360. found = true;
  361. tmp1 = ((MapObjectNamedAS)item).sideValue.Value;
  362. }
  363. if (item as MapObjectNamedArhK != null && ((MapObjectNamedArhKS)item).sideValue.HasValue)
  364. {
  365. found = true;
  366. tmp1 = ((MapObjectNamedArhKS)item).sideValue.Value;
  367. }
  368. }
  369. else
  370. {
  371. int tmp2 = 0;
  372. if (item as MapObjectNamedAS != null && ((MapObjectNamedAS)item).sideValue.HasValue)
  373. tmp2 = ((MapObjectNamedAS)item).sideValue.Value;
  374. if (item as MapObjectNamedArhK != null && ((MapObjectNamedArhKS)item).sideValue.HasValue)
  375. tmp2 = ((MapObjectNamedArhKS)item).sideValue.Value;
  376. same = same && (tmp2 != tmp1);
  377. }
  378. }
  379. }
  380. if (found && same)
  381. this.sideValue = tmp1;
  382. base.Copy(excludeCoordinates, source);
  383. }
  384. //TO XML
  385. public override XmlElement ToXml(XmlDocument xDoc, List<string> missingProperties, string type = "")
  386. {
  387. if (String.IsNullOrEmpty(type)) type = TypeToString;//If this was the first called ToXml - set this object's type
  388. XmlElement create = base.ToXml(xDoc, missingProperties, type);
  389. if (sideValue.HasValue)
  390. __AddNewAttribute(xDoc, create, "sideValue", sideValue.ToString());
  391. return create;
  392. }
  393. //FROM XML
  394. public override void FromXml(XmlNode item)
  395. {
  396. base.FromXml(item);
  397. foreach (XmlAttribute att in item.Attributes)
  398. switch (att.Name)
  399. {
  400. case "sideValue":
  401. sideValue = Helper.StringToInt(att.Value);
  402. break;
  403. }
  404. }
  405. //CONSTRUCTOR
  406. public MapObjectNamedAS(int posX = 0, int posY = 0, int posZ = 0, bool makeSelected = false, int angle = 0, string name = "", int? _sideValue = null)
  407. : base(posX, posY, posZ, makeSelected, angle, name)
  408. { sideValue = _sideValue; }
  409. #endregion
  410. }
  411. public class MapObjectNamedArhK : MapObjectNamedA
  412. {
  413. #region raceKeys
  414. [DisplayName("names"), Category("\t\traceKeys"), Description("List of object's race names (from vesselData.xml)"), DefaultValue("< none >"), EditorAttribute(typeof(CheckedListBoxUITypeEditor_raceNames), typeof(System.Drawing.Design.UITypeEditor))]
  415. public string RaceNames_Display { get { if (String.IsNullOrEmpty(_race_Names)) return "< none >"; return _race_Names; } set { RaceNames = value.Replace("< none >", ""); } }
  416. [Browsable(false)]
  417. public string RaceNames { get { return _race_Names; } set { _race_Names = value; ReassignRaceKeys(); } }
  418. private string _race_Names;
  419. [DisplayName("keys"), Category("\t\traceKeys"), Description("List of object's race keys (from vesselData.xml)"), DefaultValue("< none >"), EditorAttribute(typeof(CheckedListBoxUITypeEditor_raceKeys), typeof(System.Drawing.Design.UITypeEditor))]
  420. public string RaceKeys_Display { get { if (String.IsNullOrEmpty(_race_Keys)) return "< none >"; return _race_Keys; } set { RaceKeys = value.Replace("< none >", ""); } }
  421. [Browsable(false)]
  422. public string RaceKeys { get { return _race_Keys; } set { _race_Keys = value; ReassignRaceKeys(); } }
  423. private string _race_Keys;
  424. [DisplayName("unrecognised"), Category("\t\traceKeys"), Description("Race names and keys that were not recognised by the program (not present in current vesselData.xml) are put here."), DefaultValue("")]
  425. public string RaceUnrecognised { get { return _race_Unrecognised; } set { _race_Unrecognised = value; ReassignRaceKeys(); } }
  426. private string _race_Unrecognised;
  427. private void ReassignRaceKeys()
  428. {
  429. AssignRaceKeys(GetRaceKeysForXml());
  430. }
  431. private void AssignRaceKeys(string value)
  432. {
  433. Tuple<List<string>, List<string>, List<string>> parsedKeys = VesselData.Current.ParseRaceKeys(value);
  434. _race_Names = parsedKeys.Item1.Count == 0 ? "" : parsedKeys.Item1.Aggregate((i, j) => i + " " + j);
  435. _race_Keys = parsedKeys.Item2.Count == 0 ? "" : parsedKeys.Item2.Aggregate((i, j) => i + " " + j);
  436. _race_Unrecognised = parsedKeys.Item3.Count == 0 ? "" : parsedKeys.Item3.Aggregate((i, j) => i + " " + j);
  437. }
  438. public string GetRaceKeysForXml()
  439. {
  440. List<string> tmp = new List<string>();
  441. foreach (string item in _race_Names.Split(' '))
  442. if (!String.IsNullOrEmpty(item))
  443. tmp.Add(item);
  444. foreach (string item in _race_Keys.Split(' '))
  445. if (!String.IsNullOrEmpty(item))
  446. tmp.Add(item);
  447. foreach (string item in _race_Unrecognised.Split(' '))
  448. if (!String.IsNullOrEmpty(item))
  449. tmp.Add(item);
  450. return tmp.Count == 0 ? "" : tmp.Aggregate((i, j) => i + " " + j);
  451. }
  452. #endregion raceKeys
  453. #region hullKeys
  454. [DisplayName("classNames"), Category("\thullKeys"), Description("List of object's vessel class names (from vesselData.xml)"), DefaultValue("< none >"), EditorAttribute(typeof(CheckedListBoxUITypeEditor_vesselClassNames), typeof(System.Drawing.Design.UITypeEditor))]
  455. public string VesselClassNames_Display { get { if (String.IsNullOrEmpty(_vessel_ClassNames)) return "< none >"; return _vessel_ClassNames; } set { VesselClassNames = value.Replace("< none >", ""); } }
  456. [Browsable(false)]
  457. public string VesselClassNames { get { return _vessel_ClassNames; } set { _vessel_ClassNames = value; ReassignHullKeys(); } }
  458. private string _vessel_ClassNames;
  459. [DisplayName("broadTypes"), Category("\thullKeys"), Description("List of object's vessel broad types (from vesselData.xml)"), DefaultValue("< none >"), EditorAttribute(typeof(CheckedListBoxUITypeEditor_vesselBroadTypes), typeof(System.Drawing.Design.UITypeEditor))]
  460. public string VesselBroadTypes_Display { get { if (String.IsNullOrEmpty(_vessel_BroadTypes)) return "< none >"; return _vessel_BroadTypes; } set { VesselBroadTypes = value.Replace("< none >", ""); } }
  461. [Browsable(false)]
  462. public string VesselBroadTypes { get { return _vessel_BroadTypes; } set { _vessel_BroadTypes = value; ReassignHullKeys(); } }
  463. private string _vessel_BroadTypes;
  464. [DisplayName("unrecognised"), Category("\thullKeys"), Description("Hull types and keys that were not recognised by the program (not present in current vesselData.xml) are put here."), DefaultValue("")]
  465. public string VesselUnrecognised { get { return _vessel_Unrecognised; } set { _vessel_Unrecognised = value; ReassignHullKeys(); } }
  466. private string _vessel_Unrecognised;
  467. private void ReassignHullKeys()
  468. {
  469. AssignHullKeys(GetHullKeysForXml());
  470. }
  471. private void AssignHullKeys(string value)
  472. {
  473. Tuple<List<string>, List<string>, List<string>> parsedKeys = VesselData.Current.ParseHullKeys(value);
  474. _vessel_ClassNames = parsedKeys.Item1.Count == 0 ? "" : parsedKeys.Item1.Aggregate((i, j) => i + " " + j);
  475. _vessel_BroadTypes = parsedKeys.Item2.Count == 0 ? "" : parsedKeys.Item2.Aggregate((i, j) => i + " " + j);
  476. _vessel_Unrecognised = parsedKeys.Item3.Count == 0 ? "" : parsedKeys.Item3.Aggregate((i, j) => i + " " + j);
  477. }
  478. public string GetHullKeysForXml()
  479. {
  480. List<string> tmp = new List<string>();
  481. foreach (string item in _vessel_BroadTypes.Split(' '))
  482. if (!String.IsNullOrEmpty(item))
  483. tmp.Add(item);
  484. foreach (string item in _vessel_ClassNames.Split(' '))
  485. if (!String.IsNullOrEmpty(item))
  486. tmp.Add(item);
  487. foreach (string item in _vessel_Unrecognised.Split(' '))
  488. if (!String.IsNullOrEmpty(item))
  489. tmp.Add(item);
  490. return tmp.Count == 0 ? "" : tmp.Aggregate((i, j) => i + " " + j);
  491. }
  492. #endregion hullKeys
  493. [Browsable(false)]
  494. public string hullID { get { return _hullID; } set { _hullID = value; } }
  495. private string _hullID;
  496. [DisplayName("Hull ID"), Description("Indicates object's exact vessel ID (from vesselData.xml)"), DefaultValue("< none >"), TypeConverter(typeof(HullIDConverter))]
  497. public string hullID_Display
  498. {
  499. get
  500. {
  501. if (String.IsNullOrEmpty(_hullID))
  502. return "< none >";
  503. if (!VesselData.Current.VesselList.ContainsKey(_hullID))
  504. return "[" + _hullID + "] Vessel does not exist";
  505. return VesselData.Current.VesselToString(_hullID);
  506. }
  507. set
  508. {
  509. int tmp;
  510. _hullID = value;
  511. if (String.IsNullOrEmpty(_hullID)) return;
  512. if (_hullID == null) throw new ArgumentNullException("value", "Attempt to assign null to hullID!");
  513. if (Helper.IntTryParse(_hullID, out tmp)) return;
  514. _hullID = _hullID.Replace("[", "").Replace(" ","");
  515. if (_hullID.IndexOf("]") == -1) { _hullID = ""; return; }
  516. _hullID = _hullID.Substring(0,_hullID.IndexOf("]"));
  517. if (Helper.IntTryParse(_hullID, out tmp)) return;
  518. _hullID = "";
  519. }
  520. }
  521. #region INHERITANCE
  522. //SELECTION
  523. public override bool _selectionAbsolute { get { return base._selectionAbsolute; } }
  524. public override int _selectionSize { get { return base._selectionSize; } }
  525. //PROPERTIES
  526. public override bool IsPropertyAvailable(string pName) {
  527. if (pName == "raceKeys") return true;
  528. if (pName == "hullKeys") return true;
  529. if (pName == "hullID") return true;
  530. return base.IsPropertyAvailable(pName);
  531. }
  532. public override bool IsPropertyMandatory(string pName) { return base.IsPropertyMandatory(pName); }
  533. //TYPE
  534. public override string TypeToString { get { return base.TypeToString; } }
  535. public override string TypeToStringShort { get { return base.TypeToString; } }
  536. //COPIER
  537. public override void Copy(bool excludeCoordinates, params MapObjectNamed[] source)
  538. {
  539. if (source.Count() == 0)
  540. return;
  541. //racekeys
  542. {
  543. string tmp1 = "";
  544. bool same = true, found = false;
  545. foreach (MapObjectNamed item in source)
  546. if (item.IsPropertyAvailable("raceKeys"))
  547. if (!found)
  548. {
  549. found = true;
  550. tmp1 = ((MapObjectNamedArhK)item)._race_Keys;
  551. }
  552. else
  553. same = same && (((MapObjectNamedArhK)item)._race_Keys != tmp1);
  554. if (found && same)
  555. this._race_Keys = tmp1;
  556. }
  557. {
  558. string tmp1 = "";
  559. bool same = true, found = false;
  560. foreach (MapObjectNamed item in source)
  561. if (item.IsPropertyAvailable("raceKeys"))
  562. if (!found)
  563. {
  564. found = true;
  565. tmp1 = ((MapObjectNamedArhK)item)._race_Names;
  566. }
  567. else
  568. same = same && (((MapObjectNamedArhK)item)._race_Names != tmp1);
  569. if (found && same)
  570. this._race_Names = tmp1;
  571. }
  572. {
  573. string tmp1 = "";
  574. bool same = true, found = false;
  575. foreach (MapObjectNamed item in source)
  576. if (item.IsPropertyAvailable("raceKeys"))
  577. if (!found)
  578. {
  579. found = true;
  580. tmp1 = ((MapObjectNamedArhK)item)._race_Unrecognised;
  581. }
  582. else
  583. same = same && (((MapObjectNamedArhK)item)._race_Unrecognised != tmp1);
  584. if (found && same)
  585. this._race_Unrecognised = tmp1;
  586. }
  587. //hullkeys
  588. {
  589. string tmp1 = "";
  590. bool same = true, found = false;
  591. foreach (MapObjectNamed item in source)
  592. if (item.IsPropertyAvailable("hullKeys"))
  593. if (!found)
  594. {
  595. found = true;
  596. tmp1 = ((MapObjectNamedArhK)item)._vessel_BroadTypes;
  597. }
  598. else
  599. same = same && (((MapObjectNamedArhK)item)._vessel_BroadTypes != tmp1);
  600. if (found && same)
  601. this._vessel_BroadTypes = tmp1;
  602. }
  603. {
  604. string tmp1 = "";
  605. bool same = true, found = false;
  606. foreach (MapObjectNamed item in source)
  607. if (item.IsPropertyAvailable("hullKeys"))
  608. if (!found)
  609. {
  610. found = true;
  611. tmp1 = ((MapObjectNamedArhK)item)._vessel_ClassNames;
  612. }
  613. else
  614. same = same && (((MapObjectNamedArhK)item)._vessel_ClassNames != tmp1);
  615. if (found && same)
  616. this._vessel_ClassNames = tmp1;
  617. }
  618. {
  619. string tmp1 = "";
  620. bool same = true, found = false;
  621. foreach (MapObjectNamed item in source)
  622. if (item.IsPropertyAvailable("hullKeys"))
  623. if (!found)
  624. {
  625. found = true;
  626. tmp1 = ((MapObjectNamedArhK)item)._vessel_Unrecognised;
  627. }
  628. else
  629. same = same && (((MapObjectNamedArhK)item)._vessel_Unrecognised != tmp1);
  630. if (found && same)
  631. this._vessel_Unrecognised = tmp1;
  632. }
  633. //hullID
  634. {
  635. string tmp1 = "";
  636. bool same = true, found = false;
  637. foreach (MapObjectNamed item in source)
  638. if (item.IsPropertyAvailable("hullID"))
  639. if (!found)
  640. {
  641. found = true;
  642. tmp1 = ((MapObjectNamedArhK)item)._hullID;
  643. }
  644. else
  645. same = same && (((MapObjectNamedArhK)item)._hullID != tmp1);
  646. if (found && same)
  647. this._hullID = tmp1;
  648. }
  649. base.Copy(excludeCoordinates, source);
  650. }
  651. //TO XML
  652. public override XmlElement ToXml(XmlDocument xDoc, List<string> missingProperties, string type = "")
  653. {
  654. if (String.IsNullOrEmpty(type)) type = TypeToString;//If this was the first called ToXml - set this object's type
  655. XmlElement create = base.ToXml(xDoc, missingProperties, type);
  656. string keys;
  657. if (!String.IsNullOrWhiteSpace(keys = GetRaceKeysForXml()))
  658. __AddNewAttribute(xDoc, create, "raceKeys", keys);
  659. else
  660. __RememberPropertyIfMissing(missingProperties, "raceKeys", IsPropertyMandatory("raceKeys") && String.IsNullOrEmpty(_hullID));
  661. if ((keys = GetHullKeysForXml()).Count() > 0)
  662. __AddNewAttribute(xDoc, create, "hullKeys", keys);
  663. else
  664. __RememberPropertyIfMissing(missingProperties, "hullKeys", IsPropertyMandatory("hullKeys") && String.IsNullOrEmpty(_hullID));
  665. if (!String.IsNullOrEmpty(_hullID))
  666. __AddNewAttribute(xDoc, create, "hullID", _hullID);
  667. return create;
  668. }
  669. //FROM XML
  670. public override void FromXml(XmlNode item)
  671. {
  672. base.FromXml(item);
  673. foreach (XmlAttribute att in item.Attributes)
  674. {
  675. switch (att.Name)
  676. {
  677. case "raceKeys":
  678. AssignRaceKeys(att.Value);
  679. break;
  680. case "hullKeys":
  681. AssignHullKeys(att.Value);
  682. break;
  683. case "hullID":
  684. _hullID = att.Value;
  685. break;
  686. }
  687. }
  688. }
  689. //CONSTRUCTOR
  690. public MapObjectNamedArhK(int posX = 0, int posY = 0, int posZ = 0, bool makeSelected = false, int angle = 0, string name = "", string _race_Keys = "", string _race_Names = "", string _vessel_ClassNames = "", string _vessel_BroadTypes = "")
  691. : base(posX, posY, posZ, makeSelected, angle, name)
  692. { this._race_Keys = _race_Keys; this._race_Names = _race_Names; this._race_Unrecognised = ""; this._vessel_ClassNames = _vessel_ClassNames; this._vessel_BroadTypes = _vessel_BroadTypes; this._vessel_Unrecognised = ""; this._hullID = ""; }
  693. #endregion
  694. }
  695. public class MapObjectNamedArhKS : MapObjectNamedArhK
  696. {
  697. //Side
  698. private int? _sideValue;
  699. [DisplayName("Side"), Description("Side the entity is allied with (0 = none, 1 = enemy, 2+ = player)")]
  700. public int? sideValue { get { return _sideValue; } set { _sideValue = value; } }
  701. #region INHERITANCE
  702. //SELECTION
  703. public override bool _selectionAbsolute { get { return base._selectionAbsolute; } }
  704. public override int _selectionSize { get { return base._selectionSize; } }
  705. //PROPERTIES
  706. public override bool IsPropertyAvailable(string pName)
  707. {
  708. if (pName == "sideValue") return true;
  709. return base.IsPropertyAvailable(pName);
  710. }
  711. public override bool IsPropertyMandatory(string pName) { return base.IsPropertyMandatory(pName); }
  712. //TYPE
  713. public override string TypeToString { get { return base.TypeToString; } }
  714. public override string TypeToStringShort { get { return base.TypeToString; } }
  715. //COPIER
  716. public override void Copy(bool excludeCoordinates, params MapObjectNamed[] source)
  717. {
  718. bool same, found;
  719. if (source.Count() == 0)
  720. return;
  721. //Side
  722. int tmp1 = 0;
  723. same = true; found = false;
  724. foreach (MapObjectNamed item in source)
  725. {
  726. if (item.IsPropertyAvailable("sideValue"))
  727. {
  728. if (!found)
  729. {
  730. if (item as MapObjectNamedAS != null && ((MapObjectNamedAS)item).sideValue.HasValue)
  731. {
  732. found = true;
  733. tmp1 = ((MapObjectNamedAS)item).sideValue.Value;
  734. }
  735. if (item as MapObjectNamedArhK != null && ((MapObjectNamedArhKS)item).sideValue.HasValue)
  736. {
  737. found = true;
  738. tmp1 = ((MapObjectNamedArhKS)item).sideValue.Value;
  739. }
  740. }
  741. else
  742. {
  743. int tmp2 = 0;
  744. if (item as MapObjectNamedAS != null && ((MapObjectNamedAS)item).sideValue.HasValue)
  745. tmp2 = ((MapObjectNamedAS)item).sideValue.Value;
  746. if (item as MapObjectNamedArhK != null && ((MapObjectNamedArhKS)item).sideValue.HasValue)
  747. tmp2 = ((MapObjectNamedArhKS)item).sideValue.Value;
  748. same = same && (tmp2 != tmp1);
  749. }
  750. }
  751. }
  752. if (found && same)
  753. this.sideValue = tmp1;
  754. base.Copy(excludeCoordinates, source);
  755. }
  756. //TO XML
  757. public override XmlElement ToXml(XmlDocument xDoc, List<string> missingProperties, string type = "")
  758. {
  759. if (String.IsNullOrEmpty(type)) type = TypeToString;//If this was the first called ToXml - set this object's type
  760. XmlElement create = base.ToXml(xDoc, missingProperties, type);
  761. if (sideValue.HasValue)
  762. __AddNewAttribute(xDoc, create, "sideValue", sideValue.ToString());
  763. return create;
  764. }
  765. //FROM XML
  766. public override void FromXml(XmlNode item)
  767. {
  768. base.FromXml(item);
  769. foreach (XmlAttribute att in item.Attributes)
  770. switch (att.Name)
  771. {
  772. case "sideValue":
  773. sideValue = Helper.StringToInt(att.Value);
  774. break;
  775. }
  776. }
  777. //CONSTRUCTOR
  778. public MapObjectNamedArhKS(int posX = 0, int posY = 0, int posZ = 0, bool makeSelected = false, int angle = 0, string name = "", string _race_Keys = "", string _race_Names = "", string _vessel_ClassNames = "", string _vessel_BroadTypes = "", int? _sideValue = null)
  779. : base(posX, posY, posZ, makeSelected, angle, name, _race_Keys, _race_Names, _vessel_ClassNames, _vessel_BroadTypes)
  780. {
  781. sideValue = _sideValue;
  782. }
  783. #endregion
  784. }
  785. public sealed class MapObjectNamed_anomaly : MapObjectNamed
  786. {
  787. #region INHERITANCE
  788. //SELECTION
  789. public override bool _selectionAbsolute { get { return base._selectionAbsolute; } }
  790. public override int _selectionSize { get { return 10; } }
  791. //PROPERTIES
  792. public override bool IsPropertyAvailable(string pName) { return base.IsPropertyAvailable(pName); }
  793. public override bool IsPropertyMandatory(string pName) { return base.IsPropertyMandatory(pName); }
  794. //TYPE
  795. public override string TypeToString { get { return "anomaly"; } }
  796. public override string TypeToStringShort { get { return "ANM"; } }
  797. //COPIER
  798. public override void Copy(bool excludeCoordinates, params MapObjectNamed[] source) { base.Copy(excludeCoordinates, source); }
  799. //TO XML
  800. public override XmlElement ToXml(XmlDocument xDoc, List<string> missingProperties, string type = "")
  801. {
  802. if (String.IsNullOrEmpty(type)) type = TypeToString;//If this was the first called ToXml - set this object's type
  803. XmlElement create = base.ToXml(xDoc, missingProperties, type);
  804. return create;
  805. }
  806. //FROM XML
  807. public override void FromXml(XmlNode item)
  808. {
  809. base.FromXml(item);
  810. //foreach (XmlAttribute att in item.Attributes)
  811. // switch (att.Name)
  812. // {
  813. // }
  814. }
  815. //CONSTRUCTOR
  816. public MapObjectNamed_anomaly(int posX = 0, int posY = 0, int posZ = 0, string name = "", bool makeSelected = false)
  817. : base(posX, posY, posZ, name, makeSelected)
  818. { }
  819. #endregion
  820. }
  821. public sealed class MapObjectNamed_blackHole : MapObjectNamed
  822. {
  823. #region INHERITANCE
  824. //SELECTION
  825. public override bool _selectionAbsolute { get { return true; } }
  826. public override int _selectionSize { get { return 2550; } }
  827. //PROPERTIES
  828. public override bool IsPropertyAvailable(string pName) { return base.IsPropertyAvailable(pName); }
  829. public override bool IsPropertyMandatory(string pName) { return base.IsPropertyMandatory(pName); }
  830. //TYPE
  831. public override string TypeToString { get { return "blackHole"; } }
  832. public override string TypeToStringShort { get { return "BHL"; } }
  833. //COPIER
  834. public override void Copy(bool excludeCoordinates, params MapObjectNamed[] source) { base.Copy(excludeCoordinates, source); }
  835. //TO XML
  836. public override XmlElement ToXml(XmlDocument xDoc, List<string> missingProperties, string type = "")
  837. {
  838. if (String.IsNullOrEmpty(type)) type = TypeToString;//If this was the first called ToXml - set this object's type
  839. XmlElement create = base.ToXml(xDoc, missingProperties, type);
  840. return create;
  841. }
  842. //FROM XML
  843. public override void FromXml(XmlNode item)
  844. {
  845. base.FromXml(item);
  846. //foreach (XmlAttribute att in item.Attributes)
  847. // switch (att.Name)
  848. // {
  849. // }
  850. }
  851. //CONSTRUCTOR
  852. public MapObjectNamed_blackHole(int posX = 0, int posY = 0, int posZ = 0, string name = "", bool makeSelected = false)
  853. : base(posX, posY, posZ, name, makeSelected)
  854. { }
  855. #endregion
  856. }
  857. public sealed class MapObjectNamed_monster : MapObjectNamedA
  858. {
  859. #region INHERITANCE
  860. //SELECTION
  861. public override bool _selectionAbsolute { get { return base._selectionAbsolute; } }
  862. public override int _selectionSize { get { return base._selectionSize; } }
  863. //PROPERTIES
  864. public override bool IsPropertyAvailable(string pName) { return base.IsPropertyAvailable(pName); }
  865. public override bool IsPropertyMandatory(string pName) { return base.IsPropertyMandatory(pName); }
  866. //TYPE
  867. public override string TypeToString { get { return "monster"; } }
  868. public override string TypeToStringShort { get { return "MON"; } }
  869. //COPIER
  870. public override void Copy(bool excludeCoordinates, params MapObjectNamed[] source) { base.Copy(excludeCoordinates, source); }
  871. //TO XML
  872. public override XmlElement ToXml(XmlDocument xDoc, List<string> missingProperties, string type = "")
  873. {
  874. if (String.IsNullOrEmpty(type)) type = TypeToString;//If this was the first called ToXml - set this object's type
  875. XmlElement create = base.ToXml(xDoc, missingProperties, type);
  876. return create;
  877. }
  878. //FROM XML
  879. public override void FromXml(XmlNode item)
  880. {
  881. base.FromXml(item);
  882. //foreach (XmlAttribute att in item.Attributes)
  883. // switch (att.Name)
  884. // {
  885. // }
  886. }
  887. //CONSTRUCTOR
  888. public MapObjectNamed_monster(int posX = 0, int posY = 0, int posZ = 0, bool makeSelected = false, int angle = 0, string name = "")
  889. : base(posX, posY, posZ, makeSelected, angle, name)
  890. { }
  891. #endregion
  892. }
  893. public sealed class MapObjectNamed_player : MapObjectNamedAS
  894. {
  895. #region INHERITANCE
  896. //SELECTION
  897. public override bool _selectionAbsolute { get { return base._selectionAbsolute; } }
  898. public override int _selectionSize { get { return 30; } }
  899. //PROPERTIES
  900. public override bool IsPropertyAvailable(string pName) { return base.IsPropertyAvailable(pName); }
  901. public override bool IsPropertyMandatory(string pName) { return base.IsPropertyMandatory(pName); }
  902. //TYPE
  903. public override string TypeToString { get { return "player"; } }
  904. public override string TypeToStringShort { get { return "PLR"; } }
  905. //COPIER
  906. public override void Copy(bool excludeCoordinates, params MapObjectNamed[] source) { base.Copy(excludeCoordinates, source); }
  907. //TO XML
  908. public override XmlElement ToXml(XmlDocument xDoc, List<string> missingProperties, string type = "")
  909. {
  910. if (String.IsNullOrEmpty(type)) type = TypeToString;//If this was the first called ToXml - set this object's type
  911. XmlElement create = base.ToXml(xDoc, missingProperties, type);
  912. return create;
  913. }
  914. //FROM XML
  915. public override void FromXml(XmlNode item)
  916. {
  917. base.FromXml(item);
  918. //foreach (XmlAttribute att in item.Attributes)
  919. // switch (att.Name)
  920. // {
  921. // }
  922. }
  923. //CONSTRUCTOR
  924. public MapObjectNamed_player(int posX = 0, int posY = 0, int posZ = 0, bool makeSelected = false, int angle = 0, string name = "")
  925. : base(posX, posY, posZ, makeSelected, angle, name)
  926. { }
  927. #endregion
  928. }
  929. public sealed class MapObjectNamed_whale : MapObjectNamedA
  930. {
  931. //POD NUMBER
  932. private string _podnumber;
  933. [DisplayName("Pod Number"), Description("Whale pod number, identifies packs of whales that travel together")]
  934. public string podnumber { get { return _podnumber; } set { _podnumber = value; } }
  935. #region INHERITANCE
  936. //SELECTION
  937. public override bool _selectionAbsolute { get { return base._selectionAbsolute; } }
  938. public override int _selectionSize { get { return 30; } }
  939. //PROPERTIES
  940. public override bool IsPropertyAvailable(string pName)
  941. {
  942. if (pName == "podnumber") return true;
  943. return base.IsPropertyAvailable(pName);
  944. }
  945. public override bool IsPropertyMandatory(string pName) { return base.IsPropertyMandatory(pName); }
  946. //TYPE
  947. public override string TypeToString { get { return "whale"; } }
  948. public override string TypeToStringShort { get { return "WHL"; } }
  949. //COPIER
  950. public override void Copy(bool excludeCoordinates, params MapObjectNamed[] source) { base.Copy(excludeCoordinates, source); }
  951. //TO XML
  952. public override XmlElement ToXml(XmlDocument xDoc, List<string> missingProperties, string type = "")
  953. {
  954. if (String.IsNullOrEmpty(type)) type = TypeToString;//If this was the first called ToXml - set this object's type
  955. XmlElement create = base.ToXml(xDoc, missingProperties, type);
  956. __AddNewAttribute(xDoc, create, "podnumber", _podnumber.ToString());
  957. return create;
  958. }
  959. //FROM XML
  960. public override void FromXml(XmlNode item)
  961. {
  962. base.FromXml(item);
  963. foreach (XmlAttribute att in item.Attributes)
  964. switch (att.Name)
  965. {
  966. case "podnumber":
  967. _podnumber = att.Value;
  968. break;
  969. }
  970. }
  971. //CONSTRUCTOR
  972. public MapObjectNamed_whale(int posX = 0, int posY = 0, int posZ = 0, bool makeSelected = false, int angle = 0, string name = "", string podnumber = "0")
  973. : base(posX, posY, posZ, makeSelected, angle, name)
  974. { _podnumber = podnumber; }
  975. #endregion
  976. }
  977. public sealed class MapObjectNamed_station : MapObjectNamedArhKS
  978. {
  979. #region INHERITANCE
  980. //SELECTION
  981. public override bool _selectionAbsolute { get { return base._selectionAbsolute; } }
  982. public override int _selectionSize { get { return base._selectionSize; } }
  983. //PROPERTIES
  984. public override bool IsPropertyAvailable(string pName) { return base.IsPropertyAvailable(pName); }
  985. public override bool IsPropertyMandatory(string pName) {
  986. if (pName == "name") return true;
  987. return base.IsPropertyMandatory(pName);
  988. }
  989. //TYPE
  990. public override string TypeToString { get { return "station"; } }
  991. public override string TypeToStringShort { get { return "STN"; } }
  992. //COPIER
  993. public override void Copy(bool excludeCoordinates, params MapObjectNamed[] source) { base.Copy(excludeCoordinates, source); }
  994. //TO XML
  995. public override XmlElement ToXml(XmlDocument xDoc, List<string> missingProperties, string type = "")
  996. {
  997. if (String.IsNullOrEmpty(type)) type = TypeToString;//If this was the first called ToXml - set this object's type
  998. XmlElement create = base.ToXml(xDoc, missingProperties, type);
  999. return create;
  1000. }
  1001. //FROM XML
  1002. public override void FromXml(XmlNode item)
  1003. {
  1004. base.FromXml(item);
  1005. //foreach (XmlAttribute att in item.Attributes)
  1006. // switch (att.Name)
  1007. // {
  1008. // }
  1009. }
  1010. //CONSTRUCTOR
  1011. public MapObjectNamed_station(int posX = 0, int posY = 0, int posZ = 0, bool makeSelected = false, int angle = 0, string name = "", string _race_Keys = "", string _race_Names = "", string _vessel_ClassNames = "", string _vessel_BroadTypes = "")
  1012. : base(posX, posY, posZ, makeSelected, angle, name, _race_Keys, _race_Names, _vessel_ClassNames, _vessel_BroadTypes)
  1013. { }
  1014. #endregion
  1015. }
  1016. public sealed class MapObjectNamed_neutral : MapObjectNamedArhKS
  1017. {
  1018. #region INHERITANCE
  1019. //SELECTION
  1020. public override bool _selectionAbsolute { get { return base._selectionAbsolute; } }
  1021. public override int _selectionSize { get { return 30; } }
  1022. //PROPERTIES
  1023. public override bool IsPropertyAvailable(string pName) { return base.IsPropertyAvailable(pName); }
  1024. public override bool IsPropertyMandatory(string pName) {
  1025. if (pName == "raceKeys") return true;
  1026. if (pName == "hullKeys") return true;
  1027. return base.IsPropertyMandatory(pName);
  1028. }
  1029. //TYPE
  1030. public override string TypeToString { get { return "neutral"; } }
  1031. public override string TypeToStringShort { get { return "NEU"; } }
  1032. //COPIER
  1033. public override void Copy(bool excludeCoordinates, params MapObjectNamed[] source) { base.Copy(excludeCoordinates, source); }
  1034. //TO XML
  1035. public override XmlElement ToXml(XmlDocument xDoc, List<string> missingProperties, string type = "")
  1036. {
  1037. if (String.IsNullOrEmpty(type)) type = TypeToString;//If this was the first called ToXml - set this object's type
  1038. XmlElement create = base.ToXml(xDoc, missingProperties, type);
  1039. return create;
  1040. }
  1041. //FROM XML
  1042. public override void FromXml(XmlNode item)
  1043. {
  1044. base.FromXml(item);
  1045. //foreach (XmlAttribute att in item.Attributes)
  1046. // switch (att.Name)
  1047. // {
  1048. // }
  1049. }
  1050. //CONSTRUCTOR
  1051. public MapObjectNamed_neutral(int posX = 0, int posY = 0, int posZ = 0, bool makeSelected = false, int angle = 0, string name = "", string _race_Keys = "", string _race_Names = "", string _vessel_ClassNames = "", string _vessel_BroadTypes = "")
  1052. : base(posX, posY, posZ, makeSelected, angle, name, _race_Keys, _race_Names, _vessel_ClassNames, _vessel_BroadTypes)
  1053. { }
  1054. #endregion
  1055. }
  1056. public sealed class MapObjectNamed_enemy : MapObjectNamedArhKS
  1057. {
  1058. //FLEET NUMBER
  1059. private string _fleetnumber;
  1060. [DisplayName("Fleet Number"), Description("Enemy fleet number, identifies packs of ships that travel together, following fleet leader")]
  1061. public string fleetnumber { get { return _fleetnumber; } set {_fleetnumber = value; } }
  1062. #region INHERITANCE
  1063. //SELECTION
  1064. public override bool _selectionAbsolute { get { return base._selectionAbsolute; } }
  1065. public override int _selectio

Large files files are truncated, but you can click here to view the full file