Allow the ice theme room to occasionally have melting ice.
Add nh.abscoord() to convert room-relative to map-absolute coords.
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,
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.
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 *);
{"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},
}
}
+/* 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 }); */