diff options
Diffstat (limited to 'src/script/common')
-rw-r--r-- | src/script/common/c_converter.cpp | 15 | ||||
-rw-r--r-- | src/script/common/c_converter.h | 2 | ||||
-rw-r--r-- | src/script/common/helper.cpp | 54 |
3 files changed, 54 insertions, 17 deletions
diff --git a/src/script/common/c_converter.cpp b/src/script/common/c_converter.cpp index 0ee5afa3e..dfd3f5cea 100644 --- a/src/script/common/c_converter.cpp +++ b/src/script/common/c_converter.cpp @@ -113,21 +113,6 @@ v2s16 read_v2s16(lua_State *L, int index) return p; } -v2s16 check_v2s16(lua_State *L, int index) -{ - v2s16 p; - CHECK_POS_TAB(index); - lua_getfield(L, index, "x"); - CHECK_POS_COORD("x"); - p.X = lua_tonumber(L, -1); - lua_pop(L, 1); - lua_getfield(L, index, "y"); - CHECK_POS_COORD("y"); - p.Y = lua_tonumber(L, -1); - lua_pop(L, 1); - return p; -} - void push_v2s16(lua_State *L, v2s16 p) { lua_newtable(L); diff --git a/src/script/common/c_converter.h b/src/script/common/c_converter.h index 04fdb353a..87bc35ac6 100644 --- a/src/script/common/c_converter.h +++ b/src/script/common/c_converter.h @@ -100,8 +100,6 @@ void setboolfield(lua_State *L, int table, const char *fieldname, bool value); v3f checkFloatPos (lua_State *L, int index); -v2f check_v2f (lua_State *L, int index); -v2s16 check_v2s16 (lua_State *L, int index); v3f check_v3f (lua_State *L, int index); v3s16 check_v3s16 (lua_State *L, int index); diff --git a/src/script/common/helper.cpp b/src/script/common/helper.cpp index 9adc56a65..59bde57ab 100644 --- a/src/script/common/helper.cpp +++ b/src/script/common/helper.cpp @@ -20,7 +20,26 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "helper.h" #include <cmath> #include <sstream> +#include <irr_v2d.h> #include "c_types.h" +#include "c_internal.h" + +// imported from c_converter.cpp with pure C++ style +static inline void check_lua_type(lua_State *L, int index, const char *name, int type) +{ + int t = lua_type(L, index); + if (t != type) { + std::string traceback = script_get_backtrace(L); + throw LuaError(std::string("Invalid ") + (name) + " (expected " + + lua_typename(L, (type)) + " got " + lua_typename(L, t) + + ").\n" + traceback); + } +} + +// imported from c_converter.cpp +#define CHECK_POS_COORD(name) \ + check_lua_type(L, -1, "position coordinate '" name "'", LUA_TNUMBER) +#define CHECK_POS_TAB(index) check_lua_type(L, index, "position", LUA_TTABLE) bool LuaHelper::isNaN(lua_State *L, int idx) { @@ -43,6 +62,11 @@ template <> bool LuaHelper::readParam(lua_State *L, int index, const bool &defau return lua_toboolean(L, index) != 0; } +template <> s16 LuaHelper::readParam(lua_State *L, int index) +{ + return lua_tonumber(L, index); +} + template <> float LuaHelper::readParam(lua_State *L, int index) { if (isNaN(L, index)) @@ -51,6 +75,36 @@ template <> float LuaHelper::readParam(lua_State *L, int index) return (float)luaL_checknumber(L, index); } +template <> v2s16 LuaHelper::readParam(lua_State *L, int index) +{ + v2s16 p; + CHECK_POS_TAB(index); + lua_getfield(L, index, "x"); + CHECK_POS_COORD("x"); + p.X = readParam<s16>(L, -1); + lua_pop(L, 1); + lua_getfield(L, index, "y"); + CHECK_POS_COORD("y"); + p.Y = readParam<s16>(L, -1); + lua_pop(L, 1); + return p; +} + +template <> v2f LuaHelper::readParam(lua_State *L, int index) +{ + v2f p; + CHECK_POS_TAB(index); + lua_getfield(L, index, "x"); + CHECK_POS_COORD("x"); + p.X = readParam<float>(L, -1); + lua_pop(L, 1); + lua_getfield(L, index, "y"); + CHECK_POS_COORD("y"); + p.Y = readParam<float>(L, -1); + lua_pop(L, 1); + return p; +} + template <> std::string LuaHelper::readParam(lua_State *L, int index) { std::string result; |