From a1a4a45033f5e20cb73c7fca7ab1a527e5e416d0 Mon Sep 17 00:00:00 2001 From: "nethack.rankin" Date: Sat, 21 Apr 2007 03:32:26 +0000 Subject: [PATCH] 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. --- doc/fixes35.0 | 1 + src/uhitm.c | 13 ++++++++----- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/doc/fixes35.0 b/doc/fixes35.0 index 171122087..d1096d98f 100644 --- a/doc/fixes35.0 +++ b/doc/fixes35.0 @@ -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 diff --git a/src/uhitm.c b/src/uhitm.c index 76f5496a2..52278d65f 100644 --- a/src/uhitm.c +++ b/src/uhitm.c @@ -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;