From c34d7af1eb5db765c5677de64a59f25cc929524b Mon Sep 17 00:00:00 2001 From: "nethack.allison" Date: Fri, 10 Jan 2003 04:00:37 +0000 Subject: [PATCH] B16002 The complaint states: It still won't let you unwield a cursed secondary weapon while two-weaponing, even though you can drop such a weapon without problem. You aren't supposed to be able to two-weapon with a cursed alternate weapon at all. It appears that there are some checks to prevent twoweaponing if uswapwep is cursed when you try. This patch ensures that two-weaping stops if uswapwep gets cursed while two-weaponing. I think this means the 'A' command will never encounter the situation now in the complaint now. The rules in wield.c state The secondary weapon (uswapwep): 1. Is filled by the x command, which swaps this slot with the main weapon. If the "pushweapon" option is set, the w command will also store the old weapon in the secondary slot. 2. Can be field with anything that will fit in the main weapon slot; that is, any type of item. 3. Is usually NOT considered to be carried in the hands. That would force too many checks among the main weapon, second weapon, shield, gloves, and rings; and it would further be complicated by bimanual weapons. A special exception is made for two-weapon combat. 4. Is used as the second weapon for two-weapon combat, and as a convenience to swap with the main weapon. 5. Never conveys intrinsics. 6. Cursed items never weld (see number 3 for reasons), but they also prevent two-weapon combat. --- include/extern.h | 1 + src/mkobj.c | 4 ++++ src/wield.c | 22 ++++++++++++++-------- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/include/extern.h b/include/extern.h index 88955cc31..9385f41d4 100644 --- a/include/extern.h +++ b/include/extern.h @@ -2237,6 +2237,7 @@ E int FDECL(chwepon, (struct obj *,int)); E int FDECL(welded, (struct obj *)); E void FDECL(weldmsg, (struct obj *)); E void FDECL(setmnotwielded, (struct monst *,struct obj *)); +E void NDECL(drop_uswapwep); /* ### windows.c ### */ diff --git a/src/mkobj.c b/src/mkobj.c index 2068104bb..156b06044 100644 --- a/src/mkobj.c +++ b/src/mkobj.c @@ -714,6 +714,10 @@ register struct obj *otmp; otmp->cursed = 1; /* welded two-handed weapon interferes with some armor removal */ if (otmp == uwep && bimanual(uwep)) reset_remarm(); + /* rules at top of wield.c state that twoweapon cannot be done + with cursed alternate weapon */ + if (otmp == uswapwep && u.twoweap) + drop_uswapwep(); /* some cursed items need immediate updating */ if (carried(otmp) && confers_luck(otmp)) set_moreluck(); diff --git a/src/wield.c b/src/wield.c index fad266953..53daf89c8 100644 --- a/src/wield.c +++ b/src/wield.c @@ -440,20 +440,26 @@ can_twoweapon() Sprintf(kbuf, "%s corpse", an(mons[uswapwep->corpsenm].mname)); instapetrify(kbuf); } else if (Glib || uswapwep->cursed) { - char str[BUFSZ]; - struct obj *obj = uswapwep; - - /* Avoid trashing makeplural's static buffer */ - Strcpy(str, makeplural(body_part(HAND))); - Your("%s from your %s!", aobjnam(obj, "slip"), str); if (!Glib) - obj->bknown = TRUE; - dropx(obj); + uswapwep->bknown = TRUE; + drop_uswapwep(); } else return (TRUE); return (FALSE); } +void +drop_uswapwep() +{ + char str[BUFSZ]; + struct obj *obj = uswapwep; + + /* Avoid trashing makeplural's static buffer */ + Strcpy(str, makeplural(body_part(HAND))); + Your("%s from your %s!", aobjnam(obj, "slip"), str); + dropx(obj); +} + int dotwoweapon() { -- 2.40.0