/// <summary>Parses a train travel stop node</summary> /// <param name="Element">The XElement to parse</param> /// <param name="FileName">The filename of the containing XML file</param> /// <param name="Data">The list of travel data to add this to</param> private static void ParseStopNode(XElement Element, string FileName, List <Game.TravelData> Data) { System.Globalization.CultureInfo Culture = System.Globalization.CultureInfo.InvariantCulture; foreach (XElement SectionElement in Element.Elements()) { string Section = SectionElement.Name.LocalName; switch (SectionElement.Name.LocalName.ToLowerInvariant()) { case "stop": { Game.TravelData NewData = new Game.TravelData(); double Decelerate = 0.0; double Accelerate = 0.0; double TargetSpeed = 0.0; foreach (XElement KeyNode in SectionElement.Elements()) { string Key = KeyNode.Name.LocalName; string Value = KeyNode.Value; int LineNumber = ((IXmlLineInfo)KeyNode).LineNumber; switch (Key.ToLowerInvariant()) { case "decelerate": if (Value.Length != 0 && !NumberFormats.TryParseDoubleVb6(Value, out Decelerate)) { Interface.AddMessage(MessageType.Error, false, "Value is invalid in " + Key + " in " + Section + " at line " + LineNumber.ToString(Culture) + " in " + FileName); } break; case "stopposition": if (Value.Length != 0 && !NumberFormats.TryParseDoubleVb6(Value, out NewData.StopPosition)) { Interface.AddMessage(MessageType.Error, false, "Value is invalid in " + Key + " in " + Section + " at line " + LineNumber.ToString(Culture) + " in " + FileName); } break; case "stoptime": if (Value.Length != 0 && !Interface.TryParseTime(Value, out NewData.StopTime)) { Interface.AddMessage(MessageType.Error, false, "Value is invalid in " + Key + " in " + Section + " at line " + LineNumber.ToString(Culture) + " in " + FileName); } break; case "doors": { int door = 0; bool doorboth = false; switch (Value.ToLowerInvariant()) { case "l": case "left": door = -1; break; case "r": case "right": door = 1; break; case "n": case "none": case "neither": door = 0; break; case "b": case "both": doorboth = true; break; default: if (Value.Length != 0 && !NumberFormats.TryParseIntVb6(Value, out door)) { Interface.AddMessage(MessageType.Error, false, "Value is invalid in " + Key + " in " + Section + " at line " + LineNumber.ToString(Culture) + " in " + FileName); door = 0; } break; } NewData.OpenLeftDoors = door < 0.0 | doorboth; NewData.OpenRightDoors = door > 0.0 | doorboth; } break; case "accelerate": if (Value.Length != 0 && !NumberFormats.TryParseDoubleVb6(Value, out Accelerate)) { Interface.AddMessage(MessageType.Error, false, "Value is invalid in " + Key + " in " + Section + " at line " + LineNumber.ToString(Culture) + " in " + FileName); } break; case "targetspeed": if (Value.Length != 0 && !NumberFormats.TryParseDoubleVb6(Value, out TargetSpeed)) { Interface.AddMessage(MessageType.Error, false, "Value is invalid in " + Key + " in " + Section + " at line " + LineNumber.ToString(Culture) + " in " + FileName); } break; case "direction": { int d = 0; switch (Value.ToLowerInvariant()) { case "f": d = 1; break; case "r": d = -1; break; default: if (Value.Length != 0 && !NumberFormats.TryParseIntVb6(Value, out d)) { Interface.AddMessage(MessageType.Error, false, "Value is invalid in " + Key + " in " + Section + " at line " + LineNumber.ToString(Culture) + " in " + FileName); } break; } if (d == 1 || d == -1) { NewData.Direction = (Game.TravelDirection)d; } } break; case "rail": if (Value.Length != 0 && !NumberFormats.TryParseIntVb6(Value, out NewData.RailIndex)) { Interface.AddMessage(MessageType.Error, false, "Value is invalid in " + Key + " in " + Section + " at line " + LineNumber.ToString(Culture) + " in " + FileName); } break; } } NewData.Decelerate = Decelerate / 3.6; NewData.Accelerate = Accelerate / 3.6; NewData.TargetSpeed = TargetSpeed / 3.6; Data.Add(NewData); } break; } } }
/// <summary> /// Function to parse the contents of TravelData class /// </summary> /// <param name="FileName">The filename of the containing XML file</param> /// <param name="SectionElement">The XElement to parse</param> /// <param name="Data">Travel data to which the parse results apply</param> private static void ParseTravelDataNode(string FileName, XElement SectionElement, Game.TravelData Data) { string Section = SectionElement.Name.LocalName; double Decelerate = 0.0; double Accelerate = 0.0; double TargetSpeed = 0.0; foreach (XElement KeyNode in SectionElement.Elements()) { string Key = KeyNode.Name.LocalName; string Value = KeyNode.Value; int LineNumber = ((IXmlLineInfo)KeyNode).LineNumber; switch (Key.ToLowerInvariant()) { case "decelerate": if (Value.Any() && !NumberFormats.TryParseDoubleVb6(Value, out Decelerate) || Decelerate < 0.0) { Interface.AddMessage(MessageType.Error, false, $"Value is expected to be a non-negative floating-point number in {Key} in {Section} at line {LineNumber.ToString(culture)} in {FileName}"); } break; case "position": case "stopposition": if (Value.Any() && !NumberFormats.TryParseDoubleVb6(Value, out Data.Position)) { Interface.AddMessage(MessageType.Error, false, $"Value is invalid in {Key} in {Section} at line {LineNumber.ToString(culture)} in {FileName}"); } break; case "accelerate": if (Value.Any() && !NumberFormats.TryParseDoubleVb6(Value, out Accelerate) || Accelerate < 0.0) { Interface.AddMessage(MessageType.Error, false, $"Value is expected to be a non-negative floating-point number in {Key} in {Section} at line {LineNumber.ToString(culture)} in {FileName}"); } break; case "targetspeed": if (Value.Any() && !NumberFormats.TryParseDoubleVb6(Value, out TargetSpeed) || TargetSpeed < 0.0) { Interface.AddMessage(MessageType.Error, false, $"Value is expected to be a non-negative floating-point number in {Key} in {Section} at line {LineNumber.ToString(culture)} in {FileName}"); } break; case "rail": if (Value.Any() && !NumberFormats.TryParseIntVb6(Value, out Data.RailIndex) || Data.RailIndex < 0) { Interface.AddMessage(MessageType.Error, false, $"Value is expected to be a non-negative integer number in {Key} in {Section} at line {LineNumber.ToString(culture)} in {FileName}"); Data.RailIndex = 0; } break; } } Data.Decelerate = -Decelerate / 3.6; Data.Accelerate = Accelerate / 3.6; Data.TargetSpeed = TargetSpeed / 3.6; }