Worms4Editor/LibW4M/W4SaveFile.cs

149 lines
4.8 KiB
C#
Raw Normal View History

2023-01-11 09:22:45 +00:00
using LibW4M.Data;
2023-01-15 03:46:18 +00:00
using LibW4M.Data.Highscores;
2023-01-17 04:07:32 +00:00
using LibW4M.Data.Schemes;
2023-01-12 03:50:02 +00:00
using LibW4M.Data.Teams;
2023-01-11 09:22:45 +00:00
using LibW4M.Data.WeaponFactory;
using LibXom;
2023-01-12 03:50:02 +00:00
using LibXom.Blocks;
2023-01-11 09:22:45 +00:00
using LibXom.Data;
2023-01-17 04:07:32 +00:00
using System.Runtime.InteropServices;
2023-01-09 13:18:25 +00:00
namespace LibW4M
{
public class W4SaveFile
{
2023-01-12 03:50:02 +00:00
internal List<SaveDataEntry> collectives = new List<SaveDataEntry>();
2023-01-11 09:22:45 +00:00
private WeaponsCollective weaponFactoryCollective;
2023-01-12 03:50:02 +00:00
private TeamsCollective teamDataColective;
2023-01-17 04:07:32 +00:00
private SchemesCollective schemesCollective;
2023-01-15 03:46:18 +00:00
private HighscoreCollective highscoreCollective;
2023-01-11 09:22:45 +00:00
public WeaponsCollective WeaponFactoryCollective
{
get
{
return weaponFactoryCollective;
}
}
2023-01-12 03:50:02 +00:00
public TeamsCollective TeamDataColective
{
get
{
return teamDataColective;
}
}
2023-01-15 03:46:18 +00:00
public HighscoreCollective HighscoreDataCollective
{
get
{
return highscoreCollective;
}
}
2023-01-12 03:50:02 +00:00
2023-01-17 04:07:32 +00:00
public SchemesCollective SchemeCollective
{
get
{
return schemesCollective;
}
}
2023-01-11 09:22:45 +00:00
internal XomFile xomFile;
2023-01-12 03:50:02 +00:00
internal WeaponData findWeaponWithContainerId(int containerId)
{
foreach(WeaponStore store in WeaponFactoryCollective)
{
if (store.Weapon.containerId == containerId) return store.Weapon;
if (store.Cluster.containerId == containerId) return store.Cluster;
}
return new WeaponData(this, xomFile.GetContainerById(containerId));
}
2023-01-11 09:22:45 +00:00
public void Save(string newXom)
{
2023-01-12 03:50:02 +00:00
foreach(SaveDataEntry entry in collectives)
2023-01-11 09:22:45 +00:00
{
entry.Save();
}
XomWriter.WriteXom(xomFile, newXom);
}
2023-01-12 03:50:02 +00:00
public void ExtractAllContainers(string path)
{
foreach(XomType type in xomFile.XomTypes)
{
string outfolder = Path.Combine(path, type.Name);
if (Directory.Exists(outfolder))
Directory.Delete(outfolder, true);
Directory.CreateDirectory(outfolder);
foreach(XomContainer container in type.Containers)
{
2023-01-17 04:07:32 +00:00
while (true)
{
try
{
File.WriteAllBytes(Path.ChangeExtension(Path.Combine(outfolder, container.Id.ToString("X2")), ".bin"), container.GetData());
break;
}
catch
{
continue;
}
}
2023-01-12 03:50:02 +00:00
}
}
}
2023-01-14 01:00:48 +00:00
public XomString[] StringArrayToXomStringArray(string[] strings)
{
XomString[] xstrings = new XomString[strings.Length];
for (int i = 0; i < xstrings.Length; i++) xstrings[i] = LookupString(strings[i]);
return xstrings;
}
public string[] XomStringArrayToStringArray(XomString[] xstrings)
{
string[] strings = new string[xstrings.Length];
for (int i = 0; i < strings.Length; i++) strings[i] = xstrings[i].Value;
return strings;
}
2023-01-12 03:50:02 +00:00
public int[] XomStringArrayToIntArray(XomString[] strs)
{
int[] ids = new int[strs.Length];
for (int i = 0; i < ids.Length; i++) ids[i] = strs[i].Id;
return ids;
}
public XomString[] IntArrayToXomStringArray(int[] stringIds)
{
XomString[] strings = new XomString[stringIds.Length];
for (int i = 0; i < strings.Length; i++) strings[i] = this.LookupStringFromId(stringIds[i]);
return strings;
}
public XomString LookupStringFromId(int id)
{
return xomFile.GetStringById(id);
}
2023-01-11 09:22:45 +00:00
public XomString LookupString(string value)
{
return xomFile.AddOrGetString(value);
}
2023-01-09 13:18:25 +00:00
public W4SaveFile(XomFile w4Save)
{
this.xomFile = w4Save;
2023-01-17 04:07:32 +00:00
// Read Weapon Factory
2023-01-11 09:22:45 +00:00
weaponFactoryCollective = new WeaponsCollective(this, this.xomFile.GetTypeByName("WeaponFactoryCollective").Containers.First());
2023-01-17 04:07:32 +00:00
// Abtract away teamdata storing both highscores and teams.
2023-01-12 03:50:02 +00:00
teamDataColective = new TeamsCollective(this, this.xomFile.GetTypeByName("TeamDataColective").Containers.First());
2023-01-15 03:46:18 +00:00
highscoreCollective = new HighscoreCollective(this, this.xomFile.GetTypeByName("TeamDataColective").Containers.First());
2023-01-17 04:07:32 +00:00
// Read Schemes / Game Styles
schemesCollective = new SchemesCollective(this, this.xomFile.GetTypeByName("SchemeColective").Containers.First());
2023-01-09 13:18:25 +00:00
}
}
}