diff --git a/dat/themerms.lua b/dat/themerms.lua index e8f35352e..aebbff641 100644 --- a/dat/themerms.lua +++ b/dat/themerms.lua @@ -101,22 +101,21 @@ themerooms = { }, -- Spider nest - { - mindiff = 10, - contents = function() - des.room({ type = "themed", + function() + des.room({ type = "themed", contents = function(rm) + local spooders = nh.level_difficulty() > 8; for x = 0, rm.width - 1 do for y = 0, rm.height - 1 do if (percent(30)) then - des.trap("web", x, y); + des.trap({ type = "web", x = x, y = y, + spider_on_web = spooders and percent(80) }); end end end end - }); - end - }, + }); + end, -- Trap room function() diff --git a/include/hack.h b/include/hack.h index 5e0fb203a..cb311d646 100644 --- a/include/hack.h +++ b/include/hack.h @@ -475,6 +475,11 @@ enum bodypart_types { #define TELEDS_ALLOW_DRAG 1 #define TELEDS_TELEPORT 2 +/* flags for mktrap() */ +#define MKTRAP_NOFLAGS 0x0 +#define MKTRAP_MAZEFLAG 0x1 /* trap placed on coords as if in maze */ +#define MKTRAP_NOSPIDERONWEB 0x2 /* web will not generate a spider */ + #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 b989b709e..a0087288d 100644 --- a/include/sp_lev.h +++ b/include/sp_lev.h @@ -127,6 +127,7 @@ typedef struct { typedef struct { packed_coord coord; xchar x, y, type; + boolean spider_on_web; } spltrap; typedef struct { diff --git a/src/mklev.c b/src/mklev.c index 53273bc14..c1c8507a5 100644 --- a/src/mklev.c +++ b/src/mklev.c @@ -769,7 +769,7 @@ fill_ordinary_room(struct mkroom *croom) if (x <= 1) x = 2; while (!rn2(x) && (++trycnt < 1000)) - mktrap(0, 0, croom, (coord *) 0); + mktrap(0, MKTRAP_NOFLAGS, croom, (coord *) 0); if (!rn2(3) && somexyspace(croom, &pos)) (void) mkgold(0L, pos.x, pos.y); if (Is_rogue_level(&u.uz)) @@ -1322,7 +1322,7 @@ occupied(register xchar x, register xchar y) /* make a trap somewhere (in croom if mazeflag = 0 && !tm) */ /* if tm != null, make trap at that location */ void -mktrap(int num, int mazeflag, struct mkroom *croom, coord *tm) +mktrap(int num, int mktrapflags, struct mkroom *croom, coord *tm) { register int kind; struct trap *t; @@ -1390,7 +1390,7 @@ mktrap(int num, int mazeflag, struct mkroom *croom, coord *tm) kind = NO_TRAP; break; case WEB: - if (lvl < 7) + if (lvl < 7 && !(mktrapflags & MKTRAP_NOSPIDERONWEB)) kind = NO_TRAP; break; case STATUE_TRAP: @@ -1427,7 +1427,7 @@ mktrap(int num, int mazeflag, struct mkroom *croom, coord *tm) do { if (++tryct > 200) return; - if (mazeflag) + if (mktrapflags & MKTRAP_MAZEFLAG) mazexy(&m); else if (!somexy(croom, &m)) return; @@ -1440,7 +1440,7 @@ mktrap(int num, int mazeflag, struct mkroom *croom, coord *tm) should prevent cases where that might not happen) but be paranoid */ kind = t ? t->ttyp : NO_TRAP; - if (kind == WEB) + if (kind == WEB && !(mktrapflags & MKTRAP_NOSPIDERONWEB)) (void) makemon(&mons[PM_GIANT_SPIDER], m.x, m.y, NO_MM_FLAGS); /* The hero isn't the only person who's entered the dungeon in diff --git a/src/mkmaze.c b/src/mkmaze.c index 49d5f5c2c..876c34344 100644 --- a/src/mkmaze.c +++ b/src/mkmaze.c @@ -1062,7 +1062,7 @@ makemaz(const char *s) (void) mkgold(0L, mm.x, mm.y); } for (x = rn1(6, 7); x; x--) - mktrap(0, 1, (struct mkroom *) 0, (coord *) 0); + mktrap(0, MKTRAP_MAZEFLAG, (struct mkroom *) 0, (coord *) 0); } #ifdef MICRO diff --git a/src/sp_lev.c b/src/sp_lev.c index 2105ba80e..d99538ee5 100755 --- a/src/sp_lev.c +++ b/src/sp_lev.c @@ -1686,6 +1686,7 @@ create_trap(spltrap* t, struct mkroom* croom) { xchar x = -1, y = -1; coord tm; + int mktrap_flags = MKTRAP_MAZEFLAG; if (croom) { get_free_room_loc(&x, &y, croom, t->coord); @@ -1700,10 +1701,13 @@ create_trap(spltrap* t, struct mkroom* croom) return; } + if (!t->spider_on_web) + mktrap_flags |= MKTRAP_NOSPIDERONWEB; + tm.x = x; tm.y = y; - mktrap(t->type, 1, (struct mkroom *) 0, &tm); + mktrap(t->type, mktrap_flags, (struct mkroom *) 0, &tm); } /* @@ -3995,6 +3999,7 @@ get_traptype_byname(const char *trapname) } /* trap({ type = "hole", x = 1, y = 1 }); */ +/* trap({ type = "web", spider_on_web = 0 }); */ /* trap("hole", 3, 4); */ /* trap("level teleport", {5, 8}); */ /* trap("rust") */ @@ -4008,6 +4013,8 @@ lspo_trap(lua_State* L) create_des_coder(); + tmptrap.spider_on_web = TRUE; + if (argc == 1 && lua_type(L, 1) == LUA_TSTRING) { const char *trapstr = luaL_checkstring(L, 1); @@ -4030,6 +4037,8 @@ lspo_trap(lua_State* L) get_table_xy_or_coord(L, &x, &y); tmptrap.type = get_table_traptype_opt(L, "type", -1); + tmptrap.spider_on_web + = get_table_boolean_opt(L, "spider_on_web", 1); } if (tmptrap.type == NO_TRAP)