internal override void ReadData(AwesomeReader ar) { Entries.Clear(); Version = ar.ReadInt32(); long nextString = ar.BaseStream.Position + 256; PackageName = ar.ReadNullString(); ar.BaseStream.Position = nextString; int count = ar.ReadInt32(); // # of strings // Offset - Always 4 ar.BaseStream.Position += 4; nextString = ar.BaseStream.Position; for (int i = 0; i < count; i++) { ar.BaseStream.Position = nextString; // Reads string Entries.Add(ar.ReadNullString()); nextString += 256; } }
internal override void ReadData(AwesomeReader ar) { Events.Clear(); ar.BaseStream.Position += 8; // Skips constants int count = ar.ReadInt32(); ar.BaseStream.Position += 4; for (int i = 0; i < count; i++) { // Reads vox entry (32 bytes) VoxEntry ev = new VoxEntry(); ev.Start = ar.ReadSingle(); ev.End = ar.ReadSingle(); ev.Pitch = ar.ReadInt24() & 0xFF; ev.PitchAlt = ar.ReadByte(); ar.BaseStream.Position += 4; // Always 0 ev.Lyric = ar.ReadUInt64(); ev.NoteType = (VoxNote)ar.ReadInt32(); ar.BaseStream.Position += 4; // Always 0 Events.Add(ev); } }
public override void ReadFromStream(AwesomeReader ar, ISerializable data) { var draw = data as Draw; int version = ReadMagic(ar, data); draw.Showing = ar.ReadBoolean(); if (version < 3) { var drawableCount = ar.ReadInt32(); draw.Drawables.Clear(); draw.Drawables.AddRange(RepeatFor(drawableCount, () => ar.ReadString())); } draw.Boundry = new Sphere() { X = ar.ReadSingle(), Y = ar.ReadSingle(), Z = ar.ReadSingle(), Radius = ar.ReadSingle() }; if (version == 3) { // Should always be 0 ar.BaseStream.Position += 4; } else if (version >= 4) { // Should always be 0'd data ar.BaseStream.Position += 8; } }
public override void ReadFromStream(AwesomeReader ar, ISerializable data) { var cam = data as Cam; int version = ReadMagic(ar, data); MiloSerializer.ReadFromStream(ar.BaseStream, cam.Trans); MiloSerializer.ReadFromStream(ar.BaseStream, cam.Draw); cam.NearPlane = ar.ReadSingle(); cam.FarPlane = ar.ReadSingle(); cam.FOV = ar.ReadSingle(); // Read screen area cam.ScreenArea = new Rectangle() { X = ar.ReadSingle(), Y = ar.ReadSingle(), Width = ar.ReadSingle(), Height = ar.ReadSingle() }; // Read z-range cam.ZRange = new Vector2() { X = ar.ReadSingle(), Y = ar.ReadSingle() }; cam.TargetTexture = ar.ReadString(); }
protected override void ImportData(AwesomeReader ar) { ar.ReadInt32(); // Always 8 ar.ReadInt32(); // Size of each VoxEntry (32 bytes) int count = ar.ReadInt32(); ar.ReadInt32(); // Offset to entries (Always 4) for (int i = 0; i < count; i++) { // Reads vox entry (32 bytes) VoxEntry entry = new VoxEntry(); entry.Start = ar.ReadSingle(); entry.End = ar.ReadSingle(); ar.ReadInt16(); // 2 zero'd bytes entry.Pitch = (sbyte)ar.ReadByte(); entry.SecondaryPitch = (sbyte)ar.ReadByte(); ar.ReadInt32(); // Always 0 entry.Lyric = ar.ReadInt64(); entry.NoteType = ar.ReadInt32(); ar.ReadInt32(); // Always 0 Entries.Add(entry); } }
protected override void ImportData(AwesomeReader ar) { // Reads audio path ar.BaseStream.Position += 8; ExternalPath = ar.ReadInt64(); ar.BaseStream.Position += 8; }
public override void ReadFromStream(AwesomeReader ar, ISerializable data) { var anim = data as Anim; int version = ReadMagic(ar, data); if (version >= 4) { // Skips anim rate + unknown ar.BaseStream.Position += 8; return; } // Read anim entries int count = ar.ReadInt32(); anim.AnimEntries.Clear(); anim.AnimEntries.AddRange( RepeatFor(count, () => new AnimEntry() { Name = ar.ReadString(), F1 = ar.ReadSingle(), F2 = ar.ReadSingle() })); // Read animatable strings count = ar.ReadInt32(); anim.Animatables.Clear(); anim.Animatables.AddRange( RepeatFor(count, () => ar.ReadString())); }
public override void ReadFromStream(AwesomeReader ar, ISerializable data) { var env = data as Environ; int version = ReadMagic(ar, data); MiloSerializer.ReadFromStream(ar.BaseStream, env.Draw); // Read lights var lightCount = ar.ReadInt32(); env.Lights.Clear(); env.Lights.AddRange(RepeatFor(lightCount, () => ar.ReadString())); env.AmbientColor = new Color4() { R = ar.ReadSingle(), G = ar.ReadSingle(), B = ar.ReadSingle(), A = ar.ReadSingle() }; env.FogStart = ar.ReadSingle(); env.FogEnd = ar.ReadSingle(); env.FogColor = new Color4() { R = ar.ReadSingle(), G = ar.ReadSingle(), B = ar.ReadSingle(), A = ar.ReadSingle() }; env.EnableFog = ar.ReadBoolean(); }
public MiloMeta ReadMeta(AwesomeReader ar) { var meta = new MiloMeta(); if (MiloSerializer.Info.Version <= 10) { return(meta); } meta.Revision = ar.ReadInt32(); meta.ScriptName = ar.ReadString(); var hasDtb = ar.ReadBoolean(); if (hasDtb) { ar.BaseStream.Position -= 1; meta.Script = DTBFile.FromStream(ar, DTBEncoding.Classic); // TODO: Support encodings for post-RB3 and pre-GH1 games? } if (MiloSerializer.Info.Platform != Platform.PS2) { // Extra meta meta.Comments = ar.ReadString(); } return(meta); }
internal static InstrumentTuning ReadData(AwesomeReader ar) { InstrumentTuning tuning = new InstrumentTuning(); // 40 bytes tuning.Name = ar.ReadUInt64(); tuning.String1 = ar.ReadInt24() & 0xFF; tuning.String1Alt = ar.ReadByte(); tuning.String2 = ar.ReadInt24() & 0xFF; tuning.String2Alt = ar.ReadByte(); tuning.String3 = ar.ReadInt24() & 0xFF; tuning.String3Alt = ar.ReadByte(); tuning.String4 = ar.ReadInt24() & 0xFF; tuning.String4Alt = ar.ReadByte(); tuning.String5 = ar.ReadInt24() & 0xFF; tuning.String5Alt = ar.ReadByte(); tuning.String6 = ar.ReadInt24() & 0xFF; tuning.String6Alt = ar.ReadByte(); tuning.String7 = ar.ReadInt24() & 0xFF; tuning.String7Alt = ar.ReadByte(); tuning.String8 = ar.ReadInt24() & 0xFF; tuning.String8Alt = ar.ReadByte(); return(tuning); }
protected override void ImportData(AwesomeReader ar) { Version = ar.ReadInt32(); // 1100024 long nextString = ar.BaseStream.Position + 256; PackageName = ar.ReadNullString(); // "DLC0024" ar.BaseStream.Position = nextString; int count = ar.ReadInt32(); // # of strings // Offset - Always 4 int offset = ar.ReadInt32(); nextString = ar.BaseStream.Position + (offset - 4); Entries = new List <string>(); for (int i = 0; i < count; i++) { ar.BaseStream.Position = nextString; // Reads string Entries.Add(ar.ReadNullString()); nextString += 256; } }
private static Mub FromStream(Stream stream) { AwesomeReader ar = new AwesomeReader(stream, true); Mub mub = new Mub(); mub.Version = ar.ReadInt32(); ar.BaseStream.Position += 4; // CRC-32 hash int entryCount = ar.ReadInt32(), entrySize = entryCount * 16; int blobSize = ar.ReadInt32(); long startOffset = ar.BaseStream.Position; // Reads in strings ar.BaseStream.Seek(entrySize, SeekOrigin.Current); var stringBlob = ar.ReadBytes(blobSize); Dictionary <long, string> words = ParseBlob(stringBlob, entrySize); ar.BaseStream.Seek(startOffset, SeekOrigin.Begin); // Reads entries for (int i = 0; i < entryCount; i++) { float start = ar.ReadSingle(); int mod = ar.ReadInt32(); float length = ar.ReadSingle(); int data = ar.ReadInt32(); mub.Entries.Add(new MubEntry(start, mod, length, data, data > 0 && words.ContainsKey(data) ? words[data] : "")); } return(mub); }
public static Trans FromStream(Stream input) { using (AwesomeReader ar = new AwesomeReader(input)) { int version; bool valid; Trans trans = new Trans(""); // Guesses endianess ar.BigEndian = DetermineEndianess(ar.ReadBytes(4), out version, out valid); if (!valid) { return(null); // Probably do something else later } ar.BaseStream.Position += 9; // Should all be 0 // Reads in matrix tables trans._mat1 = Matrix.FromStream(ar); trans._mat2 = Matrix.FromStream(ar); // TODO: Parse other stuff return(trans); } }
protected override void ImportData(AwesomeReader ar) { BaseDirectory = ar.ReadInt64(); // songs.Halestorm.LoveBites TableLanguage = (Language)ar.ReadInt64(); ar.BaseStream.Position += 8; // Skips zeros Dictionary <long, string> dic = new Dictionary <long, string>(); int count = ar.ReadInt32(); ar.BaseStream.Position += 12; // Skips to entries long difference = ar.BaseStream.Position + (count * 16); long[] key = new long[count]; long[] offset = new long[count]; for (int i = 0; i < count; i++) { key[i] = ar.ReadInt64(); offset[i] = ar.ReadInt32(); ar.ReadInt32(); // Should be zero } for (int i = 0; i < count; i++) { ar.BaseStream.Position = offset[i] + difference; string text = ar.ReadNullString(); if (!dic.ContainsKey(key[i])) { dic.Add(key[i], text); continue; } // Evidently the same string with different casings will have the same key (only for directory paths?) if (string.Compare(dic[key[i]], text, true) == 0) { dic.Remove(key[i]); dic.Add(key[i], text); } else { Console.WriteLine("STRING ERROR: {0} != {1}", dic[key[i]], text); //subDictionary.Add(key[i], text); } } Strings = new List <FString>(); foreach (var d in dic) { // Finds/adds key string globally StringKey sk = StringKey.FindCreate(d.Key); sk.SetValue(d.Value, TableLanguage); // Adds string to string table collection (And adds globally) StringKey.AddString(sk); Strings.Add(sk.Key); } }
private static int GetChunkType(AwesomeReader ar) { int type = ar.ReadInt32(); ar.BaseStream.Position += 4; // Skips size return(type); }
private static string[] ParseRow(AwesomeReader ar, AwesomeReader strStream) { var count = ar.ReadInt32(); return(Enumerable.Range(0, count) .Select(x => GetStringValue(strStream, ar.ReadInt32())) .ToArray()); }
private void ReadGH2Material(AwesomeReader ar, Mat mat, int version) { // TODO: Better figure out GH2 material structure var num = ar.ReadInt32(); switch (num) { case 0: case 1: case 2: case 3: case 4: case 5: break; default: throw new Exception($"Unexpected number, got {num}"); } mat.BaseColor = new Color4() { R = ar.ReadSingle(), G = ar.ReadSingle(), B = ar.ReadSingle(), A = ar.ReadSingle() }; var alwaysT = ar.ReadBoolean(); var alwaysF = ar.ReadBoolean(); var textureCount = ar.ReadInt32(); // Should always be 1 mat.TextureEntries.Clear(); mat.TextureEntries.AddRange(RepeatFor(1, () => { ar.BaseStream.Position += 2; if (version >= 55) { // Skip unknown data ar.BaseStream.Position += 4; } var texEntry = new TextureEntry() { Unknown1 = ar.ReadInt32(), Unknown2 = ar.ReadInt32(), Mat = ReadMatrix(ar), Unknown3 = 0, Texture = ar.ReadString() }; // TODO: Read normal, specular, environment return(texEntry); })); }
private static ArkFile ParseArkHeader(string input, Stream stream) { ArkFile ark = new ArkFile(); ark._encrypted = false; ark._xor = false; ark._arkPaths = new[] { Path.GetFullPath(input) }; using var ar = new AwesomeReader(stream); // Checks version int version = ar.ReadInt32(); if (!Enum.IsDefined(typeof(ArkVersion), version)) { throw new NotSupportedException($"Unsupported ark version 0x{version:X8}"); } ark._version = (ArkVersion)version; // Skip entries and come back later var entryOffset = ar.BaseStream.Position; var entryCount = ar.ReadInt32(); ar.BaseStream.Seek(entryCount * 20, SeekOrigin.Current); // Read string blob + string indicies var strings = ReadStringBlob(ar); int[] stringIndex = ReadStringIndicies(ar); // Read entries ar.BaseStream.Seek(entryOffset + 4, SeekOrigin.Begin); for (int i = 0; i < entryCount; i++) { uint offset = ar.ReadUInt32(); int fileIdx = ar.ReadInt32(); int dirIdx = ar.ReadInt32(); string filePath = (fileIdx >= 0) ? strings[stringIndex[fileIdx]] : ""; string direPath = (dirIdx >= 0) ? strings[stringIndex[dirIdx]] : ""; uint size = ar.ReadUInt32(); uint inflatedSize = ar.ReadUInt32(); ark._offsetEntries.Add(new OffsetArkEntry(offset, filePath, direPath, size, inflatedSize, 0, offset)); } return(ark); }
public static DTBFile FromFile(string path, DTBEncoding encoding) { using (FileStream fs = File.OpenRead(path)) { using (AwesomeReader ar = new AwesomeReader(fs)) { return(FromStream(ar, encoding)); } } }
internal override void ReadData(AwesomeReader ar) { _strings.Clear(); int count = ar.ReadInt32(); ar.BaseStream.Position += 12; // Skips to entries long stringTableOffset = ar.BaseStream.Position + (count * 16); ulong[] key = new ulong[count]; long[] offset = new long[count]; for (int i = 0; i < count; i++) { key[i] = ar.ReadUInt64(); offset[i] = ar.ReadInt32(); ar.BaseStream.Position += 4; // Should be zero } for (int i = 0; i < count; i++) { ar.BaseStream.Position = offset[i] + stringTableOffset; string text = ar.ReadNullString(); if (!_strings.ContainsKey(key[i])) { _strings.Add(key[i], text); continue; } // Evidently the same string with different casings will have the same key (only for directory paths?) if (string.Compare(_strings[key[i]], text, true) == 0) { _strings.Remove(key[i]); _strings.Add(key[i], text); } else { throw new Exception($"STRING ERROR: {_strings[key[i]]} != {text}"); } } foreach (var d in _strings) { // Updates global string value StringKey.UpdateValue(d.Key, d.Value, _localization); } // English localization is missing directory path entry if (Localization == Localization.Japanese) { StringKey.UpdateValue(DirectoryPath.Key, _strings[DirectoryPath.Key], Localization.English); } }
private static Chunk ReadFromStream(Stream stream) { Chunk chunk = new Chunk(); AwesomeReader ar = new AwesomeReader(stream, true); if (ar.ReadUInt32() != CHNK_MAGIC) { return(chunk); } ar.BaseStream.Position += 4; // Always 255? int blockCount = ar.ReadInt32(); ar.BaseStream.Position += 8; // Skips 1, 2 (16-bits) int[] blockSize = new int[blockCount]; bool[] compressed = new bool[blockCount]; // Uncompressed by default // Reads block details for (int i = 0; i < blockCount; i++) { blockSize[i] = ar.ReadInt32(); ar.BaseStream.Position += 4; // Decompressed size (Not needed) // Sets as compressed if it meets the requirement compressed[i] = ar.ReadInt32() == 0x1000000; ar.BaseStream.Position += 4; // Offset (Not needed) } for (int i = 0; i < blockCount; i++) { // Reads block bytes byte[] block = ar.ReadBytes(blockSize[i]); // Decompresses if needed if (block.Length > 0 && compressed[i]) { block = Compression.InflateBlock(block, CompressionType.ZLIB); blockSize[i] = block.Length; } chunk.Entries.Add(new ChunkEntry() { Data = block, Compressed = false }); // TODO: Write blocks to stream, and parse internal file system instead // ms.Write(block, 0, block.Length); } return(chunk); }
protected MiloObjectDirEntry ParseWorldDir(AwesomeReader ar, MiloObjectDir dir) { // Read past unknown stuff, big hack int unk1 = ar.ReadInt32(); int unk2 = ar.ReadInt32(); float unk3 = ar.ReadSingle(); string unk4 = ar.ReadString(); int unk5 = ar.ReadInt32(); int unk6 = ar.ReadInt32(); // Hack for project 9 var dirEntry = new MiloObjectDirEntry() { Name = dir.Name }; dirEntry.Version = ar.ReadInt32(); dirEntry.SubVersion = ar.ReadInt32(); dirEntry.ProjectName = ar.ReadString(); // Skip matrices + constants var matCount = ar.ReadInt32(); // Usually 7 ar.BaseStream.Position += (matCount * 48) + 9; // Read imported milos var importedMiloCount = ar.ReadInt32(); dirEntry.ImportedMiloPaths = Enumerable.Range(0, importedMiloCount) .Select(x => ar.ReadString()) .ToArray(); // Boolean, true when sub directory? ar.ReadBoolean(); // Sub directory names seem to be in reverse order of serialization... var subDirCount = ar.ReadInt32(); var subDirNames = Enumerable.Range(0, subDirCount) .Select(x => ar.ReadString()) .ToArray(); // Read subdirectories foreach (var _ in subDirNames.Reverse()) { var subDir = new MiloObjectDir(); ReadFromStream(ar, subDir); dirEntry.SubDirectories.Add(subDir); } ar.BaseStream.Position += 17; // 0'd data + ADDE return(dirEntry); }
internal override void ReadData(AwesomeReader ar) { Pedals.Clear(); Processors.Clear(); AmpPath = ar.ReadUInt64(); GainLevel = ar.ReadSingle(); BassLevel = ar.ReadSingle(); MidLevel = ar.ReadSingle(); TrebleLevel = ar.ReadSingle(); ReverbLevel = ar.ReadSingle(); VolumeLevel = ar.ReadSingle(); AmpReverb = ar.ReadUInt64(); int pedalCount = ar.ReadInt32(); ar.BaseStream.Position += 4; int processorCount = ar.ReadInt32(); ar.BaseStream.Position += 4; // Reads pedals for (int i = 0; i < pedalCount; i++) { Pedal pedal = new Pedal(); pedal.ModelPath = ar.ReadUInt64(); pedal.Flag1 = ar.ReadBoolean(); pedal.Flag2 = ar.ReadBoolean(); pedal.Flag3 = ar.ReadBoolean(); pedal.Flag4 = ar.ReadBoolean(); pedal.Knob1 = ar.ReadSingle(); pedal.Knob2 = ar.ReadSingle(); pedal.Knob3 = ar.ReadSingle(); Pedals.Add(pedal); } // Reads audio processors for (int i = 0; i < processorCount; i++) { AudioProcessor processor = new AudioProcessor(); processor.ModelPath = ar.ReadUInt64(); processor.Knob1 = ar.ReadSingle(); processor.Knob2 = ar.ReadSingle(); Processors.Add(processor); } }
protected override void ImportData(AwesomeReader ar) { int count = ar.ReadInt32(); ar.ReadInt32(); // Always 4 // Reads all fstring entries for (int i = 0; i < count; i++) { FString fstring = new FString(ar.ReadInt64()); Entries.Add(fstring); } }
public void ReadFromStream(Stream stream, ISerializable data) { var serializer = Serializers.FirstOrDefault(x => x.IsOfType(data)); if (serializer == null) { throw new NotImplementedException($"Deserialization of {data.GetType().Name} is not supported yet!"); } var ar = new AwesomeReader(stream, Info.BigEndian); serializer.ReadFromStream(ar, data); }
internal override void ReadData(AwesomeReader ar) { Entries.Clear(); int count = ar.ReadInt32(); ar.BaseStream.Position += 4; // Offset is always 4 // Reads entries for (int i = 0; i < count; i++) { Entries.Add(ar.ReadUInt64()); } }
protected override void ImportData(AwesomeReader ar) { int count = ar.ReadInt32(); ar.ReadInt32(); // Offset to entries (Always 4) for (int i = 0; i < count; i++) { // Reads each entry Catalog2Entry entry = new Catalog2Entry(); entry.ImportData(ar); Entries.Add(entry); } }
protected MiloObject ParseDirEntryAsBlob(AwesomeReader ar, MiloObjectDir dir, string dirType) { // Reads data as a byte array var entrySize = GuessEntrySize(ar); var entryBytes = new MiloObjectBytes(dirType) { Name = dir.Name }; entryBytes.Data = ar.ReadBytes((int)entrySize); ar.BaseStream.Position += 4; return(entryBytes); }
/// <summary> /// Parse chunk data from riff file /// </summary> /// <param name="input">Riff stream</param> private void ParseRiff(Stream input) { using (AwesomeReader ar = new AwesomeReader(input)) { // Checks for "RIFF" magic. switch (ar.ReadInt32()) { case Constant.RIFF_R: // "FFIR" ar.BigEndian = true; break; case Constant.RIFF: // Reader is already little endian by default. break; default: throw new Exception("Invalid magic. Expected \"RIFF\""); } BigEndian = ar.BigEndian; // Sets endianess int size = ar.ReadInt32(); Chunk headChunk = Chunk.FromStream(ar); if (headChunk == null || !(headChunk is Index)) { throw new Exception("Could not find index chunk"); } foreach (IndexEntry entry in ((Index)headChunk).Entries) { ar.BaseStream.Position = entry.Offset; // Goes to chunk offset // Reads chunk // - If it was a string table then all values will be added to global strings Chunk chunk = Chunk.FromStream(ar); if (chunk != null && chunk is ZObject) { // Adds object to riff collection Objects.Add(chunk as ZObject); } else if (chunk != null && chunk is StringTable) { // Adds table to riff collection Tables.Add(chunk as StringTable); } } } }
protected override void ImportData(AwesomeReader ar) { InstrumentType = ar.ReadInt64(); Difficulty = ar.ReadInt64(); ar.ReadInt64(); // Should be zero'd TuningName = ar.ReadInt64(); // Reads 1st string info. ar.ReadInt16(); RealTuning1 = ar.ReadByte(); OffsetTuning1 = ar.ReadByte(); // Reads 2nd string info. ar.ReadInt16(); RealTuning2 = ar.ReadByte(); OffsetTuning2 = ar.ReadByte(); // Reads 3rd string info. ar.ReadInt16(); RealTuning3 = ar.ReadByte(); OffsetTuning3 = ar.ReadByte(); // Reads 4th string info. ar.ReadInt16(); RealTuning4 = ar.ReadByte(); OffsetTuning4 = ar.ReadByte(); // Reads 5th string info. ar.ReadInt16(); RealTuning5 = ar.ReadByte(); OffsetTuning5 = ar.ReadByte(); // Reads 6th string info. ar.ReadInt16(); RealTuning6 = ar.ReadByte(); OffsetTuning6 = ar.ReadByte(); ar.ReadInt64(); // Should be zero'd int count = ar.ReadInt32(); int offset = ar.ReadInt32(); long previousPosition = ar.BaseStream.Position; // Reads entry paths. ar.BaseStream.Position += offset - 4; for (int i = 0; i < count; i++) { EntryPaths.Add(ar.ReadInt64()); } }