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