xref: /minix/games/adventure/init.c (revision 0a6a1f1d)
1 /*	$NetBSD: init.c,v 1.21 2014/03/22 20:07:05 dholland 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
40 static char sccsid[] = "@(#)init.c	8.1 (Berkeley) 6/2/93";
41 #else
42 __RCSID("$NetBSD: init.c,v 1.21 2014/03/22 20:07:05 dholland 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 
58 static void linkdata(void);
59 
60 int     blklin = TRUE;
61 
62 int     setbit[16] = {1, 2, 4, 010, 020, 040, 0100, 0200, 0400, 01000, 02000,
63 		      04000, 010000, 020000, 040000, 0100000};
64 
65 volatile sig_atomic_t delhit;
66 int     yea;
67 
68 int     loc, newloc, oldloc, oldloc2, wasdark, gaveup, kq, k, k2;
69 char   *wd1, *wd2;		/* the complete words */
70 int     verb, obj, spk;
71 int     saveday, savet, maxscore, latency;
72 
73 struct hashtab voc[HTSIZE];
74 
75 struct text rtext[RTXSIZE];	/* random text messages */
76 
77 struct text mtext[MAGSIZE];	/* magic messages */
78 
79 int     classes;
80 
81 struct text ctext[CLSMAX];	/* classes of adventurer */
82 int     cval[CLSMAX];
83 
84 struct text ptext[101];		/* object descriptions */
85 
86 struct text ltext[LOCSIZE];	/* long loc description */
87 struct text stext[LOCSIZE];	/* short loc descriptions */
88 
89 struct travlist *travel[LOCSIZE], *tkk;	/* travel is closer to keys(...) */
90 
91 int     atloc[LOCSIZE];
92 
93 int     plac[101];		/* initial object placement */
94 int     fixd[101], fixed[101];	/* location fixed? */
95 
96 int     actspeak[35];		/* rtext msg for verb <n> */
97 
98 int     cond[LOCSIZE];		/* various condition bits */
99 
100 int     hintmax;
101 int     hints[20][5];		/* info on hints */
102 int     hinted[20], hintlc[20];
103 
104 int     place[101], prop[101], links[201];
105 int     abb[LOCSIZE];
106 
107 int     maxtrs, tally, tally2;	/* treasure values */
108 
109 int     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 
118 static int enter, /*stream,*/ pour;
119 
120 int     chloc, chloc2, dseen[7], dloc[7],	/* dwarf stuff */
121         odloc[7], dflag, daltloc;
122 
123 int     tk[21], stick, dtotal, attack;
124 int     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 
129 int     demo, limit;
130 
131 /* everything for 1st time run */
132 void
init(void)133 init(void)
134 {
135 	rdata();		/* read data from orig. file */
136 	linkdata();
137 	poof();
138 }
139 
140 __noinline char *
decr(int a,int b,int c,int d,int e)141 decr(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 
154 static void
linkdata(void)155 linkdata(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 */
280 void
trapdel(int n __unused)281 trapdel(int n __unused)
282 {
283 	delhit = 1;		/* main checks, treats as QUIT */
284 	signal(SIGINT, trapdel);/* catch subsequent DELs */
285 }
286 
287 
288 void
startup(void)289 startup(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