コード例 #1
0
        public static GameStatus ExtractStatusFromMap(FF7SaveMap map, FF7BattleMap battleMap)
        {
            var time = map.LiveTotalSeconds;

            var t = $"{(time / 3600):00}:{((time % 3600) / 60):00}:{(time % 60):00}";

            var status = new GameStatus()
            {
                Gil              = map.LiveGil,
                Location         = map.LiveMapName,
                Party            = new Models.Character[3],
                ActiveBattle     = battleMap.IsActiveBattle,
                ColorTopLeft     = map.WindowColorTopLeft,
                ColorBottomLeft  = map.WindowColorBottomLeft,
                ColorBottomRight = map.WindowColorBottomRight,
                ColorTopRight    = map.WindowColorTopRight,
                TimeActive       = t
            };
            var party = battleMap.Party;

            var chars = map.LiveParty;

            for (var index = 0; index < chars.Length; ++index)
            {
                // Skip empty party
                if (chars[index].Id == 0xFF)
                {
                    continue;
                }

                var chr = new Models.Character()
                {
                    MaxHp         = chars[index].MaxHp,
                    MaxMp         = chars[index].MaxMp,
                    CurrentHp     = chars[index].CurrentHp,
                    CurrentMp     = chars[index].CurrentMp,
                    Name          = chars[index].Name,
                    Level         = chars[index].Level,
                    Weapon        = WeaponDatabase.FirstOrDefault(w => w.Id == chars[index].Weapon),
                    Armlet        = ArmletDatabase.FirstOrDefault(a => a.Id == chars[index].Armor),
                    Accessory     = AccessoryDatabase.FirstOrDefault(a => a.Id == chars[index].Accessory),
                    WeaponMateria = new Materia[8],
                    ArmletMateria = new Materia[8],
                    Face          = GetFaceForCharacter(chars[index]),
                    BackRow       = !chars[index].AtFront,
                };

                for (var m = 0; m < chars[index].WeaponMateria.Length; ++m)
                {
                    chr.WeaponMateria[m] = MateriaDatabase.FirstOrDefault(x => x.Id == chars[index].WeaponMateria[m]);
                }
                for (var m = 0; m < chars[index].ArmorMateria.Length; ++m)
                {
                    chr.ArmletMateria[m] = MateriaDatabase.FirstOrDefault(x => x.Id == chars[index].ArmorMateria[m]);
                }

                var effect = (StatusEffect)chars[index].Flags;

                if (battleMap.IsActiveBattle)
                {
                    chr.CurrentHp = party[index].CurrentHp;
                    chr.MaxHp     = party[index].MaxHp;
                    chr.CurrentMp = party[index].CurrentMp;
                    chr.MaxMp     = party[index].MaxMp;
                    chr.Level     = party[index].Level;
                    effect        = party[index].Status;
                    chr.BackRow   = party[index].IsBackRow;
                }

                var effs = effect.ToString()
                           .Split(new[] { ", " }, StringSplitOptions.RemoveEmptyEntries)
                           .ToList();
                effs.RemoveAll(x => new[] { "None", "Death" }.Contains(x));
                chr.StatusEffects   = effs.ToArray();
                status.Party[index] = chr;
            }

            return(status);
        }
コード例 #2
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
                });
            }
        }