]> git.cameronkatri.com Git - bsdgames-darwin.git/blobdiff - larn/monster.c
Fix merge conflicts
[bsdgames-darwin.git] / larn / monster.c
index 45a64bc49dfee1a186d6bae30474f2dd1d0460cc..1b325170c5e0e39913e3dcfe2a56f9f9a3e3c192 100644 (file)
-#ifndef lint
-static char rcsid[] = "$Id: monster.c,v 1.2 1993/08/02 17:20:10 mycroft Exp $";
-#endif /* not lint */
+/*     $NetBSD: monster.c,v 1.20 2021/05/02 12:50:45 rillig Exp $      */
 
 /*
- *     monster.c               Larn is copyrighted 1986 by Noah Morgan. 
+ * monster.c   Larn is copyrighted 1986 by Noah Morgan.
  *
- *     This file contains the following functions:
- *     ----------------------------------------------------------------------------
+ * This file contains the following functions:
+ * ----------------------------------------------------------------------------
  *
- *     createmonster(monstno)          Function to create a monster next to the player
- *             int monstno;
+ * createmonster(monstno)      Function to create a monster next to the player
+ * int monstno;
  *
- *     int cgood(x,y,itm,monst)        Function to check location for emptiness
- *             int x,y,itm,monst;
+ * int cgood(x,y,itm,monst)Function to check location for emptiness
+ * int x,y,itm,monst;
  *
- *     createitem(it,arg)                      Routine to place an item next to the player
- *             int it,arg;
+ * createitem(it,arg)          Routine to place an item next to the player
+ * int it,arg;
  *
- *     cast()                          Subroutine called by parse to cast a spell for the user
+ * cast()                      Subroutine called by parse to cast a spell for the user
  *
- *     speldamage(x)           Function to perform spell functions cast by the player
- *             int x;
+ * speldamage(x)       Function to perform spell functions cast by the player
+ * int x;
  *
- *     loseint()                       Routine to decrement your int (intelligence) if > 3
+ * loseint()           Routine to decrement your int (intelligence) if > 3
  *
- *     isconfuse()             Routine to check to see if player is confused
+ * isconfuse()         Routine to check to see if player is confused
  *
- *     nospell(x,monst)        Routine to return 1 if a spell doesn't affect a monster
- *             int x,monst;
+ * nospell(x,monst)Routine to return 1 if a spell doesn't affect a monster
+ * int x,monst;
  *
- *     fullhit(xx)                     Function to return full damage against a monst (aka web)
- *             int xx;
+ * fullhit(xx)         Function to return full damage against a monst (aka web)
+ * int xx;
  *
- *     direct(spnum,dam,str,arg)       Routine to direct spell damage 1 square in 1 dir
- *             int spnum,dam,arg;
- *             char *str;
+ * direct(spnum,dam,str,arg)Routine to direct spell damage 1 square in 1 dir
+ * int spnum,dam,arg;
+ * char *str;
  *
- *     godirect(spnum,dam,str,delay,cshow)             Function to perform missile attacks
- *             int spnum,dam,delay;
- *             char *str,cshow;
+ * godirect(spnum,dam,str,delay,cshow) Function to perform missile attacks
+ * int spnum,dam,delay;
+ * char *str,cshow;
  *
- *     ifblind(x,y)    Routine to put "monster" or the monster name into lastmosnt
- *             int x,y;
+ * ifblind(x,y)Routine to put "monster" or the monster name into lastmosnt
+ * int x,y;
  *
- *     tdirect(spnum)                  Routine to teleport away a monster
- *             int spnum;
+ * tdirect(spnum)              Routine to teleport away a monster
+ * int spnum;
  *
- *     omnidirect(sp,dam,str)  Routine to damage all monsters 1 square from player
- *             int sp,dam;
- *             char *str;
+ * omnidirect(sp,dam,str)  Routine to damage all monsters 1 square from player
+ * int sp,dam;
+ * char *str;
  *
- *     dirsub(x,y)                     Routine to ask for direction, then modify x,y for it
- *             int *x,*y;
+ * dirsub(x,y)         Routine to ask for direction, then modify x,y for it
+ * int *x,*y;
  *
- *     vxy(x,y)                        Routine to verify/fix (*x,*y) for being within bounds
- *             int *x,*y;
+ * vxy(x,y)            Routine to verify/fix (*x,*y) for being within bounds
+ * int *x,*y;
  *
- *     dirpoly(spnum)          Routine to ask for a direction and polymorph a monst
- *             int spnum;
+ * dirpoly(spnum)      Routine to ask for a direction and polymorph a monst
+ * int spnum;
  *
- *     hitmonster(x,y)         Function to hit a monster at the designated coordinates
- *             int x,y;
+ * hitmonster(x,y) Function to hit a monster at the designated coordinates
+ * int x,y;
  *
- *     hitm(x,y,amt)           Function to just hit a monster at a given coordinates
- *             int x,y,amt;
+ * hitm(x,y,amt)       Function to just hit a monster at a given coordinates
+ * int x,y,amt;
  *
- *     hitplayer(x,y)          Function for the monster to hit the player from (x,y)
- *             int x,y;
+ * hitplayer(x,y)      Function for the monster to hit the player from (x,y)
+ * int x,y;
  *
- *     dropsomething(monst)    Function to create an object when a monster dies
- *             int monst;
+ * dropsomething(monst) Function to create an object when a monster dies
+ * int monst;
  *
- *     dropgold(amount)                Function to drop some gold around player
- *             int amount;
+ * dropgold(amount)    Function to drop some gold around player
+ * int amount;
  *
- *     something(level)                Function to create a random item around player
- *             int level;
+ * something(level)    Function to create a random item around player
+ * int level;
  *
- *     newobject(lev,i)                Routine to return a randomly selected new object
- *             int lev,*i;
+ * newobject(lev,i)    Routine to return a randomly selected new object
+ * int lev,*i;
  *
- *  spattack(atckno,xx,yy)     Function to process special attacks from monsters
- *     int atckno,xx,yy;
+ *  spattack(atckno,xx,yy)  Function to process special attacks from monsters
+ *   int atckno,xx,yy;
  *
- *     checkloss(x)    Routine to subtract hp from user and flag bottomline display
- *             int x;
+ * checkloss(x) Routine to subtract hp from user and flag bottomline display
+ * int x;
  *
- *     annihilate()   Routine to annihilate monsters around player, playerx,playery
+ * annihilate()   Routine to annihilate monsters around player, playerx,playery
  *
- *     newsphere(x,y,dir,lifetime)  Function to create a new sphere of annihilation
- *             int x,y,dir,lifetime;
+ * newsphere(x,y,dir,lifetime)  Function to create a new sphere of annihilation
+ * int x,y,dir,lifetime;
  *
- *     rmsphere(x,y)           Function to delete a sphere of annihilation from list
- *             int x,y;
+ * rmsphere(x,y)       Function to delete a sphere of annihilation from list
+ * int x,y;
  *
- *     sphboom(x,y)            Function to perform the effects of a sphere detonation
- *             int x,y;
+ * sphboom(x,y)        Function to perform the effects of a sphere detonation
+ * int x,y;
  *
- *     genmonst()                      Function to ask for monster and genocide from game
+ * genmonst()          Function to ask for monster and genocide from game
  *
  */
-#include "header.h"
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: monster.c,v 1.20 2021/05/02 12:50:45 rillig Exp $");
+#endif                         /* not lint */
 
-struct isave   /* used for altar reality */
-       {
-       char type;      /* 0=item,  1=monster */
-       char id;        /* item number or monster number */
-       short arg;      /* the type of item or hitpoints of monster */
-       };
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include "header.h"
+#include "extern.h"
+
+struct isave {                 /* used for altar reality */
+       char            type;   /* 0=item,  1=monster */
+       char            id;     /* item number or monster number */
+       short           arg;    /* the type of item or hitpoints of monster */
+};
+
+static int cgood(int, int, int, int);
+static void speldamage(int);
+static void loseint(void);
+static int isconfuse(void);
+static int nospell(int, int);
+static int fullhit(int);
+static void direct(int, int, const char *, int);
+static void ifblind(int, int);
+static void tdirect(int);
+static void omnidirect(int, int, const char *);
+static int dirsub(int *, int *);
+static void dirpoly(int);
+static int hitm(int, int, int);
+static void dropsomething(int);
+static int spattack(int, int, int);
+static void sphboom(int, int);
+static void genmonst(void);
 
 /*
- *     createmonster(monstno)          Function to create a monster next to the player
- *             int monstno;
+ * createmonster(monstno)      Function to create a monster next to the player
+ *     int monstno;
  *
- *     Enter with the monster number (1 to MAXMONST+8)
- *     Returns no value.
+ * Enter with the monster number (1 to MAXMONST+8)
+ * Returns no value.
  */
-createmonster(mon)
-       int mon;
-       {
-       register int x,y,k,i;
-       if (mon<1 || mon>MAXMONST+8)    /* check for monster number out of bounds */
-               {
-               beep(); lprintf("\ncan't createmonst(%d)\n",(long)mon); nap(3000); return;
-               }
-       while (monster[mon].genocided && mon<MAXMONST) mon++; /* genocided? */
-       for (k=rnd(8), i= -8; i<0; i++,k++)     /* choose direction, then try all */
-               {
-               if (k>8) k=1;   /* wraparound the diroff arrays */
-               x = playerx + diroffx[k];               y = playery + diroffy[k];
-               if (cgood(x,y,0,1))     /* if we can create here */
-                       {
+void
+createmonster(int mon)
+{
+       int    x, y, k, i;
+       if (mon < 1 || mon > MAXMONST + 8) {    /* check for monster number
+                                                * out of bounds */
+               beep();
+               lprintf("\ncan't createmonst(%ld)\n", (long) mon);
+               nap(3000);
+               return;
+       }
+       while (monster[mon].genocided && mon < MAXMONST)
+               mon++;          /* genocided? */
+       for (k = rnd(8), i = -8; i < 0; i++, k++) {     /* choose direction,
+                                                        * then try all */
+               if (k > 8)
+                       k = 1;  /* wraparound the diroff arrays */
+               x = playerx + diroffx[k];
+               y = playery + diroffy[k];
+               if (cgood(x, y, 0, 1)) {        /* if we can create here */
                        mitem[x][y] = mon;
                        hitp[x][y] = monster[mon].hitpoints;
-                       stealth[x][y]=know[x][y]=0;
-                       switch(mon)
-                               {
-                               case ROTHE: case POLTERGEIST: case VAMPIRE: stealth[x][y]=1;
-                               };
+                       stealth[x][y] = know[x][y] = 0;
+                       switch (mon) {
+                       case ROTHE:
+                       case POLTERGEIST:
+                       case VAMPIRE:
+                               stealth[x][y] = 1;
+                       };
                        return;
-                       }
                }
        }
+}
 
 /*
- *     int cgood(x,y,itm,monst)          Function to check location for emptiness
- *             int x,y,itm,monst;
- *
- *     Routine to return TRUE if a location does not have itm or monst there
- *     returns FALSE (0) otherwise
- *     Enter with itm or monst TRUE or FALSE if checking it
- *     Example:  if itm==TRUE check for no item at this location
- *                       if monst==TRUE check for no monster at this location
- *     This routine will return FALSE if at a wall or the dungeon exit on level 1
+ * int cgood(x,y,itm,monst)      Function to check location for emptiness
+ *     int x,y,itm,monst;
+ *
+ * Routine to return TRUE if a location does not have itm or monst there
+ * returns FALSE (0) otherwise
+ * Enter with itm or monst TRUE or FALSE if checking it
+ * Example:  if itm==TRUE check for no item at this location
+ *               if monst==TRUE check for no monster at this location
+ * This routine will return FALSE if at a wall or the dungeon exit on level 1
  */
-int cgood(x,y,itm,monst)
-       register int x,y;
-       int itm,monst;
-       {
-       if ((y>=0) && (y<=MAXY-1) && (x>=0) && (x<=MAXX-1)) /* within bounds? */
-         if (item[x][y]!=OWALL)        /* can't make anything on walls */
-               if (itm==0 || (item[x][y]==0))  /* is it free of items? */
-                 if (monst==0 || (mitem[x][y]==0))     /* is it free of monsters? */
-                   if ((level!=1) || (x!=33) || (y!=MAXY-1)) /* not exit to level 1 */
-                         return(1);
-       return(0);
-       }
+static int
+cgood(int x, int y, int theitem, int monst)
+{
+#define itm __lose
+       if ((y >= 0) && (y <= MAXY - 1) && (x >= 0) && (x <= MAXX - 1))
+               /* within bounds? */
+               if (item[x][y] != OWALL) /* can't make anything on walls */
+                       /* is it free of items? */
+                       if (theitem == 0 || (item[x][y] == 0))
+                               /* is it free of monsters? */
+                               if (monst == 0 || (mitem[x][y] == 0))
+                                       if ((level != 1) || (x != 33) ||
+                                           (y != MAXY - 1))
+                                               /* not exit to level 1 */
+                                               return (1);
+       return (0);
+}
 
 /*
- *     createitem(it,arg)              Routine to place an item next to the player
- *             int it,arg;
+ * createitem(it,arg)  Routine to place an item next to the player
+ *     int it,arg;
  *
- *     Enter with the item number and its argument (iven[], ivenarg[])
- *     Returns no value, thus we don't know about createitem() failures.
+ * Enter with the item number and its argument (iven[], ivenarg[])
+ * Returns no value, thus we don't know about createitem() failures.
  */
-createitem(it,arg)
-       int it,arg;
-       {
-       register int x,y,k,i;
-       if (it >= MAXOBJ) return;       /* no such object */
-       for (k=rnd(8), i= -8; i<0; i++,k++)     /* choose direction, then try all */
-               {
-               if (k>8) k=1;   /* wraparound the diroff arrays */
-               x = playerx + diroffx[k];               y = playery + diroffy[k];
-               if (cgood(x,y,1,0))     /* if we can create here */
-                       {
-                       item[x][y] = it;  know[x][y]=0;  iarg[x][y]=arg;  return;
-                       }
+void
+createitem(int it, int arg)
+{
+       int    x, y, k, i;
+       if (it >= MAXOBJ)
+               return;         /* no such object */
+       for (k = rnd(8), i = -8; i < 0; i++, k++) {     /* choose direction,
+                                                        * then try all */
+               if (k > 8)
+                       k = 1;  /* wraparound the diroff arrays */
+               x = playerx + diroffx[k];
+               y = playery + diroffy[k];
+               if (cgood(x, y, 1, 0)) {        /* if we can create here */
+                       item[x][y] = it;
+                       know[x][y] = 0;
+                       iarg[x][y] = arg;
+                       return;
                }
        }
+}
 
 /*
- *     cast()          Subroutine called by parse to cast a spell for the user
+ * cast()              Subroutine called by parse to cast a spell for the user
  *
- *     No arguments and no return value.
+ * No arguments and no return value.
  */
-static char eys[] = "\nEnter your spell: ";
-cast()
-       {
-       register int i,j,a,b,d;
+static char     eys[] = "\nEnter your spell: ";
+void
+cast(void)
+{
+       int    i, j, a, b, d;
        cursors();
-       if (c[SPELLS]<=0) {     lprcat("\nYou don't have any spells!"); return; }
-       lprcat(eys);            --c[SPELLS];
-       while ((a=getchar())=='D')
-               { seemagic(-1); cursors();  lprcat(eys); }
-       if (a=='\33') goto over; /*     to escape casting a spell       */
-       if ((b=getchar())=='\33') goto over; /* to escape casting a spell       */
-       if ((d=getchar())=='\33')
-               { over: lprcat(aborted); c[SPELLS]++; return; } /*      to escape casting a spell       */
+       if (c[SPELLS] <= 0) {
+               lprcat("\nYou don't have any spells!");
+               return;
+       }
+       lprcat(eys);
+       --c[SPELLS];
+       while ((a = ttgetch()) == 'D') {
+               seemagic(-1);
+               cursors();
+               lprcat(eys);
+       }
+       if (a == '\33')
+               goto over;      /* to escape casting a spell     */
+       if ((b = ttgetch()) == '\33')
+               goto over;      /* to escape casting a spell     */
+       if ((d = ttgetch()) == '\33') {
+over:          lprcat(aborted);
+               c[SPELLS]++;
+               return;
+       }                       /* to escape casting a spell     */
 #ifdef EXTRA
        c[SPELLSCAST]++;
 #endif
-       for (lprc('\n'),j= -1,i=0; i<SPNUM; i++) /*seq search for his spell, hash?*/
-               if ((spelcode[i][0]==a) && (spelcode[i][1]==b) && (spelcode[i][2]==d))
-                       if (spelknow[i])
-                               {  speldamage(i);  j = 1;  i=SPNUM; }
-
-       if (j == -1) lprcat("  Nothing Happened ");
+       for (lprc('\n'), j = -1, i = 0; i < SPNUM; i++) /* seq search for his
+                                                        * spell, hash? */
+               if ((spelcode[i][0] == a) && (spelcode[i][1] == b) && (spelcode[i][2] == d))
+                       if (spelknow[i]) {
+                               speldamage(i);
+                               j = 1;
+                               i = SPNUM;
+                       }
+       if (j == -1)
+               lprcat("  Nothing Happened ");
        bottomline();
-       }
-
-static int dirsub();
+}
 
 /*
- *     speldamage(x)           Function to perform spell functions cast by the player
- *             int x;
+ * speldamage(x)               Function to perform spell functions cast by the player
+ *     int x;
  *
- *     Enter with the spell number, returns no value.
- *     Please insure that there are 2 spaces before all messages here
+ * Enter with the spell number, returns no value.
+ * Please insure that there are 2 spaces before all messages here
  */
-speldamage(x)
-       int x;
-       {
-       register int i,j,clev;
-       int xl,xh,yl,yh;
-       register char *p,*kn,*pm;
-       if (x>=SPNUM) return;   /* no such spell */
-       if (c[TIMESTOP])  { lprcat("  It didn't seem to work"); return; }  /* not if time stopped */
+static void
+speldamage(int x)
+{
+       int    i, j, clev;
+       int             xl, xh, yl, yh;
+       u_char  *p, *kn, *pm;
+
+       if (x >= SPNUM)
+               return;         /* no such spell */
+       if (c[TIMESTOP]) {
+               lprcat("  It didn't seem to work");
+               return;
+       }                       /* not if time stopped */
        clev = c[LEVEL];
-       if ((rnd(23)==7) || (rnd(18) > c[INTELLIGENCE]))
-               { lprcat("  It didn't work!");  return; }
-       if (clev*3+2 < x) { lprcat("  Nothing happens.  You seem inexperienced at this"); return; }
+       if ((rnd(23) == 7) || (rnd(18) > c[INTELLIGENCE])) {
+               lprcat("  It didn't work!");
+               return;
+       }
+       if (clev * 3 + 2 < x) {
+               lprcat("  Nothing happens.  You seem inexperienced at this");
+               return;
+       }
+       switch (x) {
+               /* ----- LEVEL 1 SPELLS ----- */
 
-       switch(x)
-               {
-/* ----- LEVEL 1 SPELLS ----- */
+       case 0:
+               if (c[PROTECTIONTIME] == 0)
+                       c[MOREDEFENSES] += 2;   /* protection field +2 */
+               c[PROTECTIONTIME] += 250;
+               return;
 
-               case 0: if (c[PROTECTIONTIME]==0)       c[MOREDEFENSES]+=2; /* protection field +2 */
-                               c[PROTECTIONTIME] += 250;   return;
+       case 1:
+               i = rnd(((clev + 1) << 1)) + clev + 3;
+               godirect(x, i, (clev >= 2) ? "  Your missiles hit the %s" : "  Your missile hit the %s", 100, '+');     /* magic missile */
 
-               case 1: i = rnd(((clev+1)<<1)) + clev + 3;
-                               godirect(x,i,(clev>=2)?"  Your missiles hit the %s":"  Your missile hit the %s",100,'+'); /* magic missile */
+               return;
 
-                               return;
+       case 2:
+               if (c[DEXCOUNT] == 0)
+                       c[DEXTERITY] += 3;      /* dexterity     */
+               c[DEXCOUNT] += 400;
+               return;
 
-               case 2: if (c[DEXCOUNT]==0)     c[DEXTERITY]+=3; /*     dexterity       */
-                               c[DEXCOUNT] += 400;     return;
+       case 3:         /* sleep                 */
+               i = rnd(3) + 1;
+               direct(x, fullhit(i),
+                      "  While the %s slept, you smashed it %ld times", i);
+               return;
 
-               case 3: i=rnd(3)+1;
-                               p="  While the %s slept, you smashed it %d times";
-                       ws:     direct(x,fullhit(i),p,i); /*    sleep   */      return;
+       case 4:         /* charm monster         */
+               c[CHARMCOUNT] += c[CHARISMA] << 1;
+               return;
 
-               case 4: /*      charm monster   */      c[CHARMCOUNT] += c[CHARISMA]<<1;        return;
+       case 5:
+               godirect(x, rnd(10) + 15 + clev, "  The sound damages the %s", 70, '@');        /* sonic spear */
+               return;
 
-               case 5: godirect(x,rnd(10)+15+clev,"  The sound damages the %s",70,'@'); /*     sonic spear */
-                               return;
+               /* ----- LEVEL 2 SPELLS ----- */
 
-/* ----- LEVEL 2 SPELLS ----- */
+       case 6:         /* web                  */
+               i = rnd(3) + 2;
+               direct(x, fullhit(i),
+                      "  While the %s is entangled, you hit %ld times", i);
+               return;
 
-               case 6: i=rnd(3)+2;     p="  While the %s is entangled, you hit %d times";
-                               goto ws; /* web */
+       case 7:
+               if (c[STRCOUNT] == 0)
+                       c[STREXTRA] += 3;       /* strength      */
+               c[STRCOUNT] += 150 + rnd(100);
+               return;
 
-               case 7: if (c[STRCOUNT]==0) c[STREXTRA]+=3;     /*      strength        */
-                               c[STRCOUNT] += 150+rnd(100);    return;
+       case 8:
+               yl = playery - 5;       /* enlightenment */
+               yh = playery + 6;
+               xl = playerx - 15;
+               xh = playerx + 16;
+               vxy(&xl, &yl);
+               vxy(&xh, &yh);  /* check bounds */
+               for (i = yl; i <= yh; i++)      /* enlightenment         */
+                       for (j = xl; j <= xh; j++)
+                               know[j][i] = 1;
+               draws(xl, xh + 1, yl, yh + 1);
+               return;
 
-               case 8: yl = playery-5;     /* enlightenment */
-                               yh = playery+6;   xl = playerx-15;   xh = playerx+16;
-                               vxy(&xl,&yl);   vxy(&xh,&yh); /* check bounds */
-                               for (i=yl; i<=yh; i++) /* enlightenment */
-                                       for (j=xl; j<=xh; j++)  know[j][i]=1;
-                               draws(xl,xh+1,yl,yh+1); return;
+       case 9:
+               raisehp(20 + (clev << 1));
+               return;         /* healing */
 
-               case 9: raisehp(20+(clev<<1));  return;  /* healing */
+       case 10:
+               c[BLINDCOUNT] = 0;
+               return;         /* cure blindness        */
 
-               case 10:        c[BLINDCOUNT]=0;        return; /* cure blindness       */
+       case 11:
+               createmonster(makemonst(level + 1) + 8);
+               return;
 
-               case 11:        createmonster(makemonst(level+1)+8);  return;
+       case 12:
+               if (rnd(11) + 7 <= c[WISDOM])
+                       direct(x, rnd(20) + 20 + clev, "  The %s believed!", 0);
+               else
+                       lprcat("  It didn't believe the illusions!");
+               return;
 
-               case 12:        if (rnd(11)+7 <= c[WISDOM]) direct(x,rnd(20)+20+clev,"  The %s believed!",0);
-                                       else lprcat("  It didn't believe the illusions!");
-                                       return;
+       case 13:                /* if he has the amulet of invisibility then
+                                * add more time */
+               for (j = i = 0; i < 26; i++)
+                       if (iven[i] == OAMULET)
+                               j += 1 + ivenarg[i];
+               c[INVISIBILITY] += (j << 7) + 12;
+               return;
 
-               case 13:        /* if he has the amulet of invisibility then add more time */
-                                       for (j=i=0; i<26; i++)
-                                               if (iven[i]==OAMULET) j+= 1+ivenarg[i];
-                                       c[INVISIBILITY] += (j<<7)+12;   return;
+               /* ----- LEVEL 3 SPELLS ----- */
 
-/* ----- LEVEL 3 SPELLS ----- */
+       case 14:
+               godirect(x, rnd(25 + clev) + 25 + clev, "  The fireball hits the %s", 40, '*');
+               return;         /* fireball */
 
-               case 14:        godirect(x,rnd(25+clev)+25+clev,"  The fireball hits the %s",40,'*'); return; /*        fireball */
+       case 15:
+               godirect(x, rnd(25) + 20 + clev, "  Your cone of cold strikes the %s", 60, 'O');        /* cold */
+               return;
 
-               case 15:        godirect(x,rnd(25)+20+clev,"  Your cone of cold strikes the %s",60,'O');        /*      cold */
-                                       return;
+       case 16:
+               dirpoly(x);
+               return;         /* polymorph */
 
-               case 16:        dirpoly(x);  return;    /*      polymorph */
+       case 17:
+               c[CANCELLATION] += 5 + clev;
+               return;         /* cancellation  */
 
-               case 17:        c[CANCELLATION]+= 5+clev;       return; /*      cancellation    */
+       case 18:
+               c[HASTESELF] += 7 + clev;
+               return;         /* haste self    */
 
-               case 18:        c[HASTESELF]+= 7+clev;  return;  /*     haste self      */
+       case 19:
+               omnidirect(x, 30 + rnd(10), "  The %s gasps for air");  /* cloud kill */
+               return;
 
-               case 19:        omnidirect(x,30+rnd(10),"  The %s gasps for air");      /* cloud kill */
-                                       return;
+       case 20:
+               xh = min(playerx + 1, MAXX - 2);
+               yh = min(playery + 1, MAXY - 2);
+               for (i = max(playerx - 1, 1); i <= xh; i++)     /* vaporize rock */
+                       for (j = max(playery - 1, 1); j <= yh; j++) {
+                               kn = &know[i][j];
+                               pm = &mitem[i][j];
+                               switch (*(p = &item[i][j])) {
+                               case OWALL:
+                                       if (level < MAXLEVEL + MAXVLEVEL - 1)
+                                               *p = *kn = 0;
+                                       break;
 
-               case 20:        xh = min(playerx+1,MAXX-2);             yh = min(playery+1,MAXY-2);
-                                       for (i=max(playerx-1,1); i<=xh; i++) /* vaporize rock */
-                                         for (j=max(playery-1,1); j<=yh; j++)
-                                               {
-                                               kn = &know[i][j];    pm = &mitem[i][j];
-                                               switch(*(p= &item[i][j]))
-                                                 {
-                                                 case OWALL: if (level < MAXLEVEL+MAXVLEVEL-1)
-                                                                                       *p = *kn = 0;
-                                                                               break;
+                               case OSTATUE:
+                                       if (c[HARDGAME] < 3) {
+                                               *p = OBOOK;
+                                               iarg[i][j] = level;
+                                               *kn = 0;
+                                       }
+                                       break;
 
-                                                 case OSTATUE: if (c[HARDGAME]<3)
-                                                                                        {
-                                                                                        *p=OBOOK; iarg[i][j]=level;  *kn=0;
-                                                                                        }
-                                                                               break;
-       
-                                                 case OTHRONE: *pm=GNOMEKING;  *kn=0;  *p= OTHRONE2;
-                                                                               hitp[i][j]=monster[GNOMEKING].hitpoints; break;
+                               case OTHRONE:
+                                       *pm = GNOMEKING;
+                                       *kn = 0;
+                                       *p = OTHRONE2;
+                                       hitp[i][j] = monster[GNOMEKING].hitpoints;
+                                       break;
 
-                                                 case OALTAR:  *pm=DEMONPRINCE;  *kn=0;
-                                                                               hitp[i][j]=monster[DEMONPRINCE].hitpoints; break;
-                                                 };
-                                               switch(*pm)
-                                                       {
-                                                       case XORN:      ifblind(i,j);  hitm(i,j,200); break; /* Xorn takes damage from vpr */
-                                                       }
-                                               }
-                                       return;
+                               case OALTAR:
+                                       *pm = DEMONPRINCE;
+                                       *kn = 0;
+                                       hitp[i][j] = monster[DEMONPRINCE].hitpoints;
+                                       break;
+                               };
+                               switch (*pm) {
+                               case XORN:
+                                       ifblind(i, j);
+                                       hitm(i, j, 200);
+                                       break;  /* Xorn takes damage from vpr */
+                               }
+                       }
+               return;
 
-/* ----- LEVEL 4 SPELLS ----- */
+               /* ----- LEVEL 4 SPELLS ----- */
 
-               case 21:        direct(x,100+clev,"  The %s shrivels up",0); /* dehydration */
-                                       return;
+       case 21:
+               direct(x, 100 + clev, "  The %s shrivels up", 0);       /* dehydration */
+               return;
 
-               case 22:        godirect(x,rnd(25)+20+(clev<<1),"  A lightning bolt hits the %s",1,'~');        /*      lightning */
-                                       return;
+       case 22:
+               godirect(x, rnd(25) + 20 + (clev << 1), "  A lightning bolt hits the %s", 1, '~');      /* lightning */
+               return;
 
-               case 23:        i=min(c[HP]-1,c[HPMAX]/2);      /* drain life */
-                                       direct(x,i+i,"",0);     c[HP] -= i;     return;
+       case 23:
+               i = min(c[HP] - 1, c[HPMAX] / 2);       /* drain life */
+               direct(x, i + i, "", 0);
+               c[HP] -= i;
+               return;
 
-               case 24:        if (c[GLOBE]==0) c[MOREDEFENSES] += 10;
-                                       c[GLOBE] += 200;  loseint();  /* globe of invulnerability */
-                                       return;
+       case 24:
+               if (c[GLOBE] == 0)
+                       c[MOREDEFENSES] += 10;
+               c[GLOBE] += 200;
+               loseint();      /* globe of invulnerability */
+               return;
 
-               case 25:        omnidirect(x,32+clev,"  The %s struggles for air in your flood!"); /* flood */
-                                       return;
+       case 25:
+               omnidirect(x, 32 + clev, "  The %s struggles for air in your flood!");  /* flood */
+               return;
 
-               case 26:        if (rnd(151)==63) { beep(); lprcat("\nYour heart stopped!\n"); nap(4000);  died(270); return; }
-                                       if (c[WISDOM]>rnd(10)+10) direct(x,2000,"  The %s's heart stopped",0); /* finger of death */
-                                       else lprcat("  It didn't work"); return;
+       case 26:
+               if (rnd(151) == 63) {
+                       beep();
+                       lprcat("\nYour heart stopped!\n");
+                       nap(4000);
+                       died(270);
+                       return;
+               }
+               if (c[WISDOM] > rnd(10) + 10)
+                       direct(x, 2000, "  The %s's heart stopped", 0); /* finger of death */
+               else
+                       lprcat("  It didn't work");
+               return;
 
-/* ----- LEVEL 5 SPELLS ----- */
+               /* ----- LEVEL 5 SPELLS ----- */
 
-               case 27:        c[SCAREMONST] += rnd(10)+clev;  return;  /* scare monster */
+       case 27:
+               c[SCAREMONST] += rnd(10) + clev;
+               return;         /* scare monster */
 
-               case 28:        c[HOLDMONST] += rnd(10)+clev;  return;  /* hold monster */
+       case 28:
+               c[HOLDMONST] += rnd(10) + clev;
+               return;         /* hold monster */
 
-               case 29:        c[TIMESTOP] += rnd(20)+(clev<<1);  return;  /* time stop */
+       case 29:
+               c[TIMESTOP] += rnd(20) + (clev << 1);
+               return;         /* time stop */
 
-               case 30:        tdirect(x);  return;  /* teleport away */
+       case 30:
+               tdirect(x);
+               return;         /* teleport away */
 
-               case 31:        omnidirect(x,35+rnd(10)+clev,"  The %s cringes from the flame"); /* magic fire */
-                                       return;
+       case 31:
+               omnidirect(x, 35 + rnd(10) + clev, "  The %s cringes from the flame");  /* magic fire */
+               return;
 
-/* ----- LEVEL 6 SPELLS ----- */
+               /* ----- LEVEL 6 SPELLS ----- */
 
-               case 32:        if ((rnd(23)==5) && (wizard==0)) /* sphere of annihilation */
-                                               {
-                                               beep(); lprcat("\nYou have been enveloped by the zone of nothingness!\n");
-                                               nap(4000);  died(258); return;
-                                               }
-                                       xl=playerx; yl=playery;
-                                       loseint();
-                                       i=dirsub(&xl,&yl); /* get direction of sphere */
-                                       newsphere(xl,yl,i,rnd(20)+11);  /* make a sphere */
-                                       return;
-
-               case 33:        genmonst();  spelknow[33]=0;  /* genocide */
-                                       loseint();
-                                       return;
-
-               case 34:        /* summon demon */
-                                       if (rnd(100) > 30) { direct(x,150,"  The demon strikes at the %s",0);  return; }
-                                       if (rnd(100) > 15) { lprcat("  Nothing seems to have happened");  return; }
-                                       lprcat("  The demon turned on you and vanished!"); beep();
-                                       i=rnd(40)+30;  lastnum=277;
-                                       losehp(i); /* must say killed by a demon */ return;
-
-               case 35:        /* walk through walls */
-                                       c[WTW] += rnd(10)+5;    return;
-
-               case 36:        /* alter reality */
-                                       {
-                                       struct isave *save;     /* pointer to item save structure */
-                                       int sc; sc=0;   /* # items saved */
-                                       save = (struct isave *)malloc(sizeof(struct isave)*MAXX*MAXY*2);
-                                       for (j=0; j<MAXY; j++)
-                                               for (i=0; i<MAXX; i++) /* save all items and monsters */
-                                                       {
-                                                       xl = item[i][j];
-                                                       if (xl && xl!=OWALL && xl!=OANNIHILATION) 
-                                                               {
-                                                               save[sc].type=0;  save[sc].id=item[i][j];
-                                                               save[sc++].arg=iarg[i][j];
-                                                               }
-                                                       if (mitem[i][j]) 
-                                                               {
-                                                               save[sc].type=1;  save[sc].id=mitem[i][j];
-                                                               save[sc++].arg=hitp[i][j];
-                                                               }
-                                                       item[i][j]=OWALL;   mitem[i][j]=0;
-                                                       if (wizard) know[i][j]=1; else know[i][j]=0;
-                                                       }
-                                       eat(1,1);       if (level==1) item[33][MAXY-1]=0;
-                                       for (j=rnd(MAXY-2), i=1; i<MAXX-1; i++) item[i][j]=0;
-                                       while (sc>0) /* put objects back in level */
-                                               {
-                                               --sc;
-                                               if (save[sc].type == 0)
-                                                       {
-                                                       int trys;
-                                                       for (trys=100, i=j=1; --trys>0 && item[i][j]; i=rnd(MAXX-1), j=rnd(MAXY-1));
-                                                       if (trys) { item[i][j]=save[sc].id; iarg[i][j]=save[sc].arg; }
-                                                       }
-                                               else
-                                                       { /* put monsters back in */
-                                                       int trys;
-                                                       for (trys=100, i=j=1; --trys>0 && (item[i][j]==OWALL || mitem[i][j]); i=rnd(MAXX-1), j=rnd(MAXY-1));
-                                                       if (trys) { mitem[i][j]=save[sc].id; hitp[i][j]=save[sc].arg; }
-                                                       }
-                                               }
-                                       loseint();
-                                       draws(0,MAXX,0,MAXY);  if (wizard==0) spelknow[36]=0;
-                                       free((char*)save);       positionplayer();  return;
+       case 32:
+               if ((rnd(23) == 5) && (wizard == 0)) {  /* sphere of
+                                                        * annihilation */
+                       beep();
+                       lprcat("\nYou have been enveloped by the zone of nothingness!\n");
+                       nap(4000);
+                       died(258);
+                       return;
+               }
+               xl = playerx;
+               yl = playery;
+               loseint();
+               i = dirsub(&xl, &yl);   /* get direction of sphere */
+               newsphere(xl, yl, i, rnd(20) + 11);     /* make a sphere */
+               return;
+
+       case 33:
+               genmonst();
+               spelknow[33] = 0;       /* genocide */
+               loseint();
+               return;
+
+       case 34:                /* summon demon */
+               if (rnd(100) > 30) {
+                       direct(x, 150, "  The demon strikes at the %s", 0);
+                       return;
+               }
+               if (rnd(100) > 15) {
+                       lprcat("  Nothing seems to have happened");
+                       return;
+               }
+               lprcat("  The demon turned on you and vanished!");
+               beep();
+               i = rnd(40) + 30;
+               lastnum = 277;
+               losehp(i);      /* must say killed by a demon */
+               return;
+
+       case 35:                /* walk through walls */
+               c[WTW] += rnd(10) + 5;
+               return;
+
+       case 36:                /* alter reality */
+               {
+                       struct isave   *save;   /* pointer to item save
+                                                * structure */
+                       int             sc;
+                       sc = 0; /* # items saved */
+                       save = (struct isave *) malloc(sizeof(struct isave) * MAXX * MAXY * 2);
+                       for (j = 0; j < MAXY; j++)
+                               for (i = 0; i < MAXX; i++) {    /* save all items and
+                                                                * monsters */
+                                       xl = item[i][j];
+                                       if (xl && xl != OWALL && xl != OANNIHILATION) {
+                                               save[sc].type = 0;
+                                               save[sc].id = item[i][j];
+                                               save[sc++].arg = iarg[i][j];
+                                       }
+                                       if (mitem[i][j]) {
+                                               save[sc].type = 1;
+                                               save[sc].id = mitem[i][j];
+                                               save[sc++].arg = hitp[i][j];
                                        }
+                                       item[i][j] = OWALL;
+                                       mitem[i][j] = 0;
+                                       if (wizard)
+                                               know[i][j] = 1;
+                                       else
+                                               know[i][j] = 0;
+                               }
+                       eat(1, 1);
+                       if (level == 1)
+                               item[33][MAXY - 1] = 0;
+                       for (j = rnd(MAXY - 2), i = 1; i < MAXX - 1; i++)
+                               item[i][j] = 0;
+                       while (sc > 0) {        /* put objects back in level */
+                               --sc;
+                               if (save[sc].type == 0) {
+                                       int             trys;
+                                       for (trys = 100, i = j = 1; --trys > 0 && item[i][j]; i = rnd(MAXX - 1), j = rnd(MAXY - 1));
+                                       if (trys) {
+                                               item[i][j] = save[sc].id;
+                                               iarg[i][j] = save[sc].arg;
+                                       }
+                               } else {        /* put monsters back in */
+                                       int             trys;
+                                       for (trys = 100, i = j = 1; --trys > 0 && (item[i][j] == OWALL || mitem[i][j]); i = rnd(MAXX - 1), j = rnd(MAXY - 1));
+                                       if (trys) {
+                                               mitem[i][j] = save[sc].id;
+                                               hitp[i][j] = save[sc].arg;
+                                       }
+                               }
+                       }
+                       loseint();
+                       draws(0, MAXX, 0, MAXY);
+                       if (wizard == 0)
+                               spelknow[36] = 0;
+                       free((char *) save);
+                       positionplayer();
+                       return;
+               }
 
-               case 37:        /* permanence */ adjtime(-99999L);  spelknow[37]=0; /* forget */
-                                       loseint();
-                                       return;
+       case 37:                /* permanence */
+               adjusttime(-99999L);
+               spelknow[37] = 0;       /* forget */
+               loseint();
+               return;
 
-               default:        lprintf("  spell %d not available!",(long)x); beep();  return;
-               };
-       }
+       default:
+               lprintf("  spell %ld not available!", (long) x);
+               beep();
+               return;
+       };
+}
 
 /*
- *     loseint()               Routine to subtract 1 from your int (intelligence) if > 3
+ * loseint()           Routine to subtract 1 from your int (intelligence) if > 3
  *
- *     No arguments and no return value
+ * No arguments and no return value
  */
-loseint()
-       {
-       if (--c[INTELLIGENCE]<3)  c[INTELLIGENCE]=3;
-       }
+static void
+loseint(void)
+{
+       if (--c[INTELLIGENCE] < 3)
+               c[INTELLIGENCE] = 3;
+}
 
 /*
- *     isconfuse()             Routine to check to see if player is confused
+ * isconfuse()                 Routine to check to see if player is confused
  *
- *     This routine prints out a message saying "You can't aim your magic!"
- *     returns 0 if not confused, non-zero (time remaining confused) if confused
+ * This routine prints out a message saying "You can't aim your magic!"
+ * returns 0 if not confused, non-zero (time remaining confused) if confused
  */
-isconfuse()
-       {
-       if (c[CONFUSE]) { lprcat(" You can't aim your magic!"); beep(); }
-       return(c[CONFUSE]);
+static int
+isconfuse(void)
+{
+       if (c[CONFUSE]) {
+               lprcat(" You can't aim your magic!");
+               beep();
        }
+       return (c[CONFUSE]);
+}
 
 /*
- *     nospell(x,monst)        Routine to return 1 if a spell doesn't affect a monster
- *             int x,monst;
+ * nospell(x,monst)    Routine to return 1 if a spell doesn't affect a monster
+ *     int x,monst;
  *
- *     Subroutine to return 1 if the spell can't affect the monster
- *       otherwise returns 0
- *     Enter with the spell number in x, and the monster number in monst.
+ * Subroutine to return 1 if the spell can't affect the monster
+ *   otherwise returns 0
+ * Enter with the spell number in x, and the monster number in monst.
  */
-nospell(x,monst)
-       int x,monst;
-       {
-       register int tmp;
-       if (x>=SPNUM || monst>=MAXMONST+8 || monst<0 || x<0) return(0); /* bad spell or monst */
-       if ((tmp=spelweird[monst-1][x])==0) return(0);
-       cursors();  lprc('\n');  lprintf(spelmes[tmp],monster[monst].name);  return(1);
-       }
+static int
+nospell(int x, int monst)
+{
+       int    tmp;
+       if (x >= SPNUM || monst >= MAXMONST + 8 || monst < 0 || x < 0)
+               return (0);     /* bad spell or monst */
+       if ((tmp = spelweird[monst - 1][x]) == 0)
+               return (0);
+       cursors();
+       lprc('\n');
+       lprintf(spelmes[tmp], monster[monst].name);
+       return (1);
+}
 
 /*
- *     fullhit(xx)             Function to return full damage against a monster (aka web)
- *             int xx;
+ * fullhit(xx)         Function to return full damage against a monster (aka web)
+ *     int xx;
  *
- *     Function to return hp damage to monster due to a number of full hits
- *     Enter with the number of full hits being done
+ * Function to return hp damage to monster due to a number of full hits
+ * Enter with the number of full hits being done
  */
-fullhit(xx)
-       int xx;
-       {
-       register int i;
-       if (xx<0 || xx>20) return(0);   /* fullhits are out of range */
-       if (c[LANCEDEATH]) return(10000);       /* lance of death */
-       i = xx * ((c[WCLASS]>>1)+c[STRENGTH]+c[STREXTRA]-c[HARDGAME]-12+c[MOREDAM]); 
-       return( (i>=1) ? i : xx );
-       }
+static int
+fullhit(int xx)
+{
+       int    i;
+       if (xx < 0 || xx > 20)
+               return (0);     /* fullhits are out of range */
+       if (c[LANCEDEATH])
+               return (10000); /* lance of death */
+       i = xx * ((c[WCLASS] >> 1) + c[STRENGTH] + c[STREXTRA] - c[HARDGAME] - 12 + c[MOREDAM]);
+       return ((i >= 1) ? i : xx);
+}
 
 /*
- *     direct(spnum,dam,str,arg)       Routine to direct spell damage 1 square in 1 dir
- *             int spnum,dam,arg;
- *             char *str;
- *
- *     Routine to ask for a direction to a spell and then hit the monster
- *     Enter with the spell number in spnum, the damage to be done in dam,
- *       lprintf format string in str, and lprintf's argument in arg.
- *     Returns no value.
+ * direct(spnum,dam,str,arg)   Routine to direct spell damage 1 square in 1 dir
+ *     int spnum,dam,arg;
+ *     char *str;
+ *
+ * Routine to ask for a direction to a spell and then hit the monster
+ * Enter with the spell number in spnum, the damage to be done in dam,
+ *   lprintf format string in str, and lprintf's argument in arg.
+ * Returns no value.
  */
-direct(spnum,dam,str,arg)
-       int spnum,dam,arg;
-       char *str;
-       {
-       int x,y;
-       register int m;
-       if (spnum<0 || spnum>=SPNUM || str==0) return; /* bad arguments */
-       if (isconfuse()) return;
-       dirsub(&x,&y);
+static void
+direct(int spnum, int dam, const char *str, int arg)
+{
+       int             x, y;
+       int    m;
+       if (spnum < 0 || spnum >= SPNUM || str == 0)
+               return;         /* bad arguments */
+       if (isconfuse())
+               return;
+       dirsub(&x, &y);
        m = mitem[x][y];
-       if (item[x][y]==OMIRROR)
-               {
-               if (spnum==3) /* sleep */
-                       {
-                       lprcat("You fall asleep! "); beep();
-               fool:
+       if (item[x][y] == OMIRROR) {
+               if (spnum == 3) {       /* sleep */
+                       lprcat("You fall asleep! ");
+                       beep();
+       fool:
                        arg += 2;
-                       while (arg-- > 0) { parse2(); nap(1000); }
-                       return;
+                       while (arg-- > 0) {
+                               parse2();
+                               nap(1000);
                        }
-               else if (spnum==6) /* web */
-                       {
-                       lprcat("You get stuck in your own web! "); beep();
+                       return;
+               } else if (spnum == 6) {        /* web */
+                       lprcat("You get stuck in your own web! ");
+                       beep();
                        goto fool;
-                       }
-               else
-                       {
-                       lastnum=278; 
-                       lprintf(str,"spell caster (thats you)",(long)arg);
-                       beep(); losehp(dam); return;
-                       }
+               } else {
+                       lastnum = 278;
+                       lprintf(str, "spell caster (that's you)", (long) arg);
+                       beep();
+                       losehp(dam);
+                       return;
                }
-       if (m==0)
-               {       lprcat("  There wasn't anything there!");       return;  }
-       ifblind(x,y);
-       if (nospell(spnum,m)) { lasthx=x;  lasthy=y; return; }
-       lprintf(str,lastmonst,(long)arg);       hitm(x,y,dam);
        }
+       if (m == 0) {
+               lprcat("  There wasn't anything there!");
+               return;
+       }
+       ifblind(x, y);
+       if (nospell(spnum, m)) {
+               lasthx = x;
+               lasthy = y;
+               return;
+       }
+       lprintf(str, lastmonst, (long) arg);
+       hitm(x, y, dam);
+}
 
 /*
- *     godirect(spnum,dam,str,delay,cshow)             Function to perform missile attacks
- *             int spnum,dam,delay;
- *             char *str,cshow;
- *
- *     Function to hit in a direction from a missile weapon and have it keep
- *     on going in that direction until its power is exhausted
- *     Enter with the spell number in spnum, the power of the weapon in hp,
- *       lprintf format string in str, the # of milliseconds to delay between 
- *       locations in delay, and the character to represent the weapon in cshow.
- *     Returns no value.
+ * godirect(spnum,dam,str,delay,cshow)         Function to perform missile attacks
+ *     int spnum,dam,delay;
+ *     char *str,cshow;
+ *
+ * Function to hit in a direction from a missile weapon and have it keep
+ * on going in that direction until its power is exhausted
+ * Enter with the spell number in spnum, the power of the weapon in hp,
+ *   lprintf format string in str, the # of milliseconds to delay between
+ *   locations in delay, and the character to represent the weapon in cshow.
+ * Returns no value.
  */
-godirect(spnum,dam,str,delay,cshow)
-       int spnum,dam,delay;
-       char *str,cshow;
-       {
-       register char *p;
-       register int x,y,m;
-       int dx,dy;
-       if (spnum<0 || spnum>=SPNUM || str==0 || delay<0) return; /* bad args */
-       if (isconfuse()) return;
-       dirsub(&dx,&dy);        x=dx;   y=dy;
-       dx = x-playerx;         dy = y-playery;         x = playerx;    y = playery;
-       while (dam>0)
-               {
-               x += dx;    y += dy;
-           if ((x > MAXX-1) || (y > MAXY-1) || (x < 0) || (y < 0))
-                       {
-                       dam=0;  break;  /* out of bounds */
-                       }
-               if ((x==playerx) && (y==playery)) /* if energy hits player */
-                       {
-                       cursors(); lprcat("\nYou are hit my your own magic!"); beep();
-                       lastnum=278;  losehp(dam);  return;
-                       }
-               if (c[BLINDCOUNT]==0) /* if not blind show effect */
-                       {
-                       cursor(x+1,y+1); lprc(cshow); nap(delay); show1cell(x,y);
-                       }
-               if ((m=mitem[x][y]))    /* is there a monster there? */
-                       {
-                       ifblind(x,y);
-                       if (nospell(spnum,m)) { lasthx=x;  lasthy=y; return; }
-                       cursors(); lprc('\n');
-                       lprintf(str,lastmonst);         dam -= hitm(x,y,dam);
-                       show1cell(x,y);  nap(1000);             x -= dx;        y -= dy;
+void
+godirect(int spnum, int dam, const char *str, int delay, int cshow_i)
+{
+       u_char  *p;
+       int    x, y, m;
+       int             dx, dy;
+       char cshow;
+
+       /* truncate to char width in case it matters */
+       cshow = (char)cshow_i;
+
+       if (spnum < 0 || spnum >= SPNUM || str == 0 || delay < 0)
+               return;         /* bad args */
+       if (isconfuse())
+               return;
+       dirsub(&dx, &dy);
+       x = dx;
+       y = dy;
+       dx = x - playerx;
+       dy = y - playery;
+       x = playerx;
+       y = playery;
+       while (dam > 0) {
+               x += dx;
+               y += dy;
+               if ((x > MAXX - 1) || (y > MAXY - 1) || (x < 0) || (y < 0)) {
+                       dam = 0;
+                       break;  /* out of bounds */
+               }
+               if ((x == playerx) && (y == playery)) { /* if energy hits player */
+                       cursors();
+                       lprcat("\nYou are hit by your own magic!");
+                       beep();
+                       lastnum = 278;
+                       losehp(dam);
+                       return;
+               }
+               if (c[BLINDCOUNT] == 0) {       /* if not blind show effect */
+                       cursor(x + 1, y + 1);
+                       lprc(cshow);
+                       nap(delay);
+                       show1cell(x, y);
+               }
+               if ((m = mitem[x][y])) {        /* is there a monster there? */
+                       ifblind(x, y);
+                       if (nospell(spnum, m)) {
+                               lasthx = x;
+                               lasthy = y;
+                               return;
                        }
-               else switch (*(p= &item[x][y]))
-                       {
-                       case OWALL:     cursors(); lprc('\n'); lprintf(str,"wall");
-                                               if (dam>=50+c[HARDGAME]) /* enough damage? */
-                                                if (level<MAXLEVEL+MAXVLEVEL-1) /* not on V3 */
-                                                 if ((x<MAXX-1) && (y<MAXY-1) && (x) && (y))
-                                                       {
+                       cursors();
+                       lprc('\n');
+                       lprintf(str, lastmonst);
+                       dam -= hitm(x, y, dam);
+                       show1cell(x, y);
+                       nap(1000);
+                       x -= dx;
+                       y -= dy;
+               } else
+                       switch (*(p = &item[x][y])) {
+                       case OWALL:
+                               cursors();
+                               lprc('\n');
+                               lprintf(str, "wall");
+                               if (dam >= 50 + c[HARDGAME])    /* enough damage? */
+                                       if (level < MAXLEVEL + MAXVLEVEL - 1)   /* not on V3 */
+                                               if ((x < MAXX - 1) && (y < MAXY - 1) && (x) && (y)) {
                                                        lprcat("  The wall crumbles");
-                                       god3:   *p=0;
-                                       god:    know[x][y]=0;
-                                                       show1cell(x,y);
-                                                       }
-                               god2:   dam = 0;        break;
-
-                       case OCLOSEDDOOR:       cursors(); lprc('\n'); lprintf(str,"door");
-                                               if (dam>=40)
-                                                       {
-                                                       lprcat("  The door is blasted apart");
-                                                       goto god3;
-                                                       }
-                                               goto god2;
-
-                       case OSTATUE:   cursors(); lprc('\n'); lprintf(str,"statue");
-                                               if (c[HARDGAME]<3)
-                                                 if (dam>44)
-                                                       {
-                                                       lprcat("  The statue crumbles");
-                                                       *p=OBOOK; iarg[x][y]=level;
-                                                       goto god;
-                                                       }
-                                               goto god2;
-
-                       case OTHRONE:   cursors(); lprc('\n'); lprintf(str,"throne");
-                                       if (dam>39)
-                                               {
-                                               mitem[x][y]=GNOMEKING; hitp[x][y]=monster[GNOMEKING].hitpoints;
-                                               *p = OTHRONE2;
-                                               goto god;
+                                       god3:           *p = 0;
+                                       god:            know[x][y] = 0;
+                                                       show1cell(x, y);
                                                }
-                                       goto god2;
+               god2:           dam = 0;
+                               break;
 
-                       case OMIRROR:   dx *= -1;       dy *= -1;       break;
+                       case OCLOSEDDOOR:
+                               cursors();
+                               lprc('\n');
+                               lprintf(str, "door");
+                               if (dam >= 40) {
+                                       lprcat("  The door is blasted apart");
+                                       goto god3;
+                               }
+                               goto god2;
+
+                       case OSTATUE:
+                               cursors();
+                               lprc('\n');
+                               lprintf(str, "statue");
+                               if (c[HARDGAME] < 3)
+                                       if (dam > 44) {
+                                               lprcat("  The statue crumbles");
+                                               *p = OBOOK;
+                                               iarg[x][y] = level;
+                                               goto god;
+                                       }
+                               goto god2;
+
+                       case OTHRONE:
+                               cursors();
+                               lprc('\n');
+                               lprintf(str, "throne");
+                               if (dam > 39) {
+                                       mitem[x][y] = GNOMEKING;
+                                       hitp[x][y] = monster[GNOMEKING].hitpoints;
+                                       *p = OTHRONE2;
+                                       goto god;
+                               }
+                               goto god2;
+
+                       case OMIRROR:
+                               dx *= -1;
+                               dy *= -1;
+                               break;
                        };
-               dam -= 3 + (c[HARDGAME]>>1);
-               }
+               dam -= 3 + (c[HARDGAME] >> 1);
        }
+}
 
 /*
- *     ifblind(x,y)    Routine to put "monster" or the monster name into lastmosnt
- *             int x,y;
+ * ifblind(x,y)        Routine to put "monster" or the monster name into lastmosnt
+ *     int x,y;
  *
- *     Subroutine to copy the word "monster" into lastmonst if the player is blind
- *     Enter with the coordinates (x,y) of the monster
- *     Returns no value.
+ * Subroutine to copy the word "monster" into lastmonst if the player is blind
+ * Enter with the coordinates (x,y) of the monster
+ * Returns no value.
  */
-ifblind(x,y)
-       int x,y;
-       {
-       char *p;
-       vxy(&x,&y);     /* verify correct x,y coordinates */
-       if (c[BLINDCOUNT]) { lastnum=279;  p="monster"; }
-               else { lastnum=mitem[x][y];  p=monster[lastnum].name; }
-       strcpy(lastmonst,p);
+static void
+ifblind(int x, int y)
+{
+       const char *p;
+
+       vxy(&x, &y);            /* verify correct x,y coordinates */
+       if (c[BLINDCOUNT]) {
+               lastnum = 279;
+               p = "monster";
+       } else {
+               lastnum = mitem[x][y];
+               p = monster[lastnum].name;
        }
+       strcpy(lastmonst, p);
+}
 
 /*
- *     tdirect(spnum)          Routine to teleport away a monster
- *             int spnum;
+ * tdirect(spnum)              Routine to teleport away a monster
+ *     int spnum;
  *
- *     Routine to ask for a direction to a spell and then teleport away monster
- *     Enter with the spell number that wants to teleport away
- *     Returns no value.
+ * Routine to ask for a direction to a spell and then teleport away monster
+ * Enter with the spell number that wants to teleport away
+ * Returns no value.
  */
-tdirect(spnum)
-       int spnum;
-       {
-       int x,y;
-       register int m;
-       if (spnum<0 || spnum>=SPNUM) return; /* bad args */
-       if (isconfuse()) return;
-       dirsub(&x,&y);
-       if ((m=mitem[x][y])==0)
-               {       lprcat("  There wasn't anything there!");       return;  }
-       ifblind(x,y);
-       if (nospell(spnum,m)) { lasthx=x;  lasthy=y; return; }
-       fillmonst(m);  mitem[x][y]=know[x][y]=0;
+static void
+tdirect(int spnum)
+{
+       int             x, y;
+       int    m;
+       if (spnum < 0 || spnum >= SPNUM)
+               return;         /* bad args */
+       if (isconfuse())
+               return;
+       dirsub(&x, &y);
+       if ((m = mitem[x][y]) == 0) {
+               lprcat("  There wasn't anything there!");
+               return;
+       }
+       ifblind(x, y);
+       if (nospell(spnum, m)) {
+               lasthx = x;
+               lasthy = y;
+               return;
        }
+       fillmonst(m);
+       mitem[x][y] = know[x][y] = 0;
+}
 
 /*
- *     omnidirect(sp,dam,str)   Routine to damage all monsters 1 square from player
- *             int sp,dam;
- *             char *str;
- *
- *     Routine to cast a spell and then hit the monster in all directions
- *     Enter with the spell number in sp, the damage done to wach square in dam,
- *       and the lprintf string to identify the spell in str.
- *     Returns no value.
+ * omnidirect(sp,dam,str)   Routine to damage all monsters 1 square from player
+ *     int sp,dam;
+ *     char *str;
+ *
+ * Routine to cast a spell and then hit the monster in all directions
+ * Enter with the spell number in sp, the damage done to wach square in dam,
+ *   and the lprintf string to identify the spell in str.
+ * Returns no value.
  */
-omnidirect(spnum,dam,str)
-       int spnum,dam;
-       char *str;
-       {
-       register int x,y,m;
-       if (spnum<0 || spnum>=SPNUM || str==0) return; /* bad args */
-       for (x=playerx-1; x<playerx+2; x++)
-               for (y=playery-1; y<playery+2; y++)
-                       {
-                       if (m=mitem[x][y])
-                               if (nospell(spnum,m) == 0)
-                                       {
-                                       ifblind(x,y);
-                                       cursors(); lprc('\n'); lprintf(str,lastmonst);
-                                       hitm(x,y,dam);  nap(800);
-                                       }
-                               else  { lasthx=x;  lasthy=y; }
+static void
+omnidirect(int spnum, int dam, const char *str)
+{
+       int    x, y, m;
+
+       if (spnum < 0 || spnum >= SPNUM || str == 0)
+               return;         /* bad args */
+       for (x = playerx - 1; x < playerx + 2; x++)
+               for (y = playery - 1; y < playery + 2; y++) {
+                       if ((m = mitem[x][y]) != 0) {
+                               if (nospell(spnum, m) == 0) {
+                                       ifblind(x, y);
+                                       cursors();
+                                       lprc('\n');
+                                       lprintf(str, lastmonst);
+                                       hitm(x, y, dam);
+                                       nap(800);
+                               } else {
+                                       lasthx = x;
+                                       lasthy = y;
+                               }
                        }
-       }
+               }
+}
 
 /*
- *     static dirsub(x,y)              Routine to ask for direction, then modify x,y for it
- *             int *x,*y;
+ * static dirsub(x,y)          Routine to ask for direction, then modify x,y for it
+ *     int *x,*y;
  *
- *     Function to ask for a direction and modify an x,y for that direction
- *     Enter with the origination coordinates in (x,y).
- *     Returns index into diroffx[] (0-8).
+ * Function to ask for a direction and modify an x,y for that direction
+ * Enter with the origination coordinates in (x,y).
+ * Returns index into diroffx[] (0-8).
  */
 static int
-dirsub(x,y)
-       int *x,*y;
-       {
-       register int i;
+dirsub(int *x, int *y)
+{
+       int    i;
        lprcat("\nIn What Direction? ");
-       for (i=0; ; )
-               switch(getchar())
-                       {
-                       case 'b':       i++;
-                       case 'n':       i++;    
-                       case 'y':       i++;    
-                       case 'u':       i++;
-                       case 'h':       i++;    
-                       case 'k':       i++;
-                       case 'l':       i++;    
-                       case 'j':       i++;            goto out;
-                       };
+       for (i = 0;;)
+               switch (ttgetch()) {
+               case 'b':
+                       i++;
+                       /* FALLTHROUGH */
+               case 'n':
+                       i++;
+                       /* FALLTHROUGH */
+               case 'y':
+                       i++;
+                       /* FALLTHROUGH */
+               case 'u':
+                       i++;
+                       /* FALLTHROUGH */
+               case 'h':
+                       i++;
+                       /* FALLTHROUGH */
+               case 'k':
+                       i++;
+                       /* FALLTHROUGH */
+               case 'l':
+                       i++;
+                       /* FALLTHROUGH */
+               case 'j':
+                       i++;
+                       /* FALLTHROUGH */
+                       goto out;
+               };
 out:
-       *x = playerx+diroffx[i];                *y = playery+diroffy[i];
-       vxy(x,y);  return(i);
-       }
+       *x = playerx + diroffx[i];
+       *y = playery + diroffy[i];
+       vxy(x, y);
+       return (i);
+}
 
 /*
- *     vxy(x,y)           Routine to verify/fix coordinates for being within bounds
- *             int *x,*y;
- *
- *     Function to verify x & y are within the bounds for a level
- *     If *x or *y is not within the absolute bounds for a level, fix them so that
- *       they are on the level.
- *     Returns TRUE if it was out of bounds, and the *x & *y in the calling
- *     routine are affected.
+ * vxy(x,y)       Routine to verify/fix coordinates for being within bounds
+ *     int *x,*y;
+ *
+ * Function to verify x & y are within the bounds for a level
+ * If *x or *y is not within the absolute bounds for a level, fix them so that
+ *   they are on the level.
+ * Returns TRUE if it was out of bounds, and the *x & *y in the calling
+ * routine are affected.
  */
-vxy(x,y)
-       int *x,*y;
-       {
-       int flag=0;
-       if (*x<0) { *x=0; flag++; }
-       if (*y<0) { *y=0; flag++; }
-       if (*x>=MAXX) { *x=MAXX-1; flag++; }
-       if (*y>=MAXY) { *y=MAXY-1; flag++; }
-       return(flag);
+int
+vxy(int *x, int *y)
+{
+       int             flag = 0;
+       if (*x < 0) {
+               *x = 0;
+               flag++;
        }
+       if (*y < 0) {
+               *y = 0;
+               flag++;
+       }
+       if (*x >= MAXX) {
+               *x = MAXX - 1;
+               flag++;
+       }
+       if (*y >= MAXY) {
+               *y = MAXY - 1;
+               flag++;
+       }
+       return (flag);
+}
 
 /*
- *     dirpoly(spnum)          Routine to ask for a direction and polymorph a monst
- *             int spnum;
+ * dirpoly(spnum)      Routine to ask for a direction and polymorph a monst
+ *     int spnum;
  *
- *     Subroutine to polymorph a monster and ask for the direction its in
- *     Enter with the spell number in spmun.
- *     Returns no value.
+ * Subroutine to polymorph a monster and ask for the direction its in
+ * Enter with the spell number in spmun.
+ * Returns no value.
  */
-dirpoly(spnum)
-       int spnum;
-       {
-       int x,y,m;
-       if (spnum<0 || spnum>=SPNUM) return; /* bad args */
-       if (isconfuse()) return;        /* if he is confused, he can't aim his magic */
-       dirsub(&x,&y);
-       if (mitem[x][y]==0)
-               {       lprcat("  There wasn't anything there!");       return;  }
-       ifblind(x,y);
-       if (nospell(spnum,mitem[x][y])) { lasthx=x;  lasthy=y; return; }
-       while ( monster[m = mitem[x][y] = rnd(MAXMONST+7)].genocided );
-       hitp[x][y] = monster[m].hitpoints;
-       show1cell(x,y);  /* show the new monster */
+static void
+dirpoly(int spnum)
+{
+       int             x, y, m;
+       if (spnum < 0 || spnum >= SPNUM)
+               return;         /* bad args */
+       if (isconfuse())
+               return;         /* if he is confused, he can't aim his magic */
+       dirsub(&x, &y);
+       if (mitem[x][y] == 0) {
+               lprcat("  There wasn't anything there!");
+               return;
+       }
+       ifblind(x, y);
+       if (nospell(spnum, mitem[x][y])) {
+               lasthx = x;
+               lasthy = y;
+               return;
        }
+       while (monster[m = mitem[x][y] = rnd(MAXMONST + 7)].genocided);
+       hitp[x][y] = monster[m].hitpoints;
+       show1cell(x, y);        /* show the new monster */
+}
 
 /*
- *     hitmonster(x,y)         Function to hit a monster at the designated coordinates
- *             int x,y;
+ * hitmonster(x,y)     Function to hit a monster at the designated coordinates
+ *     int x,y;
  *
- *     This routine is used for a bash & slash type attack on a monster
- *     Enter with the coordinates of the monster in (x,y).
- *     Returns no value.
+ * This routine is used for a bash & slash type attack on a monster
+ * Enter with the coordinates of the monster in (x,y).
+ * Returns no value.
  */
-hitmonster(x,y)
-       int x,y;
-       {
-       register int tmp,monst,damag,flag;
-       if (c[TIMESTOP])  return;  /* not if time stopped */
-       vxy(&x,&y);     /* verify coordinates are within range */
-       if ((monst = mitem[x][y]) == 0) return;
-       hit3flag=1;  ifblind(x,y);
-       tmp = monster[monst].armorclass + c[LEVEL] + c[DEXTERITY] + c[WCLASS]/4 - 12;
+void
+hitmonster(int x, int y)
+{
+       int    tmp, monst, damag = 0, flag;
+       if (c[TIMESTOP])
+               return;         /* not if time stopped */
+       vxy(&x, &y);            /* verify coordinates are within range */
+       if ((monst = mitem[x][y]) == 0)
+               return;
+       hit3flag = 1;
+       ifblind(x, y);
+       tmp = monster[monst].armorclass + c[LEVEL] + c[DEXTERITY] +
+           c[WCLASS] / 4 - 12;
        cursors();
-       if ((rnd(20) < tmp-c[HARDGAME]) || (rnd(71) < 5)) /* need at least random chance to hit */
-               {
-               lprcat("\nYou hit");  flag=1;
-               damag = fullhit(1);  
-               if (damag<9999) damag=rnd(damag)+1;
-               }
-       else
-               {
-               lprcat("\nYou missed");  flag=0;
-               }
-       lprcat(" the "); lprcat(lastmonst);
-       if (flag)       /* if the monster was hit */
-         if ((monst==RUSTMONSTER) || (monst==DISENCHANTRESS) || (monst==CUBE))
-               if (c[WIELD]>0)
-                 if (ivenarg[c[WIELD]] > -10)
-                       {
-                       lprintf("\nYour weapon is dulled by the %s",lastmonst); beep();
-                       --ivenarg[c[WIELD]];
-                       }
-       if (flag)  hitm(x,y,damag);
-       if (monst == VAMPIRE) if (hitp[x][y]<25)  { mitem[x][y]=BAT; know[x][y]=0; }
+       /* need at least random chance to hit */
+       if ((rnd(20) < tmp - c[HARDGAME]) || (rnd(71) < 5)) {
+               lprcat("\nYou hit");
+               flag = 1;
+               damag = fullhit(1);
+               if (damag < 9999)
+                       damag = rnd(damag) + 1;
+       } else {
+               lprcat("\nYou missed");
+               flag = 0;
        }
+       lprcat(" the ");
+       lprcat(lastmonst);
+       if (flag)               /* if the monster was hit */
+               if ((monst == RUSTMONSTER) || (monst == DISENCHANTRESS) || (monst == CUBE))
+                       if (c[WIELD] > 0)
+                               if (ivenarg[c[WIELD]] > -10) {
+                                       lprintf("\nYour weapon is dulled by the %s", lastmonst);
+                                       beep();
+                                       --ivenarg[c[WIELD]];
+                               }
+       if (flag)
+               hitm(x, y, damag);
+       if (monst == VAMPIRE)
+               if (hitp[x][y] < 25) {
+                       mitem[x][y] = BAT;
+                       know[x][y] = 0;
+               }
+}
 
 /*
- *     hitm(x,y,amt)           Function to just hit a monster at a given coordinates
- *             int x,y,amt;
+ * hitm(x,y,amt)       Function to just hit a monster at a given coordinates
+ *     int x,y,amt;
  *
- *     Returns the number of hitpoints the monster absorbed
- *     This routine is used to specifically damage a monster at a location (x,y)
- *     Called by hitmonster(x,y)
+ * Returns the number of hitpoints the monster absorbed
+ * This routine is used to specifically damage a monster at a location (x,y)
+ * Called by hitmonster(x,y)
  */
-hitm(x,y,amt)
-       int x,y;
-       register amt;
-       {
-       register int monst;
-       int hpoints,amt2;
-       vxy(&x,&y);     /* verify coordinates are within range */
+static int
+hitm(int x, int y, int amt)
+{
+       int    monst;
+       int    hpoints, amt2;
+       vxy(&x, &y);            /* verify coordinates are within range */
        amt2 = amt;             /* save initial damage so we can return it */
        monst = mitem[x][y];
-       if (c[HALFDAM]) amt >>= 1;      /* if half damage curse adjust damage points */
-       if (amt<=0) amt2 = amt = 1;
-       lasthx=x;  lasthy=y;
-       stealth[x][y]=1;        /* make sure hitting monst breaks stealth condition */
-       c[HOLDMONST]=0; /* hit a monster breaks hold monster spell      */
-       switch(monst) /* if a dragon and orb(s) of dragon slaying       */
-               {
-               case WHITEDRAGON:               case REDDRAGON:                 case GREENDRAGON:
-               case BRONZEDRAGON:              case PLATINUMDRAGON:    case SILVERDRAGON:
-                       amt *= 1+(c[SLAYING]<<1);       break;
-               }
-/* invincible monster fix is here */
+       if (c[HALFDAM])
+               amt >>= 1;      /* if half damage curse adjust damage points */
+       if (amt <= 0)
+               amt2 = amt = 1;
+       lasthx = x;
+       lasthy = y;
+       stealth[x][y] = 1;      /* make sure hitting monst breaks stealth
+                                * condition */
+       c[HOLDMONST] = 0;       /* hit a monster breaks hold monster spell       */
+       switch (monst) {        /* if a dragon and orb(s) of dragon slaying      */
+       case WHITEDRAGON:
+       case REDDRAGON:
+       case GREENDRAGON:
+       case BRONZEDRAGON:
+       case PLATINUMDRAGON:
+       case SILVERDRAGON:
+               amt *= 1 + (c[SLAYING] << 1);
+               break;
+       }
+       /* invincible monster fix is here */
        if (hitp[x][y] > monster[monst].hitpoints)
                hitp[x][y] = monster[monst].hitpoints;
-       if ((hpoints = hitp[x][y]) <= amt)
-               {
+       if ((hpoints = hitp[x][y]) <= amt) {
 #ifdef EXTRA
                c[MONSTKILLED]++;
 #endif
-               lprintf("\nThe %s died!",lastmonst);
-               raiseexperience((long)monster[monst].experience);
-               amt = monster[monst].gold;  if (amt>0) dropgold(rnd(amt)+amt);
-               dropsomething(monst);   disappear(x,y); bottomline();
-               return(hpoints);
-               }
-       hitp[x][y] = hpoints-amt;       return(amt2);
+               lprintf("\nThe %s died!", lastmonst);
+               raiseexperience((long) monster[monst].experience);
+               amt = monster[monst].gold;
+               if (amt > 0)
+                       dropgold(rnd(amt) + amt);
+               dropsomething(monst);
+               disappear(x, y);
+               bottomline();
+               return (hpoints);
        }
+       hitp[x][y] = hpoints - amt;
+       return (amt2);
+}
 
 /*
- *     hitplayer(x,y)          Function for the monster to hit the player from (x,y)
- *             int x,y;
+ * hitplayer(x,y)      Function for the monster to hit the player from (x,y)
+ *     int x,y;
  *
- *     Function for the monster to hit the player with monster at location x,y
- *     Returns nothing of value.
+ * Function for the monster to hit the player with monster at location x,y
+ * Returns nothing of value.
  */
-hitplayer(x,y)
-       int x,y;
-       {
-       register int dam,tmp,mster,bias;
-       vxy(&x,&y);     /* verify coordinates are within range */
+void
+hitplayer(int x, int y)
+{
+       int    dam, tmp, mster, bias;
+       vxy(&x, &y);            /* verify coordinates are within range */
        lastnum = mster = mitem[x][y];
-/*     spirit naga's and poltergeist's do nothing if scarab of negate spirit   */
-       if (c[NEGATESPIRIT] || c[SPIRITPRO])  if ((mster ==POLTERGEIST) || (mster ==SPIRITNAGA))  return;
-/*     if undead and cube of undead control    */
-       if (c[CUBEofUNDEAD] || c[UNDEADPRO]) if ((mster ==VAMPIRE) || (mster ==WRAITH) || (mster ==ZOMBIE)) return;
-       if ((know[x][y]&1) == 0)
-               {
-               know[x][y]=1; show1cell(x,y);
-               }
+       /*
+        * spirit nagas and poltergeists do nothing if scarab of negate
+        * spirit
+        */
+       if (c[NEGATESPIRIT] || c[SPIRITPRO])
+               if ((mster == POLTERGEIST) || (mster == SPIRITNAGA))
+                       return;
+       /* if undead and cube of undead control  */
+       if (c[CUBEofUNDEAD] || c[UNDEADPRO])
+               if ((mster == VAMPIRE) || (mster == WRAITH) || (mster == ZOMBIE))
+                       return;
+       if ((know[x][y] & 1) == 0) {
+               know[x][y] = 1;
+               show1cell(x, y);
+       }
        bias = (c[HARDGAME]) + 1;
        hitflag = hit2flag = hit3flag = 1;
-       yrepcount=0;
-       cursors();      ifblind(x,y);
-       if (c[INVISIBILITY]) if (rnd(33)<20) 
-               {
-               lprintf("\nThe %s misses wildly",lastmonst);    return;
+       yrepcount = 0;
+       cursors();
+       ifblind(x, y);
+       if (c[INVISIBILITY])
+               if (rnd(33) < 20) {
+                       lprintf("\nThe %s misses wildly", lastmonst);
+                       return;
                }
-       if (c[CHARMCOUNT]) if (rnd(30)+5*monster[mster].level-c[CHARISMA]<30)
-               {
-               lprintf("\nThe %s is awestruck at your magnificence!",lastmonst);
-               return;
+       if (c[CHARMCOUNT])
+               if (rnd(30) + 5 * monster[mster].level - c[CHARISMA] < 30) {
+                       lprintf("\nThe %s is awestruck at your magnificence!", lastmonst);
+                       return;
                }
-       if (mster==BAT) dam=1;
-       else
-               {
+       if (mster == BAT)
+               dam = 1;
+       else {
                dam = monster[mster].damage;
-               dam += rnd((int)((dam<1)?1:dam)) + monster[mster].level;
-               }
+               dam += rnd((int) ((dam < 1) ? 1 : dam)) + monster[mster].level;
+       }
        tmp = 0;
-       if (monster[mster].attack>0)
-         if (((dam + bias + 8) > c[AC]) || (rnd((int)((c[AC]>0)?c[AC]:1))==1))
-               { if (spattack(monster[mster].attack,x,y)) { flushall(); return; }
-                 tmp = 1;  bias -= 2; cursors(); }
-       if (((dam + bias) > c[AC]) || (rnd((int)((c[AC]>0)?c[AC]:1))==1))
-               {
-               lprintf("\n  The %s hit you ",lastmonst);       tmp = 1;
-               if ((dam -= c[AC]) < 0) dam=0;
-               if (dam > 0) { losehp(dam); bottomhp(); flushall(); }
+       if (monster[mster].attack > 0)
+               if (((dam + bias + 8) > c[AC]) || (rnd((int) ((c[AC] > 0) ? c[AC] : 1)) == 1)) {
+                       if (spattack(monster[mster].attack, x, y)) {
+                               flushall();
+                               return;
+                       }
+                       tmp = 1;
+                       bias -= 2;
+                       cursors();
+               }
+       if (((dam + bias) > c[AC]) || (rnd((int) ((c[AC] > 0) ? c[AC] : 1)) == 1)) {
+               lprintf("\n  The %s hit you ", lastmonst);
+               tmp = 1;
+               if ((dam -= c[AC]) < 0)
+                       dam = 0;
+               if (dam > 0) {
+                       losehp(dam);
+                       bottomhp();
+                       flushall();
                }
-       if (tmp == 0)  lprintf("\n  The %s missed ",lastmonst);
        }
+       if (tmp == 0)
+               lprintf("\n  The %s missed ", lastmonst);
+}
 
 /*
- *     dropsomething(monst)    Function to create an object when a monster dies
- *             int monst;
+ * dropsomething(monst)        Function to create an object when a monster dies
+ *     int monst;
  *
- *     Function to create an object near the player when certain monsters are killed
- *     Enter with the monster number
- *     Returns nothing of value.
+ * Function to create an object near the player when certain monsters are killed
+ * Enter with the monster number
+ * Returns nothing of value.
  */
-dropsomething(monst)
-       int monst;
-       {
-       switch(monst)
-               {
-               case ORC:                         case NYMPH:      case ELF:      case TROGLODYTE:
-               case TROLL:                       case ROTHE:      case VIOLETFUNGI:
-               case PLATINUMDRAGON:  case GNOMEKING:  case REDDRAGON:
-                       something(level); return;
+static void
+dropsomething(int monst)
+{
+       switch (monst) {
+       case ORC:
+       case NYMPH:
+       case ELF:
+       case TROGLODYTE:
+       case TROLL:
+       case ROTHE:
+       case VIOLETFUNGI:
+       case PLATINUMDRAGON:
+       case GNOMEKING:
+       case REDDRAGON:
+               something(level);
+               return;
 
-               case LEPRECHAUN: if (rnd(101)>=75) creategem();
-                                                if (rnd(5)==1) dropsomething(LEPRECHAUN);   return;
-               }
+       case LEPRECHAUN:
+               if (rnd(101) >= 75)
+                       creategem();
+               if (rnd(5) == 1)
+                       dropsomething(LEPRECHAUN);
+               return;
        }
+}
 
 /*
- *     dropgold(amount)        Function to drop some gold around player
- *             int amount;
+ * dropgold(amount)    Function to drop some gold around player
+ *     int amount;
  *
- *     Enter with the number of gold pieces to drop
- *     Returns nothing of value.
+ * Enter with the number of gold pieces to drop
+ * Returns nothing of value.
  */
-dropgold(amount)
-       register int amount;
-       {
-       if (amount > 250) createitem(OMAXGOLD,amount/100);  else  createitem(OGOLDPILE,amount);
-       }
+void
+dropgold(int amount)
+{
+       if (amount > 250)
+               createitem(OMAXGOLD, amount / 100);
+       else
+               createitem(OGOLDPILE, amount);
+}
 
 /*
- *     something(level)        Function to create a random item around player
- *             int level;
+ * something(level)    Function to create a random item around player
+ *     int level;
  *
- *     Function to create an item from a designed probability around player
- *     Enter with the cave level on which something is to be dropped
- *     Returns nothing of value.
+ * Function to create an item from a designed probability around player
+ * Enter with the cave level on which something is to be dropped
+ * Returns nothing of value.
  */
-something(level)
-       int level;
-       {
-       register int j;
-       int i;
-       if (level<0 || level>MAXLEVEL+MAXVLEVEL) return;        /* correct level? */
-       if (rnd(101)<8) something(level); /* possibly more than one item */
-       j = newobject(level,&i);                createitem(j,i);
-       }
+void
+something(int cavelevel)
+{
+       int    j;
+       int             i;
+       if (cavelevel < 0 || cavelevel > MAXLEVEL + MAXVLEVEL)
+               return;         /* correct level? */
+       if (rnd(101) < 8)
+               something(cavelevel);   /* possibly more than one item */
+       j = newobject(cavelevel, &i);
+       createitem(j, i);
+}
 
 /*
- *     newobject(lev,i)        Routine to return a randomly selected new object
- *             int lev,*i;
+ * newobject(lev,i)    Routine to return a randomly selected new object
+ *     int lev,*i;
  *
- *     Routine to return a randomly selected object to be created
- *     Returns the object number created, and sets *i for its argument
- *     Enter with the cave level and a pointer to the items arg
+ * Routine to return a randomly selected object to be created
+ * Returns the object number created, and sets *i for its argument
+ * Enter with the cave level and a pointer to the items arg
  */
-static char nobjtab[] = { 0, OSCROLL,  OSCROLL,  OSCROLL,  OSCROLL, OPOTION,
-       OPOTION, OPOTION, OPOTION, OGOLDPILE, OGOLDPILE, OGOLDPILE, OGOLDPILE, 
-       OBOOK, OBOOK, OBOOK, OBOOK, ODAGGER, ODAGGER, ODAGGER, OLEATHER, OLEATHER,
-       OLEATHER, OREGENRING, OPROTRING, OENERGYRING, ODEXRING, OSTRRING, OSPEAR,
-       OBELT, ORING, OSTUDLEATHER, OSHIELD, OFLAIL, OCHAIN, O2SWORD, OPLATE,
-       OLONGSWORD };
-
-newobject(lev,i)
-       register int lev,*i;
-       {
-       register int tmp=32,j;
-       if (level<0 || level>MAXLEVEL+MAXVLEVEL) return(0);     /* correct level? */
-       if (lev>6) tmp=37; else if (lev>4) tmp=35; 
-       j = nobjtab[tmp=rnd(tmp)];      /* the object type */
-       switch(tmp)
-               {
-               case 1: case 2: case 3: case 4: *i=newscroll(); break;
-               case 5: case 6: case 7: case 8: *i=newpotion(); break;
-               case 9: case 10: case 11: case 12: *i=rnd((lev+1)*10)+lev*10+10; break;
-               case 13: case 14: case 15: case 16:     *i=lev; break;
-               case 17: case 18: case 19: if (!(*i=newdagger()))  return(0);  break;
-               case 20: case 21: case 22: if (!(*i=newleather()))  return(0);  break;
-               case 23: case 32: case 35: *i=rund(lev/3+1); break;
-               case 24: case 26: *i=rnd(lev/4+1);   break;
-               case 25: *i=rund(lev/4+1); break;
-               case 27: *i=rnd(lev/2+1);   break;
-               case 30: case 33: *i=rund(lev/2+1);   break;
-               case 28: *i=rund(lev/3+1); if (*i==0) return(0); break;
-               case 29: case 31: *i=rund(lev/2+1); if (*i==0) return(0); break;
-               case 34: *i=newchain();         break;
-               case 36: *i=newplate();         break;
-               case 37: *i=newsword();         break; 
-               }
-       return(j);
+static char     nobjtab[] = {
+       0, OSCROLL, OSCROLL, OSCROLL, OSCROLL, OPOTION, OPOTION,
+       OPOTION, OPOTION, OGOLDPILE, OGOLDPILE, OGOLDPILE, OGOLDPILE,
+       OBOOK, OBOOK, OBOOK, OBOOK, ODAGGER, ODAGGER, ODAGGER,
+       OLEATHER, OLEATHER, OLEATHER, OREGENRING, OPROTRING,
+       OENERGYRING, ODEXRING, OSTRRING, OSPEAR, OBELT, ORING,
+       OSTUDLEATHER, OSHIELD, OFLAIL, OCHAIN, O2SWORD, OPLATE,
+       OLONGSWORD};
+
+int
+newobject(int lev, int *i)
+{
+       int    tmp = 32, j;
+       if (level < 0 || level > MAXLEVEL + MAXVLEVEL)
+               return (0);     /* correct level? */
+       if (lev > 6)
+               tmp = 37;
+       else if (lev > 4)
+               tmp = 35;
+       j = nobjtab[tmp = rnd(tmp)];    /* the object type */
+       switch (tmp) {
+       case 1:
+       case 2:
+       case 3:
+       case 4:
+               *i = newscroll();
+               break;
+       case 5:
+       case 6:
+       case 7:
+       case 8:
+               *i = newpotion();
+               break;
+       case 9:
+       case 10:
+       case 11:
+       case 12:
+               *i = rnd((lev + 1) * 10) + lev * 10 + 10;
+               break;
+       case 13:
+       case 14:
+       case 15:
+       case 16:
+               *i = lev;
+               break;
+       case 17:
+       case 18:
+       case 19:
+               if (!(*i = newdagger()))
+                       return (0);
+               break;
+       case 20:
+       case 21:
+       case 22:
+               if (!(*i = newleather()))
+                       return (0);
+               break;
+       case 23:
+       case 32:
+       case 35:
+               *i = rund(lev / 3 + 1);
+               break;
+       case 24:
+       case 26:
+               *i = rnd(lev / 4 + 1);
+               break;
+       case 25:
+               *i = rund(lev / 4 + 1);
+               break;
+       case 27:
+               *i = rnd(lev / 2 + 1);
+               break;
+       case 30:
+       case 33:
+               *i = rund(lev / 2 + 1);
+               break;
+       case 28:
+               *i = rund(lev / 3 + 1);
+               if (*i == 0)
+                       return (0);
+               break;
+       case 29:
+       case 31:
+               *i = rund(lev / 2 + 1);
+               if (*i == 0)
+                       return (0);
+               break;
+       case 34:
+               *i = newchain();
+               break;
+       case 36:
+               *i = newplate();
+               break;
+       case 37:
+               *i = newsword();
+               break;
        }
+       return (j);
+}
 
 /*
- *  spattack(atckno,xx,yy)     Function to process special attacks from monsters
+ *  spattack(atckno,xx,yy) Function to process special attacks from monsters
  *     int atckno,xx,yy;
  *
- *     Enter with the special attack number, and the coordinates (xx,yy)
- *             of the monster that is special attacking
- *     Returns 1 if must do a show1cell(xx,yy) upon return, 0 otherwise
+ * Enter with the special attack number, and the coordinates (xx,yy)
+ *     of the monster that is special attacking
+ * Returns 1 if must do a show1cell(xx,yy) upon return, 0 otherwise
  *
  * atckno   monster     effect
  * ---------------------------------------------------
- *     0       none
- *     1       rust monster    eat armor
- *     2       hell hound              breathe light fire
- *     3       dragon                  breathe fire
- *     4       giant centipede weakening sing
- *     5       white dragon    cold breath
- *     6       wraith                  drain level
- *     7       waterlord               water gusher
- *     8       leprechaun              steal gold
- *     9       disenchantress  disenchant weapon or armor
- *     10      ice lizard              hits with barbed tail
- *     11      umber hulk              confusion
- *     12      spirit naga             cast spells     taken from special attacks
- *     13      platinum dragon psionics
- *     14      nymph                   steal objects
- *     15      bugbear                 bite
- *     16      osequip                 bite
- *
- *     char rustarm[ARMORTYPES][2];
- *     special array for maximum rust damage to armor from rustmonster
- *     format is: { armor type , minimum attribute 
+ * 0   none
+ * 1   rust monster    eat armor
+ * 2   hell hound      breathe light fire
+ * 3   dragon          breathe fire
+ * 4   giant centipede weakening sing
+ * 5   white dragon    cold breath
+ * 6   wraith          drain level
+ * 7   waterlord       water gusher
+ * 8   leprechaun      steal gold
+ * 9   disenchantress  disenchant weapon or armor
+ * 10  ice lizard      hits with barbed tail
+ * 11  umber hulk      confusion
+ * 12  spirit naga     cast spells     taken from special attacks
+ * 13  platinum dragon psionics
+ * 14  nymph           steal objects
+ * 15  bugbear         bite
+ * 16  osequip         bite
+ *
+ * char rustarm[ARMORTYPES][2];
+ * special array for maximum rust damage to armor from rustmonster
+ * format is: { armor type , minimum attribute
  */
 #define ARMORTYPES 6
-static char rustarm[ARMORTYPES][2] = { OSTUDLEATHER,-2,        ORING,-4, OCHAIN,-5,
-       OSPLINT,-6,             OPLATE,-8,              OPLATEARMOR,-9  };
-static char spsel[] = { 1, 2, 3, 5, 6, 8, 9, 11, 13, 14 };
-spattack(x,xx,yy)
-       int x,xx,yy;
-       {
-       register int i,j=0,k,m;
-       register char *p=0;
-       if (c[CANCELLATION]) return(0);
-       vxy(&xx,&yy);   /* verify x & y coordinates */
-       switch(x)
-               {
-               case 1: /* rust your armor, j=1 when rusting has occurred */
-                               m = k = c[WEAR];
-                               if ((i=c[SHIELD]) != -1)
-                                       if (--ivenarg[i] < -1) ivenarg[i]= -1; else j=1;
-                               if ((j==0) && (k != -1))
-                                 {
-                                 m = iven[k];
-                                 for (i=0; i<ARMORTYPES; i++)
-                                       if (m == rustarm[i][0]) /* find his armor in table */
-                                               {
-                                               if (--ivenarg[k]< rustarm[i][1])
-                                                       ivenarg[k]= rustarm[i][1]; else j=1; 
-                                               break;
-                                               }
-                                 }
-                               if (j==0)       /* if rusting did not occur */
-                                 switch(m)
-                                       {
-                                       case OLEATHER:  p = "\nThe %s hit you -- Your lucky you have leather on";
-                                                                       break;
-                                   case OSSPLATE:      p = "\nThe %s hit you -- Your fortunate to have stainless steel armor!";
-                                                                       break;
-                                       }
-                               else  { beep(); p = "\nThe %s hit you -- your armor feels weaker"; }
-                               break;
-
-               case 2:         i = rnd(15)+8-c[AC];
-                       spout:  p="\nThe %s breathes fire at you!";
-                                       if (c[FIRERESISTANCE])
-                                         p="\nThe %s's flame doesn't phase you!";
+static char     rustarm[ARMORTYPES][2] = {
+       { OSTUDLEATHER, -2 },
+       { ORING, -4 },
+       { OCHAIN, -5 },
+       { OSPLINT, -6 },
+       { OPLATE, -8 },
+       { OPLATEARMOR, -9}
+};
+static char     spsel[] = {1, 2, 3, 5, 6, 8, 9, 11, 13, 14};
+static int
+spattack(int x, int xx, int yy)
+{
+       int    i, j = 0, k, m;
+       const char *p = NULL;
+
+       if (c[CANCELLATION])
+               return (0);
+       vxy(&xx, &yy);          /* verify x & y coordinates */
+       switch (x) {
+       case 1:         /* rust your armor, j=1 when rusting has occurred */
+               m = k = c[WEAR];
+               if ((i = c[SHIELD]) != -1) {
+                       if (--ivenarg[i] < -1)
+                               ivenarg[i] = -1;
+                       else
+                               j = 1;
+               }
+               if ((j == 0) && (k != -1)) {
+                       m = iven[k];
+                       for (i = 0; i < ARMORTYPES; i++)
+                               /* find his armor in table */
+                               if (m == rustarm[i][0]) {
+                                       if (--ivenarg[k] < rustarm[i][1])
+                                               ivenarg[k] = rustarm[i][1];
                                        else
-                       spout2: if (p) { lprintf(p,lastmonst); beep(); }
-                                       checkloss(i);
-                                       return(0);
-
-               case 3:         i = rnd(20)+25-c[AC];  goto spout;
-
-               case 4: if (c[STRENGTH]>3)
-                                       {
-                                       p="\nThe %s stung you!  You feel weaker"; beep();
-                                       --c[STRENGTH];
-                                       }
-                               else p="\nThe %s stung you!";
-                               break;
-
-               case 5:         p="\nThe %s blasts you with his cold breath";
-                                       i = rnd(15)+18-c[AC];  goto spout2;
-
-               case 6:         lprintf("\nThe %s drains you of your life energy!",lastmonst);
-                                       loselevel();  beep();  return(0);
-
-               case 7:         p="\nThe %s got you with a gusher!";
-                                       i = rnd(15)+25-c[AC];  goto spout2;
-
-               case 8:         if (c[NOTHEFT]) return(0); /* he has a device of no theft */
-                                       if (c[GOLD])
-                                               {
-                                               p="\nThe %s hit you -- Your purse feels lighter";
-                                               if (c[GOLD]>32767)  c[GOLD]>>=1;
-                                                       else c[GOLD] -= rnd((int)(1+(c[GOLD]>>1)));
-                                               if (c[GOLD] < 0) c[GOLD]=0;
-                                               }
-                                       else  p="\nThe %s couldn't find any gold to steal";
-                                       lprintf(p,lastmonst); disappear(xx,yy); beep();
-                                       bottomgold();  return(1);
-
-               case 9: for(j=50; ; )   /* disenchant */
-                                       {
-                                       i=rund(26);  m=iven[i]; /* randomly select item */
-                                       if (m>0 && ivenarg[i]>0 && m!=OSCROLL && m!=OPOTION)
-                                               {
-                                               if ((ivenarg[i] -= 3)<0) ivenarg[i]=0;
-                                               lprintf("\nThe %s hits you -- you feel a sense of loss",lastmonst);
-                                               srcount=0; beep(); show3(i);  bottomline();  return(0);
-                                               }
-                                       if (--j<=0)
-                                               {
-                                               p="\nThe %s nearly misses"; break;
-                                               }
+                                               j = 1;
                                        break;
-                                       }               
+                               }
+               }
+               if (j == 0)     /* if rusting did not occur */
+                       switch (m) {
+                       case OLEATHER:
+                               p = "\nThe %s hit you -- You're lucky you have leather on";
                                break;
+                       case OSSPLATE:
+                               p = "\nThe %s hit you -- You're fortunate to have stainless steel armor!";
+                               break;
+                       }
+               else {
+                       beep();
+                       p = "\nThe %s hit you -- your armor feels weaker";
+               }
+               break;
 
-               case 10:   p="\nThe %s hit you with his barbed tail";
-                                  i = rnd(25)-c[AC];  goto spout2;
-
-               case 11:        p="\nThe %s has confused you"; beep();
-                                       c[CONFUSE]+= 10+rnd(10);                break;
-
-               case 12:        /*      performs any number of other special attacks    */
-                                       return(spattack(spsel[rund(10)],xx,yy));
-
-               case 13:        p="\nThe %s flattens you with his psionics!";
-                                       i = rnd(15)+30-c[AC];  goto spout2;
-
-               case 14:        if (c[NOTHEFT]) return(0); /* he has device of no theft */
-                                       if (emptyhanded()==1)
-                                         {
-                                         p="\nThe %s couldn't find anything to steal";
-                                         break;
-                                         }
-                                       lprintf("\nThe %s picks your pocket and takes:",lastmonst);
-                                       beep();
-                                       if (stealsomething()==0) lprcat("  nothing"); disappear(xx,yy);
-                                       bottomline();  return(1);
-
-               case 15:        i= rnd(10)+ 5-c[AC];
-                       spout3: p="\nThe %s bit you!";
-                                       goto spout2;
-
-               case 16:        i= rnd(15)+10-c[AC];  goto spout3;
-               };
-       if (p) { lprintf(p,lastmonst); bottomline(); }
-       return(0);
+       case 2:
+               i = rnd(15) + 8 - c[AC];
+spout:         p = "\nThe %s breathes fire at you!";
+               if (c[FIRERESISTANCE])
+                       p = "\nThe %s's flame doesn't faze you!";
+               else
+spout2:        if (p) {
+                       lprintf(p, lastmonst);
+                       beep();
+               }
+               checkloss(i);
+               return (0);
+
+       case 3:
+               i = rnd(20) + 25 - c[AC];
+               goto spout;
+
+       case 4:
+               if (c[STRENGTH] > 3) {
+                       p = "\nThe %s stung you!  You feel weaker";
+                       beep();
+                       --c[STRENGTH];
+               } else
+                       p = "\nThe %s stung you!";
+               break;
+
+       case 5:
+               p = "\nThe %s blasts you with his cold breath";
+               i = rnd(15) + 18 - c[AC];
+               goto spout2;
+
+       case 6:
+               lprintf("\nThe %s drains you of your life energy!", lastmonst);
+               loselevel();
+               beep();
+               return (0);
+
+       case 7:
+               p = "\nThe %s got you with a gusher!";
+               i = rnd(15) + 25 - c[AC];
+               goto spout2;
+
+       case 8:
+               if (c[NOTHEFT])
+                       return (0);     /* he has a device of no theft */
+               if (c[GOLD]) {
+                       p = "\nThe %s hit you -- Your purse feels lighter";
+                       if (c[GOLD] > 32767)
+                               c[GOLD] >>= 1;
+                       else
+                               c[GOLD] -= rnd((int) (1 + (c[GOLD] >> 1)));
+                       if (c[GOLD] < 0)
+                               c[GOLD] = 0;
+               } else
+                       p = "\nThe %s couldn't find any gold to steal";
+               lprintf(p, lastmonst);
+               disappear(xx, yy);
+               beep();
+               bottomgold();
+               return (1);
+
+       case 9:
+               for (j = 50;;) {/* disenchant */
+                       i = rund(26);
+                       m = iven[i];    /* randomly select item */
+                       if (m > 0 && ivenarg[i] > 0 && m != OSCROLL && m != OPOTION) {
+                               if ((ivenarg[i] -= 3) < 0)
+                                       ivenarg[i] = 0;
+                               lprintf("\nThe %s hits you -- you feel a sense of loss", lastmonst);
+                               srcount = 0;
+                               beep();
+                               show3(i);
+                               bottomline();
+                               return (0);
+                       }
+                       if (--j <= 0) {
+                               p = "\nThe %s nearly misses";
+                               break;
+                       }
+                       break;
+               }
+               break;
+
+       case 10:
+               p = "\nThe %s hit you with his barbed tail";
+               i = rnd(25) - c[AC];
+               goto spout2;
+
+       case 11:
+               p = "\nThe %s has confused you";
+               beep();
+               c[CONFUSE] += 10 + rnd(10);
+               break;
+
+       case 12:                /* performs any number of other special
+                                * attacks       */
+               return (spattack(spsel[rund(10)], xx, yy));
+
+       case 13:
+               p = "\nThe %s flattens you with his psionics!";
+               i = rnd(15) + 30 - c[AC];
+               goto spout2;
+
+       case 14:
+               if (c[NOTHEFT])
+                       return (0);     /* he has device of no theft */
+               if (emptyhanded() == 1) {
+                       p = "\nThe %s couldn't find anything to steal";
+                       break;
+               }
+               lprintf("\nThe %s picks your pocket and takes:", lastmonst);
+               beep();
+               if (stealsomething() == 0)
+                       lprcat("  nothing");
+               disappear(xx, yy);
+               bottomline();
+               return (1);
+
+       case 15:
+               i = rnd(10) + 5 - c[AC];
+spout3:        p = "\nThe %s bit you!";
+               goto spout2;
+
+       case 16:
+               i = rnd(15) + 10 - c[AC];
+               goto spout3;
+       };
+       if (p) {
+               lprintf(p, lastmonst);
+               bottomline();
        }
+       return (0);
+}
 
 /*
- *     checkloss(x)    Routine to subtract hp from user and flag bottomline display
- *             int x;
+ * checkloss(x) Routine to subtract hp from user and flag bottomline display
+ *     int x;
  *
- *     Routine to subtract hitpoints from the user and flag the bottomline display
- *     Enter with the number of hit points to lose
- *     Note: if x > c[HP] this routine could kill the player!
+ * Routine to subtract hitpoints from the user and flag the bottomline display
+ * Enter with the number of hit points to lose
+ * Note: if x > c[HP] this routine could kill the player!
  */
-checkloss(x)
-       int x;
-       {
-       if (x>0) { losehp(x);  bottomhp(); }
+void
+checkloss(int x)
+{
+       if (x > 0) {
+               losehp(x);
+               bottomhp();
        }
+}
 
 /*
- *     annihilate()    Routine to annihilate all monsters around player (playerx,playery)
+ * annihilate()        Routine to annihilate all monsters around player (playerx,playery)
  *
- *     Gives player experience, but no dropped objects
- *     Returns the experience gained from all monsters killed
+ * Gives player experience, but no dropped objects
+ * Returns the experience gained from all monsters killed
  */
-annihilate()
-       {
-       int i,j;
-       register long k;
-       register char *p;
-       for (k=0, i=playerx-1; i<=playerx+1; i++)
-         for (j=playery-1; j<=playery+1; j++)
-               if (!vxy(&i,&j)) /* if not out of bounds */
-                       if (*(p= &mitem[i][j])) /* if a monster there */
-                               if (*p<DEMONLORD+2)
-                                       {
-                                       k += monster[*p].experience;    *p=know[i][j]=0;
+int
+annihilate(void)
+{
+       int             i, j;
+       long   k;
+       u_char  *p;
+       for (k = 0, i = playerx - 1; i <= playerx + 1; i++)
+               for (j = playery - 1; j <= playery + 1; j++)
+                       if (!vxy(&i, &j)) {     /* if not out of bounds */
+                               if (*(p = &mitem[i][j])) {      /* if a monster there */
+                                       if (*p < DEMONLORD + 2) {
+                                               k += monster[*p].experience;
+                                               *p = know[i][j] = 0;
+                                       } else {
+                                               lprintf("\nThe %s barely escapes being annihilated!", monster[*p].name);
+                                               hitp[i][j] = (hitp[i][j] >> 1) + 1;     /* lose half hit points */
                                        }
-                               else
-                                       {
-                                       lprintf("\nThe %s barely escapes being annihilated!",monster[*p].name);
-                                       hitp[i][j] = (hitp[i][j]>>1) + 1; /* lose half hit points*/
-                                       }
-       if (k>0)
-               {
-               lprcat("\nYou hear loud screams of agony!");    raiseexperience((long)k);
-               }
-       return(k);
+                               }
+                       }
+       if (k > 0) {
+               lprcat("\nYou hear loud screams of agony!");
+               raiseexperience((long) k);
        }
+       return (k);
+}
 
 /*
- *     newsphere(x,y,dir,lifetime)  Function to create a new sphere of annihilation
- *             int x,y,dir,lifetime;
+ * newsphere(x,y,dir,lifetime)  Function to create a new sphere of annihilation
+ *     int x,y,dir,lifetime;
  *
- *     Enter with the coordinates of the sphere in x,y
- *       the direction (0-8 diroffx format) in dir, and the lifespan of the
- *       sphere in lifetime (in turns)
- *     Returns the number of spheres currently in existence
+ * Enter with the coordinates of the sphere in x,y
+ *   the direction (0-8 diroffx format) in dir, and the lifespan of the
+ *   sphere in lifetime (in turns)
+ * Returns the number of spheres currently in existence
  */
-newsphere(x,y,dir,life)
-       int x,y,dir,life;
-       {
-       int m;
-       struct sphere *sp;
-       if (((sp=(struct sphere *)malloc(sizeof(struct sphere)))) == 0)
-               return(c[SPHCAST]);     /* can't malloc, therefore failure */
-       if (dir>=9) dir=0;      /* no movement if direction not found */
-       if (level==0) vxy(&x,&y);       /* don't go out of bounds */
-       else
-               {
-               if (x<1) x=1;  if (x>=MAXX-1) x=MAXX-2;
-               if (y<1) y=1;  if (y>=MAXY-1) y=MAXY-2;
-               }
-       if ((m=mitem[x][y]) >= DEMONLORD+4)     /* demons dispel spheres */
-               {
-               know[x][y]=1; show1cell(x,y);   /* show the demon (ha ha) */
-               cursors(); lprintf("\nThe %s dispels the sphere!",monster[m].name);
-               beep(); rmsphere(x,y);  /* remove any spheres that are here */
-               return(c[SPHCAST]);
-               }
-       if (m==DISENCHANTRESS) /* disenchantress cancels spheres */
-               {
-               cursors(); lprintf("\nThe %s causes cancellation of the sphere!",monster[m].name); beep();
-boom:  sphboom(x,y);   /* blow up stuff around sphere */
-               rmsphere(x,y);  /* remove any spheres that are here */
-               return(c[SPHCAST]);
-               }
-       if (c[CANCELLATION]) /* cancellation cancels spheres */
-               {
-               cursors(); lprcat("\nAs the cancellation takes effect, you hear a great earth shaking blast!"); beep();
+int
+newsphere(int x, int y, int dir, int life)
+{
+       int             m;
+       struct sphere  *sp;
+       if (((sp = (struct sphere *) malloc(sizeof(struct sphere)))) == 0)
+               return (c[SPHCAST]);    /* can't malloc, therefore failure */
+       if (dir >= 9)
+               dir = 0;        /* no movement if direction not found */
+       if (level == 0)
+               vxy(&x, &y);    /* don't go out of bounds */
+       else {
+               if (x < 1)
+                       x = 1;
+               if (x >= MAXX - 1)
+                       x = MAXX - 2;
+               if (y < 1)
+                       y = 1;
+               if (y >= MAXY - 1)
+                       y = MAXY - 2;
+       }
+       if ((m = mitem[x][y]) >= DEMONLORD + 4) {       /* demons dispel spheres */
+               know[x][y] = 1;
+               show1cell(x, y);/* show the demon (ha ha) */
+               cursors();
+               lprintf("\nThe %s dispels the sphere!", monster[m].name);
+               beep();
+               rmsphere(x, y); /* remove any spheres that are here */
+               free(sp);
+               return (c[SPHCAST]);
+       }
+       if (m == DISENCHANTRESS) {      /* disenchantress cancels spheres */
+               cursors();
+               lprintf("\nThe %s causes cancellation of the sphere!", monster[m].name);
+               beep();
+boom:          sphboom(x, y);  /* blow up stuff around sphere */
+               rmsphere(x, y); /* remove any spheres that are here */
+               free(sp);
+               return (c[SPHCAST]);
+       }
+       if (c[CANCELLATION]) {  /* cancellation cancels spheres */
+               cursors();
+               lprcat("\nAs the cancellation takes effect, you hear a great earth shaking blast!");
+               beep();
                goto boom;
-               }
-       if (item[x][y]==OANNIHILATION) /* collision of spheres detonates spheres */
-               {
-               cursors(); lprcat("\nTwo spheres of annihilation collide! You hear a great earth shaking blast!"); beep();
-               rmsphere(x,y);
+       }
+       if (item[x][y] == OANNIHILATION) {      /* collision of spheres
+                                                * detonates spheres */
+               cursors();
+               lprcat("\nTwo spheres of annihilation collide! You hear a great earth shaking blast!");
+               beep();
+               rmsphere(x, y);
                goto boom;
-               }
-       if (playerx==x && playery==y) /* collision of sphere and player! */
-               {
+       }
+       if (playerx == x && playery == y) {     /* collision of sphere and
+                                                * player! */
                cursors();
                lprcat("\nYou have been enveloped by the zone of nothingness!\n");
-               beep(); rmsphere(x,y);  /* remove any spheres that are here */
-               nap(4000);  died(258);
-               }
-       item[x][y]=OANNIHILATION;  mitem[x][y]=0;  know[x][y]=1;
-       show1cell(x,y); /* show the new sphere */
-       sp->x=x;  sp->y=y;  sp->lev=level;  sp->dir=dir;  sp->lifetime=life;  sp->p=0;
-       if (spheres==0) spheres=sp;     /* if first node in the sphere list */
-       else    /* add sphere to beginning of linked list */
-               {
-               sp->p = spheres;        spheres = sp;
-               }
-       return(++c[SPHCAST]);   /* one more sphere in the world */
+               beep();
+               rmsphere(x, y); /* remove any spheres that are here */
+               nap(4000);
+               died(258);
        }
+       item[x][y] = OANNIHILATION;
+       mitem[x][y] = 0;
+       know[x][y] = 1;
+       show1cell(x, y);        /* show the new sphere */
+       sp->x = x;
+       sp->y = y;
+       sp->lev = level;
+       sp->dir = dir;
+       sp->lifetime = life;
+       sp->p = 0;
+       if (spheres == 0)
+               spheres = sp;   /* if first node in the sphere list */
+       else {                  /* add sphere to beginning of linked list */
+               sp->p = spheres;
+               spheres = sp;
+       }
+       return (++c[SPHCAST]);  /* one more sphere in the world */
+}
 
 /*
- *     rmsphere(x,y)           Function to delete a sphere of annihilation from list
- *             int x,y;
+ * rmsphere(x,y)               Function to delete a sphere of annihilation from list
+ *     int x,y;
  *
- *     Enter with the coordinates of the sphere (on current level)
- *     Returns the number of spheres currently in existence
+ * Enter with the coordinates of the sphere (on current level)
+ * Returns the number of spheres currently in existence
  */
-rmsphere(x,y)
-       int x,y;
-       {
-       register struct sphere *sp,*sp2=0;
-       for (sp=spheres; sp; sp2=sp,sp=sp->p)
-         if (level==sp->lev)   /* is sphere on this level? */
-           if ((x==sp->x) && (y==sp->y))       /* locate sphere at this location */
-                       {
-                       item[x][y]=mitem[x][y]=0;  know[x][y]=1;
-                       show1cell(x,y); /* show the now missing sphere */
-                       --c[SPHCAST];   
-                       if (sp==spheres) { sp2=sp; spheres=sp->p; free((char*)sp2); }
-                       else
-                               { sp2->p = sp->p;  free((char*)sp); }
-                       break;
+int
+rmsphere(int x, int y)
+{
+       struct sphere *sp, *sp2 = 0;
+       for (sp = spheres; sp; sp2 = sp, sp = sp->p)
+               if (level == sp->lev)   /* is sphere on this level? */
+                       if ((x == sp->x) && (y == sp->y)) {     /* locate sphere at this
+                                                                * location */
+                               item[x][y] = mitem[x][y] = 0;
+                               know[x][y] = 1;
+                               show1cell(x, y);        /* show the now missing
+                                                        * sphere */
+                               --c[SPHCAST];
+                               if (sp == spheres) {
+                                       sp2 = sp;
+                                       spheres = sp->p;
+                                       free((char *) sp2);
+                               } else {
+                                       if (sp2)
+                                               sp2->p = sp->p;
+                                       free((char *) sp);
+                               }
+                               break;
                        }
-       return(c[SPHCAST]);     /* return number of spheres in the world */
-       }
+       return (c[SPHCAST]);    /* return number of spheres in the world */
+}
 
 /*
- *     sphboom(x,y)    Function to perform the effects of a sphere detonation
- *             int x,y;
+ * sphboom(x,y)        Function to perform the effects of a sphere detonation
+ *     int x,y;
  *
- *     Enter with the coordinates of the blast, Returns no value
+ * Enter with the coordinates of the blast, Returns no value
  */
-sphboom(x,y)
-       int x,y;
-       {
-       register int i,j;
-       if (c[HOLDMONST]) c[HOLDMONST]=1;
-       if (c[CANCELLATION]) c[CANCELLATION]=1;
-       for (j=max(1,x-2); j<min(x+3,MAXX-1); j++)
-         for (i=max(1,y-2); i<min(y+3,MAXY-1); i++)
-               {
-               item[j][i]=mitem[j][i]=0;
-               show1cell(j,i);
-               if (playerx==j && playery==i)
-                       {
-                       cursors(); beep();
-                       lprcat("\nYou were too close to the sphere!");
-                       nap(3000);
-                       died(283); /* player killed in explosion */
+static void
+sphboom(int x, int y)
+{
+       int    i, j;
+       if (c[HOLDMONST])
+               c[HOLDMONST] = 1;
+       if (c[CANCELLATION])
+               c[CANCELLATION] = 1;
+       for (j = max(1, x - 2); j < min(x + 3, MAXX - 1); j++)
+               for (i = max(1, y - 2); i < min(y + 3, MAXY - 1); i++) {
+                       item[j][i] = mitem[j][i] = 0;
+                       show1cell(j, i);
+                       if (playerx == j && playery == i) {
+                               cursors();
+                               beep();
+                               lprcat("\nYou were too close to the sphere!");
+                               nap(3000);
+                               died(283);      /* player killed in explosion */
                        }
                }
-       }
+}
 
 /*
- *     genmonst()              Function to ask for monster and genocide from game
+ * genmonst()          Function to ask for monster and genocide from game
  *
- *     This is done by setting a flag in the monster[] structure
+ * This is done by setting a flag in the monster[] structure
  */
-genmonst()
-       {
-       register int i,j;
-       cursors();  lprcat("\nGenocide what monster? ");
-       for (i=0; (!isalpha(i)) && (i!=' '); i=getchar());
+static void
+genmonst(void)
+{
+       int    i, j;
+       cursors();
+       lprcat("\nGenocide what monster? ");
+       for (i = 0; (!isalpha(i)) && (i != ' '); i = ttgetch());
        lprc(i);
-       for (j=0; j<MAXMONST; j++)      /* search for the monster type */
-               if (monstnamelist[j]==i)        /* have we found it? */
-                       {
-                       monster[j].genocided=1; /* genocided from game */
-                       lprintf("  There will be no more %s's",monster[j].name);
+       for (j = 0; j < MAXMONST; j++)  /* search for the monster type */
+               if (monstnamelist[j] == i) {    /* have we found it? */
+                       monster[j].genocided = 1;       /* genocided from game */
+                       lprintf("  There will be no more %s's", monster[j].name);
                        /* now wipe out monsters on this level */
-                       newcavelevel(level); draws(0,MAXX,0,MAXY); bot_linex();
+                       newcavelevel(level);
+                       draws(0, MAXX, 0, MAXY);
+                       bot_linex();
                        return;
-                       }
+               }
        lprcat("  You sense failure!");
-       }
-
+}