9 * Methods for DEVENT_METATABLE.
12 static int dgnevent_type(lua_State
*ls
)
15 PLUARET(number
, dev
->type
);
18 static int dgnevent_place(lua_State
*ls
)
21 lua_pushnumber(ls
, dev
->place
.x
);
22 lua_pushnumber(ls
, dev
->place
.y
);
26 static int dgnevent_dest(lua_State
*ls
)
29 lua_pushnumber(ls
, dev
->dest
.x
);
30 lua_pushnumber(ls
, dev
->dest
.y
);
34 static int dgnevent_ticks(lua_State
*ls
)
37 PLUARET(number
, dev
->elapsed_ticks
);
40 static int dgnevent_arg1(lua_State
*ls
)
43 PLUARET(number
, dev
->arg1
);
46 static int dgnevent_arg2(lua_State
*ls
)
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
},
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",
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);
89 static const char *dgn_event_type_name(unsigned evmask
)
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
)));
111 static int dgn_dgn_event(lua_State
*ls
)
113 const int start
= lua_isuserdata(ls
, 1)? 2 : 1;
115 for (int i
= start
, nargs
= lua_gettop(ls
); i
<= nargs
; ++i
)
117 dgn_push_event_type(ls
, i
);
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
));
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
);
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
);
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
},