From: Pasi Kallinen Date: Tue, 15 Mar 2022 16:24:49 +0000 (+0200) Subject: Lua: allow obj chain iteration X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=bdc81ab389697bab4e648987864756be2ee082cf;p=nethack Lua: allow obj chain iteration --- diff --git a/doc/lua.adoc b/doc/lua.adoc index cf31eeaa3..3e05966af 100644 --- a/doc/lua.adoc +++ b/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 diff --git a/src/nhlobj.c b/src/nhlobj.c index e0f807e35..fa574ea2d 100644 --- a/src/nhlobj.c +++ b/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 (argc == 0) { + (void) l_obj_push(L, fobj); + } else { + struct _lua_obj *lo = l_obj_check(L, 1); + boolean use_nexthere = FALSE; - if (lo && lo->obj) - (void) l_obj_push(L, lo->obj->where == OBJ_FLOOR ? lo->obj->nexthere : lo->obj->nobj); + 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; }