+/* $NetBSD: hack.worm.c,v 1.9 2011/08/06 20:29:37 dholland Exp $ */
+
+/*
+ * Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
+ * Amsterdam
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of the Stichting Centrum voor Wiskunde en
+ * Informatica, nor the names of its contributors may be used to endorse or
+ * promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+ * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
/*
- * Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985.
+ * Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+ * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+#include <sys/cdefs.h>
#ifndef lint
-static char rcsid[] = "$NetBSD: hack.worm.c,v 1.3 1995/03/23 08:32:12 cgd Exp $";
-#endif /* not lint */
+__RCSID("$NetBSD: hack.worm.c,v 1.9 2011/08/06 20:29:37 dholland Exp $");
+#endif /* not lint */
+#include <stdlib.h>
#include "hack.h"
+#include "extern.h"
#ifndef NOWORM
#include "def.wseg.h"
-struct wseg *wsegs[32]; /* linked list, tail first */
-struct wseg *wheads[32];
-long wgrowtime[32];
+struct wseg *wsegs[32]; /* linked list, tail first */
+struct wseg *wheads[32];
+long wgrowtime[32];
-getwn(mtmp) struct monst *mtmp; {
-register tmp;
- for(tmp=1; tmp<32; tmp++) if(!wsegs[tmp]) {
- mtmp->wormno = tmp;
- return(1);
- }
- return(0); /* level infested with worms */
+static void remseg(struct wseg *);
+
+int
+getwn(struct monst *mtmp)
+{
+ int tmp;
+ for (tmp = 1; tmp < 32; tmp++)
+ if (!wsegs[tmp]) {
+ mtmp->wormno = tmp;
+ return (1);
+ }
+ return (0); /* level infested with worms */
}
/* called to initialize a worm unless cut in half */
-initworm(mtmp) struct monst *mtmp; {
-register struct wseg *wtmp;
-register tmp = mtmp->wormno;
- if(!tmp) return;
+void
+initworm(struct monst *mtmp)
+{
+ struct wseg *wtmp;
+ int tmp = mtmp->wormno;
+ if (!tmp)
+ return;
wheads[tmp] = wsegs[tmp] = wtmp = newseg();
wgrowtime[tmp] = 0;
wtmp->wx = mtmp->mx;
wtmp->wy = mtmp->my;
-/* wtmp->wdispl = 0; */
+ /* wtmp->wdispl = 0; */
wtmp->nseg = 0;
}
-worm_move(mtmp) struct monst *mtmp; {
-register struct wseg *wtmp, *whd;
-register tmp = mtmp->wormno;
+void
+worm_move(struct monst *mtmp)
+{
+ struct wseg *wtmp, *whd = NULL;
+ int tmp = mtmp->wormno;
wtmp = newseg();
wtmp->wx = mtmp->mx;
wtmp->wy = mtmp->my;
wtmp->nseg = 0;
-/* wtmp->wdispl = 0; */
+ /* wtmp->wdispl = 0; */
(whd = wheads[tmp])->nseg = wtmp;
wheads[tmp] = wtmp;
- if(cansee(whd->wx,whd->wy)){
+ if (cansee(whd->wx, whd->wy)) {
unpmon(mtmp);
atl(whd->wx, whd->wy, '~');
whd->wdispl = 1;
- } else whd->wdispl = 0;
- if(wgrowtime[tmp] <= moves) {
- if(!wgrowtime[tmp]) wgrowtime[tmp] = moves + rnd(5);
- else wgrowtime[tmp] += 2+rnd(15);
+ } else
+ whd->wdispl = 0;
+ if (wgrowtime[tmp] <= moves) {
+ if (!wgrowtime[tmp])
+ wgrowtime[tmp] = moves + rnd(5);
+ else
+ wgrowtime[tmp] += 2 + rnd(15);
mtmp->mhpmax += 3;
mtmp->mhp += 3;
return;
remseg(whd);
}
-worm_nomove(mtmp) register struct monst *mtmp; {
-register tmp;
-register struct wseg *wtmp;
+void
+worm_nomove(struct monst *mtmp)
+{
+ int tmp;
+ struct wseg *wtmp;
tmp = mtmp->wormno;
wtmp = wsegs[tmp];
- if(wtmp == wheads[tmp]) return;
- if(wtmp == 0 || wtmp->nseg == 0) panic("worm_nomove?");
+ if (wtmp == wheads[tmp])
+ return;
+ if (wtmp == 0 || wtmp->nseg == 0)
+ panic("worm_nomove?");
wsegs[tmp] = wtmp->nseg;
remseg(wtmp);
- mtmp->mhp -= 3; /* mhpmax not changed ! */
+ mtmp->mhp -= 3; /* mhpmax not changed ! */
}
-wormdead(mtmp) register struct monst *mtmp; {
-register tmp = mtmp->wormno;
-register struct wseg *wtmp, *wtmp2;
- if(!tmp) return;
+void
+wormdead(struct monst *mtmp)
+{
+ int tmp = mtmp->wormno;
+ struct wseg *wtmp, *wtmp2;
+ if (!tmp)
+ return;
mtmp->wormno = 0;
- for(wtmp = wsegs[tmp]; wtmp; wtmp = wtmp2){
+ for (wtmp = wsegs[tmp]; wtmp; wtmp = wtmp2) {
wtmp2 = wtmp->nseg;
remseg(wtmp);
}
wsegs[tmp] = 0;
}
-wormhit(mtmp) register struct monst *mtmp; {
-register tmp = mtmp->wormno;
-register struct wseg *wtmp;
- if(!tmp) return; /* worm without tail */
- for(wtmp = wsegs[tmp]; wtmp; wtmp = wtmp->nseg)
- (void) hitu(mtmp,1);
+void
+wormhit(struct monst *mtmp)
+{
+ int tmp = mtmp->wormno;
+ struct wseg *wtmp;
+ if (!tmp)
+ return; /* worm without tail */
+ for (wtmp = wsegs[tmp]; wtmp; wtmp = wtmp->nseg)
+ (void) hitu(mtmp, 1);
}
-wormsee(tmp) register unsigned tmp; {
-register struct wseg *wtmp = wsegs[tmp];
- if(!wtmp) panic("wormsee: wtmp==0");
- for(; wtmp->nseg; wtmp = wtmp->nseg)
- if(!cansee(wtmp->wx,wtmp->wy) && wtmp->wdispl){
+void
+wormsee(unsigned tmp)
+{
+ struct wseg *wtmp = wsegs[tmp];
+ if (!wtmp)
+ panic("wormsee: wtmp==0");
+ for (; wtmp->nseg; wtmp = wtmp->nseg)
+ if (!cansee(wtmp->wx, wtmp->wy) && wtmp->wdispl) {
newsym(wtmp->wx, wtmp->wy);
wtmp->wdispl = 0;
}
}
-pwseg(wtmp) register struct wseg *wtmp; {
- if(!wtmp->wdispl){
+void
+pwseg(struct wseg *wtmp)
+{
+ if (!wtmp->wdispl) {
atl(wtmp->wx, wtmp->wy, '~');
wtmp->wdispl = 1;
}
}
-cutworm(mtmp,x,y,weptyp)
-register struct monst *mtmp;
-register xchar x,y;
-register uchar weptyp; /* uwep->otyp or 0 */
+/* weptyp is uwep->otyp or 0 */
+void
+cutworm(struct monst *mtmp, xchar x, xchar y, uchar weptyp)
{
- register struct wseg *wtmp, *wtmp2;
- register struct monst *mtmp2;
- register tmp,tmp2;
- if(mtmp->mx == x && mtmp->my == y) return; /* hit headon */
+ struct wseg *wtmp, *wtmp2;
+ struct monst *mtmp2;
+ int tmp, tmp2;
+ if (mtmp->mx == x && mtmp->my == y)
+ return; /* hit headon */
/* cutting goes best with axe or sword */
tmp = rnd(20);
- if(weptyp == LONG_SWORD || weptyp == TWO_HANDED_SWORD ||
- weptyp == AXE) tmp += 5;
- if(tmp < 12) return;
+ if (weptyp == LONG_SWORD || weptyp == TWO_HANDED_SWORD ||
+ weptyp == AXE)
+ tmp += 5;
+ if (tmp < 12)
+ return;
/* if tail then worm just loses a tail segment */
tmp = mtmp->wormno;
wtmp = wsegs[tmp];
- if(wtmp->wx == x && wtmp->wy == y){
+ if (wtmp->wx == x && wtmp->wy == y) {
wsegs[tmp] = wtmp->nseg;
remseg(wtmp);
return;
}
-
/* cut the worm in two halves */
mtmp2 = newmonst(0);
*mtmp2 = *mtmp;
mtmp2->mxlth = mtmp2->mnamelth = 0;
/* sometimes the tail end dies */
- if(rn2(3) || !getwn(mtmp2)){
+ if (rn2(3) || !getwn(mtmp2)) {
monfree(mtmp2);
tmp2 = 0;
} else {
wgrowtime[tmp2] = 0;
}
do {
- if(wtmp->nseg->wx == x && wtmp->nseg->wy == y){
- if(tmp2) wheads[tmp2] = wtmp;
+ if (wtmp->nseg->wx == x && wtmp->nseg->wy == y) {
+ if (tmp2)
+ wheads[tmp2] = wtmp;
wsegs[tmp] = wtmp->nseg->nseg;
remseg(wtmp->nseg);
wtmp->nseg = 0;
- if(tmp2){
+ if (tmp2) {
pline("You cut the worm in half.");
mtmp2->mhpmax = mtmp2->mhp =
d(mtmp2->data->mlevel, 8);
} else {
pline("You cut off part of the worm's tail.");
remseg(wtmp);
+ monfree(mtmp2);
}
mtmp->mhp /= 2;
return;
}
wtmp2 = wtmp->nseg;
- if(!tmp2) remseg(wtmp);
+ if (!tmp2)
+ remseg(wtmp);
wtmp = wtmp2;
- } while(wtmp->nseg);
+ } while (wtmp->nseg);
panic("Cannot find worm segment");
}
-remseg(wtmp) register struct wseg *wtmp; {
- if(wtmp->wdispl)
+static void
+remseg(struct wseg *wtmp)
+{
+ if (wtmp->wdispl)
newsym(wtmp->wx, wtmp->wy);
- free((char *) wtmp);
+ free(wtmp);
}
-#endif NOWORM
+#endif /* NOWORM */