Lua: Pass more data to room contents function
This commit is contained in:
20
doc/lua.adoc
20
doc/lua.adoc
@@ -680,7 +680,25 @@ fields:
|
|||||||
| lit | Is the room lit or unlit? Defaults to -1 (random).
|
| 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).
|
| 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.
|
| 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.
|
||||||
|===
|
|===
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1751,6 +1751,9 @@ extern schar get_table_mapchr_opt(lua_State *, const char *, schar);
|
|||||||
extern void nhl_add_table_entry_int(lua_State *, const char *, int);
|
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_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_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 splev_chr2typ(char);
|
||||||
extern schar check_mapchr(const char *);
|
extern schar check_mapchr(const char *);
|
||||||
extern int get_table_int(lua_State *, const char *);
|
extern int get_table_int(lua_State *, const char *);
|
||||||
|
|||||||
14
src/nhlua.c
14
src/nhlua.c
@@ -24,7 +24,6 @@ static int nhl_doturn(lua_State *);
|
|||||||
static int nhl_debug_flags(lua_State *);
|
static int nhl_debug_flags(lua_State *);
|
||||||
static int nhl_test(lua_State *);
|
static int nhl_test(lua_State *);
|
||||||
static int nhl_getmap(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 char splev_typ2chr(schar);
|
||||||
static int nhl_gettrap(lua_State *);
|
static int nhl_gettrap(lua_State *);
|
||||||
static int nhl_deltrap(lua_State *);
|
static int nhl_deltrap(lua_State *);
|
||||||
@@ -225,6 +224,19 @@ nhl_add_table_entry_bool(lua_State *L, const char *name, boolean value)
|
|||||||
lua_rawset(L, -3);
|
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
|
/* converting from special level "map character" to levl location type
|
||||||
and back. order here is important. */
|
and back. order here is important. */
|
||||||
const struct {
|
const struct {
|
||||||
|
|||||||
40
src/sp_lev.c
40
src/sp_lev.c
@@ -103,7 +103,7 @@ static int floodfillchk_match_under(int, int);
|
|||||||
static int floodfillchk_match_accessible(int, int);
|
static int floodfillchk_match_accessible(int, int);
|
||||||
static boolean sel_flood_havepoint(int, int, xchar *, xchar *, int);
|
static boolean sel_flood_havepoint(int, int, xchar *, xchar *, int);
|
||||||
static long line_dist_coord(long, long, long, long, long, long);
|
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_align(lua_State *);
|
||||||
static int get_table_monclass(lua_State *);
|
static int get_table_monclass(lua_State *);
|
||||||
static int find_montype(lua_State *, const char *, int *);
|
static int find_montype(lua_State *, const char *, int *);
|
||||||
@@ -113,6 +113,7 @@ static int get_table_buc(lua_State *);
|
|||||||
static int get_table_objclass(lua_State *);
|
static int get_table_objclass(lua_State *);
|
||||||
static int find_objtype(lua_State *, const char *);
|
static int find_objtype(lua_State *, const char *);
|
||||||
static int get_table_objtype(lua_State *);
|
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_roomtype_opt(lua_State *, const char *, int);
|
||||||
static int get_table_traptype_opt(lua_State *, const char *, int);
|
static int get_table_traptype_opt(lua_State *, const char *, int);
|
||||||
static int get_traptype_byname(const char *);
|
static int get_traptype_byname(const char *);
|
||||||
@@ -2898,14 +2899,23 @@ static void
|
|||||||
l_push_wid_hei_table(lua_State *L, int wid, int hei)
|
l_push_wid_hei_table(lua_State *L, int wid, int hei)
|
||||||
{
|
{
|
||||||
lua_newtable(L);
|
lua_newtable(L);
|
||||||
|
nhl_add_table_entry_int(L, "width", wid);
|
||||||
|
nhl_add_table_entry_int(L, "height", hei);
|
||||||
|
}
|
||||||
|
|
||||||
lua_pushstring(L, "width");
|
/* push a table on lua stack containing room data */
|
||||||
lua_pushinteger(L, wid);
|
static void
|
||||||
lua_rawset(L, -3);
|
l_push_mkroom_table(lua_State *L, struct mkroom *tmpr)
|
||||||
|
{
|
||||||
lua_pushstring(L, "height");
|
lua_newtable(L);
|
||||||
lua_pushinteger(L, hei);
|
nhl_add_table_entry_int(L, "width", 1 + (tmpr->hx - tmpr->lx));
|
||||||
lua_rawset(L, -3);
|
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!"); */
|
/* message("What a strange feeling!"); */
|
||||||
@@ -3683,6 +3693,17 @@ static const struct {
|
|||||||
{ 0, 0 }
|
{ 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
|
static int
|
||||||
get_table_roomtype_opt(lua_State *L, const char *name, int defval)
|
get_table_roomtype_opt(lua_State *L, const char *name, int defval)
|
||||||
{
|
{
|
||||||
@@ -3766,8 +3787,7 @@ lspo_room(lua_State *L)
|
|||||||
lua_getfield(L, 1, "contents");
|
lua_getfield(L, 1, "contents");
|
||||||
if (lua_type(L, -1) == LUA_TFUNCTION) {
|
if (lua_type(L, -1) == LUA_TFUNCTION) {
|
||||||
lua_remove(L, -2);
|
lua_remove(L, -2);
|
||||||
l_push_wid_hei_table(L, 1 + tmpcr->hx - tmpcr->lx,
|
l_push_mkroom_table(L, tmpcr);
|
||||||
1 + tmpcr->hy - tmpcr->ly);
|
|
||||||
lua_call(L, 1, 0);
|
lua_call(L, 1, 0);
|
||||||
} else
|
} else
|
||||||
lua_pop(L, 1);
|
lua_pop(L, 1);
|
||||||
|
|||||||
Reference in New Issue
Block a user