protected override void Write(BinaryWriterEx bw) { bw.WriteASCII("TAE "); bw.BigEndian = BigEndian; bw.WriteBoolean(BigEndian); bw.WriteByte(0); bw.WriteByte(0); if (Format == TAEFormat.DS1) { bw.VarintLong = false; bw.WriteByte(0); } else { bw.VarintLong = true; bw.WriteByte(0xFF); } if (Format == TAEFormat.DS1) { bw.WriteInt32(0x1000B); } else if (Format == TAEFormat.DS3 || Format == TAEFormat.SOTFS) { bw.WriteInt32(0x1000C); } else if (Format == TAEFormat.SDT) { bw.WriteInt32(0x1000D); } bw.ReserveInt32("FileSize"); bw.WriteVarint(0x40); bw.WriteVarint(1); bw.WriteVarint(0x50); bw.WriteVarint(Format == TAEFormat.DS1 ? 0x70 : 0x80); if (Format == TAEFormat.DS1) { bw.WriteInt16(2); bw.WriteInt16(1); } else { bw.WriteVarint(EventBank); } bw.WriteVarint(0); //DeS also if (Format == TAEFormat.DS1) { bw.WriteInt64(0); bw.WriteInt64(0); bw.WriteInt64(0); } bw.WriteBytes(Flags); if (Format == TAEFormat.SOTFS) { bw.WriteByte(0); bw.WriteByte(1); } else { bw.WriteByte(1); bw.WriteByte(0); } for (int i = 0; i < 6; i++) { bw.WriteByte(0); } bw.WriteInt32(ID); bw.WriteInt32(Animations.Count); bw.ReserveVarint("AnimsOffset"); bw.ReserveVarint("AnimGroupsOffset"); bw.WriteVarint(Format == TAEFormat.DS1 ? 0x90 : 0xA0); bw.WriteVarint(Animations.Count); bw.ReserveVarint("FirstAnimOffset"); if (Format == TAEFormat.DS1) { bw.WriteInt32(0); } bw.WriteVarint(1); bw.WriteVarint(Format == TAEFormat.DS1 ? 0x80 : 0x90); if (Format == TAEFormat.DS1) { bw.WriteInt64(0); } bw.WriteInt32(ID); bw.WriteInt32(ID); bw.WriteVarint(0x50); bw.WriteInt64(0); bw.WriteVarint(Format == TAEFormat.DS1 ? 0x98 : 0xB0); bw.ReserveVarint("SkeletonName"); bw.ReserveVarint("SibName"); if (Format != TAEFormat.SOTFS) { bw.WriteVarint(0); bw.WriteVarint(0); } bw.FillVarint("SkeletonName", bw.Position); if (!string.IsNullOrEmpty(SkeletonName)) { bw.WriteUTF16(SkeletonName, true); if (Format != TAEFormat.DS1) { bw.Pad(0x10); } } bw.FillVarint("SibName", bw.Position); if (!string.IsNullOrEmpty(SibName)) { bw.WriteUTF16(SibName, true); if (Format != TAEFormat.DS1) { bw.Pad(0x10); } } Animations.Sort((a1, a2) => a1.ID.CompareTo(a2.ID)); var animOffsets = new List <long>(Animations.Count); if (Animations.Count == 0) { bw.FillVarint("AnimsOffset", 0); } else { bw.FillVarint("AnimsOffset", bw.Position); for (int i = 0; i < Animations.Count; i++) { animOffsets.Add(bw.Position); Animations[i].WriteHeader(bw, i); } } bw.FillVarint("AnimGroupsOffset", bw.Position); bw.ReserveVarint("AnimGroupsCount"); bw.ReserveVarint("AnimGroupsOffset"); int groupCount = 0; long groupStart = bw.Position; for (int i = 0; i < Animations.Count; i++) { int firstIndex = i; bw.WriteInt32((int)Animations[i].ID); while (i < Animations.Count - 1 && Animations[i + 1].ID == Animations[i].ID + 1) { i++; } bw.WriteInt32((int)Animations[i].ID); bw.WriteVarint(animOffsets[firstIndex]); groupCount++; } bw.FillVarint("AnimGroupsCount", groupCount); if (groupCount == 0) { bw.FillVarint("AnimGroupsOffset", 0); } else { bw.FillVarint("AnimGroupsOffset", groupStart); } if (Animations.Count == 0) { bw.FillVarint("FirstAnimOffset", 0); } else { bw.FillVarint("FirstAnimOffset", bw.Position); for (int i = 0; i < Animations.Count; i++) { Animations[i].WriteBody(bw, i, Format); } } for (int i = 0; i < Animations.Count; i++) { Animation anim = Animations[i]; anim.WriteAnimFile(bw, i, Format); Dictionary <float, long> timeOffsets = anim.WriteTimes(bw, i, Format); List <long> eventHeaderOffsets = anim.WriteEventHeaders(bw, i, timeOffsets); anim.WriteEventData(bw, i, Format); anim.WriteEventGroupHeaders(bw, i, Format); anim.WriteEventGroupData(bw, i, eventHeaderOffsets, Format); } bw.FillInt32("FileSize", (int)bw.Position); }
public virtual void Write(PackFileSerializer s, BinaryWriterEx bw) { bw.WriteInt64(m_offset); bw.WriteUInt32(m_stride); bw.WriteUInt32(m_numElements); }
internal void WriteDefaultValue(BinaryWriterEx bw) { if (ValueToAssert != null) { WriteAssertValue(bw); } else if (DefaultValue == null) { switch (Type) { case ParamType.aob: for (int i = 0; i < AobLength; i++) { bw.WriteByte(0); } break; case ParamType.b: case ParamType.u8: case ParamType.x8: bw.WriteByte(0); break; case ParamType.s8: bw.WriteSByte(0); break; case ParamType.u16: case ParamType.x16: bw.WriteUInt16(0); break; case ParamType.s16: bw.WriteInt16(0); break; case ParamType.u32: case ParamType.x32: bw.WriteUInt32(0); break; case ParamType.s32: bw.WriteInt32(0); break; case ParamType.u64: case ParamType.x64: bw.WriteUInt64(0); break; case ParamType.s64: bw.WriteInt64(0); break; case ParamType.f32: bw.WriteSingle(0); break; case ParamType.f64: bw.WriteDouble(0); break; default: throw new Exception($"Invalid ParamTemplate ParamType: {Type.ToString()}"); } } else { switch (Type) { case ParamType.aob: var assertAob = (byte[])DefaultValue; bw.WriteBytes(assertAob); break; case ParamType.b: case ParamType.u8: case ParamType.x8: bw.WriteByte((byte)DefaultValue); break; case ParamType.s8: bw.WriteSByte((sbyte)DefaultValue); break; case ParamType.u16: case ParamType.x16: bw.WriteUInt16((ushort)DefaultValue); break; case ParamType.s16: bw.WriteInt16((short)DefaultValue); break; case ParamType.u32: case ParamType.x32: bw.WriteUInt32((uint)DefaultValue); break; case ParamType.s32: bw.WriteInt32((int)DefaultValue); break; case ParamType.u64: case ParamType.x64: bw.WriteUInt64((ulong)DefaultValue); break; case ParamType.s64: bw.WriteInt64((long)DefaultValue); break; case ParamType.f32: bw.WriteSingle((float)DefaultValue); break; case ParamType.f64: bw.WriteDouble((double)DefaultValue); break; default: throw new Exception($"Invalid ParamTemplate ParamType: {Type.ToString()}"); } } }
internal void Write(BinaryWriterEx bw, List <BinderFile> files) { bw.BigEndian = BigEndian; bw.WriteASCII("BHF4"); bw.WriteBoolean(Flag1); bw.WriteBoolean(Flag2); bw.WriteByte(0); bw.WriteByte(0); bw.WriteInt32(0x10000); bw.WriteInt32(files.Count); bw.WriteInt64(0x40); bw.WriteFixStr(Timestamp, 8); bw.WriteInt64(Binder.FileHeaderSize(Format)); bw.WriteInt64(0); bw.WriteBoolean(Unicode); bw.WriteByte((byte)Format); bw.WriteByte(Extended); bw.WriteByte(0); bw.WriteInt32(0); if (Extended == 4) { bw.ReserveInt64("HashGroups"); } else { bw.WriteInt64(0); } for (int i = 0; i < files.Count; i++) { FileHeader.Write(bw, files[i], i, Format); } for (int i = 0; i < files.Count; i++) { BinderFile file = files[i]; bw.FillUInt32($"FileName{i}", (uint)bw.Position); if (Unicode) { bw.WriteUTF16(file.Name, true); } else { bw.WriteShiftJIS(file.Name, true); } } if (Extended == 4) { uint groupCount = 0; for (uint p = (uint)files.Count / 7; p <= 100000; p++) { if (SFUtil.IsPrime(p)) { groupCount = p; break; } } if (groupCount == 0) { throw new InvalidOperationException("Hash group count not determined in BXF4."); } var hashLists = new List <PathHash> [groupCount]; for (int i = 0; i < groupCount; i++) { hashLists[i] = new List <PathHash>(); } for (int i = 0; i < files.Count; i++) { var pathHash = new PathHash(i, files[i].Name); uint group = pathHash.Hash % groupCount; hashLists[group].Add(pathHash); } for (int i = 0; i < groupCount; i++) { hashLists[i].Sort((ph1, ph2) => ph1.Hash.CompareTo(ph2.Hash)); } var hashGroups = new List <HashGroup>(); var pathHashes = new List <PathHash>(); int count = 0; foreach (List <PathHash> hashList in hashLists) { int index = count; foreach (PathHash pathHash in hashList) { pathHashes.Add(pathHash); count++; } hashGroups.Add(new HashGroup(index, count - index)); } bw.Pad(0x8); bw.FillInt64("HashGroups", bw.Position); bw.ReserveInt64("PathHashes"); bw.WriteUInt32(groupCount); bw.WriteInt32(0x00080810); foreach (HashGroup hashGroup in hashGroups) { hashGroup.Write(bw); } // No padding after section 1 bw.FillInt64("PathHashes", bw.Position); foreach (PathHash pathHash in pathHashes) { pathHash.Write(bw); } } }