Пример #1
0
        public Save(string File_Path)
        {
            if (File.Exists(File_Path))
            {
                if (Save_File != null)
                {
                    Save_Reader.Close();
                    Save_File.Close();
                }
                bool Failed_to_Load = false;
                try { Save_File = new FileStream(File_Path, FileMode.Open); } catch { Failed_to_Load = true; }
                if (Save_File == null || Failed_to_Load || !Save_File.CanWrite)
                {
                    MessageBox.Show(string.Format("Error: File {0} is being used by another process. Please close any process using it before editing!",
                                                  Path.GetFileName(File_Path)), "File Opening Error");
                    try { Save_File.Close(); } catch { };
                    return;
                }

                Save_Reader = new BinaryReader(Save_File);

                Original_Save_Data = Save_Reader.ReadBytes((int)Save_File.Length);
                Working_Save_Data  = new byte[Original_Save_Data.Length];
                Buffer.BlockCopy(Original_Save_Data, 0, Working_Save_Data, 0, Original_Save_Data.Length);

                Save_Type              = SaveDataManager.GetSaveType(Original_Save_Data);
                Game_System            = SaveDataManager.GetGameSystem(Save_Type);
                Full_Save_Path         = File_Path;
                Save_Name              = Path.GetFileNameWithoutExtension(File_Path);
                Save_Path              = Path.GetDirectoryName(File_Path) + Path.DirectorySeparatorChar;
                Save_Extension         = Path.GetExtension(File_Path);
                Save_ID                = SaveDataManager.GetGameID(Save_Type);
                Save_Data_Start_Offset = SaveDataManager.GetSaveDataOffset(Save_ID.ToLower(), Save_Extension.Replace(".", "").ToLower());
                Save_Info              = SaveDataManager.GetSaveInfo(Save_Type);

                if (Save_Type == SaveType.Doubutsu_no_Mori)
                {
                    Original_Save_Data = SaveDataManager.ByteSwap(Original_Save_Data);
                    Working_Save_Data  = SaveDataManager.ByteSwap(Working_Save_Data);
                }

                if (Save_Type == SaveType.Wild_World || Save_Type == SaveType.New_Leaf || Save_Type == SaveType.Welcome_Amiibo)
                {
                    Is_Big_Endian = false;
                }

                Save_Reader.Close();
                Save_File.Close();
            }
            else
            {
                MessageBox.Show("File doesn't exist!");
            }
        }
Пример #2
0
        public Save(string filePath)
        {
            if (File.Exists(filePath))
            {
                if (_saveFile != null)
                {
                    _saveReader.Close();
                    _saveFile.Close();
                }
                try { _saveFile = new FileStream(filePath, FileMode.Open); } catch { SuccessfullyLoaded = false; }
                if (_saveFile == null || !SuccessfullyLoaded || !_saveFile.CanWrite)
                {
                    MessageBox.Show(
                        $"Error: File {Path.GetFileName(filePath)} is being used by another process. Please close any process using it before editing!",
                        "File Opening Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    try
                    {
                        _saveFile?.Close();
                    }
                    catch
                    {
                        // ignored
                    }
                    return;
                }

                _saveReader = new BinaryReader(_saveFile);

                if (_saveFile.Length == 0x20000)
                {
                    var data = _saveReader.ReadBytes(0x20000);
                    if (Encoding.ASCII.GetString(data, 4, 4) == "JFAN") // Check for DnM which is byteswapped
                    {
                        OriginalSaveData = SaveDataManager.ByteSwap(data);
                        SaveType         = SaveType.DoubutsuNoMori;
                    }
                    else
                    {
                        OriginalSaveData = data;
                        SaveType         = SaveType.AnimalForest;
                    }
                }
                else
                {
                    OriginalSaveData = _saveReader.ReadBytes((int)_saveFile.Length);
                }


                WorkingSaveData = new byte[OriginalSaveData.Length];
                Buffer.BlockCopy(OriginalSaveData, 0, WorkingSaveData, 0, OriginalSaveData.Length);

                SaveType            = SaveDataManager.GetSaveType(OriginalSaveData) ?? SaveType;
                SaveGeneration      = SaveDataManager.GetSaveGeneration(SaveType);
                FullSavePath        = filePath;
                SaveName            = Path.GetFileNameWithoutExtension(filePath);
                SavePath            = Path.GetDirectoryName(filePath) + Path.DirectorySeparatorChar;
                SaveExtension       = Path.GetExtension(filePath);
                SaveId              = SaveDataManager.GetGameId(SaveType);
                SaveDataStartOffset = SaveDataManager.GetSaveDataOffset(SaveId.ToLower(), SaveExtension.Replace(".", "").ToLower());
                SaveInfo            = SaveDataManager.GetSaveInfo(SaveType);

                if (SaveType == SaveType.WildWorld || SaveGeneration == SaveGeneration.N3DS)
                {
                    IsBigEndian = false;
                }

                _saveReader.Close();
                _saveFile.Close();
                _saveReader.Dispose();
                _saveFile.Dispose();

                // Create a Backup
                if (Properties.Settings.Default.BackupFiles)
                {
                    _backup = new Backup(this);
                }
            }
            else
            {
                MessageBox.Show("File doesn't exist!");
            }
        }