public static AnimDataStruct AddEvent(AnimDataStruct animData) { TAE.EventStruct newEvent = new TAE.EventStruct(); newEvent.parameters = new List <byte[]> { }; newEvent.parameters.Add(new byte[4] { 0x0, 0x0, 0x0, 0x0 }); newEvent.parameters.Add(new byte[4] { 0x0, 0x0, 0x0, 0x0 }); newEvent.parameters.Add(new byte[4] { 0xFF, 0xFF, 0xFF, 0xFF }); animData.events.Add(newEvent); animData.eventCount++; return(animData); }
public static Tae ReadTae(string path) { Tae tae = new Tae(); BinaryReader file = new BinaryReader(File.Open(path, FileMode.Open)); tae.header = new Header(); tae.data = new Data(); tae.header.signature = file.ReadBytes(4); if (Encoding.ASCII.GetString(tae.header.signature) == "TAE ") { tae.header.unk1 = file.ReadUInt32(); tae.header.unk2 = file.ReadUInt32(); tae.header.fileSize = file.ReadUInt32(); tae.header.unk3 = file.ReadBytes(64); tae.header.id = file.ReadUInt32(); tae.header.idCount = file.ReadUInt32(); tae.header.idsOffset = file.ReadUInt32(); tae.header.groupsOffset = file.ReadUInt32(); tae.header.unk4 = file.ReadUInt32(); tae.header.dataCount = file.ReadUInt32(); tae.header.dataOffset = file.ReadUInt32(); tae.header.unk5 = file.ReadBytes(40); tae.header.filenamesOffset = file.ReadUInt32(); tae.data.skeletonHkxName = new NameStruct(); tae.data.SibName = new NameStruct(); file.BaseStream.Seek(tae.header.filenamesOffset, SeekOrigin.Begin); tae.data.skeletonHkxName.offset = file.ReadUInt32(); tae.data.SibName.offset = file.ReadUInt32(); tae.data.unk = file.ReadUInt64(); file.BaseStream.Seek(tae.data.skeletonHkxName.offset, SeekOrigin.Begin); tae.data.skeletonHkxName.name = MyReadChars(file); file.BaseStream.Seek(tae.data.SibName.offset, SeekOrigin.Begin); tae.data.SibName.name = MyReadChars(file); file.BaseStream.Seek(tae.header.idsOffset, SeekOrigin.Begin); tae.data.ids = new List <IdStruct> { }; for (int i = 0; i < tae.header.idCount; i++) { IdStruct id = new IdStruct(); id.id = file.ReadUInt32(); id.offset = file.ReadUInt32(); tae.data.ids.Add(id); } file.BaseStream.Seek(tae.header.groupsOffset, SeekOrigin.Begin); tae.data.groupCount = file.ReadUInt32(); tae.data.groupDataOffset = file.ReadUInt32(); file.BaseStream.Seek(tae.data.groupDataOffset, SeekOrigin.Begin); tae.data.groups = new List <GroupStruct> { }; for (int i = 0; i < tae.data.groupCount; i++) { GroupStruct group = new GroupStruct(); group.firstId = file.ReadUInt32(); group.lastId = file.ReadUInt32(); group.firstIdOffset = file.ReadUInt32(); tae.data.groups.Add(group); } file.BaseStream.Seek(tae.header.dataOffset, SeekOrigin.Begin); tae.data.animDatas = new List <AnimDataStruct> { }; long currpos = 0; for (int i = 0; i < tae.header.dataCount; i++) { AnimDataStruct animData = new AnimDataStruct(); animData.eventCount = file.ReadUInt32(); animData.eventHeaderOffset = file.ReadUInt32(); animData.unk = file.ReadUInt64(); animData.timeConstantsCount = file.ReadUInt32(); animData.timeConstantsOffset = file.ReadUInt32(); animData.animFileOffset = file.ReadUInt32(); currpos = file.BaseStream.Position; file.BaseStream.Seek(animData.animFileOffset, SeekOrigin.Begin); animData.animFile = new AnimFileStruct(); animData.animFile.name = new NameStruct(); animData.animFile.type = file.ReadUInt32(); animData.animFile.dataOffset = file.ReadUInt32(); if (animData.animFile.type == 0) { animData.animFile.name.offset = file.ReadUInt32(); } else { animData.animFile.nextFileOffset = file.ReadUInt32(); animData.animFile.linkedAnimId = file.ReadUInt32(); } animData.animFile.unk1 = file.ReadUInt32(); animData.animFile.unk2 = file.ReadUInt32(); animData.animFile.nulla = file.ReadUInt32(); if (animData.animFile.type == 0) { file.BaseStream.Seek(animData.animFile.name.offset, SeekOrigin.Begin); animData.animFile.name.name = MyReadChars(file); } animData.events = new List <EventStruct> { }; for (int j = 0; j < animData.eventCount; j++) { EventStruct Event = new EventStruct(); file.BaseStream.Seek(animData.eventHeaderOffset + j * 12, SeekOrigin.Begin); Event.startTimeOffset = file.ReadUInt32(); Event.endTimeOffset = file.ReadUInt32(); Event.eventbodyOffset = file.ReadUInt32(); file.BaseStream.Seek(Event.startTimeOffset, SeekOrigin.Begin); Event.startTime = file.ReadSingle(); Event.startTimeOffset -= animData.timeConstantsOffset; file.BaseStream.Seek(Event.endTimeOffset, SeekOrigin.Begin); Event.endTime = file.ReadSingle(); Event.endTimeOffset -= animData.timeConstantsOffset; file.BaseStream.Seek(Event.eventbodyOffset, SeekOrigin.Begin); Event.eventType = file.ReadUInt32(); Event.eventParamOffset = file.ReadUInt32(); file.BaseStream.Seek(Event.eventParamOffset, SeekOrigin.Begin); Event.parameters = ReadParams(Event.eventType, file); if (Event.parameters[0] == null) { tae.err = "Unrecognized event type: " + BitConverter.ToInt32(Event.parameters[1], 0) + "\n\nPosition in the file: " + file.BaseStream.Position; file.Close(); return(tae); } animData.events.Add(Event); } file.BaseStream.Seek(animData.timeConstantsOffset, SeekOrigin.Begin); animData.timeConstants = new List <float> { }; for (int j = 0; j < animData.timeConstantsCount; j++) { animData.timeConstants.Add(file.ReadSingle()); } file.BaseStream.Seek((uint)currpos, SeekOrigin.Begin); tae.data.animDatas.Add(animData); } } else { tae.err = "Specified file is not a TAE file."; } file.Close(); return(tae); }