(linenum→info "unix/slp.c:2238")

bsd-games/2.17/hack/hack.bones.c

    1: /*      $NetBSD: hack.bones.c,v 1.6 2003/04/02 18:36:35 jsm Exp $    */
    2: 
    3: /*
    4:  * Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
    5:  * Amsterdam
    6:  * All rights reserved.
    7:  *
    8:  * Redistribution and use in source and binary forms, with or without
    9:  * modification, are permitted provided that the following conditions are
   10:  * met:
   11:  *
   12:  * - Redistributions of source code must retain the above copyright notice,
   13:  * this list of conditions and the following disclaimer.
   14:  *
   15:  * - Redistributions in binary form must reproduce the above copyright
   16:  * notice, this list of conditions and the following disclaimer in the
   17:  * documentation and/or other materials provided with the distribution.
   18:  *
   19:  * - Neither the name of the Stichting Centrum voor Wiskunde en
   20:  * Informatica, nor the names of its contributors may be used to endorse or
   21:  * promote products derived from this software without specific prior
   22:  * written permission.
   23:  *
   24:  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
   25:  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
   26:  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
   27:  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
   28:  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
   29:  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
   30:  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
   31:  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
   32:  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
   33:  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
   34:  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   35:  */
   36: 
   37: /*
   38:  * Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
   39:  * All rights reserved.
   40:  *
   41:  * Redistribution and use in source and binary forms, with or without
   42:  * modification, are permitted provided that the following conditions
   43:  * are met:
   44:  * 1. Redistributions of source code must retain the above copyright
   45:  *    notice, this list of conditions and the following disclaimer.
   46:  * 2. Redistributions in binary form must reproduce the above copyright
   47:  *    notice, this list of conditions and the following disclaimer in the
   48:  *    documentation and/or other materials provided with the distribution.
   49:  * 3. The name of the author may not be used to endorse or promote products
   50:  *    derived from this software without specific prior written permission.
   51:  *
   52:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
   53:  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
   54:  * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
   55:  * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
   56:  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
   57:  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
   58:  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
   59:  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
   60:  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
   61:  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   62:  */
   63: 
   64: #include <sys/cdefs.h>
   65: #ifndef lint
   66: __RCSID("$NetBSD: hack.bones.c,v 1.6 2003/04/02 18:36:35 jsm Exp $");
   67: #endif                          /* not lint */
   68: 
   69: #include "hack.h"
   70: #include "extern.h"
   71: #include <fcntl.h>
   72: #include <unistd.h>
   73: 
   74: char            bones[] = "bones_xx";
   75: 
   76: /* save bones and possessions of a deceased adventurer */
   77: void
   78: savebones()
   79: {
   80:         int fd;
   81:         struct obj *otmp;
   82:         struct trap *ttmp;
   83:         struct monst *mtmp;
   84: 
   85:         if (dlevel <= 0 || dlevel > MAXLEVEL)
   86:                 return;
   87:         if (!rn2(1 + dlevel / 2))
   88:                 return;               /* not so many ghosts on low levels */
   89:         bones[6] = '0' + (dlevel / 10);
   90:         bones[7] = '0' + (dlevel % 10);
   91:         if ((fd = open(bones, O_RDONLY)) >= 0) {
   92:                 (void) close(fd);
   93:                 return;
   94:         }
   95:         /* drop everything; the corpse's possessions are usually cursed */
   96:         otmp = invent;
   97:         while (otmp) {
   98:                 otmp->ox = u.ux;
   99:                 otmp->oy = u.uy;
  100:                 otmp->age = 0;        /* very long ago */
  101:                 otmp->owornmask = 0;
  102:                 if (rn2(5))
  103:                         otmp->cursed = 1;
  104:                 if (!otmp->nobj) {
  105:                         otmp->nobj = fobj;
  106:                         fobj = invent;
  107:                         invent = 0;  /* superfluous */
  108:                         break;
  109:                 }
  110:                 otmp = otmp->nobj;
  111:         }
  112:         if (!(mtmp = makemon(PM_GHOST, u.ux, u.uy)))
  113:                 return;
  114:         mtmp->mx = u.ux;
  115:         mtmp->my = u.uy;
  116:         mtmp->msleep = 1;
  117:         (void) strcpy((char *) mtmp->mextra, plname);
  118:         mkgold(somegold() + d(dlevel, 30), u.ux, u.uy);
  119:         for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
  120:                 mtmp->m_id = 0;
  121:                 if (mtmp->mtame) {
  122:                         mtmp->mtame = 0;
  123:                         mtmp->mpeaceful = 0;
  124:                 }
  125:                 mtmp->mlstmv = 0;
  126:                 if (mtmp->mdispl)
  127:                         unpmon(mtmp);
  128:         }
  129:         for (ttmp = ftrap; ttmp; ttmp = ttmp->ntrap)
  130:                 ttmp->tseen = 0;
  131:         for (otmp = fobj; otmp; otmp = otmp->nobj) {
  132:                 otmp->o_id = 0;
  133:                 /* otmp->o_cnt_id = 0; - superfluous */
  134:                 otmp->onamelth = 0;
  135:                 otmp->known = 0;
  136:                 otmp->invlet = 0;
  137:                 if (otmp->olet == AMULET_SYM && !otmp->spe) {
  138:                         otmp->spe = -1;      /* no longer the actual amulet */
  139:                         otmp->cursed = 1;    /* flag as gotten from a
  140:                                                  * ghost */
  141:                 }
  142:         }
  143:         if ((fd = creat(bones, FMASK)) < 0)
  144:                 return;
  145:         savelev(fd, dlevel);
  146:         (void) close(fd);
  147: }
  148: 
  149: int
  150: getbones()
  151: {
  152:         int fd, x, y, ok;
  153: 
  154:         if (rn2(3))
  155:                 return (0);   /* only once in three times do we find bones */
  156:         bones[6] = '0' + dlevel / 10;
  157:         bones[7] = '0' + dlevel % 10;
  158:         if ((fd = open(bones, O_RDONLY)) < 0)
  159:                 return (0);
  160:         if ((ok = uptodate(fd)) != 0) {
  161:                 getlev(fd, 0, dlevel);
  162:                 for (x = 0; x < COLNO; x++)
  163:                         for (y = 0; y < ROWNO; y++)
  164:                                 levl[x][y].seen = levl[x][y].new = 0;
  165:         }
  166:         (void) close(fd);
  167: #ifdef WIZARD
  168:         if (!wizard)           /* duvel!frans: don't remove bones while
  169:                                  * debugging */
  170: #endif  /* WiZARD */
  171:                 if (unlink(bones) < 0) {
  172:                         pline("Cannot unlink %s .", bones);
  173:                         return (0);
  174:                 }
  175:         return (ok);
  176: }
Syntax (Markdown)