
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: }