summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/traps.cc
diff options
context:
space:
mode:
Diffstat (limited to 'crawl-ref/source/traps.cc')
-rw-r--r--crawl-ref/source/traps.cc86
1 files changed, 36 insertions, 50 deletions
diff --git a/crawl-ref/source/traps.cc b/crawl-ref/source/traps.cc
index a8d47fa834..4251ffe78f 100644
--- a/crawl-ref/source/traps.cc
+++ b/crawl-ref/source/traps.cc
@@ -626,6 +626,9 @@ void trap_def::trigger(actor& triggerer, bool flat_footed)
break;
case TRAP_SHAFT:
+ // Unknown shafts are traps triggered by walking onto them.
+ // Known shafts are used as escape hatches
+
// Paranoia
if (!is_valid_shaft_level())
{
@@ -636,48 +639,19 @@ void trap_def::trigger(actor& triggerer, bool flat_footed)
break;
}
+ // If the shaft isn't triggered, don't reveal it.
+ if (!triggerer.will_trigger_shaft() && !you_know)
+ this->hide();
+
// Known shafts don't trigger as traps.
if (trig_knows)
- {
- if (you_trigger)
- {
- if (triggerer.airborne())
- {
- if (you.flight_mode() == FL_LEVITATE)
- mpr("You float over the shaft.");
- else
- mpr("You fly over the shaft.");
- }
- else
- mpr("You carefully avoid triggering the shaft.");
- }
break;
- }
-
- if (!triggerer.will_trigger_shaft())
- {
- if (!you_know)
- this->hide();
- else if (!triggerer.airborne())
- {
- if (you_trigger)
- {
- mpr("You don't fall through the shaft.");
- }
- else if (m)
- {
- simple_monster_message(m,
- " doesn't fall through the shaft.");
- }
- }
- }
// Fire away!
- {
- const bool revealed = triggerer.do_shaft();
- if (!revealed && !you_know)
- this->hide();
- }
+ triggerer.do_shaft();
+
+ // Shafts are destroyed
+ // after one use in down_stairs(), misc.cc
break;
default:
@@ -1341,10 +1315,10 @@ bool is_valid_shaft_level(const level_id &place)
return ((branch.depth - place.depth) >= min_delta);
}
-level_id generic_shaft_dest(level_pos lpos)
+level_id generic_shaft_dest(level_pos lpos, bool known = false)
{
- level_id lid = lpos.id;
- coord_def pos = lpos.pos;
+ level_id lid = lpos.id;
+ coord_def pos = lpos.pos;
if (lid.level_type != LEVEL_DUNGEON)
return lid;
@@ -1352,14 +1326,26 @@ level_id generic_shaft_dest(level_pos lpos)
int curr_depth = lid.depth;
Branch &branch = branches[lid.branch];
- // 25% drop one level
- // 50% drop two levels
- // 25% drop three levels
- lid.depth += 2;
- if (pos.x % 2)
- lid.depth--;
- if (pos.y % 2)
- lid.depth++;
+ // Shaft traps' behavior depends on whether it is entered intentionally.
+ // Knowingly entering one is more likely to drop you 1 level.
+ // Falling in unknowingly can drop you 1/2/3 levels with equal chance.
+
+ if (known)
+ {
+ // Chances are 5/8s for 1 level, 2/8s for 2 levels, 1/8 for 3 levels
+ int s = random2(8) + 1;
+ if (s == 1)
+ lid.depth += 3;
+ else if (s <= 3)
+ lid.depth += 2;
+ else
+ lid.depth += 1;
+ }
+ else
+ {
+ // 33.3% for 1, 2, 3
+ lid.depth += 1 + random2(3);
+ }
if (lid.depth > branch.depth)
lid.depth = branch.depth;
@@ -1382,7 +1368,7 @@ level_id generic_shaft_dest(level_pos lpos)
return lid;
}
-level_id generic_shaft_dest(coord_def pos)
+level_id generic_shaft_dest(coord_def pos, bool known = false)
{
return generic_shaft_dest(level_pos(level_id::current(), pos));
}
@@ -1392,7 +1378,7 @@ void handle_items_on_shaft(const coord_def& pos, bool open_shaft)
if (!is_valid_shaft_level())
return;
- level_id dest = generic_shaft_dest(pos);
+ level_id dest = generic_shaft_dest(pos);
if (dest == level_id::current())
return;