Update XBOX supports

This commit is contained in:
Li 2023-03-06 12:38:01 +13:00
parent 1ba9d45b19
commit 83c3d93e50
15 changed files with 460 additions and 132 deletions

View File

@ -26,6 +26,11 @@
<AutoGen>True</AutoGen>
<DependentUpon>SaveResources.resx</DependentUpon>
</Compile>
<Compile Update="XBOX\SaveResources.Designer.cs">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>SaveResources.resx</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
@ -37,6 +42,10 @@
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>SaveResources.Designer.cs</LastGenOutput>
</EmbeddedResource>
<EmbeddedResource Update="XBOX\SaveResources.resx">
<Generator>PublicResXFileCodeGenerator</Generator>
<LastGenOutput>SaveResources.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
</Project>

View File

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

View File

@ -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)

View File

@ -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)
{

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

103
LibW4M/XBOX/SaveResources.Designer.cs generated Normal file
View File

@ -0,0 +1,103 @@
//------------------------------------------------------------------------------
// <auto-generated>
// 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.
// </auto-generated>
//------------------------------------------------------------------------------
namespace LibW4M.XBOX {
using System;
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// 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() {
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[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;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
public static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
public static byte[] SaveImage {
get {
object obj = ResourceManager.GetObject("SaveImage", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
public static byte[] SaveMeta {
get {
object obj = ResourceManager.GetObject("SaveMeta", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
public static byte[] TitleImage {
get {
object obj = ResourceManager.GetObject("TitleImage", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Byte[].
/// </summary>
public static byte[] TitleMeta {
get {
object obj = ResourceManager.GetObject("TitleMeta", resourceCulture);
return ((byte[])(obj));
}
}
}
}

View File

@ -0,0 +1,133 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="SaveImage" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>Resources\SaveImage.xbx;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="SaveMeta" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>Resources\SaveMeta.xbx;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="TitleImage" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>Resources\TitleImage.xbx;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="TitleMeta" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>Resources\TitleMeta.xbx;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
</root>

View File

@ -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)

View File

@ -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<TabEntry> SaveComponents = new List<TabEntry>();
}
}

View File

@ -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
}

View File

@ -4,7 +4,7 @@ https://go.microsoft.com/fwlink/?LinkID=208121.
-->
<Project>
<PropertyGroup>
<History>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;</History>
<History>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;</History>
<LastFailureDetails />
</PropertyGroup>
</Project>

View File

@ -8,6 +8,7 @@ namespace W4Gui
{
public enum SaveType : int
{
UNKNOWN = 0,
PC = 1,
PS2 = 2,
XBOX_US = 3,