diff --git a/doc/lua.adoc b/doc/lua.adoc index c49bba557..a2d575eea 100644 --- a/doc/lua.adoc +++ b/doc/lua.adoc @@ -929,6 +929,7 @@ Example: des.trap({ type = "hole", x = 1, y = 1 }); des.trap({ type = "hole", coord = {2, 2} }); des.trap({ type = "web", coord = {2, 2}, spider_on_web = false, seen = true }); + des.trap({ type = "falling rock", victim = false }); des.trap({ type = "rolling boulder", coord = {7, 5}, launchfrom = {-2, -2} }); des.trap("hole", 3, 4); des.trap("level teleport", {5, 8}); diff --git a/include/hack.h b/include/hack.h index a1fc3093b..4fecb3c1f 100644 --- a/include/hack.h +++ b/include/hack.h @@ -584,6 +584,7 @@ enum bodypart_types { #define MKTRAP_MAZEFLAG 0x1 /* trap placed on coords as if in maze */ #define MKTRAP_NOSPIDERONWEB 0x2 /* web will not generate a spider */ #define MKTRAP_SEEN 0x4 /* trap is seen */ +#define MKTRAP_NOVICTIM 0x8 /* no victim corpse or items on it */ #define MON_POLE_DIST 5 /* How far monsters can use pole-weapons */ #define PET_MISSILE_RANGE2 36 /* Square of distance within which pets shoot */ diff --git a/include/sp_lev.h b/include/sp_lev.h index aa5f9a810..d4d4d8c4b 100644 --- a/include/sp_lev.h +++ b/include/sp_lev.h @@ -127,6 +127,7 @@ typedef struct { xint16 type; boolean spider_on_web; boolean seen; + boolean novictim; } spltrap; typedef struct { diff --git a/src/mklev.c b/src/mklev.c index 3de0635e4..d6f4a588f 100644 --- a/src/mklev.c +++ b/src/mklev.c @@ -1540,7 +1540,8 @@ mktrap( lethal, and tend not to generate on shallower levels anyway. Finally, pits are excluded because it's weird to see an item in a pit and yet not be able to identify that the pit is there. */ - if (kind != NO_TRAP && lvl <= (unsigned) rnd(4) + if (kind != NO_TRAP && !(mktrapflags & MKTRAP_NOVICTIM) + && lvl <= (unsigned) rnd(4) && kind != SQKY_BOARD && kind != RUST_TRAP /* rolling boulder trap might not have a boulder if there was no viable path (such as when placed in the corner of a room), in diff --git a/src/sp_lev.c b/src/sp_lev.c index 27655c473..87d1c25b2 100644 --- a/src/sp_lev.c +++ b/src/sp_lev.c @@ -1797,6 +1797,8 @@ create_trap(spltrap* t, struct mkroom* croom) mktrap_flags |= MKTRAP_NOSPIDERONWEB; if (t->seen) mktrap_flags |= MKTRAP_SEEN; + if (t->novictim) + mktrap_flags |= MKTRAP_NOVICTIM; tm.x = x; tm.y = y; @@ -4275,6 +4277,7 @@ lspo_trap(lua_State *L) tmptrap.spider_on_web = TRUE; tmptrap.seen = FALSE; + tmptrap.novictim = FALSE; if (argc == 1 && lua_type(L, 1) == LUA_TSTRING) { const char *trapstr = luaL_checkstring(L, 1); @@ -4300,6 +4303,7 @@ lspo_trap(lua_State *L) tmptrap.type = get_table_traptype_opt(L, "type", -1); tmptrap.spider_on_web = get_table_boolean_opt(L, "spider_on_web", 1); tmptrap.seen = get_table_boolean_opt(L, "seen", FALSE); + tmptrap.novictim = !get_table_boolean_opt(L, "victim", TRUE); lua_getfield(L, -1, "launchfrom"); if (lua_type(L, -1) == LUA_TTABLE) {