235 lines
8.5 KiB
C#
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());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|