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 intResourceDetails = new List(); private List uintResourceDetails = new List(); private List stringResourceDetails = new List(); private List floatResourceDetails = new List(); private List vectorResourceDetails = new List(); private List containerResourceDetails = new List(); 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()); } } } } }