private void ReadUnnamed(Dictionary <int, byte[][]> data) { int index = 0; foreach (var el in data) { if (!MainFileList.Contains(el.Key)) { foreach (var a in el.Value) { //throw new Exception("PM1: Unknown"); string name = $"Noname({index.ToString().PadLeft(2, '0')}).DAT"; while (SubFiles.Exists(x => x.Name == name)) { index++; name = $"Noname({index.ToString().PadLeft(2, '0')}).DAT"; } var temp = GameFormatHelper.OpenFile(name, a, FormatEnum.DAT); temp.Tag = new object[] { el.Key }; SubFiles.Add(temp); } } } }
private void Read(StreamPart streamFile, string name) { GetType(streamFile); int index = 0; streamFile.Stream.Position = streamFile.Position; using (BinaryReader reader = IOTools.OpenReadFile(streamFile.Stream, IsLittleEndian)) do { int Size = reader.ReadInt32(); if (streamFile.Position + streamFile.Size < Size + streamFile.Stream.Position) { throw new Exception("TBL error"); } byte[] tempdata = reader.ReadBytes(Size); FormatEnum fileType = GameFormatHelper.GetFormat(tempdata); string ext = Path.GetExtension(name); string tempName = name.Substring(0, name.Length - ext.Length) + "(" + index++.ToString().PadLeft(2, '0') + ")"; if (fileType == FormatEnum.Unknown) { tempName += ".DAT"; } else { tempName += "." + fileType.ToString(); } SubFiles.Add(GameFormatHelper.OpenFile(tempName, tempdata, fileType == FormatEnum.Unknown ? FormatEnum.DAT : fileType)); reader.BaseStream.Position += IOTools.Alignment(reader.BaseStream.Position - streamFile.Position, 16); } while (streamFile.Stream.Position < streamFile.Position + streamFile.Size); }
/// <summary> /// 派生ファイルを追加してロードを開始させる /// </summary> public void LoadAndAddSubFile(string path) { if (!SubFiles.ContainsKey(path)) { AssetFile file = AssetFileManager.Load(path, this.Version, this); SubFiles.Add(path, file); } }
private void ReadBMD(BinaryReader reader, string[] names, int[] bmd) { reader.BaseStream.Position = bmd[3]; var returned = Utilities.PersonaFile.OpenFile(names[0], reader.ReadBytes(bmd[1]), FileType.BMD); returned.Tag = new object[] { bmd[0] }; SubFiles.Add(returned); }
private void ReadRMD(BinaryReader reader, string[] names, int[] rmdhead) { reader.BaseStream.Position = rmdhead[3]; int[][] RMD = reader.ReadInt32ArrayArray(rmdhead[2], 8); for (int i = 0; i < RMD.Length; i++) { reader.BaseStream.Position = RMD[i][4]; var returned = Utilities.PersonaFile.OpenFile(names[i], reader.ReadBytes(RMD[i][5]), FileType.DAT); returned.Tag = new object[] { (int)TypeMap.RMD, RMD[i] }; SubFiles.Add(returned); } }
/// <summary> /// 派生ファイルを追加してロードを開始させる /// </summary> public void LoadAndAddSubFile(string path) { if (!SubFiles.ContainsKey(path)) { if (IsDownloadOnly) { AssetFile file = AssetFileManager.GetFileCreateIfMissing(path); file.Version = this.Version; AssetFileManager.Download(file); } else { SubFiles.Add(path, AssetFileManager.Load(path, this.Version, this)); } } }
private void ReadEPL(BinaryReader reader, string[] names, int[] eplhead, int[] epl) { reader.BaseStream.Position = eplhead[3]; int[][] eplpos = reader.ReadInt32ArrayArray(eplhead[2], 4); reader.BaseStream.Position = epl[3]; byte[] EPL = reader.ReadBytes(epl[1]); var splited = Utilities.Array.SplitArray(EPL, eplpos.Select(x => x[1] - epl[3]).ToArray()); for (int i = 0; i < splited.Count; i++) { var returned = Utilities.PersonaFile.OpenFile(names[i], splited[i], FileType.DAT); returned.Tag = new object[] { (int)TypeMap.EPL, eplpos[i] }; SubFiles.Add(returned); } }
private void Open(Stream stream) { stream.Position = 0x10; if (stream.ReadByte() == 0) { IsLittleEndian = false; } else { IsLittleEndian = true; } stream.Position = 0x10; BinaryReader reader = Utilities.IO.OpenReadFile(stream, IsLittleEndian); int tablecount = reader.ReadInt32(); Unknown = reader.ReadBytes(12); stream.Position = 0x20; Table = reader.ReadInt32ArrayArray(tablecount, 4); foreach (var element in Table) { if (element[1] * element[2] > 0) { reader.BaseStream.Position = element[3]; string tempN; FileType type = MAP[element[0]]; tempN = "." + type.ToString(); byte[] data = reader.ReadBytes(element[1] * element[2]); var item = Utilities.PersonaFile.OpenFile(tempN, data, type); if (item.Object == null) { item = Utilities.PersonaFile.OpenFile(tempN, data, FileType.DAT); } item.Tag = element[0]; SubFiles.Add(item); } } }
private void ReadTexture(StreamFile streamFile, int pos, int count) { streamFile.Stream.Position = streamFile.Position + pos; using (BinaryReader reader = new BinaryReader(streamFile.Stream, Encoding.ASCII, true)) for (int i = 0; i < count; i++) { streamFile.Stream.Position += 8; long texPos = reader.ReadUInt32(); int texSize = reader.ReadInt32(); streamFile.Stream.Position += 16; string name = Encoding.ASCII.GetString(reader.ReadBytes(16)).TrimEnd('\0'); long tempPos = streamFile.Stream.Position; streamFile.Stream.Position = texPos; SubFiles.Add(Utilities.PersonaFile.OpenFile(name + ".dds", reader.ReadBytes(texSize), Interfaces.FileType.DDS)); streamFile.Stream.Position = tempPos; } }
public override void LoadFromXml(XmlElement xml) { base.LoadFromXml(xml); var fsx = xml.FindElement("FileSystem"); if (fsx != null) { var fs = (IVirtualFileSystem)VirtualFileSystemAddonType.Instance.LoadAddon(fsx); var px = xml.FindElement("Path"); if (px != null) { File = fs.GetFile(px.InnerText); } foreach (XmlElement x in xml.SelectNodes("SubFile")) { SubFiles.Add(fs.GetFile(x.InnerText)); } } }
private void Open(byte[] data) { using (BinaryReader reader = IOTools.OpenReadFile(new MemoryStream(data), IsLittleEndian)) { List <int[]> Entry = new List <int[]>(); do { Entry.Add(reader.ReadInt32Array(3)); } while (Entry[Entry.Count - 1][1] != 0); for (int i = 0; i < Entry.Count - 1; i++) { FlagList.Add(Entry[i][0]); reader.BaseStream.Position = Entry[i][1]; string name = Path.GetFileNameWithoutExtension(Name) + "(" + i.ToString().PadLeft(3, '0') + ").BMD"; SubFiles.Add(GameFormatHelper.OpenFile(name, reader.ReadBytes(Entry[i][2]), FormatEnum.BMD)); } } }
private void Open(BinaryReader reader) { Header = new SPRHeader(reader); for (int i = 0; i < Header.TextureCount; i++) { reader.ReadUInt32(); TextureOffsetList.Add(reader.ReadInt32()); } for (int i = 0; i < Header.KeyFrameCount; i++) { reader.ReadUInt32(); KeyOffsetList.Add(reader.ReadInt32()); } KeyList = new SPRKeyList(reader, Header.KeyFrameCount); foreach (var a in TextureOffsetList) { var tmx = new Graphic.TMX(reader.BaseStream, a); SubFiles.Add(new ObjectFile(tmx.Name, tmx)); } }
private void Open(BinaryReader reader) { Header = new SPRHeader(reader); for (int i = 0; i < Header.TextureCount; i++) { reader.ReadUInt32(); TextureOffsetList.Add(reader.ReadInt32()); } for (int i = 0; i < Header.KeyFrameCount; i++) { reader.ReadUInt32(); KeyOffsetList.Add(reader.ReadInt32()); } KeyList = new SPRKeyList(reader, Header.KeyFrameCount); foreach (var a in TextureOffsetList) { var tmx = new Sprite.TMX(new StreamPart(reader.BaseStream, -1, a)); SubFiles.Add(new GameFile(tmx.Comment + ".tmx", tmx)); } }
private void ReadTexture(StreamPart streamFile, int pos, int count) { streamFile.Stream.Position = streamFile.Position + pos; using (BinaryReader reader = new BinaryReader(streamFile.Stream, Encoding.ASCII, true)) for (int i = 0; i < count; i++) { int tag = reader.ReadInt32(); streamFile.Stream.Position += 4; long texPos = reader.ReadUInt32(); int texSize = reader.ReadInt32(); streamFile.Stream.Position += 16; string name = Encoding.ASCII.GetString(reader.ReadBytes(16)).TrimEnd('\0'); long tempPos = streamFile.Stream.Position; streamFile.Stream.Position = texPos; var text = GameFormatHelper.OpenFile(name + ".dds", reader.ReadBytes(texSize), FormatEnum.DDS); text.Tag = tag; SubFiles.Add(text); streamFile.Stream.Position = tempPos; } }
private void ReadNamed(Dictionary <int, byte[][]> data) { string[] fileNameList = new string[0]; int fileNameIndex = 0; void ReadSingleFile(TypeMap typeMap) { if (data[(int)typeMap].Length > 1) { throw new Exception($"PM1 Read: {typeMap.ToString()}'s count more than 1"); } string name = fileNameList[fileNameIndex++]; var singleFile = GameFormatHelper.OpenFile(name, data[(int)typeMap][0], GameFormatHelper.GetFormat(name)); if (singleFile == null) { singleFile = GameFormatHelper.OpenFile(name, data[(int)typeMap][0], FormatEnum.DAT); } singleFile.Tag = new object[] { (int)typeMap }; SubFiles.Add(singleFile); } if (data.ContainsKey((int)TypeMap.FileList)) { fileNameList = data[(int)TypeMap.FileList].Select(x => Encoding.ASCII.GetString(x).TrimEnd('\0')).ToArray(); } else { foreach (var a in MainFileList) { if (data.ContainsKey(a)) { throw new Exception("PM1 Read: file contains named files"); } } } // Read T3 if (data.ContainsKey((int)TypeMap.T3)) { ReadSingleFile(TypeMap.T3); } // Read RMD if (data.ContainsKey((int)TypeMap.RMDHead)) { if (data.ContainsKey((int)TypeMap.RMD)) { if (data[(int)TypeMap.RMD].Length > 1) { throw new Exception("PM1 Read: RMD's count more than 1"); } using (BinaryReader RMDreader = IOTools.OpenReadFile(data[(int)TypeMap.RMD][0], IsLittleEndian)) { var rmdHeaders = data[(int)TypeMap.RMDHead] .Select(x => { using (BinaryReader BR = IOTools.OpenReadFile(x, IsLittleEndian)) return(BR.ReadInt32Array(8)); }) .ToArray(); for (int i = 0; i < rmdHeaders.Length; i++) { RMDreader.BaseStream.Position = rmdHeaders[i][4] - rmdHeaders[0][4]; var rmd = GameFormatHelper.OpenFile(fileNameList[fileNameIndex++], RMDreader.ReadBytes(rmdHeaders[i][5]), FormatEnum.DAT); rmd.Tag = new object[] { (int)TypeMap.RMD, rmdHeaders[i] }; SubFiles.Add(rmd); } } } else { throw new Exception("PM1 Read: file contain RMD Header, but not RMD"); } } // Read BMD if (data.ContainsKey((int)TypeMap.BMD)) { ReadSingleFile(TypeMap.BMD); } // Read EPL if (data.ContainsKey((int)TypeMap.EPLHead)) { if (data.ContainsKey((int)TypeMap.EPL)) { if (data[(int)TypeMap.EPL].Length > 1) { throw new Exception("PM1 Read: EPL's count more than 1"); } var eplHeaders = data[(int)TypeMap.EPLHead] .Select(x => { using (BinaryReader BR = IOTools.OpenReadFile(x, IsLittleEndian)) return(BR.ReadInt32Array(4)); }) .ToArray(); var eplList = data[(int)TypeMap.EPL][0].Split(eplHeaders.Select(x => x[1] - eplHeaders[0][1]).ToArray()).ToArray(); for (int i = 0; i < eplList.Length; i++) { var epl = GameFormatHelper.OpenFile(fileNameList[fileNameIndex++], eplList[i], FormatEnum.DAT); epl.Tag = new object[] { (int)TypeMap.EPL, eplHeaders[i] }; SubFiles.Add(epl); } } else { throw new Exception("PM1 Read: file contain EPL Header, but not EPL"); } } // Read TMX if (data.ContainsKey((int)TypeMap.TMXHead)) { if (data.ContainsKey((int)TypeMap.TMX)) { if (data[(int)TypeMap.TMX].Length > 1) { throw new Exception("PM1 Read: TMX's count more than 1"); } var tmxHeaders = data[(int)TypeMap.TMXHead] .Select(x => { using (BinaryReader BR = IOTools.OpenReadFile(x, IsLittleEndian)) return(BR.ReadInt32Array(4)); }) .ToArray(); var tmxList = data[(int)TypeMap.TMX][0].Split(tmxHeaders.Select(x => x[1] - tmxHeaders[0][1]).ToArray()).ToArray(); for (int i = 0; i < tmxList.Length; i++) { var name = fileNameList[fileNameIndex++]; var tmx = GameFormatHelper.OpenFile(name, tmxList[i], GameFormatHelper.GetFormat(name)); tmx.Tag = new object[] { (int)TypeMap.TMX, tmxHeaders[i] }; SubFiles.Add(tmx); } } else { throw new Exception("PM1 Read: file contain TMX Header, but not TMX"); } } // Read CTable if (data.ContainsKey((int)TypeMap.CTable)) { ReadSingleFile(TypeMap.CTable); } if (fileNameIndex != fileNameList.Length) { throw new Exception("PM1 Read: not all files are read"); } }
/// <summary> /// 派生ファイルを追加してロードを開始させる /// </summary> public virtual void LoadAndAddSubFile(string path) { AssetFile file = AssetFileManager.Load(path, this.Version, this); SubFiles.Add(path, file); }
private void Open(Stream stream) { stream.Position = 0x10; if (stream.ReadByte() == 0) { IsLittleEndian = false; } else { IsLittleEndian = true; } BinaryReader reader = IOTools.OpenReadFile(stream, IsLittleEndian); stream.Position = 0x4; int fileSize = reader.ReadInt32(); stream.Position = 0x10; int tablecount = reader.ReadInt32(); Unknown = reader.ReadBytes(12); stream.Position = 0x20; Table = reader.ReadInt32ArrayArray(tablecount, 4); Sizes = new int[Table.Length]; for (int i = 0; i < Table.Length; i++) { Sizes[i] = Table[i][1]; } foreach (var element in Table) { if (element[1] * element[2] > 0) { reader.BaseStream.Position = element[3]; string tempN; FormatEnum type = FormatEnum.DAT; if (MAP.ContainsKey(element[0])) { type = MAP[element[0]]; } tempN = "." + type.ToString(); if (fileSize == element[3] + element[1] * element[2]) { endIndex = element[0]; } byte[] data = reader.ReadBytes(element[1] * element[2]); var item = GameFormatHelper.OpenFile(tempN, data, type); if (item == null) { item = GameFormatHelper.OpenFile(tempN, data, FormatEnum.DAT); } item.Tag = element[0]; SubFiles.Add(item); } } if (endIndex == -1) { throw new Exception("BF: endIndex"); } }