Пример #1
0
        public ReflexivePage CloneValue()
        {
            var result = new ReflexivePage(_index, _fields.Length);

            Array.Copy(_fields, result._fields, _fields.Length);
            return(result);
        }
Пример #2
0
 public void UnloadPage()
 {
     if (_lastPage != null)
     {
         _lastPage.CloneChanges(_loadedFields, _tracker, _changes);
     }
     _lastPage = null;
 }
Пример #3
0
		public FlattenedReflexive(FlattenedReflexive parent, ReflexiveData template,
			ObservableCollection<MetaField> topLevelFields, FieldChangeTracker tracker, FieldChangeSet changes)
		{
			_parent = parent;
			_template = template;
			_activeReflexive = template;
			_synchronizedReflexives.Add(template);
			if (template.HasChildren)
				_lastPage = template.Pages[template.CurrentIndex];
			_topLevelFields = topLevelFields;
			_tracker = tracker;
			_changes = changes;
		}
Пример #4
0
 public FlattenedReflexive(FlattenedReflexive parent, ReflexiveData template,
                           ObservableCollection <MetaField> topLevelFields, FieldChangeTracker tracker, FieldChangeSet changes)
 {
     _parent          = parent;
     _template        = template;
     _activeReflexive = template;
     _synchronizedReflexives.Add(template);
     if (template.HasChildren)
     {
         _lastPage = template.Pages[template.CurrentIndex];
     }
     _topLevelFields = topLevelFields;
     _tracker        = tracker;
     _changes        = changes;
 }
Пример #5
0
        public void ReadReflexiveChildren(ReflexiveData reflexive)
        {
            if (!reflexive.HasChildren || reflexive.CurrentIndex < 0)
            {
                return;
            }

            bool opened = OpenReader();

            if (_reader == null)
            {
                return;
            }

            try
            {
                // Calculate the base offset to read from
                uint oldBaseOffset = BaseOffset;
                uint dataOffset    = reflexive.FirstEntryAddress;
                if (_cache.GetType() == typeof(Blamite.Blam.FourthGen.FourthGenCacheFile))
                {
                    dataOffset = HeaderOffset + (dataOffset & 0xFFFFFFF);
                }

                if (_type == LoadType.File)
                {
                    dataOffset = (uint)_cache.MetaArea.PointerToOffset(dataOffset);
                }
                BaseOffset = (uint)(dataOffset + reflexive.CurrentIndex * reflexive.EntrySize);

                ReflexivePage page = reflexive.Pages[reflexive.CurrentIndex];
                for (int i = 0; i < page.Fields.Length; i++)
                {
                    ReadField(page.Fields[i] ?? reflexive.Template[i]);
                }

                BaseOffset = oldBaseOffset;
            }
            finally
            {
                if (opened)
                {
                    CloseReader();
                }
            }
        }
Пример #6
0
        public void LoadPage(ReflexiveData reflexive, int index)
        {
            _activeReflexive = reflexive;
            if (!reflexive.HasChildren)
            {
                return;
            }

            if (index >= 0 && index < reflexive.Length && reflexive.Pages[index] == _lastPage)
            {
                return;
            }

            UnloadPage();
            if (index < 0 || index >= reflexive.Length)
            {
                _lastPage = null;
                return;
            }

            _lastPage = reflexive.Pages[index];
            for (int i = 0; i < _lastPage.Fields.Length; i++)
            {
                // if _lastPage.Fields[i] is null, then we can just re-use the field from the template
                MetaField newField;
                if (_lastPage.Fields[i] != null)
                {
                    newField = _lastPage.Fields[i];
                }
                else
                {
                    newField = reflexive.Template[i];
                }

                // HACK: synchronize the opacity
                newField.Opacity = _loadedFields[i].Opacity;

                _loadedFields[i] = newField;
            }
        }
Пример #7
0
 public ReflexivePage CloneValue()
 {
     var result = new ReflexivePage(_index, _fields.Length);
     Array.Copy(_fields, result._fields, _fields.Length);
     return result;
 }
Пример #8
0
        public void WriteReflexiveChildren(ReflexiveData field)
        {
            if (field.CurrentIndex < 0 || !field.HasChildren)
            {
                return;
            }

            // Get the base address and convert it to an offset if we're writing to the file
            long newBaseOffset = field.FirstEntryAddress;

            if (_type == SaveType.File)
            {
                newBaseOffset = _cache.MetaArea.PointerToOffset(newBaseOffset);
            }

            // Save the old base offset and set the base offset to the reflexive's base
            long oldBaseOffset = _baseOffset;

            _baseOffset = newBaseOffset;

            // Write each page
            int  _oldIndex         = field.CurrentIndex;
            bool _oldPokeTemplates = _pokeTemplateFields;

            for (int i = 0; i < field.Length; i++)
            {
                // If we're saving everything, then change the active page so the values get loaded from the file
                if (_changes == null && field.CurrentIndex != i)
                {
                    field.CurrentIndex = i;
                }

                // If we're not saving everything, then we can only poke template fields in reflexives
                // if the current indices all line up
                if (i != _oldIndex)
                {
                    _pokeTemplateFields = false;
                }

                // Get each field in the page and write it
                ReflexivePage page = field.Pages[i];
                for (int j = 0; j < page.Fields.Length; j++)
                {
                    MetaField pageField = page.Fields[j];
                    // The field in the page takes precedence over the field in the reflexive's template
                    if (pageField == null && (_changes == null || _pokeTemplateFields))
                    {
                        pageField = field.Template[j];                         // Get it from the template
                    }
                    if (pageField != null)
                    {
                        WriteField(pageField);
                    }
                }

                // Advance to the next chunk
                _baseOffset        += field.EntrySize;
                _pokeTemplateFields = _oldPokeTemplates;
            }
            if (!Equals(field.CurrentIndex, _oldIndex))
            {
                field.CurrentIndex = _oldIndex;
            }

            // Restore the old base offset
            _baseOffset = oldBaseOffset;
        }
Пример #9
0
 public void UnloadPage()
 {
     if (_lastPage != null)
         _lastPage.CloneChanges(_loadedFields, _tracker, _changes);
     _lastPage = null;
 }
Пример #10
0
        public void LoadPage(ReflexiveData reflexive, int index)
        {
            _activeReflexive = reflexive;
            if (!reflexive.HasChildren)
                return;

            UnloadPage();
            if (index < 0)
            {
                _lastPage = null;
                return;
            }

            _lastPage = reflexive.Pages[index];
            for (int i = 0; i < _lastPage.Fields.Length; i++)
            {
                // if _lastPage.Fields[i] is null, then we can just re-use the field from the template
                MetaField newField;
                if (_lastPage.Fields[i] != null)
                    newField = _lastPage.Fields[i];
                else
                    newField = reflexive.Template[i];

                // HACK: synchronize the opacity
                newField.Opacity = _loadedFields[i].Opacity;

                _loadedFields[i] = newField;
            }
        }