-/* NetHack 3.6 makemon.c $NHDT-Date: 1432685497 2015/05/27 00:11:37 $ $NHDT-Branch: master $:$NHDT-Revision: 1.89 $ */
+/* NetHack 3.6 makemon.c $NHDT-Date: 1433457069 2015/06/04 22:31:09 $ $NHDT-Branch: master $:$NHDT-Revision: 1.92 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
mtmp->cham = NON_PM; /* default is "not a shapechanger" */
if ((mcham = pm_to_cham(mndx)) != NON_PM) {
/* this is a shapechanger after all */
- if (Protection_from_shape_changers) {
+ if (Protection_from_shape_changers
+ || mtmp->cham == PM_VLAD_THE_IMPALER) {
; /* stuck in its natural form (NON_PM) */
} else {
/* Note: shapechanger's initial form used to be
- chosen with rndmonst(), yielding a monster
+ chosen here with rndmonst(), yielding a monster
which was approriate to the level's difficulty
but ignored the changer's usual type selection
- so would be inppropriate for vampshifters. */
- mtmp->cham = mcham; /* remember base form */
- if (mcham != PM_VLAD_THE_IMPALER &&
- /* select initial shape */
- (mcham = select_newcham_form(mtmp)) != NON_PM) {
- /* take on initial shape; if successful,
- avoid giving that shape's usual inventory */
- if (newcham(mtmp, &mons[mcham], FALSE, FALSE))
- allow_minvent = FALSE;
- }
+ so would be inppropriate for vampshifters.
+ Let newcham() pick the shape. */
+ if (newcham(mtmp, (struct permonst *) 0, FALSE, FALSE))
+ allow_minvent = FALSE;
}
} else if (mndx == PM_WIZARD_OF_YENDOR) {
mtmp->iswiz = TRUE;
-/* NetHack 3.6 mon.c $NHDT-Date: 1432512774 2015/05/25 00:12:54 $ $NHDT-Branch: master $:$NHDT-Revision: 1.177 $ */
+/* NetHack 3.6 mon.c $NHDT-Date: 1433457072 2015/06/04 22:31:12 $ $NHDT-Branch: master $:$NHDT-Revision: 1.178 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
STATIC_OVL int
pick_animal()
{
+ int res;
+
if (!animal_list)
mon_animal_list(TRUE);
- return animal_list[rn2(animal_list_count)];
+ res = animal_list[rn2(animal_list_count)];
+ /* rogue level should use monsters represented by uppercase letters
+ only, but since chameleons aren't generated there (not uppercase!)
+ we don't perform a lot of retries */
+ if (Is_rogue_level(&u.uz) && !isupper((uchar) mons[res].mlet))
+ res = animal_list[rn2(animal_list_count)];
+ return res;
}
void
struct monst *mon;
{
int mndx = mon->cham;
+ /* avoid picking monsters with lowercase display symbols ('d' for wolf
+ and 'v' for fog cloud) on rogue level*/
+ boolean uppercase_only = Is_rogue_level(&u.uz);
switch (mndx) {
case PM_VLAD_THE_IMPALER:
break; /* leave mndx as is */
/*FALLTHRU*/
case PM_VAMPIRE_LORD: /* vampire lord or Vlad can become wolf */
- if (!rn2(10)) {
+ if (!rn2(10) && !uppercase_only) {
mndx = PM_WOLF;
break;
}
/*FALLTHRU*/
case PM_VAMPIRE: /* any vampire can become fog or bat */
- mndx = !rn2(4) ? PM_FOG_CLOUD : PM_VAMPIRE_BAT;
+ mndx = (!rn2(4) && !uppercase_only) ? PM_FOG_CLOUD : PM_VAMPIRE_BAT;
break;
}
return mndx;
*mndx_p = PM_VLAD_THE_IMPALER;
return TRUE;
}
- /* basic vampires can't become wolves; any can become fog or bat */
+ /* basic vampires can't become wolves; any can become fog or bat
+ (we don't enforce upper-case only for rogue level here) */
if (*mndx_p == PM_WOLF)
return (mon->cham != PM_VAMPIRE);
if (*mndx_p == PM_FOG_CLOUD || *mndx_p == PM_VAMPIRE_BAT)
tryct = 50;
do {
mndx = rn1(SPECIAL_PM - LOW_PM, LOW_PM);
- } while (--tryct > 0 && !validspecmon(mon, mndx));
+ } while (--tryct > 0 && !validspecmon(mon, mndx)
+ /* try harder to select uppercase monster on rogue level */
+ && (tryct > 40 && Is_rogue_level(&u.uz)
+ && !isupper((uchar) mons[mndx].mlet)));
}
return mndx;
}
do {
mndx = select_newcham_form(mtmp);
mdat = accept_newcham_form(mndx);
+ /* for the first several tries we require upper-case on
+ the rogue level (after that, we take whatever we get) */
+ if (tryct > 15 && Is_rogue_level(&u.uz)
+ && !isupper((uchar) mdat->mlet))
+ mdat = 0;
if (mdat)
break;
} while (--tryct > 0);
-/* NetHack 3.6 wizard.c $NHDT-Date: 1432512766 2015/05/25 00:12:46 $ $NHDT-Branch: master $:$NHDT-Revision: 1.37 $ */
+/* NetHack 3.6 wizard.c $NHDT-Date: 1433457074 2015/06/04 22:31:14 $ $NHDT-Branch: master $:$NHDT-Revision: 1.38 $ */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
int
pick_nasty()
{
+ int res = nasties[rn2(SIZE(nasties))];
+
/* To do? Possibly should filter for appropriate forms when
- in the elemental planes or surrounded by water or lava. */
- return nasties[rn2(SIZE(nasties))];
+ * in the elemental planes or surrounded by water or lava.
+ *
+ * We want monsters represented by uppercase on rogue level,
+ * but we don't try very hard.
+ */
+ if (Is_rogue_level(&u.uz)
+ && !('A' <= mons[res].mlet && mons[res].mlet <= 'Z'))
+ res = nasties[rn2(SIZE(nasties))];
+
+ return res;
}
/* create some nasty monsters, aligned or neutral with the caster */