Home | History | Annotate | Line # | Download | only in adventure
      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