From 29aa709171aebafc39ed2074983d0f1976583baa Mon Sep 17 00:00:00 2001 From: Robert Vollmert Date: Tue, 20 Oct 2009 10:15:35 +0200 Subject: Split level and branch functions out of l_dgn.cc. --- crawl-ref/source/l_dgnlvl.cc | 160 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 160 insertions(+) create mode 100644 crawl-ref/source/l_dgnlvl.cc (limited to 'crawl-ref/source/l_dgnlvl.cc') diff --git a/crawl-ref/source/l_dgnlvl.cc b/crawl-ref/source/l_dgnlvl.cc new file mode 100644 index 0000000000..c72b09174e --- /dev/null +++ b/crawl-ref/source/l_dgnlvl.cc @@ -0,0 +1,160 @@ +/* + * 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(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 (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 } +}; -- cgit v1.2.3-54-g00ecf