Annotation of 43BSDTahoe/games/hack/hack.o_init.c, revision 1.1.1.1

1.1       root        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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.