public XMLActorDefinitionReader(string defdir)
        {
            Definitions = new List<Definition>();

            string path = Path.Combine(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), defdir);
            if (Directory.Exists(path) == false) return;

            ProgramVersion = new Version();

            List<string> XmlFiles = Directory.EnumerateFiles(path, "*.xml").ToList();
            foreach (string fn in XmlFiles)
            {
                Definition ndef = null;
                Definition.Item nitem = null;
                Definition.Item.Option nopt = null;
                OpenGLHelpers.DisplayList displaydl = null;
                OpenGLHelpers.DisplayList pickdl = null;

                XmlTextReader xml = new XmlTextReader(fn);
                while (xml.Read())
                {
                    if (xml.NodeType == XmlNodeType.Element)
                    {
                        if (xml.Name == "ActorDatabase")
                        {
                            while (xml.MoveToNextAttribute())
                            {
                                if (xml.Name == "ProgramVersion")
                                {
                                    ProgramVersion = Version.Parse(xml.Value);
                                    if (ProgramVersion != Version.Parse(Application.ProductVersion)) ThrowVersionError();
                                }
                            }
                        }
                        else if (xml.Name == "Definition")
                        {
                            if (ProgramVersion == new Version()) ThrowVersionError();

                            ndef = new Definition();
                            ndef.Items = new List<Definition.Item>();

                            while (xml.MoveToNextAttribute())
                            {
                                switch (xml.Name)
                                {
                                    case "Number":
                                        if (xml.Value.StartsWith("0x") == true)
                                            ndef.Number = ushort.Parse(xml.Value.Substring(2), System.Globalization.NumberStyles.HexNumber);
                                        else
                                            ndef.Number = ushort.Parse(xml.Value);
                                        break;
                                    case "IsDefault":
                                        ndef.IsDefault = (Definition.DefaultTypes)Enum.Parse(typeof(Definition.DefaultTypes), xml.Value);
                                        break;
                                    case "DisplayModel":
                                        displaydl = OpenGLHelpers.StockObjects.GetDisplayList(xml.Value);
                                        if (displaydl != null) ndef.DisplayModel = displaydl;
                                        break;
                                    case "PickModel":
                                        pickdl = OpenGLHelpers.StockObjects.GetDisplayList(xml.Value);
                                        if (pickdl != null) ndef.PickModel = pickdl;
                                        break;
                                    case "FrontOffset":
                                        ndef.FrontOffset = double.Parse(xml.Value, System.Globalization.CultureInfo.InvariantCulture);
                                        break;
                                }
                            }
                        }
                        else if (xml.Name == "Item")
                        {
                            nitem = new Definition.Item();
                            while (xml.MoveToNextAttribute())
                            {
                                switch (xml.Name)
                                {
                                    case "Index":
                                        nitem.Index = int.Parse(xml.Value);
                                        break;
                                    case "ValueType":
                                        nitem.ValueType = FindTypeInCurrentAssemblies(xml.Value);
                                        break;
                                    case "DisplayStyle":
                                        nitem.DisplayStyle = (Definition.Item.DisplayStyles)Enum.Parse(typeof(Definition.Item.DisplayStyles), xml.Value);
                                        break;
                                    case "Usage":
                                        nitem.Usage = (Definition.Item.Usages)Enum.Parse(typeof(Definition.Item.Usages), xml.Value);
                                        break;
                                    case "Description":
                                        nitem.Description = xml.Value;
                                        break;
                                    case "Mask":
                                        if (xml.Value.StartsWith("0x") == true)
                                            nitem.Mask = UInt64.Parse(xml.Value.Substring(2), System.Globalization.NumberStyles.HexNumber);
                                        else
                                            nitem.Mask = UInt64.Parse(xml.Value);
                                        break;
                                    case "ControlType":
                                        nitem.ControlType = FindTypeInCurrentAssemblies(xml.Value);
                                        break;
                                }
                            }
                            ndef.Items.Add(nitem);
                        }
                        else if (xml.Name == "Option")
                        {
                            nopt = new Definition.Item.Option();
                            while (xml.MoveToNextAttribute())
                            {
                                switch (xml.Name)
                                {
                                    case "Value":
                                        if (xml.Value.StartsWith("0x") == true)
                                            nopt.Value = UInt64.Parse(xml.Value.Substring(2), System.Globalization.NumberStyles.HexNumber);
                                        else
                                            nopt.Value = UInt64.Parse(xml.Value);
                                        break;
                                    case "Description":
                                        nopt.Description = xml.Value;
                                        break;
                                }
                            }
                            nitem.Options.Add(nopt);
                        }
                    }
                    else if (xml.NodeType == XmlNodeType.EndElement)
                    {
                        if (xml.Name == "Definition")
                        {
                            if (displaydl != null && pickdl == null) ndef.PickModel = displaydl;

                            Definitions.Add(ndef);
                        }
                    }
                }
            }
        }
        public XMLActorDefinitionReader(string defdir)
        {
            Definitions = new List <Definition>();

            string path = Path.Combine(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), defdir);

            if (Directory.Exists(path) == false)
            {
                return;
            }

            ProgramVersion = new Version();

            List <string> XmlFiles = Directory.EnumerateFiles(path, "*.xml").ToList();

            foreach (string fn in XmlFiles)
            {
                Definition                ndef      = null;
                Definition.Item           nitem     = null;
                Definition.Item.Option    nopt      = null;
                OpenGLHelpers.DisplayList displaydl = null;
                OpenGLHelpers.DisplayList pickdl    = null;

                XmlTextReader xml = new XmlTextReader(fn);
                while (xml.Read())
                {
                    if (xml.NodeType == XmlNodeType.Element)
                    {
                        if (xml.Name == "ActorDatabase")
                        {
                            while (xml.MoveToNextAttribute())
                            {
                                if (xml.Name == "ProgramVersion")
                                {
                                    ProgramVersion = Version.Parse(xml.Value);
                                    if (ProgramVersion != Version.Parse(Application.ProductVersion))
                                    {
                                        ThrowVersionError();
                                    }
                                }
                            }
                        }
                        else if (xml.Name == "Definition")
                        {
                            if (ProgramVersion == new Version())
                            {
                                ThrowVersionError();
                            }

                            ndef       = new Definition();
                            ndef.Items = new List <Definition.Item>();

                            while (xml.MoveToNextAttribute())
                            {
                                switch (xml.Name)
                                {
                                case "Number":
                                    if (xml.Value.StartsWith("0x") == true)
                                    {
                                        ndef.Number = ushort.Parse(xml.Value.Substring(2), System.Globalization.NumberStyles.HexNumber);
                                    }
                                    else
                                    {
                                        ndef.Number = ushort.Parse(xml.Value);
                                    }
                                    break;

                                case "IsDefault":
                                    ndef.IsDefault = (Definition.DefaultTypes)Enum.Parse(typeof(Definition.DefaultTypes), xml.Value);
                                    break;

                                case "DisplayModel":
                                    displaydl = OpenGLHelpers.StockObjects.GetDisplayList(xml.Value);
                                    if (displaydl != null)
                                    {
                                        ndef.DisplayModel = displaydl;
                                    }
                                    break;

                                case "PickModel":
                                    pickdl = OpenGLHelpers.StockObjects.GetDisplayList(xml.Value);
                                    if (pickdl != null)
                                    {
                                        ndef.PickModel = pickdl;
                                    }
                                    break;

                                case "FrontOffset":
                                    ndef.FrontOffset = double.Parse(xml.Value, System.Globalization.CultureInfo.InvariantCulture);
                                    break;
                                }
                            }
                        }
                        else if (xml.Name == "Item")
                        {
                            nitem = new Definition.Item();
                            while (xml.MoveToNextAttribute())
                            {
                                switch (xml.Name)
                                {
                                case "Index":
                                    nitem.Index = int.Parse(xml.Value);
                                    break;

                                case "ValueType":
                                    nitem.ValueType = FindTypeInCurrentAssemblies(xml.Value);
                                    break;

                                case "DisplayStyle":
                                    nitem.DisplayStyle = (Definition.Item.DisplayStyles)Enum.Parse(typeof(Definition.Item.DisplayStyles), xml.Value);
                                    break;

                                case "Usage":
                                    nitem.Usage = (Definition.Item.Usages)Enum.Parse(typeof(Definition.Item.Usages), xml.Value);
                                    break;

                                case "Description":
                                    nitem.Description = xml.Value;
                                    break;

                                case "Mask":
                                    if (xml.Value.StartsWith("0x") == true)
                                    {
                                        nitem.Mask = UInt64.Parse(xml.Value.Substring(2), System.Globalization.NumberStyles.HexNumber);
                                    }
                                    else
                                    {
                                        nitem.Mask = UInt64.Parse(xml.Value);
                                    }
                                    break;

                                case "ControlType":
                                    nitem.ControlType = FindTypeInCurrentAssemblies(xml.Value);
                                    break;
                                }
                            }
                            ndef.Items.Add(nitem);
                        }
                        else if (xml.Name == "Option")
                        {
                            nopt = new Definition.Item.Option();
                            while (xml.MoveToNextAttribute())
                            {
                                switch (xml.Name)
                                {
                                case "Value":
                                    if (xml.Value.StartsWith("0x") == true)
                                    {
                                        nopt.Value = UInt64.Parse(xml.Value.Substring(2), System.Globalization.NumberStyles.HexNumber);
                                    }
                                    else
                                    {
                                        nopt.Value = UInt64.Parse(xml.Value);
                                    }
                                    break;

                                case "Description":
                                    nopt.Description = xml.Value;
                                    break;
                                }
                            }
                            nitem.Options.Add(nopt);
                        }
                    }
                    else if (xml.NodeType == XmlNodeType.EndElement)
                    {
                        if (xml.Name == "Definition")
                        {
                            if (displaydl != null && pickdl == null)
                            {
                                ndef.PickModel = displaydl;
                            }

                            Definitions.Add(ndef);
                        }
                    }
                }
            }
        }