fix #H291 - rogue backstab anomaly (trunk only)

From a bug report:  rogue's backstab bonus
(extra damage when foe is fleeing) doesn't apply when dual-wielding but
does apply to thrown weapons--unless both conditions apply.  Having it
apply to throwing is too powerful.  Elbereth makes it trivial to get
monsters to flee and a rogue with expert dagger skill can throw up to 4
of those at a time, so a level 30 rogue could get rnd(30) bonus 4 times
in a single attack.  This makes the backstab bonus only applicable to
melee and polearm attacks.
This commit is contained in:
nethack.rankin
2007-04-21 03:32:26 +00:00
parent 73a315dcfd
commit a1a4a45033
2 changed files with 9 additions and 5 deletions

View File

@@ -550,6 +550,9 @@ int thrown; /* HMON_xxx (0 => hand-to-hand, other => ranged) */
boolean silvermsg = FALSE, silverobj = FALSE;
boolean valid_weapon_attack = FALSE;
boolean unarmed = !uwep && !uarm && !uarms;
boolean hand_to_hand = (thrown == HMON_MELEE ||
/* not grapnels; applied implies uwep */
(thrown == HMON_APPLIED && is_pole(uwep)));
#ifdef STEED
int jousting = 0;
#endif
@@ -638,7 +641,9 @@ int thrown; /* HMON_xxx (0 => hand-to-hand, other => ranged) */
valid_weapon_attack = (tmp > 1);
if (!valid_weapon_attack || mon == u.ustuck || u.twoweap) {
; /* no special bonuses */
} else if (mon->mflee && Role_if(PM_ROGUE) && !Upolyd) {
} else if (mon->mflee && Role_if(PM_ROGUE) && !Upolyd &&
/* multi-shot throwing is too powerful here */
hand_to_hand) {
You("strike %s from behind!", mon_nam(mon));
tmp += rnd(u.ulevel);
hittxt = TRUE;
@@ -1037,8 +1042,7 @@ int thrown; /* HMON_xxx (0 => hand-to-hand, other => ranged) */
/* iron weapon using melee or polearm hit */
obj && obj == uwep &&
objects[obj->otyp].oc_material == IRON &&
(thrown == HMON_MELEE ||
(thrown == HMON_APPLIED && is_pole(obj)))) {
hand_to_hand) {
if (clone_mon(mon, 0, 0)) {
pline("%s divides as you hit it!", Monnam(mon));
hittxt = TRUE;
@@ -1092,8 +1096,7 @@ int thrown; /* HMON_xxx (0 => hand-to-hand, other => ranged) */
} else if (destroyed) {
if (!already_killed)
killed(mon); /* takes care of most messages */
} else if (u.umconf &&
(thrown == HMON_MELEE || thrown == HMON_APPLIED)) {
} else if (u.umconf && hand_to_hand) {
nohandglow(mon);
if (!mon->mconf && !resist(mon, SPBOOK_CLASS, 0, NOTELL)) {
mon->mconf = 1;