xref: /openbsd-src/games/hack/hack.o_init.c (revision dc14b708bc8db640b2f06ceb37eb5b888f20cb2f)
1*dc14b708Sbentley /*	$OpenBSD: hack.o_init.c,v 1.9 2019/04/05 09:02:27 bentley Exp $	*/
2d0b779f3Sniklas 
3df930be7Sderaadt /*
4d25013f2Scamield  * Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
5d25013f2Scamield  * Amsterdam
6d25013f2Scamield  * All rights reserved.
7d25013f2Scamield  *
8d25013f2Scamield  * Redistribution and use in source and binary forms, with or without
9d25013f2Scamield  * modification, are permitted provided that the following conditions are
10d25013f2Scamield  * met:
11d25013f2Scamield  *
12d25013f2Scamield  * - Redistributions of source code must retain the above copyright notice,
13d25013f2Scamield  * this list of conditions and the following disclaimer.
14d25013f2Scamield  *
15d25013f2Scamield  * - Redistributions in binary form must reproduce the above copyright
16d25013f2Scamield  * notice, this list of conditions and the following disclaimer in the
17d25013f2Scamield  * documentation and/or other materials provided with the distribution.
18d25013f2Scamield  *
19d25013f2Scamield  * - Neither the name of the Stichting Centrum voor Wiskunde en
20d25013f2Scamield  * Informatica, nor the names of its contributors may be used to endorse or
21d25013f2Scamield  * promote products derived from this software without specific prior
22d25013f2Scamield  * written permission.
23d25013f2Scamield  *
24d25013f2Scamield  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
25d25013f2Scamield  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
26d25013f2Scamield  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
27d25013f2Scamield  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
28d25013f2Scamield  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
29d25013f2Scamield  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
30d25013f2Scamield  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
31d25013f2Scamield  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
32d25013f2Scamield  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
33d25013f2Scamield  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
34d25013f2Scamield  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35d25013f2Scamield  */
36d25013f2Scamield 
37d25013f2Scamield /*
38d25013f2Scamield  * Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
39d25013f2Scamield  * All rights reserved.
40d25013f2Scamield  *
41d25013f2Scamield  * Redistribution and use in source and binary forms, with or without
42d25013f2Scamield  * modification, are permitted provided that the following conditions
43d25013f2Scamield  * are met:
44d25013f2Scamield  * 1. Redistributions of source code must retain the above copyright
45d25013f2Scamield  *    notice, this list of conditions and the following disclaimer.
46d25013f2Scamield  * 2. Redistributions in binary form must reproduce the above copyright
47d25013f2Scamield  *    notice, this list of conditions and the following disclaimer in the
48d25013f2Scamield  *    documentation and/or other materials provided with the distribution.
49d25013f2Scamield  * 3. The name of the author may not be used to endorse or promote products
50d25013f2Scamield  *    derived from this software without specific prior written permission.
51d25013f2Scamield  *
52d25013f2Scamield  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
53d25013f2Scamield  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
54d25013f2Scamield  * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
55d25013f2Scamield  * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
56d25013f2Scamield  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
57d25013f2Scamield  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
58d25013f2Scamield  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
59d25013f2Scamield  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
60d25013f2Scamield  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
61d25013f2Scamield  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
62df930be7Sderaadt  */
63df930be7Sderaadt 
644a5fbbc4Spjanzen #include <stdio.h>
65aed906e4Smestre 
664a5fbbc4Spjanzen #include "hack.h"
674a5fbbc4Spjanzen #include "def.objects.h"
684a5fbbc4Spjanzen 
694a5fbbc4Spjanzen static void setgemprobs(void);
704a5fbbc4Spjanzen static int  interesting_to_discover(int);
71df930be7Sderaadt 
72df930be7Sderaadt int
letindex(char let)734a5fbbc4Spjanzen letindex(char let)
744a5fbbc4Spjanzen {
754a5fbbc4Spjanzen 	int i = 0;
764a5fbbc4Spjanzen 	char ch;
774a5fbbc4Spjanzen 
78df930be7Sderaadt 	while((ch = obj_symbols[i++]) != 0)
79df930be7Sderaadt 		if(ch == let) return(i);
80df930be7Sderaadt 	return(0);
81df930be7Sderaadt }
82df930be7Sderaadt 
834a5fbbc4Spjanzen void
init_objects(void)84aed906e4Smestre init_objects(void)
854a5fbbc4Spjanzen {
864a5fbbc4Spjanzen 	int i, j, first, last, sum, end;
874a5fbbc4Spjanzen 	char let, *tmp;
884a5fbbc4Spjanzen 
89df930be7Sderaadt 	/* init base; if probs given check that they add up to 100,
90df930be7Sderaadt 	   otherwise compute probs; shuffle descriptions */
91df930be7Sderaadt 	end = SIZE(objects);
92df930be7Sderaadt 	first = 0;
93df930be7Sderaadt 	while( first < end ) {
94df930be7Sderaadt 		let = objects[first].oc_olet;
95df930be7Sderaadt 		last = first+1;
96df930be7Sderaadt 		while(last < end && objects[last].oc_olet == let
97df930be7Sderaadt 				&& objects[last].oc_name != NULL)
98df930be7Sderaadt 			last++;
99df930be7Sderaadt 		i = letindex(let);
100df930be7Sderaadt 		if((!i && let != ILLOBJ_SYM) || bases[i] != 0)
101df930be7Sderaadt 			error("initialization error");
102df930be7Sderaadt 		bases[i] = first;
103df930be7Sderaadt 
104df930be7Sderaadt 		if(let == GEM_SYM)
105df930be7Sderaadt 			setgemprobs();
106df930be7Sderaadt 	check:
107df930be7Sderaadt 		sum = 0;
108df930be7Sderaadt 		for(j = first; j < last; j++) sum += objects[j].oc_prob;
109df930be7Sderaadt 		if(sum == 0) {
110df930be7Sderaadt 			for(j = first; j < last; j++)
111df930be7Sderaadt 			    objects[j].oc_prob = (100+j-first)/(last-first);
112df930be7Sderaadt 			goto check;
113df930be7Sderaadt 		}
114df930be7Sderaadt 		if(sum != 100)
115df930be7Sderaadt 			error("init-prob error for %c", let);
116df930be7Sderaadt 
117df930be7Sderaadt 		if(objects[first].oc_descr != NULL && let != TOOL_SYM){
118df930be7Sderaadt 			/* shuffle, also some additional descriptions */
119df930be7Sderaadt 			while(last < end && objects[last].oc_olet == let)
120df930be7Sderaadt 				last++;
121df930be7Sderaadt 			j = last;
122df930be7Sderaadt 			while(--j > first) {
123df930be7Sderaadt 				i = first + rn2(j+1-first);
124df930be7Sderaadt 				tmp = objects[j].oc_descr;
125df930be7Sderaadt 				objects[j].oc_descr = objects[i].oc_descr;
126df930be7Sderaadt 				objects[i].oc_descr = tmp;
127df930be7Sderaadt 			}
128df930be7Sderaadt 		}
129df930be7Sderaadt 		first = last;
130df930be7Sderaadt 	}
131df930be7Sderaadt }
132df930be7Sderaadt 
1334a5fbbc4Spjanzen int
probtype(char let)1344a5fbbc4Spjanzen probtype(char let)
1354a5fbbc4Spjanzen {
1364a5fbbc4Spjanzen 	int i = bases[letindex(let)];
1374a5fbbc4Spjanzen 	int prob = rn2(100);
1384a5fbbc4Spjanzen 
139df930be7Sderaadt 	while((prob -= objects[i].oc_prob) >= 0) i++;
140df930be7Sderaadt 	if(objects[i].oc_olet != let || !objects[i].oc_name)
141df930be7Sderaadt 		panic("probtype(%c) error, i=%d", let, i);
142df930be7Sderaadt 	return(i);
143df930be7Sderaadt }
144df930be7Sderaadt 
1454a5fbbc4Spjanzen static void
setgemprobs(void)146aed906e4Smestre setgemprobs(void)
147df930be7Sderaadt {
1484a5fbbc4Spjanzen 	int j,first;
149df930be7Sderaadt 	extern xchar dlevel;
150df930be7Sderaadt 
151df930be7Sderaadt 	first = bases[letindex(GEM_SYM)];
152df930be7Sderaadt 
153df930be7Sderaadt 	for(j = 0; j < 9-dlevel/3; j++)
154df930be7Sderaadt 		objects[first+j].oc_prob = 0;
155df930be7Sderaadt 	first += j;
156df930be7Sderaadt 	if(first >= LAST_GEM || first >= SIZE(objects) ||
157df930be7Sderaadt 	    objects[first].oc_olet != GEM_SYM ||
158df930be7Sderaadt 	    objects[first].oc_name == NULL)
159df930be7Sderaadt 		printf("Not enough gems? - first=%d j=%d LAST_GEM=%d\n",
160df930be7Sderaadt 			first, j, LAST_GEM);
161df930be7Sderaadt 	for(j = first; j < LAST_GEM; j++)
162df930be7Sderaadt 		objects[j].oc_prob = (20+j-first)/(LAST_GEM-first);
163df930be7Sderaadt }
164df930be7Sderaadt 
1654a5fbbc4Spjanzen void
oinit(void)166aed906e4Smestre oinit(void)			/* level dependent initialization */
167df930be7Sderaadt {
168df930be7Sderaadt 	setgemprobs();
169df930be7Sderaadt }
170df930be7Sderaadt 
1714a5fbbc4Spjanzen void
savenames(int fd)1724a5fbbc4Spjanzen savenames(int fd)
1734a5fbbc4Spjanzen {
1744a5fbbc4Spjanzen 	int i;
175df930be7Sderaadt 	unsigned len;
176*dc14b708Sbentley 	unsigned zero = 0;
1774a5fbbc4Spjanzen 
178ebf3d589Sguenther 	bwrite(fd, bases, sizeof bases);
179ebf3d589Sguenther 	bwrite(fd, objects, sizeof objects);
180df930be7Sderaadt 	for(i=0; i < SIZE(objects); i++) {
181*dc14b708Sbentley 		if(objects[i].oc_name) {
182*dc14b708Sbentley 			len = strlen(objects[i].oc_name)+1;
183*dc14b708Sbentley 			bwrite(fd, &len, sizeof len);
184*dc14b708Sbentley 			bwrite(fd, objects[i].oc_name, len);
185*dc14b708Sbentley 		} else
186*dc14b708Sbentley 			bwrite(fd, &zero, sizeof len);
187*dc14b708Sbentley 		if(objects[i].oc_descr) {
188*dc14b708Sbentley 			len = strlen(objects[i].oc_descr)+1;
189*dc14b708Sbentley 			bwrite(fd, &len, sizeof len);
190*dc14b708Sbentley 			bwrite(fd, objects[i].oc_descr, len);
191*dc14b708Sbentley 		} else
192*dc14b708Sbentley 			bwrite(fd, &zero, sizeof len);
193df930be7Sderaadt 		if(objects[i].oc_uname) {
194df930be7Sderaadt 			len = strlen(objects[i].oc_uname)+1;
195ebf3d589Sguenther 			bwrite(fd, &len, sizeof len);
196df930be7Sderaadt 			bwrite(fd, objects[i].oc_uname, len);
197*dc14b708Sbentley 		} else
198*dc14b708Sbentley 			bwrite(fd, &zero, sizeof len);
199df930be7Sderaadt 	}
200df930be7Sderaadt }
201df930be7Sderaadt 
2024a5fbbc4Spjanzen void
restnames(int fd)2034a5fbbc4Spjanzen restnames(int fd)
2044a5fbbc4Spjanzen {
2054a5fbbc4Spjanzen 	int i;
206df930be7Sderaadt 	unsigned len;
2074a5fbbc4Spjanzen 
208df930be7Sderaadt 	mread(fd, (char *) bases, sizeof bases);
209df930be7Sderaadt 	mread(fd, (char *) objects, sizeof objects);
210*dc14b708Sbentley 	for(i=0; i < SIZE(objects); i++) {
211df930be7Sderaadt 		mread(fd, (char *) &len, sizeof len);
212*dc14b708Sbentley 		if(len) {
213*dc14b708Sbentley 			objects[i].oc_name = (char *) alloc(len);
214*dc14b708Sbentley 			mread(fd, objects[i].oc_name, len);
215*dc14b708Sbentley 		} else
216*dc14b708Sbentley 			objects[i].oc_name = 0;
217*dc14b708Sbentley 		mread(fd, (char *) &len, sizeof len);
218*dc14b708Sbentley 		if(len) {
219*dc14b708Sbentley 			objects[i].oc_descr = (char *) alloc(len);
220*dc14b708Sbentley 			mread(fd, objects[i].oc_descr, len);
221*dc14b708Sbentley 		} else
222*dc14b708Sbentley 			objects[i].oc_descr = 0;
223*dc14b708Sbentley 		mread(fd, (char *) &len, sizeof len);
224*dc14b708Sbentley 		if(len) {
225df930be7Sderaadt 			objects[i].oc_uname = (char *) alloc(len);
226df930be7Sderaadt 			mread(fd, objects[i].oc_uname, len);
227*dc14b708Sbentley 		} else
228*dc14b708Sbentley 			objects[i].oc_uname = 0;
229df930be7Sderaadt 	}
230df930be7Sderaadt }
231df930be7Sderaadt 
2324a5fbbc4Spjanzen int
dodiscovered(void)233aed906e4Smestre dodiscovered(void)				/* free after Robert Viduya */
234df930be7Sderaadt {
2354a5fbbc4Spjanzen     int i, end;
236df930be7Sderaadt     int	ct = 0;
237df930be7Sderaadt 
238df930be7Sderaadt     cornline(0, "Discoveries");
239df930be7Sderaadt 
240df930be7Sderaadt     end = SIZE(objects);
241df930be7Sderaadt     for (i = 0; i < end; i++) {
242df930be7Sderaadt 	if (interesting_to_discover (i)) {
243df930be7Sderaadt 	    ct++;
244df930be7Sderaadt 	    cornline(1, typename(i));
245df930be7Sderaadt 	}
246df930be7Sderaadt     }
247df930be7Sderaadt     if (ct == 0) {
248df930be7Sderaadt 	pline ("You haven't discovered anything yet...");
2496acf840eSmestre 	cornline(3, NULL);
250df930be7Sderaadt     } else
2516acf840eSmestre 	cornline(2, NULL);
252df930be7Sderaadt 
253df930be7Sderaadt     return(0);
254df930be7Sderaadt }
255df930be7Sderaadt 
2564a5fbbc4Spjanzen static int
interesting_to_discover(int i)2574a5fbbc4Spjanzen interesting_to_discover(int i)
258df930be7Sderaadt {
259df930be7Sderaadt     return(
260df930be7Sderaadt 	objects[i].oc_uname != NULL ||
261df930be7Sderaadt 	 (objects[i].oc_name_known && objects[i].oc_descr != NULL)
262df930be7Sderaadt     );
263df930be7Sderaadt }
264