]> git.cameronkatri.com Git - bsdgames-darwin.git/blobdiff - hack/hack.trap.c
* Change program logic to not nest needlessly
[bsdgames-darwin.git] / hack / hack.trap.c
index e426dd1ccb98b818d76412de43fe27380cbc23bb..9d7a80586d677d389822df370b389f783e4082e7 100644 (file)
@@ -1,13 +1,79 @@
-/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
-/* hack.trap.c - version 1.0.3 */
+/*     $NetBSD: hack.trap.c,v 1.7 2003/04/02 18:36:41 jsm Exp $        */
 
-#include       "hack.h"
+/*
+ * Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
+ * Amsterdam
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of the Stichting Centrum voor Wiskunde en
+ * Informatica, nor the names of its contributors may be used to endorse or
+ * promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+ * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
 
-extern struct monst *makemon();
+/*
+ * Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
+ * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
 
-char vowels[] = "aeiou";
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: hack.trap.c,v 1.7 2003/04/02 18:36:41 jsm Exp $");
+#endif                         /* not lint */
 
-char *traps[] = {
+#include <stdlib.h>
+#include "hack.h"
+#include "extern.h"
+#include "def.mkroom.h"
+
+const char            vowels[] = "aeiou";
+
+const char           *const traps[] = {
        " bear trap",
        "n arrow trap",
        " dart trap",
@@ -19,11 +85,11 @@ char *traps[] = {
        " mimic"
 };
 
-struct trap *
-maketrap(x,y,typ)
-register x,y,typ;
+struct trap    *
+maketrap(x, y, typ)
+       int x, y, typ;
 {
-       register struct trap *ttmp;
+       struct trap    *ttmp;
 
        ttmp = newtrap();
        ttmp->ttyp = typ;
@@ -33,24 +99,27 @@ register x,y,typ;
        ttmp->ty = y;
        ttmp->ntrap = ftrap;
        ftrap = ttmp;
-       return(ttmp);
+       return (ttmp);
 }
 
-dotrap(trap) register struct trap *trap; {
-       register int ttype = trap->ttyp;
+void
+dotrap(trap)
+       struct trap    *trap;
+{
+       int             ttype = trap->ttyp;
 
        nomul(0);
-       if(trap->tseen && !rn2(5) && ttype != PIT)
+       if (trap->tseen && !rn2(5) && ttype != PIT)
                pline("You escape a%s.", traps[ttype]);
        else {
                trap->tseen = 1;
-               switch(ttype) {
+               switch (ttype) {
                case SLP_GAS_TRAP:
                        pline("A cloud of gas puts you to sleep!");
                        nomul(-rnd(25));
                        break;
                case BEAR_TRAP:
-                       if(Levitation) {
+                       if (Levitation) {
                                pline("You float over a bear trap.");
                                break;
                        }
@@ -60,73 +129,74 @@ dotrap(trap) register struct trap *trap; {
                        break;
                case PIERC:
                        deltrap(trap);
-                       if(makemon(PM_PIERCER,u.ux,u.uy)) {
-                         pline("A piercer suddenly drops from the ceiling!");
-                         if(uarmh)
-                               pline("Its blow glances off your helmet.");
-                         else
-                               (void) thitu(3,d(4,6),"falling piercer");
+                       if (makemon(PM_PIERCER, u.ux, u.uy)) {
+                               pline("A piercer suddenly drops from the ceiling!");
+                               if (uarmh)
+                                       pline("Its blow glances off your helmet.");
+                               else
+                                       (void) thitu(3, d(4, 6), "falling piercer");
                        }
                        break;
                case ARROW_TRAP:
                        pline("An arrow shoots out at you!");
-                       if(!thitu(8,rnd(6),"arrow")){
+                       if (!thitu(8, rnd(6), "arrow")) {
                                mksobj_at(ARROW, u.ux, u.uy);
                                fobj->quan = 1;
                        }
                        break;
                case TRAPDOOR:
-                       if(!xdnstair) {
-pline("A trap door in the ceiling opens and a rock falls on your head!");
-if(uarmh) pline("Fortunately, you are wearing a helmet!");
-                           losehp(uarmh ? 2 : d(2,10),"falling rock");
-                           mksobj_at(ROCK, u.ux, u.uy);
-                           fobj->quan = 1;
-                           stackobj(fobj);
-                           if(Invisible) newsym(u.ux, u.uy);
+                       if (!xdnstair) {
+                               pline("A trap door in the ceiling opens and a rock falls on your head!");
+                               if (uarmh)
+                                       pline("Fortunately, you are wearing a helmet!");
+                               losehp(uarmh ? 2 : d(2, 10), "falling rock");
+                               mksobj_at(ROCK, u.ux, u.uy);
+                               fobj->quan = 1;
+                               stackobj(fobj);
+                               if (Invisible)
+                                       newsym(u.ux, u.uy);
                        } else {
-                           register int newlevel = dlevel + 1;
-                               while(!rn2(4) && newlevel < 29)
+                               int             newlevel = dlevel + 1;
+                               while (!rn2(4) && newlevel < 29)
                                        newlevel++;
                                pline("A trap door opens up under you!");
-                               if(Levitation || u.ustuck) {
-                               pline("For some reason you don't fall in.");
+                               if (Levitation || u.ustuck) {
+                                       pline("For some reason you don't fall in.");
                                        break;
                                }
-
                                goto_level(newlevel, FALSE);
                        }
                        break;
                case DART_TRAP:
                        pline("A little dart shoots out at you!");
-                       if(thitu(7,rnd(3),"little dart")) {
-                           if(!rn2(6))
-                               poisoned("dart","poison dart");
+                       if (thitu(7, rnd(3), "little dart")) {
+                               if (!rn2(6))
+                                       poisoned("dart", "poison dart");
                        } else {
                                mksobj_at(DART, u.ux, u.uy);
                                fobj->quan = 1;
                        }
                        break;
                case TELEP_TRAP:
-                       if(trap->once) {
+                       if (trap->once) {
                                deltrap(trap);
-                               newsym(u.ux,u.uy);
+                               newsym(u.ux, u.uy);
                                vtele();
                        } else {
-                               newsym(u.ux,u.uy);
+                               newsym(u.ux, u.uy);
                                tele();
                        }
                        break;
                case PIT:
-                       if(Levitation) {
+                       if (Levitation) {
                                pline("A pit opens up under you!");
                                pline("You don't fall in!");
                                break;
                        }
                        pline("You fall into a pit!");
-                       u.utrap = rn1(6,2);
+                       u.utrap = rn1(6, 2);
                        u.utraptype = TT_PIT;
-                       losehp(rnd(6),"fall into a pit");
+                       losehp(rnd(6), "fall into a pit");
                        selftouch("Falling, you");
                        break;
                default:
@@ -135,98 +205,104 @@ if(uarmh) pline("Fortunately, you are wearing a helmet!");
        }
 }
 
-mintrap(mtmp) register struct monst *mtmp; {
-       register struct trap *trap = t_at(mtmp->mx, mtmp->my);
-       register int wasintrap = mtmp->mtrapped;
+int
+mintrap(mtmp)
+       struct monst   *mtmp;
+{
+       struct trap    *trap = t_at(mtmp->mx, mtmp->my);
+       int             wasintrap = mtmp->mtrapped;
 
-       if(!trap) {
+       if (!trap) {
                mtmp->mtrapped = 0;     /* perhaps teleported? */
-       } else if(wasintrap) {
-               if(!rn2(40)) mtmp->mtrapped = 0;
+       } else if (wasintrap) {
+               if (!rn2(40))
+                       mtmp->mtrapped = 0;
        } else {
-           register int tt = trap->ttyp;
-           int in_sight = cansee(mtmp->mx,mtmp->my);
-           extern char mlarge[];
+               int             tt = trap->ttyp;
+               int             in_sight = cansee(mtmp->mx, mtmp->my);
 
-           if(mtmp->mtrapseen & (1 << tt)) {
-               /* he has been in such a trap - perhaps he escapes */
-               if(rn2(4)) return(0);
-           }
-           mtmp->mtrapseen |= (1 << tt);
-           switch (tt) {
+               if (mtmp->mtrapseen & (1 << tt)) {
+                       /* he has been in such a trap - perhaps he escapes */
+                       if (rn2(4))
+                               return (0);
+               }
+               mtmp->mtrapseen |= (1 << tt);
+               switch (tt) {
                case BEAR_TRAP:
-                       if(index(mlarge, mtmp->data->mlet)) {
-                               if(in_sight)
-                                 pline("%s is caught in a bear trap!",
-                                       Monnam(mtmp));
-                               else
-                                 if(mtmp->data->mlet == 'o')
-                           pline("You hear the roaring of an angry bear!");
+                       if (strchr(mlarge, mtmp->data->mlet)) {
+                               if (in_sight)
+                                       pline("%s is caught in a bear trap!",
+                                             Monnam(mtmp));
+                               else if (mtmp->data->mlet == 'o')
+                                       pline("You hear the roaring of an angry bear!");
                                mtmp->mtrapped = 1;
                        }
                        break;
                case PIT:
                        /* there should be a mtmp/data -> floating */
-                       if(!index("EywBfk'& ", mtmp->data->mlet)) { /* ab */
+                       if (!strchr("EywBfk'& ", mtmp->data->mlet)) {   /* ab */
                                mtmp->mtrapped = 1;
-                               if(in_sight)
-                                 pline("%s falls in a pit!", Monnam(mtmp));
+                               if (in_sight)
+                                       pline("%s falls in a pit!", Monnam(mtmp));
                        }
                        break;
                case SLP_GAS_TRAP:
-                       if(!mtmp->msleep && !mtmp->mfroz) {
+                       if (!mtmp->msleep && !mtmp->mfroz) {
                                mtmp->msleep = 1;
-                               if(in_sight)
-                                 pline("%s suddenly falls asleep!",
-                                       Monnam(mtmp));
+                               if (in_sight)
+                                       pline("%s suddenly falls asleep!",
+                                             Monnam(mtmp));
                        }
                        break;
                case TELEP_TRAP:
                        rloc(mtmp);
-                       if(in_sight && !cansee(mtmp->mx,mtmp->my))
+                       if (in_sight && !cansee(mtmp->mx, mtmp->my))
                                pline("%s suddenly disappears!",
-                                       Monnam(mtmp));
+                                     Monnam(mtmp));
                        break;
                case ARROW_TRAP:
-                       if(in_sight) {
+                       if (in_sight) {
                                pline("%s is hit by an arrow!",
-                                       Monnam(mtmp));
+                                     Monnam(mtmp));
                        }
                        mtmp->mhp -= 3;
                        break;
                case DART_TRAP:
-                       if(in_sight) {
+                       if (in_sight) {
                                pline("%s is hit by a dart!",
-                                       Monnam(mtmp));
+                                     Monnam(mtmp));
                        }
                        mtmp->mhp -= 2;
                        /* not mondied here !! */
                        break;
                case TRAPDOOR:
-                       if(!xdnstair) {
+                       if (!xdnstair) {
                                mtmp->mhp -= 10;
-                               if(in_sight)
-pline("A trap door in the ceiling opens and a rock hits %s!", monnam(mtmp));
+                               if (in_sight)
+                                       pline("A trap door in the ceiling opens and a rock hits %s!", monnam(mtmp));
                                break;
                        }
-                       if(mtmp->data->mlet != 'w'){
+                       if (mtmp->data->mlet != 'w') {
                                fall_down(mtmp);
-                               if(in_sight)
-               pline("Suddenly, %s disappears out of sight.", monnam(mtmp));
-                               return(2);      /* no longer on this level */
+                               if (in_sight)
+                                       pline("Suddenly, %s disappears out of sight.", monnam(mtmp));
+                               return (2);     /* no longer on this level */
                        }
                        break;
                case PIERC:
                        break;
                default:
                        impossible("Some monster encountered a strange trap.");
-           }
+               }
        }
-       return(mtmp->mtrapped);
+       return (mtmp->mtrapped);
 }
 
-selftouch(arg) char *arg; {
-       if(uwep && uwep->otyp == DEAD_COCKATRICE){
+void
+selftouch(arg)
+       const char           *arg;
+{
+       if (uwep && uwep->otyp == DEAD_COCKATRICE) {
                pline("%s touch the dead cockatrice.", arg);
                pline("You turn to stone.");
                killer = objects[uwep->otyp].oc_name;
@@ -234,9 +310,11 @@ selftouch(arg) char *arg; {
        }
 }
 
-float_up(){
-       if(u.utrap) {
-               if(u.utraptype == TT_PIT) {
+void
+float_up()
+{
+       if (u.utrap) {
+               if (u.utraptype == TT_PIT) {
                        u.utrap = 0;
                        pline("You float up, out of the pit!");
                } else {
@@ -246,132 +324,151 @@ float_up(){
                pline("You start to float in the air!");
 }
 
-float_down(){
-       register struct trap *trap;
+void
+float_down()
+{
+       struct trap    *trap;
        pline("You float gently to the ground.");
-       if(trap = t_at(u.ux,u.uy))
-               switch(trap->ttyp) {
+       if ((trap = t_at(u.ux, u.uy)) != NULL)
+               switch (trap->ttyp) {
                case PIERC:
                        break;
                case TRAPDOOR:
-                       if(!xdnstair || u.ustuck) break;
+                       if (!xdnstair || u.ustuck)
+                               break;
                        /* fall into next case */
                default:
                        dotrap(trap);
-       }
+               }
        pickup(1);
 }
 
-vtele() {
-#include "def.mkroom.h"
-       register struct mkroom *croom;
-       for(croom = &rooms[0]; croom->hx >= 0; croom++)
-           if(croom->rtype == VAULT) {
-               register x,y;
+void
+vtele()
+{
+       struct mkroom  *croom;
+       for (croom = &rooms[0]; croom->hx >= 0; croom++)
+               if (croom->rtype == VAULT) {
+                       int x, y;
 
-               x = rn2(2) ? croom->lx : croom->hx;
-               y = rn2(2) ? croom->ly : croom->hy;
-               if(teleok(x,y)) {
-                   teleds(x,y);
-                   return;
+                       x = rn2(2) ? croom->lx : croom->hx;
+                       y = rn2(2) ? croom->ly : croom->hy;
+                       if (teleok(x, y)) {
+                               teleds(x, y);
+                               return;
+                       }
                }
-           }
        tele();
 }
 
-tele() {
-       extern coord getpos();
-       coord cc;
-       register int nux,nuy;
+void
+tele()
+{
+       coord           cc;
+       int             nux, nuy;
 
-       if(Teleport_control) {
+       if (Teleport_control) {
                pline("To what position do you want to be teleported?");
-               cc = getpos(1, "the desired position"); /* 1: force valid */
-               /* possible extensions: introduce a small error if
-                  magic power is low; allow transfer to solid rock */
-               if(teleok(cc.x, cc.y)){
+               cc = getpos(1, "the desired position"); /* 1: force valid */
+               /*
+                * possible extensions: introduce a small error if magic
+                * power is low; allow transfer to solid rock
+                */
+               if (teleok(cc.x, cc.y)) {
                        teleds(cc.x, cc.y);
                        return;
                }
                pline("Sorry ...");
        }
        do {
-               nux = rnd(COLNO-1);
+               nux = rnd(COLNO - 1);
                nuy = rn2(ROWNO);
-       } while(!teleok(nux, nuy));
+       } while (!teleok(nux, nuy));
        teleds(nux, nuy);
 }
 
+void
 teleds(nux, nuy)
-register int nux,nuy;
+       int             nux, nuy;
 {
-       if(Punished) unplacebc();
+       if (Punished)
+               unplacebc();
        unsee();
        u.utrap = 0;
        u.ustuck = 0;
        u.ux = nux;
        u.uy = nuy;
        setsee();
-       if(Punished) placebc(1);
-       if(u.uswallow){
+       if (Punished)
+               placebc(1);
+       if (u.uswallow) {
                u.uswldtim = u.uswallow = 0;
                docrt();
        }
        nomul(0);
-       if(levl[nux][nuy].typ == POOL && !Levitation)
+       if (levl[nux][nuy].typ == POOL && !Levitation)
                drown();
        (void) inshop();
        pickup(1);
-       if(!Blind) read_engr_at(u.ux,u.uy);
+       if (!Blind)
+               read_engr_at(u.ux, u.uy);
 }
 
-teleok(x,y) register int x,y; {        /* might throw him into a POOL */
-       return( isok(x,y) && !IS_ROCK(levl[x][y].typ) && !m_at(x,y) &&
-               !sobj_at(ENORMOUS_ROCK,x,y) && !t_at(x,y)
-       );
+int
+teleok(x, y)
+       int             x, y;
+{                              /* might throw him into a POOL */
+       return (isok(x, y) && !IS_ROCK(levl[x][y].typ) && !m_at(x, y) &&
+               !sobj_at(ENORMOUS_ROCK, x, y) && !t_at(x, y)
+               );
        /* Note: gold is permitted (because of vaults) */
 }
 
-dotele() {
-       extern char pl_character[];
-
-       if(
+int
+dotele()
+{
+       if (
 #ifdef WIZARD
-          !wizard &&
-#endif WIZARD
-                     (!Teleportation || u.ulevel < 6 ||
-                       (pl_character[0] != 'W' && u.ulevel < 10))) {
+           !wizard &&
+#endif /* WIZARD */
+           (!Teleportation || u.ulevel < 6 ||
+            (pl_character[0] != 'W' && u.ulevel < 10))) {
                pline("You are not able to teleport at will.");
-               return(0);
+               return (0);
        }
-       if(u.uhunger <= 100 || u.ustr < 6) {
+       if (u.uhunger <= 100 || u.ustr < 6) {
                pline("You miss the strength for a teleport spell.");
-               return(1);
+               return (1);
        }
        tele();
        morehungry(100);
-       return(1);
+       return (1);
 }
 
-placebc(attach) int attach; {
-       if(!uchain || !uball){
+void
+placebc(attach)
+       int             attach;
+{
+       if (!uchain || !uball) {
                impossible("Where are your chain and ball??");
                return;
        }
        uball->ox = uchain->ox = u.ux;
        uball->oy = uchain->oy = u.uy;
-       if(attach){
+       if (attach) {
                uchain->nobj = fobj;
                fobj = uchain;
-               if(!carried(uball)){
+               if (!carried(uball)) {
                        uball->nobj = fobj;
                        fobj = uball;
                }
        }
 }
 
-unplacebc(){
-       if(!carried(uball)){
+void
+unplacebc()
+{
+       if (!carried(uball)) {
                freeobj(uball);
                unpobj(uball);
        }
@@ -379,67 +476,76 @@ unplacebc(){
        unpobj(uchain);
 }
 
-level_tele() {
-register int newlevel;
-       if(Teleport_control) {
-           char buf[BUFSZ];
+void
+level_tele()
+{
+       int             newlevel;
+       if (Teleport_control) {
+               char            buf[BUFSZ];
 
-           do {
-             pline("To what level do you want to teleport? [type a number] ");
-             getlin(buf);
-           } while(!digit(buf[0]) && (buf[0] != '-' || !digit(buf[1])));
-           newlevel = atoi(buf);
+               do {
+                       pline("To what level do you want to teleport? [type a number] ");
+                       getlin(buf);
+               } while (!digit(buf[0]) && (buf[0] != '-' || !digit(buf[1])));
+               newlevel = atoi(buf);
        } else {
-           newlevel  = 5 + rn2(20);    /* 5 - 24 */
-           if(dlevel == newlevel)
-               if(!xdnstair) newlevel--; else newlevel++;
+               newlevel = 5 + rn2(20); /* 5 - 24 */
+               if (dlevel == newlevel) {
+                       if (!xdnstair)
+                               newlevel--;
+                       else
+                               newlevel++;
+               }
        }
-       if(newlevel >= 30) {
-           if(newlevel > MAXLEVEL) newlevel = MAXLEVEL;
-           pline("You arrive at the center of the earth ...");
-           pline("Unfortunately it is here that hell is located.");
-           if(Fire_resistance) {
-               pline("But the fire doesn't seem to harm you.");
-           } else {
-               pline("You burn to a crisp.");
-               dlevel = maxdlevel = newlevel;
-               killer = "visit to the hell";
-               done("burned");
-           }
+       if (newlevel >= 30) {
+               if (newlevel > MAXLEVEL)
+                       newlevel = MAXLEVEL;
+               pline("You arrive at the center of the earth ...");
+               pline("Unfortunately it is here that hell is located.");
+               if (Fire_resistance) {
+                       pline("But the fire doesn't seem to harm you.");
+               } else {
+                       pline("You burn to a crisp.");
+                       dlevel = maxdlevel = newlevel;
+                       killer = "visit to the hell";
+                       done("burned");
+               }
        }
-       if(newlevel < 0) {
-           newlevel = 0;
-           pline("You are now high above the clouds ...");
-           if(Levitation) {
-               pline("You float gently down to earth.");
-               done("escaped");
-           }
-           pline("Unfortunately, you don't know how to fly.");
-           pline("You fall down a few thousand feet and break your neck.");
-           dlevel = 0;
-           killer = "fall";
-           done("died");
+       if (newlevel < 0) {
+               newlevel = 0;
+               pline("You are now high above the clouds ...");
+               if (Levitation) {
+                       pline("You float gently down to earth.");
+                       done("escaped");
+               }
+               pline("Unfortunately, you don't know how to fly.");
+               pline("You fall down a few thousand feet and break your neck.");
+               dlevel = 0;
+               killer = "fall";
+               done("died");
        }
-
-       goto_level(newlevel, FALSE); /* calls done("escaped") if newlevel==0 */
+       goto_level(newlevel, FALSE);    /* calls done("escaped") if
+                                        * newlevel==0 */
 }
 
+void
 drown()
 {
        pline("You fall into a pool!");
        pline("You can't swim!");
-       if(rn2(3) < u.uluck+2) {
+       if (rn2(3) < u.uluck + 2) {
                /* most scrolls become unreadable */
-               register struct obj *obj;
+               struct obj     *obj;
 
-               for(obj = invent; obj; obj = obj->nobj)
-                       if(obj->olet == SCROLL_SYM && rn2(12) > u.uluck)
+               for (obj = invent; obj; obj = obj->nobj)
+                       if (obj->olet == SCROLL_SYM && rn2(12) > u.uluck)
                                obj->otyp = SCR_BLANK_PAPER;
                /* we should perhaps merge these scrolls ? */
 
                pline("You attempt a teleport spell."); /* utcsri!carroll */
                (void) dotele();
-               if(levl[u.ux][u.uy].typ != POOL) return;
+               if (levl[u.ux][u.uy].typ != POOL)
+                       return;
        }
        pline("You drown ...");
        killer = "pool of water";