1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
/*
* File: l_dgnit.cc
* Summary: Item-related functions in lua library "dgn".
*/
#include "AppHdr.h"
#include "cluautil.h"
#include "l_libs.h"
#include "coord.h"
#include "dungeon.h"
#include "items.h"
#include "mapdef.h"
#define ITEMLIST_METATABLE "crawldgn.item_list"
static item_list _lua_get_ilist(lua_State *ls, int ndx)
{
if (lua_isstring(ls, ndx))
{
const char *spec = lua_tostring(ls, ndx);
item_list ilist;
const std::string err = ilist.add_item(spec);
if (!err.empty())
luaL_error(ls, err.c_str());
return (ilist);
}
else
{
item_list **ilist =
clua_get_userdata<item_list*>(ls, ITEMLIST_METATABLE, ndx);
if (ilist)
return (**ilist);
luaL_argerror(ls, ndx, "Expected item list object or string");
return item_list();
}
}
void register_itemlist(lua_State *ls)
{
clua_register_metatable(ls, ITEMLIST_METATABLE, NULL,
lua_object_gc<item_list>);
}
static int dgn_item_from_index(lua_State *ls)
{
const int index = luaL_checkint(ls, 1);
item_def *item = &mitm[index];
if (item->is_valid())
lua_pushlightuserdata(ls, item);
else
lua_pushnil(ls);
return (1);
}
static int dgn_items_at(lua_State *ls)
{
COORDS(c, 1, 2);
lua_push_items(ls, env.igrid(c));
return (1);
}
static int _dgn_item_spec(lua_State *ls)
{
const item_list ilist = _lua_get_ilist(ls, 1);
dlua_push_object_type<item_list>(ls, ITEMLIST_METATABLE, ilist);
return (1);
}
static int dgn_create_item(lua_State *ls)
{
COORDS(c, 1, 2);
item_list ilist = _lua_get_ilist(ls, 3);
const int level =
lua_isnumber(ls, 4) ? lua_tointeger(ls, 4) : you.your_level;
dgn_place_multiple_items(ilist, c, level);
link_items();
return (0);
}
const struct luaL_reg dgn_item_dlib[] =
{
{ "item_from_index", dgn_item_from_index },
{ "items_at", dgn_items_at },
{ "create_item", dgn_create_item },
{ "item_spec", _dgn_item_spec },
{ NULL, NULL }
};
|