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); }
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)); }
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; }