Worms4Editor/LibW4M/PS2/Ps2Save.cs

78 lines
2.2 KiB
C#

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);
}
}
}