using LibXom.Data; using LibXom.Streams; using LibXom; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using LibW4M.Data.Stats; namespace LibW4M.PS2 { public static class Ps2Save { private const int PS2_MAX_SZ = 0x20000; private static void createPs2SaveXOM(W4SaveFile save, Stream output) { // Remove all stats ... foreach (StatsContainerData stat in save.StatsCollective.ToArray()) save.StatsCollective.Delete(stat); // Save changes save.saveData(); XomWriter.WriteXom(save.OriginalXom,output); Ps2Save.CalcAndWriteChecksum(output); } public static void CalcAndWriteChecksum(Stream s) { XomStreamReader reader = new XomStreamReader(s); XomStreamWriter writer = new XomStreamWriter(s); // Set size to ps2 save size. s.SetLength(PS2_MAX_SZ); s.Seek(0, SeekOrigin.Begin); // Calculate checksum Int64 chk = 0; for (int i = 0; i < (PS2_MAX_SZ - 4); i += 4) { int c = reader.ReadInt32(); chk = (chk + c) & UInt32.MaxValue; } writer.WriteUInt32(Convert.ToUInt32(chk)); s.Seek(0, SeekOrigin.Begin); } public static W4SaveFile ReadPS2Save(string filename) { return new W4SaveFile(XomReader.ReadXomFile(PsuFile.ReadPSU(filename).GetFileByName("BESLES-53096W4MA").FileData)); } public static void CreateSaveFile(W4SaveFile save, Stream output) { PsuFile psuFile = new PsuFile(); psuFile.InitalizePSU("BESLES-53096W4MA"); psuFile.CreateFile("Icon1.ico", SaveResources.IconFile); psuFile.CreateFile("icon.sys", SaveResources.IconSys); using(MemoryStream ms = new MemoryStream()) { createPs2SaveXOM(save, ms); ms.Seek(0, SeekOrigin.Begin); psuFile.CreateFile("BESLES-53096W4MA", ms.ToArray()); } psuFile.WritePSU(output); } } }