NOQ4LTFDCNNSHUE2AHXYBVXUTTXBDZOHNCK5V4TWVDBIYRC3VUCQC Q5OGN34QCBDNFO4Q3VOSC67HH5EGYCO5QQM6RX4QSS3HXYNA3ZWQC K73AS36BODJSSKMT2LRFDKS7BAMETNFLWHZEPQEZFM6KQB6KRA4AC RXYHE3C7R3EGCRZEJT2ZO4ALLRDR3HF66VHZZNF7TT3DFWZ6BJCQC MQ62OAMLGJVRW2QIL4PAZRAU6PC52ZVGY2FCOBIY6IWGQIHMU5CAC 3A5FX3Y4RPKWQEHKKXZKXZJ7RKV6RKWT7GTR4WFE5UBWKV2HT4RQC UL7XFKMUX3WIU4O2LZANK4ECJ654UZPDBFGNXUEYZYOLKBYBCG6AC MT3256427VMCV4JUFWCN7ULY4KXSND5ZL5THDKYNWWYOXXR5DLIQC AUXHSGS4EFOPZ6TVZYWNVOUDO7NYKUKE3HBKGQQWTALSVFOE3HAAC NKONHW4JNY6HP2M63MNPM3H64ZWSUNUT5FX2STW4KTS4AMXJXXVQC LE5U6CTXEIETQN5GOVYF2K2VCISRXR3ULORXDKIKWYDVBG5GS3WAC X7MFMKQTNZ2IWBFVGS6WQV7NRNKJ3DWQAW2X7IQMFQQXW24AHPZQC 4N5PW5S3OV25HFN634NNWMMYX26NA2TB6TVFG4UMYSZ2VBJWKE4QC 7IERR3KESLBDHEMGSFRYGA66PZBPGKPUGMFDCSFR3WDX7RXD5OTAC KSM4H3SBM6FIQTUEGHXXYATJXEOJ4EKUBAFCRMFKSHY7N2HWECRQC L2PY64KUK7XYXNWKTC6YUN5DZYDNHNQFQHICUVNRGRHBHZAXWH3AC ZWFOOUUA5VCYOXGAHE76DXW65ME4AH2DVN6JVNGZAKTHZNDTVOJAC CB7U6IEEN2Z74672EYQQHWTB4GXVNNMAYDRQYAGY6K3QSDYYEHYAC CI2RMLJLIAZMEGNN6LJN6PSHXHLPG7PXFIDYRGFPVMDPJ2R4S4NQC OMAUFQNBWGX4FDABHQCVPGDYRVKMDASGQJVRH7AOPPEMHAP2LQSQC SM6YRPYZS6LMDQA6X3VAOK2PGMUFKPD7JMWJISOQSMX2CBR4ISPAC /** File: l_dgnlvl.cc* Summary: Level and branch bindings (library "dgn").*/#include "AppHdr.h"#include "dlua.h"#include "l_libs.h"#include "branch.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<level_id*>(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<level_id*>(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 (you.level_type != LEVEL_PORTAL_VAULT){luaL_error(ls, "Can only set level type name on portal vaults");return(0);}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 (you.level_type != LEVEL_PORTAL_VAULT){luaL_error(ls, "Can only set level type name abbreviation on ""portal vaults");return(0);}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 (you.level_type != LEVEL_PORTAL_VAULT){luaL_error(ls, "Can only set level type origin on portal vaults");return(0);}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_lib[] ={{ "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 }};
return (1);}#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<level_id*>(lua_newuserdata(ls, sizeof(level_id)));*nlev = lid;}static level_id _lua_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<level_id*>(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, _lua_level_id(ls, 1));
}LUAFN(dgn_level_name){const level_id lid(_lua_level_id(ls, 1));lua_pushstring(ls, lid.describe().c_str());return (1);}LUAFN(dgn_set_level_type_name){if (you.level_type != LEVEL_PORTAL_VAULT){luaL_error(ls, "Can only set level type name on portal vaults");return(0);}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 (you.level_type != LEVEL_PORTAL_VAULT){luaL_error(ls, "Can only set level type name abbreviation on ""portal vaults");return(0);}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 (you.level_type != LEVEL_PORTAL_VAULT){luaL_error(ls, "Can only set level type origin on portal vaults");return(0);}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);}