private void FromXml_Version_1_56(XmlDocument xDoc)
        {
            XmlNodeList xNodeList;
            HullRace race;
            Vessel vessel;
            BeamPort bp;
            DronePort dp;
            EnginePort ep;
            ImpulsePoint ip;
            ManeuverPoint mp;

            xNodeList = xDoc.GetElementsByTagName("hullRace");
            foreach (XmlNode node in xNodeList)
            {
                race = new HullRace();

                foreach (XmlAttribute att in node.Attributes)
                {
                    switch (att.Name)
                    {
                        case "ID":
                            race.ID = att.Value;
                            break;
                        case "name":
                            race.name = att.Value;
                            if (!RaceNames.Contains(race.name))
                                RaceNames.Add(race.name);
                            break;
                        case "keys":

                            foreach (string s in att.Value.Split(' '))
                            {
                                race.keys.Add(s);
                                if (!RaceKeys.Contains(s))
                                    RaceKeys.Add(s);
                            }
                            break;
                    }
                }

                if (String.IsNullOrEmpty(race.ID))
                    continue;
                HullRaceList.Add(race.ID, race);
            }

            RaceNamesSortedByLength = RaceNames.ToList();
            RaceNamesSortedByLength.Sort(new Comparison<string>((string a, string b) =>
            {
                int diff = b.Split(' ').Length - a.Split(' ').Length;
                if (diff != 0) return diff;
                return String.Compare(a, b);
            }
            ));

            xNodeList = xDoc.GetElementsByTagName("vessel");
            foreach (XmlNode node in xNodeList)
            {
                vessel = new Vessel();

                foreach (XmlAttribute att in node.Attributes)
                {
                    switch (att.Name)
                    {
                        case "uniqueID":
                            vessel.uniqueID = att.Value;
                            break;
                        case "side":
                            vessel.side = att.Value;
                            break;
                        case "classname":
                            vessel.classname = att.Value;
                            if (!VesselClassNames.Contains(vessel.classname))
                                VesselClassNames.Add(vessel.classname);
                            break;
                        case "broadType":
                            vessel.broadType = att.Value;
                            foreach(string broadType in vessel.broadType.Split(' '))
                                if (!VesselBroadTypes.Contains(broadType))
                                    VesselBroadTypes.Add(broadType);
                            break;
                    }
                }

                if (String.IsNullOrEmpty(vessel.uniqueID))
                    continue;

                foreach (XmlNode subNode in node.ChildNodes)
                {
                    switch (subNode.Name)
                    {
                        case "art":
                            foreach (XmlAttribute att in node.Attributes)
                            {
                                switch (att.Name)
                                {
                                    case "meshfile":
                                        vessel.meshfile = att.Value;
                                        break;
                                    case "diffuseFile":
                                        vessel.diffuseFile = att.Value;
                                        break;
                                    case "glowFile":
                                        vessel.glowFile = att.Value;
                                        break;
                                    case "specularFile":
                                        vessel.specularFile = att.Value;
                                        break;
                                    case "scale":
                                        vessel.scale = Helper.StringToDouble(att.Value);
                                        break;
                                    case "pushRadius":
                                        vessel.pushRadius = Helper.StringToDouble(att.Value);
                                        break;
                                }
                            }
                            break;

                        case "shields":
                            foreach (XmlAttribute att in node.Attributes)
                            {
                                switch (att.Name)
                                {
                                    case "front":
                                        vessel.shields_front = Helper.StringToDouble(att.Value);
                                        break;
                                    case "back":
                                        vessel.shields_back = Helper.StringToDouble(att.Value);
                                        break;
                                }
                            }
                            break;

                        case "carrier":
                            foreach (XmlAttribute att in node.Attributes)
                            {
                                switch (att.Name)
                                {
                                    case "compliment":
                                        vessel.carrier_compliment = Helper.StringToDouble(att.Value);
                                        break;
                                }
                            }
                            break;

                        case "performance":
                            foreach (XmlAttribute att in node.Attributes)
                            {
                                switch (att.Name)
                                {
                                    case "turnrate":
                                        vessel.preformance_turnrate = Helper.StringToDouble(att.Value);
                                        break;
                                    case "topspeed":
                                        vessel.preformance_topspeed = Helper.StringToDouble(att.Value);
                                        break;
                                }
                            }
                            break;

                        case "fleet_ai":
                            foreach (XmlAttribute att in node.Attributes)
                            {
                                switch (att.Name)
                                {
                                    case "commonality":
                                        vessel.fleet_ai_commonality = Helper.StringToDouble(att.Value);
                                        break;
                                }
                            }

                            break;

                        case "beam_port":
                            bp = new BeamPort();
                            foreach (XmlAttribute att in subNode.Attributes)
                            {
                                switch (att.Name)
                                {
                                    case "x":
                                        bp.x = Helper.StringToDouble(att.Value);
                                        break;
                                    case "y":
                                        bp.y = Helper.StringToDouble(att.Value);
                                        break;
                                    case "z":
                                        bp.z = Helper.StringToDouble(att.Value);
                                        break;
                                    case "range":
                                        bp.range = Helper.StringToDouble(att.Value);
                                        break;
                                    case "damage":
                                        bp.damage = Helper.StringToDouble(att.Value);
                                        break;
                                    case "cycletime":
                                        bp.cycletime = Helper.StringToDouble(att.Value);
                                        break;
                                    case "arcwidth":
                                        bp.arcwidth = Helper.StringToDouble(att.Value);
                                        break;
                                }
                            }
                            vessel.beam_ports.Add(bp);
                            break;

                        case "drone_port":
                            dp = new DronePort();
                            foreach (XmlAttribute att in subNode.Attributes)
                            {
                                switch (att.Name)
                                {
                                    case "x":
                                        dp.x = Helper.StringToDouble(att.Value);
                                        break;
                                    case "y":
                                        dp.y = Helper.StringToDouble(att.Value);
                                        break;
                                    case "z":
                                        dp.z = Helper.StringToDouble(att.Value);
                                        break;
                                    case "range":
                                        dp.range = Helper.StringToDouble(att.Value);
                                        break;
                                    case "damage":
                                        dp.damage = Helper.StringToDouble(att.Value);
                                        break;
                                    case "cycletime":
                                        dp.cycletime = Helper.StringToDouble(att.Value);
                                        break;
                                }
                            }
                            vessel.drone_ports.Add(dp);
                            break;

                        case "engine_port":
                            ep = new EnginePort();
                            foreach (XmlAttribute att in subNode.Attributes)
                            {
                                switch (att.Name)
                                {
                                    case "x":
                                        ep.x = Helper.StringToDouble(att.Value);
                                        break;
                                    case "y":
                                        ep.y = Helper.StringToDouble(att.Value);
                                        break;
                                    case "z":
                                        ep.z = Helper.StringToDouble(att.Value);
                                        break;

                                }
                            }
                            vessel.engine_ports.Add(ep);
                            break;

                        case "impulse_point":
                            ip = new ImpulsePoint();
                            foreach (XmlAttribute att in subNode.Attributes)
                            {
                                switch (att.Name)
                                {
                                    case "x":
                                        ip.x = Helper.StringToDouble(att.Value);
                                        break;
                                    case "y":
                                        ip.y = Helper.StringToDouble(att.Value);
                                        break;
                                    case "z":
                                        ip.z = Helper.StringToDouble(att.Value);
                                        break;

                                }
                            }
                            vessel.impulse_points.Add(ip);
                            break;

                        case "maneuver_point":
                            mp = new ManeuverPoint();
                            foreach (XmlAttribute att in subNode.Attributes)
                            {
                                switch (att.Name)
                                {
                                    case "x":
                                        mp.x = Helper.StringToDouble(att.Value);
                                        break;
                                    case "y":
                                        mp.y = Helper.StringToDouble(att.Value);
                                        break;
                                    case "z":
                                        mp.z = Helper.StringToDouble(att.Value);
                                        break;

                                }
                            }
                            vessel.maneuver_points.Add(mp);
                            break;
                    }
                }
                VesselList.Add(vessel.uniqueID, vessel);
            }

            VesselClassNamesSortedByLength = VesselClassNames.ToList();
            VesselClassNamesSortedByLength.Sort(new Comparison<string>((string a, string b) =>
            {
                int diff = b.Split(' ').Length - a.Split(' ').Length;
                if (diff != 0) return diff;
                return String.Compare(a, b);
            }
            ));
        }
        private void FromXml_Version_1_56(XmlDocument xDoc)
        {
            XmlNodeList   xNodeList;
            HullRace      race;
            Vessel        vessel;
            BeamPort      bp;
            DronePort     dp;
            EnginePort    ep;
            ImpulsePoint  ip;
            ManeuverPoint mp;

            xNodeList = xDoc.GetElementsByTagName("hullRace");
            foreach (XmlNode node in xNodeList)
            {
                race = new HullRace();

                foreach (XmlAttribute att in node.Attributes)
                {
                    switch (att.Name)
                    {
                    case "ID":
                        race.ID = att.Value;
                        break;

                    case "name":
                        race.name = att.Value;
                        if (!RaceNames.Contains(race.name))
                        {
                            RaceNames.Add(race.name);
                        }
                        break;

                    case "keys":

                        foreach (string s in att.Value.Split(' '))
                        {
                            race.keys.Add(s);
                            if (!RaceKeys.Contains(s))
                            {
                                RaceKeys.Add(s);
                            }
                        }
                        break;
                    }
                }

                if (String.IsNullOrEmpty(race.ID))
                {
                    continue;
                }
                HullRaceList.Add(race.ID, race);
            }

            RaceNamesSortedByLength = RaceNames.ToList();
            RaceNamesSortedByLength.Sort(new Comparison <string>((string a, string b) =>
            {
                int diff = b.Split(' ').Length - a.Split(' ').Length;
                if (diff != 0)
                {
                    return(diff);
                }
                return(String.Compare(a, b));
            }
                                                                 ));

            xNodeList = xDoc.GetElementsByTagName("vessel");
            foreach (XmlNode node in xNodeList)
            {
                vessel = new Vessel();

                foreach (XmlAttribute att in node.Attributes)
                {
                    switch (att.Name)
                    {
                    case "uniqueID":
                        vessel.uniqueID = att.Value;
                        break;

                    case "side":
                        vessel.side = att.Value;
                        break;

                    case "classname":
                        vessel.classname = att.Value;
                        if (!VesselClassNames.Contains(vessel.classname))
                        {
                            VesselClassNames.Add(vessel.classname);
                        }
                        break;

                    case "broadType":
                        vessel.broadType = att.Value;
                        foreach (string broadType in vessel.broadType.Split(' '))
                        {
                            if (!VesselBroadTypes.Contains(broadType))
                            {
                                VesselBroadTypes.Add(broadType);
                            }
                        }
                        break;
                    }
                }

                if (String.IsNullOrEmpty(vessel.uniqueID))
                {
                    continue;
                }

                foreach (XmlNode subNode in node.ChildNodes)
                {
                    switch (subNode.Name)
                    {
                    case "art":
                        foreach (XmlAttribute att in node.Attributes)
                        {
                            switch (att.Name)
                            {
                            case "meshfile":
                                vessel.meshfile = att.Value;
                                break;

                            case "diffuseFile":
                                vessel.diffuseFile = att.Value;
                                break;

                            case "glowFile":
                                vessel.glowFile = att.Value;
                                break;

                            case "specularFile":
                                vessel.specularFile = att.Value;
                                break;

                            case "scale":
                                vessel.scale = Helper.StringToDouble(att.Value);
                                break;

                            case "pushRadius":
                                vessel.pushRadius = Helper.StringToDouble(att.Value);
                                break;
                            }
                        }
                        break;

                    case "shields":
                        foreach (XmlAttribute att in node.Attributes)
                        {
                            switch (att.Name)
                            {
                            case "front":
                                vessel.shields_front = Helper.StringToDouble(att.Value);
                                break;

                            case "back":
                                vessel.shields_back = Helper.StringToDouble(att.Value);
                                break;
                            }
                        }
                        break;

                    case "carrier":
                        foreach (XmlAttribute att in node.Attributes)
                        {
                            switch (att.Name)
                            {
                            case "compliment":
                                vessel.carrier_compliment = Helper.StringToDouble(att.Value);
                                break;
                            }
                        }
                        break;

                    case "performance":
                        foreach (XmlAttribute att in node.Attributes)
                        {
                            switch (att.Name)
                            {
                            case "turnrate":
                                vessel.preformance_turnrate = Helper.StringToDouble(att.Value);
                                break;

                            case "topspeed":
                                vessel.preformance_topspeed = Helper.StringToDouble(att.Value);
                                break;
                            }
                        }
                        break;

                    case "fleet_ai":
                        foreach (XmlAttribute att in node.Attributes)
                        {
                            switch (att.Name)
                            {
                            case "commonality":
                                vessel.fleet_ai_commonality = Helper.StringToDouble(att.Value);
                                break;
                            }
                        }

                        break;

                    case "beam_port":
                        bp = new BeamPort();
                        foreach (XmlAttribute att in subNode.Attributes)
                        {
                            switch (att.Name)
                            {
                            case "x":
                                bp.x = Helper.StringToDouble(att.Value);
                                break;

                            case "y":
                                bp.y = Helper.StringToDouble(att.Value);
                                break;

                            case "z":
                                bp.z = Helper.StringToDouble(att.Value);
                                break;

                            case "range":
                                bp.range = Helper.StringToDouble(att.Value);
                                break;

                            case "damage":
                                bp.damage = Helper.StringToDouble(att.Value);
                                break;

                            case "cycletime":
                                bp.cycletime = Helper.StringToDouble(att.Value);
                                break;

                            case "arcwidth":
                                bp.arcwidth = Helper.StringToDouble(att.Value);
                                break;
                            }
                        }
                        vessel.beam_ports.Add(bp);
                        break;

                    case "drone_port":
                        dp = new DronePort();
                        foreach (XmlAttribute att in subNode.Attributes)
                        {
                            switch (att.Name)
                            {
                            case "x":
                                dp.x = Helper.StringToDouble(att.Value);
                                break;

                            case "y":
                                dp.y = Helper.StringToDouble(att.Value);
                                break;

                            case "z":
                                dp.z = Helper.StringToDouble(att.Value);
                                break;

                            case "range":
                                dp.range = Helper.StringToDouble(att.Value);
                                break;

                            case "damage":
                                dp.damage = Helper.StringToDouble(att.Value);
                                break;

                            case "cycletime":
                                dp.cycletime = Helper.StringToDouble(att.Value);
                                break;
                            }
                        }
                        vessel.drone_ports.Add(dp);
                        break;

                    case "engine_port":
                        ep = new EnginePort();
                        foreach (XmlAttribute att in subNode.Attributes)
                        {
                            switch (att.Name)
                            {
                            case "x":
                                ep.x = Helper.StringToDouble(att.Value);
                                break;

                            case "y":
                                ep.y = Helper.StringToDouble(att.Value);
                                break;

                            case "z":
                                ep.z = Helper.StringToDouble(att.Value);
                                break;
                            }
                        }
                        vessel.engine_ports.Add(ep);
                        break;

                    case "impulse_point":
                        ip = new ImpulsePoint();
                        foreach (XmlAttribute att in subNode.Attributes)
                        {
                            switch (att.Name)
                            {
                            case "x":
                                ip.x = Helper.StringToDouble(att.Value);
                                break;

                            case "y":
                                ip.y = Helper.StringToDouble(att.Value);
                                break;

                            case "z":
                                ip.z = Helper.StringToDouble(att.Value);
                                break;
                            }
                        }
                        vessel.impulse_points.Add(ip);
                        break;

                    case "maneuver_point":
                        mp = new ManeuverPoint();
                        foreach (XmlAttribute att in subNode.Attributes)
                        {
                            switch (att.Name)
                            {
                            case "x":
                                mp.x = Helper.StringToDouble(att.Value);
                                break;

                            case "y":
                                mp.y = Helper.StringToDouble(att.Value);
                                break;

                            case "z":
                                mp.z = Helper.StringToDouble(att.Value);
                                break;
                            }
                        }
                        vessel.maneuver_points.Add(mp);
                        break;
                    }
                }
                VesselList.Add(vessel.uniqueID, vessel);
            }

            VesselClassNamesSortedByLength = VesselClassNames.ToList();
            VesselClassNamesSortedByLength.Sort(new Comparison <string>((string a, string b) =>
            {
                int diff = b.Split(' ').Length - a.Split(' ').Length;
                if (diff != 0)
                {
                    return(diff);
                }
                return(String.Compare(a, b));
            }
                                                                        ));
        }