public static void CopyPlots(this SFXSaveGameFile target, List <CopyPlot> toCopy) { foreach (var plot in toCopy) { switch (plot.Type) { case SFXPlotType.Boolean: { target.Plot.SetBoolVariable(plot.TId, target.Plot.GetBoolVariable(plot.SId)); break; } case SFXPlotType.Integer: { target.Plot.SetIntVariable(plot.TId, target.Plot.GetIntVariable(plot.SId)); break; } case SFXPlotType.Float: { target.Plot.SetFloatVariable(plot.TId, target.Plot.GetFloatVariable(plot.SId)); break; } } } }
public static void ClearAllVariables( this SFXSaveGameFile target, bool persistMe1Me2Plots) { throw new NotImplementedException(); // TODO: figure this out... if (persistMe1Me2Plots == false) { target.Plot.BoolVariables.Length = 0; target.Plot.IntVariables.Clear(); target.Plot.FloatVariables.Clear(); } else { target.Plot.BoolVariables.Length = Constants.ME1PlotTable_Bool_CutoffIndex + 1; for (var i = 0; i < target.Plot.BoolVariables.Length && i < Constants.ME1PlotTable_IndexOffset; i++) { target.Plot.BoolVariables[i] = false; } target.Plot.IntVariables.RemoveAll(iv => iv.Index <Constants.ME1PlotTable_IndexOffset || iv.Index> Constants.ME1PlotTable_Int_CutoffIndex); target.Plot.FloatVariables.RemoveAll(iv => iv.Index <Constants.ME1PlotTable_IndexOffset || iv.Index> Constants.ME1PlotTable_Float_CutoffIndex); } }
internal static Squad.PlayerClass GetPlayerClassInfo(SFXSaveGameFile saveGame) { var friendlyName = saveGame.Player.ClassFriendlyName; //var playerClass = (PlayerCharacterClass) friendlyName; return(LoadoutData.PlayerClasses.Find(p => p.DisplayName == friendlyName)); }
public static void SetPlayerPlotData( this SFXSaveGameFile target) { target.Plot.SetBoolVariable(Constants.ME3_Plots_Utility_Player_Info_Female_Player, target.Player.IsFemale); target.Plot.SetIntVariable(Constants.ME3_Plots_Utility_Player_Info_Childhood, (int)target.Player.Origin); target.Plot.SetIntVariable(Constants.ME3_Plots_Utility_Player_Info_Reputation, (int)target.Player.Notoriety); }
internal static void ResetPlayerWeaponMods(SFXSaveGameFile saveGame) { // Assault Rifles saveGame.Player.WeaponMods = GetPlayerWeaponMods(WeaponClassType.AssaultRifle).ToList(); // Pistols saveGame.Player.WeaponMods.AddRange(GetPlayerWeaponMods(WeaponClassType.Pistol)); // Shotguns saveGame.Player.WeaponMods.AddRange(GetPlayerWeaponMods(WeaponClassType.Shotgun)); // SMG's saveGame.Player.WeaponMods.AddRange(GetPlayerWeaponMods(WeaponClassType.SMG)); // Sniper Rifles saveGame.Player.WeaponMods.AddRange(GetPlayerWeaponMods(WeaponClassType.SniperRifle)); }
public static void MergeMe1PlotRecord( this SFXSaveGameFile target, ME1PlotTable me1Plots) { for (var i = 0; i < me1Plots.BoolVariables.Length /*&& * PlotConstants.ME1PlotTable_IndexOffset + i < PlotConstants.ME1PlotTable_Bool_CutoffIndex*/; i++) { target.Plot.SetBoolVariable( Constants.ME1PlotTable_IndexOffset + i, me1Plots.BoolVariables[i]); } for (var i = 0; i < me1Plots.IntVariables.Count /*&& * PlotConstants.ME1PlotTable_IndexOffset + i < PlotConstants.ME1PlotTable_Int_CutoffIndex*/; i++) { target.Plot.SetIntVariable( Constants.ME1PlotTable_IndexOffset + i, me1Plots.IntVariables[i]); } for (var i = 0; i < me1Plots.FloatVariables.Count /*&& * PlotConstants.ME1PlotTable_IndexOffset + i < PlotConstants.ME1PlotTable_Float_CutoffIndex*/; i++) { target.Plot.SetFloatVariable( Constants.ME1PlotTable_IndexOffset + i, me1Plots.FloatVariables[i]); } }
public static void DoMe2PlotImport( this SFXSaveGameFile target, SFXSaveGameFile legacyImport) { if (legacyImport.ME1Plot.BoolVariables.Length > 0 || legacyImport.ME1Plot.IntVariables.Count > 0 || legacyImport.ME1Plot.FloatVariables.Count > 0) { target.MergeMe1PlotRecord(legacyImport.ME1Plot); target.FixMe1PlotsDuringMe2PlotImport(); target.CopyPlots(Me1ToMe3PlotCopy); target.Plot.SetBoolVariable(Constants.ME3_Plots_Bool_Is_ME1_Import, true); } else { target.ApplyCanonPlots(Me1CanonPlotVariables); target.DoDarkHorseMe1PlotCopyAndPlotLogicFix(); } target.CopyPlots(Me2ToMe3PlotCopy); target.Plot.SetBoolVariable(Constants.ME3_Plots_Bool_Is_ME2_Import, true); }
public static void SetNewGamePlotStates( this SFXSaveGameFile target, SFXSaveGameFile legacyImport, SFXSaveGameFile plusImport) { if (legacyImport != null) { target.CopyMe2PlotData(legacyImport); target.SetPlayerPlotData(); target.DoMe2PlotImport(legacyImport); } else if (plusImport != null) { target.DoMe3NewGamePlusImport(plusImport); target.SetPlayerPlotData(); } else { target.SetPlayerPlotData(); target.ApplyCanonPlots(Me1CanonPlotVariables); target.ApplyCanonPlots(Me2CanonPlotVariables); } }
internal static void ResetHenchmenWeaponMods(SFXSaveGameFile saveGame) { var previous = saveGame.Henchmen; saveGame.Henchmen = new List <Henchman>(); foreach (var henchman in LoadoutData.HenchmenClasses) { var hench = previous.Find(h => h.Tag == henchman.Tag); if (hench != null) { ResetHenchmanWeaponMods(saveGame, hench); } else { hench = ResetHenchman(saveGame, henchman); hench.Powers.Clear(); } saveGame.Henchmen.Add(hench); } }
public static void FixMe1PlotsDuringMe2PlotImport(this SFXSaveGameFile target) { var councilIsAlive = target.Plot.GetBoolVariable(Constants.ME2__ME1_Plots_for_ME2__CH4_Star_Citadel__Council_Alive); target.Plot.SetBoolVariable( Constants.ME3__ME1_Plots_for_ME3__CH4_Star_Citadel__Final_Choice__Choice_Is_Made__Save_the_Council, councilIsAlive); target.Plot.SetBoolVariable( Constants. ME3__ME1_Plots_for_ME3__CH4_Star_Citadel__Final_Choice__Choice_Is_Made__Destroy_the_Council, councilIsAlive == false); var andersonIsABro = target.Plot.GetBoolVariable(Constants.ME2__ME1_Plots_for_ME2__CH4_Star_Citadel__Anderson_chosen); target.Plot.SetBoolVariable( Constants.ME3__ME1_Plots_for_ME3__CH4_Star_Citadel__Final_Choice__Chose_ambassador, andersonIsABro == false); target.Plot.SetBoolVariable( Constants.ME3__ME1_Plots_for_ME3__CH4_Star_Citadel__Final_Choice__Chose_Anderson, andersonIsABro); }
internal static Henchman ResetHenchman(SFXSaveGameFile saveGame, HenchmanClass henchmanClass, bool resetDefaults = false) { var hench = new Henchman { CharacterLevel = saveGame.Player.Level, Grenades = 0, LoadoutWeapons = new Loadout { AssaultRifle = "None", HeavyWeapon = "None", Pistol = "None", Shotgun = "None", SubmachineGun = "None", SniperRifle = "None" }, MappedPower = "None", Tag = henchmanClass.Tag }; ResetHenchmanPowers(saveGame, hench, resetDefaults); ResetHenchmanWeaponMods(saveGame, hench); return(hench); }
internal static void ResetHenchmanWeaponMods(SFXSaveGameFile saveGame, Henchman henchman) { var henchProperty = LoadoutData.HenchmenClasses.Single(pair => pair.Tag == henchman.Tag); henchman.WeaponMods = new List <WeaponMod>(); // Assault Rifles if (henchProperty.Weapons.Contains(WeaponClassType.AssaultRifle)) { henchman.WeaponMods.AddRange(GetHenchmanWeaponMods(WeaponClassType.AssaultRifle)); } // Pistols if (henchProperty.Weapons.Contains(WeaponClassType.Pistol)) { henchman.WeaponMods.AddRange(GetHenchmanWeaponMods(WeaponClassType.Pistol)); } // Shotguns if (henchProperty.Weapons.Contains(WeaponClassType.Shotgun)) { henchman.WeaponMods.AddRange(GetHenchmanWeaponMods(WeaponClassType.Shotgun)); } // SMG's if (henchProperty.Weapons.Contains(WeaponClassType.SMG)) { henchman.WeaponMods.AddRange(GetHenchmanWeaponMods(WeaponClassType.SMG)); } // Sniper Rifles if (henchProperty.Weapons.Contains(WeaponClassType.SniperRifle)) { henchman.WeaponMods.AddRange(GetHenchmanWeaponMods(WeaponClassType.SniperRifle)); } }
public static void CopyMe2PlotData( this SFXSaveGameFile target, SFXSaveGameFile legacyImport) { throw new NotImplementedException(); }
public static void DoMe3NewGamePlusImport( this SFXSaveGameFile target, SFXSaveGameFile plusImport) { throw new NotImplementedException(); }
private void FindSaves(string savePath) { saveListView.BeginUpdate(); saveListView.Items.Clear(); if (FileMode == PickerMode.Save) { var item = new ListViewItem { // ReSharper disable LocalizableElement Name = "New Save", // ReSharper restore LocalizableElement Text = Localization.SavePicker_NewSaveLabel, // ReSharper disable LocalizableElement ImageKey = "New", // ReSharper restore LocalizableElement }; saveListView.Items.Add(item); } _HighestSaveNumber = 1; if (savePath != null) { if (Directory.Exists(FilePath)) { foreach (var inputPath in Directory .GetFiles(savePath, "*.pcsav") .OrderByDescending(Directory.GetLastWriteTime)) { var baseName = Path.GetFileNameWithoutExtension(inputPath); if (baseName != null && baseName.StartsWith("Save_") && baseName.Length == 9) { int saveNumber; if (int.TryParse(baseName.Substring(5).TrimStart('0'), out saveNumber)) { _HighestSaveNumber = Math.Max(saveNumber, _HighestSaveNumber); } } SFXSaveGameFile saveFile = null; try { using (var input = File.OpenRead(inputPath)) { saveFile = SFXSaveGameFile.Read(input); } } catch (Exception) { saveFile = null; } var item = new ListViewItem { Text = Path.GetFileName(inputPath), ImageKey = "", Tag = inputPath, }; saveListView.Items.Add(item); } } } saveListView.EndUpdate(); if (saveListView.Items.Count > 0) { saveListView.Items[0].Selected = true; } }
public static void DoDarkHorseMe1PlotCopyAndPlotLogicFix( this SFXSaveGameFile target) { if (target.Plot.GetBoolVariable(Constants.PS3DarkHorseME1PlayedPlotCheck_Bool)) { if ( target.Plot.GetBoolVariable( Constants.ME2__ME1_Plots_for_ME2__Background_and_Relationships__Kaidan_romance_True)) { target.Plot.SetIntVariable( Constants.ME3__ME1_Plots_for_ME3__Global_Plots__Henchman_Kaidan__Romance_Buddy_dialog_count, 4); target.Plot.SetBoolVariable( Constants.ME3__ME1_Plots_for_ME3__Global_Plots__Henchman_Kaidan__Romance_active, true); } if ( target.Plot.GetBoolVariable( Constants.ME2__ME1_Plots_for_ME2__Background_and_Relationships__Ashley_romance_True)) { target.Plot.SetIntVariable( Constants.ME3__ME1_Plots_for_ME3__Global_Plots__Henchman_Ash__Romance_Buddy_dialog_count, 4); target.Plot.SetBoolVariable( Constants.ME3__ME1_Plots_for_ME3__Global_Plots__Henchman_Ash__romance_active, true); } if ( target.Plot.GetBoolVariable( Constants.ME2__ME1_Plots_for_ME2__Background_and_Relationships__Liara_romance_True)) { target.Plot.SetIntVariable( Constants.ME3__ME1_Plots_for_ME3__Global_Plots__Henchman_Liara__Romance_Buddy_dialog_count, 4); target.Plot.SetBoolVariable( Constants.ME3__ME1_Plots_for_ME3__Global_Plots__Henchman_Liara__Romance_active, true); } if (target.Plot.GetBoolVariable(Constants.ME2__ME1_Plots_for_ME2__CH2_Virmire__Ash_died) && target.Plot.GetBoolVariable(Constants.ME2__ME1_Plots_for_ME2__CH2_Virmire__Kaidan_died)) { var isFemale = target.Plot.GetBoolVariable(Constants.ME3_Plots_Utility_Player_Info_Female_Player); target.Plot.SetBoolVariable( Constants.ME3__ME1_Plots_for_ME3__CH2_Virmire__The_Choice__Rescued_Kaidan, isFemale == false); target.Plot.SetBoolVariable( Constants.ME3__ME1_Plots_for_ME3__CH2_Virmire__The_Choice__Rescued_Ash, isFemale); } else { var ashleyDied = target.Plot.GetBoolVariable(Constants.ME2__ME1_Plots_for_ME2__CH2_Virmire__Ash_died); target.Plot.SetBoolVariable( Constants.ME3__ME1_Plots_for_ME3__CH2_Virmire__The_Choice__Rescued_Kaidan, ashleyDied); target.Plot.SetBoolVariable( Constants.ME3__ME1_Plots_for_ME3__CH2_Virmire__The_Choice__Rescued_Ash, ashleyDied == false); } var rachniAreAlive = target.Plot.GetBoolVariable(Constants.ME2__ME1_Plots_for_ME2__CH2_Noveria__Rachni_Alive); target.Plot.SetBoolVariable( Constants.ME3__ME1_Plots_for_ME3__CH2_Noveria__Rachni_Queen__Queen_Dealt_With__Queen_Released, rachniAreAlive); target.Plot.SetBoolVariable( Constants.ME3__ME1_Plots_for_ME3__CH2_Noveria__Rachni_Queen__Queen_Dealt_With__Queen_eliminated, rachniAreAlive == false); var wrexDied = target.Plot.GetBoolVariable(Constants.ME2__ME1_Plots_for_ME2__CH2_Virmire_Wrex_Died); target.Plot.SetBoolVariable( Constants. ME3__ME1_Plots_for_ME3__CH2_Virmire__Krogan_conundrum__Failure__Failure_KilledBy_Player, wrexDied); target.Plot.SetBoolVariable(Constants.ME3__ME1_Plots_for_ME3__Utility__Henchman__InParty__Krogan, wrexDied == false); target.FixMe1PlotsDuringMe2PlotImport(); } }
public static void ApplyCanonPlots(this SFXSaveGameFile target, List <NewGameCanonPlot> aCanonPlotVariables) { throw new NotImplementedException(); }
private void FindCareers() { careerListView.BeginUpdate(); careerListView.Items.Clear(); if (Directory.Exists(FilePath)) { foreach (var careerPath in Directory .GetDirectories(FilePath) .OrderByDescending(Directory.GetLastWriteTime)) { var careerFiles = Directory.GetFiles(careerPath, "*.pcsav"); if (careerFiles.Length == 0) { continue; } SFXSaveGameFile saveFile = null; foreach (var careerFile in careerFiles) { try { using (var input = File.OpenRead(careerFile)) { saveFile = SFXSaveGameFile.Read(input); } break; } catch (Exception) { saveFile = null; } } // attempt to parse the directory name string name; OriginType originType; NotorietyType reputationType; string className; DateTime date; if (ParseCareerName( Path.GetFileName(careerPath), out name, out originType, out reputationType, out className, out date)) { var classType = PlayerClass.Invalid; if (saveFile != null) { classType = GetPlayerClassFromStringId(saveFile.Player.ClassFriendlyName); } if (classType == PlayerClass.Invalid && className != null) { classType = GetPlayerClassFromLocalizedName(className); } var displayName = ""; displayName += (saveFile == null ? name : saveFile.Player.FirstName) + "\n"; displayName += string.Format("{0}, {1}", classType, date.ToString("d")); //displayName += date.ToString(); careerListView.Items.Add(new ListViewItem { Text = displayName, // ReSharper disable LocalizableElement ImageKey = "Class_" + classType, // ReSharper restore LocalizableElement Tag = careerPath, }); } else { careerListView.Items.Add(new ListViewItem { Text = Path.GetFileName(careerPath), // ReSharper disable LocalizableElement ImageKey = "Class_Unknown", // ReSharper restore LocalizableElement Tag = careerPath, }); } } } if (FileMode == PickerMode.Save) { if (careerListView.Items.Count > 0) { var item = new ListViewItem { // ReSharper disable LocalizableElement Name = "New Career", // ReSharper restore LocalizableElement Text = Localization.SavePicker_NewCareerLabel, // ReSharper disable LocalizableElement ImageKey = "New", // ReSharper restore LocalizableElement }; careerListView.Items.Insert(1, item); } else { var item = new ListViewItem { // ReSharper disable LocalizableElement Name = "New Career", // ReSharper restore LocalizableElement Text = Localization.SavePicker_NewCareerLabel, // ReSharper disable LocalizableElement ImageKey = "New", // ReSharper restore LocalizableElement }; careerListView.Items.Add(item); } } careerListView.EndUpdate(); if (careerListView.Items.Count > 0) { careerListView.Items[0].Selected = true; } else { FindSaves(null); } }
public static SFXSaveGameFile Read(Stream input) { if (input == null) { throw new ArgumentNullException("input"); } var save = new SFXSaveGameFile() { _Version = input.ReadValueU32(Endian.Little) }; if (save._Version != 29 && save._Version.Swap() != 29 && save._Version != 59 && save._Version.Swap() != 59) { throw new FormatException("unexpected version"); } var endian = save._Version == 29 || save._Version == 59 ? Endian.Little : Endian.Big; if (endian == Endian.Big) { save._Version = save._Version.Swap(); } var reader = new Unreal.FileReader(input, save._Version, endian); save.Serialize(reader); if (save._Version >= 27) { if (input.Position != input.Length - 4) { throw new FormatException("bad checksum position"); } save._Checksum = input.ReadValueU32(); } if (input.Position != input.Length) { throw new FormatException("did not consume entire file"); } save.Endian = endian; return save; }
internal static void ResetHenchmanPowers(SFXSaveGameFile saveGame, Henchman henchman, bool resetDefaults = false) { var henchProperty = LoadoutData.HenchmenClasses.FirstOrDefault(pair => pair.Tag.Equals(henchman.Tag, StringComparison.InvariantCultureIgnoreCase)); if (henchProperty == null) { return; } henchman.Powers = new List <Power>(); henchman.CharacterLevel = saveGame.Player.Level; henchman.TalentPoints = SquadVariables.GetHenchTalentPoints(henchman.CharacterLevel); foreach (var powerId in henchProperty.Powers) { PowerClass power = null; var pId = powerId; foreach (var powerClass in LoadoutData.PowerClasses.Where(powerClass => powerClass != null && powerClass.Name != null) .Where(powerClass => powerClass.Name.Equals(pId, StringComparison.InvariantCultureIgnoreCase) || (powerClass.CustomName != null && powerClass.CustomName.Equals(pId, StringComparison.InvariantCultureIgnoreCase)))) { power = powerClass; } if (power == null) { continue; } henchman.Powers.Add(new Power(power.ClassName, power.Name)); } if (!resetDefaults) { return; } foreach (var power in henchman.Powers) { var powerClass = LoadoutData.PowerClasses.FirstOrDefault( p => (p.ClassName != null && p.ClassName.Equals(power.ClassName, StringComparison.InvariantCultureIgnoreCase))); if (powerClass == null) { continue; } if (!henchProperty.DefaultPowers.Any(s => s.Equals(powerClass.Name, StringComparison.InvariantCultureIgnoreCase) || s.Equals(powerClass.CustomName, StringComparison.InvariantCultureIgnoreCase))) { continue; } power.CurrentRank = 1; if (powerClass.PowerType != PowerClassType.None) { henchman.TalentPoints--; } } }
internal static void ResetPlayerPowers(SFXSaveGameFile saveGame, bool resetDefaults = false) { var playerClass = GetPlayerClassInfo(saveGame); var previous = saveGame.Player.Powers; saveGame.Player.Powers = new List <Power>(); saveGame.Player.TalentPoints = SquadVariables.GetPlayerTalentPoints(saveGame.Player.Level); foreach (var powerId in playerClass.Powers) { PowerClass power = null; var pId = powerId; foreach (var powerClass in LoadoutData.PowerClasses.Where(powerClass => powerClass != null && powerClass.Name != null) .Where(powerClass => powerClass.Name.Equals(pId, StringComparison.InvariantCultureIgnoreCase) || (powerClass.CustomName != null && powerClass.CustomName.Equals(pId, StringComparison.InvariantCultureIgnoreCase)))) { power = powerClass; } if (power == null) { continue; } saveGame.Player.Powers.Add(new Power(power.ClassName, power.Name)); } foreach (var power in previous) { if (saveGame.Player.Powers.FindIndex(pwr => pwr.Name.Equals(power.Name, StringComparison.InvariantCultureIgnoreCase)) >= 0) { continue; } var firstOrDefault = LoadoutData.PowerClasses.FirstOrDefault( powerClass => (powerClass.Name.Equals(power.Name, StringComparison.InvariantCultureIgnoreCase)) || (powerClass.CustomName != null && powerClass.CustomName.Equals(power.Name, StringComparison.InvariantCultureIgnoreCase))); if (firstOrDefault != null && firstOrDefault.PowerType == PowerClassType.Bonus) { saveGame.Player.Powers.Add(new Power(power.ClassName, power.Name)); } //LoadoutData.PowerClasses.First(powerClass => powerClass.Name.Equals(power.Name, StringComparison.InvariantCultureIgnoreCase)).PowerType == PowerClassType.Bonus //LoadoutData.PowerClasses.First(powerClass => powerClass.CustomName != null && powerClass.CustomName.Equals(power.Name, StringComparison.InvariantCultureIgnoreCase)).PowerType == PowerClassType.Bonus /*if (LoadoutData.PowerClasses.First(powerClass => powerClass.Name.Equals(power.Name, StringComparison.InvariantCultureIgnoreCase)).PowerType == PowerClassType.Bonus) * { * saveGame.Player.Powers.Add(new Power(power.ClassName, power.Name)); * } * else if (LoadoutData.PowerClasses.First(powerClass => powerClass.CustomName != null && powerClass.CustomName.Equals(power.Name, StringComparison.InvariantCultureIgnoreCase)).PowerType == PowerClassType.Bonus) * { * saveGame.Player.Powers.Add(new Power(power.ClassName, power.Name)); * }*/ } if (!resetDefaults) { return; } foreach (var power in saveGame.Player.Powers) { var powerClass = LoadoutData.PowerClasses.FirstOrDefault( p => (p.ClassName != null && p.ClassName.Equals(power.ClassName, StringComparison.InvariantCultureIgnoreCase))); if (powerClass == null) { continue; } if (!playerClass.DefaultPowers.Any(s => s.Equals(powerClass.Name, StringComparison.InvariantCultureIgnoreCase) || s.Equals(powerClass.CustomName, StringComparison.InvariantCultureIgnoreCase)) && powerClass.PowerType != PowerClassType.Bonus) { continue; } power.CurrentRank = 1; if (powerClass.PowerType != PowerClassType.None) { saveGame.Player.TalentPoints--; } } }
public static void Write(SFXSaveGameFile save, Stream output) { if (save == null) { throw new ArgumentNullException("save"); } if (output == null) { throw new ArgumentNullException("output"); } using (var memory = new MemoryStream()) { memory.WriteValueU32(save.Version, save._Endian); var writer = new Unreal.FileWriter(memory, save._Version, save._Endian); save.Serialize(writer); if (save._Version >= 27) { memory.Position = 0; uint checksum = 0; var buffer = new byte[1024]; while (memory.Position < memory.Length) { int read = memory.Read(buffer, 0, 1024); checksum = Crc32.Compute(buffer, 0, read, checksum); } save._Checksum = checksum; memory.WriteValueU32(checksum, save._Endian); } memory.Position = 0; output.WriteFromStream(memory, memory.Length); } }
private void FindSaves(string savePath) { saveListView.BeginUpdate(); saveListView.Items.Clear(); if (FileMode == PickerMode.Save) { var item = new ListViewItem { Name = @"New Save", Text = Localization.SavePicker_NewSaveLabel, ImageKey = @"New", }; saveListView.Items.Add(item); } _highestSaveNumber = 1; if (savePath != null) { if (Directory.Exists(FilePath)) { foreach (var inputPath in Directory .GetFiles(savePath, "*.pcsav") .OrderByDescending(Directory.GetLastWriteTime)) { var baseName = Path.GetFileNameWithoutExtension(inputPath); if (baseName != null && baseName.StartsWith("Save_") && baseName.Length == 9) { int saveNumber; if (int.TryParse(baseName.Substring(5).TrimStart('0'), out saveNumber)) { _highestSaveNumber = Math.Max(saveNumber, _highestSaveNumber); } } try { using (var input = File.OpenRead(inputPath)) { SFXSaveGameFile.Read(input); } } catch (Exception ex) { MessageBox.Show(ex.Message, Localization.Error, MessageBoxButtons.OK, MessageBoxIcon.Error); } var item = new ListViewItem { Text = Path.GetFileName(inputPath), ImageKey = "", Tag = inputPath, }; saveListView.Items.Add(item); } } } saveListView.EndUpdate(); if (saveListView.Items.Count > 0) { saveListView.Items[0].Selected = true; } }