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

@@ -219,6 +219,7 @@ when doppelgangers taking on new shape don't specifically pick nasty monster
or role monster, bias the random form towards humanoid
salamanders can use green slime corpses to cure themselves of petrification
feedback about summoned monsters may use singular when it should use plural
rogue's backstab bonus doesn't apply for throwing attacks
Platform- and/or Interface-Specific Fixes

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;