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:
+4
-2
@@ -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
@@ -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
@@ -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;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user