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

  1. /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  2. /* hack.o_init.c - version 1.0.3 */
  3.  
  4. #include    "config.h"        /* for typedefs */
  5. #include    "def.objects.h"
  6. #include    "hack.onames.h"        /* for LAST_GEM */
  7. extern char *index();
  8.  
  9. int
  10. letindex(let) register char let; {
  11. register int i = 0;
  12. register char ch;
  13.     while((ch = obj_symbols[i++]) != 0)
  14.         if(ch == let) return(i);
  15.     return(0);
  16. }
  17.  
  18. init_objects(){
  19. register int i, j, first, last, sum, end;
  20. register char let, *tmp;
  21.     /* init base; if probs given check that they add up to 100, 
  22.        otherwise compute probs; shuffle descriptions */
  23.     end = SIZE(objects);
  24.     first = 0;
  25.     while( first < end ) {
  26.         let = objects[first].oc_olet;
  27.         last = first+1;
  28.         while(last < end && objects[last].oc_olet == let
  29.                 && objects[last].oc_name != NULL)
  30.             last++;
  31.         i = letindex(let);
  32.         if((!i && let != ILLOBJ_SYM) || bases[i] != 0)
  33.             error("initialization error");
  34.         bases[i] = first;
  35.  
  36.         if(let == GEM_SYM)
  37.             setgemprobs();
  38.     check:
  39.         sum = 0;
  40.         for(j = first; j < last; j++) sum += objects[j].oc_prob;
  41.         if(sum == 0) {
  42.             for(j = first; j < last; j++)
  43.                 objects[j].oc_prob = (100+j-first)/(last-first);
  44.             goto check;
  45.         }
  46.         if(sum != 100)
  47.             error("init-prob error for %c", let);
  48.  
  49.         if(objects[first].oc_descr != NULL && let != TOOL_SYM){
  50.             /* shuffle, also some additional descriptions */
  51.             while(last < end && objects[last].oc_olet == let)
  52.                 last++;
  53.             j = last;
  54.             while(--j > first) {
  55.                 i = first + rn2(j+1-first);
  56.                 tmp = objects[j].oc_descr;
  57.                 objects[j].oc_descr = objects[i].oc_descr;
  58.                 objects[i].oc_descr = tmp;
  59.             }
  60.         }
  61.         first = last;
  62.     }
  63. }
  64.  
  65. probtype(let) register char let; {
  66. register int i = bases[letindex(let)];
  67. register int prob = rn2(100);
  68.     while((prob -= objects[i].oc_prob) >= 0) i++;
  69.     if(objects[i].oc_olet != let || !objects[i].oc_name)
  70.         panic("probtype(%c) error, i=%d", let, i);
  71.     return(i);
  72. }
  73.  
  74. setgemprobs()
  75. {
  76.     register int j,first;
  77.     extern xchar dlevel;
  78.  
  79.     first = bases[letindex(GEM_SYM)];
  80.  
  81.     for(j = 0; j < 9-dlevel/3; j++)
  82.         objects[first+j].oc_prob = 0;
  83.     first += j;
  84.     if(first >= LAST_GEM || first >= SIZE(objects) ||
  85.         objects[first].oc_olet != GEM_SYM ||
  86.         objects[first].oc_name == NULL)
  87.         printf("Not enough gems? - first=%d j=%d LAST_GEM=%d\n",
  88.             first, j, LAST_GEM);
  89.     for(j = first; j < LAST_GEM; j++)
  90.         objects[j].oc_prob = (20+j-first)/(LAST_GEM-first);
  91. }
  92.  
  93. oinit()            /* level dependent initialization */
  94. {
  95.     setgemprobs();
  96. }
  97.  
  98. extern long *alloc();
  99.  
  100. savenames(fd) register fd; {
  101. register int i;
  102. unsigned len;
  103.     bwrite(fd, (char *) bases, sizeof bases);
  104.     bwrite(fd, (char *) objects, sizeof objects);
  105.     /* as long as we use only one version of Hack/Quest we
  106.        need not save oc_name and oc_descr, but we must save
  107.        oc_uname for all objects */
  108.     for(i=0; i < SIZE(objects); i++) {
  109.         if(objects[i].oc_uname) {
  110.             len = strlen(objects[i].oc_uname)+1;
  111.             bwrite(fd, (char *) &len, sizeof len);
  112.             bwrite(fd, objects[i].oc_uname, len);
  113.         }
  114.     }
  115. }
  116.  
  117. restnames(fd) register fd; {
  118. register int i;
  119. unsigned len;
  120.     mread(fd, (char *) bases, sizeof bases);
  121.     mread(fd, (char *) objects, sizeof objects);
  122.     for(i=0; i < SIZE(objects); i++) if(objects[i].oc_uname) {
  123.         mread(fd, (char *) &len, sizeof len);
  124.         objects[i].oc_uname = (char *) alloc(len);
  125.         mread(fd, objects[i].oc_uname, len);
  126.     }
  127. }
  128.  
  129. dodiscovered()                /* free after Robert Viduya */
  130. {
  131.     extern char *typename();
  132.     register int i, end;
  133.     int    ct = 0;
  134.  
  135.     cornline(0, "Discoveries");
  136.  
  137.     end = SIZE(objects);
  138.     for (i = 0; i < end; i++) {
  139.     if (interesting_to_discover (i)) {
  140.         ct++;
  141.         cornline(1, typename(i));
  142.     }
  143.     }
  144.     if (ct == 0) {
  145.     pline ("You haven't discovered anything yet...");
  146.     cornline(3, (char *) 0);
  147.     } else
  148.     cornline(2, (char *) 0);
  149.  
  150.     return(0);
  151. }
  152.  
  153. interesting_to_discover(i)
  154. register int i;
  155. {
  156.     return(
  157.     objects[i].oc_uname != NULL ||
  158.      (objects[i].oc_name_known && objects[i].oc_descr != NULL)
  159.     );
  160. }
  161.