1 /* $NetBSD: hack.bones.c,v 1.5 2001/03/25 20:43:59 jsm Exp $ */ 2 3 /* 4 * Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. 5 */ 6 7 #include <sys/cdefs.h> 8 #ifndef lint 9 __RCSID("$NetBSD: hack.bones.c,v 1.5 2001/03/25 20:43:59 jsm Exp $"); 10 #endif /* not lint */ 11 12 #include "hack.h" 13 #include "extern.h" 14 #include <fcntl.h> 15 #include <unistd.h> 16 17 char bones[] = "bones_xx"; 18 19 /* save bones and possessions of a deceased adventurer */ 20 void 21 savebones() 22 { 23 int fd; 24 struct obj *otmp; 25 struct trap *ttmp; 26 struct monst *mtmp; 27 28 if (dlevel <= 0 || dlevel > MAXLEVEL) 29 return; 30 if (!rn2(1 + dlevel / 2)) 31 return; /* not so many ghosts on low levels */ 32 bones[6] = '0' + (dlevel / 10); 33 bones[7] = '0' + (dlevel % 10); 34 if ((fd = open(bones, O_RDONLY)) >= 0) { 35 (void) close(fd); 36 return; 37 } 38 /* drop everything; the corpse's possessions are usually cursed */ 39 otmp = invent; 40 while (otmp) { 41 otmp->ox = u.ux; 42 otmp->oy = u.uy; 43 otmp->age = 0; /* very long ago */ 44 otmp->owornmask = 0; 45 if (rn2(5)) 46 otmp->cursed = 1; 47 if (!otmp->nobj) { 48 otmp->nobj = fobj; 49 fobj = invent; 50 invent = 0; /* superfluous */ 51 break; 52 } 53 otmp = otmp->nobj; 54 } 55 if (!(mtmp = makemon(PM_GHOST, u.ux, u.uy))) 56 return; 57 mtmp->mx = u.ux; 58 mtmp->my = u.uy; 59 mtmp->msleep = 1; 60 (void) strcpy((char *) mtmp->mextra, plname); 61 mkgold(somegold() + d(dlevel, 30), u.ux, u.uy); 62 for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) { 63 mtmp->m_id = 0; 64 if (mtmp->mtame) { 65 mtmp->mtame = 0; 66 mtmp->mpeaceful = 0; 67 } 68 mtmp->mlstmv = 0; 69 if (mtmp->mdispl) 70 unpmon(mtmp); 71 } 72 for (ttmp = ftrap; ttmp; ttmp = ttmp->ntrap) 73 ttmp->tseen = 0; 74 for (otmp = fobj; otmp; otmp = otmp->nobj) { 75 otmp->o_id = 0; 76 /* otmp->o_cnt_id = 0; - superfluous */ 77 otmp->onamelth = 0; 78 otmp->known = 0; 79 otmp->invlet = 0; 80 if (otmp->olet == AMULET_SYM && !otmp->spe) { 81 otmp->spe = -1; /* no longer the actual amulet */ 82 otmp->cursed = 1; /* flag as gotten from a 83 * ghost */ 84 } 85 } 86 if ((fd = creat(bones, FMASK)) < 0) 87 return; 88 savelev(fd, dlevel); 89 (void) close(fd); 90 } 91 92 int 93 getbones() 94 { 95 int fd, x, y, ok; 96 97 if (rn2(3)) 98 return (0); /* only once in three times do we find bones */ 99 bones[6] = '0' + dlevel / 10; 100 bones[7] = '0' + dlevel % 10; 101 if ((fd = open(bones, O_RDONLY)) < 0) 102 return (0); 103 if ((ok = uptodate(fd)) != 0) { 104 getlev(fd, 0, dlevel); 105 for (x = 0; x < COLNO; x++) 106 for (y = 0; y < ROWNO; y++) 107 levl[x][y].seen = levl[x][y].new = 0; 108 } 109 (void) close(fd); 110 #ifdef WIZARD 111 if (!wizard) /* duvel!frans: don't remove bones while 112 * debugging */ 113 #endif /* WiZARD */ 114 if (unlink(bones) < 0) { 115 pline("Cannot unlink %s .", bones); 116 return (0); 117 } 118 return (ok); 119 } 120