setmnotwielded should always MON_NOWEP

Instead of making the caller remember to use MON_NOWEP, make
setmnotwielded handle that automatically.  This fixes the
"bad monster weapon restore" errors I've been seeing.

Also adds sanity checks for this.
This commit is contained in:
Pasi Kallinen
2015-10-06 18:47:52 +03:00
parent a51531776d
commit 8212ddd69e
5 changed files with 15 additions and 14 deletions

View File

@@ -1973,10 +1973,8 @@ long timeout; /* unused */
stop_occupation(); stop_occupation();
} }
} else if (obj->where == OBJ_MINVENT && obj->owornmask) { } else if (obj->where == OBJ_MINVENT && obj->owornmask) {
if (obj == MON_WEP(obj->ocarry)) { if (obj == MON_WEP(obj->ocarry))
setmnotwielded(obj->ocarry, obj); setmnotwielded(obj->ocarry, obj);
MON_NOWEP(obj->ocarry);
}
} else if (obj->where == OBJ_MIGRATING) { } else if (obj->where == OBJ_MIGRATING) {
/* clear destination flag so that obfree()'s check for /* clear destination flag so that obfree()'s check for
freeing a worn object doesn't get a false hit */ freeing a worn object doesn't get a false hit */

View File

@@ -2156,9 +2156,16 @@ struct monst *monlist;
const char *mesg; const char *mesg;
{ {
struct monst *mon; struct monst *mon;
struct obj *obj; struct obj *obj, *mwep;
for (mon = monlist; mon; mon = mon->nmon) for (mon = monlist; mon; mon = mon->nmon) {
mwep = MON_WEP(mon);
if (mwep) {
if (!mcarried(mwep))
insane_object(mwep, mfmt1, mesg, mon);
if (mwep->ocarry != mon)
insane_object(mwep, mfmt2, mesg, mon);
}
for (obj = mon->minvent; obj; obj = obj->nobj) { for (obj = mon->minvent; obj; obj = obj->nobj) {
if (obj->where != OBJ_MINVENT) if (obj->where != OBJ_MINVENT)
insane_object(obj, mfmt1, mesg, mon); insane_object(obj, mfmt1, mesg, mon);
@@ -2166,6 +2173,7 @@ const char *mesg;
insane_object(obj, mfmt2, mesg, mon); insane_object(obj, mfmt2, mesg, mon);
check_contained(obj, mesg); check_contained(obj, mesg);
} }
}
} }
/* This must stay consistent with the defines in obj.h. */ /* This must stay consistent with the defines in obj.h. */

View File

@@ -282,10 +282,8 @@ struct obj *obj; /* missile (or stack providing it) */
/* not possibly_unwield, which checks the object's */ /* not possibly_unwield, which checks the object's */
/* location, not its existence */ /* location, not its existence */
if (MON_WEP(mon) == obj) { if (MON_WEP(mon) == obj)
setmnotwielded(mon, obj); setmnotwielded(mon, obj);
MON_NOWEP(mon);
}
obj_extract_self(obj); obj_extract_self(obj);
singleobj = obj; singleobj = obj;
obj = (struct obj *) 0; obj = (struct obj *) 0;

View File

@@ -670,7 +670,6 @@ int thrown; /* HMON_xxx (0 => hand-to-hand, other => ranged) */
* the percentage chance is (1/20)*(50/100).] * the percentage chance is (1/20)*(50/100).]
*/ */
setmnotwielded(mon, monwep); setmnotwielded(mon, monwep);
MON_NOWEP(mon);
mon->weapon_check = NEED_WEAPON; mon->weapon_check = NEED_WEAPON;
pline("%s from the force of your blow!", pline("%s from the force of your blow!",
Yobjnam2(monwep, "shatter")); Yobjnam2(monwep, "shatter"));
@@ -1349,10 +1348,8 @@ struct attack *mattk;
obj_extract_self(otmp); obj_extract_self(otmp);
if ((unwornmask = otmp->owornmask) != 0L) { if ((unwornmask = otmp->owornmask) != 0L) {
mdef->misc_worn_check &= ~unwornmask; mdef->misc_worn_check &= ~unwornmask;
if (otmp->owornmask & W_WEP) { if (otmp->owornmask & W_WEP)
setmnotwielded(mdef, otmp); setmnotwielded(mdef, otmp);
MON_NOWEP(mdef);
}
otmp->owornmask = 0L; otmp->owornmask = 0L;
update_mon_intrinsics(mdef, otmp, FALSE, FALSE); update_mon_intrinsics(mdef, otmp, FALSE, FALSE);

View File

@@ -582,7 +582,6 @@ boolean polyspot;
} }
if (!attacktype(mon->data, AT_WEAP)) { if (!attacktype(mon->data, AT_WEAP)) {
setmnotwielded(mon, mw_tmp); setmnotwielded(mon, mw_tmp);
MON_NOWEP(mon);
mon->weapon_check = NO_WEAPON_WANTED; mon->weapon_check = NO_WEAPON_WANTED;
obj_extract_self(obj); obj_extract_self(obj);
if (cansee(mon->mx, mon->my)) { if (cansee(mon->mx, mon->my)) {
@@ -735,7 +734,6 @@ struct monst *mon;
if (mwep) { if (mwep) {
setmnotwielded(mon, mwep); setmnotwielded(mon, mwep);
MON_NOWEP(mon);
mon->weapon_check = NEED_WEAPON; mon->weapon_check = NEED_WEAPON;
} }
} }
@@ -1443,6 +1441,8 @@ register struct obj *obj;
s_suffix(mon_nam(mon)), mbodypart(mon, HAND), s_suffix(mon_nam(mon)), mbodypart(mon, HAND),
otense(obj, "stop")); otense(obj, "stop"));
} }
if (MON_WEP(mon) == obj)
MON_NOWEP(mon);
obj->owornmask &= ~W_WEP; obj->owornmask &= ~W_WEP;
} }