internal Timeline(BinaryReaderEx br, MQBVersion version, Dictionary <long, Disposition> disposesByOffset) { long disposOffsetsOffset = br.ReadVarint(); int disposCount = br.ReadInt32(); if (version == MQBVersion.DarkSouls2Scholar) { br.AssertInt32(0); } long customDataOffset = br.ReadVarint(); int customDataCount = br.ReadInt32(); Unk10 = br.ReadInt32(); Dispositions = new List <Disposition>(disposCount); long[] disposOffsets = br.GetVarints(disposOffsetsOffset, disposCount); foreach (long disposOffset in disposOffsets) { Dispositions.Add(disposesByOffset[disposOffset]); disposesByOffset.Remove(disposOffset); } br.StepIn(customDataOffset); { CustomData = new List <CustomData>(customDataCount); for (int i = 0; i < customDataCount; i++) { CustomData.Add(new MQB.CustomData(br)); } } br.StepOut(); }
internal void Write(BinaryWriterEx bw, MQBVersion version, Dictionary <Disposition, long> offsetsByDispos, int cutIndex, List <CustomData> allCustomData, List <long> customDataValueOffsets) { int disposCount = Timelines.Sum(g => g.Dispositions.Count); bw.WriteFixStrW(Name, 0x40, 0x00); bw.WriteInt32(disposCount); bw.WriteInt32(Unk44); bw.WriteInt32(Duration); bw.WriteInt32(0); bw.WriteInt32(Timelines.Count); if (version == MQBVersion.DarkSouls2Scholar) { bw.WriteInt32(0); } bw.ReserveVarint($"TimelinesOffset{cutIndex}"); if (version != MQBVersion.DarkSouls2Scholar) { bw.WriteInt64(0); } foreach (Timeline timeline in Timelines) { timeline.WriteDispositions(bw, offsetsByDispos, allCustomData, customDataValueOffsets); } }
internal void WriteTimelines(BinaryWriterEx bw, MQBVersion version, int cutIndex) { bw.FillVarint($"TimelinesOffset{cutIndex}", bw.Position); for (int i = 0; i < Timelines.Count; i++) { Timelines[i].Write(bw, version, cutIndex, i); } }
internal void Write(BinaryWriterEx bw, MQBVersion version, int cutIndex, int timelineIndex) { bw.ReserveVarint($"DisposOffsetsOffset[{cutIndex}:{timelineIndex}]"); bw.WriteInt32(Dispositions.Count); if (version == MQBVersion.DarkSouls2Scholar) { bw.WriteInt32(0); } bw.ReserveVarint($"TimelineCustomDataOffset[{cutIndex}:{timelineIndex}]"); bw.WriteInt32(CustomData.Count); bw.WriteInt32(Unk10); }
internal Cut(BinaryReaderEx br, MQBVersion version) { Name = br.ReadFixStrW(0x40); int disposCount = br.ReadInt32(); Unk44 = br.ReadInt32(); Duration = br.ReadInt32(); br.AssertInt32(0); int timelineCount = br.ReadInt32(); if (version == MQBVersion.DarkSouls2Scholar) { br.AssertInt32(0); } long timelinesOffset = br.ReadVarint(); if (version != MQBVersion.DarkSouls2Scholar) { br.AssertInt64(0); } var disposesByOffset = new Dictionary <long, Disposition>(disposCount); for (int i = 0; i < disposCount; i++) { disposesByOffset[br.Position] = new Disposition(br); } br.StepIn(timelinesOffset); { Timelines = new List <Timeline>(timelineCount); for (int i = 0; i < timelineCount; i++) { Timelines.Add(new Timeline(br, version, disposesByOffset)); } } br.StepOut(); }