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