| lit | Is the room lit or unlit? Defaults to -1 (random).
| filled | Is the room filled as per the room type. Defaults to 1 (filled).
| joined | Is the room joined to the rest of the level with corridors? Default is true.
-| contents | A function called with one parameter, a table with "width" and "height", the room width and height, excluding the walls. All coordinates in the function will be relative to the room.
+| contents | A function called with one parameter, a table with room data. See <<_room_contents>>.
+|===
+
+==== room contents
+
+The room contents function is called when the room is created.
+All coordinates in the function will be relative to the room.
+The function get passed one parameter, a table with room data:
+
+[options="header"]
+|===
+| parameter | description
+| width | room width, excluding the walls.
+| height | room height, excluding the walls.
+| region | table with 4 elements, the room region coordinates: x1, y1, x2, y2.
+| lit | is the room lit or unlit?
+| irregular | is the room irregular?
+| needjoining | does the room need joining with corridors?
+| type | the room type.
|===
extern void nhl_add_table_entry_int(lua_State *, const char *, int);
extern void nhl_add_table_entry_char(lua_State *, const char *, char);
extern void nhl_add_table_entry_str(lua_State *, const char *, const char *);
+extern void nhl_add_table_entry_bool(lua_State *, const char *, boolean);
+extern void nhl_add_table_entry_region(lua_State *, const char *,
+ xchar, xchar, xchar, xchar);
extern schar splev_chr2typ(char);
extern schar check_mapchr(const char *);
extern int get_table_int(lua_State *, const char *);
static int nhl_debug_flags(lua_State *);
static int nhl_test(lua_State *);
static int nhl_getmap(lua_State *);
-static void nhl_add_table_entry_bool(lua_State *, const char *, boolean);
static char splev_typ2chr(schar);
static int nhl_gettrap(lua_State *);
static int nhl_deltrap(lua_State *);
lua_rawset(L, -3);
}
+void
+nhl_add_table_entry_region(lua_State *L, const char *name,
+ xchar x1, xchar y1, xchar x2, xchar y2)
+{
+ lua_pushstring(L, name);
+ lua_newtable(L);
+ nhl_add_table_entry_int(L, "x1", x1);
+ nhl_add_table_entry_int(L, "y1", y1);
+ nhl_add_table_entry_int(L, "x2", x2);
+ nhl_add_table_entry_int(L, "y2", y2);
+ lua_rawset(L, -3);
+}
+
/* converting from special level "map character" to levl location type
and back. order here is important. */
const struct {
static int floodfillchk_match_accessible(int, int);
static boolean sel_flood_havepoint(int, int, xchar *, xchar *, int);
static long line_dist_coord(long, long, long, long, long, long);
-static void l_push_wid_hei_table(lua_State *, int, int);
+static void l_push_mkroom_table(lua_State *, struct mkroom *);
static int get_table_align(lua_State *);
static int get_table_monclass(lua_State *);
static int find_montype(lua_State *, const char *, int *);
static int get_table_objclass(lua_State *);
static int find_objtype(lua_State *, const char *);
static int get_table_objtype(lua_State *);
+static const char *get_mkroom_name(int);
static int get_table_roomtype_opt(lua_State *, const char *, int);
static int get_table_traptype_opt(lua_State *, const char *, int);
static int get_traptype_byname(const char *);
l_push_wid_hei_table(lua_State *L, int wid, int hei)
{
lua_newtable(L);
+ nhl_add_table_entry_int(L, "width", wid);
+ nhl_add_table_entry_int(L, "height", hei);
+}
- lua_pushstring(L, "width");
- lua_pushinteger(L, wid);
- lua_rawset(L, -3);
-
- lua_pushstring(L, "height");
- lua_pushinteger(L, hei);
- lua_rawset(L, -3);
+/* push a table on lua stack containing room data */
+static void
+l_push_mkroom_table(lua_State *L, struct mkroom *tmpr)
+{
+ lua_newtable(L);
+ nhl_add_table_entry_int(L, "width", 1 + (tmpr->hx - tmpr->lx));
+ nhl_add_table_entry_int(L, "height", 1 + (tmpr->hy - tmpr->ly));
+ nhl_add_table_entry_region(L, "region", tmpr->lx, tmpr->ly,
+ tmpr->hx, tmpr->hy);
+ nhl_add_table_entry_bool(L, "lit", (boolean) tmpr->rlit);
+ nhl_add_table_entry_bool(L, "irregular", tmpr->irregular);
+ nhl_add_table_entry_bool(L, "needjoining", tmpr->needjoining);
+ nhl_add_table_entry_str(L, "type", get_mkroom_name(tmpr->rtype));
}
/* message("What a strange feeling!"); */
{ 0, 0 }
};
+static const char *
+get_mkroom_name(int rtype)
+{
+ int i;
+
+ for (i = 0; room_types[i].name; i++)
+ if (room_types[i].type == rtype)
+ return room_types[i].name;
+ return NULL;
+}
+
static int
get_table_roomtype_opt(lua_State *L, const char *name, int defval)
{
lua_getfield(L, 1, "contents");
if (lua_type(L, -1) == LUA_TFUNCTION) {
lua_remove(L, -2);
- l_push_wid_hei_table(L, 1 + tmpcr->hx - tmpcr->lx,
- 1 + tmpcr->hy - tmpcr->ly);
+ l_push_mkroom_table(L, tmpcr);
lua_call(L, 1, 0);
} else
lua_pop(L, 1);