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); }
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 }); } }