private void WriteArrayField(TextWriter writer, ExtendedUpdateField field, int num)
 {
     writer.WriteLine("\t\t/// <summary>");
     writer.WriteLine("\t\t/// {0}", field.Description);
     writer.WriteLine("\t\t/// </summary>");
     writer.WriteLine("\t\t{0}_{1} = {2},", field.Name, num + 1, field.Offset + num);
 }
 private void WriteField(ExtendedUpdateField field, TextWriter writer)
 {
     writer.WriteLine("\t\t/// <summary>");
     writer.WriteLine("\t\t/// {0}", field.Description);
     writer.WriteLine("\t\t/// </summary>");
     writer.WriteLine("\t\t{0} = {1},", field.Name, field.Offset);
 }
 private void WriteFieldFromArray(List <string> array, TextWriter writer, ExtendedUpdateField field, int fieldStart,
                                  int id)
 {
     writer.WriteLine("\t\t/// <summary>");
     writer.WriteLine("\t\t/// {0}", field.Description);
     writer.WriteLine("\t\t/// </summary>");
     writer.WriteLine("\t\t{0} = {1},", array[fieldStart + id], field.Offset + id);
 }
        private void FillList(BinaryReader binReader)
        {
            m_fieldCount = 0;

            string previousField = String.Empty;
            string currentField;

            binReader.BaseStream.Position = m_dataStartOffset;

            while (true)
            {
                var field = new ExtendedUpdateField
                {
                    NameOffset = binReader.ReadUInt32()
                };
                // 4A4C90 for GUID (4869264)

                if (field.NameOffset < 0x9999)
                {
                    uint oldNameOffset = field.NameOffset;
                    field.NameOffset = binReader.ReadUInt32();
                }

                field.Offset = binReader.ReadUInt32();
                field.Size   = binReader.ReadUInt32();
                field.Type   = (UpdateFieldType)binReader.ReadUInt32();
                field.Flags  = (UpdateFieldFlags)binReader.ReadUInt32();

                if (m_fieldCount == 0)
                {
                    // 0x401A00
                    m_stringOffsetDelta = field.NameOffset - m_stringStartOffset;
                }

                long stringOffset = field.NameOffset - m_stringOffsetDelta;

                long oldpos = binReader.BaseStream.Position;
                binReader.BaseStream.Position = stringOffset;
                currentField = binReader.ReadCString();
                binReader.BaseStream.Position = oldpos;

                var sb = new StringBuilder();
                sb.AppendFormat("Size: {0} - ", field.Size);
                sb.AppendFormat("Type: {0} - ", field.Type);
                sb.AppendFormat("Flags: {0}", field.Flags);
                field.Description = sb.ToString();

                field.Name = currentField;

                m_updateFieldList.Add(field);

                m_fieldCount++;

                if (!previousField.Equals("CORPSE_FIELD_PAD") && currentField.Equals("CORPSE_FIELD_PAD"))
                {
                    break;
                }

                previousField = currentField;
            }
        }
        private void FillStartAndEndValues()
        {
            for (int i = 0; i < m_fieldCount; i++)
            {
                ExtendedUpdateField field = m_updateFieldList[i];
                if (field.Name.StartsWith("OBJECT"))
                {
                    // workaround for GameObjectFields first field being named CREATED_BY
                    if (field.Name.StartsWith("OBJECT_FIELD_CREATED_BY"))
                    {
                        if (m_gameObjectStart == 0)
                        {
                            m_gameObjectStart = i;
                            m_gameObjectEnd   = m_gameObjectStart;
                        }
                        m_gameObjectEnd++;
                        m_totalGameObjectSize += (int)field.Size;

                        field.Group = ObjectTypeId.GameObject;
                    }
                    else
                    {
                        if (field.Offset == 0)
                        {
                            m_objectStart = i;
                            m_objectEnd   = m_objectStart;
                        }
                        m_objectEnd++;
                        m_totalObjectSize += (int)field.Size;

                        field.Group = ObjectTypeId.Object;
                    }
                }
                else if (field.Name.StartsWith("ITEM"))
                {
                    if (field.Offset == 0)
                    {
                        m_itemStart = i;
                        m_itemEnd   = m_itemStart;
                    }
                    m_itemEnd++;
                    m_totalItemSize += (int)field.Size;

                    field.Group = ObjectTypeId.Item;
                }
                else if (field.Name.StartsWith("CONTAINER"))
                {
                    if (field.Offset == 0)
                    {
                        m_containerStart = i;
                        m_containerEnd   = m_containerStart;
                    }
                    m_containerEnd++;
                    m_totalContainerSize += (int)field.Size;

                    field.Group = ObjectTypeId.Container;
                }
                else if (field.Name.StartsWith("GAMEOBJECT"))
                {
                    // Dont need to check for first because first GameObject field is CREATED_BY
                    m_gameObjectEnd++;
                    m_totalGameObjectSize += (int)field.Size;

                    field.Group = ObjectTypeId.GameObject;
                }
                else if (field.Name.StartsWith("UNIT"))
                {
                    if (field.Offset == 0)
                    {
                        m_unitStart = i;
                        m_unitEnd   = m_unitStart;
                    }
                    m_unitEnd++;
                    m_totalUnitSize += (int)field.Size;

                    field.Group = ObjectTypeId.Unit;
                }
                else if (field.Name.StartsWith("PLAYER"))
                {
                    if (field.Offset == 0)
                    {
                        m_playerStart = i;
                        m_playerEnd   = m_playerStart;
                    }
                    m_playerEnd++;
                    m_totalPlayerSize += (int)field.Size;

                    field.Group = ObjectTypeId.Player;
                }
                else if (field.Name.StartsWith("CORPSE"))
                {
                    if (field.Offset == 0)
                    {
                        m_corpseStart = i;
                        m_corpseEnd   = m_corpseStart;
                    }
                    m_corpseEnd++;
                    m_totalCorpseSize += (int)field.Size;

                    field.Group = ObjectTypeId.Corpse;
                }
                else if (field.Name.StartsWith("DYNAMIC"))
                {
                    if (field.Offset == 0)
                    {
                        m_dynamicObjectStart = i;
                        m_dynamicObjectEnd   = m_dynamicObjectStart;
                    }
                    m_dynamicObjectEnd++;
                    m_totalDynamicObjectSize += (int)field.Size;

                    field.Group = ObjectTypeId.DynamicObject;
                }
                else
                {
                    Console.WriteLine("WARNING: Field was ignored - " + field.Name);
                }
            }
        }
 public NewField(ExtendedUpdateField field)
     : base(field)
 {
 }
 public DeprecatedField(ExtendedUpdateField field)
     : base(field)
 {
 }
 public ChangedField(ExtendedUpdateField original, ExtendedUpdateField mt)
     : base(original)
 {
     Changed = mt;
 }
 public FieldVariation(ExtendedUpdateField original)
 {
     Original = original;
 }
        private void Compare()
        {
            Dictionary <string, ExtendedUpdateField> newFields = new Dictionary <string, ExtendedUpdateField>(100);

            for (var group = (ObjectTypeId)0; group < (ObjectTypeId)UpdateField.ObjectTypeCount; group++)
            {
                var oldGroup    = origFields[(int)group];
                var newGroup    = newVersionFields[(int)group];
                var groupChange = Changes[(int)group] = new List <FieldVariation>(20);

                var count = Math.Max(oldGroup.Length, newGroup.Length);

                uint indexDiff = 0;
                for (uint i = 0; i < count; i++)
                {
                    var origField = oldGroup.Get(i);
                    var newField  = newGroup.Get(i + indexDiff);

                    if (origField == null && newField == null)
                    {
                        continue;
                    }
                    else if (origField == null || newField == null || origField.Name != newField.Name)
                    {
                        // Field moved or got removed

                        ExtendedUpdateField movedTo = null;
                        if (origField != null)
                        {
                            if (!newFields.TryGetValue(origField.Name, out movedTo))
                            {
                                movedTo = Find(newGroup, origField.Name, i + 1);
                            }
                            else
                            {
                                // Field moved to a previous index
                                newFields.Remove(origField.Name);
                            }
                        }

                        if (movedTo == null)
                        {
                            indexDiff = 0;
                            if (origField != null)
                            {
                                // Original Field got deprecated
                                groupChange.Add(new DeprecatedField(origField));
                            }
                        }
                        else
                        {
                            // Field got moved
                            indexDiff = movedTo.Offset - origField.Offset;
                            groupChange.Add(new ChangedField(origField, movedTo));
                        }

                        if (newField != null)
                        {
                            // Field of the new version might be a new addition
                            newFields[newField.Name] = newField;
                        }
                    }
                    else if (!origField.Equals(newField))
                    {
                        groupChange.Add(new ChangedField(origField, newField));
                    }
                }

                foreach (var newField in newFields.Values)
                {
                    bool found = false;
                    for (int i = 0; i < groupChange.Count; i++)
                    {
                        var change = groupChange[i];
                        if (change is ChangedField &&
                            ((ChangedField)change).Changed != null &&
                            ((ChangedField)change).Changed.Offset >= newField.Offset)
                        {
                            groupChange.Insert(i, new NewField(newField));
                            found = true;
                            break;
                        }
                    }

                    if (!found)
                    {
                        groupChange.Add(new NewField(newField));
                    }
                }
                newFields.Clear();
            }
        }