dhcpcd: update README.DRAGONFLY
[dragonfly.git] / games / hack / hack.o_init.c
blobe95e08daf7ebe80ce9f5aada66f12f19bbdf275e
1 /* $NetBSD: hack.o_init.c,v 1.14 2011/08/06 20:42:43 dholland Exp $ */
3 /*
4 * Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
5 * Amsterdam
6 * All rights reserved.
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions are
10 * met:
12 * - Redistributions of source code must retain the above copyright notice,
13 * this list of conditions and the following disclaimer.
15 * - Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
19 * - Neither the name of the Stichting Centrum voor Wiskunde en
20 * Informatica, nor the names of its contributors may be used to endorse or
21 * promote products derived from this software without specific prior
22 * written permission.
24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
25 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
26 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
27 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
28 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
29 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
30 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
31 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
32 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
33 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
34 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38 * Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
39 * All rights reserved.
41 * Redistribution and use in source and binary forms, with or without
42 * modification, are permitted provided that the following conditions
43 * are met:
44 * 1. Redistributions of source code must retain the above copyright
45 * notice, this list of conditions and the following disclaimer.
46 * 2. Redistributions in binary form must reproduce the above copyright
47 * notice, this list of conditions and the following disclaimer in the
48 * documentation and/or other materials provided with the distribution.
49 * 3. The name of the author may not be used to endorse or promote products
50 * derived from this software without specific prior written permission.
52 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
53 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
54 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
55 * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
56 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
57 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
58 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
59 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
60 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
61 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
64 #include <string.h>
65 #include "hack.h"
66 #include "extern.h"
67 #include "def.objects.h"
68 #include "hack.onames.h" /* for LAST_GEM */
70 static void setgemprobs(void);
71 static int interesting_to_discover(int);
73 int
74 letindex(int let)
76 int i = 0;
77 char ch;
78 while ((ch = obj_symbols[i++]) != 0)
79 if (ch == let)
80 return (i);
81 return (0);
84 void
85 init_objects(void)
87 int i, j, first, last, sum, end;
88 char let;
89 const char *tmp;
91 * init base; if probs given check that they add up to 100, otherwise
92 * compute probs; shuffle descriptions
94 end = SIZE(objects);
95 first = 0;
96 while (first < end) {
97 let = objects[first].oc_olet;
98 last = first + 1;
99 while (last < end && objects[last].oc_olet == let
100 && objects[last].oc_name != NULL)
101 last++;
102 i = letindex(let);
103 if ((!i && let != ILLOBJ_SYM) || bases[i] != 0)
104 error("initialization error");
105 bases[i] = first;
107 if (let == GEM_SYM)
108 setgemprobs();
109 check:
110 sum = 0;
111 for (j = first; j < last; j++)
112 sum += objects[j].oc_prob;
113 if (sum == 0) {
114 for (j = first; j < last; j++)
115 objects[j].oc_prob = (100 + j - first) / (last - first);
116 goto check;
118 if (sum != 100)
119 error("init-prob error for %c", let);
121 if (objects[first].oc_descr != NULL && let != TOOL_SYM) {
122 /* shuffle, also some additional descriptions */
123 while (last < end && objects[last].oc_olet == let)
124 last++;
125 j = last;
126 while (--j > first) {
127 i = first + rn2(j + 1 - first);
128 tmp = objects[j].oc_descr;
129 objects[j].oc_descr = objects[i].oc_descr;
130 objects[i].oc_descr = tmp;
133 first = last;
138 probtype(int let)
140 int i = bases[letindex(let)];
141 int prob = rn2(100);
142 while ((prob -= objects[i].oc_prob) >= 0)
143 i++;
144 if (objects[i].oc_olet != let || !objects[i].oc_name)
145 panic("probtype(%c) error, i=%d", let, i);
146 return (i);
149 static void
150 setgemprobs(void)
152 int j, first;
154 first = bases[letindex(GEM_SYM)];
156 for (j = 0; j < 9 - dlevel / 3; j++)
157 objects[first + j].oc_prob = 0;
158 first += j;
159 if (first >= LAST_GEM || first >= SIZE(objects) ||
160 objects[first].oc_olet != GEM_SYM ||
161 objects[first].oc_name == NULL)
162 printf("Not enough gems? - first=%d j=%d LAST_GEM=%d\n",
163 first, j, LAST_GEM);
164 for (j = first; j < LAST_GEM; j++)
165 objects[j].oc_prob = (20 + j - first) / (LAST_GEM - first);
168 void
169 oinit(void)
170 { /* level dependent initialization */
171 setgemprobs();
174 void
175 savenames(int fd)
177 int i;
178 size_t len;
179 bwrite(fd, bases, sizeof bases);
180 bwrite(fd, objects, sizeof objects);
182 * as long as we use only one version of Hack/Quest we need not save
183 * oc_name and oc_descr, but we must save oc_uname for all objects
185 for (i = 0; i < SIZE(objects); i++) {
186 if (objects[i].oc_uname) {
187 len = strlen(objects[i].oc_uname) + 1;
188 bwrite(fd, &len, sizeof len);
189 bwrite(fd, objects[i].oc_uname, len);
194 void
195 restnames(int fd)
197 int i;
198 unsigned len;
199 mread(fd, bases, sizeof bases);
200 mread(fd, objects, sizeof objects);
201 for (i = 0; i < SIZE(objects); i++)
202 if (objects[i].oc_uname) {
203 mread(fd, &len, sizeof len);
204 objects[i].oc_uname = alloc(len);
205 mread(fd, objects[i].oc_uname, len);
210 dodiscovered(void)
211 { /* free after Robert Viduya */
212 int i, end;
213 int ct = 0;
215 cornline(0, "Discoveries");
217 end = SIZE(objects);
218 for (i = 0; i < end; i++) {
219 if (interesting_to_discover(i)) {
220 ct++;
221 cornline(1, typename(i));
224 if (ct == 0) {
225 pline("You haven't discovered anything yet...");
226 cornline(3, NULL);
227 } else
228 cornline(2, NULL);
230 return (0);
233 static int
234 interesting_to_discover(int i)
236 return (
237 objects[i].oc_uname != NULL ||
238 (objects[i].oc_name_known && objects[i].oc_descr != NULL)