Ejemplo n.º 1
0
        private static void LoadDataFromKernel()
        {
            if (FF7?.MainModule == null)
            {
                throw new Exception("FF7 Process MUST be discovered before data can be loaded");
            }
            var ff7Exe         = FF7.MainModule?.FileName;
            var ff7Folder      = Path.GetDirectoryName(ff7Exe);
            var kernelLocation = Path.Combine(ff7Folder, "data", "lang-en", "kernel");

            var elena = new KernelReader(Path.Combine(kernelLocation, "KERNEL.BIN"));

            elena.MergeKernel2Data(Path.Combine(kernelLocation, "kernel2.bin"));

            // Map Elena's data into local data dbs.
            foreach (var materia in elena.MateriaData.Materias)
            {
                var m = new Materia {
                    Id = materia.Index, Name = materia.Name
                };
                switch (materia.MateriaType)
                {
                case Shojy.FF7.Elena.Materias.MateriaType.Command:
                    m.Type = MateriaType.Command;
                    break;

                case Shojy.FF7.Elena.Materias.MateriaType.Magic:
                    m.Type = MateriaType.Magic;
                    break;

                case Shojy.FF7.Elena.Materias.MateriaType.Summon:
                    m.Type = MateriaType.Summon;
                    break;

                case Shojy.FF7.Elena.Materias.MateriaType.Support:
                    m.Type = MateriaType.Support;
                    break;

                case Shojy.FF7.Elena.Materias.MateriaType.Independent:
                    m.Type = MateriaType.Independent;
                    break;

                default:
                    m.Type = MateriaType.None;
                    break;
                }
                MateriaDatabase.Add(m);
            }

            MateriaDatabase.Add(new Materia {
                Id = 255, Name = "Empty Slot", Type = MateriaType.None
            });

            foreach (var wpn in elena.WeaponData.Weapons)
            {
                var w = new Weapon
                {
                    Name        = wpn.Name,
                    Id          = wpn.Index,
                    Growth      = (int)wpn.GrowthRate,
                    LinkedSlots = wpn.MateriaSlots.Count(slot =>
                                                         slot == MateriaSlot.EmptyLeftLinkedSlot ||
                                                         slot == MateriaSlot.EmptyRightLinkedSlot ||
                                                         slot == MateriaSlot.NormalLeftLinkedSlot ||
                                                         slot == MateriaSlot.NormalRightLinkedSlot),
                    SingleSlots = wpn.MateriaSlots.Count(slot =>
                                                         slot == MateriaSlot.EmptyUnlinkedSlot ||
                                                         slot == MateriaSlot.NormalUnlinkedSlot)
                };
                // Work out what weapon icon to use
                if ((wpn.EquipableBy & (EquipableBy.Cloud | EquipableBy.YoungCloud)) == wpn.EquipableBy)
                {
                    w.Type = WeaponType.Sword;
                }
                else if (wpn.EquipableBy == (wpn.EquipableBy & EquipableBy.Barret))
                {
                    w.Type = WeaponType.Arm;
                }
                else if (wpn.EquipableBy == (wpn.EquipableBy & EquipableBy.Tifa))
                {
                    w.Type = WeaponType.Glove;
                }
                else if (wpn.EquipableBy == (wpn.EquipableBy & EquipableBy.Aeris))
                {
                    w.Type = WeaponType.Staff;
                }
                else if (wpn.EquipableBy == (wpn.EquipableBy & EquipableBy.RedXIII))
                {
                    w.Type = WeaponType.Hairpin;
                }
                else if (wpn.EquipableBy == (wpn.EquipableBy & EquipableBy.Yuffie))
                {
                    w.Type = WeaponType.Shuriken;
                }
                else if (wpn.EquipableBy == (wpn.EquipableBy & EquipableBy.CaitSith))
                {
                    w.Type = WeaponType.Megaphone;
                }
                else if (wpn.EquipableBy == (wpn.EquipableBy & EquipableBy.Vincent))
                {
                    w.Type = WeaponType.Gun;
                }
                else if (wpn.EquipableBy == (wpn.EquipableBy & EquipableBy.Cid))
                {
                    w.Type = WeaponType.Pole;
                }
                else
                {
                    w.Type = WeaponType.Other;
                }
                WeaponDatabase.Add(w);
            }

            foreach (var arm in elena.ArmorData.Armors)
            {
                ArmletDatabase.Add(new Armlet
                {
                    Id          = arm.Index,
                    Name        = arm.Name,
                    Growth      = (int)arm.GrowthRate,
                    LinkedSlots = arm.MateriaSlots.Count(slot =>
                                                         slot == MateriaSlot.EmptyLeftLinkedSlot ||
                                                         slot == MateriaSlot.EmptyRightLinkedSlot ||
                                                         slot == MateriaSlot.NormalLeftLinkedSlot ||
                                                         slot == MateriaSlot.NormalRightLinkedSlot),
                    SingleSlots = arm.MateriaSlots.Count(slot =>
                                                         slot == MateriaSlot.EmptyUnlinkedSlot ||
                                                         slot == MateriaSlot.NormalUnlinkedSlot)
                });
            }

            foreach (var acc in elena.AccessoryData.Accessories)
            {
                AccessoryDatabase.Add(new Accessory
                {
                    Id   = acc.Index,
                    Name = acc.Name
                });
            }
        }
Ejemplo n.º 2
0
        LoadDataFromKernel(GameDatabase gameDatabase)
        {
            var accessories = new List <Accessory>();
            var armlets     = new List <Armlet>();
            var materias    = new List <Materia>();
            var weapons     = new List <Weapon>();

            if (FF7?.MainModule is null)
            {
                return(false, accessories, armlets, materias, weapons);
            }
            var ff7Exe    = FF7.MainModule?.FileName;
            var ff7Folder = Path.GetDirectoryName(ff7Exe);

            string kernelLocation;

            if (this._modded.IsLoadedBy7H)
            {
                kernelLocation = "kernels";
            }
            else
            {
                // Steam Location
                kernelLocation = Path.Combine(ff7Folder, "data", "lang-en", "kernel");

                if (!File.Exists(Path.Combine(kernelLocation, "KERNEL.BIN")))
                {
                    // Original / GameConverter location
                    kernelLocation = Path.Combine(ff7Folder, "data", "kernel");
                }
            }

            var elena = new KernelReader(Path.Combine(kernelLocation, "KERNEL.BIN"));

            elena.MergeKernel2Data(Path.Combine(kernelLocation, "kernel2.bin"));

            // Map Elena's data into local data dbs.
            foreach (var materia in elena.MateriaData.Materias)
            {
                var m = new Materia {
                    Id = materia.Index, Name = materia.Name
                };
                switch (materia.MateriaType)
                {
                case Shojy.FF7.Elena.Materias.MateriaType.Command:
                    m.Type = MateriaType.Command;
                    break;

                case Shojy.FF7.Elena.Materias.MateriaType.Magic:
                    m.Type = MateriaType.Magic;
                    break;

                case Shojy.FF7.Elena.Materias.MateriaType.Summon:
                    m.Type = MateriaType.Summon;
                    break;

                case Shojy.FF7.Elena.Materias.MateriaType.Support:
                    m.Type = MateriaType.Support;
                    break;

                case Shojy.FF7.Elena.Materias.MateriaType.Independent:
                    m.Type = MateriaType.Independent;
                    break;

                default:
                    m.Type = MateriaType.None;
                    break;
                }
                materias.Add(m);
            }

            materias.Add(new Materia {
                Id = FF7Const.Empty, Name = "Empty Slot", Type = MateriaType.None
            });

            foreach (var wpn in elena.WeaponData.Weapons)
            {
                var w = new Weapon
                {
                    Name        = wpn.Name,
                    Id          = (ushort)wpn.Index,
                    Growth      = (int)wpn.GrowthRate,
                    LinkedSlots = wpn.MateriaSlots.Count(slot =>
                                                         slot == MateriaSlot.EmptyLeftLinkedSlot ||
                                                         slot == MateriaSlot.EmptyRightLinkedSlot ||
                                                         slot == MateriaSlot.NormalLeftLinkedSlot ||
                                                         slot == MateriaSlot.NormalRightLinkedSlot),
                    SingleSlots = wpn.MateriaSlots.Count(slot =>
                                                         slot == MateriaSlot.EmptyUnlinkedSlot ||
                                                         slot == MateriaSlot.NormalUnlinkedSlot)
                };
                // Work out what weapon icon to use
                if ((wpn.EquipableBy & (EquipableBy.Cloud | EquipableBy.YoungCloud)) == wpn.EquipableBy)
                {
                    w.Type = WeaponType.Sword;
                }
                else if (wpn.EquipableBy == (wpn.EquipableBy & EquipableBy.Barret))
                {
                    w.Type = WeaponType.Arm;
                }
                else if (wpn.EquipableBy == (wpn.EquipableBy & EquipableBy.Tifa))
                {
                    w.Type = WeaponType.Glove;
                }
                else if (wpn.EquipableBy == (wpn.EquipableBy & EquipableBy.Aeris))
                {
                    w.Type = WeaponType.Staff;
                }
                else if (wpn.EquipableBy == (wpn.EquipableBy & EquipableBy.RedXIII))
                {
                    w.Type = WeaponType.Hairpin;
                }
                else if (wpn.EquipableBy == (wpn.EquipableBy & EquipableBy.Yuffie))
                {
                    w.Type = WeaponType.Shuriken;
                }
                else if (wpn.EquipableBy == (wpn.EquipableBy & EquipableBy.CaitSith))
                {
                    w.Type = WeaponType.Megaphone;
                }
                else if (wpn.EquipableBy == (wpn.EquipableBy & EquipableBy.Vincent))
                {
                    w.Type = WeaponType.Gun;
                }
                else if (wpn.EquipableBy == (wpn.EquipableBy & EquipableBy.Cid))
                {
                    w.Type = WeaponType.Pole;
                }
                else
                {
                    w.Type = WeaponType.Other;
                }
                weapons.Add(w);
            }

            foreach (var arm in elena.ArmorData.Armors)
            {
                armlets.Add(new Armlet
                {
                    Id          = (ushort)arm.Index,
                    Name        = arm.Name,
                    Growth      = (int)arm.GrowthRate,
                    LinkedSlots = arm.MateriaSlots.Count(slot =>
                                                         slot == MateriaSlot.EmptyLeftLinkedSlot ||
                                                         slot == MateriaSlot.EmptyRightLinkedSlot ||
                                                         slot == MateriaSlot.NormalLeftLinkedSlot ||
                                                         slot == MateriaSlot.NormalRightLinkedSlot),
                    SingleSlots = arm.MateriaSlots.Count(slot =>
                                                         slot == MateriaSlot.EmptyUnlinkedSlot ||
                                                         slot == MateriaSlot.NormalUnlinkedSlot)
                });
            }

            foreach (var acc in elena.AccessoryData.Accessories)
            {
                accessories.Add(new Accessory
                {
                    Id            = (ushort)acc.Index,
                    Name          = acc.Name,
                    StatusDefense = (StatusEffects)acc.StatusDefense,
                });
            }

            return(true, accessories, armlets, materias, weapons);
        }
Ejemplo n.º 3
0
        static void Main()
        {
            Process FF7 = null;

            while (FF7 is null)
            {
                try
                {
                    if (FF7 is null)
                    {
                        FF7 = Process.GetProcessesByName("ff7_en").FirstOrDefault();
                    }
                    if (FF7 is null)
                    {
                        FF7 = Process.GetProcessesByName("ff7").FirstOrDefault();
                    }
                }
                catch (Exception e)
                {
                }

                Thread.Sleep(250);
            }

            var path =
                @"D:\Personal\SteamLibrary\steamapps\common\FINAL FANTASY VII\data\lang-en\kernel\";
            var reader = new KernelReader(Path.Combine(path, "KERNEL.BIN"))
                         .MergeKernel2Data(Path.Combine(path, "kernel2.bin"));


            // This must have a call to MergeKernel2Data for now. The full dataset has not yet been found.
            var mem = new MemoryKernelReader(FF7)
                      .MergeKernel2Data(Path.Combine(path, "kernel2.bin"));



            //var lgp = new LgpReader(@"C:\Users\Shojy\Downloads\Aalis LGP+UNLGP 0.5b Compiled By Kranmer\choco\chocobo.lgp");

            //Directory.CreateDirectory("img");
            //foreach (var listFile in lgp.ListFiles())
            //{
            //    if (!listFile.EndsWith(".tex"))
            //    {
            //        continue;
            //    }
            //    Console.WriteLine(listFile);
            //    using (var dataStream = lgp.ExtractFile(listFile))
            //    using (var fileWriter = new StreamWriter($"img\\{listFile}.png"))
            //    {
            //        // Save or convert file
            //        try
            //        {
            //            var crop = new Rectangle(0, 0, 84, 96);
            //            var bmp = TexConverter.ToBitmap(dataStream);
            //            var croppedBmp = new Bitmap(84, 96);

            //            using (var g = Graphics.FromImage(croppedBmp))
            //            {
            //                g.DrawImage(bmp, new Rectangle(0, 0, croppedBmp.Width, croppedBmp.Height),
            //                    crop,
            //                    GraphicsUnit.Pixel);
            //            }

            //            croppedBmp.Save(fileWriter.BaseStream, ImageFormat.Png);
            //        }
            //        catch (Exception ex)
            //        {
            //            Console.WriteLine($"{listFile} errored:\n{ex.Message}");
            //        }
            //    }
            //}


            Console.Write("Press any key to exit... ");
            Console.ReadKey();
        }