Lua: Traps without victims

Traps may get corpses generated on them on early dungeon levels,
to warn off fragile starting heroes. Allow creating traps in lua
without the corpse.
This commit is contained in:
Pasi Kallinen
2023-02-25 17:56:44 +02:00
parent 4fd7d51cb2
commit 00c756ba75
5 changed files with 9 additions and 1 deletions

View File

@@ -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});

View File

@@ -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 */

View File

@@ -127,6 +127,7 @@ typedef struct {
xint16 type;
boolean spider_on_web;
boolean seen;
boolean novictim;
} spltrap;
typedef struct {

View File

@@ -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

View File

@@ -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) {