home *** CD-ROM | disk | FTP | other *** search
/ Gold Fish 1 / GoldFishApril1994_CD1.img / d1xx / d190 / nethack / een.zoo / bones.c < prev    next >
C/C++ Source or Header  |  1988-08-04  |  4KB  |  194 lines

  1. /*    SCCS Id: @(#)bones.c    1.4    87/08/08
  2. /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  3. /* bones.c - version 1.0.3 */
  4.  
  5. #include "hack.h"
  6.  
  7. extern char plname[PL_NSIZ];
  8. extern long somegold();
  9. extern struct monst *makemon();
  10. extern struct permonst pm_ghost;
  11.  
  12. #ifdef DGK
  13. char bones[FILENAME];
  14. #else
  15. char bones[] = "bones_xx";
  16. #endif
  17.  
  18. /* save bones and possessions of a deceased adventurer */
  19. savebones(){
  20. register fd;
  21. register struct obj *otmp;
  22. register struct trap *ttmp;
  23. register struct monst *mtmp;
  24.     if(dlevel <= 0 || dlevel > MAXLEVEL) return;
  25.     if(!rn2(1 + dlevel/2)    /* not so many ghosts on low levels */
  26. #ifdef WIZARD
  27.     && !wizard
  28. #endif
  29.     ) return;
  30. #ifdef DGK
  31.     name_file(bones, dlevel);
  32. #else
  33.     bones[6] = '0' + (dlevel/10);
  34.     bones[7] = '0' + (dlevel%10);
  35. #endif
  36.     if((fd = open(bones,0)) >= 0){
  37.     (void) close(fd);
  38. #ifdef WIZARD
  39.     if(wizard)
  40.         pline("Bones file already exists.");
  41. #endif
  42.     return;
  43.     }
  44.     /* drop everything; the corpse's possessions are usually cursed */
  45.     otmp = invent;
  46.     while(otmp){
  47.     otmp->ox = u.ux;
  48.     otmp->oy = u.uy;
  49.     otmp->age = 0;          /* very long ago */
  50.     otmp->owornmask = 0;
  51.     if(rn2(5)) otmp->cursed = 1;
  52.     if(!otmp->nobj){
  53.         otmp->nobj = fobj;
  54.         fobj = invent;
  55.         invent = 0;    /* superfluous */
  56.         break;
  57.     }
  58.     otmp = otmp->nobj;
  59.     }
  60.     /* spill any contained objects - added by GAN 03/23/87 */
  61.     otmp = fcobj;
  62.     while(otmp)  {
  63.     register struct obj *otmp2;
  64.  
  65.     otmp2 = otmp->nobj;
  66.     spill_obj(otmp);
  67.     otmp = otmp2;
  68.     }
  69.     if(!(mtmp = makemon(PM_GHOST, u.ux, u.uy))) return;
  70.     mtmp->mx = u.ux;
  71.     mtmp->my = u.uy;
  72.     mtmp->msleep = 1;
  73.     (void) strcpy((char *) mtmp->mextra, plname);
  74.     mkgold(somegold() + d(dlevel,30), u.ux, u.uy);
  75.     for(mtmp = fmon; mtmp; mtmp = mtmp->nmon){
  76.     mtmp->m_id = 0;
  77.     if(mtmp->mtame) {
  78.         mtmp->mtame = 0;
  79.         mtmp->mpeaceful = 0;
  80.     }
  81.     mtmp->mlstmv = 0;
  82.     if(mtmp->mdispl) unpmon(mtmp);
  83.     }
  84.     for(ttmp = ftrap; ttmp; ttmp = ttmp->ntrap)
  85.     ttmp->tseen = 0;
  86.     for(otmp = fobj; otmp; otmp = otmp->nobj) {
  87.     otmp->o_id = 0;
  88.      /* otmp->o_cnt_id = 0; - superfluous */
  89.     otmp->onamelth = 0;
  90.     otmp->known = 0;
  91.     otmp->invlet = 0;
  92.     if(otmp->olet == AMULET_SYM && !otmp->spe) {
  93.         otmp->spe = -1;     /* no longer the actual amulet */
  94.         otmp->cursed = 1;     /* flag as gotten from a ghost */
  95.     }
  96.     }
  97. #ifdef DGK
  98.     fd = open(bones, O_WRONLY | O_BINARY | O_CREAT | O_TRUNC, FMASK);
  99. #else
  100.     fd = creat(bones, FMASK);
  101. #endif
  102.     if(fd < 0) {
  103. #ifdef WIZARD
  104.     if(wizard)
  105.         pline("Cannot create bones file - creat failed");
  106. #endif
  107.     return;
  108.     }
  109. #ifdef DGK
  110.     savelev(fd,dlevel, COUNT | WRITE);
  111. #else
  112.     savelev(fd,dlevel);
  113. #endif
  114. #ifdef COMPRESS
  115.     bflush(fd);
  116. #endif
  117.     (void) close(fd);
  118. }
  119.  
  120. /*
  121.  * "spill" object out of box onto floor
  122.  */
  123. spill_obj(obj)
  124. struct obj *obj;
  125. {
  126.     struct obj *otmp;
  127.  
  128.     for(otmp = fobj; otmp; otmp = otmp->nobj)
  129.     if(obj->o_cnt_id == otmp->o_id)  {
  130.         obj->ox = otmp->ox;
  131.         obj->oy = otmp->oy;
  132.         obj->age = 0;
  133.         if(rn2(5))
  134.         obj->cursed = 1;
  135.         obj->nobj = otmp->nobj;
  136.         otmp->nobj = obj;
  137.         return;
  138.     }
  139. }
  140.  
  141. getbones(){
  142. register fd,x,y,ok;
  143.     /* wizard check added by GAN 02/05/87 */
  144.     if(rn2(3)    /* only once in three times do we find bones */
  145. #ifdef WIZARD
  146.     && !wizard
  147. #endif
  148.     ) return(0);
  149. #ifdef DGK
  150.     name_file(bones, dlevel);
  151. #else
  152.     bones[6] = '0' + dlevel/10;
  153.     bones[7] = '0' + dlevel%10;
  154. #endif
  155.     if((fd = open(bones, 0)) < 0) return(0);
  156.     if((ok = uptodate(fd)) != 0){
  157. #ifdef WIZARD
  158.     if(wizard)  {
  159.         char buf[BUFSZ];
  160.         pline("Get bones? ");
  161.         getlin(buf);
  162.         if(buf[0] == 'n')  {
  163.         (void) close(fd);
  164.         return(0);
  165.         }
  166.     }
  167. #endif
  168. #ifdef COMPRESS
  169.     minit();
  170. #endif
  171.     getlev(fd, 0, dlevel);
  172.     for(x = 0; x < COLNO; x++) for(y = 0; y < ROWNO; y++) {
  173.         /* levl[x][y].seen = levl[x][y].new = 0; */
  174.         RM_CLR_SEEN(levl[x][y]);
  175.         RM_CLR_NEW(levl[x][y]);
  176.     }
  177.     }
  178.     (void) close(fd);
  179. #ifdef WIZARD
  180.     if(wizard)  {
  181.     char buf[BUFSZ];
  182.     pline("Unlink bones? ");
  183.     getlin(buf);
  184.     if(buf[0] == 'n')
  185.         return(ok);
  186.     }
  187. #endif
  188.     if(unlink(bones) < 0){
  189.     pline("Cannot unlink %s .", bones);
  190.     return(0);
  191.     }
  192.     return(ok);
  193. }
  194.