Beispiel #1
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 #2
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;
        }
Beispiel #3
0
        private void AddElement(ElementStructure es, ref int offset, byte[] data, ref int groupOffset, ref int CurrentGroup)
        {
            var panel1 = new Panel();

            panel1.AutoSize = true;
            panel1.Width    = fpanel1.Width;
            panel1.Height   = 1;
            var ypos = 0;

            var tb = new TextBox();

            boxes.Add(tb);
            if (es.group != 0)
            {
                var cb = new CheckBox();
                cb.Text = "Use this value?";
                panel1.Controls.Add(cb);
                cb.Location = new Point(10, ypos);
                ypos       += 24;
                cb.Tag      = new cbTag(es.group, tb);
                if (CurrentGroup != es.group)
                {
                    cb.Checked = true;
                }
                else
                {
                    tb.Enabled = false;
                }
                cb.CheckedChanged += CheckBox_CheckedChanged;
            }
            if (es.optional || es.repeat && repeatcount > 0)
            {
                var cb = new CheckBox();
                cb.Text = "Use this value?";
                panel1.Controls.Add(cb);
                cb.Location = new Point(10, ypos);
                ypos       += 24;
                cb.Tag      = new repeatCbTag(tb, elements.Count);
                if (data == null)
                {
                    tb.Enabled = false;
                }
                else
                {
                    cb.Checked = true;
                }
                cb.CheckedChanged += RepeatCheckBox_CheckedChanged;
            }
            if ((CurrentGroup == 0 && es.group != 0) || (CurrentGroup != 0 && es.group != 0 && CurrentGroup != es.group))
            {
                CurrentGroup = es.group;
                groupOffset  = offset;
            }
            else if (CurrentGroup != 0 && es.group == 0)
            {
                CurrentGroup = 0;
            }
            else if (CurrentGroup != 0 && CurrentGroup == es.group)
            {
                offset = groupOffset;
            }
            valueTypes.Add(es.type);
            if (data != null)
            {
                switch (es.type)
                {
                case ElementValueType.Int:
                    tb.Text = TypeConverter.h2si(data[offset], data[offset + 1], data[offset + 2], data[offset + 3]).ToString();
                    offset += 4;
                    break;

                case ElementValueType.FormID:
                    tb.Text =
                        TypeConverter.h2i(data[offset], data[offset + 1], data[offset + 2], data[offset + 3]).ToString("X8");
                    offset += 4;
                    break;

                case ElementValueType.Float:
                    tb.Text = TypeConverter.h2f(data[offset], data[offset + 1], data[offset + 2], data[offset + 3]).ToString();
                    offset += 4;
                    break;

                case ElementValueType.Short:
                    tb.Text = TypeConverter.h2ss(data[offset], data[offset + 1]).ToString();
                    offset += 2;
                    break;

                case ElementValueType.Byte:
                    tb.Text = data[offset].ToString();
                    offset++;
                    break;

                case ElementValueType.String:
                    var s = "";
                    while (data[offset] != 0)
                    {
                        s += (char)data[offset++];
                    }
                    offset++;
                    tb.Text   = s;
                    tb.Width += 200;
                    break;

                case ElementValueType.fstring:
                    tb.Text   = sr.GetStrData();
                    tb.Width += 200;
                    break;

                default:
                    throw new ApplicationException();
                }
            }
            else
            {
                if (es.type == ElementValueType.String || es.type == ElementValueType.fstring)
                {
                    tb.Width += 200;
                }
                if (removedStrings.ContainsKey(boxes.Count - 1))
                {
                    tb.Text = removedStrings[boxes.Count - 1];
                }
            }
            var l = new Label();

            l.AutoSize = true;
            var tmp = es.type.ToString();

            l.Text = tmp + ": " + es.name + (es.desc != null ? (" (" + es.desc + ")") : "");
            panel1.Controls.Add(tb);
            tb.Location = new Point(10, ypos);
            if (es.multiline)
            {
                tb.Multiline = true;
                ypos        += tb.Height * 5;
                tb.Height   *= 6;
            }
            panel1.Controls.Add(l);
            l.Location = new Point(tb.Right + 10, ypos + 3);
            string[] options = null;
            if (es.type == ElementValueType.FormID)
            {
                ypos += 28;
                var b = new Button();
                b.Text   = "FormID lookup";
                b.Click += LookupFormID_Click;
                panel1.Controls.Add(b);
                b.Location = new Point(20, ypos);
                var tb2 = new TextBox();
                tb2.Width   += 200;
                tb2.ReadOnly = true;
                panel1.Controls.Add(tb2);
                tb2.Location = new Point(b.Right + 10, ypos);
                b.Tag        = new bTag(tb, tb2);
                if (es.FormIDType != null)
                {
                    if (cachedFormIDs.ContainsKey(es.FormIDType))
                    {
                        options = cachedFormIDs[es.FormIDType];
                    }
                    else
                    {
                        options = formIDScan(es.FormIDType);
                        cachedFormIDs[es.FormIDType] = options;
                    }
                }
            }
            else if (es.options != null)
            {
                options = es.options;
            }
            if (options != null)
            {
                ypos += 28;
                var cmb = new ComboBox();
                cmb.Tag    = tb;
                cmb.Width += 200;
                for (var j = 0; j < options.Length; j += 2)
                {
                    cmb.Items.Add(new comboBoxItem(options[j], options[j + 1]));
                }
                cmb.KeyPress             += cb_KeyPress;
                cmb.ContextMenu           = new ContextMenu();
                cmb.SelectedIndexChanged += cb_SelectedIndexChanged;
                panel1.Controls.Add(cmb);
                cmb.Location = new Point(20, ypos);
            }

            fpanel1.Controls.Add(panel1);
            elements.Add(panel1);
        }