Ejemplo n.º 1
0
        //public List<string> Files = new List<string>();

        //public void DoAnalyses()
        //{
        //    Console.WriteLine("--------------------------------------------------");
        //    //foreach (var filename in Files)
        //    //{
        //        AnalyseFile(filename);
        //        Console.WriteLine("--------------------------------------------------");
        //    //}
        //}

        public ParsedContent AnalyseFile(string filename)
        {
            BinFile binFile = new BinFile(filename);

            if (!File.Exists(filename) ||
                !binFile.Load())
            {
                Console.WriteLine("Failed to load file");
                return(null);
            }
            //Console.WriteLine("Loading file {0} ({1})...", binFile.FileName, binFile.FileLength);
            ParsedContent parsedContent = binFile.Parse();

            //if (parsedContent.ValuesList != null)
            //{
            //    int i = 0;
            //    foreach (Value value in parsedContent.ValuesList)
            //    {
            //        i++;
            //        //Console.WriteLine("{0}: {1} ({2})", i, op.OpName, op.ReferenceValue);
            //        //Console.WriteLine("{0}: @[{1}] {2} ({3})", i, parsedContent.BaseAddress + i + 1, value.DataType, value.Reference);
            //        Console.WriteLine("{1}: {2} ({3})", i, value.Address, value.DataType, value.Reference);
            //        foreach (var subValue in value.SubValues)
            //        {
            //            if (subValue is string)
            //            {
            //                Console.WriteLine("    \"{0}\"", subValue);
            //            }
            //            else if (subValue is Int32 || subValue is float)
            //            {
            //                Console.WriteLine("    {0}", subValue);
            //            }
            //        }
            //    }
            //}

            //if (parsedContent.OpCodeList != null)
            //{
            //    Console.WriteLine();
            //    Console.WriteLine("OP CODES");
            //    Console.WriteLine("--------");

            //    DisplayOpCodes(parsedContent);
            //}

            return(parsedContent);
        }
Ejemplo n.º 2
0
        private void BuildNewMemory(BinFile binFile, ParsedContent parsedContent)
        {
            Console.WriteLine("Building new memory...");


            Console.WriteLine("Writing name.");
            int nameLength = parsedContent.ScriptName.Length;

            newContent.Clear();
            char[] name = parsedContent.ScriptName.ToCharArray();
            foreach (char c in name)
            {
                newContent.Add((byte)c);
            }
            newContent.Add(0x00);
            for (int i = 0; i < 255 - nameLength; i++)
            {
                newContent.Add(0xCD);
            }

            Console.WriteLine("Writing stub values.");

            int opCount = 0;

            //opcodes
            foreach (Operation op in parsedContent.OpCodeList)
            {
                opCount++;

                if (op.DataIndex != null)
                {
                    opCount += 2;
                }
            }

            foreach (Byte b in BitConverter.GetBytes((Int32)opCount))
            {
                newContent.Add(b);
            }

            //startofcodes
            foreach (Byte b in BitConverter.GetBytes((Int32)276))
            {
                newContent.Add(b);
            }

            //numberofvalues
            foreach (Byte b in BitConverter.GetBytes((Int32)parsedContent.ValuesList.Count))
            {
                newContent.Add(b);
            }

            //base address
            foreach (Byte b in BitConverter.GetBytes((Int32)760))
            {
                newContent.Add(b);
            }

            //startofvalues
            foreach (Byte b in BitConverter.GetBytes((Int32)opCount + 276))
            {
                newContent.Add(b);
            }

            //write the opcodes
            foreach (Operation op in parsedContent.OpCodeList)
            {
                newContent.Add((byte)op.OpCode);
                if (op.DataIndex != null)
                {
                    byte[] dataIndex = BitConverter.GetBytes(op.DataIndex.Value);
                    foreach (byte b in dataIndex)
                    {
                        newContent.Add(b);
                    }
                }
            }

            //write the value list
            foreach (Value value in parsedContent.ValuesList)
            {
                newContent.Add((byte)value.DataType);
                if (value.DataType == DataTypeType.Character ||
                    value.DataType == DataTypeType.String ||
                    value.DataType == DataTypeType.Point ||
                    value.DataType == DataTypeType.Quaternion)
                {
                    byte[] refBytes = BitConverter.GetBytes(value.Reference);
                    foreach (byte b in refBytes)
                    {
                        newContent.Add(b);
                    }
                }
                else if (value.DataType == DataTypeType.Int ||
                         value.DataType == DataTypeType.Float)
                {
                    byte[] valueBytes = BitConverter.GetBytes((Int32)value.SubValues[0]);
                    foreach (byte b in valueBytes)
                    {
                        newContent.Add(b);
                    }
                }
            }

            //write the references
            foreach (Value value in parsedContent.ValuesList)
            {
                //if (value.DataType == DataTypeType.Character
                //    || value.DataType == DataTypeType.String
                //    || value.DataType == DataTypeType.Point
                //    || value.DataType == DataTypeType.Quaternion)
                //{
                //    foreach (object o in value.SubValues)
                //    {
                //        byte[] oBytes = BitConverter.GetBytes(o);
                //        foreach (byte b in oBytes)
                //        {
                //            newContent.Add(b);
                //        }
                //    }
                //}
                if (value.DataType == DataTypeType.Character)
                {
                    byte[] characterBytes = BitConverter.GetBytes((Int32)value.SubValues[0]);
                    foreach (byte b in characterBytes)
                    {
                        newContent.Add(b);
                    }
                    newContent.Add((byte)0x00);
                    char[] characters = ((string)value.SubValues[1]).ToCharArray();
                    foreach (char c in characters)
                    {
                        newContent.Add((byte)c);
                    }
                    newContent.Add((byte)0x00);

                    characterBytes = BitConverter.GetBytes((Int32)value.SubValues[2]);
                    foreach (byte b in characterBytes)
                    {
                        newContent.Add(b);
                    }
                }
                else if (value.DataType == DataTypeType.String)
                {
                    char[] characters = ((string)value.SubValues[0]).ToCharArray();
                    foreach (char c in characters)
                    {
                        newContent.Add((byte)c);
                    }
                    newContent.Add((byte)0x00);
                }
                else if (value.DataType == DataTypeType.Point)
                {
                    byte[] characterBytes = BitConverter.GetBytes((Int32)value.SubValues[0]);
                    foreach (byte b in characterBytes)
                    {
                        newContent.Add(b);
                    }
                    characterBytes = BitConverter.GetBytes((Int32)value.SubValues[1]);
                    foreach (byte b in characterBytes)
                    {
                        newContent.Add(b);
                    }
                    characterBytes = BitConverter.GetBytes((Int32)value.SubValues[2]);
                    foreach (byte b in characterBytes)
                    {
                        newContent.Add(b);
                    }
                }
                else if (value.DataType == DataTypeType.Quaternion)
                {
                    byte[] characterBytes = BitConverter.GetBytes((Int32)value.SubValues[0]);
                    foreach (byte b in characterBytes)
                    {
                        newContent.Add(b);
                    }
                    characterBytes = BitConverter.GetBytes((Int32)value.SubValues[1]);
                    foreach (byte b in characterBytes)
                    {
                        newContent.Add(b);
                    }
                    characterBytes = BitConverter.GetBytes((Int32)value.SubValues[2]);
                    foreach (byte b in characterBytes)
                    {
                        newContent.Add(b);
                    }
                    characterBytes = BitConverter.GetBytes((Int32)value.SubValues[3]);
                    foreach (byte b in characterBytes)
                    {
                        newContent.Add(b);
                    }
                }
            }

            //convert to byte[]
            byte[] newFile = newContent.ToArray();

            Console.WriteLine("Saving new file...");
            binFile.Save(true, newFile);
            Console.WriteLine("OK.");
        }