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
40 static 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 
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