summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/l_dgnlvl.cc
diff options
context:
space:
mode:
authorRobert Vollmert <rvollmert@gmx.net>2009-10-20 10:15:35 +0200
committerRobert Vollmert <rvollmert@gmx.net>2009-10-20 10:15:35 +0200
commit29aa709171aebafc39ed2074983d0f1976583baa (patch)
treebd67f59231eb02db05daa794829e303e87012b56 /crawl-ref/source/l_dgnlvl.cc
parent40c9bc160056918a6807b986d951dba707e33338 (diff)
downloadcrawl-ref-29aa709171aebafc39ed2074983d0f1976583baa.tar.gz
crawl-ref-29aa709171aebafc39ed2074983d0f1976583baa.zip
Split level and branch functions out of l_dgn.cc.
Diffstat (limited to 'crawl-ref/source/l_dgnlvl.cc')
-rw-r--r--crawl-ref/source/l_dgnlvl.cc160
1 files changed, 160 insertions, 0 deletions
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<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 }
+};