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