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