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