]> git.cameronkatri.com Git - bsdgames-darwin.git/blobdiff - hack/hack.worm.c
tetris: Use arc4random_uniform instead of modulo for better randomness
[bsdgames-darwin.git] / hack / hack.worm.c
index 1849e387f4c476ce11b0127a0aaab4878424ab84..54feb6220d234ba8e232dc80f507167053b3a77c 100644 (file)
+/*     $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;
@@ -63,87 +138,103 @@ register tmp = mtmp->wormno;
        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 {
@@ -152,12 +243,13 @@ register uchar weptyp;            /* uwep->otyp or 0 */
                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);
@@ -169,20 +261,24 @@ register uchar weptyp;            /* uwep->otyp or 0 */
                        } 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 */