From bc94d7a3558868fc9f1e33a54a57eed7f84e3a60 Mon Sep 17 00:00:00 2001 From: Alex Smith Date: Tue, 14 Apr 2026 11:28:07 +0100 Subject: [PATCH] More interesting rolling boulder traps Rolling boulder traps now react to having boulders pushed onto them; the boulder will roll until reaching the trap's launch spot (resetting the trap if the boulder was removed), or until it hits a wall otherwise. Because they can now be reset, they aren't removed when stepping on them with a misplaced boulder (although no boulder moves unless there's one on the appropriate spot). --- doc/fixes3-7-0.txt | 6 ++++-- src/hack.c | 20 ++++++++++++++++++++ src/trap.c | 10 +++++++--- 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/doc/fixes3-7-0.txt b/doc/fixes3-7-0.txt index 4a0bb71e4..8861dc69f 100644 --- a/doc/fixes3-7-0.txt +++ b/doc/fixes3-7-0.txt @@ -1583,8 +1583,8 @@ allow rogues to also backstab sleeping or paralyzed monsters rogues cannot backstab monsters that have no backside give experience if opening Schroedinger's Box causes death of the cat inside priest donation amounts are explicitly stated, randomized slightly, based on - peak rather than current level, and allow for bulk donations (buying - larger amounts of clairvoyance/protection) if you have a lot of gold + peak rather than current level, and allow for bulk donations (buying + larger amounts of clairvoyance/protection) if you have a lot of gold amulet of magical breathing increases power regeneration change some command keys, 'v' is now chronicle, 'V' is versionshort, m-prefix 'V' is longer version, remove key binding of #history @@ -1596,6 +1596,8 @@ prevent phaseable monsters hiding deep inside nondiggable walls blessed potion of see invisible does not guarantee the intrinsic prevent selecting all options in #optionsfull menu shapeshifters change shape less +rolling boulder traps aren't removed when stepped on and move boulders + pushed onto them Fixes to 3.7.0-x General Problems Exposed Via git Repository diff --git a/src/hack.c b/src/hack.c index ebdc126c2..38a24c6a7 100644 --- a/src/hack.c +++ b/src/hack.c @@ -592,6 +592,26 @@ moverock_core(coordxy sx, coordxy sy) } seetrap(ttmp); return sobj_at(BOULDER, sx, sy) ? -1 : 0; + case ROLLING_BOULDER_TRAP: + { + int tox = rx; + int toy = ry; + /* the boulder continues until it reaches one of + the trap's launch spots or hits a wall / out-of-bounds */ + while (isok(tox + u.dx, toy + u.dy)) { + tox += u.dx; + toy += u.dy; + if (tox == ttmp->launch.x && toy == ttmp->launch.y) + break; + if (tox == ttmp->launch2.x && toy == ttmp->launch2.y) + break; + } + pline("%s away from you!", + Tobjnam(otmp, "suddenly roll")); + feeltrap(ttmp); + launch_obj(BOULDER, sx, sy, tox, toy, ROLL | LAUNCH_KNOWN); + return sobj_at(BOULDER, sx, sy) ? -1 : 0; + } default: break; /* boulder not affected by this trap */ } diff --git a/src/trap.c b/src/trap.c index 8444e9b30..e44da9133 100644 --- a/src/trap.c +++ b/src/trap.c @@ -2671,9 +2671,13 @@ trapeffect_rolling_boulder_trap( !Deaf ? "Click! " : ""); if (!launch_obj(BOULDER, trap->launch.x, trap->launch.y, trap->launch2.x, trap->launch2.y, style)) { - deltrap(trap); - newsym(u.ux, u.uy); /* get rid of trap symbol */ - pline("Fortunately for you, no boulder was released."); + /* if this is a known trap, the player may have known there wasn't + a lined up boulder, so use a shorter message to avoid --More-- + spam */ + if (style & LAUNCH_KNOWN) + pline("No boulder was released."); + else + pline("Fortunately for you, no boulder was released."); } } else { if (!m_in_air(mtmp)) {