Worms4Editor/LibW4M/Data/X/DataBank.cs

235 lines
8.5 KiB
C#

using LibW4M.Data.Highscores;
using LibW4M.Data.Schemes;
using LibW4M.Data.Teams;
using LibW4M.Data.WeaponFactory;
using LibXom.Data;
using LibXom.Streams;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection.PortableExecutable;
using System.Text;
using System.Threading.Tasks;
namespace LibW4M.Data.X
{
public class DataBank : SaveDataEntry
{
public int Section;
private List<IntResourceDetail> intResourceDetails = new List<IntResourceDetail>();
private List<UIntResourceDetail> uintResourceDetails = new List<UIntResourceDetail>();
private List<StringResourceDetail> stringResourceDetails = new List<StringResourceDetail>();
private List<FloatResourceDetail> floatResourceDetails = new List<FloatResourceDetail>();
private List<VectorResourceDetail> vectorResourceDetails = new List<VectorResourceDetail>();
private List<ContainerResourceDetail> containerResourceDetails = new List<ContainerResourceDetail>();
public IntResourceDetail[] IntResourceDetails
{
get
{
return intResourceDetails.ToArray();
}
}
public UIntResourceDetail[] UIntResourceDetails
{
get
{
return uintResourceDetails.ToArray();
}
}
public StringResourceDetail[] StringResourceDetails
{
get
{
return stringResourceDetails.ToArray();
}
}
public FloatResourceDetail[] FloatResourceDetails
{
get
{
return floatResourceDetails.ToArray();
}
}
public VectorResourceDetail[] VectorResourceDetails
{
get
{
return vectorResourceDetails.ToArray();
}
}
public ContainerResourceDetail[] ContainerResourceDetails
{
get
{
return containerResourceDetails.ToArray();
}
}
public void CreateInt()
{
intResourceDetails.Add(new IntResourceDetail(this.fileBelongs, this.fileBelongs.CreateContainer("XIntResourceDetails"), false));
}
public void CreateUInt()
{
uintResourceDetails.Add(new UIntResourceDetail(this.fileBelongs, this.fileBelongs.CreateContainer("XUintResourceDetails"), false));
}
public void CreateString()
{
stringResourceDetails.Add(new StringResourceDetail(this.fileBelongs, this.fileBelongs.CreateContainer("XStringResourceDetails"), false));
}
public void CreateFloat()
{
floatResourceDetails.Add(new FloatResourceDetail(this.fileBelongs, this.fileBelongs.CreateContainer("XFloatResourceDetails"), false));
}
public void CreateVector()
{
vectorResourceDetails.Add(new VectorResourceDetail(this.fileBelongs, this.fileBelongs.CreateContainer("XVectorResourceDetails"), false));
}
public void Delete(IntResourceDetail detail)
{
for (int i = 0; i < IntResourceDetails.Length; i++)
{
if (IntResourceDetails[i].Equals(detail))
{
IntResourceDetails[i].DeleteEntries();
intResourceDetails.RemoveAt(i);
break;
}
}
}
public void Delete(UIntResourceDetail detail)
{
for (int i = 0; i < UIntResourceDetails.Length; i++)
{
if (UIntResourceDetails[i].Equals(detail))
{
UIntResourceDetails[i].DeleteEntries();
uintResourceDetails.RemoveAt(i);
break;
}
}
}
public void Delete(StringResourceDetail detail)
{
for (int i = 0; i < StringResourceDetails.Length; i++)
{
if (StringResourceDetails[i].Equals(detail))
{
StringResourceDetails[i].DeleteEntries();
stringResourceDetails.RemoveAt(i);
break;
}
}
}
public void Delete(FloatResourceDetail detail)
{
for (int i = 0; i < FloatResourceDetails.Length; i++)
{
if (FloatResourceDetails[i].Equals(detail))
{
FloatResourceDetails[i].DeleteEntries();
floatResourceDetails.RemoveAt(i);
break;
}
}
}
public void Delete(VectorResourceDetail detail)
{
for (int i = 0; i < VectorResourceDetails.Length; i++)
{
if (VectorResourceDetails[i].Equals(detail))
{
VectorResourceDetails[i].DeleteEntries();
vectorResourceDetails.RemoveAt(i);
break;
}
}
}
public DataBank(W4SaveFile fileBelongs, XomContainer mainContainer) : base(fileBelongs, mainContainer)
{
}
public override void Load()
{
using (XomStreamReader reader = new XomStreamReader(new MemoryStream(this.mainContainer.GetData())))
{
reader.Skip(3);
this.Section = reader.ReadCompressedInt();
int[] intResourceCtnrs = reader.ReadCompressedIntArray();
for (int i = 0; i < intResourceCtnrs.Length; i++)
intResourceDetails.Add(new IntResourceDetail(fileBelongs, fileBelongs.LookupContainerById(intResourceCtnrs[i])));
int[] uintResourceCtnrs = reader.ReadCompressedIntArray();
for (int i = 0; i < uintResourceCtnrs.Length; i++)
uintResourceDetails.Add(new UIntResourceDetail(fileBelongs, fileBelongs.LookupContainerById(uintResourceCtnrs[i])));
int[] stringResourceCtnrs = reader.ReadCompressedIntArray();
for (int i = 0; i < stringResourceCtnrs.Length; i++)
stringResourceDetails.Add(new StringResourceDetail(fileBelongs, fileBelongs.LookupContainerById(stringResourceCtnrs[i])));
int[] floatResourceCtnrs = reader.ReadCompressedIntArray();
for (int i = 0; i < floatResourceCtnrs.Length; i++)
floatResourceDetails.Add(new FloatResourceDetail(fileBelongs, fileBelongs.LookupContainerById(floatResourceCtnrs[i])));
int[] vectorResourceCtnrs = reader.ReadCompressedIntArray();
for (int i = 0; i < vectorResourceCtnrs.Length; i++)
vectorResourceDetails.Add(new VectorResourceDetail(fileBelongs, fileBelongs.LookupContainerById(vectorResourceCtnrs[i])));
int[] containerResourceCtnrs = reader.ReadCompressedIntArray();
for (int i = 0; i < containerResourceCtnrs.Length; i++)
containerResourceDetails.Add(new ContainerResourceDetail(fileBelongs, fileBelongs.LookupContainerById(containerResourceCtnrs[i])));
}
}
public void writeResourceDetail(XomStreamWriter writer, SaveDataEntry[] resourceDetails)
{
int[] inArr = new int[resourceDetails.Length];
for(int i = 0; i < resourceDetails.Length; i++)
{
resourceDetails[i].Save();
inArr[i] = resourceDetails[i].containerId;
}
writer.WriteCompressedIntArray(inArr);
}
public override void Save()
{
using (MemoryStream ms = new MemoryStream())
{
using (XomStreamWriter writer = new XomStreamWriter(ms))
{
writer.Skip(3);
writer.WriteCompressedInt(this.Section);
writeResourceDetail(writer, IntResourceDetails);
writeResourceDetail(writer, UIntResourceDetails);
writeResourceDetail(writer, StringResourceDetails);
writeResourceDetail(writer, FloatResourceDetails);
writeResourceDetail(writer, VectorResourceDetails);
writeResourceDetail(writer, ContainerResourceDetails);
ms.Seek(0x00, SeekOrigin.Begin);
mainContainer.SetData(ms.ToArray());
}
}
}
}
}