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(); }
/// <summary> /// Compiles the result script. /// </summary> /// <seealso cref="ModScript.CompileResultScript(Fomm.TESsnip.SubRecord sr, out Fomm.TESsnip.Record r2, out string msg)"/> public static void CompileResultScript(SubRecord sr, out Record r2, out string msg) { Record r; try { Script.CompileResultScript(sr, out r, out msg); } catch (Exception e) { LastError = e.Message; r = null; msg = null; } if (r != null) r2 = (Record)r.Clone(); else r2 = null; }
internal Record(string name, uint Size, BinaryReader br, bool Oblivion) { Name = name; Flags1 = br.ReadUInt32(); FormID = br.ReadUInt32(); Flags2 = br.ReadUInt32(); if (!Oblivion) { Flags3 = br.ReadUInt32(); } if ((Flags1 & 0x00040000) > 0) { Flags1 ^= 0x00040000; var newSize = br.ReadUInt32(); br = Decompress(br, (int)(Size - 4), (int)newSize); Size = newSize; } uint AmountRead = 0; while (AmountRead < Size) { var s = ReadRecName(br); uint i = 0; if (s == "XXXX") { br.ReadUInt16(); i = br.ReadUInt32(); s = ReadRecName(br); } var r = new SubRecord(s, br, i); AmountRead += (uint)(r.Size2); SubRecords.Add(r); } if (AmountRead > Size) { throw new TESParserException("Subrecord block did not match the size specified in the record header"); } //br.BaseStream.Position+=Size; if (SubRecords.Count > 0 && SubRecords[0].Name == "EDID") { descriptiveName = " (" + SubRecords[0].GetStrData() + ")"; } }
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(); }
private SubRecord(SubRecord sr) { Name = sr.Name; Data = (byte[]) sr.Data.Clone(); }
internal Record(string name, uint Size, BinaryReader br, bool Oblivion) { Name = name; Flags1 = br.ReadUInt32(); FormID = br.ReadUInt32(); Flags2 = br.ReadUInt32(); if (!Oblivion) { Flags3 = br.ReadUInt32(); } if ((Flags1 & 0x00040000) > 0) { Flags1 ^= 0x00040000; var newSize = br.ReadUInt32(); br = Decompress(br, (int) (Size - 4), (int) newSize); Size = newSize; } uint AmountRead = 0; while (AmountRead < Size) { var s = ReadRecName(br); uint i = 0; if (s == "XXXX") { br.ReadUInt16(); i = br.ReadUInt32(); s = ReadRecName(br); } var r = new SubRecord(s, br, i); AmountRead += (uint) (r.Size2); SubRecords.Add(r); } if (AmountRead > Size) { throw new TESParserException("Subrecord block did not match the size specified in the record header"); } //br.BaseStream.Position+=Size; if (SubRecords.Count > 0 && SubRecords[0].Name == "EDID") { descriptiveName = " (" + SubRecords[0].GetStrData() + ")"; } }
/// <summary> /// Gets the well-known MESG record's subrecord data containg the critical record info. /// </summary> /// <remarks> /// If the required record is not found, it is created. /// </remarks> /// <returns>The well-known MESG record's subrecord data containg the critical record info.</returns> protected SubRecord getCriticalRecordData() { GroupRecord grcGroup = null; Record recCriticalRecords = null; SubRecord srcCriticalData = null; foreach (var rec in Records) { grcGroup = rec as GroupRecord; if (grcGroup == null) { continue; } if (grcGroup.ContentsType == "MESG") { foreach (Record recRecord in grcGroup.Records) { foreach (var srcSubRecord in recRecord.SubRecords) { switch (srcSubRecord.Name) { case "EDID": if (srcSubRecord.GetStrData().Equals(CRITICAL_DATA_RECORD_EDID)) { recCriticalRecords = recRecord; } break; case "DESC": srcCriticalData = srcSubRecord; break; } } if (recCriticalRecords != null) { return srcCriticalData; } } } } //if there is no MESG group, create one if (grcGroup == null) { grcGroup = new GroupRecord("MESG"); AddRecord(grcGroup); } //if there is no fommCriticalRecords record, create one, we returned otherwise. recCriticalRecords = new Record(); recCriticalRecords.Name = "MESG"; var uintMastersCount = (UInt32) Masters.Count << 24; var uintFormId = uintMastersCount + 1; while (ContainsFormId(uintFormId)) { uintFormId++; } if ((uintFormId & 0xff000000) != uintMastersCount) { throw new PluginFullException("No available Form Id for new MESG record"); } recCriticalRecords.FormID = uintFormId; recCriticalRecords.Flags2 = 0x00044210; recCriticalRecords.Flags3 = 0x0002000f; var srcSub = new SubRecord(); srcSub.Name = "EDID"; srcSub.SetStrData(CRITICAL_DATA_RECORD_EDID, true); recCriticalRecords.SubRecords.Add(srcSub); srcCriticalData = new SubRecord(); srcCriticalData.Name = "DESC"; recCriticalRecords.SubRecords.Add(srcCriticalData); srcSub = new SubRecord(); srcSub.Name = "INAM"; srcSub.SetData(new byte[] { 0, 0, 0, 0 }); recCriticalRecords.SubRecords.Add(srcSub); srcSub = new SubRecord(); srcSub.Name = "DNAM"; srcSub.SetData(new byte[] { 0, 0, 0, 0 }); recCriticalRecords.SubRecords.Add(srcSub); srcSub = new SubRecord(); srcSub.Name = "TNAM"; srcSub.SetData(new byte[] { 0, 0, 0, 1 }); recCriticalRecords.SubRecords.Add(srcSub); grcGroup.AddRecord(recCriticalRecords); return srcCriticalData; }
private static void EmitRefLabel(Token t, RefType type) { if(t.type==TokenType.Global) { EmitByte(0x47); } else { switch(type) { case RefType.Standard: Emit(0x1c); break; case RefType.Expression: EmitByte(0x72); break; case RefType.Standalone: EmitByte(0x5a); break; } } if(t.type==TokenType.Local) { LocalVar var=locals[t.token]; if(var.refid==0) AddError("Variable was not of type ref"); else Emit((ushort)var.refid); } else if(t.type==TokenType.edid||t.type==TokenType.Global) { if(!edidRefs.ContainsKey(t.token)) { SubRecord sr=new SubRecord(); sr.Name="SCRO"; if(t.type==TokenType.edid) sr.SetData(TypeConverter.i2h(edidList[t.token].Key)); else sr.SetData(TypeConverter.i2h(globals[t.token])); r.AddRecord(sr); refcount++; edidRefs[t.token]=(ushort)refcount; } Emit(edidRefs[t.token]); } else { AddError("Expected ref variable or edid"); } }
public static bool Compile(Record r2, out string msg) { msg=null; r=new Record(); string script=null; int scptype=0; foreach(SubRecord sr2 in r2.SubRecords) { if(sr2.Name=="SCTX") script=sr2.GetStrData(); if(sr2.Name=="SCHR") { byte[] tmp=sr2.GetReadonlyData(); scptype=TypeConverter.h2si(tmp[16], tmp[17], tmp[18], tmp[19]); } } if(script==null) { msg="Script had no SCTX record to compile"; return false; } locals.Clear(); localList.Clear(); edidRefs.Clear(); refcount=0; errors.Clear(); ts=new TokenStream(script, errors); if(errors.Count>0) return OutputErrors( out msg); Token[] smt=ts.PopNextStatement(); if(smt.Length!=2||!smt[0].IsKeyword(Keywords.ScriptName)||smt[1].token==null) return ReturnError("Expected 'ScriptName <edid>'", out msg); SubRecord sr=new SubRecord(); sr.Name="EDID"; sr.SetStrData(smt[1].utoken, true); r.AddRecord(sr); r.descriptiveName=" ("+smt[1].token+")"; schr=new SubRecord(); schr.Name="SCHR"; r.AddRecord(schr); scda=new SubRecord(); scda.Name="SCDA"; r.AddRecord(scda); sr=new SubRecord(); sr.Name="SCTX"; sr.SetStrData(script, false); r.AddRecord(sr); bw=new BinaryWriter(new MemoryStream()); Emit(0x001d); Emit(0x0000); try { HandleVariables(); } catch(Exception ex) { return ReturnError(ex.Message, out msg); } for(int i=0;i<localList.Count;i++) { if(localList[i].type==VarType.Ref) { sr=new SubRecord(); sr.Name="SCRV"; sr.SetData(TypeConverter.si2h(i+1)); r.AddRecord(sr); refcount++; localList[i].refid=refcount; } } while(ts.PeekNextStatement().Length>0) { try { HandleBlock(); } catch(Exception ex) { return ReturnError(ex.Message, out msg); } } if(errors.Count>0) { return OutputErrors(out msg); } byte[] header=new byte[20]; TypeConverter.si2h(refcount, header, 4); TypeConverter.i2h((uint)bw.BaseStream.Length, header, 8); TypeConverter.si2h(localList.Count, header, 12); TypeConverter.si2h(scptype, header, 16); schr.SetData(header); byte[] compileddata=((MemoryStream)bw.BaseStream).GetBuffer(); if(compileddata.Length!=bw.BaseStream.Length) Array.Resize<byte>(ref compileddata, (int)bw.BaseStream.Length); scda.SetData(compileddata); r2.SubRecords.Clear(); r2.SubRecords.AddRange(r.SubRecords); bw.Close(); return true; }
private static void HandleVariables() { Token[] smt=ts.PeekNextStatement(); SubRecord slsd; SubRecord scvr; while(smt.Length>0&&smt[0].IsType()) { ts.PopNextStatement(); if(smt.Length!=2||smt[1].type!=TokenType.Unknown) { AddError("Expected <type> <variable name>"); smt=ts.PeekNextStatement(); continue; } slsd=new SubRecord(); slsd.Name="SLSD"; byte[] data=new byte[24]; TypeConverter.si2h(locals.Count+1, data, 0); if(smt[0].IsKeyword(Keywords.Int)) data[16]=1; slsd.SetData(data); r.AddRecord(slsd); scvr=new SubRecord(); scvr.Name="SCVR"; scvr.SetStrData(smt[1].utoken, true); r.AddRecord(scvr); LocalVar lv=new LocalVar(locals.Count+1, smt[0]); locals.Add(smt[1].token, lv); localList.Add(lv); ts.AddLocal(smt[1].token); smt=ts.PeekNextStatement(); } }
private void insertSubrecordToolStripMenuItem_Click(object sender, EventArgs e) { if (searchForm != null && searchForm.InSearch) { MessageBox.Show("Cannot modify contents while searching", "Error"); return; } var node = (BaseRecord) PluginTree.SelectedNode.Tag; var p = new SubRecord(); node.AddRecord(p); PluginTree_AfterSelect(null, null); }
private void newToolStripMenuItem_Click(object sender, EventArgs e) { if (searchForm != null && searchForm.InSearch) { MessageBox.Show("Cannot modify contents while searching", "Error"); return; } var p = new Plugin(); var r = new Record(); r.Name = "TES4"; var sr = new SubRecord(); sr.Name = "HEDR"; sr.SetData(new byte[] { 0xD7, 0xA3, 0x70, 0x3F, 0xFA, 0x56, 0x0C, 0x00, 0x19, 0xEA, 0x07, 0xFF }); r.AddRecord(sr); sr = new SubRecord(); sr.Name = "CNAM"; sr.SetData(Encoding.ASCII.GetBytes("Default\0")); r.AddRecord(sr); p.AddRecord(r); var tn = new TreeNode(p.Name); tn.Tag = p; var tn2 = new TreeNode(r.DescriptiveName); tn2.Tag = r; tn.Nodes.Add(tn2); PluginTree.Nodes.Add(tn); }
private void addMasterToolStripMenuItem_Click(object sender, EventArgs e) { if (searchForm != null && searchForm.InSearch) { MessageBox.Show("Cannot modify contents while searching", "Error"); return; } var amfNewMaster = new AddMasterForm(); if (amfNewMaster.ShowDialog() == DialogResult.OK) { //find the root node for the current plugin var tndRoot = PluginTree.SelectedNode; if (tndRoot == null) { MessageBox.Show(this, "No plugin selected. Cannot continue.", "Missing Plugin", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } while (tndRoot.Parent != null) { tndRoot = tndRoot.Parent; } BaseRecord brcTES4 = null; foreach (TreeNode tndRecord in tndRoot.Nodes) { brcTES4 = (BaseRecord) tndRecord.Tag; if (brcTES4.Name.Equals("TES4")) { break; } brcTES4 = null; } if (brcTES4 == null) { MessageBox.Show(this, "Plugin lacks a vlid TES4 record. Cannot continue.", "Missing Record", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } var sbrMaster = new SubRecord(); sbrMaster.Name = "MAST"; var intCount = Encoding.UTF8.GetByteCount(amfNewMaster.MasterName); var bteData = new byte[intCount + 1]; Array.Copy(Encoding.UTF8.GetBytes(amfNewMaster.MasterName), bteData, intCount); sbrMaster.SetData(bteData); brcTES4.AddRecord(sbrMaster); sbrMaster = new SubRecord(); sbrMaster.Name = "DATA"; sbrMaster.SetData(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 }); brcTES4.AddRecord(sbrMaster); PluginTree_AfterSelect(null, null); } }
private static void MatchRecordAddConditionals(Dictionary<int, Conditional> conditions, SubRecord sr, ElementStructure[] ess) { var offset = 0; var data = sr.GetReadonlyData(); for (var j = 0; j < ess.Length; j++) { if (ess[j].CondID != 0) { switch (ess[j].type) { case ElementValueType.Int: case ElementValueType.FormID: conditions[ess[j].CondID] = new Conditional(ElementValueType.Int, TypeConverter.h2si(data[offset], data[offset + 1], data[offset + 2], data[offset + 3])); offset += 4; break; case ElementValueType.Float: conditions[ess[j].CondID] = new Conditional(ElementValueType.Float, TypeConverter.h2f(data[offset], data[offset + 1], data[offset + 2], data[offset + 3])); offset += 4; break; case ElementValueType.Short: conditions[ess[j].CondID] = new Conditional(ElementValueType.Short, (int) TypeConverter.h2ss(data[offset], data[offset + 1])); offset += 2; break; case ElementValueType.Byte: conditions[ess[j].CondID] = new Conditional(ElementValueType.Byte, (int) data[offset]); offset++; break; case ElementValueType.String: var s = ""; while (data[offset] != 0) { s += (char) data[offset++]; } offset++; conditions[ess[j].CondID] = new Conditional(ElementValueType.String, s); break; case ElementValueType.fstring: conditions[ess[j].CondID] = new Conditional(ElementValueType.String, sr.GetStrData()); break; default: throw new ApplicationException(); } } else { switch (ess[j].type) { case ElementValueType.Int: case ElementValueType.FormID: case ElementValueType.Float: offset += 4; break; case ElementValueType.Short: offset += 2; break; case ElementValueType.Byte: offset++; break; case ElementValueType.String: while (data[offset] != 0) { offset++; } offset++; break; case ElementValueType.fstring: break; default: throw new ApplicationException(); } } } }
private SubRecord(SubRecord sr) { Name = sr.Name; Data = (byte[])sr.Data.Clone(); }
/// <summary> /// Compiles the result script. /// </summary> public void CompileResultScript(SubRecord sr, out Record r2, out string msg) { ScriptCompiler.CompileResultScript(sr, out r2, out msg); }
public static bool CompileResultScript(SubRecord sr, out Record r2, out string msg) { msg=null; r2=null; r=new Record(); string script=sr.GetStrData(); locals.Clear(); localList.Clear(); edidRefs.Clear(); refcount=0; errors.Clear(); ts=new TokenStream(script, errors); if(errors.Count>0) return OutputErrors(out msg); schr=new SubRecord(); schr.Name="SCHR"; r.AddRecord(schr); scda=new SubRecord(); scda.Name="SCDA"; r.AddRecord(scda); sr=(SubRecord)sr.Clone(); r.AddRecord(sr); bw=new BinaryWriter(new MemoryStream()); while(ts.PeekNextStatement().Length>0) { try { HandleResultsBlock(); } catch(Exception ex) { return ReturnError(ex.Message, out msg); } } if(errors.Count>0) { return OutputErrors(out msg); } byte[] header=new byte[20]; TypeConverter.si2h(refcount, header, 4); TypeConverter.i2h((uint)bw.BaseStream.Length, header, 8); TypeConverter.si2h(localList.Count, header, 12); TypeConverter.si2h(0x10000, header, 16); schr.SetData(header); byte[] compileddata=((MemoryStream)bw.BaseStream).GetBuffer(); if(compileddata.Length!=bw.BaseStream.Length) Array.Resize<byte>(ref compileddata, (int)bw.BaseStream.Length); scda.SetData(compileddata); bw.Close(); r2=r; return true; }
/// <summary> /// Compiles the result script. /// </summary> public void CompileResultScript(SubRecord sr, out Record r2, out string msg) { Fomm.Games.Fallout3.Tools.TESsnip.ScriptCompiler.ScriptCompiler.CompileResultScript(sr, out r2, out msg); }