home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / bsd_srcs / games / hack / hack.lev.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-05-02  |  6.3 KB  |  286 lines

  1. /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  2. /* hack.lev.c - version 1.0.3 */
  3.  
  4. #include "hack.h"
  5. #include "def.mkroom.h"
  6. #include <stdio.h>
  7. extern struct monst *restmonchn();
  8. extern struct obj *restobjchn();
  9. extern struct obj *billobjs;
  10. extern char *itoa();
  11. extern char SAVEF[];
  12. extern int hackpid;
  13. extern xchar dlevel;
  14. extern char nul[];
  15.  
  16. #ifndef NOWORM
  17. #include    "def.wseg.h"
  18. extern struct wseg *wsegs[32], *wheads[32];
  19. extern long wgrowtime[32];
  20. #endif NOWORM
  21.  
  22. boolean level_exists[MAXLEVEL+1];
  23.  
  24. savelev(fd,lev)
  25. int fd;
  26. xchar lev;
  27. {
  28. #ifndef NOWORM
  29.     register struct wseg *wtmp, *wtmp2;
  30.     register tmp;
  31. #endif NOWORM
  32.  
  33.     if(fd < 0) panic("Save on bad file!");    /* impossible */
  34.     if(lev >= 0 && lev <= MAXLEVEL)
  35.         level_exists[lev] = TRUE;
  36.  
  37.     bwrite(fd,(char *) &hackpid,sizeof(hackpid));
  38.     bwrite(fd,(char *) &lev,sizeof(lev));
  39.     bwrite(fd,(char *) levl,sizeof(levl));
  40.     bwrite(fd,(char *) &moves,sizeof(long));
  41.     bwrite(fd,(char *) &xupstair,sizeof(xupstair));
  42.     bwrite(fd,(char *) &yupstair,sizeof(yupstair));
  43.     bwrite(fd,(char *) &xdnstair,sizeof(xdnstair));
  44.     bwrite(fd,(char *) &ydnstair,sizeof(ydnstair));
  45.     savemonchn(fd, fmon);
  46.     savegoldchn(fd, fgold);
  47.     savetrapchn(fd, ftrap);
  48.     saveobjchn(fd, fobj);
  49.     saveobjchn(fd, billobjs);
  50.     billobjs = 0;
  51.     save_engravings(fd);
  52. #ifndef QUEST
  53.     bwrite(fd,(char *) rooms,sizeof(rooms));
  54.     bwrite(fd,(char *) doors,sizeof(doors));
  55. #endif QUEST
  56.     fgold = 0;
  57.     ftrap = 0;
  58.     fmon = 0;
  59.     fobj = 0;
  60. #ifndef NOWORM
  61.     bwrite(fd,(char *) wsegs,sizeof(wsegs));
  62.     for(tmp=1; tmp<32; tmp++){
  63.         for(wtmp = wsegs[tmp]; wtmp; wtmp = wtmp2){
  64.             wtmp2 = wtmp->nseg;
  65.             bwrite(fd,(char *) wtmp,sizeof(struct wseg));
  66.         }
  67.         wsegs[tmp] = 0;
  68.     }
  69.     bwrite(fd,(char *) wgrowtime,sizeof(wgrowtime));
  70. #endif NOWORM
  71. }
  72.  
  73. bwrite(fd,loc,num)
  74. register fd;
  75. register char *loc;
  76. register unsigned num;
  77. {
  78. /* lint wants the 3rd arg of write to be an int; lint -p an unsigned */
  79.     if(write(fd, loc, (int) num) != num)
  80.         panic("cannot write %u bytes to file #%d", num, fd);
  81. }
  82.  
  83. saveobjchn(fd,otmp)
  84. register fd;
  85. register struct obj *otmp;
  86. {
  87.     register struct obj *otmp2;
  88.     unsigned xl;
  89.     int minusone = -1;
  90.  
  91.     while(otmp) {
  92.         otmp2 = otmp->nobj;
  93.         xl = otmp->onamelth;
  94.         bwrite(fd, (char *) &xl, sizeof(int));
  95.         bwrite(fd, (char *) otmp, xl + sizeof(struct obj));
  96.         free((char *) otmp);
  97.         otmp = otmp2;
  98.     }
  99.     bwrite(fd, (char *) &minusone, sizeof(int));
  100. }
  101.  
  102. savemonchn(fd,mtmp)
  103. register fd;
  104. register struct monst *mtmp;
  105. {
  106.     register struct monst *mtmp2;
  107.     unsigned xl;
  108.     int minusone = -1;
  109.     struct permonst *monbegin = &mons[0];
  110.  
  111.     bwrite(fd, (char *) &monbegin, sizeof(monbegin));
  112.  
  113.     while(mtmp) {
  114.         mtmp2 = mtmp->nmon;
  115.         xl = mtmp->mxlth + mtmp->mnamelth;
  116.         bwrite(fd, (char *) &xl, sizeof(int));
  117.         bwrite(fd, (char *) mtmp, xl + sizeof(struct monst));
  118.         if(mtmp->minvent) saveobjchn(fd,mtmp->minvent);
  119.         free((char *) mtmp);
  120.         mtmp = mtmp2;
  121.     }
  122.     bwrite(fd, (char *) &minusone, sizeof(int));
  123. }
  124.  
  125. savegoldchn(fd,gold)
  126. register fd;
  127. register struct gold *gold;
  128. {
  129.     register struct gold *gold2;
  130.     while(gold) {
  131.         gold2 = gold->ngold;
  132.         bwrite(fd, (char *) gold, sizeof(struct gold));
  133.         free((char *) gold);
  134.         gold = gold2;
  135.     }
  136.     bwrite(fd, nul, sizeof(struct gold));
  137. }
  138.  
  139. savetrapchn(fd,trap)
  140. register fd;
  141. register struct trap *trap;
  142. {
  143.     register struct trap *trap2;
  144.     while(trap) {
  145.         trap2 = trap->ntrap;
  146.         bwrite(fd, (char *) trap, sizeof(struct trap));
  147.         free((char *) trap);
  148.         trap = trap2;
  149.     }
  150.     bwrite(fd, nul, sizeof(struct trap));
  151. }
  152.  
  153. getlev(fd,pid,lev)
  154. int fd,pid;
  155. xchar lev;
  156. {
  157.     register struct gold *gold;
  158.     register struct trap *trap;
  159. #ifndef NOWORM
  160.     register struct wseg *wtmp;
  161. #endif NOWORM
  162.     register tmp;
  163.     long omoves;
  164.     int hpid;
  165.     xchar dlvl;
  166.  
  167.     /* First some sanity checks */
  168.     mread(fd, (char *) &hpid, sizeof(hpid));
  169.     mread(fd, (char *) &dlvl, sizeof(dlvl));
  170.     if((pid && pid != hpid) || (lev && dlvl != lev)) {
  171.         pline("Strange, this map is not as I remember it.");
  172.         pline("Somebody is trying some trickery here ...");
  173.         pline("This game is void ...");
  174.         done("tricked");
  175.     }
  176.  
  177.     fgold = 0;
  178.     ftrap = 0;
  179.     mread(fd, (char *) levl, sizeof(levl));
  180.     mread(fd, (char *)&omoves, sizeof(omoves));
  181.     mread(fd, (char *)&xupstair, sizeof(xupstair));
  182.     mread(fd, (char *)&yupstair, sizeof(yupstair));
  183.     mread(fd, (char *)&xdnstair, sizeof(xdnstair));
  184.     mread(fd, (char *)&ydnstair, sizeof(ydnstair));
  185.  
  186.     fmon = restmonchn(fd);
  187.  
  188.     /* regenerate animals while on another level */
  189.     { long tmoves = (moves > omoves) ? moves-omoves : 0;
  190.       register struct monst *mtmp, *mtmp2;
  191.       extern char genocided[];
  192.  
  193.       for(mtmp = fmon; mtmp; mtmp = mtmp2) {
  194.         long newhp;        /* tmoves may be very large */
  195.  
  196.         mtmp2 = mtmp->nmon;
  197.         if(index(genocided, mtmp->data->mlet)) {
  198.             mondead(mtmp);
  199.             continue;
  200.         }
  201.  
  202.         if(mtmp->mtame && tmoves > 250) {
  203.             mtmp->mtame = 0;
  204.             mtmp->mpeaceful = 0;
  205.         }
  206.  
  207.         newhp = mtmp->mhp +
  208.             (index(MREGEN, mtmp->data->mlet) ? tmoves : tmoves/20);
  209.         if(newhp > mtmp->mhpmax)
  210.             mtmp->mhp = mtmp->mhpmax;
  211.         else
  212.             mtmp->mhp = newhp;
  213.       }
  214.     }
  215.  
  216.     setgd();
  217.     gold = newgold();
  218.     mread(fd, (char *)gold, sizeof(struct gold));
  219.     while(gold->gx) {
  220.         gold->ngold = fgold;
  221.         fgold = gold;
  222.         gold = newgold();
  223.         mread(fd, (char *)gold, sizeof(struct gold));
  224.     }
  225.     free((char *) gold);
  226.     trap = newtrap();
  227.     mread(fd, (char *)trap, sizeof(struct trap));
  228.     while(trap->tx) {
  229.         trap->ntrap = ftrap;
  230.         ftrap = trap;
  231.         trap = newtrap();
  232.         mread(fd, (char *)trap, sizeof(struct trap));
  233.     }
  234.     free((char *) trap);
  235.     fobj = restobjchn(fd);
  236.     billobjs = restobjchn(fd);
  237.     rest_engravings(fd);
  238. #ifndef QUEST
  239.     mread(fd, (char *)rooms, sizeof(rooms));
  240.     mread(fd, (char *)doors, sizeof(doors));
  241. #endif QUEST
  242. #ifndef NOWORM
  243.     mread(fd, (char *)wsegs, sizeof(wsegs));
  244.     for(tmp = 1; tmp < 32; tmp++) if(wsegs[tmp]){
  245.         wheads[tmp] = wsegs[tmp] = wtmp = newseg();
  246.         while(1) {
  247.             mread(fd, (char *)wtmp, sizeof(struct wseg));
  248.             if(!wtmp->nseg) break;
  249.             wheads[tmp]->nseg = wtmp = newseg();
  250.             wheads[tmp] = wtmp;
  251.         }
  252.     }
  253.     mread(fd, (char *)wgrowtime, sizeof(wgrowtime));
  254. #endif NOWORM
  255. }
  256.  
  257. mread(fd, buf, len)
  258. register fd;
  259. register char *buf;
  260. register unsigned len;
  261. {
  262.     register int rlen;
  263.     extern boolean restoring;
  264.  
  265.     rlen = read(fd, buf, (int) len);
  266.     if(rlen != len){
  267.         pline("Read %d instead of %u bytes.\n", rlen, len);
  268.         if(restoring) {
  269.             (void) unlink(SAVEF);
  270.             error("Error restoring old game.");
  271.         }
  272.         panic("Error reading level file.");
  273.     }
  274. }
  275.  
  276. mklev()
  277. {
  278.     extern boolean in_mklev;
  279.  
  280.     if(getbones()) return;
  281.  
  282.     in_mklev = TRUE;
  283.     makelevel();
  284.     in_mklev = FALSE;
  285. }
  286.