home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 1: Amiga / FrozenFish-Apr94.iso / bbs / alib / d1xx / d190 / nethack.lha / NetHack / een.zoo / o_init.c < prev    next >
C/C++ Source or Header  |  1988-07-29  |  7KB  |  256 lines

  1. /*    SCCS Id: @(#)o_init.c   2.3     88/01/24
  2. /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
  3.  
  4. #include    "config.h"              /* for typedefs */
  5. #include    "objects.h"
  6. #include    "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.  
  22.     /* bug fix to prevent "initialization error" abort on Intel Xenix.
  23.      * reported by mikew@semike
  24.      */
  25.     for(i = 0; i != sizeof(obj_symbols); i++)
  26.         bases[i] = 0;
  27.  
  28.     /* init base; if probs given check that they add up to 100,
  29.        otherwise compute probs; shuffle descriptions */
  30.     end = SIZE(objects);
  31.     first = 0;
  32.     while( first < end ) {
  33.         let = objects[first].oc_olet;
  34.         last = first+1;
  35.         while(last < end && objects[last].oc_olet == let
  36.                  && objects[last].oc_name != NULL) last++;
  37.         i = letindex(let);
  38.         if((!i && let != ILLOBJ_SYM) || bases[i] != 0)
  39.             error("initialization error");
  40.         bases[i] = first;
  41.  
  42.         if(let == GEM_SYM) setgemprobs();
  43.     check:
  44.         sum = 0;
  45.         for(j = first; j < last; j++) sum += objects[j].oc_prob;
  46.         if(sum == 0) {
  47.             for(j = first; j < last; j++)
  48.                 objects[j].oc_prob = (100+j-first)/(last-first);
  49.             goto check;
  50.         }
  51.         if(sum != 100)
  52.             error("init-prob error for %c (%d%%)", let, sum);
  53.  
  54.         if(objects[first].oc_descr != NULL && let != TOOL_SYM){
  55.             /* shuffle, also some additional descriptions */
  56.             while(last < end && objects[last].oc_olet == let)
  57.                 last++;
  58.             j = last;
  59.             if (let == GEM_SYM) {
  60.                 while(--j > first)
  61.                 /* NOTE:  longest color name must be default */
  62.                 /* NOTE: these names won't get saved (OIS)*/
  63.                 if(!strcmp(objects[j].oc_name,"turquoise")) {
  64.                     if(rn2(2)) /* change from green? */
  65.                     strcpy(objects[j].oc_descr,"blue");
  66.                 } else if (!strcmp(objects[j].oc_name,"aquamarine")) {
  67.                     if(rn2(2)) /* change from green? */
  68.                     strcpy(objects[j].oc_descr,"blue");
  69.                 } else if (!strcmp(objects[j].oc_name,"fluorite")) {
  70.                     switch (rn2(4)) { /* change from violet? */
  71.                     case 0:  break;
  72.                     case 1:
  73.                         strcpy(objects[j].oc_descr,"blue");
  74.                         break;
  75.                     case 2:
  76.                         strcpy(objects[j].oc_descr,"white");
  77.                         break;
  78.                     case 3:
  79.                         strcpy(objects[j].oc_descr,"green");
  80.                         break;
  81.                     }
  82.                 }
  83.             } else
  84.                 while(--j > first) {
  85.                 i = first + rn2(j+1-first);
  86.                 tmp = objects[j].oc_descr;
  87.                 objects[j].oc_descr = objects[i].oc_descr;
  88.                 objects[i].oc_descr = tmp;
  89.                 }
  90.         }
  91.         first = last;
  92.     }
  93. }
  94.  
  95. probtype(let) register char let; {
  96. register int i = bases[letindex(let)];
  97. register int prob = rn2(100);
  98.     while((prob -= objects[i].oc_prob) >= 0) i++;
  99.     if(objects[i].oc_olet != let || !objects[i].oc_name)
  100.         panic("probtype(%c) error, i=%d", let, i);
  101.     return(i);
  102. }
  103.  
  104. setgemprobs()
  105. {
  106.     register int j,first;
  107.     extern xchar dlevel;
  108.  
  109.     first = bases[letindex(GEM_SYM)];
  110.  
  111.     for(j = 0; j < 9-dlevel/3; j++)
  112.         objects[first+j].oc_prob = 0;
  113.     first += j;
  114.     if(first >= LAST_GEM || first >= SIZE(objects) ||
  115.         objects[first].oc_olet != GEM_SYM ||
  116.         objects[first].oc_name == NULL)
  117.         printf("Not enough gems? - first=%d j=%d LAST_GEM=%d\n",
  118.             first, j, LAST_GEM);
  119.     for(j = first; j < LAST_GEM; j++)
  120.         objects[j].oc_prob = (18+j-first)/(LAST_GEM-first);
  121. }
  122.  
  123. oinit()                 /* level dependent initialization */
  124. {
  125.     setgemprobs();
  126. }
  127.  
  128. extern long *alloc();
  129.  
  130. savenames(fd) register fd; {
  131. register int i;
  132. unsigned len;
  133. /* char *now = objects[0].oc_name; */
  134. /* The place where the string literals are put seems */
  135. /* like a better reference point to me (OIS) */
  136.     /* bwrite(fd, (char *) &now, sizeof now); */
  137.     bwrite(fd, (char *) bases, sizeof bases);
  138.     bwrite(fd, (char *) objects, sizeof objects);
  139.     /* as long as we use only one version of Hack/Quest we
  140.        need not save oc_name and oc_descr, but we must save
  141.        oc_uname for all objects */
  142.     /* we also save food, weapons, tools, balls, chains, rocks,
  143.        armor, which is a real waste... (OIS) */
  144.     for(i=0; i < SIZE(objects); i++) {
  145.         if(objects[i].oc_uname) {
  146.             len = strlen(objects[i].oc_uname)+1;
  147.             bwrite(fd, (char *) &len, sizeof len);
  148.             bwrite(fd, objects[i].oc_uname, len);
  149.         }
  150.     }
  151. }
  152.  
  153. restnames(fd) register fd; {
  154. register int i;
  155. unsigned len;
  156. /* char *then; */
  157. long differ;
  158.     /* mread(fd, (char *) &then, sizeof then); */
  159.     differ = (long) objects[0].oc_name;
  160.     mread(fd, (char *) bases, sizeof bases);
  161.     mread(fd, (char *) objects, sizeof objects);
  162. #ifndef MSDOS
  163.     /* differ = (char *)&objects[0] - (char *)then; */
  164.     differ = differ /* == our refpoint */ - objects[0].oc_name /* old */;
  165. #else
  166.     differ = differ - (long)objects[0].oc_name;
  167. #endif
  168.     for(i=0; i < SIZE(objects); i++) {
  169.         if (objects[i].oc_name) {
  170. #ifndef MSDOS
  171.             objects[i].oc_name += differ;
  172. #else
  173.             objects[i].oc_name =
  174.                 (char *)((long)(objects[i].oc_name) + differ);
  175. #endif
  176.         }
  177.         if (objects[i].oc_descr) {
  178. #ifndef MSDOS
  179.             objects[i].oc_descr += differ;
  180. #else
  181.             objects[i].oc_descr =
  182.                 (char *)((long)(objects[i].oc_descr) + differ);
  183. #endif
  184.         }
  185.         if (objects[i].oc_uname) {
  186.             mread(fd, (char *) &len, sizeof len);
  187.             objects[i].oc_uname = (char *) alloc(len);
  188.             mread(fd, objects[i].oc_uname, len);
  189.         }
  190.     }
  191. }
  192.  
  193. dodiscovered()                          /* free after Robert Viduya */
  194. {
  195.     extern char *typename();
  196.     register int i, end;
  197.     int ct = 0;
  198. #ifdef DGKMOD
  199.     char class = -1;
  200.     extern char *let_to_name();
  201. #endif
  202.  
  203.     cornline(0, "Discoveries");
  204.  
  205.     end = SIZE(objects);
  206.     for (i = 0; i < end; i++) {
  207.     if (interesting_to_discover (i)) {
  208.         ct++;
  209. #ifdef DGKMOD
  210.         if (objects[i].oc_olet != class) {
  211.         class = objects[i].oc_olet;
  212.         cornline(1, let_to_name(class));
  213.         }
  214. #endif
  215.         cornline(1, typename(i));
  216.     }
  217.     }
  218.     if (ct == 0) {
  219.     pline ("You haven't discovered anything yet...");
  220.     cornline(3, (char *) 0);
  221.     } else
  222.     cornline(2, (char *) 0);
  223.  
  224.     return(0);
  225. }
  226.  
  227. interesting_to_discover(i)
  228. register int i;
  229. {
  230.     return(
  231.     objects[i].oc_uname != NULL ||
  232.      (objects[i].oc_name_known && objects[i].oc_descr != NULL)
  233.     );
  234. }
  235.  
  236. init_corpses() {
  237.  
  238. #ifdef SPIDERS
  239.     strcpy(objects[DEAD_GIANT_SPIDER].oc_name, "dead giant spider");
  240. #endif
  241.  
  242. #ifdef KOPS
  243.     strcpy(objects[DEAD_KOP].oc_name, "dead Kop");
  244. # endif
  245.  
  246. #ifdef ROCKMOLE
  247.     strcpy(objects[DEAD_ROCKMOLE].oc_name, "dead rockmole");
  248. #endif
  249.  
  250. #ifndef KAA
  251.     strcpy(objects[DEAD_QUASIT].oc_name, "dead quasit");
  252.     strcpy(objects[DEAD_VIOLET_FUNGI].oc_name, "dead violet fungi");
  253. #endif
  254.     return(0);
  255. }
  256.