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