groundwork: u.twoweap manipulation

Toggle u.twoweap on or off in just one place.
This commit is contained in:
PatR
2020-04-03 11:42:17 -07:00
parent d58e449d6c
commit 8f73f926b1
9 changed files with 32 additions and 19 deletions

View File

@@ -2989,6 +2989,7 @@ E int NDECL(dotwoweapon);
E void NDECL(uwepgone);
E void NDECL(uswapwepgone);
E void NDECL(uqwepgone);
E void FDECL(set_twoweap, (BOOLEAN_P));
E void NDECL(untwoweapon);
E int FDECL(chwepon, (struct obj *, int));
E int FDECL(welded, (struct obj *));

View File

@@ -231,7 +231,12 @@ int x, y;
{
struct obj *otmp;
u.twoweap = 0; /* ensure curse() won't cause swapwep to drop twice */
/* when dual-wielding, the second weapon gets dropped rather than welded if
it becomes cursed; ensure that that won't happen here by ending dual-wield */
u.twoweap = FALSE; /* bypass set_twoweap() */
/* all inventory is dropped (for the normal case), even non-droppable things
like worn armor and accessories, welded weapon, or cursed loadstones */
while ((otmp = g.invent) != 0) {
obj_extract_self(otmp);
/* when turning into green slime, all gear remains held;

View File

@@ -2467,12 +2467,12 @@ do_takeoff()
if (!cursed(uwep)) {
setuwep((struct obj *) 0);
You("are empty %s.", body_part(HANDED));
u.twoweap = FALSE;
set_twoweap(FALSE); /* u.twoweap = FALSE [ought to be in setuwep()] */
}
} else if (doff->what == W_SWAPWEP) {
setuswapwep((struct obj *) 0);
You("no longer have a second weapon readied.");
u.twoweap = FALSE;
set_twoweap(FALSE); /* u.twoweap = FALSE; [ought to be in setuswapwep()] */
} else if (doff->what == W_QUIVER) {
setuqwep((struct obj *) 0);
You("no longer have ammunition readied.");

View File

@@ -1193,7 +1193,7 @@ struct obj *oldslot; /* for thrown-and-return used with !fixinv */
if (obj->owornmask & W_QUIVER) /* in case addinv() autoquivered */
setuqwep((struct obj *) 0);
setuwep(obj);
u.twoweap = twoweap;
set_twoweap(twoweap); /* u.twoweap = twoweap */
} else if (u.dz < 0) {
(void) toss_up(obj, rn2(5) && !Underwater);
} else if (u.dz > 0 && u.usteed && obj->oclass == POTION_CLASS
@@ -1217,7 +1217,7 @@ struct obj *oldslot; /* for thrown-and-return used with !fixinv */
(void) encumber_msg();
if (wep_mask && !(obj->owornmask & wep_mask)) {
setworn(obj, wep_mask);
u.twoweap = twoweap;
set_twoweap(twoweap); /* u.twoweap = twoweap */
}
clear_thrownobj = TRUE;
goto throwit_return;
@@ -1352,7 +1352,7 @@ struct obj *oldslot; /* for thrown-and-return used with !fixinv */
if (obj->owornmask & W_QUIVER)
setuqwep((struct obj *) 0);
setuwep(obj);
u.twoweap = twoweap;
set_twoweap(twoweap); /* u.twoweap = twoweap */
if (cansee(g.bhitpos.x, g.bhitpos.y))
newsym(g.bhitpos.x, g.bhitpos.y);
} else {

View File

@@ -603,7 +603,7 @@ u_init()
uarm = uarmc = uarmh = uarms = uarmg = uarmf = 0;
uwep = uball = uchain = uleft = uright = 0;
uswapwep = uquiver = 0;
u.twoweap = 0;
u.twoweap = FALSE; /* bypass set_twoweap() */
u.ublessed = 0; /* not worthy yet */
u.ugangr = 0; /* gods not angry */
u.ugifts = 0; /* no divine gifts bestowed */
@@ -1114,11 +1114,11 @@ register struct trobj *trop;
if (obj->oclass == ARMOR_CLASS) {
if (is_shield(obj) && !uarms && !(uwep && bimanual(uwep))) {
setworn(obj, W_ARMS);
/* Prior to 3.6.2 this used to unset uswapwep if it was set, but
wearing a shield doesn't prevent having an alternate
/* Prior to 3.6.2 this used to unset uswapwep if it was set,
but wearing a shield doesn't prevent having an alternate
weapon ready to swap with the primary; just make sure we
aren't two-weaponing (academic; no one starts that way) */
u.twoweap = FALSE;
set_twoweap(FALSE); /* u.twoweap = FALSE */
} else if (is_helmet(obj) && !uarmh)
setworn(obj, W_ARMH);
else if (is_gloves(obj) && !uarmg)

View File

@@ -1149,7 +1149,7 @@ int dieroll;
if (jousting < 0) {
pline("%s shatters on impact!", Yname2(obj));
/* (must be either primary or secondary weapon to get here) */
u.twoweap = FALSE; /* untwoweapon() is too verbose here */
set_twoweap(FALSE); /* u.twoweap = FALSE; untwoweapon() is too verbose */
if (obj == uwep)
uwepgone(); /* set g.unweapon */
/* minor side-effect: broken lance won't split puddings */

View File

@@ -719,13 +719,20 @@ drop_uswapwep()
dropx(obj);
}
void
set_twoweap(on_off)
boolean on_off;
{
u.twoweap = on_off;
}
int
dotwoweapon()
{
/* You can always toggle it off */
if (u.twoweap) {
You("switch to your primary weapon.");
u.twoweap = 0;
set_twoweap(FALSE); /* u.twoweap = FALSE */
update_inventory();
return 0;
}
@@ -734,7 +741,7 @@ dotwoweapon()
if (can_twoweapon()) {
/* Success! */
You("begin two-weapon combat.");
u.twoweap = 1;
set_twoweap(TRUE); /* u.twoweap = TRUE */
update_inventory();
return (rnd(20) > ACURR(A_DEX));
}
@@ -785,7 +792,7 @@ untwoweapon()
{
if (u.twoweap) {
You("can no longer use two weapons at once.");
u.twoweap = FALSE;
set_twoweap(FALSE); /* u.twoweap = FALSE */
update_inventory();
}
return;

View File

@@ -66,7 +66,7 @@ long mask;
impossible("Setworn: mask = %ld.", wp->w_mask);
if (oobj) {
if (u.twoweap && (oobj->owornmask & (W_WEP | W_SWAPWEP)))
u.twoweap = 0;
set_twoweap(FALSE); /* u.twoweap = FALSE */
oobj->owornmask &= ~wp->w_mask;
if (wp->w_mask & ~(W_SWAPWEP | W_QUIVER)) {
/* leave as "x = x <op> y", here and below, for broken
@@ -120,8 +120,8 @@ register struct obj *obj;
if (!obj)
return;
if (obj == uwep || obj == uswapwep)
u.twoweap = 0;
if (u.twoweap && (obj == uwep || obj == uswapwep))
set_twoweap(FALSE); /* u.twoweap = FALSE */
for (wp = worn; wp->w_mask; wp++)
if (obj == *(wp->w_obj)) {
/* in case wearing or removal is in progress or removal

View File

@@ -1629,12 +1629,12 @@ int id;
if (was_twohanded || !bimanual(otmp) || !uarms)
setuwep(otmp);
if (was_twoweap && uwep && !bimanual(uwep))
u.twoweap = TRUE;
set_twoweap(TRUE); /* u.twoweap = TRUE */
} else if ((new_wornmask & W_SWAPWEP) != 0L) {
if (was_twohanded || !bimanual(otmp))
setuswapwep(otmp);
if (was_twoweap && uswapwep)
u.twoweap = TRUE;
set_twoweap(TRUE); /* u.twoweap = TRUE */
} else if ((new_wornmask & W_QUIVER) != 0L) {
setuqwep(otmp);
} else if (new_wornmask) {