/// <summary> /// Reads the Properties dictionary and relates each one to its owning class. /// </summary> /// <param name="ms"></param> /// <param name="owner"></param> protected void ReadProperties(Stream ms, NdfBinary owner) { NdfFooterEntry propEntry = owner.Footer.Entries.Single(x => x.Name == "PROP"); ms.Seek(propEntry.Offset, SeekOrigin.Begin); int i = 0; var buffer = new byte[4]; while (ms.Position < propEntry.Offset + propEntry.Size) { var property = new NdfProperty(i); ms.Read(buffer, 0, buffer.Length); int strLen = BitConverter.ToInt32(buffer, 0); var strBuffer = new byte[strLen]; ms.Read(strBuffer, 0, strBuffer.Length); property.Name = Encoding.GetEncoding("ISO-8859-1").GetString(strBuffer); ms.Read(buffer, 0, buffer.Length); NdfClass cls = owner.Classes.Single(x => x.Id == BitConverter.ToUInt32(buffer, 0)); property.Class = cls; cls.Properties.Add(property); i++; } }
protected void ReadClasses() { var classes = new List <NdfClass>(); var classEntry = Footer.Entries.Single(x => x.Name == "CLAS"); //TODO: int cast is a bit too hacky here, solution needed using (var ms = new MemoryStream(ContentData, (int)classEntry.Offset - 40, (int)classEntry.Size)) { int i = 0; var buffer = new byte[4]; while (ms.Position < ms.Length) { var nclass = new NdfClass(this) { Offset = ms.Position, Id = i }; ms.Read(buffer, 0, buffer.Length); var strLen = BitConverter.ToInt32(buffer, 0); var strBuffer = new byte[strLen]; ms.Read(strBuffer, 0, strBuffer.Length); nclass.Name = Encoding.GetEncoding("ISO-8859-1").GetString(strBuffer); i++; classes.Add(nclass); } } Classes = classes; }
/// <summary> /// Reads the Classes dictionary. /// </summary> /// <param name="ms"></param> /// <param name="owner"></param> /// <returns></returns> protected ObservableCollection <NdfClass> ReadClasses(Stream ms, NdfBinary owner) { var classes = new ObservableCollection <NdfClass>(); NdfFooterEntry classEntry = owner.Footer.Entries.Single(x => x.Name == "CLAS"); ms.Seek(classEntry.Offset, SeekOrigin.Begin); uint i = 0; var buffer = new byte[4]; while (ms.Position < classEntry.Offset + classEntry.Size) { var nclass = new NdfClass(owner, i); ms.Read(buffer, 0, buffer.Length); int strLen = BitConverter.ToInt32(buffer, 0); var strBuffer = new byte[strLen]; ms.Read(strBuffer, 0, strBuffer.Length); nclass.Name = Encoding.GetEncoding("ISO-8859-1").GetString(strBuffer); i++; classes.Add(nclass); } return(classes); }
public NdfObjectReference(NdfClass cls, uint instance, bool isDead = false) : base(NdfType.ObjectReference) { Class = cls; InstanceId = instance; _isDead = isDead; }
public void LoadClass() { EdataManager datamana = new EdataManager(ndffile); datamana.ParseEdataFile(); NdfbinManager ndfbin = datamana.ReadNdfbin(ndfbinfile); NdfClass claass = ndfbin.GetClass(className); Assert.IsTrue(claass.Instances.Count > 0); }
public void LoadInstance() { EdataManager datamana = new EdataManager(ndffile); datamana.ParseEdataFile(); NdfbinManager ndfbin = datamana.ReadNdfbin(ndfbinfile); NdfClass claass = ndfbin.GetClass(className); NdfObject obj = claass.Instances[0]; Assert.IsTrue(obj.PropertyValues.Count > 0); }
public void ReadCost() { EdataManager datamana = new EdataManager(ndffile); datamana.ParseEdataFile(); NdfbinManager ndfbin = datamana.ReadNdfbin(ndfbinfile); NdfClass claass = ndfbin.GetClass("TUniteDescriptor"); NdfObject obj = claass.Instances[1]; NdfUInt32 refef; Assert.IsTrue(obj.TryGetValueFromQuery <NdfUInt32>(UNIT_REA_COST, out refef)); }
public void LoadProperty() { EdataManager datamana = new EdataManager(ndffile); datamana.ParseEdataFile(); NdfbinManager ndfbin = datamana.ReadNdfbin(ndfbinfile); NdfClass claass = ndfbin.GetClass(className); NdfObject obj = claass.Instances[1]; NdfString uint32; obj.TryGetValueFromQuery <NdfString>(UNIT_ICON, out uint32); }
public void QueryReference() { EdataManager datamana = new EdataManager(ndffile); datamana.ParseEdataFile(); NdfbinManager ndfbin = datamana.ReadNdfbin(ndfbinfile); NdfClass claass = ndfbin.GetClass("TUniteDescriptor"); NdfObject obj = claass.Instances[1]; NdfObjectReference refef; string query = "Modules.TypeUnit.Default"; Assert.IsTrue(obj.TryGetValueFromQuery <NdfObjectReference>(query, out refef)); }
public void TestGettingFile() { EdataManager datamanager = new EdataManager(Environment.CurrentDirectory + "/data/NDF_Win.dat"); datamanager.ParseEdataFile(); NdfbinManager ndfFile = datamanager.ReadNdfbin("pc\\ndf\\patchable\\gfx\\everything.ndfbin"); Assert.IsNotNull(ndfFile); Assert.IsTrue(ndfFile.Classes.Count > 1); NdfClass ammoClass = ndfFile.GetClass("TAmmunition"); foreach (NdfObject ammo in ammoClass.Instances) { NdfValueWrapper val; Assert.IsTrue(ammo.TryGetValueFromPath("TempsEntreDeuxTirs", out val)); } }
public void ReadDictionaryEntry() { EdataManager datamana = new EdataManager(ndffile); datamana.ParseEdataFile(); NdfbinManager ndfbin = datamana.ReadNdfbin(ndfbinfile); NdfClass claass = ndfbin.GetClass("TUniteDescriptor"); NdfObject obj = claass.Instances[1]; NdfLocalisationHash refef; string query = "Modules.TypeUnit.Default.DescriptionHintToken"; Assert.IsTrue(obj.TryGetValueFromQuery <NdfLocalisationHash>(query, out refef)); EdataManager dic = new EdataManager(trans); dic.ParseEdataFile(); TradManager trad = dic.ReadDictionary(transFile); string output = string.Empty; Assert.IsTrue(trad.TryGetString(refef.Value, out output)); // get LOSAT's description }
public NdfDatabase(string fileName) { string everythingNdfbinPattern = @".*everything.ndfbin"; Regex regex = new Regex(everythingNdfbinPattern, RegexOptions.IgnoreCase); var ndfbinReader = new NdfbinReader(); var edataManager = new EdataManager(fileName); edataManager.ParseEdataFile(); var everythingNdfbinRaw = edataManager.Files.Where(t => regex.IsMatch(t.ToString())).First(); everythingNdfbin = ndfbinReader.Read(edataManager.GetRawData(everythingNdfbinRaw)); tShowRoomDeckSerializer = everythingNdfbin.Classes.Where(cls => cls.Name == "TShowRoomDeckSerializer").First(); tUniteAuSolDescriptor = everythingNdfbin.Classes.Where(cls => cls.Name == "TUniteAuSolDescriptor").First(); tUniteDescriptor = everythingNdfbin.Classes.Where(cls => cls.Name == "TUniteDescriptor").First(); tTransportableModuleDescriptor = everythingNdfbin.Classes.Where(cls => cls.Name == "TTransportableModuleDescriptor").First(); tShowRoomDeckRuleManager = everythingNdfbin.Classes.Where(cls => cls.Name == "TShowRoomDeckRuleManager").First(); deckRulesManagerProperties = tShowRoomDeckRuleManager.Instances[0].PropertyValues; }
public static NdfValueWrapper GetValue(byte[] data, NdfType type, NdfBinary mgr) { //if (data.Length != SizeofType(type)) // return null; switch (type) { case NdfType.Boolean: return(new NdfBoolean(BitConverter.ToBoolean(data, 0))); case NdfType.Int8: return(new NdfInt8(data[0])); case NdfType.Int16: return(new NdfInt16(BitConverter.ToInt16(data, 0))); case NdfType.UInt16: return(new NdfUInt16(BitConverter.ToUInt16(data, 0))); case NdfType.Int32: return(new NdfInt32(BitConverter.ToInt32(data, 0))); case NdfType.UInt32: return(new NdfUInt32(BitConverter.ToUInt32(data, 0))); case NdfType.Float32: return(new NdfSingle(BitConverter.ToSingle(data, 0))); case NdfType.Float64: return(new NdfDouble(BitConverter.ToDouble(data, 0))); case NdfType.TableStringFile: int id = BitConverter.ToInt32(data, 0); return(new NdfFileNameString(mgr.Strings[id])); case NdfType.TableString: int id2 = BitConverter.ToInt32(data, 0); return(new NdfString(mgr.Strings[id2])); case NdfType.Color32: return(new NdfColor32(Color.FromArgb(data[3], data[0], data[1], data[2]))); case NdfType.Color128: return(new NdfColor128(data)); case NdfType.Vector: byte[] px = data.Take(4).ToArray(); byte[] py = data.Skip(4).Take(4).ToArray(); byte[] pz = data.Skip(8).ToArray(); return(new NdfVector(new Point3D(BitConverter.ToSingle(px, 0), BitConverter.ToSingle(py, 0), BitConverter.ToSingle(pz, 0)))); case NdfType.ObjectReference: uint instId = BitConverter.ToUInt32(data.Take(4).ToArray(), 0); uint clsId = BitConverter.ToUInt32(data.Skip(4).ToArray(), 0); NdfClass cls = null; // possible deadrefs here if (clsId <= mgr.Classes.Count) { cls = mgr.Classes[(int)clsId]; } return(new NdfObjectReference(cls, instId, cls == null)); case NdfType.Map: return(new NdfMap(new MapValueHolder(null, mgr), new MapValueHolder(null, mgr), mgr)); case NdfType.Guid: return(new NdfGuid(new Guid(data))); case NdfType.WideString: return(new NdfWideString(Encoding.Unicode.GetString(data))); case NdfType.TransTableReference: int id3 = BitConverter.ToInt32(data, 0); return(new NdfTrans(mgr.Trans[id3])); case NdfType.LocalisationHash: return(new NdfLocalisationHash(data)); case NdfType.List: return(new NdfCollection()); case NdfType.MapList: return(new NdfMapList()); case NdfType.Blob: return(new NdfBlob(data)); case NdfType.ZipBlob: return(new NdfZipBlob(data)); case NdfType.EugInt2: return(new NdfEugInt2(BitConverter.ToInt32(data, 0), BitConverter.ToInt32(data, 4))); case NdfType.EugFloat2: return(new NdfEugFloat2(BitConverter.ToSingle(data, 0), BitConverter.ToSingle(data, 4))); case NdfType.TrippleInt: return(new NdfTrippleInt(BitConverter.ToInt32(data, 0), BitConverter.ToInt32(data, 4), BitConverter.ToInt32(data, 8))); case NdfType.Hash: return(new NdfHash(data)); case NdfType.Time64: return(new NdfTime64(new DateTime(1970, 1, 1).AddSeconds(BitConverter.ToUInt32(data, 0)))); case NdfType.Unset: return(new NdfNull()); case NdfType.Bob: return(new NdfTime64(new DateTime(1970, 1, 1).AddSeconds(BitConverter.ToUInt32(data, 0)))); default: return(null); } }
/// <summary> /// Reads one object instance. /// </summary> /// <param name="ms"></param> /// <param name="index"></param> /// <param name="owner"></param> /// <returns></returns> protected NdfObject ReadObject(Stream ms, uint index, NdfBinary owner) { var instance = new NdfObject { Id = index }; if (owner.TopObjects.Contains(index)) { instance.IsTopObject = true; } var buffer = new byte[4]; ms.Read(buffer, 0, buffer.Length); int classId = BitConverter.ToInt32(buffer, 0); if (owner.Classes.Count < classId) { throw new InvalidDataException("Object without class found."); } NdfClass cls = instance.Class = owner.Classes[classId]; cls.Instances.Add(instance); // Read properties for (; ;) { ms.Read(buffer, 0, buffer.Length); uint propertyId = BitConverter.ToUInt32(buffer, 0); if (propertyId == 0xABABABAB) { break; } var propVal = new NdfPropertyValue(instance) { Property = cls.Properties.SingleOrDefault(x => x.Id == propertyId) }; if (propVal.Property == null) { // throw new InvalidDataException("Found a value for a property which doens't exist in this class."); foreach (var c in owner.Classes) { foreach (var p in c.Properties) { if (p.Id == propertyId) { propVal.Property = p; break; } } } } instance.PropertyValues.Add(propVal); NdfValueWrapper res = ReadValue(ms, owner); propVal.Value = res; } owner.AddEmptyProperties(instance); return(instance); }