How a Silencer tile bank works: HEADER: The header is variable sized, equivalent to 12 * NumTiles. We don't necessarially KNOW the number of tiles yet, but I digress... 12 Byte HEADER: dwrd const_0_1: (when this is NOT a zero or a one, we know we're at the end of the header) dwrd OffsetInData: (offset the tile's compressed data starts at relative to the start of all compressed data) dwrd TileSize: (size of compressed data) DATA HEADER: dword Size of data: (Should equal all of the TileSizes summed together) DATA: Simply a chunk of data 'Size of Data' bytes long. Compressed with an odd RLE routine. Interesting notes: Since the tiles are always 64x64, we don't really need any of the data present in the header for more than checking to see if the math is okay. We can just load all of the data, uncompress it, and count out every 4096 bytes. Compression algorithm: The algorithm works in DWORDs, so be mindful of endians... The picture itself is always an 8 bit picture, so each byte corresponds to a palette mapping. 0 is transparent. And lastly, the algorithm can be seen in the code, should this description be too hard to follow. Step 1: Take a dword. If the first byte of the dword is 0xFF: Extract the second byte. That's the byte we're repeating, but it appears values greater than 64 are not allowed (even if the row width is greater). Extract the third and fourth byte as a word. That's the number of times we repeat it. Well? You have a count and a byte. Repeat that byte the given number of times. If it's not 0xFF: Just write the dword directly to the output. Rinse, repeat. This algorithm is not terribly efficient since it always aligns to the fourth byte. You will never repeat a given byte three times, for instance. Still, it's quick and easy.