Lua: allow obj chain iteration
This commit is contained in:
10
doc/lua.adoc
10
doc/lua.adoc
@@ -1068,11 +1068,17 @@ Example:
|
||||
=== next
|
||||
|
||||
Get the next object in the object chain.
|
||||
When called without an object, returns the first object in the object chain.
|
||||
When called with an object, an optional boolean parameter can be given. When
|
||||
it is true, and the object is on the map, the next object at the same location
|
||||
is returned. Otherwise the normal object chain is followed.
|
||||
|
||||
Example:
|
||||
|
||||
local o = obj.at(x, y);
|
||||
local o2 = o:next();
|
||||
local first = obj.next();
|
||||
local second = first:next();
|
||||
local o_at_xy = obj.at(x, y);
|
||||
local next_at_xy = o_at_xy:next(true);
|
||||
|
||||
|
||||
=== totable
|
||||
|
||||
21
src/nhlobj.c
21
src/nhlobj.c
@@ -399,15 +399,28 @@ l_obj_placeobj(lua_State *L)
|
||||
|
||||
/* Get the next object in the object chain */
|
||||
/* local o = obj.at(x, y);
|
||||
local o2 = o:next();
|
||||
local o2 = o:next(true);
|
||||
local firstobj = obj.next();
|
||||
*/
|
||||
static int
|
||||
l_obj_nextobj(lua_State *L)
|
||||
{
|
||||
struct _lua_obj *lo = l_obj_check(L, 1);
|
||||
int argc = lua_gettop(L);
|
||||
|
||||
if (lo && lo->obj)
|
||||
(void) l_obj_push(L, lo->obj->where == OBJ_FLOOR ? lo->obj->nexthere : lo->obj->nobj);
|
||||
if (argc == 0) {
|
||||
(void) l_obj_push(L, fobj);
|
||||
} else {
|
||||
struct _lua_obj *lo = l_obj_check(L, 1);
|
||||
boolean use_nexthere = FALSE;
|
||||
|
||||
if (argc == 2)
|
||||
use_nexthere = lua_toboolean(L, 2);
|
||||
|
||||
if (lo && lo->obj)
|
||||
(void) l_obj_push(L, (use_nexthere && lo->obj->where == OBJ_FLOOR)
|
||||
? lo->obj->nexthere
|
||||
: lo->obj->nobj);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user