From 83c3d93e505d72d537db25753e297fcbd7388105 Mon Sep 17 00:00:00 2001
From: Li
Date: Mon, 6 Mar 2023 12:38:01 +1300
Subject: [PATCH] Update XBOX supports
---
LibW4M/LibW4M.csproj | 9 ++
LibW4M/PS2/Ps2Save.cs | 6 +-
LibW4M/PS2/PsuFile.cs | 2 +-
LibW4M/W4SaveFile.cs | 42 +-----
LibW4M/XBOX/Resources/SaveImage.xbx | Bin 0 -> 2176 bytes
LibW4M/XBOX/Resources/SaveMeta.xbx | Bin 0 -> 44 bytes
LibW4M/XBOX/Resources/TitleImage.xbx | Bin 0 -> 2176 bytes
LibW4M/XBOX/Resources/TitleMeta.xbx | Bin 0 -> 54 bytes
LibW4M/XBOX/SaveResources.Designer.cs | 103 ++++++++++++++
LibW4M/XBOX/SaveResources.resx | 133 ++++++++++++++++++
LibW4M/XBOX/XboxSave.cs | 82 ++++++++---
W4Gui/DataManager.cs | 130 ++++++++++++++++-
W4Gui/Main.cs | 82 +++--------
.../PublishProfiles/FolderProfile.pubxml.user | 2 +-
W4Gui/SaveType.cs | 1 +
15 files changed, 460 insertions(+), 132 deletions(-)
create mode 100644 LibW4M/XBOX/Resources/SaveImage.xbx
create mode 100644 LibW4M/XBOX/Resources/SaveMeta.xbx
create mode 100644 LibW4M/XBOX/Resources/TitleImage.xbx
create mode 100644 LibW4M/XBOX/Resources/TitleMeta.xbx
create mode 100644 LibW4M/XBOX/SaveResources.Designer.cs
create mode 100644 LibW4M/XBOX/SaveResources.resx
diff --git a/LibW4M/LibW4M.csproj b/LibW4M/LibW4M.csproj
index 2f15f5a..80813e1 100644
--- a/LibW4M/LibW4M.csproj
+++ b/LibW4M/LibW4M.csproj
@@ -26,6 +26,11 @@
True
SaveResources.resx
+
+ True
+ True
+ SaveResources.resx
+
@@ -37,6 +42,10 @@
ResXFileCodeGenerator
SaveResources.Designer.cs
+
+ PublicResXFileCodeGenerator
+ SaveResources.Designer.cs
+
diff --git a/LibW4M/PS2/Ps2Save.cs b/LibW4M/PS2/Ps2Save.cs
index dae311a..8c6cafd 100644
--- a/LibW4M/PS2/Ps2Save.cs
+++ b/LibW4M/PS2/Ps2Save.cs
@@ -14,7 +14,7 @@ namespace LibW4M.PS2
{
private const int PS2_MAX_SZ = 0x20000;
- public static void CreateSaveFile(W4SaveFile save, Stream output)
+ private static void createPs2SaveXOM(W4SaveFile save, Stream output)
{
// Remove all stats ...
foreach (StatsContainerData stat in save.StatsCollective.ToArray())
@@ -55,7 +55,7 @@ namespace LibW4M.PS2
return new W4SaveFile(XomReader.ReadXomFile(PsuFile.ReadPSU(filename).GetFileByName("BESLES-53096W4MA").FileData));
}
- public static void CreatePSU(W4SaveFile save, Stream output)
+ public static void CreateSaveFile(W4SaveFile save, Stream output)
{
PsuFile psuFile = new PsuFile();
psuFile.InitalizePSU("BESLES-53096W4MA");
@@ -64,7 +64,7 @@ namespace LibW4M.PS2
using(MemoryStream ms = new MemoryStream())
{
- CreateSaveFile(save, ms);
+ createPs2SaveXOM(save, ms);
ms.Seek(0, SeekOrigin.Begin);
psuFile.CreateFile("BESLES-53096W4MA", ms.ToArray());
}
diff --git a/LibW4M/PS2/PsuFile.cs b/LibW4M/PS2/PsuFile.cs
index 13427df..8105590 100644
--- a/LibW4M/PS2/PsuFile.cs
+++ b/LibW4M/PS2/PsuFile.cs
@@ -99,7 +99,7 @@ namespace LibW4M.PS2
}
}
- throw new FileNotFoundException("Cannot find the file");
+ throw new FileNotFoundException("Cannot find any file named \""+filename+"\" in the PSU.");
}
public static PsuFile ReadPSU(string psuFilePath)
diff --git a/LibW4M/W4SaveFile.cs b/LibW4M/W4SaveFile.cs
index 1b3832c..c53b709 100644
--- a/LibW4M/W4SaveFile.cs
+++ b/LibW4M/W4SaveFile.cs
@@ -151,7 +151,7 @@ namespace LibW4M
foreach (UnlockableItemData unlockableItem in UnlockableItems)
unlockableItem.Save();
}
- public void SavePC(Stream pcSaveStream)
+ public void Save(Stream pcSaveStream)
{
saveData();
using (pcSaveStream)
@@ -166,46 +166,6 @@ namespace LibW4M
}
}
- public void SavePS2PSU(Stream ps2PsuSaveStream)
- {
- using (ps2PsuSaveStream)
- {
- Ps2Save.CreatePSU(this, ps2PsuSaveStream);
- }
- }
-
- public void SaveXBOX(Stream xboxSaveStream, XboxRegion region)
- {
- using (xboxSaveStream)
- {
- XboxSave.CreateSaveFile(this, xboxSaveStream, region);
- }
- }
-
- public void SavePS2(Stream ps2SaveStream)
- {
- using (ps2SaveStream)
- {
- Ps2Save.CreateSaveFile(this, ps2SaveStream);
- }
- }
-
- public void SaveXBOX(string newXom, XboxRegion region)
- {
- SaveXBOX(File.OpenWrite(newXom), region);
- }
- public void SavePS2(string newXom)
- {
- SavePS2(File.OpenWrite(newXom));
- }
- public void SavePS2PSU(string newXom)
- {
- SavePS2PSU(File.OpenWrite(newXom));
- }
- public void SavePC(string newXom)
- {
- SavePC(File.OpenWrite(newXom));
- }
public void ExtractAllContainers(string path)
{
diff --git a/LibW4M/XBOX/Resources/SaveImage.xbx b/LibW4M/XBOX/Resources/SaveImage.xbx
new file mode 100644
index 0000000000000000000000000000000000000000..df36b578d04db0376a78475e6b9b1c6c167d3e25
GIT binary patch
literal 2176
zcmbVNZ)_9i9sb=pE@xX-U<_@6FXu2*9QS%^J2PdP#U%^YlyqBk@Zu0c>=4ni03s!1
z942!v{}z&ztx}U|NTKzTcy%r~Mw9%ZVJ0q4S=WuIntDLjmK=}{ClYZ~db5`h-`>l{
zK1}@q4I2SCjQackJ~UoffZvLmeJ}jaJut_AKQ;un7YRF|PEQm&$zB4f6J!+`Ay8JL*0Eip=_earBuwLvLaUvW
zAk@~MC+5MIPm3O+3w*)F$UKyR&$p63jO&;S=F{u^tJ>!T3Svm
zku=D02^wyuO=#TE53LS8^$=FSwGv0#q4D6XRi^4ntEQ;4@;qard~z
za>HYiw}gAL8doWircZu%tARJ}k&1I#M`M1?Y(M(&{ceQ}?o+hhs#62Z?)$T|+qRTM
z;FX7w7i)eh^ryn?W?c6`C`!KGQze9y%iNpwO|sBa)CiHw-39vj`GP`j6zi?e=W;W+
zFX1T5p2vNTV|?z~4Z_M;`%tE_W1Wdv(O_1yom0h_k!4GRW5M{7o(rF+;8lK?BBo2>*u+W
zUJf0mjD*F>M%Q&m8FqnqhDcz3>$RO*&z>-bzq&iZU%&PIv7t;uW2}iITo3(x>cZK;
z_BOhF;L~lZ@w;%)TmO-7!%#;l9hx@2cj+E)?(2)vJ+N0yCb?v{!W-=_nLe)Ydk>sF
z5o$aFUtVdhStL9}K*%Yhl!vgej;P*`gqzuIAw5KtWt`!<6QpZMmM3RZwx<5V+p~%H
z_)i7F>v>(_n-OyL4J&*+?5!JXQTSVRXz0UXu6)Cz)j7H+S;n%vvpT=Oxdw3u6&|%7
z+QOYy_#-D;>h6~pL(ONygH_~tA`lRSSBVq^+H!&iqub6f`n`5DcBas9oMbRQHq1ak
zBuQ@LuL>e&6*d2mE{d&r1+mfZh)4@R2@gU!t08o_Q7nx#-H!Q>B}>Cm$t<=cZIUF_
z!09CKR^>INmZm`TS6?>MuFhc`=5@1%moYyR{dz&Q
z0V7jnL<}W2%&$K2_iKV*{l8eucLiJx>
z8X<=79T=a8NZ&tK4mEH5`c5_8cVRi5ds*i{`XBz_4%~lC<2K{|vkt~xXs99?cRc>s
zP-tM8XyQ)6V}p}r62CX*3NXZ=43lvEkuVZYN7Q}Oyg*=D
z*B$N0o6)0=2Y>kO54LK~E@XPAqGST{=ubE1H`S)a&Z?ngDe`Je2QQYYzLk%!+~pkV
z+Q0-ikSvExdv;*fztM-Lcfa<%S0FkO3C)rVgp$hzbe%aNP_OG2gtlM`&z}?PI-9W*
zNVb|TW_NCl_b1`wztNR~HYJYmHXzgcZsjrn?a0MC=jif=Q|UVw5?nd+C?<^$+bRdK
zr;U#lJCYp7^}Q6LO5%sQ{(RG4#1{7Td@$BjTvz`gx#^M#`<1sjg3mpj3)GiUUqB)e
zb#`JuViR$BO1n;(Oh#GAHdHFr)wScp;tOCfoV)neC}h>F{oQQyW~0#pLS|2kNPYX3
zqx&~Nee1N;H#~wJ93jV`4U##erl{8p`}gPaf7MQIHxVYQkbO{#Q;oZ*b@Bd1RXxgM
z|M4EG(Q_dhby{@)oz^r>uVcUxjgy;fVDMgz?J;40LM%Cz^=vX)t=4~NQ(4y#3SP|a
zIkx|K03mz+*vX_nIKOd;l)ay|E#XA4MDmBCq?r^WL9cxG0~3P~+LiG`63@x@V>amb
zA!H~bAT4Lx^*mb6<+FPJOfF4L0?wbnq9p0Q=wuVBk!S$3Gq!dhGY?j~jNZ+X_}-D~
z^83kerk_0V_Kne$D6V+TcwaH(MP_mYU$^MQ0``~Cq7Oyz{faE+eRk~Yp~aw2_x;G1
z`F1^jazX9P)BIV-Oh#MBt4kR@7n*P#U3wkUs;v97xg?&==rhNvlM-qUCumNHv
u$wQ2RwSP&|eT)v)*w{?MnLPkX0)~4%N
zgDz2i|I;o=H4AZMcAEuZMOaPA)Ia2h1IBGgsVr{dq}#69uDjaa_4U2gh6p0+n_RxR
z_uBXKeeU_*vwpoH-w6Piy8r+^R`L43DL_?D+A%<$MpEX#RVv-J|%vyJnma(zFmAt9}B)zQ}+abH?;;pz)pEf!1pqO%)I
zckkY=nCaTMiFWrKFj;5JH0mrcS(j8o^o69siPeU*uTB40hEPc6AD4$qj1UIQ>To3P
z{;q*KbqD+4ALSqI)y+TiI>S#_sALkEm%BDftEG}4st9!B(0Dn8xx5VkGjsU;?mSQs
z6m)n10e@75q_v-Zk97l62
zbgDe;E3@zAjvionp68tB>LRE>A`cIKkR#2>QH;pLRrR(iHC8tPp{PpSIQO>0d|&as
z=OG!G&4tJhp_ND;#>vJ@^zC-jDld06ERo8VWjR5#Xacw{>b;0zb8>TYgJ>-W^1+7W
z%uREGPop(0oKrxZ2h?F@Q%-IVe5LQ)XZ!MG?Xs}s;{vz)LdMTfm7ixze;z?d%qbEC
zZkFF4Ix_DvP8{K;-xFTFu#y{E&Bk-X1-|aDyxfXWAo1Idb62AJSOR^`#aM+(LkH1<
z_{ExXV>hpCG8xN^_7-J}5E9~RT9i$8yWQdM<(wK^?~dE8bp=%rZs|2z$7o0|u?`yS
z4yRq@3&Mmj%Ri!H;_C=4;+nZHBZ^+pM`>i5#;*+?|J6SVEm4^gbw?3`dl+63#=UcY
za`(_>geInxP3P(gJN?3HT)!_Q(8{JEr>pILQtZcA!ci^eB9=%xa6YZEnBBglGGIuI
zB^`g^>q6+%D51qT)qxa2s#QIngVWQr$y8nGMborm&K#B4hfA|L_$r
zmCocZgeRC}^MKJ*ZBp}#%r`4598(iTVf8OP^fA<4lUGO^8#%HBfKE*iCGG*W6a>-v
z_8RQN%-Cw7v8=MS)@TJjh8ET3OFk^e`)~KxX7is_
zf|QS#n~&(^;e}l>7m#emc@^J(jNe{fzV%W;621A(oaH_r&fy>c5}dzhIRNtY$Ivrf
zmABF;#ui&4tSk|ECnixVq*9OaUWj&Y<$yj
zEK$U;gJx`dSe$>pBq|fq(GXr2uAY!|cGC=hXhbRnDu%xr1$q}?_}wE4DZrZX!|-gQ9rvf6Vp#BfM9`3@
z?}!8VaomUZGjky`pO*HA5V1-z;Hoj(PV+naAPVUie*AW>
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace LibW4M.XBOX {
+ using System;
+
+
+ ///
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ ///
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ public class SaveResources {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal SaveResources() {
+ }
+
+ ///
+ /// Returns the cached ResourceManager instance used by this class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ public static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("LibW4M.XBOX.SaveResources", typeof(SaveResources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ public static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Byte[].
+ ///
+ public static byte[] SaveImage {
+ get {
+ object obj = ResourceManager.GetObject("SaveImage", resourceCulture);
+ return ((byte[])(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Byte[].
+ ///
+ public static byte[] SaveMeta {
+ get {
+ object obj = ResourceManager.GetObject("SaveMeta", resourceCulture);
+ return ((byte[])(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Byte[].
+ ///
+ public static byte[] TitleImage {
+ get {
+ object obj = ResourceManager.GetObject("TitleImage", resourceCulture);
+ return ((byte[])(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Byte[].
+ ///
+ public static byte[] TitleMeta {
+ get {
+ object obj = ResourceManager.GetObject("TitleMeta", resourceCulture);
+ return ((byte[])(obj));
+ }
+ }
+ }
+}
diff --git a/LibW4M/XBOX/SaveResources.resx b/LibW4M/XBOX/SaveResources.resx
new file mode 100644
index 0000000..cd02e20
--- /dev/null
+++ b/LibW4M/XBOX/SaveResources.resx
@@ -0,0 +1,133 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+ Resources\SaveImage.xbx;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Resources\SaveMeta.xbx;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Resources\TitleImage.xbx;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Resources\TitleMeta.xbx;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/LibW4M/XBOX/XboxSave.cs b/LibW4M/XBOX/XboxSave.cs
index 239037e..af17bde 100644
--- a/LibW4M/XBOX/XboxSave.cs
+++ b/LibW4M/XBOX/XboxSave.cs
@@ -4,7 +4,10 @@ using LibXom;
using LibXom.Streams;
using System;
using System.Collections.Generic;
+using System.IO;
+using System.IO.Compression;
using System.Linq;
+using System.Security.AccessControl;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
@@ -27,6 +30,8 @@ namespace LibW4M.XBOX
}
}
+
+
public static void CreateSaveFile(W4SaveFile save, Stream output, XboxRegion region)
{
using(MemoryStream ms = new MemoryStream())
@@ -48,6 +53,33 @@ namespace LibW4M.XBOX
}
}
+
+ public static void CreateSaveZipFile(W4SaveFile save, Stream outStream, XboxRegion region)
+ {
+ using(MemoryStream ms = new MemoryStream())
+ {
+ using(ZipArchive zip = new ZipArchive(ms, ZipArchiveMode.Create, true))
+ {
+ string titleId = (region == XboxRegion.USA) ? "4d4a0017" : "434d0052";
+ string userId = (region == XboxRegion.USA) ? "474BBB580245" : "474BBB580245";
+
+ zip.CreateEntry(titleId + "/", CompressionLevel.SmallestSize);
+ zip.CreateEntry(titleId + "/" + userId + "/", CompressionLevel.SmallestSize);
+
+ using (Stream stream = zip.CreateEntry(titleId + "/SaveImage.xbx", CompressionLevel.SmallestSize).Open()) { stream.Write(SaveResources.SaveImage, 0, SaveResources.SaveImage.Length); }
+ using (Stream stream = zip.CreateEntry(titleId + "/TitleImage.xbx", CompressionLevel.SmallestSize).Open()) { stream.Write(SaveResources.TitleImage, 0, SaveResources.TitleImage.Length); }
+ using (Stream stream = zip.CreateEntry(titleId + "/TitleMeta.xbx", CompressionLevel.SmallestSize).Open()) { stream.Write(SaveResources.TitleMeta, 0, SaveResources.TitleMeta.Length); }
+
+
+ using (Stream stream = zip.CreateEntry(titleId + "/" + userId + "/SaveMeta.xbx", CompressionLevel.SmallestSize).Open()) { stream.Write(SaveResources.SaveMeta, 0, SaveResources.SaveMeta.Length); }
+ using (Stream stream = zip.CreateEntry(titleId + "/" + userId + "/data", CompressionLevel.SmallestSize).Open()) { CreateSaveFile(save, stream, region); }
+
+ }
+ ms.Seek(0, SeekOrigin.Begin);
+ ms.CopyTo(outStream);
+ }
+ }
+
private static byte[] xor(byte[] data, byte key)
{
byte[] outdata = new byte[data.Length];
@@ -97,31 +129,45 @@ namespace LibW4M.XBOX
return ms;
}
- public static XboxRegion DetermineRegion(Stream stream)
+ public static W4SaveFile ReadXboxSave(string filename, ref XboxRegion outRegion)
{
- byte[] expectedSignature = new byte[SHA1_SIZE];
- stream.Read(expectedSignature, 0, SHA1_SIZE);
+ using (FileStream fs = File.OpenRead(filename))
+ {
+ using (ZipArchive zip = new ZipArchive(fs, ZipArchiveMode.Read, true))
+ {
+ ZipArchiveEntry? usaDataEntry = zip.GetEntry("4d4a0017/474BBB580245/data");
+ if (usaDataEntry is not null)
+ {
+ outRegion = XboxRegion.USA;
+ return XboxSave.readXboxMainSave(usaDataEntry.Open());
+ }
- byte[] saveData = new byte[XBOX_MAX_SZ];
- stream.Read(saveData, 0, XBOX_MAX_SZ);
-
- stream.Seek(0, SeekOrigin.Begin);
-
- byte[] usaSig = calcSignature(saveData, XboxRegion.USA);
- byte[] eurSig = calcSignature(saveData, XboxRegion.EU);
-
- if (expectedSignature.SequenceEqual(usaSig)) return XboxRegion.USA;
- else if (expectedSignature.SequenceEqual(eurSig)) return XboxRegion.EU;
- else return XboxRegion.UNKNOWN;
-
+ ZipArchiveEntry? eurDataEntry = zip.GetEntry("434d0052/474BBB580245/data");
+ if (eurDataEntry is not null)
+ {
+ outRegion = XboxRegion.EU;
+ return XboxSave.readXboxMainSave(eurDataEntry.Open());
+ }
+ }
+ }
+ throw new FileNotFoundException("Could not find '4d4a0017/474BBB580245/data' or '434d0052/474BBB580245/data' inside the zip?\nis it not an Worms 4 Mayhem XBOX save file?");
}
- public static W4SaveFile ReadXboxSave(Stream stream)
+ private static W4SaveFile readXboxMainSave(Stream stream)
{
- using (MemoryStream ms = readSaveData(stream))
+ using (stream)
{
- return new W4SaveFile(XomReader.ReadXomFile(ms));
+ using(MemoryStream streamCopy = new MemoryStream())
+ {
+ stream.CopyTo(streamCopy);
+ streamCopy.Seek(0, SeekOrigin.Begin);
+ using (MemoryStream xomStream = readSaveData(streamCopy))
+ {
+ return new W4SaveFile(XomReader.ReadXomFile(xomStream));
+ }
+ }
}
+
}
public static void CalcAndWriteSignature(Stream s, XboxRegion region)
diff --git a/W4Gui/DataManager.cs b/W4Gui/DataManager.cs
index 54486e7..18c4896 100644
--- a/W4Gui/DataManager.cs
+++ b/W4Gui/DataManager.cs
@@ -1,7 +1,11 @@
using LibW4M;
+using LibW4M.PS2;
using LibW4M.XBOX;
+using LibXom;
using System;
+using System.CodeDom;
using System.Collections.Generic;
+using System.IO.Compression;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
@@ -16,7 +20,7 @@ namespace W4Gui
public static bool SaveLoaded = false;
public static W4SaveFile SaveFile;
- public static void SaveAll()
+ public static void CommitData()
{
foreach(TabEntry control in SaveComponents)
{
@@ -28,7 +32,7 @@ namespace W4Gui
}
}
- public static void LoadAll()
+ public static void ParseData()
{
foreach (TabEntry control in SaveComponents)
{
@@ -40,6 +44,128 @@ namespace W4Gui
}
}
+
+ public static void SavePS2(Stream ps2PsuSaveStream)
+ {
+ using (ps2PsuSaveStream)
+ {
+ Ps2Save.CreateSaveFile(DataManager.SaveFile, ps2PsuSaveStream);
+ }
+ }
+
+ public static void SaveXBOX(Stream xboxSaveStream, XboxRegion region)
+ {
+ using (xboxSaveStream)
+ {
+ XboxSave.CreateSaveZipFile(DataManager.SaveFile, xboxSaveStream, region);
+ }
+ }
+
+ public static void SavePC(string newXom)
+ {
+ SaveFile.Save(File.OpenWrite(newXom));
+ }
+
+ public static void SaveXBOX(string newXom, XboxRegion region)
+ {
+ SaveXBOX(File.OpenWrite(newXom), region);
+ }
+ public static void SavePS2(string newXom)
+ {
+ SavePS2(File.OpenWrite(newXom));
+ }
+
+
+ public static void LoadPC(string filename)
+ {
+ SaveFile = new W4SaveFile(XomReader.ReadXomFile(filename));
+ }
+
+ public static void LoadPS2(string filename)
+ {
+ SaveFile = Ps2Save.ReadPS2Save(filename);
+ }
+ public static SaveType LoadXBOX(string filename)
+ {
+ XboxRegion region = XboxRegion.UNKNOWN;
+ SaveFile = XboxSave.ReadXboxSave(filename, ref region);
+ if (region == XboxRegion.USA) return SaveType.XBOX_US;
+ if (region == XboxRegion.EU) return SaveType.XBOX_EU;
+ return SaveType.UNKNOWN;
+ }
+
+ public static SaveType LoadGuessType(string filename)
+ {
+ switch (Path.GetExtension(filename))
+ {
+ case ".xom":
+ LoadPC(filename);
+ return SaveType.PC;
+ case ".psu":
+ LoadPS2(filename);
+ return SaveType.PS2;
+ case ".zip":
+ return LoadXBOX(filename);
+ }
+
+
+ return SaveType.UNKNOWN;
+ }
+
+ public static void Load(string filename, SaveType saveType)
+ {
+
+ switch (saveType)
+ {
+ case SaveType.PC:
+ LoadPC(filename);
+ break;
+ case SaveType.PS2:
+ LoadPS2(filename);
+ break;
+ case SaveType.XBOX_US:
+ case SaveType.XBOX_EU:
+ saveType = LoadXBOX(filename);
+ break;
+ case SaveType.UNKNOWN:
+ default:
+ saveType = LoadGuessType(filename);
+ break;
+ }
+
+ if(saveType != SaveType.UNKNOWN)
+ {
+ DataManager.LoadedSavePath = filename;
+ DataManager.LoadedSaveType = saveType;
+ }
+ else {
+ throw new Exception("unable to determine save type.");
+ }
+
+ }
+
+ public static void Save(string filename, SaveType saveType)
+ {
+ switch (saveType)
+ {
+ case SaveType.PC:
+ DataManager.SavePC(filename);
+ break;
+ case SaveType.PS2:
+ DataManager.SavePS2(filename);
+ break;
+ case SaveType.XBOX_US:
+ DataManager.SaveXBOX(filename, XboxRegion.USA);
+ break;
+ case SaveType.XBOX_EU:
+ DataManager.SaveXBOX(filename, XboxRegion.EU);
+ break;
+ }
+
+ DataManager.LoadedSavePath = filename;
+ DataManager.LoadedSaveType = saveType;
+ }
+
public static List SaveComponents = new List();
}
}
diff --git a/W4Gui/Main.cs b/W4Gui/Main.cs
index 0d50875..5fd6aa3 100644
--- a/W4Gui/Main.cs
+++ b/W4Gui/Main.cs
@@ -10,6 +10,7 @@ using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
+using System.Security.AccessControl;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
@@ -40,37 +41,12 @@ namespace W4Gui
{
#endif
OpenFileDialog fd = new OpenFileDialog();
- fd.Filter = "Worms 4: Mayhem PC Save File|*.xom|Worms 4: Mayhem PS2 Save File|*.psu|Worms 4: Mayhem XBOX Save File|data";
+ fd.Filter = "Worms 4: Mayhem Save Files|*.xom;*.psu;*.zip|Worms 4: Mayhem PC Save File|*.xom|Worms 4: Mayhem PS2 Save File|*.psu|Worms 4: Mayhem XBOX Save File|*.zip";
fd.Title = "Open Worms 4 Save File";
if (fd.ShowDialog() == DialogResult.OK)
{
- DataManager.LoadedSavePath = fd.FileName;
- DataManager.LoadedSaveType = (SaveType)(fd.FilterIndex);
-
- switch (DataManager.LoadedSaveType)
- {
- case SaveType.PC:
- default:
- DataManager.SaveFile = new W4SaveFile(XomReader.ReadXomFile(fd.FileName));
- break;
- case SaveType.PS2:
- DataManager.SaveFile = Ps2Save.ReadPS2Save(fd.FileName);
- break;
- case SaveType.XBOX_US:
- case SaveType.XBOX_EU:
- using(FileStream fs = File.OpenRead(fd.FileName))
- {
- XboxRegion region = XboxSave.DetermineRegion(fs);
-
- if (region == XboxRegion.USA) DataManager.LoadedSaveType = SaveType.XBOX_US;
- if (region == XboxRegion.EU) DataManager.LoadedSaveType = SaveType.XBOX_EU;
-
- DataManager.SaveFile = XboxSave.ReadXboxSave(fs);
- }
- break;
-
- }
-
+
+ DataManager.Load(fd.FileName, (SaveType)(fd.FilterIndex-1));
this.mainTabControl.Enabled = true;
this.saveToolStripMenuItem.Enabled = true;
@@ -78,7 +54,7 @@ namespace W4Gui
this.Text = defaultTitle + " (" + DataManager.LoadedSaveType.ToString() + ") " + "[" + fd.FileName + "]";
- DataManager.LoadAll();
+ DataManager.ParseData();
}
#if !DEBUG
}
@@ -96,22 +72,10 @@ namespace W4Gui
{
#endif
mainTabControl.Enabled = false;
- DataManager.SaveAll();
- switch (DataManager.LoadedSaveType)
- {
- case SaveType.PC:
- DataManager.SaveFile.SavePC(DataManager.LoadedSavePath);
- break;
- case SaveType.PS2:
- DataManager.SaveFile.SavePS2PSU(DataManager.LoadedSavePath);
- break;
- case SaveType.XBOX_US:
- DataManager.SaveFile.SaveXBOX(DataManager.LoadedSavePath, XboxRegion.USA);
- break;
- case SaveType.XBOX_EU:
- DataManager.SaveFile.SaveXBOX(DataManager.LoadedSavePath, XboxRegion.EU);
- break;
- }
+ DataManager.CommitData();
+
+ DataManager.Save(DataManager.LoadedSavePath, DataManager.LoadedSaveType);
+
mainTabControl.Enabled = true;
MessageBox.Show("File saved to: " + DataManager.LoadedSavePath, "Save Complete!", MessageBoxButtons.OK, MessageBoxIcon.Information);
#if !DEBUG
@@ -164,37 +128,23 @@ namespace W4Gui
{
#endif
SaveFileDialog fd = new SaveFileDialog();
- fd.Filter = "Worms 4: Mayhem PC Save File|*.xom|Worms 4: Mayhem PS2 Single Save File|*.psu|Worms 4: Mayhem XBOX United States Save File|data|Worms 4: Mayhem XBOX Europe/Austrailia Save File|data";
+ fd.Filter = "Worms 4: Mayhem PC Save File|*.xom|Worms 4: Mayhem PS2 Save File|*.psu|Worms 4: Mayhem XBOX \"NTSC\" (United States) Save File|*.zip|Worms 4: Mayhem XBOX \"PAL\" (Europe & Austrailia) Save File|*.zip";
fd.Title = "Save Worms 4 Save File";
+ fd.FilterIndex = (int)DataManager.LoadedSaveType;
fd.FileName = Path.GetFileName(DataManager.LoadedSavePath);
if (fd.ShowDialog() == DialogResult.OK)
{
this.mainTabControl.Enabled = false;
- DataManager.SaveAll();
+ DataManager.CommitData();
+
SaveType saveType = (SaveType)(fd.FilterIndex);
+ DataManager.Save(fd.FileName, saveType);
- switch (saveType)
- {
- case SaveType.PC:
- DataManager.SaveFile.SavePC(fd.FileName);
- break;
- case SaveType.PS2:
- DataManager.SaveFile.SavePS2PSU(fd.FileName);
- break;
- case SaveType.XBOX_US:
- DataManager.SaveFile.SaveXBOX(fd.FileName, XboxRegion.USA);
- break;
- case SaveType.XBOX_EU:
- DataManager.SaveFile.SaveXBOX(fd.FileName, XboxRegion.EU);
- break;
- }
-
- DataManager.LoadedSavePath = fd.FileName;
- DataManager.LoadedSaveType = saveType;
+ this.Text = defaultTitle + " (" + DataManager.LoadedSaveType.ToString() + ") " + "[" + fd.FileName + "]";
MessageBox.Show("File saved to: " + fd.FileName, "Save Complete!", MessageBoxButtons.OK, MessageBoxIcon.Information);
- this.mainTabControl.Enabled = true;
+
}
#if !DEBUG
}
diff --git a/W4Gui/Properties/PublishProfiles/FolderProfile.pubxml.user b/W4Gui/Properties/PublishProfiles/FolderProfile.pubxml.user
index 6801b15..ebe2111 100644
--- a/W4Gui/Properties/PublishProfiles/FolderProfile.pubxml.user
+++ b/W4Gui/Properties/PublishProfiles/FolderProfile.pubxml.user
@@ -4,7 +4,7 @@ https://go.microsoft.com/fwlink/?LinkID=208121.
-->
- True|2023-03-04T17:13:14.7341877Z;True|2023-03-05T05:34:42.0662279+13:00;True|2023-03-05T05:20:37.5344385+13:00;False|2023-03-05T05:11:04.5753179+13:00;True|2023-03-04T13:33:03.9184567+13:00;True|2023-03-04T05:17:31.1862857+13:00;True|2023-03-04T04:40:06.7859106+13:00;True|2023-03-01T11:45:37.3479871+13:00;True|2023-03-01T09:19:31.4651141+13:00;True|2023-02-25T21:53:35.8769435+13:00;True|2023-02-20T23:18:32.2496478+13:00;True|2023-02-19T06:40:54.2502643+13:00;False|2023-02-16T17:57:46.9563146+13:00;True|2023-01-19T20:41:26.7371208+13:00;True|2023-01-15T17:06:35.5919106+13:00;True|2023-01-14T13:57:56.0824690+13:00;True|2023-01-11T22:22:28.8737310+13:00;True|2023-01-11T22:16:55.3469226+13:00;
+ True|2023-03-05T00:20:07.6932195Z;True|2023-03-05T13:09:52.8373633+13:00;True|2023-03-05T06:13:14.7341877+13:00;True|2023-03-05T05:34:42.0662279+13:00;True|2023-03-05T05:20:37.5344385+13:00;False|2023-03-05T05:11:04.5753179+13:00;True|2023-03-04T13:33:03.9184567+13:00;True|2023-03-04T05:17:31.1862857+13:00;True|2023-03-04T04:40:06.7859106+13:00;True|2023-03-01T11:45:37.3479871+13:00;True|2023-03-01T09:19:31.4651141+13:00;True|2023-02-25T21:53:35.8769435+13:00;True|2023-02-20T23:18:32.2496478+13:00;True|2023-02-19T06:40:54.2502643+13:00;False|2023-02-16T17:57:46.9563146+13:00;True|2023-01-19T20:41:26.7371208+13:00;True|2023-01-15T17:06:35.5919106+13:00;True|2023-01-14T13:57:56.0824690+13:00;True|2023-01-11T22:22:28.8737310+13:00;True|2023-01-11T22:16:55.3469226+13:00;
\ No newline at end of file
diff --git a/W4Gui/SaveType.cs b/W4Gui/SaveType.cs
index 4239e1a..f3c4347 100644
--- a/W4Gui/SaveType.cs
+++ b/W4Gui/SaveType.cs
@@ -8,6 +8,7 @@ namespace W4Gui
{
public enum SaveType : int
{
+ UNKNOWN = 0,
PC = 1,
PS2 = 2,
XBOX_US = 3,