コード例 #1
0
        public void ImportTextFile(string inputDirectory)
        {
            var    chunk        = LocateLanguageFileChunk();
            string compoundName = ResolveLanguageCasFile(chunk);

            using (BinaryWriter writer = new BinaryWriter(File.Open(compoundName, FileMode.Append)))
            {
                var offset   = (int)writer.BaseStream.Position;
                int fileSize = ChunkHandler.Chunk(writer, inputDirectory + @"\manifest\" + EnglishChunkGuid);
                chunk.BasePosition = (uint)offset;
                chunk.BaseLength   = (uint)fileSize;
            }

            UpdateManifest();
        }
コード例 #2
0
        public void ImportFontFiles(string inputDirectory)
        {
            var fontPatchDescriptor          = manifest.Patches.First(patch => patch.PatchIdentifier == EnglishFontDescriptorId);
            var manifestChunkDescriptorIndex = fontPatchDescriptor.PatchStart;
            var manifestChunk              = manifest.Chunks[(int)manifestChunkDescriptorIndex];
            var chunkDescriptor            = chunkDescriptors.First(desc => desc.Offset == manifestChunk.BasePosition);
            var fileLengthsMapping         = new Queue <int>();
            var relativeChunkIdToFileNames = new Dictionary <int, List <string> >();

            using (StreamReader reader = new StreamReader(File.Open(inputDirectory + @"\fonts_import.descriptor", FileMode.Open)))
            {
                string line       = null;
                int    lineNumber = 1;
                while ((line = reader.ReadLine()) != null)
                {
                    var fileNames = new List <string>();

                    if (line != "-")
                    {
                        fileNames.AddRange(line.Split(','));
                    }

                    relativeChunkIdToFileNames[lineNumber++] = fileNames;
                }
            }

            var resourceDescriptorsToUpdate = new List <ResourceDescriptor>();

            using (BinaryWriter casWriter = new BinaryWriter(File.Open(BaseDirectory + DataDirs[1] + @"\cas_01.cas", FileMode.Append)))
            {
                for (int i = 1; i < fontPatchDescriptor.PatchLength; i++)
                {
                    if (relativeChunkIdToFileNames[i].Count > 0)
                    {
                        uint compressedBlockSize  = 0;
                        var  patchChunkDescriptor = manifest.Chunks[(int)manifestChunkDescriptorIndex + i];
                        patchChunkDescriptor.Archive      = 0;
                        patchChunkDescriptor.DirectoryId  = (byte)DirectoryNames.InitialExperiencePatch;
                        patchChunkDescriptor.BasePosition = (uint)casWriter.BaseStream.Position;

                        foreach (string fileName in relativeChunkIdToFileNames[i])
                        {
                            var compositeResourceDescriptor = chunkDescriptor.ResourceDescriptors.FirstOrDefault(descriptor => fileName.Contains(descriptor.Name));
                            var pathToNewFile = inputDirectory + @"\" + fileName;
                            compressedBlockSize += (uint)ChunkHandler.Chunk(casWriter, pathToNewFile);
                            compositeResourceDescriptor.Resource.Size = (int)new FileInfo(pathToNewFile).Length;
                            resourceDescriptorsToUpdate.Add(compositeResourceDescriptor.Resource);
                        }

                        patchChunkDescriptor.BaseLength = compressedBlockSize;
                    }
                }
            }

            using (BinaryWriter chunkDescriptorWriter = new BinaryWriter(File.Open(ResolveManifestCasFile(), FileMode.Open)))
            {
                foreach (var resourceDescriptor in resourceDescriptorsToUpdate)
                {
                    chunkDescriptorWriter.BaseStream.Seek(resourceDescriptor.Offset + 4, SeekOrigin.Begin);
                    chunkDescriptorWriter.WriteUInt32BE((UInt32)resourceDescriptor.Size);
                }
            }

            UpdateManifest();
        }