From: Pasi Kallinen Date: Tue, 15 Mar 2022 20:05:32 +0000 (+0200) Subject: Lua: ice theme room and melting ice X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=38924002e0ce36c2beb35ee1ec100e37794a680d;p=nethack Lua: ice theme room and melting ice Allow the ice theme room to occasionally have melting ice. Add nh.abscoord() to convert room-relative to map-absolute coords. --- diff --git a/dat/themerms.lua b/dat/themerms.lua index 4bcda7f0e..f37a186b9 100644 --- a/dat/themerms.lua +++ b/dat/themerms.lua @@ -73,7 +73,16 @@ themerooms = { function() des.room({ type = "themed", filled = 1, contents = function() - des.terrain(selection.floodfill(1,1), "I"); + local ice = selection.floodfill(1,1); + des.terrain(ice, "I"); + if (percent(25)) then + local mintime = 1000 - (nh.level_difficulty() * 100); + local ice_melter = function(x,y) + local ax,ay = nh.abscoord(x,y); + nh.start_timer_at(ax,ay, "melt-ice", mintime + nh.rn2(1000)); + end; + ice:iterate(ice_melter); + end end }); end, diff --git a/doc/lua.adoc b/doc/lua.adoc index 3e05966af..e0360347c 100644 --- a/doc/lua.adoc +++ b/doc/lua.adoc @@ -6,6 +6,17 @@ Functions exposed from the NetHack core. They are all in the `nh` table. +=== abscoord + +Convert a relative coordinate to absolute. +des-routines tend to use relative coordinates, nh and obj use absolute. +(This mess is still very much in need of improvement.) + +Example: + + local ax, ay = nh.abscoord(x, y); + + === an Returns a string with "a " or "an " prepended to it. diff --git a/include/extern.h b/include/extern.h index f05f1eff1..7051faa4e 100644 --- a/include/extern.h +++ b/include/extern.h @@ -2527,6 +2527,7 @@ extern void selection_do_gradient(struct selectionvar *, long, long, long, long, long, long, long, long); extern int lspo_reset_level(lua_State *); extern int lspo_finalize_level(lua_State *); +extern int nhl_abs_coord(lua_State *); extern void update_croom(void); extern const char *get_trapname_bytype(int); extern void l_register_des(lua_State *); diff --git a/src/nhlua.c b/src/nhlua.c index 36bf59343..3cfce4b92 100644 --- a/src/nhlua.c +++ b/src/nhlua.c @@ -1152,6 +1152,8 @@ static const struct luaL_Reg nhl_functions[] = { {"stop_timer_at", nhl_timer_stop_at}, {"start_timer_at", nhl_timer_start_at}, + {"abscoord", nhl_abs_coord}, + {"pline", nhl_pline}, {"verbalize", nhl_verbalize}, {"menu", nhl_menu}, diff --git a/src/sp_lev.c b/src/sp_lev.c index 97f2ec936..44ea80e40 100644 --- a/src/sp_lev.c +++ b/src/sp_lev.c @@ -4922,6 +4922,24 @@ l_table_getset_feature_flag( } } +/* convert relative coordinate to absolute */ +int +nhl_abs_coord(lua_State *L) +{ + int argc = lua_gettop(L); + xchar x = -1, y = -1; + + if (argc == 2) { + x = (xchar) lua_tointeger(L, 1); + y = (xchar) lua_tointeger(L, 2); + get_location_coord(&x, &y, ANY_LOC, NULL, SP_COORD_PACK(x,y)); + } else + nhl_error(L, "nhl_abs_coord: Wrong args"); + lua_pushinteger(L, x); + lua_pushinteger(L, y); + return 2; +} + /* feature("fountain", x, y); */ /* feature("fountain", {x,y}); */ /* feature({ type="fountain", x=NN, y=NN }); */