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