pc-hack

PC HACK 3.61 source code (archival)
git clone http://frotz.net/git/pc-hack.git
Log | Files | Refs

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 }