public static void DoEdit(ChangeArgs args)
        {
            // collect characters
            AICCollection result = new AICCollection();

            foreach (Change c in Version.Changes)
            {
                if (!c.IsChecked || !(c is AICChange))
                {
                    continue;
                }

                AICCollection collection = ((AICChange)c).Collection;
                foreach (AICharacter aic in collection.Values)
                {
                    // topmost aics have priority
                    if (!result.ContainsKey(aic.Index))
                    {
                        result.Add(aic.Index, aic);
                    }
                }
            }

            CreateEdit(result).Activate(args);
        }
        static void ParseAll()
        {
            AICCollection collection = new AICCollection();

            foreach (string file in Directory.EnumerateFiles("decompiled", "*.txt"))
            {
                string name = Path.GetFileNameWithoutExtension(file);
                if (!Enum.TryParse(name, true, out AICIndex index))
                {
                    continue;
                }

                Console.WriteLine(index);
                using (StreamReader sr = new StreamReader(file))
                {
                    AICharacter aic = new AICharacter()
                    {
                        Index       = (int)index,
                        Name        = index.ToString(),
                        Personality = Parse(sr)
                    };
                    collection.Add((int)index, aic);
                }
            }

            using (FileStream fs = new FileStream("vanilla.aic", FileMode.Create))
                collection.Write(fs);
        }
        static bool TryLoadCollection(string path, bool resource, out AICCollection result)
        {
            try
            {
                Stream stream;
                if (resource)
                {
                    Assembly asm = Assembly.GetExecutingAssembly();
                    stream = asm.GetManifestResourceStream(path);
                }
                else
                {
                    stream = new FileStream(path, FileMode.Open);
                }

                result = new AICCollection(stream);
                return(true);
            }
            catch (FormatException e)
            {
                Debug.Show(path + "\n" + e.Message);
            }
            result = null;
            return(false);
        }
        public AICChange(string title, AICCollection coll, bool enabledDefault = false, bool isIntern = false)
            : base(title, ChangeType.AIC, enabledDefault, false)
        {
            this.NoLocalization = true;
            this.collection     = coll;
            this.intern         = isIntern;

            string descrIdent = title + isIntern;

            // set localized description, if it's empty seek a non-empty description
            var    header = collection.Header;
            string descr  = header.DescrByIndex(Localization.LanguageIndex);

            if (string.IsNullOrWhiteSpace(descr))
            {
                foreach (int index in Localization.IndexLoadOrder)
                {
                    descr = header.DescrByIndex(index);
                    if (!string.IsNullOrWhiteSpace(descr))
                    {
                        break;
                    }
                }
            }

            this.headerKey = descrIdent + "_descr";
            Localization.Add(headerKey, descr);

            this.Add(new DefaultHeader(descrIdent, true));
        }
        public static void Activate(ChangeArgs args)
        {
            AICCollection coll;

            using (FileStream fs = new FileStream("vanilla.aic", FileMode.Open))
                coll = new AICCollection(fs);

            CreateEdit(coll).Activate(args);
        }
        static ChangeHeader CreateEdit(AICCollection coll)
        {
            byte[] data;
            using (MemoryStream ms = new MemoryStream())
                using (BinaryWriter bw = new BinaryWriter(ms))
                {
                    foreach (AICharacter aic in coll.Values)
                    {
                        // mov eax, index
                        bw.Write((byte)0xB8);
                        bw.Write((int)aic.Index * 0x2A4);

                        // imul eax, 2A4

                        /*bw.Write((byte)0x69);
                         * bw.Write((byte)0xC0);
                         * bw.Write(0x2A4);*/

                        // add eax, esi
                        bw.Write((byte)0x01);
                        bw.Write((byte)0xF0);

                        // edit AI's properties
                        for (int i = 0; i < AIPersonality.TotalFields; i++)
                        {
                            // mov [eax + prop], value
                            bw.Write((byte)0xC7);
                            bw.Write((byte)0x80);
                            bw.Write((int)(i * 4));
                            bw.Write((int)aic.Personality.GetByIndex(i));
                        }
                    }
                    data = ms.ToArray();
                }

            // 004D1928
            BinaryEdit be = new BinaryEdit("ai_prop")
            {
                new BinAddress("call", 0x1B + 1, true),

                new BinSkip(0x1B),
                new BinHook(5)
                {
                    // ori code
                    0xE8, new BinRefTo("call"),

                    // edit ais
                    new BinBytes(data),
                }
            };

            return(new DefaultHeader("ai_prop")
            {
                be
            });
        }
Exemple #7
0
 /// <summary>
 /// Load the Data from the File
 /// </summary>
 private void Loaddata()
 {
     try
     {
         using (Stream stream = File.Open(path, FileMode.Open))
         {
             aicCol = new AICCollection(stream);
         }
     }
     catch (Exception e)
     {
         MessageBox.Show(e.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
     }
 }
        public AICChange(string title, AICCollection coll, bool enabledDefault = false, bool isIntern = false)
            : base(title, ChangeType.AIC, enabledDefault, false)
        {
            this.NoLocalization = true;
            this.collection     = coll;
            this.intern         = isIntern;

            string descrIdent = title + isIntern;
            string descr      = collection.Header.DescrByIndex(Localization.LanguageIndex);

            this.headerKey = descrIdent + "_descr";
            Localization.Add(headerKey, descr);

            this.Add(new DefaultHeader(descrIdent, true));
        }
        static void UpdateAICs(string folder)
        {
            foreach (string file in Directory.EnumerateFiles(folder, "*.aic"))
            {
                AICCollection aicc;
                using (FileStream fs = new FileStream(file, FileMode.Open))
                {
                    aicc = new AICCollection(fs);
                }


                using (FileStream fs = new FileStream(file, FileMode.Create))
                {
                    aicc.Write(fs);
                }
                Console.WriteLine(file);
            }
        }
        static void Main(string[] args)
        {
            Console.Title = "AIC-Updater";
            var files = Directory.EnumerateFiles(Directory.GetCurrentDirectory(), "*.aic");

            if (files.Count() == 0)
            {
                Console.WriteLine("No .aic files found!");
            }
            else
            {
                Console.WriteLine("The property names of the following .aic files will be updated.");
                Console.WriteLine("Any custom comments will be lost in the process!");
                Console.WriteLine();
                foreach (string file in files)
                {
                    Console.WriteLine(Path.GetFileName(file));
                }
                Console.WriteLine();
                Console.WriteLine("Press ENTER to continue.");
                Console.ReadLine();

                foreach (string file in files)
                {
                    AICCollection aicc;
                    using (FileStream fs = new FileStream(file, FileMode.Open))
                    {
                        aicc = new AICCollection(fs);
                    }


                    using (FileStream fs = new FileStream(file, FileMode.Create))
                    {
                        aicc.Write(fs);
                    }
                }
                Console.WriteLine("Done.");
            }
            Console.ReadLine();
        }