示例#1
0
		public static StringRange FromLuaRange(DynValue start, DynValue end, int? defaultEnd = null)
		{
			int i = start.IsNil() ? 1 : (int)start.Number;
			int j = end.IsNil() ? (defaultEnd ?? i) : (int)end.Number;

			return new StringRange(i, j);
		}
示例#2
0
        protected static lua_Integer LuaLOptInteger(LuaState L, lua_Integer pos, lua_Integer def)
        {
            DynValue v = ArgAsType(L, pos, DataType.Number, true);

            if (v.IsNil())
            {
                return(def);
            }
            else
            {
                return((int)v.Number);
            }
        }
示例#3
0
        static FileUserDataBase GetDefaultFile(ScriptExecutionContext executionContext, StandardFileType file)
        {
            Table R = executionContext.GetScript().Registry;

            DynValue ff = R.Get("853BEAAF298648839E2C99D005E1DF94_" + file.ToString());

            if (ff.IsNil())
            {
                ff = GetStandardFile(executionContext.GetScript(), file);
            }

            return(ff.CheckUserDataType <FileUserDataBase>("getdefaultfile(" + file.ToString() + ")"));
        }
        public IEnumerable <Table> GetFunction(ScriptState function_name)
        {
            DynValue function = Script.Globals.Get(function_name.ToString());

            if (function.IsNil() || function.Type != DataType.Function)
            {
                return(null);
            }

            DynValue result = Script.Call(function);

            return(result.Type != DataType.Table ? null : result.Table.Values.Where(data => data.Type == DataType.Table).Select(f => f.Table));
        }
示例#5
0
    private void Teleport(DynValue mapName, DynValue x, DynValue y, DynValue facingLua, DynValue rawLua)
    {
        OrthoDir?facing = null;

        if (!facingLua.IsNil())
        {
            facing = OrthoDirExtensions.Parse(facingLua.String);
        }
        var loc = new Vector2Int((int)x.Number, (int)y.Number);
        var raw = rawLua.IsNil() ? false : rawLua.Boolean;

        RunRoutineFromLua(Global.Instance().Maps.TeleportRoutine(mapName.String, loc, facing, raw));
    }
示例#6
0
        public virtual void Add(DynValue table)
        {
            if (MetaTable == null)
            {
                MetaTable = GetDynVal(LuaTableKey);
            }
            if (!MetaTable.IsNil())
            {
                baseTable = AddByDefault(MetaTable, table);
            }
            else
            {
                baseTable = table;
            }

            //获得Lua类模板
            string temp      = GetStrByBaseTable(Template);
            Type   classType = typeof(T);

            if (temp != null)
            {
                classType = Type.GetType(NameSpace + "." + temp, true, false);
                if (classType == null)
                {
                    CLog.Error("无法找到此类型:" + temp);
                }
                TempClassData = classType.Assembly.CreateInstance(classType.FullName) as T;
            }
            else
            {
                TempClassData = new T();
            }

            TempClassData = (T)LuaReader.Read(baseTable, classType);
            if (TempClassData == null)
            {
                return;
            }
            string key = TempClassData.TDID;

            if (Data.ContainsKey(key))
            {
                CLog.Error(baseTable.ToString() + "已经存在这个key:" + key);
                return;
            }
            //TempClassData.OnBeAddedToData();
            //Add(key, TempClassData);
            //Keys.Add(key);
            TempClassData.TDID = key;
            Register(TempClassData);
        }
示例#7
0
        public static DynValue load_impl(ScriptExecutionContext executionContext, CallbackArguments args, Table defaultEnv)
        {
            try
            {
                Script   S      = executionContext.GetScript();
                DynValue ld     = args[0];
                string   script = "";

                if (ld.Type == DataType.Function)
                {
                    while (true)
                    {
                        DynValue ret = executionContext.GetScript().Call(ld);
                        if (ret.Type == DataType.String && ret.String.Length > 0)
                        {
                            script += ret.String;
                        }
                        else if (ret.IsNil())
                        {
                            break;
                        }
                        else
                        {
                            return(DynValue.NewTuple(DynValue.Nil, DynValue.NewString("reader function must return a string")));
                        }
                    }
                }
                else if (ld.Type == DataType.String)
                {
                    script = ld.String;
                }
                else
                {
                    args.AsType(0, "load", DataType.Function, false);
                }

                DynValue source = args.AsType(1, "load", DataType.String, true);
                DynValue env    = args.AsType(3, "load", DataType.Table, true);

                DynValue fn = S.LoadString(script,
                                           !env.IsNil() ? env.Table : defaultEnv,
                                           !source.IsNil() ? source.String : "=(load)");

                return(fn);
            }
            catch (SyntaxErrorException ex)
            {
                return(DynValue.NewTuple(DynValue.Nil, DynValue.NewString(ex.Message)));
            }
        }
示例#8
0
        public static DynValue concat(ScriptExecutionContext executionContext, CallbackArguments args)
        {
            DynValue vlist  = args.AsType(0, "concat", DataType.Table, false);
            DynValue vsep   = args.AsType(1, "concat", DataType.String, true);
            DynValue vstart = args.AsType(2, "concat", DataType.Number, true);
            DynValue vend   = args.AsType(3, "concat", DataType.Number, true);

            Table  list  = vlist.Table;
            string sep   = vsep.IsNil() ? "" : vsep.String;
            int    start = vstart.IsNilOrNan() ? 1 : (int)vstart.Number;
            int    end;

            if (vend.IsNilOrNan())
            {
                end = GetTableLength(executionContext, vlist);
            }
            else
            {
                end = (int)vend.Number;
            }

            if (end < start)
            {
                return(DynValue.NewString(string.Empty));
            }

            StringBuilder sb = new StringBuilder();

            for (int i = start; i <= end; i++)
            {
                DynValue v = list.Get(i);

                if (v.Type != DataType.Number && v.Type != DataType.String)
                {
                    throw new ScriptRuntimeException("invalid value ({1}) at index {0} in table for 'concat'", i, v.Type.ToLuaTypeString());
                }

                string s = v.ToPrintString();

                if (i != start)
                {
                    sb.Append(sep);
                }

                sb.Append(s);
            }

            return(DynValue.NewString(sb.ToString()));
        }
示例#9
0
    private void RemoveItem(DynValue itemLua, DynValue isCollectableLua)
    {
        var key           = itemLua.String;
        var isCollectable = isCollectableLua.IsNil() || isCollectableLua.Boolean;

        if (isCollectable)
        {
            Global.Instance().Data.Collectables.RemoveItem(key);
        }
        else
        {
            var data = IndexDatabase.Instance().CombatItems.GetData(key);
            Global.Instance().Data.Inventory.DropItemType(data);
        }
    }
示例#10
0
 protected void Play(DynValue filename, DynValue delay, bool blocks = true)
 {
     if (delay.IsNil())
     {
         RunRoutineFromLua(RunRoutineFromFile(filename.String, blocks));
     }
     else
     {
         RunRoutineFromLua(CoUtils.Wait(0.01f));
         activeScripts.Peek().scriptRoutine.Resume();
         Global.Instance().StartCoroutine(CoUtils.RunAfterDelay((float)delay.Number, () => {
             Global.Instance().StartCoroutine(RunRoutineFromFile(filename.String));
         }));
     }
 }
示例#11
0
		public static DynValue random(ScriptExecutionContext executionContext, CallbackArguments args)
		{
			DynValue m = args.AsType(0, "random", DataType.Number, true);
			DynValue n = args.AsType(1, "random", DataType.Number, true);
			Random R = GetRandom(executionContext.GetScript());
			double d;

			if (m.IsNil() && n.IsNil())
			{
				d = R.NextDouble();
			}
			else
			{
				int a = n.IsNil() ? 1 : (int)n.Number;
				int b = (int)m.Number;

				if (a < b)
					d = R.Next(a, b + 1);
				else
					d = R.Next(b, a + 1);
			}

			return DynValue.NewNumber(d);
		}
示例#12
0
		private DynValue GetNext(DynValue prev)
		{
			if (prev.IsNil())
				Reset();

			while (m_Enumerator.MoveNext())
			{
				DynValue v = ClrToScriptConversions.ObjectToDynValue(m_Script, m_Enumerator.Current);

				if (!v.IsNil())
					return v;
			}

			return DynValue.Nil;
		}
示例#13
0
    private void AddItem(DynValue itemLua, DynValue isCollectableLua)
    {
        var key           = itemLua.String;
        var isCollectable = !isCollectableLua.IsNil() && isCollectableLua.Boolean;

        if (isCollectable)
        {
            Global.Instance().Data.Collectables.AddItem(key);
        }
        else
        {
            var data = IndexDatabase.Instance().CombatItems.GetData(key);
            var item = new CombatItem(data);
            Global.Instance().Data.Inventory.Add(item);
        }
    }
    private void PathEvent(DynValue moverLua, DynValue targetLua, DynValue waitLua)
    {
        var map     = Global.Instance().Maps.ActiveMap;
        var mover   = map.GetEventNamed(moverLua.String);
        var target  = map.GetEventNamed(targetLua.String);
        var routine = mover.PathToRoutine(target.Position, ignoreEvents: true);

        if (waitLua.IsNil() || waitLua.Boolean)
        {
            RunRoutineFromLua(routine);
        }
        else
        {
            mover.StartCoroutine(routine);
        }
    }
        public IEnumerable <Table> get_Entradas_Funciones(string nombre_funcion)
        {
            DynValue funcion = script.Globals.Get(nombre_funcion);

            if (funcion.IsNil() || funcion.Type != DataType.Function)
            {
                return(null);
            }

            DynValue resultado = script.Call(funcion);

            if (resultado.Type != DataType.Table)
            {
                return(null);
            }
            return(resultado.Table.Values.Where(f => f.Type == DataType.Table).Select(f => f.Table));
        }
        public T get_Global_Or <T>(string key, DataType tipo, T valor_or)
        {
            DynValue global = script.Globals.Get(key);

            if (global.IsNil() || global.Type != tipo)
            {
                return(valor_or);
            }
            try
            {
                return((T)global.ToObject(typeof(T)));
            }
            catch
            {
                return(valor_or);
            }
        }
示例#17
0
        private static DynValue __tostring_continuation(ScriptExecutionContext executionContext, CallbackArguments args)
        {
            DynValue b = args[0].ToScalar();

            if (b.IsNil())
            {
                return(b);
            }

            if (b.Type != DataType.String)
            {
                throw new ScriptRuntimeException("'tostring' must return a string");
            }


            return(b);
        }
示例#18
0
        private static DynValue loadfile_impl(ScriptExecutionContext executionContext, CallbackArguments args, Table defaultEnv)
        {
            try
            {
                Script   S        = executionContext.GetScript();
                DynValue filename = args.AsType(0, "loadfile", DataType.String, false);
                DynValue env      = args.AsType(2, "loadfile", DataType.Table, true);

                DynValue fn = S.LoadFile(filename.String, env.IsNil() ? defaultEnv : env.Table);

                return(fn);
            }
            catch (SyntaxErrorException ex)
            {
                return(DynValue.NewTuple(DynValue.Nil, DynValue.NewString(ex.Message)));
            }
        }
            private CaminhoNodeType FromString(DynValue val)
            {
                if (val.IsNil())
                {
                    return(CaminhoNodeType.Error);
                }
                else if (val.String == "text")
                {
                    return(CaminhoNodeType.Text);
                }
                else if (val.String == "choice")
                {
                    return(CaminhoNodeType.Choice);
                }
                else if (val.String == "wait")
                {
                    return(CaminhoNodeType.Choice);
                }
                else if (val.String == "event")
                {
                    return(CaminhoNodeType.Choice);
                }
                else if (val.String == "function")
                {
                    return(CaminhoNodeType.Function);
                }
                else if (val.String == "set")
                {
                    return(CaminhoNodeType.Set);
                }
                else if (val.String == "increment")
                {
                    return(CaminhoNodeType.Increment);
                }
                else if (val.String == "decrement")
                {
                    return(CaminhoNodeType.Increment);
                }
                else if (val.String == "conditional")
                {
                    return(CaminhoNodeType.Error);
                }

                return(CaminhoNodeType.Error);
            }
示例#20
0
    public DynValue GetVar(Script caller, string key)
    {
        if (key == null)
        {
            throw new CYFException("script.GetVar: The first argument (key) is nil.\n\nSee the documentation for proper usage.");
        }
        DynValue value = script.Globals.Get(key);

        if (value == null || value.IsNil())
        {
            return(DynValue.NewNil());
        }
        if (caller == null)
        {
            return(value);
        }
        return(script.Globals[key] != null?MoonSharpUtil.CloneIfRequired(caller, value) : null);
    }
示例#21
0
    private void Battle(DynValue partyLua, DynValue bgmLua)
    {
        var   partyTag  = partyLua.String;
        var   bgmTag    = bgmLua.IsNil() ? null : bgmLua.String;
        Party party     = null;
        var   partyData = IndexDatabase.Instance().Parties.GetDataOrNull(partyTag);

        if (partyData != null)
        {
            party = new Party(partyData);
        }
        else
        {
            var encounterData = IndexDatabase.Instance().Encounters.GetData(partyTag);
            party = new Party(encounterData);
        }
        RunRoutineFromLua(BattleView.SpawnBattleRoutine(party, bgmTag));
    }
示例#22
0
        public static T get_Or <T>(this Table table, string key, DataType type, T orValue)
        {
            DynValue bandera = table.Get(key);

            if (bandera.IsNil() || bandera.Type != type)
            {
                return(orValue);
            }

            try
            {
                return((T)bandera.ToObject(typeof(T)));
            }
            catch
            {
                return(orValue);
            }
        }
示例#23
0
    public DynValue GetVar(Script caller, string key)
    {
        DynValue value = script.Globals.Get(key);

        if (value == null || value.IsNil())
        {
            return(DynValue.NewNil());
        }
        if (caller == null)
        {
            return(value);
        }
        if (script.Globals[key] != null)
        {
            return(MoonSharpUtil.CloneIfRequired(caller, value));
        }
        return(null);
    }
        public T Get <T>(string key, DataType type, T value)
        {
            DynValue global = Script.Globals.Get(key);

            if (global.IsNil() || global.Type != type)
            {
                return(value);
            }

            try
            {
                return((T)global.ToObject(typeof(T)));
            }
            catch (Exception)
            {
                return(value);
            }
        }
示例#25
0
        public static void MoonSharpInit(Table globalTable, Table ioTable)
        {
            DynValue package = globalTable.Get("package");

            if (package.IsNil())
            {
                package = DynValue.NewTable(globalTable.OwnerScript);
                globalTable["package"] = package;
            }
            else if (package.Type != DataType.Table)
            {
                throw new InternalErrorException("'package' global variable was found and it is not a table");
            }

            string cfg = System.IO.Path.DirectorySeparatorChar + "\n;\n?\n!\n-\n";

            package.Table.Set("config", DynValue.NewString(cfg));
        }
        private void ExecIterPrep(Instruction i)
        {
            DynValue v = m_ValueStack.Pop();

            if (v.Type != DataType.Tuple)
            {
                v = DynValue.NewTuple(v, DynValue.Nil, DynValue.Nil);
            }

            DynValue f   = v.Tuple.Length >= 1 ? v.Tuple[0] : DynValue.Nil;
            DynValue s   = v.Tuple.Length >= 2 ? v.Tuple[1] : DynValue.Nil;
            DynValue var = v.Tuple.Length >= 3 ? v.Tuple[2] : DynValue.Nil;

            // MoonSharp additions - given f, s, var
            // 1) if f is not a function and has a __iterator metamethod, call __iterator to get the triplet
            // 2) if f is a table with no __call metamethod, use a default table iterator

            if (f.Type != DataType.Function && f.Type != DataType.ClrFunction)
            {
                DynValue meta = this.GetMetamethod(f, "__iterator");

                if (meta != null && !meta.IsNil())
                {
                    v   = this.GetScript().Call(meta, f, s, var);
                    f   = v.Tuple.Length >= 1 ? v.Tuple[0] : DynValue.Nil;
                    s   = v.Tuple.Length >= 2 ? v.Tuple[1] : DynValue.Nil;
                    var = v.Tuple.Length >= 3 ? v.Tuple[2] : DynValue.Nil;

                    m_ValueStack.Push(DynValue.NewTuple(f, s, var));
                }
                else if (f.Type == DataType.Table)
                {
                    DynValue callmeta = this.GetMetamethod(f, "__call");

                    if (callmeta == null || callmeta.IsNil())
                    {
                        m_ValueStack.Push(EnumerableWrapper.ConvertTable(f.Table));
                    }
                }
            }

            m_ValueStack.Push(DynValue.NewTuple(f, s, var));
        }
示例#27
0
        public static DynValue tostring(ScriptExecutionContext executionContext, CallbackArguments args)
        {
            if (args.Count < 1)
            {
                throw ScriptRuntimeException.BadArgumentValueExpected(0, "tostring");
            }

            DynValue v    = args[0];
            DynValue tail = executionContext.GetMetamethodTailCall(v, "__tostring", v);

            if (tail == null || tail.IsNil())
            {
                return(DynValue.NewString(v.ToPrintString()));
            }

            tail.TailCallData.Continuation = new CallbackFunction(__tostring_continuation, "__tostring");

            return(tail);
        }
示例#28
0
        public static DynValue assert(ScriptExecutionContext executionContext, CallbackArguments args)
        {
            DynValue v       = args[0];
            DynValue message = args[1];

            if (!v.CastToBool())
            {
                if (message.IsNil())
                {
                    throw new ScriptRuntimeException("assertion failed!");                     // { DoNotDecorateMessage = true };
                }
                else
                {
                    throw new ScriptRuntimeException(message.ToPrintString());                     // { DoNotDecorateMessage = true };
                }
            }

            return(DynValue.NewTupleNested(args.GetArray()));
        }
示例#29
0
        private DynValue GetNext(DynValue prev)
        {
            if (prev.IsNil())
            {
                Reset();
            }

            while (m_Enumerator.MoveNext())
            {
                DynValue v = ConversionHelper.ClrObjectToComplexMoonSharpValue(m_Script, m_Enumerator.Current);

                if (!v.IsNil())
                {
                    return(v);
                }
            }

            return(DynValue.Nil);
        }
示例#30
0
        private DynValue GetNext(DynValue prev)
        {
            if (prev.IsNil())
            {
                Reset();
            }

            while (m_Enumerator.MoveNext())
            {
                DynValue v = ClrToScriptConversions.ObjectToDynValue(m_Script, m_Enumerator.Current);

                if (!v.IsNil())
                {
                    return(v);
                }
            }

            return(DynValue.Nil);
        }
示例#31
0
        public static DynValue insert(ScriptExecutionContext executionContext, CallbackArguments args)
        {
            DynValue vlist  = args.AsType(0, "table.insert", DataType.Table, false);
            DynValue vpos   = args[1];
            DynValue vvalue = args[2];

            if (args.Count > 3)
            {
                throw new ScriptRuntimeException("wrong number of arguments to 'insert'");
            }

            int   len  = GetTableLength(executionContext, vlist);
            Table list = vlist.Table;

            if (vvalue.IsNil())
            {
                vvalue = vpos;
                vpos   = DynValue.NewNumber(len + (executionContext.OwnerScript.Options.ZeroIndexTables ? 0 : 1));               // + 1
            }

            if (vpos.Type != DataType.Number)
            {
                throw ScriptRuntimeException.BadArgument(1, "table.insert", DataType.Number, vpos.Type, false);
            }

            int pos = (int)vpos.Number;

            if (pos > len + 1 || pos < (executionContext.OwnerScript.Options.ZeroIndexTables ? 0 : 1))
            {
                throw new ScriptRuntimeException("bad argument #2 to 'insert' (position out of bounds)");
            }

            for (int i = len; i >= pos; i--)
            {
                list.Set(i + 1, list.Get(i));
            }

            list.Set(pos, vvalue);

            return(vlist);
        }
示例#32
0
        private static int?AdjustIndex(string s, DynValue vi, int defval)
        {
            if (vi.IsNil())
            {
                return(defval);
            }

            int i = (int)Math.Round(vi.Number, 0);

            if (i == 0)
            {
                return(null);
            }

            if (i > 0)
            {
                return(i - 1);
            }

            return(s.Length - i);
        }
示例#33
0
        private static int SortComparer(ScriptExecutionContext executionContext, DynValue a, DynValue b, DynValue lt)
        {
            if (lt == null || lt.IsNil())
            {
                lt = executionContext.GetBinaryMetamethod(a, b, "__lt");

                if (lt == null || lt.IsNil())
                {
                    if (a.Type == DataType.Number && b.Type == DataType.Number)
                        return a.Number.CompareTo(b.Number);
                    if (a.Type == DataType.String && b.Type == DataType.String)
                        return a.String.CompareTo(b.String);

                    throw ScriptRuntimeException.CompareInvalidType(a, b);
                }
                return LuaComparerToClrComparer(
                    executionContext.GetScript().Call(lt, a, b),
                    executionContext.GetScript().Call(lt, b, a));
            }
            return LuaComparerToClrComparer(
                executionContext.GetScript().Call(lt, a, b),
                executionContext.GetScript().Call(lt, b, a));
        }
示例#34
0
        private static int? AdjustIndex(string s, DynValue vi, int defval)
        {
            if (vi.IsNil())
                return defval;

            var i = (int) Math.Round(vi.Number, 0);

            if (i == 0)
                return null;

            if (i > 0)
                return i - 1;

            return s.Length - i;
        }
		private static bool IsValueJsonCompatible(DynValue value)
		{
			return value.Type == DataType.Boolean || value.IsNil() ||
				value.Type == DataType.Number || value.Type == DataType.String ||
				value.Type == DataType.Table ||
				(JsonNull.IsJsonNull(value));
		}