public static long FindOffset(byte[] input, string tag) { using (var ms = new MemoryStream(input)) { var reader = new BinaryReader(ms); var it = new ChunkIterator5(reader, input.Length); while (it.MoveNext()) { if (it.Current.Tag == tag) { return(reader.BaseStream.Position); } } } return(-1); }
public static byte[] ReadData(byte[] input, string tag) { using (var ms = new MemoryStream(input)) { var reader = new BinaryReader(ms); var it = new ChunkIterator5(reader, input.Length); while (it.MoveNext()) { if (it.Current.Tag == tag) { return(reader.ReadBytes((int)(it.Current.Size - 8))); } } } return(new byte[0]); }
Room ReadRoomCore(long offset, long chunkSize) { var room = new Room { Size = (int)chunkSize }; var it = new ChunkIterator5(_reader, chunkSize); var images = new Dictionary <ushort, ObjectData>(); var objCodes = new Dictionary <ushort, ObjectData>(); while (it.MoveNext()) { switch (it.Current.Tag) { case "TRNS": { // transparent color room.TransparentColor = _reader.ReadByte(); var unknown = _reader.ReadByte(); } break; case "RMHD": // ROOM Header room.Header = ReadRMHD(); break; case "RMIM": // room image ReadRoomImage(room); break; case "IMAG": ReadRoomImages(room); break; case "CYCL": // CYCL room.ColorCycle = ReadCYCL(); break; case "EPAL": // EPAL ReadEPAL(); break; case "BOXD": // box data { var numBoxes = ReadNumBoxes(); for (int i = 0; i < numBoxes; i++) { var box = ReadBox(); room.Boxes.Add(box); } } break; case "BOXM": // box matrix { var size = (int)(it.Current.Size - 8); room.BoxMatrix.Clear(); room.BoxMatrix.AddRange(_reader.ReadBytes(size)); } break; case "PALS": { room.HasPalette = true; var palettes = ReadPalettes().ToArray(); room.Palettes.Clear(); room.Palettes.AddRange(palettes); } break; case "SCAL": // SCAL if (it.Current.Size > 8) { room.Scales = ReadSCAL(); } break; case "ENCD": { // Entry script room.EntryScript.Data = _reader.ReadBytes((int)(it.Current.Size - 8)); } break; case "EXCD": { // exit script room.ExitScript.Data = _reader.ReadBytes((int)(it.Current.Size - 8)); } break; case "NLSC": { // number of local scripts var numLocalScripts = _reader.ReadUInt16(); } break; case "LSCR": { // local script var pos = _reader.BaseStream.Position; var index = ReadScriptIndex(); var size = 8 + _reader.BaseStream.Position - pos; room.LocalScripts[index - GetNumGlobalScripts()] = new ScriptData { Data = _reader.ReadBytes((int)(it.Current.Size - size)) }; } break; case "OBIM": { // Object Image var obj = ReadObjectImages(it.Current.Size - 8); images[obj.Number] = obj; } break; case "OBCD": { // object script var obj = ReadObjectCode(it.Current.Size - 8); objCodes[obj.Number] = obj; } break; default: UnknownChunk(it.Current); break; } } var objIds = objCodes.Values.Concat(images.Values).Select(o => o.Number).Distinct().ToList(); foreach (var objId in objIds) { if (images.ContainsKey(objId)) { if (objCodes.ContainsKey(objId)) { room.Objects.Add(Merge(images[objId], objCodes[objId])); } else { room.Objects.Add(images[objId]); } } else { room.Objects.Add(objCodes[objId]); } } return(room); }