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:
@@ -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
|
||||
|
||||
13
src/uhitm.c
13
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;
|
||||
|
||||
Reference in New Issue
Block a user