コード例 #1
0
 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));
     }
 }
コード例 #2
0
 //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;
 }
コード例 #3
0
 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();
 }