Ejemplo n.º 1
0
        // @desc スクリプトから呼べる関数を登録します
        // @param function 関数
        // @result 関数ID
        private static int L_export_function(ILuaState lua)
        {
            LuaVM vm  = LuaVM.instance;
            int   fid = vm.ExportFunction(lua);

            lua.PushInteger(fid);
            return(1);
        }
Ejemplo n.º 2
0
        // @desc 関数登録を解除します
        // @param fid 関数ID
        private static int L_unexport_function(ILuaState lua)
        {
            LuaVM vm  = LuaVM.instance;
            int   fid = lua.ToInteger(-1);

            vm.UnexportFunction(lua, fid);
            return(0);
        }
Ejemplo n.º 3
0
        //
        protected static T get_member <T>(ILuaState lua, int idx, string key)
        {
            idx = LuaVM.NormalizeIndex(lua, idx);
            lua.GetField(idx, key);
            T obj = (T)lua.ToUserData(-1);

            lua.Pop(1);
            return(obj);
        }
Ejemplo n.º 4
0
        //
        protected static bool get_boolean(ILuaState lua, int idx, string key)
        {
            idx = LuaVM.NormalizeIndex(lua, idx);
            lua.GetField(idx, key);
            bool b = lua.ToBoolean(-1);

            lua.Pop(1);
            return(b);
        }
Ejemplo n.º 5
0
 // スタック上の指定インデクスから指定個数の要素をテーブルにセットする
 protected static void set_value_to_table(ILuaState lua, int dst, int src, int nval)
 {
     dst = LuaVM.NormalizeIndex(lua, dst);
     src = LuaVM.NormalizeIndex(lua, src);
     for (int i = 1; i <= nval; ++i)
     {
         lua.PushValue(src + i - 1);
         lua.RawSetI(dst, i);
     }
 }
Ejemplo n.º 6
0
        // スタック上の指定位置にあるテーブルの要素をコピーする
        protected static void copy_table(ILuaState lua, int dst, int src)
        {
            dst = LuaVM.NormalizeIndex(lua, dst);
            src = LuaVM.NormalizeIndex(lua, src);
            int sz = lua.RawLen(src);

            for (int i = 1; i <= sz; ++i)
            {
                lua.RawGetI(src, i);
                lua.RawSetI(dst, i);
            }
        }
Ejemplo n.º 7
0
 public int InvokeScriptFunction(ILuaState lua, string funcname, int narg)
 {
     if (_script != null && _script.HasFunction(funcname))
     {
         PushSelfTable(lua);
         if (narg > 0)
         {
             lua.Insert(LuaVM.NormalizeIndex(lua, -(narg + 1)));
         }
         return(_script.InvokeFunction(lua, funcname, narg + 1));
     }
     return(0);
 }
Ejemplo n.º 8
0
 //
 private static LuaVM retain_vm()
 {
     if (_vm == null)
     {
         _vm = LuaVM.instance;
         if (_vm == null)
         {
             GameObject obj = new GameObject("catan.LuaVM");
             _vm = obj.AddComponent <LuaVM>();
         }
     }
     return(_vm);
 }
Ejemplo n.º 9
0
            internal int InvokeFunction(ILuaState lua, string funcname, int narg, int selftable = LuaConstants.LUA_NOREF)
            {
                LuaVM.Assert(lua, _functions.ContainsKey(funcname));
                int key = _functions[funcname];

                lua.RawGetI(LuaDef.LUA_REGISTRYINDEX, key);
                int b = LuaVM.NormalizeIndex(lua, -(narg + 1));

                lua.Insert(b);
                int nresult = invoke_function(lua, narg, selftable);

                return(nresult);
            }
Ejemplo n.º 10
0
        // @desc 登録した関数を起動します
        // @param fid 関数ID
        private static int L_invoke_function(ILuaState lua)
        {
            LuaVM vm   = LuaVM.instance;
            int   sz   = lua.GetTop();
            int   narg = sz - 1;
            int   fid  = lua.ToInteger(1);

            for (int i = 0; i < narg; ++i)
            {
                lua.PushValue(2 + i);
            }
            int nresult = vm.InvokeFunction(lua, fid, narg, LuaDef.LUA_MULTRET);

            return(nresult);
        }
Ejemplo n.º 11
0
 // @class Application
 // @desc シーンをロードします
 // @decl load_level(index)
 // @decl load_level(name)
 // @param index シーン番号
 // @param name シーン名
 private static int L_load_level(ILuaState lua)
 {
     if (lua.IsString(1))
     {
         string name = lua.ToString(1);
         LuaVM.Log(string.Format("LOAD LEVEL {0}", name));
         Application.LoadLevel(name);
     }
     else
     {
         int idx = lua.ToInteger(1);
         LuaVM.Log(string.Format("LOAD LEVEL {0}", idx));
         Application.LoadLevel(idx);
     }
     return(0);
 }
Ejemplo n.º 12
0
 public static int PushNewAsPrefab(ILuaState lua, GameObject obj)
 {
     LuaVM.Assert(lua, obj != null);
     // o = {}
     lua.NewTable();
     // setmetatable(o, self)
     //lua.PushValue(-2); // self
     lua.GetGlobal(klassName);
     lua.SetMetaTable(-2); // -> o
     // self.__index = self
     lua.GetMetaTable(-1);
     lua.SetField(-1, "__index");
     // return o
     set_internal <GameObject>(lua, -1, obj);
     set_boolean(lua, -1, "is_prefab", true);
     return(1);
 }
Ejemplo n.º 13
0
        //
        void Awake()
        {
            if (_instance != null)
            {
                Destroy(this);
            }
            else
            {
                _instance        = this;
                _androidPlatform = Application.streamingAssetsPath.Contains("://");
                create_state();
                StartCoroutine("gc");
                StartCoroutine("low_freq_callback");
#if UNITY_EDITOR
                {
#else
                if (Debug.isDebugBuild)
                {
#endif
                    _debugMenu = LuaDebugMenu.instance;
                }
            }
        }

        //
        void OnDestroy()
        {
            destroy_state();
            if (_instance == this)
            {
                _instance = null;
            }
        }

        //
        void Start()
        {
        }

        //
        void Update()
        {
            _utilClass.Update();
        }
Ejemplo n.º 14
0
            internal int invoke_function(ILuaState lua, int narg, int selftable = LuaConstants.LUA_NOREF)
            {
                int top = lua.GetTop() - (narg + 1);

                // insert `traceback' function
                lua.PushCSharpFunction(Traceback);
                int b = LuaVM.NormalizeIndex(lua, -(narg + 2));

                lua.Insert(b);
                var status = lua.PCall(narg, LuaDef.LUA_MULTRET, b);

                if (status != ThreadStatus.LUA_OK)
                {
                    Debug.LogError(status);
                    Debug.LogError(lua.ToString(-1));
                }
                // remove `traceback' function
                lua.Remove(b);
                return(lua.GetTop() - top);
            }
Ejemplo n.º 15
0
        public static Color ToColor(ILuaState lua, int idx)
        {
            idx = LuaVM.NormalizeIndex(lua, idx);
            check_value(lua, idx);
            int n = lua.GetTop();

            lua.RawGetI(idx, 1);
            float r = (float)lua.ToNumber(-1);

            lua.RawGetI(idx, 2);
            float g = (float)lua.ToNumber(-1);

            lua.RawGetI(idx, 3);
            float b = (float)lua.ToNumber(-1);

            lua.RawGetI(idx, 4);
            float a = (float)lua.ToNumber(-1);

            lua.SetTop(n);
            return(new Color(r, g, b, a));
        }
Ejemplo n.º 16
0
 //
 protected static void set_member <T>(ILuaState lua, int idx, string key, T obj)
 {
     idx = LuaVM.NormalizeIndex(lua, idx);
     lua.PushLightUserData(obj);
     lua.SetField(idx, key);
 }
Ejemplo n.º 17
0
 //
 protected static void set_boolean(ILuaState lua, int idx, string key, bool b)
 {
     idx = LuaVM.NormalizeIndex(lua, idx);
     lua.PushBoolean(b);
     lua.SetField(idx, key);
 }
Ejemplo n.º 18
0
        // -- describing object oriented class in Lua
        // Test = {}
        // function Test:new()
        //   o = {}
        //   setmetatable(o, self)
        //   self.__index = self
        //   return o
        // end
        // function Test:hoge()
        //   return 3
        // end
        // NewTest = Test:new()
        // function NewTest:hoge()
        //   return 4
        // end
        public static int PushNew(ILuaState lua, GameObject obj)
        {
            LuaVM.Assert(lua, obj != null);
            LuaGameObjectCache cache = obj.GetComponent <LuaGameObjectCache>();

            if (cache != null && cache.index == LuaConstants.LUA_NOREF)
            {
                Object.Destroy(cache);
                cache = null;
            }
            if (cache == null)
            {
                cache = obj.AddComponent <LuaGameObjectCache>();
                // o = {}
                lua.NewTable();
                // setmetatable(o, self)
                //lua.PushValue(-2); // self
                lua.GetGlobal(klassName);
                lua.SetMetaTable(-2); // -> o
                // self.__index = self
                lua.GetMetaTable(-1);
                lua.SetField(-1, "__index");
                // return o
                set_internal <GameObject>(lua, -1, obj);
                set_boolean(lua, -1, "is_prefab", false);
                //
                LuaScriptBehaviour lsb = obj.GetComponent <LuaScriptBehaviour>();
                if (lsb != null)
                {
                    LuaComponentBehaviour.PushNew(lua, lsb);
                    lua.SetField(-2, "behaviour");
                }
                LuaComponentTransform.PushNew(lua, obj.transform);
                lua.SetField(-2, "transform");
                RectTransform rt = obj.GetComponent <RectTransform>();
                if (rt != null)
                {
                    LuaComponentRectTransform.PushNew(lua, rt);
                    lua.SetField(-2, "rect_transform");
                }
                LuaComponentUIText.PushNew(lua, obj);
                lua.SetField(-2, "ui_text");
                LuaComponentUIImage.PushNew(lua, obj);
                lua.SetField(-2, "ui_image");
                if (constructorHook != null)
                {
                    constructorHook(lua, obj);
                }
                lua.PushValue(-1);
                int refidx = lua.L_Ref(LuaDef.LUA_REGISTRYINDEX);
                cache.index    = refidx;
                cache.luaState = lua;
            }
            lua.RawGetI(LuaDef.LUA_REGISTRYINDEX, cache.index);
            //Debug.Log(string.Format("Find {0} {1}", objid, obj.name));
            if (get_internal <GameObject>(lua, -1) == null)
            {
                set_internal <GameObject>(lua, -1, obj);
            }
            return(1);
        }