1 /* $NetBSD: init.c,v 1.18 2009/08/12 04:28:27 dholland Exp $ */
5 * The Regents of the University of California. All rights reserved.
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.
12 * Redistribution and use in source and binary forms, with or without
13 * modification, are permitted provided that the following conditions
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.
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
37 #include <sys/cdefs.h>
40 static char sccsid
[] = "@(#)init.c 8.1 (Berkeley) 6/2/93";
42 __RCSID("$NetBSD: init.c,v 1.18 2009/08/12 04:28:27 dholland Exp $");
46 /* Re-coding of advent in C: data initialization */
48 #include <sys/types.h>
58 static void linkdata(void);
62 int setbit
[16] = {1, 2, 4, 010, 020, 040, 0100, 0200, 0400, 01000, 02000,
63 04000, 010000, 020000, 040000, 0100000};
65 volatile sig_atomic_t delhit
;
68 int loc
, newloc
, oldloc
, oldloc2
, wasdark
, gaveup
, kq
, k
, k2
;
69 char *wd1
, *wd2
; /* the complete words */
71 int saveday
, savet
, maxscore
, latency
;
73 struct hashtab voc
[HTSIZE
];
75 struct text rtext
[RTXSIZE
]; /* random text messages */
77 struct text mtext
[MAGSIZE
]; /* magic messages */
81 struct text ctext
[CLSMAX
]; /* classes of adventurer */
84 struct text ptext
[101]; /* object descriptions */
86 struct text ltext
[LOCSIZE
]; /* long loc description */
87 struct text stext
[LOCSIZE
]; /* short loc descriptions */
89 struct travlist
*travel
[LOCSIZE
], *tkk
; /* travel is closer to keys(...) */
93 int plac
[101]; /* initial object placement */
94 int fixd
[101], fixed
[101]; /* location fixed? */
96 int actspeak
[35]; /* rtext msg for verb <n> */
98 int cond
[LOCSIZE
]; /* various condition bits */
101 int hints
[20][5]; /* info on hints */
102 int hinted
[20], hintlc
[20];
104 int place
[101], prop
[101], links
[201];
107 int maxtrs
, tally
, tally2
; /* treasure values */
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,
118 static int enter
, /*stream,*/ pour
;
120 int chloc
, chloc2
, dseen
[7], dloc
[7], /* dwarf stuff */
121 odloc
[7], dflag
, daltloc
;
123 int tk
[21], stick
, dtotal
, attack
;
124 int turns
, lmwarn
, iwest
, knfloc
, detail
, /* various flags and
126 abbnum
, maxdie
, numdie
, holding
, dkill
, foobar
, bonus
, clock1
,
127 clock2
, saved
, isclosing
, panic
, closed
, scoring
;
131 /* everything for 1st time run */
135 rdata(); /* read data from orig. file */
141 decr(int a
, int b
, int c
, int d
, int e
)
156 { /* secondary data manipulation */
160 for (i
= 1; i
< LOCSIZE
; i
++)
161 if (ltext
[i
].seekadr
!= 0 && travel
[i
] != 0)
162 if ((travel
[i
]->tverb
) == 1)
164 for (j
= 100; j
> 0; j
--)
166 drop(j
+ 100, fixd
[j
]);
169 for (j
= 100; j
> 0; j
--) {
171 if (plac
[j
] != 0 && fixd
[j
] <= 0)
179 for (i
= 50; i
<= maxtrs
; i
++) {
180 if (ptext
[i
].seekadr
!= 0)
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);
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);
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);
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);
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);
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);
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);
248 /* initialize dwarves */
251 for (i
= 1; i
<= 6; i
++)
262 /* random flags & ctrs */
269 for (i
= 0; i
<= 4; i
++)
270 if (rtext
[2 * i
+ 81].seekadr
!= 0)
272 numdie
= holding
= dkill
= foobar
= bonus
= 0;
276 isclosing
= panic
= closed
= scoring
= FALSE
;
279 /* come here if he hits a del */
281 trapdel(int n __unused
)
283 delhit
= 1; /* main checks, treats as QUIT */
284 signal(SIGINT
, trapdel
);/* catch subsequent DELs */
292 srand((int) (time((time_t *) NULL
))); /* random seed */
294 srand(371); /* non-random seed */
296 hinted
[3] = yes(65, 1, 0);
301 limit
= 1000; /* better batteries if instrucs */