/// <summary> /// Converts to the format /// </summary> /// <returns>The task</returns> public override async Task ConvertToAsync() { var settings = Ray1Settings.GetDefaultSettings(Ray1Game.Rayman1, Platform.PC); await ConvertToAsync(settings, (filePath, format) => { // Read the data return(DeserializeJSON <Rayman1PCSaveData>(filePath)); }, new FileFilterItem("*.json", "JSON").ToString(), new FileExtension(".SAV"), null, new Rayman12PCSaveDataEncoder()); }
/// <summary> /// Converts to the format /// </summary> /// <returns>The task</returns> public override async Task ConvertToAsync() { var attr = GameModeSelection.SelectedValue.GetAttribute <Ray1GameModeInfoAttribute>(); var settings = Ray1Settings.GetDefaultSettings(attr.Game, attr.Platform); await ConvertToAsync(settings, (filePath, format) => { // Read the data return(DeserializeJSON <Rayman1PCConfigData>(filePath)); }, new FileFilterItem("*.json", "JSON").ToString(), new FileExtension(".cfg")); }
/// <summary> /// Default constructor /// </summary> /// <param name="settings">The game settings</param> public Ray1PCArchiveDataManager(Ray1Settings settings) { Settings = settings; Context = new RCPContext(String.Empty, new RCPSerializerSettings() { DefaultEndianness = Endian.Little }); Context.AddSettings(settings); Config = new Ray1PCArchiveConfigViewModel(settings); }
/// <summary> /// Converts from the format /// </summary> /// <returns>The task</returns> public override async Task ConvertFromAsync() { var settings = Ray1Settings.GetDefaultSettings(Ray1Game.Rayman1, Platform.PC); await ConvertFromAsync <Rayman1PCSaveData>(settings, (data, filePath) => { // Save the data SerializeJSON(data, filePath); }, new FileFilterItem("*.SAV", "SAV").ToString(), new[] { ".json" }, Games.Rayman1.GetInstallDir(false), new Rayman12PCSaveDataEncoder()); }
/// <summary> /// Converts from the format /// </summary> /// <returns>The task</returns> public override async Task ConvertFromAsync() { var attr = GameModeSelection.SelectedValue.GetAttribute <Ray1GameModeInfoAttribute>(); var settings = Ray1Settings.GetDefaultSettings(attr.Game, attr.Platform); await ConvertFromAsync <Rayman1PCConfigData>(settings, (data, filePath) => { // Save the data SerializeJSON(data, filePath); }, new FileFilterItem("*.cfg", "CFG").ToString(), new[] { ".json" }, GameModeSelection.SelectedValue.GetGame()?.GetInstallDir(false)); }
/// <summary> /// Default constructor /// </summary> /// <param name="settings">The settings when serializing the data</param> public Ray1PCArchiveConfigViewModel(Ray1Settings settings) { switch (settings.EngineVersion) { case Ray1EngineVersion.PC_Edu: PrimaryVersion = "EDU"; SecondaryVersion = "EDU"; break; case Ray1EngineVersion.PC_Kit: case Ray1EngineVersion.PC_Fan: PrimaryVersion = "KIT"; SecondaryVersion = "KIT"; break; default: throw new ArgumentOutOfRangeException(); } }
/// <summary> /// Imports an exported save slot to the save slot from the specified path /// </summary> /// <param name="inputFilePath">The input file path</param> /// <returns>The task</returns> protected override Task ImportSaveDataAsync(FileSystemPath inputFilePath) { // Deserialize the input data var data = JsonHelpers.DeserializeFromFile <Rayman1PCSaveData>(inputFilePath); // Create streams using var decodedDataStream = new MemoryStream(); using var saveFileStream = File.Create(SaveSlotFilePath); // Import the data BinarySerializableHelpers.WriteToStream(data, decodedDataStream, Ray1Settings.GetDefaultSettings(Ray1Game.Rayman1, Platform.PC), RCPServices.App.GetBinarySerializerLogger()); // Set position to 0 decodedDataStream.Position = 0; // Encode the data to the file new Rayman12PCSaveDataEncoder().Encode(decodedDataStream, saveFileStream); return(Task.CompletedTask); }
/// <summary> /// Exports the save slot from the specified path /// </summary> /// <param name="outputFilePath">The output file path</param> /// <returns>The task</returns> protected override Task ExportSaveDataAsync(FileSystemPath outputFilePath) { // Create streams using var saveFileStream = File.OpenRead(SaveSlotFilePath); using var decodedDataStream = new MemoryStream(); // Decode the save file new Rayman12PCSaveDataEncoder().Decode(saveFileStream, decodedDataStream); // Set position to 0 decodedDataStream.Position = 0; // Get the serialized data var data = BinarySerializableHelpers.ReadFromStream <Rayman1PCSaveData>(decodedDataStream, Ray1Settings.GetDefaultSettings(Ray1Game.Rayman1, Platform.PC), RCPServices.App.GetBinarySerializerLogger()); // Export the data JsonHelpers.SerializeToFile(data, outputFilePath); return(Task.CompletedTask); }
/// <summary> /// Get the progression slot view model for the save data from the specified file /// </summary> /// <param name="filePath">The slot file path</param> /// <returns>The progression slot view model</returns> protected ProgressionSlotViewModel GetProgressionSlotViewModel(FileSystemPath filePath) { RL.Logger?.LogInformationSource($"Rayman 1 slot {filePath.Name} is being loaded..."); // Make sure the file exists if (!filePath.FileExists) { RL.Logger?.LogInformationSource($"Slot was not loaded due to not being found"); return(null); } // Open the file in a stream using var fileStream = File.Open(filePath, FileMode.Open, FileAccess.Read); // Create a memory stream using var memStream = new MemoryStream(); // Decode the data new Rayman12PCSaveDataEncoder().Decode(fileStream, memStream); // Set the position memStream.Position = 0; // Deserialize and return the data var saveData = BinarySerializableHelpers.ReadFromStream <Rayman1PCSaveData>(memStream, Ray1Settings.GetDefaultSettings(Ray1Game.Rayman1, Platform.PC), RCPServices.App.GetBinarySerializerLogger()); RL.Logger?.LogInformationSource($"Slot has been deserialized"); // Get total amount of cages var cages = saveData.Wi_Save_Zone.Sum(x => x.Cages); // Create the collection with items for cages + lives var progressItems = new ProgressionInfoItemViewModel[] { new ProgressionInfoItemViewModel(ProgressionIcons.R1_Cage, new LocalizedString(() => $"{cages}/102")), new ProgressionInfoItemViewModel(ProgressionIcons.R1_Continue, new LocalizedString(() => $"{saveData.ContinuesCount}")), new ProgressionInfoItemViewModel(ProgressionIcons.R1_Life, new LocalizedString(() => $"{saveData.StatusBar.LivesCount}")), }; RL.Logger?.LogInformationSource($"General progress info has been set"); // Calculate the percentage var percentage = ((cages / 102d * 100)).ToString("0.##"); RL.Logger?.LogInformationSource($"Slot percentage is {percentage}%"); // Return the data with the collection return(new Rayman1ProgressionSlotViewModel(new LocalizedString(() => $"{saveData.SaveName.ToUpper()} ({percentage}%)"), progressItems, filePath, this)); }