internal Subaction(int index, string name, IList <ScriptCommand> script, SubactionDefinition definition) { Index = index; Name = name; Script = script; Definition = definition; }
public File(string filename) { Filename = filename; var stream = System.IO.File.OpenRead(filename); var rawData = new byte[(int)stream.Length].Slice(); stream.Read(rawData.Array, 0, rawData.Count); stream.Close(); ArraySlice <byte> data; string name; #region FileHeader data = rawData.Slice(0x00, 0x20); Header = new FileHeader(data.Offset, data.Count, filesize: data.GetInt32(0x04 * 0), datasize: data.GetInt32(0x04 * 1), offsetCount: data.GetInt32(0x04 * 2), ftDataCount: data.GetInt32(0x04 * 3), sectionType2Count: data.GetInt32(0x04 * 4), version: data.Slice(0x04 * 5, 0x4).ToArray(), unknown1: data.GetInt32(0x04 * 6), unknown2: data.GetInt32(0x04 * 7)); #endregion #region Data //The offset of everything else is based off the header rawData = rawData.Slice(Header.Size); var stringOffsetBase = Header.Datasize + Header.OffsetCount * SizeOf.Offset + Header.FtDataCount * SizeOf.FtDefinition + Header.SectionType2Count * SizeOf.SectionType2Definition; #region FtIndex FtIndex = new List <FtData>(); int i; for (i = 0; i < Header.FtDataCount; i++) { var offset = Header.Datasize + Header.OffsetCount * SizeOf.Offset + i * SizeOf.FtDefinition; #region FtDefinition data = rawData.Slice(offset, 8); var ftDefinition = new FtDefinition(data.Offset, data.Count, data.GetInt32(0x04 * 0), data.GetInt32(0x04 * 1)); name = rawData.GetAsciiString(stringOffsetBase + ftDefinition.StringOffset); #endregion #region FtHeader data = rawData.Slice(ftDefinition.DataOffset, 0x60); var ftHeader = new FtHeader(data.Offset, data.Count, attributesStart: data.GetInt32(0x00), attributesEnd: data.GetInt32(0x04), unknown1: data.GetInt32(0x08), subactionStart: data.GetInt32(0x0C), unknown2: data.GetInt32(0x10), subactionEnd: data.GetInt32(0x14), values: data.Slice(0x18, 18).ToArray() ); #endregion #region Attributes data = rawData.Slice(ftHeader.AttributesStart, ftHeader.AttributesEnd - ftHeader.AttributesStart); var attributes = new List <Attribute>(); for (var j = 0; j < data.Count / SizeOf.Attribute; j++) { attributes.Add(new Attribute(j, data.GetSingle(j * SizeOf.Attribute))); } #endregion #region Subactions data = rawData.Slice(ftHeader.SubactionStart, ftHeader.SubactionEnd - ftHeader.SubactionStart); var subactions = new List <Subaction>(); for (var j = 0; j < data.Count / SizeOf.SubactionDefinition; j++) { var definitionData = data.Slice(j * SizeOf.SubactionDefinition, SizeOf.SubactionDefinition); var subactionDefinition = new SubactionDefinition(definitionData.Offset, definitionData.Count, stringOffset: definitionData.GetInt32(0x00), unknown1: definitionData.GetInt32(0x04), unknown2: definitionData.GetInt32(0x08), dataOffset: definitionData.GetInt32(0x0C), unknown3: definitionData.GetInt32(0x10), unknown4: definitionData.GetInt32(0x14)); name = subactionDefinition.StringOffset != 0 ? rawData.GetAsciiString(subactionDefinition.StringOffset) : null; Console.WriteLine(name); var scripts = new List <ScriptCommand>(); var scriptData = rawData.Slice(subactionDefinition.DataOffset); i = 0; while (true) { Console.Write(i++); var command = ScriptCommand.Factory(scriptData); scripts.Add(command); scriptData = scriptData.Slice(command.Size); if (command.Type == ScriptCommand.NullType) { break; } Console.Write("WTF"); } subactions.Add(new Subaction(j, name, scripts, subactionDefinition)); } #endregion FtIndex.Add(new FtData(ftHeader, ftDefinition, name, attributes, subactions)); } #endregion //TODO: SectionType2Index = new SectionType2Index(this, rawData); #endregion }