public void HistoricalEventCollection_WarXML_Parses() { var world = LoadingWorld.GetTestWorld(); var xdoc = new XDocument(new XElement("historical_event_collection", new XElement("id", 86), new XElement("start_year", 1), new XElement("start_seconds72", 92400), new XElement("end_year", 2), new XElement("end_seconds72", 100800), new XElement("eventcol", 87), new XElement("eventcol", 97), new XElement("event", 1212), new XElement("type", "war"), new XElement("name", "the war of screams"), new XElement("aggressor_ent_id", 84), new XElement("defender_ent_id", 88) ) ); var historicalEventCollection = HistoricalEventCollection.Create(xdoc, world); Assert.AreEqual(historicalEventCollection.Id, 86); Assert.AreEqual(historicalEventCollection.StartTime, new WorldTime(1, 92400)); Assert.AreEqual(historicalEventCollection.EndTime, new WorldTime(2, 100800)); Assert.AreEqual(historicalEventCollection.EventIDs.Count, 1); Assert.AreEqual(historicalEventCollection.EventIDs[0], 1212); Assert.AreEqual(HistoricalEventCollection.Types[historicalEventCollection.Type], "war"); var warEventCollection = historicalEventCollection as EC_War; Assert.AreEqual(warEventCollection.EventColIDs.Count, 2); Assert.AreEqual(warEventCollection.EventColIDs[0], 87); Assert.AreEqual(warEventCollection.EventColIDs[1], 97); Assert.AreEqual(warEventCollection.AggressorEntId, 84); Assert.AreEqual(warEventCollection.DefenderEntId, 88); }
public void HistoricalEventCollection_NewTypeXML_Parses() { var world = LoadingWorld.GetTestWorld(); var xdoc = new XDocument(new XElement("historical_event_collection", new XElement("id", 30), new XElement("start_year", 45), new XElement("start_seconds72", 285600), new XElement("end_year", 50), new XElement("end_seconds72", 285600), new XElement("type", "unknown new type") ) ); var historicalEventCollection = HistoricalEventCollection.Create(xdoc, world); Assert.AreEqual(historicalEventCollection.Id, 30); Assert.AreEqual(historicalEventCollection.StartTime, new WorldTime(45, 285600)); Assert.AreEqual(historicalEventCollection.EndTime, new WorldTime(50, 285600)); Assert.IsInstanceOfType(historicalEventCollection, typeof(EC_UnassessedEventCollection)); }
/// <summary> /// Now at the open tag of a single object in our XML, we want to dump the entire contents into an XDocument. /// If we have a historical event or historical event collection we want to use their factory methods to create a new version of those with the given XDocument. /// For all other object types we want to use their constructor to make a new object of that type. /// In any case we add the object after making it to the appropriate dictionary. /// Individual object reads are separated out to allow us to work past failing to load any specific XML item for some weird reason. /// </summary> private static void LoadItem <T>(IDictionary <int, T> WorldList, World world, XmlReader xReader) where T : XMLObject { XDocument xdoc = null; try { xdoc = XDocument.Load(xReader.ReadSubtree()); if (typeof(T) == typeof(HistoricalEvent)) { var evt = HistoricalEvent.Create(xdoc, world); world.HistoricalEvents.Add(evt.ID, evt); } else if (typeof(T) == typeof(HistoricalEventCollection)) { var evtcol = HistoricalEventCollection.Create(xdoc, world); world.HistoricalEventCollections.Add(evtcol.ID, evtcol); } else { var WorldObject = (T)Activator.CreateInstance(typeof(T), new object[] { xdoc, world }); WorldList.Add(WorldObject.ID, WorldObject); } } catch (OutOfMemoryException e) { Program.Log(LogType.Error, "Error reading XML item: id\n" + e.Message); var fi = new FileInfo(_path); Program.Log(LogType.Error, "XML file is" + Math.Round(fi.Length / 1024f / 1024f / 1024f, 2) + " GB"); Program.Log(LogType.Error, string.Format("Running {0} Bit World Viewer", (Environment.Is64BitProcess ? "64" : "32"))); Program.Log(LogType.Error, string.Format("Running {0} Bit Operating System", (Environment.Is64BitOperatingSystem ? "64" : "32"))); if (!Environment.Is64BitOperatingSystem) //Running 32 bit OS { Program.Log(LogType.Error, "32 Bit World Viewer does not support Huge XML files"); } else if (!Environment.Is64BitProcess) //Running 32 bit app in 64 bit OS { Program.Log(LogType.Error, "Recommend using 64 Bit World Viewer"); } else { Program.Log(LogType.Error, "Please report Log"); } MemoryFailureQuitParsing = true; } catch (Exception e) { try { if (xdoc != null) { int id = Int32.Parse(((XElement)xdoc.Root.Nodes().ToArray()[1]).Value); if (id < 0) { if (xdoc.Root.Name.LocalName == "historical_event") { if (!workflowDetected) { Program.Log(LogType.Error, "Negative ID historical event. Likely due to dfHack Workflow, ignoring\n" + xdoc); workflowDetected = true; } } else if (xdoc.Root.Name.LocalName == "historical_figure") { if (!autochopDetected) { Program.Log(LogType.Error, "Negative ID historical figure detected. Likely due to autochop, ignoring\n" + xdoc); autochopDetected = true; } } else { Program.Log(LogType.Error, "Negative ID " + xdoc.Root.Name.LocalName + " detected. Unknown cause, ignoring\n" + xdoc); } } else { Program.Log(LogType.Error, "Error reading XML item: id\n" + e.Message); } } } catch (Exception) { Program.Log(LogType.Error, "Error reading XML item: id\n" + e.Message); throw; } } }
public void HistoricalEventCollection_BattleXML_Parses() { var world = LoadingWorld.GetTestWorld(); var xdoc = new XDocument(new XElement("historical_event_collection", new XElement("id", 21796), new XElement("start_year", 660), new XElement("start_seconds72", 285600), new XElement("end_year", 660), new XElement("end_seconds72", 285600), new XElement("eventcol", 21797), new XElement("eventcol", 21798), new XElement("event", 180182), new XElement("event", 180183), new XElement("type", "battle"), new XElement("name", "the siege of assault"), new XElement("war_eventcol", 21795), new XElement("subregion_id", -1), new XElement("feature_layer_id", -1), new XElement("site_id", 88), new XElement("coords", "27,16"), new XElement("subregion_id", -1), new XElement("attacking_hfid", 27436), new XElement("attacking_hfid", 27437), new XElement("defending_hfid", 27278), new XElement("defending_hfid", 27284), new XElement("noncom_hfid", 27299), new XElement("attacking_squad_race", "GIANT_RATTLESNAKE"), new XElement("attacking_squad_entity_pop", -1), new XElement("attacking_squad_number", 5), new XElement("attacking_squad_deaths", 0), new XElement("attacking_squad_site", -1), new XElement("defending_squad_race", "CROCODILE_CAVE"), new XElement("defending_squad_entity_pop", -1), new XElement("defending_squad_number", 5), new XElement("defending_squad_deaths", 5), new XElement("defending_squad_site", -1), new XElement("outcome", "defender won") ) ); var historicalEventCollection = HistoricalEventCollection.Create(xdoc, world); Assert.AreEqual(historicalEventCollection.Id, 21796); Assert.AreEqual(historicalEventCollection.StartTime, new WorldTime(660, 285600)); Assert.AreEqual(historicalEventCollection.EndTime, new WorldTime(660, 285600)); Assert.AreEqual(historicalEventCollection.EventIDs.Count, 2); Assert.AreEqual(historicalEventCollection.EventIDs[0], 180182); Assert.AreEqual(historicalEventCollection.EventIDs[1], 180183); Assert.AreEqual(HistoricalEventCollection.Types[historicalEventCollection.Type], "battle"); var battleEventCollection = historicalEventCollection as EC_Battle; Assert.AreEqual(battleEventCollection.EventColIDs.Count, 2); Assert.AreEqual(battleEventCollection.EventColIDs[0], 21797); Assert.AreEqual(battleEventCollection.EventColIDs[1], 21798); Assert.AreEqual(battleEventCollection.WarEventColId, 21795); Assert.IsNull(battleEventCollection.SubregionId); Assert.IsNull(battleEventCollection.FeatureLayerId); Assert.AreEqual(battleEventCollection.SiteId, 88); Assert.AreEqual(battleEventCollection.Coords, new Point(27, 16)); Assert.AreEqual(battleEventCollection.AttackingHfid.Count, 2); Assert.AreEqual(battleEventCollection.AttackingHfid[0], 27436); Assert.AreEqual(battleEventCollection.AttackingHfid[1], 27437); Assert.AreEqual(battleEventCollection.DefendingHfid.Count, 2); Assert.AreEqual(battleEventCollection.DefendingHfid[0], 27278); Assert.AreEqual(battleEventCollection.DefendingHfid[1], 27284); Assert.AreEqual(battleEventCollection.NonComHfid.Count, 1); Assert.AreEqual(battleEventCollection.NonComHfid[0], 27299); Assert.AreEqual(battleEventCollection.AttackingSquadRace[0], "GIANT_RATTLESNAKE"); Assert.AreEqual(battleEventCollection.AttackingSquadEntityPop[0], -1); Assert.AreEqual(battleEventCollection.AttackingSquadNumber[0], 5); Assert.AreEqual(battleEventCollection.AttackingSquadDeaths[0], 0); Assert.AreEqual(battleEventCollection.AttackingSquadSite[0], -1); Assert.AreEqual(battleEventCollection.DefendingSquadRace[0], "CROCODILE_CAVE"); Assert.AreEqual(battleEventCollection.DefendingSquadEntityPop[0], -1); Assert.AreEqual(battleEventCollection.DefendingSquadNumber[0], 5); Assert.AreEqual(battleEventCollection.DefendingSquadDeaths[0], 5); Assert.AreEqual(battleEventCollection.DefendingSquadSite[0], -1); Assert.AreEqual(battleEventCollection.Outcome, "defender won"); }