xref: /netbsd/games/adventure/init.c (revision bf9ec67e)
1 /*	$NetBSD: init.c,v 1.13 2001/02/05 00:20:05 christos Exp $	*/
2 
3 /*-
4  * Copyright (c) 1993
5  *	The Regents of the University of California.  All rights reserved.
6  *
7  * The game adventure was originally written in Fortran by Will Crowther
8  * and Don Woods.  It was later translated to C and enhanced by Jim
9  * Gillogly.  This code is derived from software contributed to Berkeley
10  * by Jim Gillogly at The Rand Corporation.
11  *
12  * Redistribution and use in source and binary forms, with or without
13  * modification, are permitted provided that the following conditions
14  * are met:
15  * 1. Redistributions of source code must retain the above copyright
16  *    notice, this list of conditions and the following disclaimer.
17  * 2. Redistributions in binary form must reproduce the above copyright
18  *    notice, this list of conditions and the following disclaimer in the
19  *    documentation and/or other materials provided with the distribution.
20  * 3. All advertising materials mentioning features or use of this software
21  *    must display the following acknowledgement:
22  *	This product includes software developed by the University of
23  *	California, Berkeley and its contributors.
24  * 4. Neither the name of the University nor the names of its contributors
25  *    may be used to endorse or promote products derived from this software
26  *    without specific prior written permission.
27  *
28  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
29  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
30  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
31  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
32  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
33  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
34  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
35  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
36  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
37  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
38  * SUCH DAMAGE.
39  */
40 
41 #include <sys/cdefs.h>
42 #ifndef lint
43 #if 0
44 static char sccsid[] = "@(#)init.c	8.1 (Berkeley) 6/2/93";
45 #else
46 __RCSID("$NetBSD: init.c,v 1.13 2001/02/05 00:20:05 christos Exp $");
47 #endif
48 #endif /* not lint */
49 
50 /*      Re-coding of advent in C: data initialization */
51 
52 #include <sys/types.h>
53 #include <signal.h>
54 #include <stdio.h>
55 #include <stdlib.h>
56 #include <time.h>
57 #include <unistd.h>
58 
59 #include "hdr.h"
60 #include "extern.h"
61 
62 int     blklin = TRUE;
63 
64 int     setbit[16] = {1, 2, 4, 010, 020, 040, 0100, 0200, 0400, 01000, 02000, 04000,
65 010000, 020000, 040000, 0100000};
66 
67 int     datfd;			/* message file descriptor */
68 volatile sig_atomic_t delhit;
69 int     yea;
70 
71 int     loc, newloc, oldloc, oldlc2, wzdark, gaveup, kq, k, k2;
72 char   *wd1, *wd2;		/* the complete words */
73 int     verb, obj, spk;
74 int     saveday, savet, mxscor, latncy;
75 
76 struct hashtab voc[HTSIZE];
77 
78 struct text rtext[RTXSIZ];	/* random text messages */
79 
80 struct text mtext[MAGSIZ];	/* magic messages */
81 
82 int     clsses;
83 
84 struct text ctext[CLSMAX];	/* classes of adventurer */
85 int     cval[CLSMAX];
86 
87 struct text ptext[101];		/* object descriptions */
88 
89 struct text ltext[LOCSIZ];	/* long loc description */
90 struct text stext[LOCSIZ];	/* short loc descriptions */
91 
92 struct travlist *travel[LOCSIZ], *tkk;	/* travel is closer to keys(...) */
93 
94 int     atloc[LOCSIZ];
95 
96 int     plac[101];		/* initial object placement */
97 int     fixd[101], fixed[101];	/* location fixed? */
98 
99 int     actspk[35];		/* rtext msg for verb <n> */
100 
101 int     cond[LOCSIZ];		/* various condition bits */
102 
103 int     hntmax;
104 int     hints[20][5];		/* info on hints */
105 int     hinted[20], hintlc[20];
106 
107 int     place[101], prop[101], links[201];
108 int     abb[LOCSIZ];
109 
110 int     maxtrs, tally, tally2;	/* treasure values */
111 
112 int     keys, lamp, grate, cage, rod, rod2, steps,	/* mnemonics */
113         bird, door, pillow, snake, fissur, tablet, clam, oyster,
114         magzin, dwarf, knife, food, bottle, water, oil, plant, plant2,
115         axe, mirror, dragon, chasm, troll, troll2, bear, messag,
116         vend, batter, nugget, coins, chest, eggs, tridnt, vase,
117         emrald, pyram, pearl, rug, chain, spices, back, look, cave,
118         null, entrnc, dprssn, enter, stream, pour, say, lock, throw,
119         find, invent;
120 
121 int     chloc, chloc2, dseen[7], dloc[7],	/* dwarf stuff */
122         odloc[7], dflag, daltlc;
123 
124 int     tk[21], stick, dtotal, attack;
125 int     turns, lmwarn, iwest, knfloc, detail,	/* various flags and
126 						 * counters */
127         abbnum, maxdie, numdie, holdng, dkill, foobar, bonus, clock1,
128         clock2, saved, closng, panic, closed, scorng;
129 
130 int     demo, limit;
131 
132 void
133 init()			/* everything for 1st time run */
134 {
135 	rdata();		/* read data from orig. file */
136 	linkdata();
137 	poof();
138 }
139 
140 char   *
141 decr(a, b, c, d, e)
142 	char    a, b, c, d, e;
143 {
144 	static char buf[6];
145 
146 	buf[0] = a - '+';
147 	buf[1] = b - '-';
148 	buf[2] = c - '#';
149 	buf[3] = d - '&';
150 	buf[4] = e - '%';
151 	buf[5] = 0;
152 	return buf;
153 }
154 
155 void
156 linkdata()
157 {				/* secondary data manipulation */
158 	int     i, j;
159 
160 	/* array linkages */
161 	for (i = 1; i <= LOCSIZ; i++)
162 		if (ltext[i].seekadr != 0 && travel[i] != 0)
163 			if ((travel[i]->tverb) == 1)
164 				cond[i] = 2;
165 	for (j = 100; j > 0; j--)
166 		if (fixd[j] > 0) {
167 			drop(j + 100, fixd[j]);
168 			drop(j, plac[j]);
169 		}
170 	for (j = 100; j > 0; j--) {
171 		fixed[j] = fixd[j];
172 		if (plac[j] != 0 && fixd[j] <= 0)
173 			drop(j, plac[j]);
174 	}
175 
176 	maxtrs = 79;
177 	tally = 0;
178 	tally2 = 0;
179 
180 	for (i = 50; i <= maxtrs; i++) {
181 		if (ptext[i].seekadr != 0)
182 			prop[i] = -1;
183 		tally -= prop[i];
184 	}
185 
186 	/* define mnemonics */
187 	keys = vocab(DECR('k', 'e', 'y', 's', '\0'), 1, 0);
188 	lamp = vocab(DECR('l', 'a', 'm', 'p', '\0'), 1, 0);
189 	grate = vocab(DECR('g', 'r', 'a', 't', 'e'), 1, 0);
190 	cage = vocab(DECR('c', 'a', 'g', 'e', '\0'), 1, 0);
191 	rod = vocab(DECR('r', 'o', 'd', '\0', '\0'), 1, 0);
192 	rod2 = rod + 1;
193 	steps = vocab(DECR('s', 't', 'e', 'p', 's'), 1, 0);
194 	bird = vocab(DECR('b', 'i', 'r', 'd', '\0'), 1, 0);
195 	door = vocab(DECR('d', 'o', 'o', 'r', '\0'), 1, 0);
196 	pillow = vocab(DECR('p', 'i', 'l', 'l', 'o'), 1, 0);
197 	snake = vocab(DECR('s', 'n', 'a', 'k', 'e'), 1, 0);
198 	fissur = vocab(DECR('f', 'i', 's', 's', 'u'), 1, 0);
199 	tablet = vocab(DECR('t', 'a', 'b', 'l', 'e'), 1, 0);
200 	clam = vocab(DECR('c', 'l', 'a', 'm', '\0'), 1, 0);
201 	oyster = vocab(DECR('o', 'y', 's', 't', 'e'), 1, 0);
202 	magzin = vocab(DECR('m', 'a', 'g', 'a', 'z'), 1, 0);
203 	dwarf = vocab(DECR('d', 'w', 'a', 'r', 'f'), 1, 0);
204 	knife = vocab(DECR('k', 'n', 'i', 'f', 'e'), 1, 0);
205 	food = vocab(DECR('f', 'o', 'o', 'd', '\0'), 1, 0);
206 	bottle = vocab(DECR('b', 'o', 't', 't', 'l'), 1, 0);
207 	water = vocab(DECR('w', 'a', 't', 'e', 'r'), 1, 0);
208 	oil = vocab(DECR('o', 'i', 'l', '\0', '\0'), 1, 0);
209 	plant = vocab(DECR('p', 'l', 'a', 'n', 't'), 1, 0);
210 	plant2 = plant + 1;
211 	axe = vocab(DECR('a', 'x', 'e', '\0', '\0'), 1, 0);
212 	mirror = vocab(DECR('m', 'i', 'r', 'r', 'o'), 1, 0);
213 	dragon = vocab(DECR('d', 'r', 'a', 'g', 'o'), 1, 0);
214 	chasm = vocab(DECR('c', 'h', 'a', 's', 'm'), 1, 0);
215 	troll = vocab(DECR('t', 'r', 'o', 'l', 'l'), 1, 0);
216 	troll2 = troll + 1;
217 	bear = vocab(DECR('b', 'e', 'a', 'r', '\0'), 1, 0);
218 	messag = vocab(DECR('m', 'e', 's', 's', 'a'), 1, 0);
219 	vend = vocab(DECR('v', 'e', 'n', 'd', 'i'), 1, 0);
220 	batter = vocab(DECR('b', 'a', 't', 't', 'e'), 1, 0);
221 
222 	nugget = vocab(DECR('g', 'o', 'l', 'd', '\0'), 1, 0);
223 	coins = vocab(DECR('c', 'o', 'i', 'n', 's'), 1, 0);
224 	chest = vocab(DECR('c', 'h', 'e', 's', 't'), 1, 0);
225 	eggs = vocab(DECR('e', 'g', 'g', 's', '\0'), 1, 0);
226 	tridnt = vocab(DECR('t', 'r', 'i', 'd', 'e'), 1, 0);
227 	vase = vocab(DECR('v', 'a', 's', 'e', '\0'), 1, 0);
228 	emrald = vocab(DECR('e', 'm', 'e', 'r', 'a'), 1, 0);
229 	pyram = vocab(DECR('p', 'y', 'r', 'a', 'm'), 1, 0);
230 	pearl = vocab(DECR('p', 'e', 'a', 'r', 'l'), 1, 0);
231 	rug = vocab(DECR('r', 'u', 'g', '\0', '\0'), 1, 0);
232 	chain = vocab(DECR('c', 'h', 'a', 'i', 'n'), 1, 0);
233 
234 	back = vocab(DECR('b', 'a', 'c', 'k', '\0'), 0, 0);
235 	look = vocab(DECR('l', 'o', 'o', 'k', '\0'), 0, 0);
236 	cave = vocab(DECR('c', 'a', 'v', 'e', '\0'), 0, 0);
237 	null = vocab(DECR('n', 'u', 'l', 'l', '\0'), 0, 0);
238 	entrnc = vocab(DECR('e', 'n', 't', 'r', 'a'), 0, 0);
239 	dprssn = vocab(DECR('d', 'e', 'p', 'r', 'e'), 0, 0);
240 	enter = vocab(DECR('e', 'n', 't', 'e', 'r'), 0, 0);
241 
242 	pour = vocab(DECR('p', 'o', 'u', 'r', '\0'), 2, 0);
243 	say = vocab(DECR('s', 'a', 'y', '\0', '\0'), 2, 0);
244 	lock = vocab(DECR('l', 'o', 'c', 'k', '\0'), 2, 0);
245 	throw = vocab(DECR('t', 'h', 'r', 'o', 'w'), 2, 0);
246 	find = vocab(DECR('f', 'i', 'n', 'd', '\0'), 2, 0);
247 	invent = vocab(DECR('i', 'n', 'v', 'e', 'n'), 2, 0);
248 
249 	/* initialize dwarves */
250 	chloc = 114;
251 	chloc2 = 140;
252 	for (i = 1; i <= 6; i++)
253 		dseen[i] = FALSE;
254 	dflag = 0;
255 	dloc[1] = 19;
256 	dloc[2] = 27;
257 	dloc[3] = 33;
258 	dloc[4] = 44;
259 	dloc[5] = 64;
260 	dloc[6] = chloc;
261 	daltlc = 18;
262 
263 	/* random flags & ctrs */
264 	turns = 0;
265 	lmwarn = FALSE;
266 	iwest = 0;
267 	knfloc = 0;
268 	detail = 0;
269 	abbnum = 5;
270 	for (i = 0; i <= 4; i++)
271 		if (rtext[2 * i + 81].seekadr != 0)
272 			maxdie = i + 1;
273 	numdie = holdng = dkill = foobar = bonus = 0;
274 	clock1 = 30;
275 	clock2 = 50;
276 	saved = 0;
277 	closng = panic = closed = scorng = FALSE;
278 }
279 
280 
281 
282 void
283 trapdel(n)			/* come here if he hits a del */
284 	int     n __attribute__((__unused__));
285 {
286 	delhit = 1;		/* main checks, treats as QUIT */
287 	signal(SIGINT, trapdel);/* catch subsequent DELs */
288 }
289 
290 
291 void
292 startup()
293 {
294 	demo = Start();
295 	srand((int) (time((time_t *) NULL)));	/* random seed */
296 #if 0
297 	srand(371);		/* non-random seed */
298 #endif
299 	hinted[3] = yes(65, 1, 0);
300 	newloc = 1;
301 	delhit = 0;
302 	limit = 330;
303 	if (hinted[3])
304 		limit = 1000;	/* better batteries if instrucs */
305 }
306