Example #1
0
        public MediumLevelRecordEditor(SubRecord sr, SubrecordStructure ss, dFormIDLookupS formIDLookup,
                                       dFormIDScan formIDScan)
        {
            InitializeComponent();
            Icon = Resources.fomm02;
            SuspendLayout();
            this.sr           = sr;
            this.ss           = ss;
            this.formIDLookup = formIDLookup;
            this.formIDScan   = formIDScan;

            var offset = 0;
            var data   = sr.GetReadonlyData();

            boxes      = new List <TextBox>(ss.elements.Length);
            valueTypes = new List <ElementValueType>(ss.elements.Length);
            elements   = new List <Panel>();
            var groupOffset  = 0;
            var CurrentGroup = 0;

            try
            {
                for (var i = 0; i < ss.elements.Length; i++)
                {
                    if (ss.elements[i].optional && offset == data.Length)
                    {
                        AddElement(ss.elements[i]);
                    }
                    else
                    {
                        AddElement(ss.elements[i], ref offset, data, ref groupOffset, ref CurrentGroup);
                        if (ss.elements[i].repeat)
                        {
                            repeatcount++;
                            if (offset < data.Length)
                            {
                                i--;
                            }
                        }
                    }
                }
                if (ss.elements[ss.elements.Length - 1].repeat && repeatcount > 0)
                {
                    AddElement(ss.elements[ss.elements.Length - 1]);
                }
            }
            catch
            {
                MessageBox.Show("The subrecord doesn't appear to conform to the expected structure.\n" +
                                "Saving is disabled, and the formatted information may be incorrect", "Warning");
                bSave.Enabled = false;
            }
            ResumeLayout();
        }
        public MediumLevelRecordEditor(SubRecord sr, SubrecordStructure ss, dFormIDLookupS formIDLookup, dFormIDScan formIDScan)
        {
            InitializeComponent();
            this.Icon=Fomm.Properties.Resources.fomm02;
            SuspendLayout();
            this.sr=sr;
            this.ss=ss;
            this.formIDLookup=formIDLookup;
            this.formIDScan=formIDScan;

            int offset=0;
            byte[] data=sr.GetReadonlyData();
            boxes=new List<TextBox>(ss.elements.Length);
            valueTypes=new List<ElementValueType>(ss.elements.Length);
            elements=new List<Panel>();
            int groupOffset=0;
            int CurrentGroup=0;
            try {
                for(int i=0;i<ss.elements.Length;i++) {
                    if(ss.elements[i].optional&&offset==data.Length) {
                        AddElement(ss.elements[i]);
                    } else {
                        AddElement(ss.elements[i], ref offset, data, ref groupOffset, ref CurrentGroup);
                        if(ss.elements[i].repeat) {
                            repeatcount++;
                            if(offset<data.Length) i--;
                        }
                    }
                }
                if(ss.elements[ss.elements.Length-1].repeat&&repeatcount>0) {
                    AddElement(ss.elements[ss.elements.Length-1]);
                }
            } catch {
                MessageBox.Show("The subrecord doesn't appear to conform to the expected structure.\n"+
                    "Saving is disabled, and the formatted information may be incorrect", "Warning");
                bSave.Enabled=false;
            }
            ResumeLayout();
        }
Example #3
0
 internal string GetFormattedData(SubrecordStructure ss, dFormIDLookupI formIDLookup)
 {
   var offset = 0;
   var s = ss.name + " (" + ss.desc + ")" + Environment.NewLine;
   try
   {
     for (var j = 0; j < ss.elements.Length; j++)
     {
       if (offset == Data.Length && j == ss.elements.Length - 1 && ss.elements[j].optional)
       {
         break;
       }
       var s2 = "";
       if (!ss.elements[j].notininfo)
       {
         s2 += ss.elements[j].name + ": ";
       }
       switch (ss.elements[j].type)
       {
         case ElementValueType.Int:
           var tmps =
             TypeConverter.h2si(Data[offset], Data[offset + 1], Data[offset + 2], Data[offset + 3]).ToString();
           if (!ss.elements[j].notininfo)
           {
             if (ss.elements[j].hexview)
             {
               s2 +=
                 TypeConverter.h2i(Data[offset], Data[offset + 1], Data[offset + 2], Data[offset + 3]).ToString("X8");
             }
             else
             {
               s2 += tmps;
             }
             if (ss.elements[j].options != null)
             {
               for (var k = 0; k < ss.elements[j].options.Length; k += 2)
               {
                 if (tmps == ss.elements[j].options[k + 1])
                 {
                   s2 += " (" + ss.elements[j].options[k] + ")";
                 }
               }
             }
             else if (ss.elements[j].flags != null)
             {
               var val = TypeConverter.h2i(Data[offset], Data[offset + 1], Data[offset + 2], Data[offset + 3]);
               var tmp2 = "";
               for (var k = 0; k < ss.elements[j].flags.Length; k++)
               {
                 if ((val & (1 << k)) != 0)
                 {
                   if (tmp2.Length > 0)
                   {
                     tmp2 += ", ";
                   }
                   tmp2 += ss.elements[j].flags[k];
                 }
               }
               if (tmp2.Length > 0)
               {
                 s2 += " (" + tmp2 + ")";
               }
             }
           }
           offset += 4;
           break;
         case ElementValueType.Short:
           tmps = TypeConverter.h2ss(Data[offset], Data[offset + 1]).ToString();
           if (!ss.elements[j].notininfo)
           {
             if (ss.elements[j].hexview)
             {
               s2 += TypeConverter.h2ss(Data[offset], Data[offset + 1]).ToString("X4");
             }
             else
             {
               s2 += tmps;
             }
             if (ss.elements[j].options != null)
             {
               for (var k = 0; k < ss.elements[j].options.Length; k += 2)
               {
                 if (tmps == ss.elements[j].options[k + 1])
                 {
                   s2 += " (" + ss.elements[j].options[k] + ")";
                 }
               }
             }
             else if (ss.elements[j].flags != null)
             {
               uint val = TypeConverter.h2s(Data[offset], Data[offset + 1]);
               var tmp2 = "";
               for (var k = 0; k < ss.elements[j].flags.Length; k++)
               {
                 if ((val & (1 << k)) != 0)
                 {
                   if (tmp2.Length > 0)
                   {
                     tmp2 += ", ";
                   }
                   tmp2 += ss.elements[j].flags[k];
                 }
               }
               if (tmp2.Length > 0)
               {
                 s2 += " (" + tmp2 + ")";
               }
             }
           }
           offset += 2;
           break;
         case ElementValueType.Byte:
           tmps = Data[offset].ToString();
           if (!ss.elements[j].notininfo)
           {
             if (ss.elements[j].hexview)
             {
               s2 += Data[offset].ToString("X2");
             }
             else
             {
               s2 += tmps;
             }
             if (ss.elements[j].options != null)
             {
               for (var k = 0; k < ss.elements[j].options.Length; k += 2)
               {
                 if (tmps == ss.elements[j].options[k + 1])
                 {
                   s2 += " (" + ss.elements[j].options[k] + ")";
                 }
               }
             }
             else if (ss.elements[j].flags != null)
             {
               int val = Data[offset];
               var tmp2 = "";
               for (var k = 0; k < ss.elements[j].flags.Length; k++)
               {
                 if ((val & (1 << k)) != 0)
                 {
                   if (tmp2.Length > 0)
                   {
                     tmp2 += ", ";
                   }
                   tmp2 += ss.elements[j].flags[k];
                 }
               }
               if (tmp2.Length > 0)
               {
                 s2 += " (" + tmp2 + ")";
               }
             }
           }
           offset++;
           break;
         case ElementValueType.FormID:
           var id = TypeConverter.h2i(Data[offset], Data[offset + 1], Data[offset + 2], Data[offset + 3]);
           if (!ss.elements[j].notininfo)
           {
             s2 += id.ToString("X8");
           }
           if (formIDLookup != null)
           {
             s2 += ": " + formIDLookup(id);
           }
           offset += 4;
           break;
         case ElementValueType.Float:
           if (!ss.elements[j].notininfo)
           {
             s2 += TypeConverter.h2f(Data[offset], Data[offset + 1], Data[offset + 2], Data[offset + 3]).ToString();
           }
           offset += 4;
           break;
         case ElementValueType.String:
           if (!ss.elements[j].notininfo)
           {
             while (Data[offset] != 0)
             {
               s2 += (char) Data[offset++];
             }
           }
           else
           {
             while (Data[offset] != 0)
             {
               offset++;
             }
           }
           offset++;
           break;
         case ElementValueType.fstring:
           s2 += GetStrData();
           break;
         case ElementValueType.Blob:
           s2 += GetHexData();
           break;
         default:
           throw new ApplicationException();
       }
       if (!ss.elements[j].notininfo)
       {
         s2 += Environment.NewLine;
       }
       if (offset < Data.Length && j == ss.elements.Length - 1 && ss.elements[j].repeat)
       {
         j--;
       }
       s += s2;
     }
   }
   catch
   {
     s += "Warning: Subrecord doesn't seem to match the expected structure" + Environment.NewLine;
   }
   return s;
 }
Example #4
0
 internal string GetDesc(SubrecordStructure[] sss, dFormIDLookupI formIDLookup)
 {
   var start = "[Record]" + Environment.NewLine + GetBaseDesc();
   string end;
   try
   {
     end = GetExtendedDesc(sss, formIDLookup);
   }
   catch
   {
     end =
       "Warning: An error occured while processing the record. It may not conform to the strucure defined in RecordStructure.xml";
   }
   if (end == null)
   {
     return start;
   }
   return start + Environment.NewLine + Environment.NewLine + "[Formatted information]" + Environment.NewLine + end;
 }
Example #5
0
 private string GetExtendedDesc(SubrecordStructure[] sss, dFormIDLookupI formIDLookup)
 {
   if (sss == null)
   {
     return null;
   }
   var s = RecordStructure.Records[Name].description + Environment.NewLine;
   for (var i = 0; i < sss.Length; i++)
   {
     if (sss[i].elements == null)
     {
       return s;
     }
     if (sss[i].notininfo)
     {
       continue;
     }
     s += Environment.NewLine + SubRecords[i].GetFormattedData(sss[i], formIDLookup);
   }
   return s;
 }
Example #6
0
 private static bool MatchRecordCheckCondition(Dictionary<int, Conditional> conditions, SubrecordStructure ss)
 {
   if (ss.Condition == CondType.Exists)
   {
     if (conditions.ContainsKey(ss.CondID))
     {
       return true;
     }
     return false;
   }
   if (ss.Condition == CondType.Missing)
   {
     if (conditions.ContainsKey(ss.CondID))
     {
       return false;
     }
     return true;
   }
   if (!conditions.ContainsKey(ss.CondID))
   {
     return false;
   }
   var cond = conditions[ss.CondID];
   switch (cond.type)
   {
     case ElementValueType.Byte:
     case ElementValueType.Short:
     case ElementValueType.Int:
     case ElementValueType.FormID:
     {
       int i = (int) cond.value, i2;
       if (!int.TryParse(ss.CondOperand, out i2))
       {
         return false;
       }
       switch (ss.Condition)
       {
         case CondType.Equal:
           return i == i2;
         case CondType.Not:
           return i != i2;
         case CondType.Less:
           return i < i2;
         case CondType.Greater:
           return i > i2;
         case CondType.GreaterEqual:
           return i >= i2;
         case CondType.LessEqual:
           return i <= i2;
         default:
           return false;
       }
     }
     case ElementValueType.Float:
     {
       float i = (float) cond.value, i2;
       if (!float.TryParse(ss.CondOperand, out i2))
       {
         return false;
       }
       switch (ss.Condition)
       {
         case CondType.Equal:
           return i == i2;
         case CondType.Not:
           return i != i2;
         case CondType.Less:
           return i < i2;
         case CondType.Greater:
           return i > i2;
         case CondType.GreaterEqual:
           return i >= i2;
         case CondType.LessEqual:
           return i <= i2;
         default:
           return false;
       }
     }
     case ElementValueType.fstring:
     case ElementValueType.String:
     {
       var s = (string) cond.value;
       switch (ss.Condition)
       {
         case CondType.Equal:
           return s == ss.CondOperand;
         case CondType.Not:
           return s != ss.CondOperand;
         case CondType.StartsWith:
           return s.StartsWith(ss.CondOperand);
         case CondType.EndsWith:
           return s.EndsWith(ss.CondOperand);
         case CondType.Contains:
           return s.Contains(ss.CondOperand);
         default:
           return false;
       }
     }
     default:
       return false;
   }
 }
Example #7
0
        internal string GetFormattedData(SubrecordStructure ss, dFormIDLookupI formIDLookup)
        {
            var offset = 0;
            var s      = ss.name + " (" + ss.desc + ")" + Environment.NewLine;

            try
            {
                for (var j = 0; j < ss.elements.Length; j++)
                {
                    if (offset == Data.Length && j == ss.elements.Length - 1 && ss.elements[j].optional)
                    {
                        break;
                    }
                    var s2 = "";
                    if (!ss.elements[j].notininfo)
                    {
                        s2 += ss.elements[j].name + ": ";
                    }
                    switch (ss.elements[j].type)
                    {
                    case ElementValueType.Int:
                        var tmps =
                            TypeConverter.h2si(Data[offset], Data[offset + 1], Data[offset + 2], Data[offset + 3]).ToString();
                        if (!ss.elements[j].notininfo)
                        {
                            if (ss.elements[j].hexview)
                            {
                                s2 +=
                                    TypeConverter.h2i(Data[offset], Data[offset + 1], Data[offset + 2], Data[offset + 3]).ToString("X8");
                            }
                            else
                            {
                                s2 += tmps;
                            }
                            if (ss.elements[j].options != null)
                            {
                                for (var k = 0; k < ss.elements[j].options.Length; k += 2)
                                {
                                    if (tmps == ss.elements[j].options[k + 1])
                                    {
                                        s2 += " (" + ss.elements[j].options[k] + ")";
                                    }
                                }
                            }
                            else if (ss.elements[j].flags != null)
                            {
                                var val  = TypeConverter.h2i(Data[offset], Data[offset + 1], Data[offset + 2], Data[offset + 3]);
                                var tmp2 = "";
                                for (var k = 0; k < ss.elements[j].flags.Length; k++)
                                {
                                    if ((val & (1 << k)) != 0)
                                    {
                                        if (tmp2.Length > 0)
                                        {
                                            tmp2 += ", ";
                                        }
                                        tmp2 += ss.elements[j].flags[k];
                                    }
                                }
                                if (tmp2.Length > 0)
                                {
                                    s2 += " (" + tmp2 + ")";
                                }
                            }
                        }
                        offset += 4;
                        break;

                    case ElementValueType.Short:
                        tmps = TypeConverter.h2ss(Data[offset], Data[offset + 1]).ToString();
                        if (!ss.elements[j].notininfo)
                        {
                            if (ss.elements[j].hexview)
                            {
                                s2 += TypeConverter.h2ss(Data[offset], Data[offset + 1]).ToString("X4");
                            }
                            else
                            {
                                s2 += tmps;
                            }
                            if (ss.elements[j].options != null)
                            {
                                for (var k = 0; k < ss.elements[j].options.Length; k += 2)
                                {
                                    if (tmps == ss.elements[j].options[k + 1])
                                    {
                                        s2 += " (" + ss.elements[j].options[k] + ")";
                                    }
                                }
                            }
                            else if (ss.elements[j].flags != null)
                            {
                                uint val  = TypeConverter.h2s(Data[offset], Data[offset + 1]);
                                var  tmp2 = "";
                                for (var k = 0; k < ss.elements[j].flags.Length; k++)
                                {
                                    if ((val & (1 << k)) != 0)
                                    {
                                        if (tmp2.Length > 0)
                                        {
                                            tmp2 += ", ";
                                        }
                                        tmp2 += ss.elements[j].flags[k];
                                    }
                                }
                                if (tmp2.Length > 0)
                                {
                                    s2 += " (" + tmp2 + ")";
                                }
                            }
                        }
                        offset += 2;
                        break;

                    case ElementValueType.Byte:
                        tmps = Data[offset].ToString();
                        if (!ss.elements[j].notininfo)
                        {
                            if (ss.elements[j].hexview)
                            {
                                s2 += Data[offset].ToString("X2");
                            }
                            else
                            {
                                s2 += tmps;
                            }
                            if (ss.elements[j].options != null)
                            {
                                for (var k = 0; k < ss.elements[j].options.Length; k += 2)
                                {
                                    if (tmps == ss.elements[j].options[k + 1])
                                    {
                                        s2 += " (" + ss.elements[j].options[k] + ")";
                                    }
                                }
                            }
                            else if (ss.elements[j].flags != null)
                            {
                                int val  = Data[offset];
                                var tmp2 = "";
                                for (var k = 0; k < ss.elements[j].flags.Length; k++)
                                {
                                    if ((val & (1 << k)) != 0)
                                    {
                                        if (tmp2.Length > 0)
                                        {
                                            tmp2 += ", ";
                                        }
                                        tmp2 += ss.elements[j].flags[k];
                                    }
                                }
                                if (tmp2.Length > 0)
                                {
                                    s2 += " (" + tmp2 + ")";
                                }
                            }
                        }
                        offset++;
                        break;

                    case ElementValueType.FormID:
                        var id = TypeConverter.h2i(Data[offset], Data[offset + 1], Data[offset + 2], Data[offset + 3]);
                        if (!ss.elements[j].notininfo)
                        {
                            s2 += id.ToString("X8");
                        }
                        if (formIDLookup != null)
                        {
                            s2 += ": " + formIDLookup(id);
                        }
                        offset += 4;
                        break;

                    case ElementValueType.Float:
                        if (!ss.elements[j].notininfo)
                        {
                            s2 += TypeConverter.h2f(Data[offset], Data[offset + 1], Data[offset + 2], Data[offset + 3]).ToString();
                        }
                        offset += 4;
                        break;

                    case ElementValueType.String:
                        if (!ss.elements[j].notininfo)
                        {
                            while (Data[offset] != 0)
                            {
                                s2 += (char)Data[offset++];
                            }
                        }
                        else
                        {
                            while (Data[offset] != 0)
                            {
                                offset++;
                            }
                        }
                        offset++;
                        break;

                    case ElementValueType.fstring:
                        s2 += GetStrData();
                        break;

                    case ElementValueType.Blob:
                        s2 += GetHexData();
                        break;

                    default:
                        throw new ApplicationException();
                    }
                    if (!ss.elements[j].notininfo)
                    {
                        s2 += Environment.NewLine;
                    }
                    if (offset < Data.Length && j == ss.elements.Length - 1 && ss.elements[j].repeat)
                    {
                        j--;
                    }
                    s += s2;
                }
            }
            catch
            {
                s += "Warning: Subrecord doesn't seem to match the expected structure" + Environment.NewLine;
            }
            return(s);
        }