示例#1
0
 public RestoreDialog(MainWindow @mw, SaveBackup @sb, RemnantSave @as)
 {
     InitializeComponent();
     this.txtSave.Content = $"Save Name:\t{sb.Name}\nSave Date:\t{sb.SaveDate.ToString(CultureInfo.CurrentCulture)}";
     this._saveBackup     = sb;
     this._activeSave     = @as;
 }
        private void deleteMenuItem_Click(object sender, System.EventArgs e)
        {
            SaveBackup save          = (SaveBackup)dataBackups.SelectedItem;
            var        confirmResult = MessageBox.Show("Are you sure to delete backup \"" + save.Name + "\" (" + save.SaveDate.ToString() + ")?",
                                                       "Confirm Delete", MessageBoxButton.YesNo, MessageBoxImage.Warning, MessageBoxResult.No);

            if (confirmResult == MessageBoxResult.Yes)
            {
                if (save.Keep)
                {
                    confirmResult = MessageBox.Show("This backup is marked for keeping. Are you SURE to delete backup \"" + save.Name + "\" (" + save.SaveDate.ToString() + ")?",
                                                    "Confirm Delete", MessageBoxButton.YesNo, MessageBoxImage.Warning, MessageBoxResult.No);
                    if (confirmResult != MessageBoxResult.Yes)
                    {
                        return;
                    }
                }
                if (save.Active)
                {
                    this.ActiveSaveIsBackedUp = false;
                }
                if (Directory.Exists(backupDirPath + "\\" + save.SaveDate.Ticks))
                {
                    Directory.Delete(backupDirPath + "\\" + save.SaveDate.Ticks, true);
                }
                listBackups.Remove(save);
                dataBackups.Items.Refresh();
                logMessage("Backup \"" + save.Name + "\" (" + save.SaveDate + ") deleted.");
            }
        }
        private void DataBackups_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            MenuItem analyzeMenu = ((MenuItem)dataBackups.ContextMenu.Items[0]);
            MenuItem deleteMenu  = ((MenuItem)dataBackups.ContextMenu.Items[1]);

            if (e.AddedItems.Count > 0)
            {
                SaveBackup selectedBackup = (SaveBackup)(dataBackups.SelectedItem);
                if (backupActive(selectedBackup))
                {
                    btnRestore.IsEnabled = false;
                    btnRestore.Content   = FindResource("RestoreGrey");
                }
                else
                {
                    btnRestore.IsEnabled = true;
                    btnRestore.Content   = FindResource("Restore");
                }

                analyzeMenu.IsEnabled = true;
                deleteMenu.IsEnabled  = true;
            }
            else
            {
                analyzeMenu.IsEnabled = false;
                deleteMenu.IsEnabled  = false;
                btnRestore.IsEnabled  = false;
                btnRestore.Content    = FindResource("RestoreGrey");
            }
        }
        private void updateSavedNames()
        {
            List <string> savedNames = new List <string>();

            for (int i = 0; i < listBackups.Count; i++)
            {
                SaveBackup s = listBackups[i];
                if (!s.Name.Equals(s.SaveDate.Ticks.ToString()))
                {
                    savedNames.Add(s.SaveDate.Ticks + "=" + System.Net.WebUtility.UrlEncode(s.Name));
                }
                else
                {
                }
            }
            if (savedNames.Count > 0)
            {
                Properties.Settings.Default.BackupName = string.Join(",", savedNames.ToArray());
            }
            else
            {
                Properties.Settings.Default.BackupName = "";
            }
            Properties.Settings.Default.Save();
        }
 private Boolean backupActive(SaveBackup saveBackup)
 {
     if (DateTime.Compare(saveBackup.SaveDate, File.GetLastWriteTime(saveDirPath + "\\profile.sav")) == 0)
     {
         return(true);
     }
     return(false);
 }
        private void menuRestoreWorlds_Click(object sender, RoutedEventArgs e)
        {
            if (isRemnantRunning())
            {
                logMessage("Exit the game before restoring a save backup.");
                return;
            }

            if (dataBackups.SelectedItem == null)
            {
                logMessage("Choose a backup to restore from the list!");
                return;
            }

            SaveBackup selectedBackup = (SaveBackup)dataBackups.SelectedItem;

            if (selectedBackup.Save.Characters.Count != activeSave.Characters.Count)
            {
                logMessage("Backup character count does not match current character count.");
                MessageBoxResult confirmResult = MessageBox.Show("The active save has a different number of characters than the backup worlds you are restoring. This may result in unexpected behavior. Proceed?",
                                                                 "Character Mismatch", MessageBoxButton.YesNo, MessageBoxImage.Warning, MessageBoxResult.No);
                if (confirmResult == MessageBoxResult.No)
                {
                    logMessage("Canceling world restore.");
                    return;
                }
            }

            if (this.ActiveSaveIsBackedUp)
            {
                saveWatcher.EnableRaisingEvents = false;
                System.IO.DirectoryInfo di = new DirectoryInfo(saveDirPath);
                foreach (FileInfo file in di.GetFiles("save_?.sav"))
                {
                    file.Delete();
                }
                di = new DirectoryInfo(backupDirPath + "\\" + selectedBackup.SaveDate.Ticks);
                foreach (FileInfo file in di.GetFiles("save_?.sav"))
                {
                    File.Copy(file.FullName, saveDirPath + "\\" + file.Name);
                }
                foreach (SaveBackup saveBackup in listBackups)
                {
                    saveBackup.Active = false;
                }
                updateCurrentWorldAnalyzer();
                dataBackups.Items.Refresh();
                this.ActiveSaveIsBackedUp = false;
                btnBackup.IsEnabled       = false;
                btnBackup.Content         = FindResource("SaveGrey");
                logMessage("Backup world data restored!");
                saveWatcher.EnableRaisingEvents = Properties.Settings.Default.AutoBackup;
            }
            else
            {
                logMessage("Backup your current save before restoring another!");
            }
        }
 private void DataBackups_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
 {
     if (e.Column.Header.ToString().Equals("Name") && e.EditAction == DataGridEditAction.Commit)
     {
         SaveBackup sb = (SaveBackup)e.Row.Item;
         if (sb.Name.Equals(""))
         {
             sb.Name = sb.SaveDate.Ticks.ToString();
         }
     }
 }
        private void loadBackups()
        {
            if (!Directory.Exists(backupDirPath))
            {
                logMessage("Backups folder not found, creating...");
                Directory.CreateDirectory(backupDirPath);
            }
            dataBackups.ItemsSource = null;
            listBackups.Clear();
            Dictionary <long, string> backupNames = getSavedBackupNames();
            Dictionary <long, bool>   backupKeeps = getSavedBackupKeeps();

            string[]   files        = Directory.GetDirectories(backupDirPath);
            SaveBackup activeBackup = null;

            for (int i = 0; i < files.Length; i++)
            {
                if (RemnantSave.ValidSaveFolder(files[i]))
                {
                    SaveBackup backup = new SaveBackup(files[i]);
                    if (backupNames.ContainsKey(backup.SaveDate.Ticks))
                    {
                        backup.Name = backupNames[backup.SaveDate.Ticks];
                    }
                    if (backupKeeps.ContainsKey(backup.SaveDate.Ticks))
                    {
                        backup.Keep = backupKeeps[backup.SaveDate.Ticks];
                    }

                    if (backupActive(backup))
                    {
                        backup.Active = true;
                        activeBackup  = backup;
                    }

                    backup.Updated += saveUpdated;

                    listBackups.Add(backup);
                }
            }
            dataBackups.ItemsSource = listBackups;
            logMessage("Backups found: " + listBackups.Count);
            if (listBackups.Count > 0)
            {
                logMessage("Last backup save date: " + listBackups[listBackups.Count - 1].SaveDate.ToString());
            }
            if (activeBackup != null)
            {
                dataBackups.SelectedItem = activeBackup;
            }
            ActiveSaveIsBackedUp = (activeBackup != null);
        }
        private void BtnRestore_Click(object sender, RoutedEventArgs e)
        {
            if (isRemnantRunning())
            {
                logMessage("Exit the game before restoring a save backup.");
                return;
            }

            if (dataBackups.SelectedItem == null)
            {
                logMessage("Choose a backup to restore from the list!");
                return;
            }

            if (this.ActiveSaveIsBackedUp)
            {
                saveWatcher.EnableRaisingEvents = false;
                System.IO.DirectoryInfo di = new DirectoryInfo(saveDirPath);
                foreach (FileInfo file in di.GetFiles())
                {
                    file.Delete();
                }
                SaveBackup selectedBackup = (SaveBackup)dataBackups.SelectedItem;
                foreach (var file in Directory.GetFiles(backupDirPath + "\\" + selectedBackup.SaveDate.Ticks))
                {
                    File.Copy(file, saveDirPath + "\\" + System.IO.Path.GetFileName(file));
                }
                foreach (SaveBackup saveBackup in listBackups)
                {
                    saveBackup.Active = false;
                }
                selectedBackup.Active = true;
                updateCurrentWorldAnalyzer();
                dataBackups.Items.Refresh();
                btnRestore.IsEnabled = false;
                btnRestore.Content   = FindResource("RestoreGrey");
                logMessage("Backup restored!");
                saveWatcher.EnableRaisingEvents = Properties.Settings.Default.AutoBackup;
            }
            else
            {
                logMessage("Backup your current save before restoring another!");
            }
        }
        private void analyzeMenuItem_Click(object sender, System.EventArgs e)
        {
            SaveBackup saveBackup = (SaveBackup)dataBackups.SelectedItem;

            logMessage("Showing backup save (" + saveBackup.Name + ") world analyzer...");
            SaveAnalyzer analyzer = new SaveAnalyzer(this);

            analyzer.Title    = "Backup Save (" + saveBackup.Name + ") World Analyzer";
            analyzer.Closing += Backup_Analyzer_Closing;
            List <RemnantCharacter> chars = saveBackup.Save.Characters;

            for (int i = 0; i < chars.Count; i++)
            {
                chars[i].LoadWorldData(i);
            }
            analyzer.LoadData(chars);
            backupSaveAnalyzers.Add(analyzer);
            analyzer.Show();
        }
        private void updateSavedKeeps()
        {
            List <string> savedKeeps = new List <string>();

            for (int i = 0; i < listBackups.Count; i++)
            {
                SaveBackup s = listBackups[i];
                if (s.Keep)
                {
                    savedKeeps.Add(s.SaveDate.Ticks + "=True");
                }
            }
            if (savedKeeps.Count > 0)
            {
                Properties.Settings.Default.BackupKeep = string.Join(",", savedKeeps.ToArray());
            }
            else
            {
                Properties.Settings.Default.BackupKeep = "";
            }
            Properties.Settings.Default.Save();
        }
 private void doBackup()
 {
     try
     {
         int      existingSaveIndex = -1;
         DateTime saveDate          = File.GetLastWriteTime(saveDirPath + "\\profile.sav");
         string   backupFolder      = backupDirPath + "\\" + saveDate.Ticks;
         if (!Directory.Exists(backupFolder))
         {
             Directory.CreateDirectory(backupFolder);
         }
         else if (RemnantSave.ValidSaveFolder(backupFolder))
         {
             for (int i = listBackups.Count - 1; i >= 0; i--)
             {
                 if (listBackups[i].SaveDate.Ticks == saveDate.Ticks)
                 {
                     existingSaveIndex = i;
                     break;
                 }
             }
         }
         foreach (string file in Directory.GetFiles(saveDirPath))
         {
             File.Copy(file, backupFolder + "\\" + System.IO.Path.GetFileName(file), true);
         }
         if (RemnantSave.ValidSaveFolder(backupFolder))
         {
             Dictionary <long, string> backupNames = getSavedBackupNames();
             Dictionary <long, bool>   backupKeeps = getSavedBackupKeeps();
             SaveBackup backup = new SaveBackup(backupFolder);
             if (backupNames.ContainsKey(backup.SaveDate.Ticks))
             {
                 backup.Name = backupNames[backup.SaveDate.Ticks];
             }
             if (backupKeeps.ContainsKey(backup.SaveDate.Ticks))
             {
                 backup.Keep = backupKeeps[backup.SaveDate.Ticks];
             }
             foreach (SaveBackup saveBackup in listBackups)
             {
                 saveBackup.Active = false;
             }
             backup.Active   = true;
             backup.Updated += saveUpdated;
             if (existingSaveIndex > -1)
             {
                 listBackups[existingSaveIndex] = backup;
             }
             else
             {
                 listBackups.Add(backup);
             }
         }
         checkBackupLimit();
         dataBackups.Items.Refresh();
         this.ActiveSaveIsBackedUp = true;
         logMessage($"Backup completed ({saveDate.ToString()})!");
     }
     catch (IOException ex)
     {
         if (ex.Message.Contains("being used by another process"))
         {
             logMessage("Save file in use; waiting 0.5 seconds and retrying.");
             System.Threading.Thread.Sleep(500);
             doBackup();
         }
     }
 }
        private void loadBackups()
        {
            if (!Directory.Exists(backupDirPath))
            {
                logMessage("Backups folder not found, creating...");
                Directory.CreateDirectory(backupDirPath);
            }
            dataBackups.ItemsSource = null;
            listBackups.Clear();
            Dictionary <long, string> backupNames = getSavedBackupNames();
            Dictionary <long, bool>   backupKeeps = getSavedBackupKeeps();

            string[]   files        = Directory.GetDirectories(backupDirPath);
            SaveBackup activeBackup = null;

            /*DataGridTextColumn col1 = new DataGridTextColumn();
             * col1.Header = "Name";
             * col1.Binding = new Binding("Name");
             * dataBackups.Columns.Add(col1);
             * DataGridTextColumn col2 = new DataGridTextColumn();
             * col2.Header = "Date";
             * col2.Binding = new Binding("SaveDate");
             * dataBackups.Columns.Add(col2);
             * DataGridCheckBoxColumn col3 = new DataGridCheckBoxColumn();
             * col3.Header = "Keep";
             * col3.Binding = new Binding("Keep");
             * dataBackups.Columns.Add(col3);*/
            for (int i = 0; i < files.Length; i++)
            {
                if (RemnantSave.ValidSaveFolder(files[i]))
                {
                    SaveBackup backup = new SaveBackup(files[i]);
                    if (backupNames.ContainsKey(backup.SaveDate.Ticks))
                    {
                        backup.Name = backupNames[backup.SaveDate.Ticks];
                    }
                    if (backupKeeps.ContainsKey(backup.SaveDate.Ticks))
                    {
                        backup.Keep = backupKeeps[backup.SaveDate.Ticks];
                    }

                    if (backupActive(backup))
                    {
                        backup.Active = true;
                        activeBackup  = backup;
                    }

                    backup.Updated += saveUpdated;

                    listBackups.Add(backup);
                }
            }
            dataBackups.ItemsSource = listBackups;
            logMessage("Backups found: " + listBackups.Count);
            if (listBackups.Count > 0)
            {
                logMessage("Last backup save date: " + listBackups[listBackups.Count - 1].SaveDate.ToString());
            }
            if (activeBackup != null)
            {
                dataBackups.SelectedItem = activeBackup;
            }
            SetActiveSaveIsBackedup(activeBackup != null);
        }