public ArchiveParser(byte[] archive) { this.data = archive; archiveReader = new BigEndianBinaryReader(new MemoryStream(this.data)); DecompressedSize = archiveReader.ReadUInt24(); CompressedSize = archiveReader.ReadUInt24(); if (CompressedSize != DecompressedSize) { byte[] input = new byte[DecompressedSize - 6]; Array.Copy(this.data, 6, input, 0, DecompressedSize - 6); byte[] dec = new byte[DecompressedSize - 6]; BZip2.Decompress(new MemoryStream(input), new MemoryStream(dec), true); finalBuffer = dec; archiveReader.Close(); archiveReader = new BigEndianBinaryReader(new MemoryStream(finalBuffer)); compressedAsWhole = true; } else { finalBuffer = this.data; compressedAsWhole = false; } totalFiles = archiveReader.ReadUInt16(); int offset = 8 + totalFiles * 10; for (int i = 0; i < totalFiles; i++) { identifiers.Add(archiveReader.ReadInt32()); decompressedSizes.Add(archiveReader.ReadUInt24()); compressedSizes.Add(archiveReader.ReadUInt24()); startOffsets.Add(offset); Logger.Log("Found file: " + identifiers[i] + " at " + offset + ", size: " + compressedSizes[i], LogType.Success); offset += compressedSizes[i]; files.Add(getFileAt(i)); } }
//Parses flo.dat from config.jag //Yup it's fixed public static FloorConfig[] ParseFloorConfig(byte[] floorData) { int floorCount; FloorConfig[] floors; BigEndianBinaryReader floorReader = new BigEndianBinaryReader(new MemoryStream(floorData)); floorCount = floorReader.ReadUInt16(); floors = new FloorConfig[floorCount]; bool finishFloor = false; for (int i = 0; i < floorCount; i++) { floors[i] = new FloorConfig(); finishFloor = false; do { int type = floorReader.ReadByte(); switch (type) { case 0: finishFloor = true; break; case 1: floors[i].actualColor = toRGB(floorReader.ReadUInt24()); break; case 2: floors[i].texture = floorReader.ReadByte(); break; case 3: floors[i].unknown = true; break; case 5: floors[i].occlude = false; break; case 6: floors[i].floorName = floorReader.ReadString().TrimEnd('\n'); break; case 7: floors[i].mapColor = toRGB(floorReader.ReadUInt24()); break; default: Logger.Log("Unrecognized floor type: " + type, LogType.Error); break; } } while (!finishFloor); Logger.Log(floors[i].ToString(), LogType.Success); } return floors; }
public ImageGroup(byte[] index, byte[] data, bool unpack) { indexReader = new BigEndianBinaryReader(new MemoryStream(index)); dataReader = new BigEndianBinaryReader(new MemoryStream(data)); indexReader.BaseStream.Position = dataReader.ReadUInt16(); indexOffset = (int)indexReader.BaseStream.Position; maxWidth = indexReader.ReadUInt16(); maxHeight = indexReader.ReadUInt16(); colorCount = indexReader.ReadByte(); colorMap = new int[colorCount]; for (int x = 0; x < colorCount - 1; x++) { colorMap[x + 1] = indexReader.ReadUInt24(); if (colorMap[x + 1] == 0) colorMap[x + 1] = 1; } if(unpack) unpackImages(); }