Uncursing objects now causes them to become unequipped.

This commit is contained in:
Rob Pearce 2016-06-02 16:35:12 +10:00
parent dc48475d8b
commit 9330c00ab3
3 changed files with 45 additions and 17 deletions

21
lf.c
View File

@ -12383,6 +12383,8 @@ void giveobflags(lifeform_t *lf, object_t *o, enum FLAG whattype) {
newval[1] = f->val[2];
// cursed objects might confer different flags...
// TODO: if you uncurse the object, you don't lose the penalty until
// you take it off.
if (iscursed(o)) {
if (newid == F_VISRANGEMOD) {
if (newval[0] != NA) {
@ -25234,8 +25236,6 @@ int takeoff(lifeform_t *lf, object_t *o) {
}
// remove the equipped flag
killflagsofid(o->flags, F_EQUIPPED);
taketime(lf, getactspeed(lf));
if (gamemode == GM_GAMESTARTED) {
if (isplayer(lf)) {
@ -25249,15 +25249,9 @@ int takeoff(lifeform_t *lf, object_t *o) {
}
unequipeffects(lf, o);
// if you don't have a pack, it goes to the ground.
if (lfhasflag(lf, F_NOPACK)) {
moveob(o, lf->cell->obpile, o->amt);
}
makeunequipped(lf, o);
return B_FALSE;
}
@ -26023,8 +26017,6 @@ int unweild(lifeform_t *lf, object_t *o) {
return B_TRUE;
}
// remove the equipped flag
killflagsofid(o->flags, F_EQUIPPED);
// unweilding doesn't take any time
if (gamemode == GM_GAMESTARTED) {
@ -26037,12 +26029,7 @@ int unweild(lifeform_t *lf, object_t *o) {
}
}
unequipeffects(lf, o);
// if you don't have a pack, it goes to the ground.
if (lfhasflag(lf, F_NOPACK)) {
moveob(o, lf->cell->obpile, o->amt);
}
makeunequipped(lf, o);
return B_FALSE;
}

View File

@ -9071,6 +9071,17 @@ int makedullermaybe(object_t *o, int howmuch) {
return B_FALSE;
}
void makeunequipped(lifeform_t *lf, object_t *o) {
// remove the equipped flag
killflagsofid(o->flags, F_EQUIPPED);
unequipeffects(lf, o);
// if you don't have a pack, it goes to the ground.
if (lfhasflag(lf, F_NOPACK)) {
moveob(o, lf->cell->obpile, o->amt);
}
}
void makehot(object_t *o, int howmuch, int howlong) {
flag_t *f;
@ -13750,6 +13761,35 @@ int readsomething(lifeform_t *lf, object_t *o) {
// otherwise only equipped objects will be uncursed.
if (o->blessed || isequipped(oo)) {
uncurseob(oo, &seen);
if (isequipped(oo)) {
// forcibly unequip it.
makeunequipped(lf, oo);
if (isplayer(lf)) {
char obname[BUFLEN];
// announce
getobname(oo,obname,oo->amt);
if (oo->pile->owner == lf) {
msg("Your %s vanishes and reappears in your pack.", noprefix(obname));
} else {
msg("Your %s vanishes and appears on the ground.", noprefix(obname));
}
} else if (cansee(player, lf)) {
char obname[BUFLEN],lfname[BUFLEN];
// announce
getobname(oo,obname,oo->amt);
getlfname(lf, lfname);
if (oo->pile->owner == lf) {
msg("%s%s %s vanishes and reappears in %ss pack.", lfname,
getpossessive(lfname),
noprefix(obname), it(lf));
} else {
msg("%s%s %s vanishes and appears on the ground.", lfname,
getpossessive(lfname),
noprefix(obname));
}
}
}
}
}
}

View File

@ -261,6 +261,7 @@ lifeform_t *makeanimated(lifeform_t *lf, object_t *o, int level);
void makecool(object_t *o, int howmuch, int howlong);
int makeduller(object_t *o, int howmuch);
int makedullermaybe(object_t *o, int howmuch);
void makeunequipped(lifeform_t *lf, object_t *o);
void makehot(object_t *o, int howmuch, int howlong);
void makeknown(enum OBTYPE otid);
void makeknownobclass(enum OBCLASS ocid, enum RARITY rrlev);