예제 #1
0
        public void AddResource(ResourceEntry Entry, int Priority)
        {
            if (Entry.Key != Key)
            {
                throw new ArgumentException();
            }

            if (List.ContainsKey(Priority))
            {
                Duplicates.Add(Entry);
            }
            else
            {
                List.Add(Priority, Entry);
            }
   
        }
        public void AddResource(ResourceEntry Resource)
        {
            if (IsEncrypted != Resource.IsEncrypted)
                throw new InvalidDataException("Encryption State Mismatch");

            byte[] buffer = Resource.ReadRaw();

            long ChunkOffset = DataStore.Length;
            int ChunkLength = buffer.Length;
            int Length = (int)Resource.Length;

            DataStore.Position = DataStore.Length;
            DataStore.Write(buffer, 0, ChunkLength);
            DataStore.Flush();

            ResourceEntry Entry = new ResourceEntry(DataStore, Resource.Key, ChunkOffset, ChunkLength, Length, Resource.IsCompressed, Resource.IsEncrypted);
            Resources.Add(Entry);
            IsModified = true;
        }
예제 #3
0
        private void Import()
        {
            BinaryReader Reader;
            byte[] buffer;            

            // Start by getting the Header :  0x60 bytes at the beginning of the file
            DataStore.Seek (0,SeekOrigin .Begin);

            buffer = new byte[0x60];
            DataStore.Read (buffer,0,0x60);

            
            // Check the Magic
            string Magic = Encoding.ASCII.GetString(buffer, 0, 4);

            if ((Magic != "DBPF") & (Magic != "DBPP"))
            {
                throw new InvalidDataException("Unknown Magic Number: " + Magic);
            }

            if (Magic == "DBPP")
            {
                _IsEncrypted = true;
                throw new InvalidDataException("DBPP Not Supported");
            }

            Reader = new BinaryReader(new MemoryStream(buffer, false));
            Reader.BaseStream.Position = 4;
            
            // Next verify the Major, Minor Versions
            // Major, Minor == 2,0

            uint Major = Reader.ReadUInt32();
            uint Minor = Reader.ReadUInt32();
            uint UMajor = Reader.ReadUInt32();
            uint UMinor = Reader.ReadUInt32();
            uint Flags = Reader.ReadUInt32();
            uint CDate = Reader.ReadUInt32();
            uint MDate = Reader.ReadUInt32();
            uint IMajor = Reader.ReadUInt32();
            uint IndexCount = Reader.ReadUInt32();
            uint IOffset = Reader.ReadUInt32();
            uint IndexLength = Reader.ReadUInt32();
            uint HCount = Reader.ReadUInt32();
            uint HOffset = Reader.ReadUInt32();
            uint HLength = Reader.ReadUInt32();
            uint IMinor = Reader.ReadUInt32();
            uint IndexOffset = Reader.ReadUInt32();

            // Verify Header Values
            if ((Major != 2) | (Minor != 0))
            {
                log.Warn(string.Format("Unknown DBPF Version {0}.{1}, Expected 2.0 -- {2}", Major, Minor,this.FileName));
                throw new InvalidDataException(string.Format("Unknown File Version: {0}.{1}, Expected 2.0", Major, Minor));
            }

            if (((IMajor != 0) & (IMajor != 7)) | (IMinor != 3))
            {
                log.Warn(string.Format("Unknown Index Version {0}.{1}, Expected 0.3 -- {2}", IMajor, IMinor,this.FileName));
                //throw new InvalidDataException(string.Format("Unknown Index Version: {0}.{1}, Expected 0.3", IMajor, IMinor));
            }

            if ((UMajor != 0) | (UMinor != 0) | (Flags != 0) | (CDate != 0) | (MDate != 0) | (HCount != 0) | (HLength != 0))
            {
                log.Warn(string.Format("Unused Header Value not set to 0 -- {0}", this.FileName));
            //    throw new InvalidDataException("Unused header value not 0");
            }

            if ((IOffset != 0) & (IOffset != IndexOffset))
            {
                log.Warn(string.Format("Header Offset mismatch -- Not loadable by Game! -- {0}", this.FileName));
            }
            
            // Now we need to get a new buffer, BinaryReader, etc and read in the Index
            buffer = new byte[IndexLength];
            DataStore.Position = IndexOffset;

            DataStore.Read(buffer, 0, (int)IndexLength);
            Reader = new BinaryReader(new MemoryStream(buffer, false));

            // Vars to hold the info
            UInt32 Type =0;
            UInt32 Group=0;
            UInt64 Instance=0;

            TGI_Key Key;
            ResourceEntry Entry;

            UInt32 ILow = 0xffffffffu;
            UInt32 IHigh = 0xffffffffu;

            UInt32 ChunkOffset;
            UInt32 ChunkLength;
            UInt32 ResourceLength;
            UInt16 ResourceCompression;
            UInt16 ResourceFlag;

            // if we don't have any index entries, just exit
            if (IndexCount == 0)
            {
                log.Info("Empty Package -- No Index Entries");
                return;
            }

            // Now we get the index type
            uint IndexBits = Reader.ReadUInt32();

            // Test Package Index Type :::
            //
            int CommonCount = 0;
            if ((IndexBits & 0x0001) == 0x0001)
            {
                CommonCount += 4;
            }
            if ((IndexBits & 0x0002) == 0x0002)
            {
                CommonCount += 4;
            }
            if ((IndexBits & 0x0004) == 0x0004)
            {
                CommonCount += 4;
            }
            if ((IndexBits & 0x0008) == 0x0008)
            {
                CommonCount += 4;
            }

            

            int BlockLength = CommonCount + 4;
            BlockLength += (32 - CommonCount) * (int)IndexCount;

            if (BlockLength != IndexLength)
            {
                log.Warn(string.Format("DBPF Format Error, IndexType vs IndexSize mismatch: Actual Size {0}, Calculated Size {1}, IndexType {2} -- {3}", IndexLength, BlockLength,IndexBits,this.FileName));
                throw new InvalidDataException("DBPF Format Error, IndexType vs IndexSize mismatch");          
            }



            if ((IndexBits | 0x000f) != 0x000f )
            {
                log.Fatal("Import not implemented");
                throw new NotImplementedException();           
            }

            if ((IndexBits & 0x00000001) == 0x00000001)
            {
                Type = Reader.ReadUInt32();
            }

            if ((IndexBits & 0x00000002) == 0x00000002)
            {
                Group = Reader.ReadUInt32();
            }

            if ((IndexBits & 0x00000004) == 0x00000004)
            {
                ILow = Reader.ReadUInt32();
            }

            if ((IndexBits & 0x00000008) == 0x00000008)
            {
                IHigh = Reader.ReadUInt32();             


            }

            // now we cycle through each of the entries
            for (int i = 0; i < IndexCount; i++)
            {
                // Get the Variable Portion
                if ((IndexBits & 0x00000001) == 0x00000000)
                {
                    Type = Reader.ReadUInt32();
                }

                if ((IndexBits & 0x00000002) == 0x00000000)
                {
                    Group = Reader.ReadUInt32();
                }

                if ((IndexBits & 0x00000004) == 0x00000000)
                {
                    ILow = Reader.ReadUInt32();
                }
                if ((IndexBits & 0x000000008) == 0x00000000)
                {
                    IHigh = Reader.ReadUInt32();
                }

                Instance = (UInt64)IHigh | ((UInt64)ILow << 32);

                // Get the static part
                ChunkOffset = Reader.ReadUInt32();
                ChunkLength = Reader.ReadUInt32() & 0x7fffffff;
                ResourceLength = Reader.ReadUInt32();
                ResourceCompression = Reader.ReadUInt16();
                ResourceFlag = Reader.ReadUInt16();

                // Build the Key and the Entry
                Key = new TGI_Key(Type, Group, Instance);

                Entry = new ResourceEntry(DataStore, Key, (long)ChunkOffset, (int)ChunkLength, (int)ResourceLength, ResourceCompression == 0xffff, IsEncrypted);

                Resources.Add(Entry);
            }
        }