Beispiel #1
0
        /// <summary>
        /// Functions which initiates the regenerations of the mod´s structures: parsing of input files and creating of new CEditableStructs.
        /// </summary>
        private void regenStructures()
        {
            GlobalVars.Structures.Clear();

            System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(GlobalParams.InputFilesDirectory);
            System.IO.FileInfo[] fi = di.GetFiles("*" + GlobalParams.InputFilesExtension);

            CEditableStruct tempStructure = new CEditableStruct(string.Empty, 0, 0, 0, 0, new List<SParameter>());
            int errorLine = 0;
            int retVal = 0;

            // Load all files
            for (int i = 0; i < fi.Length; i++)
            {
                retVal = CInputParser.CreateStructure(fi[i].FullName, ref tempStructure, ref errorLine);

                if (retVal != 0)
                {
                    Game.Console.Print("Error loading file \"" + fi[i].Name + "\": error code: " + retVal.ToString() + " on line " + errorLine.ToString());
                }
                else
                {
                    Game.Console.Print("Successfully loaded file \"" + fi[i].Name + "\"!");
                    GlobalVars.Structures.Add(tempStructure);
                }
            }
        }
        /// <summary>
        /// Creates a new CEditableStruct from an input file.
        /// </summary>
        /// <param name="filePath">The file path to the input file.</param>
        /// <param name="structure">The structure to create.</param>
        /// <param name="errorLine">The error line. When an error has occured this value will be adjusted accordingly.</param>
        /// <returns>0: success. 
        /// 1: invalid number of elements in file header. 
        /// 2: error parsing element 2 of file header (invalid integer). 
        /// 3: error parsing element 3 of file header (invalid integer).
        /// 4: error parsing element 4 of file header (invalid integer).
        /// 5: invalid number of elements in parameter-describing line.
        /// 6: error parsing element 1 of parameter-line (invalid integer).
        /// 7: invalid parameter type
        /// 8: invalid float value for parameter.
        /// 9: invalid 4th element (invalid float)
        /// 10: failed to open input file
        /// 11: invalid parameter type 'char[]': invalid string length specified.</returns>
        public static int CreateStructure(string filePath, ref CEditableStruct structure, ref int errorLine)
        {
            string structName = string.Empty;

            int structSize = 0, structOffset = 0, numElements = 0;
            List<SParameter> parameters = new List<SParameter>();

            System.IO.StreamReader sr;
            try
            {
                sr = new StreamReader(filePath);
            }
            catch (SystemException se)
            {
                // Failed to open the file! :O Error code 10
                return 10;
            }

            string line = string.Empty;

            int numLines = 0;
            int numRealLines = 0;

            char[] delimiter = new char[1];
            delimiter[0] = ' ';

            while (line != null)
            {
                line = sr.ReadLine();
                numLines++;

                if (!IgnoreLine(line))
                {
                    numRealLines++;

                    // We have the header, hopefully :)
                    if (numRealLines == 1)
                    {
                        string[] elements = line.Split(delimiter, StringSplitOptions.None);

                        if (elements.Length != 4)
                        {
                            // We are expecting 4 elements
                            errorLine = numLines;

                            // Error code 1: invalid number of elements in file header.
                            sr.Close();
                            return 1;
                        }

                        structName = elements[0];

                        // If integer parsing failed...

                        if (!TryParseInteger(elements[1], ref structSize))
                        {
                            errorLine = numLines;
                            // Error code 2: error parsing parameter 2 of file header (invalid integer).
                            sr.Close();
                            return 2;
                        }

                        if (!TryParseInteger(elements[2], ref structOffset))
                        {
                            errorLine = numLines;
                            // Error code 3: error parsing parameter 3 of file header (invalid integer).
                            sr.Close();
                            return 3;
                        }

                        if (!TryParseInteger(elements[3], ref numElements))
                        {
                            errorLine = numLines;
                            // Error code 4: error parsing parameter 4 of file header (invalid integer).
                            sr.Close();
                            return 4;
                        }
                    }
                    else
                    {
                        // We are loading in parameters :)
                        SParameter tempParam = new SParameter();

                        string[] elements = line.Split(delimiter, StringSplitOptions.None);

                        if (elements.Length != 5)
                        {
                            // We are expecting 5 elements
                            errorLine = numLines;

                            // Error code 5: invalid number of elements in parameter line.
                            sr.Close();
                            return 5;
                        }

                        tempParam.ParamName = elements[0];

                        if (!TryParseInteger(elements[1], ref tempParam.Offset))
                        {
                            errorLine = numLines;

                            // Error code 6: error parsing parameter 1 of a parameter (invalid integer)
                            sr.Close();
                            return 6;
                        }

                        if (elements[2].Contains("CHAR["))
                        {
                            // Cleanup
                            elements[2] = elements[2].Replace("CHAR", string.Empty);
                            elements[2] = elements[2].Replace("[", string.Empty);
                            elements[2] = elements[2].Replace("]", string.Empty);
                            // Done

                            if (!int.TryParse(elements[2], out tempParam.StringSize))
                            {

                                // Error code 11: invalid parameter type 'CHAR[]': invalid string length specified.
                                sr.Close();
                                return 11;
                            }

                            tempParam.Type = typeof(string);
                        }
                        else
                        {
                            switch (elements[2])
                            {
                                case "INT":
                                    tempParam.Type = typeof(int);
                                    break;
                                case "UINT":
                                    tempParam.Type = typeof(uint);
                                    break;
                                case "FLOAT":
                                    tempParam.Type = typeof(float);
                                    break;
                                case "SHORT":
                                    tempParam.Type = typeof(short);
                                    break;
                                case "LONG":
                                    tempParam.Type = typeof(long);
                                    break;
                                case "DOUBLE":
                                    tempParam.Type = typeof(double);
                                    break;
                                case "CHAR":
                                    tempParam.Type = typeof(char);
                                    tempParam.StringSize = 1;
                                    break;
                                default:
                                    errorLine = numLines;

                                    // Error code 7: invalid parameter type
                                    sr.Close();
                                    return 7;
                            }

                            tempParam.StringSize = 0;
                        }

                        if (elements[3] == "NONE")
                        {
                            tempParam.MinVal = 0xCAFED00D;
                        }
                        else
                        {
                            if (!float.TryParse(elements[3], out tempParam.MinVal))
                            {
                                errorLine = numLines;

                                // Error code 8: invalid parameter 3 (invalid float)
                                sr.Close();
                                return 8;
                            }
                        }

                        if (elements[4] == "NONE")
                        {
                            tempParam.MaxVal = 0xCAFED00D;
                        }
                        else
                        {
                            if (!float.TryParse(elements[3], out tempParam.MaxVal))
                            {
                                errorLine = numLines;

                                // Error code 8: invalid parameter 4 (invalid float)
                                sr.Close();
                                return 9;
                            }
                        }

                        parameters.Add(tempParam);
                    }
                }
            }

            structure = new CEditableStruct(structName, GlobalVars.BaseAddress, structOffset, structSize, numElements, parameters);
            sr.Close();
            return 0;
        }