Apply the new ground_level method.
[crawl.git] / crawl-ref / source / l_dgnevt.cc
blob8fc155c6f5f4016792778535fbeb9aadc217e939
1 #include "AppHdr.h"
3 #include "cluautil.h"
4 #include "l_libs.h"
6 #include "dgnevent.h"
8 /*
9 * Methods for DEVENT_METATABLE.
12 static int dgnevent_type(lua_State *ls)
14 DEVENT(ls, 1, dev);
15 PLUARET(number, dev->type);
18 static int dgnevent_place(lua_State *ls)
20 DEVENT(ls, 1, dev);
21 lua_pushnumber(ls, dev->place.x);
22 lua_pushnumber(ls, dev->place.y);
23 return (2);
26 static int dgnevent_dest(lua_State *ls)
28 DEVENT(ls, 1, dev);
29 lua_pushnumber(ls, dev->dest.x);
30 lua_pushnumber(ls, dev->dest.y);
31 return (2);
34 static int dgnevent_ticks(lua_State *ls)
36 DEVENT(ls, 1, dev);
37 PLUARET(number, dev->elapsed_ticks);
40 static int dgnevent_arg1(lua_State *ls)
42 DEVENT(ls, 1, dev);
43 PLUARET(number, dev->arg1);
46 static int dgnevent_arg2(lua_State *ls)
48 DEVENT(ls, 1, dev);
49 PLUARET(number, dev->arg2);
52 static const struct luaL_reg dgnevent_dlib[] =
54 { "type", dgnevent_type },
55 { "pos", dgnevent_place },
56 { "dest", dgnevent_dest },
57 { "ticks", dgnevent_ticks },
58 { "arg1", dgnevent_arg1 },
59 { "arg2", dgnevent_arg2 },
60 { NULL, NULL }
63 void luaopen_dgnevent(lua_State *ls)
65 luaopen_setmeta(ls, "dgnevent", dgnevent_dlib, DEVENT_METATABLE);
69 * Functions for library "dgn".
72 static const char *dgn_event_type_names[] =
74 "none", "turn", "mons_move", "player_move", "leave_level",
75 "entering_level", "entered_level", "player_los", "player_climb",
76 "monster_dies", "item_pickup", "item_moved", "feat_change",
77 "wall_hit", "door_opened", "door_closed", "hp_warning",
78 "pressure_plate",
81 static dgn_event_type dgn_event_type_by_name(const std::string &name)
83 for (unsigned i = 0; i < ARRAYSZ(dgn_event_type_names); ++i)
84 if (dgn_event_type_names[i] == name)
85 return static_cast<dgn_event_type>(i? 1 << (i - 1) : 0);
86 return (DET_NONE);
89 static const char *dgn_event_type_name(unsigned evmask)
91 if (evmask == 0)
92 return (dgn_event_type_names[0]);
94 for (unsigned i = 1; i < ARRAYSZ(dgn_event_type_names); ++i)
95 if (evmask & (1 << (i - 1)))
96 return (dgn_event_type_names[i]);
98 return (dgn_event_type_names[0]);
101 static void dgn_push_event_type(lua_State *ls, int n)
103 if (lua_isstring(ls, n))
104 lua_pushnumber(ls, dgn_event_type_by_name(lua_tostring(ls, n)));
105 else if (lua_isnumber(ls, n))
106 lua_pushstring(ls, dgn_event_type_name(luaL_checkint(ls, n)));
107 else
108 lua_pushnil(ls);
111 static int dgn_dgn_event(lua_State *ls)
113 const int start = lua_isuserdata(ls, 1)? 2 : 1;
114 int retvals = 0;
115 for (int i = start, nargs = lua_gettop(ls); i <= nargs; ++i)
117 dgn_push_event_type(ls, i);
118 retvals++;
120 return (retvals);
123 static dgn_event_type dgn_param_to_event_type(lua_State *ls, int n)
125 if (lua_isnumber(ls, n))
126 return (static_cast<dgn_event_type>(luaL_checkint(ls, n)));
127 else if (lua_isstring(ls, n))
128 return dgn_event_type_by_name(lua_tostring(ls, n));
129 else
130 return (DET_NONE);
133 static int dgn_dgn_event_is_global(lua_State *ls)
135 lua_pushboolean(ls, dgn_param_to_event_type(ls, 1) & DET_GLOBAL_MASK);
136 return (1);
139 static int dgn_dgn_event_is_position(lua_State *ls)
141 lua_pushboolean(ls, dgn_param_to_event_type(ls, 1) & DET_POSITION_MASK);
142 return (1);
145 const struct luaL_reg dgn_event_dlib[] =
147 { "dgn_event_type", dgn_dgn_event },
148 { "dgn_event_is_global", dgn_dgn_event_is_global },
149 { "dgn_event_is_position", dgn_dgn_event_is_position},
151 { NULL, NULL }