Home | History | Annotate | Line # | Download | only in hack
      1 /*	$NetBSD: hack.bones.c,v 1.9 2011/07/20 07:04:30 dholland 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 (at) 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.9 2011/07/20 07:04:30 dholland Exp $");
     67 #endif				/* not lint */
     68 
     69 #include <fcntl.h>
     70 #include <unistd.h>
     71 #include "hack.h"
     72 #include "extern.h"
     73 
     74 static char bones[] = "bones_xx";
     75 
     76 /* save bones and possessions of a deceased adventurer */
     77 void
     78 savebones(void)
     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(void)
    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 }
    177