ftp.nice.ch/pub/next/games/strategic/NetHack.s.tar.gz#/NetHackSource/src/were.c

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.