コード例 #1
0
        public RawMapData ExtractLevelData(LevelIdentifier level)
        {
            RawMapData res;
            LevelInfo  info = GetLevelInfo(level);

            rom.Seek(info.DataBaseAddress, SeekOrigin.Begin);
            long startPos = rom.Position;

            res.RawData = LzCompression.Decompress(rom, info.DataUncompressedSize);
            int length = (int)(rom.Position - startPos);

            rom.Seek(startPos, SeekOrigin.Begin);
            res.CompressedData = (new BinaryReader(rom)).ReadBytes(length);

            rom.Seek(info.GraphicalBaseAddress, SeekOrigin.Begin);
            startPos         = rom.Position;
            res.RawGraphical = LzCompression.Decompress(rom, info.GraphicalUncompressedSize);
            length           = (int)(rom.Position - startPos);
            rom.Seek(startPos, SeekOrigin.Begin);
            res.CompressedGraphical = (new BinaryReader(rom)).ReadBytes(length);

            rom.Seek(info.BackgroundBaseAddress, SeekOrigin.Begin);
            startPos          = rom.Position;
            res.RawBackground = LzCompression.Decompress(rom, info.BackgroundUncompressedSize);
            length            = (int)(rom.Position - startPos);
            rom.Seek(startPos, SeekOrigin.Begin);
            res.CompressedBackground = (new BinaryReader(rom)).ReadBytes(length);

            rom.Seek(info.MinimapBaseAddress, SeekOrigin.Begin);
            res.RawMinimap = (new BinaryReader(rom)).ReadBytes(info.MinimapSize);

            return(res);
        }
コード例 #2
0
        byte[] DecompressWorldData(int w, int offset, int uncompressed_size)
        {
            if (uncompressed_size == 0)
            {
                Debug.Assert(offset == 0);
                return(null);
            }
            int addr = world_entries[w].WorldDataBaseAddress + offset;

            //Debug.Assert(rom.Position <= addr);
            rom.Seek(addr, SeekOrigin.Begin);
            return(LzCompression.Decompress(rom, uncompressed_size));
        }
コード例 #3
0
        int WriteDataWithCompression(LevelIdentifier level, byte[] original_raw, byte[] original_compressed, byte[] new_raw, int baseAddr, int endAddr)
        {
            rom.Seek(baseAddr, SeekOrigin.Begin);
            if (new_raw == null && (endAddr < 0 || baseAddr + original_compressed.Length <= endAddr))
            {
                rom.Write(original_compressed);
                return(original_raw.Length);
            }
            else if (new_raw == null)
            {
                new_raw = original_raw;
            }
            int uncompressed_length_written = LzCompression.Compress(rom, new_raw, endAddr);

            if (uncompressed_length_written < new_raw.Length)
            {
                Console.WriteLine(string.Format("Warning: The new level {0} has been truncated.", level.ToString()));
            }
            Debug.Assert(uncompressed_length_written <= new_raw.Length);
            return(floorToMultiple(uncompressed_length_written, 4));
            //return new_raw.Length;
        }