more steadfast

Make changes similar to the suggested patch from entrez:  support
for 'youmonst' as the monster passed to m_carrying().  This doesn't
change carrying(otyp) to call m_carrying(&g.youmonst,otyp) though.

Also, treat being on the Plane of Air or in an air bubble on the
Plane of Water similar to flying or levitating:  wielded Giantslayer
(or carried loadstone) doesn't prevent knockback there.
This commit is contained in:
PatR
2022-10-26 01:13:01 -07:00
parent 313cf1ccd8
commit 13fb141ddd
3 changed files with 22 additions and 16 deletions
+4 -2
View File
@@ -1285,15 +1285,17 @@ nxtobj(struct obj *obj, int type, boolean by_nexthere)
return otmp; return otmp;
} }
/* return inventory object of type 'type' if hero has one, otherwise Null */
struct obj * struct obj *
carrying(int type) carrying(int type)
{ {
register struct obj *otmp; register struct obj *otmp;
/* this could be replaced by 'return m_carrying(&g.youmonst, type);' */
for (otmp = g.invent; otmp; otmp = otmp->nobj) for (otmp = g.invent; otmp; otmp = otmp->nobj)
if (otmp->otyp == type) if (otmp->otyp == type)
return otmp; break;
return (struct obj *) 0; return otmp;
} }
/* Fictional and not-so-fictional currencies. /* Fictional and not-so-fictional currencies.
+7 -6
View File
@@ -1182,22 +1182,23 @@ lined_up(register struct monst* mtmp)
return m_lined_up(&g.youmonst, mtmp) ? TRUE : FALSE; return m_lined_up(&g.youmonst, mtmp) ? TRUE : FALSE;
} }
/* check if a monster is carrying a particular item */ /* check if a monster is carrying an item of a particular type */
struct obj * struct obj *
m_carrying(struct monst* mtmp, int type) m_carrying(struct monst *mtmp, int type)
{ {
register struct obj *otmp; register struct obj *otmp;
for (otmp = mtmp->minvent; otmp; otmp = otmp->nobj) for (otmp = (mtmp == &g.youmonst) ? g.invent : mtmp->minvent; otmp;
otmp = otmp->nobj)
if (otmp->otyp == type) if (otmp->otyp == type)
return otmp; break;
return (struct obj *) 0; return otmp;
} }
void void
hit_bars( hit_bars(
struct obj **objp, /* *objp will be set to NULL if object breaks */ struct obj **objp, /* *objp will be set to NULL if object breaks */
coordxy objx, coordxy objy, /* hero's spot (when wielded) or missile's spot */ coordxy objx, coordxy objy, /* hero's (when wielded) or missile's spot */
coordxy barsx, coordxy barsy, /* adjacent spot where bars are located */ coordxy barsx, coordxy barsy, /* adjacent spot where bars are located */
unsigned breakflags) /* breakage control */ unsigned breakflags) /* breakage control */
{ {
+11 -8
View File
@@ -4611,26 +4611,29 @@ missum(
wakeup(mdef, TRUE); wakeup(mdef, TRUE);
} }
/* check whether equipment protects against knockback */
static boolean static boolean
m_is_steadfast(struct monst *mtmp) m_is_steadfast(struct monst *mtmp)
{ {
boolean is_u = (mtmp == &g.youmonst); boolean is_u = (mtmp == &g.youmonst);
struct obj *otmp = is_u ? uwep : MON_WEP(mtmp); struct obj *otmp = is_u ? uwep : MON_WEP(mtmp);
/* must be on the ground */ /* must be on the ground (or in water) */
if (is_u ? (Flying || Levitation) if ((is_u ? (Flying || Levitation)
: (is_flyer(mtmp->data) || is_floater(mtmp->data))) : (is_flyer(mtmp->data) || is_floater(mtmp->data)))
|| Is_airlevel(&u.uz) /* air or cloud */
|| (Is_waterlevel(&u.uz) && !is_pool(u.ux, u.uy))) /* air bubble */
return FALSE; return FALSE;
if (is_art(otmp, ART_GIANTSLAYER)) if (is_art(otmp, ART_GIANTSLAYER))
return TRUE; return TRUE;
/* steadfast if carrying any loadstone (and not floating or flying); /* steadfast if carrying any loadstone (and not floating or flying);
when mounted and steed is target of knockback, check the rider 'is_u' test not needed here; m_carrying() is 'youmonst' aware */
for a loadstone too */ if (m_carrying(mtmp, LOADSTONE))
for (otmp = is_u ? g.invent : mtmp->minvent; otmp; otmp = otmp->nobj) return TRUE;
if (otmp->otyp == LOADSTONE) /* when mounted and steed is target of knockback, check the rider for
return TRUE; a loadstone too (Giantslayer's protection doesn't extend to steed) */
if (u.usteed && mtmp == u.usteed && carrying(LOADSTONE)) if (u.usteed && mtmp == u.usteed && carrying(LOADSTONE))
return TRUE; return TRUE;