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);
}