From 4799fc937a514072649ff5acef9fe2c8005ee5da Mon Sep 17 00:00:00 2001 From: Pasi Kallinen Date: Fri, 17 Mar 2023 19:35:57 +0200 Subject: [PATCH] Add level flag for plane of fire fumaroles Also reduce the size of the gas clouds. Breaks saves and bones. --- dat/fire.lua | 2 +- doc/lua.adoc | 1 + include/patchlevel.h | 2 +- include/rm.h | 1 + src/allmain.c | 2 +- src/do.c | 2 +- src/mkmaze.c | 16 +++++++++++++--- src/sp_lev.c | 2 ++ 8 files changed, 21 insertions(+), 7 deletions(-) diff --git a/dat/fire.lua b/dat/fire.lua index 3a6ff7272..c97973c02 100644 --- a/dat/fire.lua +++ b/dat/fire.lua @@ -6,7 +6,7 @@ -- des.level_init({ style = "solidfill", fg = " " }); -des.level_flags("mazelevel", "noteleport", "hardfloor", "shortsighted", "hot") +des.level_flags("mazelevel", "noteleport", "hardfloor", "shortsighted", "hot", "fumaroles") -- The player lands, upon arrival, in the -- lower-right. The location of the -- portal to the next level is randomly chosen. diff --git a/doc/lua.adoc b/doc/lua.adoc index fa8be9f35..6de9a16c9 100644 --- a/doc/lua.adoc +++ b/doc/lua.adoc @@ -614,6 +614,7 @@ Set flags for this level. | temperate | Level is neither hot nor cold. | nomongen | Prevents random monster generation. | nodeathdrops | Prevents killed monsters from dropping corpses or random death drops. +| fumaroles | Lava emits poison gas clouds at random. |=== Example: diff --git a/include/patchlevel.h b/include/patchlevel.h index 5c59ef223..b67307b1f 100644 --- a/include/patchlevel.h +++ b/include/patchlevel.h @@ -17,7 +17,7 @@ * Incrementing EDITLEVEL can be used to force invalidation of old bones * and save files. */ -#define EDITLEVEL 78 +#define EDITLEVEL 79 /* * Development status possibilities. diff --git a/include/rm.h b/include/rm.h index 4f9982492..2b74524d5 100644 --- a/include/rm.h +++ b/include/rm.h @@ -392,6 +392,7 @@ struct levelflags { Bitfield(rndmongen, 1); /* random monster generation allowed? */ Bitfield(deathdrops, 1); /* monsters may drop corpses/death drops */ Bitfield(noautosearch, 1); /* automatic searching disabled */ + Bitfield(fumaroles, 1); /* lava emits poison gas at random */ schar temperature; /* +1 == hot, -1 == cold */ }; diff --git a/src/allmain.c b/src/allmain.c index 4793ce376..c71cfbaf9 100644 --- a/src/allmain.c +++ b/src/allmain.c @@ -333,7 +333,7 @@ moveloop_core(void) /* vision will be updated as bubbles move */ if (Is_waterlevel(&u.uz) || Is_airlevel(&u.uz)) movebubbles(); - else if (Is_firelevel(&u.uz)) + else if (gl.level.flags.fumaroles) fumaroles(); /* when immobile, count is in turns */ diff --git a/src/do.c b/src/do.c index 12062af71..f41e45db9 100644 --- a/src/do.c +++ b/src/do.c @@ -1730,7 +1730,7 @@ goto_level( /* initial movement of bubbles just before vision_recalc */ if (Is_waterlevel(&u.uz) || Is_airlevel(&u.uz)) movebubbles(); - else if (Is_firelevel(&u.uz)) + else if (gl.level.flags.fumaroles) fumaroles(); /* Reset the screen. */ diff --git a/src/mkmaze.c b/src/mkmaze.c index 5cff6f854..3d74edd2d 100644 --- a/src/mkmaze.c +++ b/src/mkmaze.c @@ -1390,15 +1390,25 @@ mkportal(coordxy x, coordxy y, xint16 todnum, xint16 todlevel) void fumaroles(void) { - xint16 n; + xint16 n, nmax = rn2(3); + int sizemin = 5; boolean snd = FALSE, loud = FALSE; - for (n = rn2(3) + 2; n; n--) { + if (Is_firelevel(&u.uz)) { + nmax++; + sizemin += 5; + } + if (gl.level.flags.temperature > 0) { + nmax++; + sizemin += 5; + } + + for (n = nmax; n; n--) { coordxy x = rn1(COLNO - 4, 3); coordxy y = rn1(ROWNO - 4, 3); if (levl[x][y].typ == LAVAPOOL) { - NhRegion *r = create_gas_cloud(x, y, rn1(30, 20), rn1(10, 5)); + NhRegion *r = create_gas_cloud(x, y, rn1(10, sizemin), rn1(10, 5)); clear_heros_fault(r); snd = TRUE; diff --git a/src/sp_lev.c b/src/sp_lev.c index 605364b0b..29117f925 100644 --- a/src/sp_lev.c +++ b/src/sp_lev.c @@ -3747,6 +3747,8 @@ lspo_level_flags(lua_State *L) gl.level.flags.deathdrops = 0; else if (!strcmpi(s, "noautosearch")) gl.level.flags.noautosearch = 1; + else if (!strcmpi(s, "fumaroles")) + gl.level.flags.fumaroles = 1; else { char buf[BUFSZ]; Sprintf(buf, "Unknown level flag %s", s);