Пример #1
0
        public tag_block_definition(BinaryReader reader)
            : this()
        {
            // Read all the fields from the stream.
            this.display_name_address = reader.ReadInt32();
            this.name_address = reader.ReadInt32();
            this.flags = reader.ReadInt32();
            this.maximum_element_count = reader.ReadInt32();
            this.maximum_element_count_string_address = reader.ReadInt32();
            this.field_sets_address = reader.ReadInt32();
            this.field_set_count = reader.ReadInt32();
            this.field_set_latest_address = reader.ReadInt32();
            reader.BaseStream.Position += 4;
            this.postprocess_proc = reader.ReadInt32();
            this.format_proc = reader.ReadInt32();
            this.generate_default_proc = reader.ReadInt32();
            this.dispose_element_proc = reader.ReadInt32();

            // Read the display name and name strings.
            this.display_name = Guerilla.ReadString(reader, this.display_name_address);
            this.name = Guerilla.ReadString(reader, this.name_address);
            this.maximum_element_count_str = Guerilla.ReadString(reader, this.maximum_element_count_string_address);
            if (name == "sound_block")
            {
                this.field_sets_address = 0x957870;

                FieldSets = new List<tag_field_set>(1);
                var fieldSet = new tag_field_set();

                //definition.field_set_latest_address = 0x906178;
                fieldSet.version.fields_address = 0x906178;
                fieldSet.version.index = 0;
                fieldSet.version.upgrade_proc = 0;
                fieldSet.version.size_of = -1;
                fieldSet.size = 172;
                fieldSet.alignment_bit = 0;
                fieldSet.parent_version_index = -1;
                fieldSet.fields_address = 0x906178;
                fieldSet.size_string_address = 0x00795330;
                fieldSet.size_string = "sizeof(sound_definition)";

                var definitionName = this.name;
                fieldSet.ReadFields(reader, Guerilla.PostprocessFunctions.Where(x => x.Key == definitionName).Select(x => x.Value).FirstOrDefault());
                LatestFieldSet = fieldSet;
                FieldSets.Add(fieldSet);
            }
            else
            {
                FieldSets = new List<tag_field_set>(field_set_count);
                var definitionName = this.name;
                var address = field_sets_address;
                for (var i = 0; i < field_set_count; ++i)
                {
                    reader.BaseStream.Seek(address, SeekOrigin.Begin);
                    var fieldSet = new tag_field_set(reader);
                    FieldSets.Add(fieldSet);
                    address += tag_field_set.Size;
                }
                if (this.name == "sound_promotion_parameters_struct_block")
                {
                    LatestFieldSet = FieldSets[0];
                }
                else
                {
                    reader.BaseStream.Seek(this.field_set_latest_address, SeekOrigin.Begin);
                    var latestFieldSet = new tag_field_set(reader, Guerilla.PostprocessFunctions.Where(x => x.Key == definitionName).Select(x => x.Value).FirstOrDefault());
                    LatestFieldSet = latestFieldSet;
                }
            }
        }
Пример #2
0
 public void Read(IntPtr h2LangLib, BinaryReader reader)
 {
     this = new tag_field_set(reader);
 }
Пример #3
0
 public void Read(BinaryReader reader)
 {
     this = new tag_field_set(reader);
 }
Пример #4
0
        public TagBlockDefinition(BinaryReader reader)
            : this()
        {
            // Read all the fields from the stream.
            display_name_address = reader.ReadInt32();
            name_address         = reader.ReadInt32();
            flags = reader.ReadInt32();
            maximum_element_count = reader.ReadInt32();
            maximum_element_count_string_address = reader.ReadInt32();
            field_sets_address          = reader.ReadInt32();
            field_set_count             = reader.ReadInt32();
            field_set_latest_address    = reader.ReadInt32();
            reader.BaseStream.Position += 4;
            postprocess_proc            = reader.ReadInt32();
            format_proc           = reader.ReadInt32();
            generate_default_proc = reader.ReadInt32();
            dispose_element_proc  = reader.ReadInt32();

            // Read the display name and name strings.
            display_name = Guerilla.ReadString(reader, display_name_address);
            name         = Guerilla.ReadString(reader, name_address);
            maximum_element_count_str = Guerilla.ReadString(reader, maximum_element_count_string_address);
            if (name == "sound_block")
            {
                field_sets_address       = 0x957870;
                field_set_latest_address = 0x906178;

                FieldSets = new List <tag_field_set>(1);
                var fieldSet = new tag_field_set
                {
                    version              = { fields_address = 0x906178, index = 0, upgrade_proc = 0, size_of = -1 },
                    size                 = 172,
                    alignment_bit        = 0,
                    parent_version_index = -1,
                    fields_address       = 0x906178,
                    size_string_address  = 0x00795330,
                    size_string          = "sizeof(sound_definition)"
                };


                var definitionName = name;
                fieldSet.ReadFields(reader,
                                    Guerilla.PostprocessFunctions.Where(x => x.Key == definitionName)
                                    .Select(x => x.Value)
                                    .FirstOrDefault());
                LatestFieldSet = fieldSet;
                FieldSets.Add(fieldSet);
            }
            else
            {
                FieldSets = new List <tag_field_set>(field_set_count);
                var definitionName = name;
                var address        = field_sets_address;
                for (var i = 0; i < field_set_count; ++i)
                {
                    reader.BaseStream.Seek(address, SeekOrigin.Begin);
                    var fieldSet = new tag_field_set(reader);
                    FieldSets.Add(fieldSet);
                    address += tag_field_set.Size;
                }
                switch (name)
                {
                case "materials_block":
                    LatestFieldSet = FieldSets[0];
                    if (LatestFieldSet.Fields.Count == 5)
                    {
                        name           = "phmo_materials_block";
                        definitionName = "phmo_materials_block";
                    }
                    break;

                case "hud_globals_block":
                    LatestFieldSet = FieldSets[0];
                    break;

                case "global_new_hud_globals_struct_block":
                    LatestFieldSet = FieldSets[0];
                    break;

                case "sound_promotion_parameters_struct_block":
                    LatestFieldSet = FieldSets[0];
                    break;

                case "animation_pool_block":
                    LatestFieldSet = FieldSets[4];
                    break;

                case "sound_gestalt_promotions_block":
                    LatestFieldSet = FieldSets[0];
                    break;

                case "sound_block":
                    LatestFieldSet = FieldSets[0];
                    break;

                case "tag_block_index_struct_block":
                    LatestFieldSet = FieldSets[0];
                    break;

                case "vertex_shader_classification_block":
                    LatestFieldSet = FieldSets[0];
                    break;

                default:
                    reader.BaseStream.Seek(field_set_latest_address, SeekOrigin.Begin);
                    var latestFieldSet = new tag_field_set(reader,
                                                           Guerilla.PostprocessFunctions.Where(x => x.Key == definitionName)
                                                           .Select(x => x.Value)
                                                           .FirstOrDefault());
                    LatestFieldSet = latestFieldSet;
                    break;
                }
            }
        }
Пример #5
0
        public static List <tag_field> ReadFieldSet(this BinaryReader reader, ref TagBlockDefinition definition, out tag_field_set field_set)
        {
            field_set = new tag_field_set();
            if (definition.Name == "sound_block")
            {
                definition.field_sets_address = 0x957870;
                //definition.field_set_latest_address = 0x906178;
                field_set.version.fields_address = 0x906178;
                field_set.version.index          = 0;
                field_set.version.upgrade_proc   = 0;
                field_set.version.size_of        = -1;
                field_set.size                 = 172;
                field_set.alignment_bit        = 0;
                field_set.parent_version_index = -1;
                field_set.fields_address       = 0x906178;
                field_set.size_string_address  = 0x00795330;
                field_set.size_string          = "sizeof(sound_definition)";
            }
            else
            {
                // We are going to use the latest tag_field_set for right now.
                if (definition.Name == "animation_pool_block")
                {
                    reader.BaseStream.Position = definition.field_sets_address + ((definition.field_set_count - 2) * 76) - Guerilla.BaseAddress;
                }
                else if (definition.Name == "decorator_cache_block_data_block")
                {
                    reader.BaseStream.Position = definition.field_sets_address + ((definition.field_set_count - 1) * 76) - Guerilla.BaseAddress;
                }
                else
                {
                    reader.BaseStream.Position = definition.field_set_latest_address - Guerilla.BaseAddress;
                }
                field_set = reader.ReadFieldDefinition <tag_field_set>();
            }
            // Seek to the field set address.
            reader.BaseStream.Position = field_set.fields_address - Guerilla.BaseAddress;

            var fields = new List <tag_field>();
            var field  = new tag_field();

            do
            {
                long currentAddress = reader.BaseStream.Position;
                field = reader.ReadFieldDefinition <tag_field>();
                fields.Add(field);
                // Seek to the next tag_field.
                reader.BaseStream.Position = currentAddress + 16;// sizeof(tag_field);
            }while (field.type != field_type._field_terminator);
            var blockName = definition.Name;
            var methods   = (from method in Assembly.GetExecutingAssembly().GetTypes().SelectMany(x => x.GetMethods(BindingFlags.NonPublic | BindingFlags.Static))
                             where method.IsDefined(typeof(GuerillaPreProcessMethodAttribute), false)
                             from attribute in method.GetCustomAttributes(typeof(GuerillaPreProcessMethodAttribute), false)
                             where (attribute as GuerillaPreProcessMethodAttribute).BlockName == blockName
                             select method).ToArray();

            if (methods.Count() > 0)
            {
                methods[0].Invoke(null, new object[] { reader, fields });
            }
            return(fields);
        }
Пример #6
0
 public void Read(IntPtr h2LangLib, BinaryReader reader)
 {
     this = new tag_field_set(reader);
 }
Пример #7
0
        public TagBlockDefinition(BinaryReader reader)
            : this()
        {
            // Read all the fields from the stream.
            this.display_name_address = reader.ReadInt32();
            this.name_address         = reader.ReadInt32();
            this.flags = reader.ReadInt32();
            this.maximum_element_count = reader.ReadInt32();
            this.maximum_element_count_string_address = reader.ReadInt32();
            this.field_sets_address       = reader.ReadInt32();
            this.field_set_count          = reader.ReadInt32();
            this.field_set_latest_address = reader.ReadInt32();
            reader.BaseStream.Position   += 4;
            this.postprocess_proc         = reader.ReadInt32();
            this.format_proc           = reader.ReadInt32();
            this.generate_default_proc = reader.ReadInt32();
            this.dispose_element_proc  = reader.ReadInt32();

            // Read the display name and name strings.
            this.display_name = Guerilla.ReadString(reader, this.display_name_address);
            this.name         = Guerilla.ReadString(reader, this.name_address);
            this.maximum_element_count_str = Guerilla.ReadString(reader, this.maximum_element_count_string_address);
            if (name == "sound_block")
            {
                this.field_sets_address = 0x957870;

                FieldSets = new List <tag_field_set>(1);
                var fieldSet = new tag_field_set();

                //definition.field_set_latest_address = 0x906178;
                fieldSet.version.fields_address = 0x906178;
                fieldSet.version.index          = 0;
                fieldSet.version.upgrade_proc   = 0;
                fieldSet.version.size_of        = -1;
                fieldSet.size                 = 172;
                fieldSet.alignment_bit        = 0;
                fieldSet.parent_version_index = -1;
                fieldSet.fields_address       = 0x906178;
                fieldSet.size_string_address  = 0x00795330;
                fieldSet.size_string          = "sizeof(sound_definition)";

                var definitionName = this.name;
                fieldSet.ReadFields(reader, Guerilla.PostprocessFunctions.Where(x => x.Key == definitionName).Select(x => x.Value).FirstOrDefault());
                LatestFieldSet = fieldSet;
                FieldSets.Add(fieldSet);
            }
            else
            {
                FieldSets = new List <tag_field_set>(field_set_count);
                var definitionName = this.name;
                var address        = field_sets_address;
                for (var i = 0; i < field_set_count; ++i)
                {
                    reader.BaseStream.Seek(address, SeekOrigin.Begin);
                    var fieldSet = new tag_field_set(reader);
                    FieldSets.Add(fieldSet);
                    address += tag_field_set.Size;
                }
                if (this.name == "sound_promotion_parameters_struct_block")
                {
                    LatestFieldSet = FieldSets[0];
                }
                else
                {
                    reader.BaseStream.Seek(this.field_set_latest_address, SeekOrigin.Begin);
                    var latestFieldSet = new tag_field_set(reader, Guerilla.PostprocessFunctions.Where(x => x.Key == definitionName).Select(x => x.Value).FirstOrDefault());
                    LatestFieldSet = latestFieldSet;
                }
            }
        }