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(); }
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; }
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; }
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; }
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; } }
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); }