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