1 1.22 rillig /* $NetBSD: init.c,v 1.22 2021/05/02 12:50:43 rillig Exp $ */ 2 1.2 cgd 3 1.1 jtc /*- 4 1.1 jtc * Copyright (c) 1993 5 1.1 jtc * The Regents of the University of California. All rights reserved. 6 1.1 jtc * 7 1.1 jtc * The game adventure was originally written in Fortran by Will Crowther 8 1.1 jtc * and Don Woods. It was later translated to C and enhanced by Jim 9 1.1 jtc * Gillogly. This code is derived from software contributed to Berkeley 10 1.1 jtc * by Jim Gillogly at The Rand Corporation. 11 1.1 jtc * 12 1.1 jtc * Redistribution and use in source and binary forms, with or without 13 1.1 jtc * modification, are permitted provided that the following conditions 14 1.1 jtc * are met: 15 1.1 jtc * 1. Redistributions of source code must retain the above copyright 16 1.1 jtc * notice, this list of conditions and the following disclaimer. 17 1.1 jtc * 2. Redistributions in binary form must reproduce the above copyright 18 1.1 jtc * notice, this list of conditions and the following disclaimer in the 19 1.1 jtc * documentation and/or other materials provided with the distribution. 20 1.14 agc * 3. Neither the name of the University nor the names of its contributors 21 1.1 jtc * may be used to endorse or promote products derived from this software 22 1.1 jtc * without specific prior written permission. 23 1.1 jtc * 24 1.1 jtc * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 25 1.1 jtc * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 26 1.1 jtc * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 27 1.1 jtc * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 28 1.1 jtc * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 29 1.1 jtc * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 30 1.1 jtc * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31 1.1 jtc * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32 1.1 jtc * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33 1.1 jtc * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34 1.1 jtc * SUCH DAMAGE. 35 1.1 jtc */ 36 1.1 jtc 37 1.5 christos #include <sys/cdefs.h> 38 1.1 jtc #ifndef lint 39 1.2 cgd #if 0 40 1.1 jtc static char sccsid[] = "@(#)init.c 8.1 (Berkeley) 6/2/93"; 41 1.2 cgd #else 42 1.22 rillig __RCSID("$NetBSD: init.c,v 1.22 2021/05/02 12:50:43 rillig Exp $"); 43 1.2 cgd #endif 44 1.1 jtc #endif /* not lint */ 45 1.1 jtc 46 1.7 lukem /* Re-coding of advent in C: data initialization */ 47 1.1 jtc 48 1.1 jtc #include <sys/types.h> 49 1.4 mrg #include <signal.h> 50 1.1 jtc #include <stdio.h> 51 1.5 christos #include <stdlib.h> 52 1.8 perry #include <time.h> 53 1.5 christos #include <unistd.h> 54 1.8 perry 55 1.1 jtc #include "hdr.h" 56 1.5 christos #include "extern.h" 57 1.1 jtc 58 1.18 dholland static void linkdata(void); 59 1.18 dholland 60 1.7 lukem int blklin = TRUE; 61 1.1 jtc 62 1.22 rillig int setbit[16] = {1, 2, 4, 010, 020, 040, 0100, 0200, 0400, 01000, 02000, 63 1.15 jmc 04000, 010000, 020000, 040000, 0100000}; 64 1.1 jtc 65 1.12 hubertf volatile sig_atomic_t delhit; 66 1.12 hubertf int yea; 67 1.12 hubertf 68 1.19 dholland int loc, newloc, oldloc, oldloc2, wasdark, gaveup, kq, k, k2; 69 1.12 hubertf char *wd1, *wd2; /* the complete words */ 70 1.12 hubertf int verb, obj, spk; 71 1.19 dholland int saveday, savet, maxscore, latency; 72 1.12 hubertf 73 1.12 hubertf struct hashtab voc[HTSIZE]; 74 1.12 hubertf 75 1.19 dholland struct text rtext[RTXSIZE]; /* random text messages */ 76 1.12 hubertf 77 1.19 dholland struct text mtext[MAGSIZE]; /* magic messages */ 78 1.12 hubertf 79 1.19 dholland int classes; 80 1.12 hubertf 81 1.12 hubertf struct text ctext[CLSMAX]; /* classes of adventurer */ 82 1.12 hubertf int cval[CLSMAX]; 83 1.12 hubertf 84 1.12 hubertf struct text ptext[101]; /* object descriptions */ 85 1.12 hubertf 86 1.19 dholland struct text ltext[LOCSIZE]; /* long loc description */ 87 1.19 dholland struct text stext[LOCSIZE]; /* short loc descriptions */ 88 1.12 hubertf 89 1.19 dholland struct travlist *travel[LOCSIZE], *tkk; /* travel is closer to keys(...) */ 90 1.12 hubertf 91 1.19 dholland int atloc[LOCSIZE]; 92 1.12 hubertf 93 1.12 hubertf int plac[101]; /* initial object placement */ 94 1.12 hubertf int fixd[101], fixed[101]; /* location fixed? */ 95 1.12 hubertf 96 1.19 dholland int actspeak[35]; /* rtext msg for verb <n> */ 97 1.12 hubertf 98 1.19 dholland int cond[LOCSIZE]; /* various condition bits */ 99 1.12 hubertf 100 1.19 dholland int hintmax; 101 1.12 hubertf int hints[20][5]; /* info on hints */ 102 1.12 hubertf int hinted[20], hintlc[20]; 103 1.12 hubertf 104 1.12 hubertf int place[101], prop[101], links[201]; 105 1.19 dholland int abb[LOCSIZE]; 106 1.12 hubertf 107 1.12 hubertf int maxtrs, tally, tally2; /* treasure values */ 108 1.12 hubertf 109 1.12 hubertf int keys, lamp, grate, cage, rod, rod2, steps, /* mnemonics */ 110 1.19 dholland bird, door, pillow, snake, fissure, tablet, clam, oyster, 111 1.19 dholland magazine, dwarf, knife, food, bottle, water, oil, plant, plant2, 112 1.19 dholland axe, mirror, dragon, chasm, troll, troll2, bear, message, 113 1.19 dholland vend, batter, nugget, coins, chest, eggs, trident, vase, 114 1.19 dholland emerald, pyramid, pearl, rug, chain, spices, back, look, cave, 115 1.19 dholland null, entrance, depression, say, lock, throw, 116 1.12 hubertf find, invent; 117 1.12 hubertf 118 1.18 dholland static int enter, /*stream,*/ pour; 119 1.18 dholland 120 1.12 hubertf int chloc, chloc2, dseen[7], dloc[7], /* dwarf stuff */ 121 1.19 dholland odloc[7], dflag, daltloc; 122 1.12 hubertf 123 1.12 hubertf int tk[21], stick, dtotal, attack; 124 1.12 hubertf int turns, lmwarn, iwest, knfloc, detail, /* various flags and 125 1.12 hubertf * counters */ 126 1.19 dholland abbnum, maxdie, numdie, holding, dkill, foobar, bonus, clock1, 127 1.19 dholland clock2, saved, isclosing, panic, closed, scoring; 128 1.12 hubertf 129 1.13 christos int demo, limit; 130 1.1 jtc 131 1.15 jmc /* everything for 1st time run */ 132 1.5 christos void 133 1.15 jmc init(void) 134 1.1 jtc { 135 1.7 lukem rdata(); /* read data from orig. file */ 136 1.1 jtc linkdata(); 137 1.1 jtc poof(); 138 1.1 jtc } 139 1.1 jtc 140 1.21 dholland __noinline char * 141 1.15 jmc decr(int a, int b, int c, int d, int e) 142 1.1 jtc { 143 1.1 jtc static char buf[6]; 144 1.1 jtc 145 1.7 lukem buf[0] = a - '+'; 146 1.7 lukem buf[1] = b - '-'; 147 1.7 lukem buf[2] = c - '#'; 148 1.7 lukem buf[3] = d - '&'; 149 1.7 lukem buf[4] = e - '%'; 150 1.1 jtc buf[5] = 0; 151 1.1 jtc return buf; 152 1.1 jtc } 153 1.1 jtc 154 1.18 dholland static void 155 1.15 jmc linkdata(void) 156 1.7 lukem { /* secondary data manipulation */ 157 1.7 lukem int i, j; 158 1.7 lukem 159 1.7 lukem /* array linkages */ 160 1.19 dholland for (i = 1; i < LOCSIZE; i++) 161 1.7 lukem if (ltext[i].seekadr != 0 && travel[i] != 0) 162 1.7 lukem if ((travel[i]->tverb) == 1) 163 1.7 lukem cond[i] = 2; 164 1.7 lukem for (j = 100; j > 0; j--) 165 1.7 lukem if (fixd[j] > 0) { 166 1.7 lukem drop(j + 100, fixd[j]); 167 1.7 lukem drop(j, plac[j]); 168 1.1 jtc } 169 1.7 lukem for (j = 100; j > 0; j--) { 170 1.7 lukem fixed[j] = fixd[j]; 171 1.7 lukem if (plac[j] != 0 && fixd[j] <= 0) 172 1.7 lukem drop(j, plac[j]); 173 1.1 jtc } 174 1.1 jtc 175 1.7 lukem maxtrs = 79; 176 1.7 lukem tally = 0; 177 1.7 lukem tally2 = 0; 178 1.7 lukem 179 1.7 lukem for (i = 50; i <= maxtrs; i++) { 180 1.7 lukem if (ptext[i].seekadr != 0) 181 1.7 lukem prop[i] = -1; 182 1.1 jtc tally -= prop[i]; 183 1.1 jtc } 184 1.1 jtc 185 1.1 jtc /* define mnemonics */ 186 1.7 lukem keys = vocab(DECR('k', 'e', 'y', 's', '\0'), 1, 0); 187 1.7 lukem lamp = vocab(DECR('l', 'a', 'm', 'p', '\0'), 1, 0); 188 1.7 lukem grate = vocab(DECR('g', 'r', 'a', 't', 'e'), 1, 0); 189 1.7 lukem cage = vocab(DECR('c', 'a', 'g', 'e', '\0'), 1, 0); 190 1.7 lukem rod = vocab(DECR('r', 'o', 'd', '\0', '\0'), 1, 0); 191 1.7 lukem rod2 = rod + 1; 192 1.7 lukem steps = vocab(DECR('s', 't', 'e', 'p', 's'), 1, 0); 193 1.7 lukem bird = vocab(DECR('b', 'i', 'r', 'd', '\0'), 1, 0); 194 1.7 lukem door = vocab(DECR('d', 'o', 'o', 'r', '\0'), 1, 0); 195 1.7 lukem pillow = vocab(DECR('p', 'i', 'l', 'l', 'o'), 1, 0); 196 1.7 lukem snake = vocab(DECR('s', 'n', 'a', 'k', 'e'), 1, 0); 197 1.19 dholland fissure = vocab(DECR('f', 'i', 's', 's', 'u'), 1, 0); 198 1.7 lukem tablet = vocab(DECR('t', 'a', 'b', 'l', 'e'), 1, 0); 199 1.7 lukem clam = vocab(DECR('c', 'l', 'a', 'm', '\0'), 1, 0); 200 1.7 lukem oyster = vocab(DECR('o', 'y', 's', 't', 'e'), 1, 0); 201 1.19 dholland magazine = vocab(DECR('m', 'a', 'g', 'a', 'z'), 1, 0); 202 1.7 lukem dwarf = vocab(DECR('d', 'w', 'a', 'r', 'f'), 1, 0); 203 1.7 lukem knife = vocab(DECR('k', 'n', 'i', 'f', 'e'), 1, 0); 204 1.7 lukem food = vocab(DECR('f', 'o', 'o', 'd', '\0'), 1, 0); 205 1.7 lukem bottle = vocab(DECR('b', 'o', 't', 't', 'l'), 1, 0); 206 1.7 lukem water = vocab(DECR('w', 'a', 't', 'e', 'r'), 1, 0); 207 1.7 lukem oil = vocab(DECR('o', 'i', 'l', '\0', '\0'), 1, 0); 208 1.7 lukem plant = vocab(DECR('p', 'l', 'a', 'n', 't'), 1, 0); 209 1.7 lukem plant2 = plant + 1; 210 1.7 lukem axe = vocab(DECR('a', 'x', 'e', '\0', '\0'), 1, 0); 211 1.7 lukem mirror = vocab(DECR('m', 'i', 'r', 'r', 'o'), 1, 0); 212 1.7 lukem dragon = vocab(DECR('d', 'r', 'a', 'g', 'o'), 1, 0); 213 1.7 lukem chasm = vocab(DECR('c', 'h', 'a', 's', 'm'), 1, 0); 214 1.7 lukem troll = vocab(DECR('t', 'r', 'o', 'l', 'l'), 1, 0); 215 1.7 lukem troll2 = troll + 1; 216 1.7 lukem bear = vocab(DECR('b', 'e', 'a', 'r', '\0'), 1, 0); 217 1.19 dholland message = vocab(DECR('m', 'e', 's', 's', 'a'), 1, 0); 218 1.7 lukem vend = vocab(DECR('v', 'e', 'n', 'd', 'i'), 1, 0); 219 1.7 lukem batter = vocab(DECR('b', 'a', 't', 't', 'e'), 1, 0); 220 1.7 lukem 221 1.7 lukem nugget = vocab(DECR('g', 'o', 'l', 'd', '\0'), 1, 0); 222 1.7 lukem coins = vocab(DECR('c', 'o', 'i', 'n', 's'), 1, 0); 223 1.7 lukem chest = vocab(DECR('c', 'h', 'e', 's', 't'), 1, 0); 224 1.7 lukem eggs = vocab(DECR('e', 'g', 'g', 's', '\0'), 1, 0); 225 1.19 dholland trident = vocab(DECR('t', 'r', 'i', 'd', 'e'), 1, 0); 226 1.7 lukem vase = vocab(DECR('v', 'a', 's', 'e', '\0'), 1, 0); 227 1.19 dholland emerald = vocab(DECR('e', 'm', 'e', 'r', 'a'), 1, 0); 228 1.19 dholland pyramid = vocab(DECR('p', 'y', 'r', 'a', 'm'), 1, 0); 229 1.7 lukem pearl = vocab(DECR('p', 'e', 'a', 'r', 'l'), 1, 0); 230 1.7 lukem rug = vocab(DECR('r', 'u', 'g', '\0', '\0'), 1, 0); 231 1.7 lukem chain = vocab(DECR('c', 'h', 'a', 'i', 'n'), 1, 0); 232 1.7 lukem 233 1.7 lukem back = vocab(DECR('b', 'a', 'c', 'k', '\0'), 0, 0); 234 1.7 lukem look = vocab(DECR('l', 'o', 'o', 'k', '\0'), 0, 0); 235 1.7 lukem cave = vocab(DECR('c', 'a', 'v', 'e', '\0'), 0, 0); 236 1.7 lukem null = vocab(DECR('n', 'u', 'l', 'l', '\0'), 0, 0); 237 1.19 dholland entrance = vocab(DECR('e', 'n', 't', 'r', 'a'), 0, 0); 238 1.19 dholland depression = vocab(DECR('d', 'e', 'p', 'r', 'e'), 0, 0); 239 1.7 lukem enter = vocab(DECR('e', 'n', 't', 'e', 'r'), 0, 0); 240 1.7 lukem 241 1.7 lukem pour = vocab(DECR('p', 'o', 'u', 'r', '\0'), 2, 0); 242 1.7 lukem say = vocab(DECR('s', 'a', 'y', '\0', '\0'), 2, 0); 243 1.7 lukem lock = vocab(DECR('l', 'o', 'c', 'k', '\0'), 2, 0); 244 1.7 lukem throw = vocab(DECR('t', 'h', 'r', 'o', 'w'), 2, 0); 245 1.7 lukem find = vocab(DECR('f', 'i', 'n', 'd', '\0'), 2, 0); 246 1.7 lukem invent = vocab(DECR('i', 'n', 'v', 'e', 'n'), 2, 0); 247 1.1 jtc 248 1.1 jtc /* initialize dwarves */ 249 1.7 lukem chloc = 114; 250 1.7 lukem chloc2 = 140; 251 1.7 lukem for (i = 1; i <= 6; i++) 252 1.7 lukem dseen[i] = FALSE; 253 1.7 lukem dflag = 0; 254 1.7 lukem dloc[1] = 19; 255 1.7 lukem dloc[2] = 27; 256 1.7 lukem dloc[3] = 33; 257 1.7 lukem dloc[4] = 44; 258 1.7 lukem dloc[5] = 64; 259 1.7 lukem dloc[6] = chloc; 260 1.19 dholland daltloc = 18; 261 1.1 jtc 262 1.1 jtc /* random flags & ctrs */ 263 1.7 lukem turns = 0; 264 1.7 lukem lmwarn = FALSE; 265 1.7 lukem iwest = 0; 266 1.7 lukem knfloc = 0; 267 1.7 lukem detail = 0; 268 1.7 lukem abbnum = 5; 269 1.7 lukem for (i = 0; i <= 4; i++) 270 1.7 lukem if (rtext[2 * i + 81].seekadr != 0) 271 1.7 lukem maxdie = i + 1; 272 1.19 dholland numdie = holding = dkill = foobar = bonus = 0; 273 1.7 lukem clock1 = 30; 274 1.7 lukem clock2 = 50; 275 1.7 lukem saved = 0; 276 1.19 dholland isclosing = panic = closed = scoring = FALSE; 277 1.1 jtc } 278 1.1 jtc 279 1.15 jmc /* come here if he hits a del */ 280 1.5 christos void 281 1.17 perry trapdel(int n __unused) 282 1.7 lukem { 283 1.10 hubertf delhit = 1; /* main checks, treats as QUIT */ 284 1.7 lukem signal(SIGINT, trapdel);/* catch subsequent DELs */ 285 1.1 jtc } 286 1.1 jtc 287 1.1 jtc 288 1.5 christos void 289 1.15 jmc startup(void) 290 1.1 jtc { 291 1.9 hubertf demo = Start(); 292 1.20 plunky srand((int)time(NULL)); /* random seed */ 293 1.5 christos #if 0 294 1.7 lukem srand(371); /* non-random seed */ 295 1.5 christos #endif 296 1.7 lukem hinted[3] = yes(65, 1, 0); 297 1.7 lukem newloc = 1; 298 1.1 jtc delhit = 0; 299 1.7 lukem limit = 330; 300 1.7 lukem if (hinted[3]) 301 1.7 lukem limit = 1000; /* better batteries if instrucs */ 302 1.1 jtc } 303