示例#1
0
        public static LuaValue date(LuaValue[] values)
        {
            LuaString format = values[0] as LuaString;

            if (format != null)
            {
                if (format.Text == "*t")
                {
                    LuaTable table = new LuaTable();
                    DateTime now   = DateTime.Now;
                    table.SetNameValue("year", new LuaNumber(now.Year));
                    table.SetNameValue("month", new LuaNumber(now.Month));
                    table.SetNameValue("day", new LuaNumber(now.Day));
                    table.SetNameValue("hour", new LuaNumber(now.Hour));
                    table.SetNameValue("min", new LuaNumber(now.Minute));
                    table.SetNameValue("sec", new LuaNumber(now.Second));
                    table.SetNameValue("wday", new LuaNumber((int)now.DayOfWeek));
                    table.SetNameValue("yday", new LuaNumber(now.DayOfYear));
                    table.SetNameValue("isdst", LuaBoolean.From(now.IsDaylightSavingTime()));
                }
                else
                {
                    return(new LuaString(DateTime.Now.ToString(format.Text)));
                }
            }

            return(new LuaString(DateTime.Now.ToShortDateString()));
        }
示例#2
0
        public static LuaValue IsMemberOf(LuaValue[] args)
        {
            LuaClass _class = args[1] as LuaClass;
            LuaValue obj    = args[0];

            return(LuaBoolean.From(_class.Self.GetValue(obj) != LuaNil.Nil));
        }
示例#3
0
        public static LuaValue IsObjectOf(LuaValue[] args)
        {
            LuaClass c      = args[0] as LuaClass;
            LuaClass _class = args[1] as LuaClass;

            return(LuaBoolean.From(c == _class));
        }
        public static LuaValue removeitem(LuaValue[] values)
        {
            LuaTable table = values[0] as LuaTable;
            LuaValue item  = values[1];

            bool removed = table.Remove(item);

            return(LuaBoolean.From(removed));
        }
示例#5
0
        private LuaValue PrefixUnaryOperation(string Operator, Term RightOperand, LuaTable enviroment)
        {
            LuaValue rightValue = RightOperand.Evaluate(enviroment);

            switch (Operator)
            {
            case "-":
                var number = rightValue as LuaNumber;
                if (number != null)
                {
                    return(new LuaNumber(-number.Number));
                }
                else
                {
                    LuaFunction func = GetMetaFunction("__unm", rightValue, null);
                    if (func != null)
                    {
                        return(func.Invoke(new LuaValue[] { rightValue }));
                    }
                }
                break;

            case "#":
                var table = rightValue as LuaTable;
                if (table != null)
                {
                    return(new LuaNumber(table.Length));
                }
                var str = rightValue as LuaString;
                if (str != null)
                {
                    return(new LuaNumber(str.Text.Length));
                }
                if ((rightValue.MetaTable.GetValue("__len") != null) && ((rightValue.MetaTable.GetValue("__len") as LuaFunction) != null))
                {
                    return((rightValue.MetaTable.GetValue("__len") as LuaFunction).Invoke(new LuaValue[] { }));
                }

                break;

            case "not":
                var rightBool = rightValue as LuaBoolean;
                if (rightBool != null)
                {
                    return(LuaBoolean.From(!rightBool.BoolValue));
                }
                break;
            }

            return(LuaNil.Nil);
        }
示例#6
0
 public static LuaValue ToLuaValue(object value)
 {
     if ((value as LuaValue) != null)
     {
         return(value as LuaValue);
     }
     if (value is int || value is double || value is float)
     {
         return(new LuaNumber(Convert.ToDouble(value)));
     }
     else if (value is MuMech.MovingAverage)
     {
         return(new LuaNumber(((MuMech.MovingAverage)value).value));
     }
     else if (value is string)
     {
         return(new LuaString((string)value));
     }
     else if (value is bool)
     {
         return(LuaBoolean.From((bool)value));
     }
     else if (value == null)
     {
         return(LuaNil.Nil);
     }
     else if (value.GetType().IsEnum)
     {
         return(new LuaString(value.ToString()));
     }
     else if (value.GetType().IsArray)
     {
         LuaTable table = new LuaTable();
         foreach (var item in (value as Array))
         {
             table.AddValue(ToLuaValue(item));
         }
         return(table);
     }
     else if (value is LuaValue)
     {
         return((LuaValue)value);
     }
     else
     {
         LuaUserdata data = new LuaUserdata(value);
         data.MetaTable = GetControlMetaTable();
         return(data);
     }
 }
示例#7
0
        public static LuaValue Require(LuaValue[] args)
        {
            // get loaders table
            LuaTable t = (LuaRuntime.GlobalEnvironment.GetValue("package") as LuaTable).GetValue("loaders") as LuaTable;

            if (t == null)
            {
                throw new Exception("Cannot get loaders table from package module!");
            }
            if (t.Count == 0)
            {
                throw new Exception("Loaders table is empty!");
            }
            // whether package was found/loaded
            LuaBoolean b      = LuaBoolean.False;
            LuaValue   module = null;

            foreach (LuaValue key in t.Keys)
            {
                LuaFunction f = t.GetValue(key) as LuaFunction;
                if (f != null)
                {
                    LuaMultiValue lmv = f.Invoke(new LuaValue[] { new LuaString(args[0].Value.ToString()) }) as LuaMultiValue;
                    b = lmv.Values[0] as LuaBoolean;
                    if (b.BoolValue == true)
                    {
                        module = lmv.Values[1];
                        break;
                    }
                }
                else
                {
                    throw new Exception("Cannot cast type '" + t.GetValue(key).GetType().ToString() + "' to type 'LuaFunction'");
                }
            }
            if (b.BoolValue == false)
            {
                Console.WriteLine("Could not load package '" + args[0].Value.ToString() + "'!");
            }
            return(module);
        }
示例#8
0
 public override LuaValue Evaluate(LuaTable enviroment)
 {
     return(LuaBoolean.From(bool.Parse(this.Text)));
 }
示例#9
0
 public void Add(LuaBoolean Val)
 {
 }
示例#10
0
        List <LuaConstant> LoadConstants(ref FuncNode curNode)
        {
            int constNum = undumper.LoadInt();

            List <LuaConstant> luaConstants = new List <LuaConstant>();

            for (int i = 0; i < constNum; ++i)
            {
                byte type = undumper.LoadByte();

                LuaConstant curConst;

                switch ((ConstantType)type)
                {
                case ConstantType.LUA_TNIL:
                    curConst = new LuaConstant();
                    break;

                case ConstantType.LUA_TBOOLEAN:
                    curConst = new LuaBoolean();
                    break;

                case ConstantType.LUA_TNUMBER:
                    curConst = new LuaNumber();
                    break;

                case ConstantType.LUA_TSTRING:
                    curConst = new LuaString();
                    break;

                default:
                    curConst = new LuaConstant();
                    break;
                }

                curConst.Type = (ConstantType)type;

                switch (curConst.Type)
                {
                case ConstantType.LUA_TNIL:
                    // DO NOTHING
                    break;

                case ConstantType.LUA_TBOOLEAN:
                    curConst.Data    = new byte[1];
                    curConst.Data[0] = undumper.LoadByte();
                    break;

                case ConstantType.LUA_TNUMBER:
                    curConst.Data = undumper.LoadBlock(sizeof(double));
                    break;

                case ConstantType.LUA_TSTRING:
                    curConst.Data = Encoding.ASCII.GetBytes(undumper.LoadString());
                    break;

                default:
                    break;
                }

                luaConstants.Add(curConst);
            }

            int funcNum = undumper.LoadInt();

            for (int i = 0; i < funcNum; ++i)
            {
                LoadFunction(ref curNode);
            }

            return(luaConstants);
        }
示例#11
0
        public static LuaValue Wrap(LuaValue[] args)
        {
            LuaFunction  f  = args[0] as LuaFunction;
            LuaCoroutine c  = new LuaCoroutine(f);
            LuaFunction  f2 = new LuaFunction(new LuaFunc(delegate(LuaValue[] args2) { return(LuaBoolean.From(c.Resume(args2))); }));

            return(f2);
        }
示例#12
0
        private LuaValue InfixBinaryOperation(Term LeftOperand, string Operator, Term RightOperand, LuaTable enviroment)
        {
            LuaValue leftValue  = LeftOperand.Evaluate(enviroment);
            LuaValue rightValue = RightOperand.Evaluate(enviroment);

            switch (Operator)
            {
            case "+":
                var left  = leftValue as LuaNumber;
                var right = rightValue as LuaNumber;
                if (left != null && right != null)
                {
                    return(new LuaNumber(left.Number + right.Number));
                }
                else
                {
                    LuaFunction func = GetMetaFunction("__add", leftValue, rightValue);
                    if (func != null)
                    {
                        return(func.Invoke(new LuaValue[] { leftValue, rightValue }));
                    }
                }
                break;

            case "-":
                left  = leftValue as LuaNumber;
                right = rightValue as LuaNumber;
                if (left != null && right != null)
                {
                    return(new LuaNumber(left.Number - right.Number));
                }
                else
                {
                    LuaFunction func = GetMetaFunction("__sub", leftValue, rightValue);
                    if (func != null)
                    {
                        return(func.Invoke(new LuaValue[] { leftValue, rightValue }));
                    }
                }
                break;

            case "*":
                left  = leftValue as LuaNumber;
                right = rightValue as LuaNumber;
                if (left != null && right != null)
                {
                    return(new LuaNumber(left.Number * right.Number));
                }
                else
                {
                    LuaFunction func = GetMetaFunction("__mul", leftValue, rightValue);
                    if (func != null)
                    {
                        return(func.Invoke(new LuaValue[] { leftValue, rightValue }));
                    }
                }
                break;

            case "/":
                left  = leftValue as LuaNumber;
                right = rightValue as LuaNumber;
                if (left != null && right != null)
                {
                    return(new LuaNumber(left.Number / right.Number));
                }
                else
                {
                    LuaFunction func = GetMetaFunction("__div", leftValue, rightValue);
                    if (func != null)
                    {
                        return(func.Invoke(new LuaValue[] { leftValue, rightValue }));
                    }
                }
                break;

            case "%":
                left  = leftValue as LuaNumber;
                right = rightValue as LuaNumber;
                if (left != null && right != null)
                {
                    return(new LuaNumber(left.Number % right.Number));
                }
                else
                {
                    LuaFunction func = GetMetaFunction("__mod", leftValue, rightValue);
                    if (func != null)
                    {
                        return(func.Invoke(new LuaValue[] { leftValue, rightValue }));
                    }
                }
                break;

            case "^":
                left  = leftValue as LuaNumber;
                right = rightValue as LuaNumber;
                if (left != null && right != null)
                {
                    return(new LuaNumber(Math.Pow(left.Number, right.Number)));
                }
                else
                {
                    LuaFunction func = GetMetaFunction("__pow", leftValue, rightValue);
                    if (func != null)
                    {
                        return(func.Invoke(new LuaValue[] { leftValue, rightValue }));
                    }
                }
                break;

            case "==":
                return(LuaBoolean.From(leftValue.Equals(rightValue)));

            case "~=":
                return(LuaBoolean.From(leftValue.Equals(rightValue) == false));

            case "<":
                int?compare = Compare(leftValue, rightValue);
                if (compare != null)
                {
                    return(LuaBoolean.From(compare < 0));
                }
                else
                {
                    LuaFunction func = GetMetaFunction("__lt", leftValue, rightValue);
                    if (func != null)
                    {
                        return(func.Invoke(new LuaValue[] { leftValue, rightValue }));
                    }
                }
                break;

            case ">":
                compare = Compare(leftValue, rightValue);
                if (compare != null)
                {
                    return(LuaBoolean.From(compare > 0));
                }
                else
                {
                    LuaFunction func = GetMetaFunction("__gt", leftValue, rightValue);
                    if (func != null)
                    {
                        return(func.Invoke(new LuaValue[] { leftValue, rightValue }));
                    }
                }
                break;

            case "<=":
                compare = Compare(leftValue, rightValue);
                if (compare != null)
                {
                    return(LuaBoolean.From(compare <= 0));
                }
                else
                {
                    LuaFunction func = GetMetaFunction("__le", leftValue, rightValue);
                    if (func != null)
                    {
                        return(func.Invoke(new LuaValue[] { leftValue, rightValue }));
                    }
                }
                break;

            case ">=":
                compare = Compare(leftValue, rightValue);
                if (compare != null)
                {
                    return(LuaBoolean.From(compare >= 0));
                }
                else
                {
                    LuaFunction func = GetMetaFunction("__ge", leftValue, rightValue);
                    if (func != null)
                    {
                        return(func.Invoke(new LuaValue[] { leftValue, rightValue }));
                    }
                }
                break;

            case "..":
                if ((leftValue is LuaString || leftValue is LuaNumber) &&
                    (rightValue is LuaString || rightValue is LuaNumber))
                {
                    return(new LuaString(string.Concat(leftValue, rightValue)));
                }
                else
                {
                    LuaFunction func = GetMetaFunction("__concat", leftValue, rightValue);
                    if (func != null)
                    {
                        return(func.Invoke(new LuaValue[] { leftValue, rightValue }));
                    }
                }
                break;

            case "and":
                bool leftBool  = leftValue.GetBooleanValue();
                bool rightBool = rightValue.GetBooleanValue();
                if (leftBool == false)
                {
                    return(leftValue);
                }
                else
                {
                    return(rightValue);
                }

            case "or":
                leftBool  = leftValue.GetBooleanValue();
                rightBool = rightValue.GetBooleanValue();
                if (leftBool == true)
                {
                    return(leftValue);
                }
                else
                {
                    return(rightValue);
                }
            }

            return(null);
        }
示例#13
0
 protected bool Equals(LuaBoolean other)
 {
     return(value.Equals(other.value));
 }