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