Source:NetHack 2.3e/o init.c

From NetHackWiki
Jump to navigation Jump to search

Below is the full text to o_init.c from the source code of NetHack 2.3e. To link to a particular line, write [[NetHack 2.3e/o_init.c#line123]], for example.

Warning! This is the source code from an old release. For the latest release, see Source code

Screenshots and source code from Hack are used under the CWI license.

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.   				if(!strcmp(objects[j].oc_name,"turquoise")) {
63.   				    if(rn2(2)) /* change from green? */
64.   					strcpy(objects[j].oc_descr,"blue");
65.   				} else if (!strcmp(objects[j].oc_name,"aquamarine")) {
66.   				    if(rn2(2)) /* change from green? */
67.   					strcpy(objects[j].oc_descr,"blue");
68.   				} else if (!strcmp(objects[j].oc_name,"fluorite")) {
69.   				    switch (rn2(4)) { /* change from violet? */
70.   					case 0:  break;
71.   					case 1:
72.   					    strcpy(objects[j].oc_descr,"blue");
73.   					    break;
74.   					case 2:
75.   					    strcpy(objects[j].oc_descr,"white");
76.   					    break;
77.   					case 3:
78.   					    strcpy(objects[j].oc_descr,"green");
79.   					    break;
80.   					}
81.   				}
82.   			} else
83.   			    while(--j > first) {
84.   				i = first + rn2(j+1-first);
85.   				tmp = objects[j].oc_descr;
86.   				objects[j].oc_descr = objects[i].oc_descr;
87.   				objects[i].oc_descr = tmp;
88.   			    }
89.   		}
90.   		first = last;
91.   	}
92.   }
93.   
94.   probtype(let) register char let; {
95.   register int i = bases[letindex(let)];
96.   register int prob = rn2(100);
97.   	while((prob -= objects[i].oc_prob) >= 0) i++;
98.   	if(objects[i].oc_olet != let || !objects[i].oc_name)
99.   		panic("probtype(%c) error, i=%d", let, i);
100.  	return(i);
101.  }
102.  
103.  setgemprobs()
104.  {
105.  	register int j,first;
106.  	extern xchar dlevel;
107.  
108.  	first = bases[letindex(GEM_SYM)];
109.  
110.  	for(j = 0; j < 9-dlevel/3; j++)
111.  		objects[first+j].oc_prob = 0;
112.  	first += j;
113.  	if(first >= LAST_GEM || first >= SIZE(objects) ||
114.  	    objects[first].oc_olet != GEM_SYM ||
115.  	    objects[first].oc_name == NULL)
116.  		printf("Not enough gems? - first=%d j=%d LAST_GEM=%d\n",
117.  			first, j, LAST_GEM);
118.  	for(j = first; j < LAST_GEM; j++)
119.  		objects[j].oc_prob = (18+j-first)/(LAST_GEM-first);
120.  }
121.  
122.  oinit()			/* level dependent initialization */
123.  {
124.  	setgemprobs();
125.  }
126.  
127.  extern long *alloc();
128.  
129.  savenames(fd) register fd; {
130.  register int i;
131.  unsigned len;
132.  struct objclass *now = &objects[0];
133.  	bwrite(fd, (char *) &now, sizeof now);
134.  	bwrite(fd, (char *) bases, sizeof bases);
135.  	bwrite(fd, (char *) objects, sizeof objects);
136.  	/* as long as we use only one version of Hack/Quest we
137.  	   need not save oc_name and oc_descr, but we must save
138.  	   oc_uname for all objects */
139.  	for(i=0; i < SIZE(objects); i++) {
140.  		if(objects[i].oc_uname) {
141.  			len = strlen(objects[i].oc_uname)+1;
142.  			bwrite(fd, (char *) &len, sizeof len);
143.  			bwrite(fd, objects[i].oc_uname, len);
144.  		}
145.  	}
146.  }
147.  
148.  restnames(fd) register fd; {
149.  register int i;
150.  unsigned len;
151.  struct objclass *then;
152.  long differ;
153.  	mread(fd, (char *) &then, sizeof then);
154.  	mread(fd, (char *) bases, sizeof bases);
155.  	mread(fd, (char *) objects, sizeof objects);
156.  #ifndef MSDOS
157.  	differ = (char *)&objects[0] - (char *)then;
158.  #else
159.  	differ = (long)&objects[0] - (long)then;
160.  #endif
161.  	for(i=0; i < SIZE(objects); i++) {
162.  		if (objects[i].oc_name) {
163.  #ifndef MSDOS
164.  			objects[i].oc_name += differ;
165.  #else
166.  			objects[i].oc_name =
167.  			    (char *)((long)(objects[i].oc_name) + differ);
168.  #endif
169.  		}
170.  		if (objects[i].oc_descr) {
171.  #ifndef MSDOS
172.  			objects[i].oc_descr += differ;
173.  #else
174.  			objects[i].oc_descr =
175.  			    (char *)((long)(objects[i].oc_descr) + differ);
176.  #endif
177.  		}
178.  		if (objects[i].oc_uname) {
179.  			mread(fd, (char *) &len, sizeof len);
180.  			objects[i].oc_uname = (char *) alloc(len);
181.  			mread(fd, objects[i].oc_uname, len);
182.  		}
183.  	}
184.  }
185.  
186.  dodiscovered()				/* free after Robert Viduya */
187.  {
188.      extern char *typename();
189.      register int i, end;
190.      int	ct = 0;
191.  #ifdef DGKMOD
192.      char class = -1;
193.      extern char *let_to_name();
194.  #endif
195.  
196.      cornline(0, "Discoveries");
197.  
198.      end = SIZE(objects);
199.      for (i = 0; i < end; i++) {
200.  	if (interesting_to_discover (i)) {
201.  	    ct++;
202.  #ifdef DGKMOD
203.  	    if (objects[i].oc_olet != class) {
204.  		class = objects[i].oc_olet;
205.  		cornline(1, let_to_name(class));
206.  	    }
207.  #endif
208.  	    cornline(1, typename(i));
209.  	}
210.      }
211.      if (ct == 0) {
212.  	pline ("You haven't discovered anything yet...");
213.  	cornline(3, (char *) 0);
214.      } else
215.  	cornline(2, (char *) 0);
216.  
217.      return(0);
218.  }
219.  
220.  interesting_to_discover(i)
221.  register int i;
222.  {
223.      return(
224.  	objects[i].oc_uname != NULL ||
225.  	 (objects[i].oc_name_known && objects[i].oc_descr != NULL)
226.      );
227.  }
228.  
229.  init_corpses() {
230.  
231.  #ifdef SPIDERS
232.  	strcpy(objects[DEAD_GIANT_SPIDER].oc_name, "dead giant spider");
233.  #endif
234.  
235.  #ifdef KOPS
236.  	strcpy(objects[DEAD_KOP].oc_name, "dead Kop");
237.  # endif
238.  
239.  #ifdef ROCKMOLE
240.  	strcpy(objects[DEAD_ROCKMOLE].oc_name, "dead rockmole");
241.  #endif
242.  
243.  #ifndef KAA
244.  	strcpy(objects[DEAD_QUASIT].oc_name, "dead quasit");
245.  	strcpy(objects[DEAD_VIOLET_FUNGI].oc_name, "dead violet fungi");
246.  #endif
247.  	return(0);
248.  }