-/* NetHack 3.7 monsters.h $NHDT-Date: 1648318980 2022/03/26 18:23:00 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.97 $ */
+/* NetHack 3.7 monsters.h $NHDT-Date: 1665130023 2022/10/07 08:07:03 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.103 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/*-Copyright (c) Michael Allison, 2006. */
/* NetHack may be freely redistributed. See license for details. */
M1_NOLIMBS | M1_SLITHY | M1_THICK_HIDE | M1_NOTAKE | M1_OMNIVORE,
M2_STRONG, 0, 4, CLR_GREEN, GUARDIAN_NAGA_HATCHLING),
MON("red naga", S_NAGA, LVL(6, 12, 4, 0, -4), (G_GENO | 1),
- A(ATTK(AT_BITE, AD_PHYS, 2, 4), ATTK(AT_BREA, AD_FIRE, 2, 6), NO_ATTK,
- NO_ATTK, NO_ATTK, NO_ATTK),
+ A(ATTK(AT_BITE, AD_PHYS, 2, 4), ATTK(AT_BREA, AD_FIRE, 2, 6),
+ NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(2600, 400, MS_MUMBLE, MZ_HUGE), MR_FIRE | MR_POISON,
MR_FIRE | MR_POISON, M1_NOLIMBS | M1_SLITHY | M1_THICK_HIDE
| M1_OVIPAROUS | M1_NOTAKE | M1_OMNIVORE,
| M1_NOTAKE | M1_CARNIVORE,
M2_STRONG, 0, 10, CLR_BLACK, BLACK_NAGA),
MON("golden naga", S_NAGA, LVL(10, 14, 2, 70, 5), (G_GENO | 1),
- A(ATTK(AT_BITE, AD_PHYS, 2, 6), ATTK(AT_MAGC, AD_SPEL, 4, 6), NO_ATTK,
- NO_ATTK, NO_ATTK, NO_ATTK),
+ A(ATTK(AT_BITE, AD_PHYS, 2, 6), ATTK(AT_MAGC, AD_SPEL, 4, 6),
+ NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(2600, 400, MS_MUMBLE, MZ_HUGE), MR_POISON, MR_POISON,
M1_NOLIMBS | M1_SLITHY | M1_THICK_HIDE | M1_OVIPAROUS | M1_NOTAKE
| M1_OMNIVORE,
M2_STRONG, 0, 13, HI_GOLD, GOLDEN_NAGA),
+ /* 3.7: guardian naga used to have three attacks: bite, spit, hug
+ but in order for the hug to succeed the two preceding attacks had
+ to have hit, and its not possible to both bite and spit, hence
+ the hug never hit; change to spit, bite, touch, hug; if the bite
+ and touch hit, the hug will too */
MON("guardian naga", S_NAGA, LVL(12, 16, 0, 50, 7), (G_GENO | 1),
- A(ATTK(AT_BITE, AD_PLYS, 1, 6), ATTK(AT_SPIT, AD_DRST, 1, 6),
- ATTK(AT_HUGS, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK),
+ A(ATTK(AT_SPIT, AD_DRST, 1, 6), ATTK(AT_BITE, AD_PLYS, 1, 6),
+ ATTK(AT_TUCH, AD_PHYS, 0, 0), ATTK(AT_HUGS, AD_WRAP, 2, 4),
+ NO_ATTK, NO_ATTK),
SIZ(2600, 400, MS_MUMBLE, MZ_HUGE), MR_POISON, MR_POISON,
M1_NOLIMBS | M1_SLITHY | M1_THICK_HIDE | M1_OVIPAROUS | M1_POIS
| M1_NOTAKE | M1_OMNIVORE,
- M2_STRONG, 0, 16, CLR_GREEN, GUARDIAN_NAGA),
+ M2_STRONG, 0, 17, CLR_GREEN, GUARDIAN_NAGA),
/*
* Ogres
*/
-/* NetHack 3.7 uhitm.c $NHDT-Date: 1664966387 2022/10/05 10:39:47 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.365 $ */
+/* NetHack 3.7 uhitm.c $NHDT-Date: 1665130027 2022/10/07 08:07:07 $ $NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.366 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/*-Copyright (c) Robert Patrick Rankin, 2012. */
/* NetHack may be freely redistributed. See license for details. */
if (obj && (obj->greased || obj->otyp == OILSKIN_CLOAK)
&& (!obj->cursed || rn2(3))) {
You("%s %s %s %s!",
- mattk->adtyp == AD_WRAP ? "slip off of"
- : "grab, but cannot hold onto",
+ (mattk->adtyp == AD_WRAP) ? "slip off of"
+ : "grab, but cannot hold onto",
s_suffix(mon_nam(mdef)), obj->greased ? "greased" : "slippery",
/* avoid "slippery slippery cloak"
for undiscovered oilskin cloak */
}
void
-mhitm_ad_wrap(struct monst *magr, struct attack *mattk, struct monst *mdef,
- struct mhitm_data *mhm)
+mhitm_ad_wrap(
+ struct monst *magr, struct attack *mattk,
+ struct monst *mdef, struct mhitm_data *mhm)
{
- struct permonst *pd = mdef->data;
+ struct permonst *pd = mdef->data, *pa = magr->data;
+ boolean coil = slithy(pa) && (pa->mlet == S_SNAKE || pa->mlet == S_NAGA);
if (magr == &g.youmonst) {
/* uhitm */
if (m_slips_free(mdef, mattk)) {
mhm->damage = 0;
} else {
- You("swing yourself around %s!", mon_nam(mdef));
+ You("%s yourself around %s!",
+ coil ? "coil" : "swing", mon_nam(mdef));
set_ustuck(mdef);
}
} else if (u.ustuck == mdef) {
pline("%s is being crushed.", Monnam(mdef));
} else {
mhm->damage = 0;
- if (Verbose(4, mhitm_ad_wrap1))
- You("brush against %s %s.", s_suffix(mon_nam(mdef)),
- mbodypart(mdef, LEG));
+ if (Verbose(4, mhitm_ad_wrap1)) {
+ if (coil)
+ You("brush against %s.", mon_nam(mdef));
+ else
+ You("brush against %s %s.", s_suffix(mon_nam(mdef)),
+ mbodypart(mdef, LEG));
+ }
}
} else
mhm->damage = 0;
mhm->damage = 0;
} else {
set_ustuck(magr); /* before message, for botl update */
- urgent_pline("%s swings itself around you!",
- Monnam(magr));
+ urgent_pline("%s %s itself around you!",
+ Some_Monnam(magr), coil ? "coils" : "swings");
}
} else if (u.ustuck == magr) {
if (is_pool(magr->mx, magr->my) && !Swimming && !Amphibious) {
}
} else {
mhm->damage = 0;
- if (Verbose(4, mhitm_ad_wrap2))
- pline("%s brushes against your %s.", Monnam(magr),
- body_part(LEG));
+ if (Verbose(4, mhitm_ad_wrap2)) {
+ if (coil)
+ pline("%s brushes against you.", Monnam(magr));
+ else
+ pline("%s brushes against your %s.", Monnam(magr),
+ body_part(LEG));
+ }
}
} else
mhm->damage = 0;
}
void
-mhitm_ad_plys(struct monst *magr, struct attack *mattk, struct monst *mdef,
- struct mhitm_data *mhm)
+mhitm_ad_plys(
+ struct monst *magr, struct attack *mattk,
+ struct monst *mdef, struct mhitm_data *mhm)
{
boolean negated = mhitm_mgc_atk_negated(magr, mdef);
}
void
-mhitm_adtyping(struct monst *magr, struct attack *mattk, struct monst *mdef,
- struct mhitm_data *mhm)
+mhitm_adtyping(
+ struct monst *magr, struct attack *mattk,
+ struct monst *mdef, struct mhitm_data *mhm)
{
switch (mattk->adtyp) {
case AD_STUN: mhitm_ad_stun(magr, mattk, mdef, mhm); break;