Beispiel #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();
        }
Beispiel #2
0
 /// <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;
 }
Beispiel #3
0
        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();
        }
Beispiel #5
0
 private SubRecord(SubRecord sr)
 {
   Name = sr.Name;
   Data = (byte[]) sr.Data.Clone();
 }
Beispiel #6
0
    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;
    }
Beispiel #8
0
 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");
     }
 }
Beispiel #9
0
        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;
        }
Beispiel #10
0
        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();
            }
        }
Beispiel #11
0
 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);
 }
Beispiel #12
0
 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);
 }
Beispiel #13
0
 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);
   }
 }
Beispiel #14
0
 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();
       }
     }
   }
 }
Beispiel #15
0
 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);
 }
Beispiel #17
0
        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);
 }