internal override void GetNames(MSB1 msb, Entries entries) { base.GetNames(msb, entries); CollisionName = MSB.FindName(entries.Parts, CollisionIndex); MovePointNames = new string[MovePointIndices.Length]; for (int i = 0; i < MovePointIndices.Length; i++) { MovePointNames[i] = MSB.FindName(entries.Regions, MovePointIndices[i]); } }
internal virtual void GetIndices(Entries entries) { ActivationPartIndex = MSB.FindIndex(entries.Parts, ActivationPartName); if (Shape is MSB.Shape.Composite composite) { foreach (MSB.Shape.Composite.Child child in composite.Children) { child.GetIndices(entries); } } }
internal void GetIndices(Entries entries) { if (!entries.BoneNames.Any(bn => bn.Name == Name)) { entries.BoneNames.Add(new BoneName() { Name = Name }); } NameIndex = MSB.FindIndex(entries.BoneNames, Name); }
internal override void GetIndices(MSBD msb, Entries entries) { base.GetIndices(msb, entries); CollisionIndex = MSB.FindIndex(entries.Parts, CollisionName); MovePointIndices = new short[MovePointNames.Length]; for (int i = 0; i < MovePointNames.Length; i++) { MovePointIndices[i] = (short)MSB.FindIndex(entries.Regions, MovePointNames[i]); } }
/// <summary> /// Deserializes file data from a stream. /// </summary> protected override void Read(BinaryReaderEx br) { br.BigEndian = false; br.AssertASCII("MSB "); br.AssertInt32(1); br.AssertInt32(0x10); br.AssertBoolean(false); // isBigEndian br.AssertBoolean(false); // isBitBigEndian br.AssertByte(1); // textEncoding br.AssertByte(0xFF); // is64BitOffset Entries entries; Models = new ModelParam(); entries.Models = Models.Read(br); Events = new EventParam(); entries.Events = Events.Read(br); Regions = new PointParam(); entries.Regions = Regions.Read(br); Routes = new RouteParam(); entries.Routes = Routes.Read(br); Layers = new EmptyParam(0x23, "LAYER_PARAM_ST"); Layers.Read(br); Parts = new PartsParam(); entries.Parts = Parts.Read(br); PartsPoses = new EmptyParam(0, "MAPSTUDIO_PARTS_POSE_ST"); PartsPoses.Read(br); BoneNames = new EmptyParam(0, "MAPSTUDIO_BONE_NAME_STRING"); BoneNames.Read(br); if (br.Position != 0) { throw new InvalidDataException("The next param offset of the final param should be 0, but it wasn't."); } MSB.DisambiguateNames(entries.Models); MSB.DisambiguateNames(entries.Regions); MSB.DisambiguateNames(entries.Parts); foreach (Event evt in entries.Events) { evt.GetNames(this, entries); } foreach (Region region in entries.Regions) { region.GetNames(entries); } foreach (Part part in entries.Parts) { part.GetNames(this, entries); } }
/// <summary> /// Deserializes file data from a stream. /// </summary> protected override void Read(BinaryReaderEx br) { br.BigEndian = false; br.VarintLong = false; if (br.GetASCII(0, 4) == "MSB ") { Format = MSBFormat.DarkSouls2Scholar; br.VarintLong = true; MSB.AssertHeader(br); } else if (br.GetUInt32(0) == 5) { Format = MSBFormat.DarkSouls2LE; } else { Format = MSBFormat.DarkSouls2BE; br.BigEndian = true; } Entries entries; Models = new ModelParam(); entries.Models = Models.Read(br); Events = new EventParam(); entries.Events = Events.Read(br); Regions = new PointParam(); entries.Regions = Regions.Read(br); new RouteParam().Read(br); new LayerParam().Read(br); Parts = new PartsParam(); entries.Parts = Parts.Read(br); PartPoses = new MapstudioPartsPose().Read(br); entries.BoneNames = new MapstudioBoneName().Read(br); if (br.Position != 0) { throw new InvalidDataException($"The next param offset of the final param should be 0, but it was 0x{br.Position:X}."); } MSB.DisambiguateNames(entries.Models); MSB.DisambiguateNames(entries.Parts); MSB.DisambiguateNames(entries.BoneNames); foreach (Part part in entries.Parts) { part.GetNames(this, entries); } foreach (PartPose pose in PartPoses) { pose.GetNames(entries); } }
/// <summary> /// Serializes file data to a stream. /// </summary> protected override void Write(BinaryWriterEx bw) { Entries entries; entries.Models = Models.GetEntries(); entries.Events = Events.GetEntries(); entries.Regions = Regions.GetEntries(); entries.Parts = Parts.GetEntries(); entries.BoneNames = new List <BoneName>(); foreach (Model model in entries.Models) { model.CountInstances(entries.Parts); } foreach (Event evt in entries.Events) { evt.GetIndices(this, entries); } foreach (Region region in entries.Regions) { region.GetIndices(this, entries); } foreach (Part part in entries.Parts) { part.GetIndices(this, entries); } foreach (PartsPose pose in PartsPoses) { pose.GetIndices(this, entries); } bw.BigEndian = false; MSB.WriteHeader(bw); Models.Write(bw, entries.Models); bw.FillInt64("NextParamOffset", bw.Position); Events.Write(bw, entries.Events); bw.FillInt64("NextParamOffset", bw.Position); Regions.Write(bw, entries.Regions); bw.FillInt64("NextParamOffset", bw.Position); new RouteParam().Write(bw, Routes); bw.FillInt64("NextParamOffset", bw.Position); new LayerParam().Write(bw, Layers); bw.FillInt64("NextParamOffset", bw.Position); Parts.Write(bw, entries.Parts); bw.FillInt64("NextParamOffset", bw.Position); new MapstudioPartsPose().Write(bw, PartsPoses); bw.FillInt64("NextParamOffset", bw.Position); new MapstudioBoneName().Write(bw, entries.BoneNames); bw.FillInt64("NextParamOffset", 0); }
internal void Write(BinaryWriterEx bw, int id) { long start = bw.Position; bw.ReserveInt64("NameOffset"); bw.WriteUInt32((uint)Type); bw.WriteInt32(id); bw.WriteUInt32((uint)Shape.Type); bw.WriteVector3(Position); bw.WriteVector3(Rotation); bw.WriteInt32(Unk2); bw.ReserveInt64("BaseDataOffset1"); bw.ReserveInt64("BaseDataOffset2"); bw.WriteInt32(-1); bw.WriteUInt32(MapStudioLayer); bw.ReserveInt64("ShapeDataOffset"); bw.ReserveInt64("BaseDataOffset3"); bw.ReserveInt64("TypeDataOffset"); bw.FillInt64("NameOffset", bw.Position - start); bw.WriteUTF16(MSB.ReambiguateName(Name), true); bw.Pad(4); bw.FillInt64("BaseDataOffset1", bw.Position - start); bw.WriteInt16((short)UnkA.Count); bw.WriteInt16s(UnkA); bw.Pad(4); bw.FillInt64("BaseDataOffset2", bw.Position - start); bw.WriteInt16((short)UnkB.Count); bw.WriteInt16s(UnkB); bw.Pad(8); Shape.Write(bw, start); bw.FillInt64("BaseDataOffset3", bw.Position - start); bw.WriteInt32(ActivationPartIndex); bw.WriteInt32(EventEntityID); if (HasTypeData) { WriteSpecific(bw, start); } else { bw.FillInt64("TypeDataOffset", 0); } bw.Pad(8); }
internal override void GetIndices(MSBS msb, Entries entries) { base.GetIndices(msb, entries); WalkRegionIndices = new short[WalkRegionNames.Length]; for (int i = 0; i < WalkRegionNames.Length; i++) { WalkRegionIndices[i] = (short)MSB.FindIndex(entries.Regions, WalkRegionNames[i]); } foreach (WREntry wrEntry in WREntries) { wrEntry.GetIndices(entries); } }
/// <summary> /// Serializes file data to a stream. /// </summary> protected override void Write(BinaryWriterEx bw) { Entries entries; entries.Models = Models.GetEntries(); entries.Events = Events.GetEntries(); entries.Regions = Regions.GetEntries(); entries.Parts = Parts.GetEntries(); entries.BoneNames = new List <BoneName>(); Lookups lookups; lookups.Models = MakeNameLookup(entries.Models); lookups.Parts = MakeNameLookup(entries.Parts); lookups.Collisions = MakeNameLookup(Parts.Collisions); lookups.BoneNames = new Dictionary <string, int>(); foreach (Part part in entries.Parts) { part.GetIndices(lookups); } foreach (PartPose pose in PartPoses) { pose.GetIndices(lookups, entries); } bw.BigEndian = Format == MSBFormat.DarkSouls2BE; bw.VarintLong = Format == MSBFormat.DarkSouls2Scholar; if (Format == MSBFormat.DarkSouls2Scholar) { MSB.WriteHeader(bw); } Models.Write(bw, entries.Models); bw.FillVarint("NextParamOffset", bw.Position); Events.Write(bw, entries.Events); bw.FillVarint("NextParamOffset", bw.Position); Regions.Write(bw, entries.Regions); bw.FillVarint("NextParamOffset", bw.Position); new RouteParam().Write(bw, new List <Entry>()); bw.FillVarint("NextParamOffset", bw.Position); new LayerParam().Write(bw, new List <Entry>()); bw.FillVarint("NextParamOffset", bw.Position); Parts.Write(bw, entries.Parts); bw.FillVarint("NextParamOffset", bw.Position); new MapstudioPartsPose().Write(bw, PartPoses); bw.FillVarint("NextParamOffset", bw.Position); new MapstudioBoneName().Write(bw, entries.BoneNames); bw.FillVarint("NextParamOffset", 0); }
/// <summary> /// Deserializes file data from a stream. /// </summary> protected override void Read(BinaryReaderEx br) { br.BigEndian = false; MSB.AssertHeader(br); Entries entries = default; Models = new ModelParam(); entries.Models = Models.Read(br); Events = new EventParam(); entries.Events = Events.Read(br); Regions = new PointParam(); entries.Regions = Regions.Read(br); Routes = new RouteParam().Read(br); Layers = new LayerParam().Read(br); Parts = new PartsParam(); entries.Parts = Parts.Read(br); PartsPoses = new MapstudioPartsPose().Read(br); entries.BoneNames = new MapstudioBoneName().Read(br); if (br.Position != 0) { throw new InvalidDataException($"The next param offset of the final param should be 0, but it was 0x{br.Position:X}."); } MSB.DisambiguateNames(entries.Models); MSB.DisambiguateNames(entries.Parts); MSB.DisambiguateNames(entries.Regions); MSB.DisambiguateNames(entries.BoneNames); foreach (Event evt in entries.Events) { evt.GetNames(this, entries); } foreach (Region region in entries.Regions) { region.GetNames(this, entries); } foreach (Part part in entries.Parts) { part.GetNames(this, entries); } foreach (PartsPose pose in PartsPoses) { pose.GetNames(this, entries); } }
internal override void Write(BinaryWriterEx bw, int id) { long start = bw.Position; bw.ReserveVarint("NameOffset"); bw.WriteByte((byte)Type); bw.WriteByte(0); bw.WriteInt16((short)id); bw.WriteInt16(ModelIndex); bw.WriteInt16(0); bw.WriteVector3(Position); bw.WriteVector3(Rotation); bw.WriteVector3(Scale); bw.WriteUInt32s(DrawGroups); bw.WriteInt32(Unk44); bw.WriteInt32(Unk48); bw.WriteInt32(Unk4C); bw.WriteInt32(Unk50); bw.WriteUInt32s(DispGroups); bw.WriteInt32(Unk64); bw.WriteInt32(0); bw.WriteByte(Unk6C); bw.WriteByte(0); bw.WriteByte(Unk6E); bw.WriteByte(0); bw.ReserveVarint("TypeDataOffset"); if (bw.VarintLong) { bw.WriteInt64(0); } long nameStart = bw.Position; int namePad = bw.VarintLong ? 0x20 : 0x2C; bw.FillVarint("NameOffset", nameStart - start); bw.WriteUTF16(MSB.ReambiguateName(Name), true); if (bw.Position - nameStart < namePad) { bw.Position += namePad - (bw.Position - nameStart); } bw.Pad(bw.VarintSize); bw.FillVarint("TypeDataOffset", bw.Position - start); WriteTypeData(bw); }
/// <summary> /// Deserializes file data from a stream. /// </summary> protected override void Read(BinaryReaderEx br) { br.BigEndian = false; br.AssertASCII("MSB "); br.AssertInt32(1); br.AssertInt32(0x10); br.AssertBoolean(false); // isBigEndian br.AssertBoolean(false); // isBitBigEndian br.AssertByte(1); // textEncoding br.AssertSByte(-1); // is64BitOffset Entries entries; Models = new ModelParam(); entries.Models = Models.Read(br); Events = new EventParam(); entries.Events = Events.Read(br); Regions = new PointParam(); entries.Regions = Regions.Read(br); new RouteParam().Read(br); new LayerParam().Read(br); Parts = new PartsParam(); entries.Parts = Parts.Read(br); PartPoses = new MapstudioPartsPose().Read(br); entries.BoneNames = new MapstudioBoneName().Read(br); if (br.Position != 0) { throw new InvalidDataException($"The next param offset of the final param should be 0, but it was 0x{br.Position:X}."); } MSB.DisambiguateNames(entries.Models); MSB.DisambiguateNames(entries.Parts); MSB.DisambiguateNames(entries.BoneNames); foreach (Part part in entries.Parts) { part.GetNames(this, entries); } foreach (PartPose pose in PartPoses) { pose.GetNames(entries); } }
internal override void Write(BinaryWriterEx bw, int id) { long start = bw.Position; bw.ReserveInt32("NameOffset"); bw.WriteUInt32((uint)Type); bw.WriteInt32(ID); bw.ReserveInt32("SibOffset"); bw.WriteInt32(InstanceCount); bw.WriteInt32(0); bw.WriteInt32(0); bw.WriteInt32(0); bw.FillInt32("NameOffset", (int)(bw.Position - start)); bw.WriteShiftJIS(MSB.ReambiguateName(Name), true); bw.FillInt32("SibOffset", (int)(bw.Position - start)); bw.WriteShiftJIS(Placeholder, true); bw.Pad(4); }
internal override void Write(BinaryWriterEx bw, int id) { long start = bw.Position; bw.ReserveInt64("NameOffset"); bw.WriteUInt32((uint)Type); bw.WriteInt32(id); bw.ReserveInt64("SibOffset"); bw.WriteInt32(InstanceCount); bw.WriteInt32(0); bw.WriteInt32(0); bw.WriteInt32(0); bw.FillInt64("NameOffset", bw.Position - start); bw.WriteUTF16(MSB.ReambiguateName(Name), true); bw.FillInt64("SibOffset", bw.Position - start); bw.WriteUTF16(SibPath, true); bw.Pad(8); }
internal override void Write(BinaryWriterEx bw, int id) { long start = bw.Position; bw.ReserveInt32("NameOffset"); bw.WriteUInt32((uint)Type); bw.WriteInt32(id); bw.WriteInt32(ModelIndex); bw.ReserveInt32("SibOffset"); bw.WriteVector3(Position); bw.WriteVector3(Rotation); bw.WriteVector3(Scale); bw.WriteUInt32s(DrawGroups); bw.WriteUInt32s(DispGroups); bw.ReserveInt32("EntityDataOffset"); bw.ReserveInt32("TypeDataOffset"); bw.WriteInt32(0); bw.WriteInt32(0); long stringsStart = bw.Position; bw.FillInt32("NameOffset", (int)(bw.Position - start)); bw.WriteShiftJIS(MSB.ReambiguateName(Name), true); bw.FillInt32("SibOffset", (int)(bw.Position - start)); bw.WriteShiftJIS(SibPath, true); bw.Pad(4); if (bw.Position - stringsStart < 0x10) { bw.WritePattern((int)(0x10 - (bw.Position - stringsStart)), 0x00); } bw.FillInt32("EntityDataOffset", (int)(bw.Position - start)); WriteEntityData(bw); bw.FillInt32("TypeDataOffset", (int)(bw.Position - start)); WriteTypeData(bw); }
internal override void Write(BinaryWriterEx bw, int id) { long start = bw.Position; bw.ReserveInt32("NameOffset"); bw.WriteInt32(0); bw.WriteInt32(id); bw.WriteUInt32((uint)Shape.Type); bw.WriteVector3(Position); bw.WriteVector3(Rotation); bw.ReserveInt32("UnkOffsetA"); bw.ReserveInt32("UnkOffsetB"); bw.ReserveInt32("ShapeDataOffset"); bw.ReserveInt32("EntityDataOffset"); bw.WriteInt32(0); bw.FillInt32("NameOffset", (int)(bw.Position - start)); bw.WriteShiftJIS(MSB.ReambiguateName(Name), true); bw.Pad(4); bw.FillInt32("UnkOffsetA", (int)(bw.Position - start)); bw.WriteInt32(0); bw.FillInt32("UnkOffsetB", (int)(bw.Position - start)); bw.WriteInt32(0); if (Shape.HasShapeData) { bw.FillInt32("ShapeDataOffset", (int)(bw.Position - start)); Shape.WriteShapeData(bw); } else { bw.FillInt32("ShapeDataOffset", 0); } bw.FillInt32("EntityDataOffset", (int)(bw.Position - start)); bw.WriteInt32(EntityID); }
/// <summary> /// Deserializes file data from a stream. /// </summary> protected override void Read(BinaryReaderEx br) { br.BigEndian = true; Entries entries; Models = new ModelParam(); entries.Models = Models.Read(br); Events = new EventParam(); entries.Events = Events.Read(br); Regions = new PointParam(); entries.Regions = Regions.Read(br); Parts = new PartsParam(); entries.Parts = Parts.Read(br); var tree = new MapstudioTree(); Trees = tree.Read(br); if (br.Position != 0) { throw new InvalidDataException("The next param offset of the final param should be 0, but it wasn't."); } MSB.DisambiguateNames(entries.Models); MSB.DisambiguateNames(entries.Regions); MSB.DisambiguateNames(entries.Parts); foreach (Event evt in entries.Events) { evt.GetNames(this, entries); } foreach (Part part in entries.Parts) { part.GetNames(this, entries); } }
internal override void Write(BinaryWriterEx bw, int index) { long start = bw.Position; bw.ReserveInt64("NameOffset"); bw.WriteUInt16((ushort)Type); bw.WriteInt16((short)index); bw.WriteInt32(ModelIndex); bw.WriteVector3(Position); bw.WriteVector3(Rotation); bw.WriteVector3(Scale); bw.WriteUInt32s(DrawGroups); bw.WriteInt32(Unk44); bw.WriteInt32(Unk48); bw.WriteInt32(Unk4C); bw.WriteInt32(Unk50); bw.WriteUInt32s(DispGroups); bw.WriteInt32(Unk64); bw.WriteInt32(Unk68); bw.WriteInt32(Unk6C); bw.ReserveInt64("TypeDataOffset"); bw.WriteInt64(0); long nameStart = bw.Position; bw.FillInt64("NameOffset", nameStart - start); bw.WriteUTF16(MSB.ReambiguateName(Name), true); if (bw.Position - nameStart < 0x20) { bw.Position += 0x20 - (bw.Position - nameStart); } bw.Pad(8); bw.FillInt64("TypeDataOffset", bw.Position - start); WriteTypeData(bw); }
internal virtual void GetIndices(MSBD msb, Entries entries) { ModelIndex = MSB.FindIndex(entries.Models, ModelName); }
internal override void GetIndices(MSB1 msb, Entries entries) { base.GetIndices(msb, entries); SpawnPointIndices = MSB.FindIndices(entries.Regions, SpawnPointNames); SpawnPartIndices = MSB.FindIndices(entries.Parts, SpawnPartNames); }
internal virtual void GetNames(MSB1 msb, Entries entries) { PartName = MSB.FindName(entries.Parts, PartIndex); RegionName = MSB.FindName(entries.Regions, RegionIndex); }
internal virtual void GetNames(MSBD msb, Entries entries) { ModelName = MSB.FindName(entries.Models, ModelIndex); }
internal override void GetNames(MSBD msb, Entries entries) { base.GetNames(msb, entries); CollisionName = MSB.FindName(msb.Parts.Collisions, CollisionIndex); }
internal override void GetIndices(MSBD msb, Entries entries) { base.GetIndices(msb, entries); CollisionIndex = MSB.FindIndex(msb.Parts.Collisions, CollisionName); }
internal virtual void GetIndices(MSB1 msb, Entries entries) { PartIndex = MSB.FindIndex(entries.Parts, PartName); RegionIndex = MSB.FindIndex(entries.Regions, RegionName); }
internal void GetIndices(MSB3 msb, Entries entries) { PartIndex = (short)MSB.FindIndex(entries.Parts, PartName); }
internal void GetNames(MSB3 msb, Entries entries) { PartName = MSB.FindName(entries.Parts, PartIndex); }
internal override void GetNames(MSB1 msb, Entries entries) { base.GetNames(msb, entries); TreasurePartName = MSB.FindName(entries.Parts, TreasurePartIndex); }
internal override void GetIndices(MSB1 msb, Entries entries) { base.GetIndices(msb, entries); TreasurePartIndex = MSB.FindIndex(entries.Parts, TreasurePartName); }