public static List <OffsetTimeSet> ReadOffsetTimeSets(this BufferedStreamReader streamReader, long position, int timeCount) { List <OffsetTimeSet> sets = new List <OffsetTimeSet>(); OffsetTimeSet set0 = new OffsetTimeSet() { offset = streamReader.Read <int>(), time = streamReader.Read <float>() }; for (int i = 0; i < timeCount; i++) { //Add i * 8 to the offset for the true offset since the offsets here are relatigve to the position of their defining int OffsetTimeSet set = new OffsetTimeSet() { offset = (int)position + streamReader.Read <int>() + i * 8, time = streamReader.Read <float>() }; sets.Add(set); } return(sets); }
public static AquaMotion ReadAAI(string filePath) { using (Stream stream = (Stream) new FileStream(filePath, FileMode.Open)) using (var streamReader = new BufferedStreamReader(stream, 8192)) { int fType = streamReader.Read <int>(); if (fType != FAA) { return(null); } streamReader.Seek(0xC, SeekOrigin.Current); int innerFtype = streamReader.Read <int>(); int len = streamReader.Read <int>(); streamReader.Seek(len - 0x8, SeekOrigin.Current); int animDataMagic = streamReader.Read <int>(); ushort nodeCount = streamReader.Read <ushort>(); ushort sht_06 = streamReader.Read <ushort>(); ushort sht_08 = streamReader.Read <ushort>(); ushort sht_0C = streamReader.Read <ushort>(); int timeCount = streamReader.Read <int>(); int finalFrame = streamReader.Read <int>(); int unkAddress0 = streamReader.Read <int>(); int unkAddress1 = streamReader.Read <int>(); int unkAddress2 = streamReader.Read <int>(); int unkAddress3 = streamReader.Read <int>(); int unkAddress4 = streamReader.Read <int>(); int unkAddress5 = streamReader.Read <int>(); int unkAddress6 = streamReader.Read <int>(); int unkAddress7 = streamReader.Read <int>(); int unkAddress8 = streamReader.Read <int>(); int nodeDefEndAddress = streamReader.Read <int>(); int unkAddress9 = streamReader.Read <int>(); int unkAddress10 = streamReader.Read <int>(); int int_44 = streamReader.Read <int>(); int clumpCount = 0; List <AnimDefinitionNode> nodes = new List <AnimDefinitionNode>(); int ct14 = 0; int ct24 = 0; int ct30 = 0; int ct34 = 0; int ct44 = 0; for (int i = 0; i < nodeCount; i++) { AnimDefinitionNode node = new AnimDefinitionNode(); node.header0 = streamReader.Read <ushort>(); node.dataCount = streamReader.Read <ushort>(); node.len = streamReader.Read <int>(); node.nameData = streamReader.Read <PSO2String>(); node.name = node.nameData.GetString(); for (int j = 0; j < node.dataCount; j++) { clumpCount++; var test = streamReader.Position().ToString("X"); DataClump dc = new DataClump(); dc.dcStart = streamReader.Read <DataClumpStart>(); switch (dc.dcStart.dcType) { case 0x14: ct14++; dc.d14 = streamReader.Read <DataClump14>(); break; case 0x24: ct24++; dc.d24 = streamReader.Read <DataClump24>(); break; case 0x30: ct30++; dc.d30 = streamReader.Read <DataClump30>(); break; case 0x34: ct34++; dc.d34 = streamReader.Read <DataClump34>(); dc.dcString = dc.d34.clumpName.GetString(); break; case 0x44: ct44++; dc.d44 = streamReader.Read <DataClump44>(); dc.dcString = dc.d44.clumpName.GetString(); break; default: MessageBox.Show($"clumpSize {dc.dcStart.dcType.ToString("X")} at {streamReader.Position().ToString("X")} is unexpected!"); break; } node.data.Add(dc); } nodes.Add(node); } return(null); var offsetTimes = streamReader.ReadOffsetTimeSets(streamReader.Position(), timeCount); List <List <OffsetTimeSet> > setsList = new List <List <OffsetTimeSet> >(); for (int i = 0; i < offsetTimes.Count; i++) { streamReader.Seek(offsetTimes[i].offset, SeekOrigin.Begin); var position = streamReader.Position(); int keyNodeCount = streamReader.Read <int>(); List <OffsetTimeSet> sets = new List <OffsetTimeSet>(); for (int j = 0; j < keyNodeCount; j++) { OffsetTimeSet set = streamReader.Read <OffsetTimeSet>(); sets.Add(set); } setsList.Add(sets); } } return(null); }