#include "AppHdr.h" #include "cluautil.h" #include "l_libs.h" #include "mapdef.h" ///////////////////////////////////////////////////////////////////// // mapgrd and mapgrd_col handling (i.e. map_lines in a metatable) struct mapcolumn { map_def* map; int col; }; static int mapgrd_get(lua_State *ls) { // Return a metatable for this column in the map grid. map_def *map = *(map_def **) luaL_checkudata(ls, 1, MAPGRD_METATABLE); int column = luaL_checkint(ls, 2); mapcolumn *mapref = clua_new_userdata(ls, MAPGRD_COL_METATABLE); mapref->map = map; mapref->col = column; return (1); } static int mapgrd_set(lua_State *ls) { return (luaL_error(ls, "%s", "Cannot assign to read-only table.")); } static char* mapgrd_glyph(lua_State *ls, int &col, int &row) { mapcolumn *mapc = (mapcolumn *)luaL_checkudata(ls, 1, MAPGRD_COL_METATABLE); row = luaL_checkint(ls, 2); col = mapc->col; map_lines &lines = mapc->map->map; if (row < 0 || col < 0 || col >= lines.width() || row >= lines.height()) { return (NULL); } coord_def mc(col, row); return (&lines(mc)); } static int mapgrd_col_get(lua_State *ls) { int col, row; char *gly = mapgrd_glyph(ls, col, row); if (!gly) return (luaL_error(ls, "Invalid coords: %d, %d", col, row)); char buf[2]; buf[0] = *gly; buf[1] = '\0'; lua_pushstring(ls, buf); return (1); } static int mapgrd_col_set(lua_State *ls) { int col, row; char *gly = mapgrd_glyph(ls, col, row); if (!gly) return (luaL_error(ls, "Invalid coords: %d, %d", col, row)); const char *str = luaL_checkstring(ls, 3); if (!str[0] || str[1]) return (luaL_error(ls, "%s", "mapgrd must be set to a single char.")); (*gly) = str[0]; return (0); } void dluaopen_mapgrd(lua_State *ls) { // mapgrd table luaL_newmetatable(ls, MAPGRD_METATABLE); lua_pushstring(ls, "__index"); lua_pushcfunction(ls, mapgrd_get); lua_settable(ls, -3); lua_pushstring(ls, "__newindex"); lua_pushcfunction(ls, mapgrd_set); lua_settable(ls, -3); lua_pop(ls, 1); // mapgrd col table luaL_newmetatable(ls, MAPGRD_COL_METATABLE); lua_pushstring(ls, "__index"); lua_pushcfunction(ls, mapgrd_col_get); lua_settable(ls, -3); lua_pushstring(ls, "__newindex"); lua_pushcfunction(ls, mapgrd_col_set); lua_settable(ls, -3); lua_pop(ls, 1); }