SDGK6QEAHVCMRJVWSHZUECXXC5ZSJ2PQYTZWN3KX5UQFGAWI4Q3AC
P3DOLIF47OAWT6VFRTASS3Q3AXUI4SVPUHT4WF7PVBKVNVYWXF5QC
XP3H2HRV7VTJ6G723BCW4U6WWZHK5Y5OUORRUVP7F4UCKURT3YWQC
IGUSSYANPKGMX5YDQC7AI5ZWZLEQPIXA4KG3RZHNPMERL554HQWQC
LPTP6ZL7U4OVXLZ56TJKJ6HENDHE7ITFMFBXC5BKEBVXEGXPW44AC
WQBSKRTHZRKIYIDHROBSIEHEEQX26UAFDTMYY24UOPYNMYWXDFCAC
T7CCGLOZ25B7BQKKGR6IA6LWBRKUWTXLTIRXUQ4YKQRVAA7AHZKQC
LE5U6CTXEIETQN5GOVYF2K2VCISRXR3ULORXDKIKWYDVBG5GS3WAC
3A5FX3Y4RPKWQEHKKXZKXZJ7RKV6RKWT7GTR4WFE5UBWKV2HT4RQC
ZWN4VTRSPTO3PH67MRVU5DR4X5W3A5PCBQTBRRPOLRO6JPQRYUQQC
K73AS36BODJSSKMT2LRFDKS7BAMETNFLWHZEPQEZFM6KQB6KRA4AC
OIWB7TPX3LFYDGSVPUUVUGWTY7JB4PE6EBELDFZX7B3HIOWH25GQC
GXSKBPS2YL7D55TD6UN7DV6W2HNYZZCRV5VJQYN2AYMQJEAHUQPAC
XPIE6FG6SYZXNQFBRWUBJ3NR5Q6MOMRXAFW3WTKMSLMKKA55ZWCQC
XP6MR3Q24DQOWNEGMSHJX54ZAISKOIF65IR65M4EOR45KR2OSFVQC
RXYHE3C7R3EGCRZEJT2ZO4ALLRDR3HF66VHZZNF7TT3DFWZ6BJCQC
NOQ4LTFDCNNSHUE2AHXYBVXUTTXBDZOHNCK5V4TWVDBIYRC3VUCQC
754PQVFHYQER7P7NEHYNLQVOEALF6I23IQDNGNCOK5IV7OLAEXRQC
FSEZWFGR4YUDIRSQ4UKZW2ZPXY5RMJWELKP6PVLXEXQHFRIMYRRAC
O6QYS2KYXUXMODO3X4SYX7SPZE7AOIFT2XJZHRABMMQFEUN4UXLAC
RJIGO3YE7LKSLASPVA7K6CNWJAPKXD7ENJDURI5GXBGIEXFBBINAC
2VAIMVOC3GPYJKN5ICAS4LHNS6IAQAZGWJRTR2WVBEJAOHEGRJEQC
CJKLBIIM2ZTWTLGISXEZOGK2JANEYUSLOKG3BBOAYAY7AFG33ELQC
D6A2MLKI7UQPZ4A4D6QSM6STFVDY77IY5APXCBT3LNH6CDVKT67QC
7Y5HSDFKA5TPLS2TWTRFMQVX6UXUDHXU5MUMXQSDFAIY4THQ3BIQC
AUXHSGS4EFOPZ6TVZYWNVOUDO7NYKUKE3HBKGQQWTALSVFOE3HAAC
/*
* Macros for processing object arguments.
* TODO: Collect these in cluautil.{h,cc}.
*/
#define GETCOORD(c, p1, p2, boundfn) \
coord_def c; \
c.x = luaL_checkint(ls, p1); \
c.y = luaL_checkint(ls, p2); \
if (!boundfn(c)) \
luaL_error( \
ls, \
make_stringf("Point (%d,%d) is out of bounds", \
c.x, c.y).c_str()); \
else ;
#define COORDS(c, p1, p2) \
GETCOORD(c, p1, p2, in_bounds)
#define FEAT(f, pos) \
dungeon_feature_type f = check_lua_feature(ls, pos)
#define LUA_ITEM(name, n) \
item_def *name = clua_check_item(ls, n);
#define LEVEL(lev, br, pos) \
const char *level_name = luaL_checkstring(ls, pos); \
level_area_type lev = str_to_level_area_type(level_name); \
if (lev == NUM_LEVEL_AREA_TYPES) \
luaL_error(ls, "Expected level name"); \
const char *branch_name = luaL_checkstring(ls, pos); \
branch_type br = str_to_branch(branch_name); \
if (lev == LEVEL_DUNGEON && br == NUM_BRANCHES) \
luaL_error(ls, "Expected branch name");
#define MAP(ls, n, var) \
map_def *var = *(map_def **) luaL_checkudata(ls, n, MAP_METATABLE)
#define DEVENT(ls, n, var) \
dgn_event *var = *(dgn_event **) luaL_checkudata(ls, n, DEVENT_METATABLE)
#define MAPMARKER(ls, n, var) \
map_marker *var = *(map_marker **) luaL_checkudata(ls, n, MAPMARK_METATABLE)
unsigned int get_tile_idx(lua_State *ls, int arg);
level_id dlua_level_id(lua_State *ls, int ndx);
dungeon_feature_type check_lua_feature(lua_State *ls, int idx);
item_def *clua_check_item(lua_State *ls, int n);
}
void luaopen_setmeta(lua_State *ls,
const char *global,
const luaL_reg *lua_lib,
const char *meta)
{
luaL_newmetatable(ls, meta);
lua_setglobal(ls, global);
luaL_openlib(ls, global, lua_lib, 0);
// Do <global>.__index = <global>
lua_pushstring(ls, "__index");
lua_pushvalue(ls, -2);
lua_settable(ls, -3);
dungeon_feature_type check_lua_feature(lua_State *ls, int idx);
item_def *clua_check_item(lua_State *ls, int n);
unsigned int get_tile_idx(lua_State *ls, int arg);
level_id dlua_level_id(lua_State *ls, int ndx);
#define GETCOORD(c, p1, p2, boundfn) \
coord_def c; \
c.x = luaL_checkint(ls, p1); \
c.y = luaL_checkint(ls, p2); \
if (!boundfn(c)) \
luaL_error( \
ls, \
make_stringf("Point (%d,%d) is out of bounds", \
c.x, c.y).c_str()); \
else ;
#define COORDS(c, p1, p2) \
GETCOORD(c, p1, p2, in_bounds)
#define FEAT(f, pos) \
dungeon_feature_type f = check_lua_feature(ls, pos)
#define LUA_ITEM(name, n) \
item_def *name = clua_check_item(ls, n);
#define LEVEL(lev, br, pos) \
const char *level_name = luaL_checkstring(ls, pos); \
level_area_type lev = str_to_level_area_type(level_name); \
if (lev == NUM_LEVEL_AREA_TYPES) \
luaL_error(ls, "Expected level name"); \
const char *branch_name = luaL_checkstring(ls, pos); \
branch_type br = str_to_branch(branch_name); \
if (lev == LEVEL_DUNGEON && br == NUM_BRANCHES) \
luaL_error(ls, "Expected branch name");
#define MAP(ls, n, var) \
map_def *var = *(map_def **) luaL_checkudata(ls, n, MAP_METATABLE)
#define DEVENT(ls, n, var) \
dgn_event *var = *(dgn_event **) luaL_checkudata(ls, n, DEVENT_METATABLE)
#define MAPMARKER(ls, n, var) \
map_marker *var = *(map_marker **) luaL_checkudata(ls, n, MAPMARK_METATABLE)
void luaopen_setmeta(lua_State *ls,
const char *global,
const luaL_reg *lua_lib,
const char *meta)
{
luaL_newmetatable(ls, meta);
lua_setglobal(ls, global);
luaL_openlib(ls, global, lua_lib, 0);
// Do <global>.__index = <global>
lua_pushstring(ls, "__index");
lua_pushvalue(ls, -2);
lua_settable(ls, -3);
}