Files
nethack/src/were.c
kmhugo e1f5ddd820 sound cleanup
+ Separate the two uses of flags.soundok.
+ Player-settable option is now called "acoustics".
+ Deafness is now handled as a full-fledged attribute.
+ Check for deafness in You_hear(), rather than caller.
+ Check for deafness in caller, rather than verbalize(),
  because gods can speak to characters in spite of deafness.
+ Since changes are being made to prop.h, reorder it to the
  same order as youprop.h and enlightenment.

There are still some extraneous checks and missing checks
for deafness, which will be followed up in a future patch.

Because of the size of this patch and its savefile incompatibilities,
it is only being applied to the trunk code.  Portions of this patch
were written by Michael Allison.
2003-09-28 03:42:50 +00:00

150 lines
3.6 KiB
C

/* SCCS Id: @(#)were.c 3.4 2002/11/07 */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
#include "hack.h"
void
were_change(mon)
register struct monst *mon;
{
if (!is_were(mon->data))
return;
if (is_human(mon->data)) {
if (!Protection_from_shape_changers &&
!rn2(night() ? (flags.moonphase == FULL_MOON ? 3 : 30)
: (flags.moonphase == FULL_MOON ? 10 : 50))) {
new_were(mon); /* change into animal form */
if (!Deaf && !canseemon(mon)) {
const char *howler;
switch (monsndx(mon->data)) {
case PM_WEREWOLF: howler = "wolf"; break;
case PM_WEREJACKAL: howler = "jackal"; break;
default: howler = (char *)0; break;
}
if (howler)
You_hear("a %s howling at the moon.", howler);
}
}
} else if (!rn2(30) || Protection_from_shape_changers) {
new_were(mon); /* change back into human form */
}
}
STATIC_DCL int FDECL(counter_were,(int));
STATIC_OVL int
counter_were(pm)
int pm;
{
switch(pm) {
case PM_WEREWOLF: return(PM_HUMAN_WEREWOLF);
case PM_HUMAN_WEREWOLF: return(PM_WEREWOLF);
case PM_WEREJACKAL: return(PM_HUMAN_WEREJACKAL);
case PM_HUMAN_WEREJACKAL: return(PM_WEREJACKAL);
case PM_WERERAT: return(PM_HUMAN_WERERAT);
case PM_HUMAN_WERERAT: return(PM_WERERAT);
default: return(0);
}
}
void
new_were(mon)
register struct monst *mon;
{
register int pm;
pm = counter_were(monsndx(mon->data));
if(!pm) {
impossible("unknown lycanthrope %s.", mon->data->mname);
return;
}
if(canseemon(mon) && !Hallucination)
pline("%s changes into a %s.", Monnam(mon),
is_human(&mons[pm]) ? "human" :
mons[pm].mname+4);
set_mon_data(mon, &mons[pm], 0);
if (mon->msleeping || !mon->mcanmove) {
/* transformation wakens and/or revitalizes */
mon->msleeping = 0;
mon->mfrozen = 0; /* not asleep or paralyzed */
mon->mcanmove = 1;
}
/* regenerate by 1/4 of the lost hit points */
mon->mhp += (mon->mhpmax - mon->mhp) / 4;
newsym(mon->mx,mon->my);
mon_break_armor(mon, FALSE);
possibly_unwield(mon, FALSE);
}
boolean
were_summon(ptr,yours) /* were-creature (even you) summons a horde */
register struct permonst *ptr;
register boolean yours;
{
register int i, typ, pm = monsndx(ptr);
register struct monst *mtmp;
boolean success = FALSE;
if(Protection_from_shape_changers && !yours)
return FALSE;
for(i = rnd(5); i > 0; i--) {
switch(pm) {
case PM_WERERAT:
case PM_HUMAN_WERERAT:
typ = rn2(3) ? PM_SEWER_RAT : rn2(3) ? PM_GIANT_RAT : PM_RABID_RAT ;
break;
case PM_WEREJACKAL:
case PM_HUMAN_WEREJACKAL:
typ = PM_JACKAL;
break;
case PM_WEREWOLF:
case PM_HUMAN_WEREWOLF:
typ = rn2(5) ? PM_WOLF : PM_WINTER_WOLF ;
break;
default:
continue;
}
mtmp = makemon(&mons[typ], u.ux, u.uy, NO_MM_FLAGS);
if (mtmp) success = TRUE;
if (yours && mtmp)
(void) tamedog(mtmp, (struct obj *) 0);
}
return success;
}
void
you_were()
{
char qbuf[QBUFSZ];
if (Unchanging || (u.umonnum == u.ulycn)) return;
if (Polymorph_control) {
/* `+4' => skip "were" prefix to get name of beast */
Sprintf(qbuf, "Do you want to change into %s? ",
an(mons[u.ulycn].mname+4));
if(yn(qbuf) == 'n') return;
}
(void) polymon(u.ulycn);
}
void
you_unwere(purify)
boolean purify;
{
if (purify) {
You_feel("purified.");
u.ulycn = NON_PM; /* cure lycanthropy */
}
if (!Unchanging && is_were(youmonst.data) &&
(!Polymorph_control || yn("Remain in beast form?") == 'n'))
rehumanize();
}
/*were.c*/