public override ArcFile TryOpen(ArcView file) { uint signature = file.View.ReadUInt32(0); if (0x53474d != (signature & 0xffffff)) // 'MGS' { return(null); } int count = file.View.ReadInt16(0x20); if (count <= 0) { return(null); } int flag = file.View.ReadUInt16(3); var dir = new List <Entry> (count); int index_offset = 0x22; byte[] name_buf = new byte[16]; for (uint i = 0; i < count; ++i) { ushort channels = file.View.ReadUInt16(index_offset + 1); uint rate = file.View.ReadUInt32(index_offset + 3); ushort bits = file.View.ReadUInt16(index_offset + 7); int name_size = file.View.ReadByte(index_offset + 9); if (0 == name_size) { return(null); } if (name_size > name_buf.Length) { Array.Resize(ref name_buf, name_size); } file.View.Read(index_offset + 10, name_buf, 0, (uint)name_size); if (100 == flag) { MgdOpener.Decrypt(name_buf, 0, name_size); } index_offset += 10 + name_size; var entry = new MgsEntry { Name = Encodings.cp932.GetString(name_buf, 0, name_size) + ".wav", Type = "audio", Size = file.View.ReadUInt32(index_offset), Offset = file.View.ReadUInt32(index_offset + 4), Channels = channels, SamplesPerSecond = rate, BitsPerSample = bits, }; if (!entry.CheckPlacement(file.MaxOffset)) { return(null); } dir.Add(entry); index_offset += 8; } return(new ArcFile(file, this, dir)); }
public override ArcFile TryOpen(ArcView file) { if (!file.View.AsciiEqual(0, "MGS")) { return(null); } int count = file.View.ReadInt16(0x20); if (!IsSaneCount(count)) { return(null); } int flag = file.View.ReadUInt16(3); var dir = new List <Entry> (count); int index_offset = 0x22; byte[] name_buf = new byte[16]; for (int i = 0; i < count; ++i) { byte format = file.View.ReadByte(index_offset); int name_size = file.View.ReadByte(index_offset + 9); if (0 == name_size) { return(null); } if (name_size > name_buf.Length) { Array.Resize(ref name_buf, name_size); } file.View.Read(index_offset + 10, name_buf, 0, (uint)name_size); if (100 == flag) { MgdOpener.Decrypt(name_buf, 0, name_size); } var name = Encodings.cp932.GetString(name_buf, 0, name_size); name = Path.ChangeExtension(name, GetExtFromFormatId(format)); var entry = FormatCatalog.Instance.Create <MgsEntry> (name); entry.Format = format; if (0 == format) { entry.Channels = file.View.ReadUInt16(index_offset + 1); entry.SamplesPerSecond = file.View.ReadUInt32(index_offset + 3); entry.BitsPerSample = file.View.ReadUInt16(index_offset + 7); } index_offset += 10 + name_size; entry.Size = file.View.ReadUInt32(index_offset); entry.Offset = file.View.ReadUInt32(index_offset + 4); if (!entry.CheckPlacement(file.MaxOffset)) { return(null); } dir.Add(entry); index_offset += 8; } return(new ArcFile(file, this, dir)); }