예제 #1
0
        /// <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;
        }
예제 #3
0
        /// <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);
        }
예제 #4
0
        public NdfObjectReference(NdfClass cls, uint instance, bool isDead = false)
            : base(NdfType.ObjectReference)
        {
            Class      = cls;
            InstanceId = instance;

            _isDead = isDead;
        }
        public NdfObjectReference(NdfClass cls, uint instance, bool isDead = false)
            : base(NdfType.ObjectReference)
        {
            Class = cls;
            InstanceId = instance;

            _isDead = isDead;
        }
예제 #6
0
        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);
        }
예제 #7
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);
        }
예제 #8
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));
        }
예제 #9
0
        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);
        }
예제 #10
0
        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));
        }
예제 #11
0
        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));
            }
        }
예제 #12
0
        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
        }
예제 #13
0
        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;
        }
예제 #14
0
        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);
            }
        }
예제 #15
0
        /// <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);
        }