Ejemplo n.º 1
0
 internal Subaction(int index, string name, IList <ScriptCommand> script, SubactionDefinition definition)
 {
     Index      = index;
     Name       = name;
     Script     = script;
     Definition = definition;
 }
Ejemplo n.º 2
0
        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
        }