/* * File: l_dgnlvl.cc * Summary: Level and branch bindings (library "dgn"). */ #include "AppHdr.h" #include "cluautil.h" #include "l_libs.h" #include "branch.h" #include "player.h" #define BRANCH(br, pos) \ const char *branch_name = luaL_checkstring(ls, pos); \ branch_type req_branch_type = str_to_branch(branch_name); \ if (req_branch_type == NUM_BRANCHES) \ luaL_error(ls, "Expected branch name"); \ Branch &br = branches[req_branch_type] #define BRANCHFN(name, type, expr) \ LUAFN(dgn_br_##name) { \ BRANCH(br, 1); \ PLUARET(type, expr); \ } BRANCHFN(floorcol, number, br.floor_colour) BRANCHFN(rockcol, number, br.rock_colour) BRANCHFN(has_shops, boolean, br.has_shops) BRANCHFN(has_uniques, boolean, br.has_uniques) BRANCHFN(parent_branch, string, br.parent_branch == NUM_BRANCHES ? "" : branches[br.parent_branch].abbrevname) static void _push_level_id(lua_State *ls, const level_id &lid) { // We're skipping the constructor; naughty, but level_id has no // virtual methods and no dynamically allocated memory. level_id *nlev = static_cast(lua_newuserdata(ls, sizeof(level_id))); *nlev = lid; } level_id dlua_level_id(lua_State *ls, int ndx) { if (lua_isstring(ls, ndx)) { const char *s = lua_tostring(ls, 1); try { return level_id::parse_level_id(s); } catch (const std::string &err) { luaL_error(ls, err.c_str()); } } else if (lua_isuserdata(ls, ndx)) { const level_id *lid = static_cast(lua_touserdata(ls, ndx)); return (*lid); } luaL_argerror(ls, ndx, "Expected level_id"); // Never gets here. return level_id(); } LUAFN(dgn_level_id) { const int nargs = lua_gettop(ls); if (!nargs) _push_level_id(ls, level_id::current()); else if (nargs == 1) _push_level_id(ls, dlua_level_id(ls, 1)); return (1); } LUAFN(dgn_level_name) { const level_id lid(dlua_level_id(ls, 1)); lua_pushstring(ls, lid.describe().c_str()); return (1); } LUAFN(dgn_set_level_type_name) { if (!lua_isstring(ls, 1)) { luaL_argerror(ls, 1, "Expected string for level type name"); return(0); } you.level_type_name = luaL_checkstring(ls, 1); return(0); } LUAFN(dgn_set_level_type_name_abbrev) { if (!lua_isstring(ls, 1)) { luaL_argerror(ls, 1, "Expected string for level type name " "abbreviation"); return(0); } you.level_type_name_abbrev = luaL_checkstring(ls, 1); return(0); } LUAFN(dgn_set_level_type_origin) { if (!lua_isstring(ls, 1)) { luaL_argerror(ls, 1, "Expected string for level type origin"); return(0); } you.level_type_origin = luaL_checkstring(ls, 1); return(0); } const struct luaL_reg dgn_level_dlib[] = { { "br_floorcol", dgn_br_floorcol }, { "br_rockcol", dgn_br_rockcol }, { "br_has_shops", dgn_br_has_shops }, { "br_has_uniques", dgn_br_has_uniques }, { "br_parent_branch", dgn_br_parent_branch }, { "level_id", dgn_level_id }, { "level_name", dgn_level_name }, { "set_level_type_name", dgn_set_level_type_name }, { "set_level_type_name_abbrev", dgn_set_level_type_name_abbrev }, { "set_level_type_origin", dgn_set_level_type_origin }, { NULL, NULL } };