This is were.c in view mode; [Download] [Up]
/* SCCS Id: @(#)were.c 3.0 88/07/06
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
#include "hack.h"
static int FDECL(counter_were,(int));
#ifdef OVL0
void
were_change(mon)
register struct monst *mon;
{
register int pm = monsndx(mon->data);
if(is_were(mon->data))
if(is_human(mon->data)) {
if(Protection_from_shape_changers) return;
if(!rn2(50-(night()*20)) || flags.moonphase == FULL_MOON) {
new_were(mon);
if(mons[pm].msound == MS_BARK && flags.soundok)
You("hear a %s howling at the moon.",
pm == PM_WEREJACKAL ? "jackal" : "wolf");
}
} else if(!rn2(30) || Protection_from_shape_changers) new_were(mon);
}
#endif /* OVL0 */
#ifdef OVLB
static int
counter_were(pm)
int pm;
{
switch(pm) {
case PM_WEREWOLF: return(PM_WOLFWERE);
case PM_WOLFWERE: return(PM_WEREWOLF);
case PM_WEREJACKAL: return(PM_JACKALWERE);
case PM_JACKALWERE: return(PM_WEREJACKAL);
case PM_WERERAT: return(PM_RATWERE);
case PM_RATWERE: 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))
pline("%s changes into a %s.", Monnam(mon),
Hallucination ? rndmonnam() : mons[pm].mname);
mon->data = &mons[pm];
/* regenerate by 1/4 of the lost hit points */
mon->mhp += (mon->mhpmax - mon->mhp) / 4;
unpmon(mon);
pmon(mon); /* display new appearance */
}
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_RATWERE:
typ = rn2(3) ? PM_SEWER_RAT : rn2(3) ? PM_GIANT_RAT : PM_RABID_RAT ;
break;
case PM_WEREJACKAL:
case PM_JACKALWERE:
typ = PM_JACKAL;
break;
case PM_WEREWOLF:
case PM_WOLFWERE:
typ = rn2(5) ? PM_WOLF : PM_WINTER_WOLF ;
break;
default:
continue;
}
mtmp = makemon(&mons[typ], u.ux, u.uy);
if (mtmp) success = TRUE;
if (yours && mtmp)
(void) tamedog(mtmp, (struct obj *) 0);
}
return success;
}
#ifdef POLYSELF
void
you_were() {
if(u.umonnum == u.ulycn) return;
if(Polymorph_control) {
pline("Do you want to change into a %s? ", mons[u.ulycn].mname);
if(yn() == 'n') return;
}
(void) polymon(u.ulycn);
}
#endif
#endif /* OVLB */
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.