コード例 #1
0
        public static SkAttribsModifier Create(string desc)
        {
            if (desc.Equals("0") || desc.Equals(""))
            {
                return(null);
            }

            SkAttribsModifier modifier = new SkAttribsModifier();

            string[] strMods = desc.Split('#');                 // use this as splitter because it is not used in expression
            foreach (string strMod in strMods)
            {
                string[] descOp = strMod.Split(new Char[] { ',' }, 2);
                switch (descOp[0].ToLower())
                {
                case "mat":     {
                    SkAttribsOpMAT op = new SkAttribsOpMAT(descOp[1]);
                    modifier._tmpOps.Add(op);
                    modifier._tmpOpsIdxs.Add(op._idx);
                }
                break;

                case "mad":
                    modifier._ops.Add(new SkAttribsOpMAD(descOp[1]));
                    break;

                case "exp":
                {
                    SkAttribsOpEXP op = new SkAttribsOpEXP(descOp[1]);
                    if (op._bTmpOp)
                    {
                        modifier._tmpOps.Add(op);
                        modifier._tmpOpsIdxs.Add(op._idx);
                    }
                    else
                    {
                        modifier._ops.Add(op);
                    }
                }
                break;

                case "get":
                    modifier._ops.Add(new SkAttribsOpGET(descOp[1]));
                    break;

                case "rnd":
                    modifier._ops.Add(new SkAttribsOpRND(descOp[1]));
                    break;

                default:
                    Debug.Log("[Error]:Unrecognized atttribModifier." + strMod);
                    continue;
                }
            }
            return(modifier);
        }
コード例 #2
0
        public void Compile()
        {
            int t = Environment.TickCount;

#if DBG_ExpCompile
            _srcCode = "public static class Func0{ public static void func(ISkAttribs caster, ISkAttribs target, ISkAttribsModPara para){ " +
                       "caster.raws[0] += target.sums[0];" +
                       "caster.sums[0] += target.raws[0];" +
                       "caster.raws[1] += target.sums[1];" +
                       "caster.sums[1] += target.raws[1];" +
                       //"caster.pack += 12;" +
                       "caster.mask[0] = true;" +
                       "}}";
            Assembly asm0 = CompileExpressionToMethod(_srcCode);
            _reqs[0].OnCompiled(asm0);
            bool[] masks = new bool[32];
            masks[0] = true;
            masks[1] = false;
            SkAttribsOpEXP op = (SkAttribsOpEXP)_reqs[0];
            SkAttribs      casterBaseAttrib = new SkAttribs();
            SkAttribs      casterAttrib     = new SkAttribs(casterBaseAttrib, masks);
            SkAttribs      targetBaseAttrib = new SkAttribs();
            SkAttribs      targetAttrib     = new SkAttribs(casterBaseAttrib, masks);
            op.Exec(targetAttrib, casterAttrib, targetAttrib, null);
#else
            Assembly asm = CompileExpressionToMethod(_srcCode);
            int      n   = _reqs.Count;
            for (int i = 0; i < n; i++)
            {
                MethodInfo method = asm.GetType("Func" + i).GetMethod("func");
                System.Action <ISkAttribs, ISkAttribs, ISkAttribsModPara> action = (System.Action <ISkAttribs, ISkAttribs, ISkAttribsModPara>)Delegate.CreateDelegate(typeof(System.Action <ISkAttribs, ISkAttribs, ISkAttribsModPara>), null, method);
                _reqs[i].OnCompiled(action);
            }
#endif
            Debug.Log("[EXP]All Compiled:" + (Environment.TickCount - t));

            _reqs.Clear();
            _srcCode = "";
        }