Home | History | Annotate | Line # | Download | only in adventure
wizard.c revision 1.14
      1  1.14  dholland /*	$NetBSD: wizard.c,v 1.14 2009/08/25 06:56:52 dholland Exp $	*/
      2   1.2       cgd 
      3   1.1       jtc /*-
      4   1.1       jtc  * Copyright (c) 1991, 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.11       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.4  christos #include <sys/cdefs.h>
     38   1.1       jtc #ifndef lint
     39   1.2       cgd #if 0
     40   1.1       jtc static char sccsid[] = "@(#)wizard.c	8.1 (Berkeley) 6/2/93";
     41   1.2       cgd #else
     42  1.14  dholland __RCSID("$NetBSD: wizard.c,v 1.14 2009/08/25 06:56:52 dholland Exp $");
     43   1.2       cgd #endif
     44   1.6     lukem #endif				/* not lint */
     45   1.1       jtc 
     46   1.1       jtc /*      Re-coding of advent in C: privileged operations                 */
     47   1.1       jtc 
     48   1.4  christos #include <stdio.h>
     49   1.3       cgd #include <string.h>
     50   1.4  christos #include <stdlib.h>
     51   1.4  christos #include <time.h>
     52   1.4  christos #include "hdr.h"
     53   1.4  christos #include "extern.h"
     54   1.1       jtc 
     55  1.13  dholland static int wizard(void);
     56  1.13  dholland 
     57   1.4  christos void
     58  1.12       jmc datime(int *d, int *t)
     59   1.6     lukem {
     60   1.6     lukem 	time_t  tvec;
     61   1.4  christos 	struct tm *tptr;
     62   1.1       jtc 
     63   1.4  christos 	time(&tvec);
     64   1.6     lukem 	tptr = localtime(&tvec);
     65   1.4  christos 	/* day since 1977  (mod leap)   */
     66   1.7   hubertf 	*d = (tptr->tm_yday + 365 * (tptr->tm_year - 77)
     67   1.7   hubertf              + (tptr->tm_year - 77) / 4 - (tptr->tm_year - 1) / 100
     68   1.7   hubertf              + (tptr->tm_year + 299) / 400);
     69   1.7   hubertf 	/* bug: this will overflow in the year 2066 AD (with 16 bit int) */
     70   1.1       jtc 	/* it will be attributed to Wm the C's millenial celebration    */
     71   1.4  christos 	/* and minutes since midnite */
     72   1.6     lukem 	*t = tptr->tm_hour * 60 + tptr->tm_min;
     73   1.6     lukem }				/* pretty painless              */
     74   1.1       jtc 
     75   1.1       jtc 
     76  1.13  dholland static char magic[6];
     77   1.1       jtc 
     78   1.4  christos void
     79  1.12       jmc poof(void)
     80   1.1       jtc {
     81   1.6     lukem 	strcpy(magic, DECR('d', 'w', 'a', 'r', 'f'));
     82  1.14  dholland 	latency = 45;
     83   1.1       jtc }
     84   1.1       jtc 
     85   1.4  christos int
     86  1.12       jmc Start(void)
     87   1.6     lukem {
     88   1.6     lukem 	int     d, t, delay;
     89   1.1       jtc 
     90   1.6     lukem 	datime(&d, &t);
     91  1.10   hubertf 	delay = (d - saveday) * 1440 + (t - savet);	/* good for about a
     92   1.6     lukem 							 * month     */
     93   1.6     lukem 
     94  1.14  dholland 	if (delay >= latency) {
     95   1.6     lukem 		saved = -1;
     96   1.6     lukem 		return (FALSE);
     97   1.1       jtc 	}
     98   1.1       jtc 	printf("This adventure was suspended a mere %d minute%s ago.",
     99   1.6     lukem 	    delay, delay == 1 ? "" : "s");
    100  1.14  dholland 	if (delay <= latency / 3) {
    101   1.6     lukem 		mspeak(2);
    102   1.1       jtc 		exit(0);
    103   1.1       jtc 	}
    104   1.1       jtc 	mspeak(8);
    105   1.6     lukem 	if (!wizard()) {
    106   1.6     lukem 		mspeak(9);
    107   1.1       jtc 		exit(0);
    108   1.1       jtc 	}
    109   1.1       jtc 	saved = -1;
    110   1.6     lukem 	return (FALSE);
    111   1.1       jtc }
    112   1.1       jtc 
    113  1.12       jmc /* not as complex as advent/10 (for now)        */
    114  1.13  dholland static int
    115  1.12       jmc wizard(void)
    116  1.12       jmc {
    117   1.6     lukem 	char   *word, *x;
    118   1.6     lukem 	if (!yesm(16, 0, 7))
    119   1.6     lukem 		return (FALSE);
    120   1.1       jtc 	mspeak(17);
    121   1.6     lukem 	getin(&word, &x);
    122   1.6     lukem 	if (!weq(word, magic)) {
    123   1.6     lukem 		mspeak(20);
    124   1.6     lukem 		return (FALSE);
    125   1.1       jtc 	}
    126   1.1       jtc 	mspeak(19);
    127   1.6     lukem 	return (TRUE);
    128   1.1       jtc }
    129   1.1       jtc 
    130   1.4  christos void
    131  1.12       jmc ciao(void)
    132   1.6     lukem {
    133   1.6     lukem 	char   *c;
    134   1.6     lukem 	char    fname[80];
    135   1.1       jtc 
    136   1.1       jtc 	printf("What would you like to call the saved version?\n");
    137   1.9   hubertf 	/* XXX - should use fgetln to avoid arbitrary limit */
    138   1.9   hubertf 	for (c = fname; c < fname + sizeof fname - 1; c++) {
    139   1.9   hubertf 		int ch;
    140   1.9   hubertf 		ch = getchar();
    141   1.9   hubertf 		if (ch == '\n' || ch == EOF)
    142   1.6     lukem 			break;
    143   1.9   hubertf 		*c = ch;
    144   1.9   hubertf 	}
    145   1.6     lukem 	*c = 0;
    146   1.6     lukem 	if (save(fname) != 0)
    147   1.6     lukem 		return;		/* Save failed */
    148   1.1       jtc 	printf("To resume, say \"adventure %s\".\n", fname);
    149  1.12       jmc 	printf("\"With these rooms I might now have been familiarly ");
    150  1.12       jmc 	printf("acquainted.\"\n");
    151   1.1       jtc 	exit(0);
    152   1.1       jtc }
    153   1.1       jtc 
    154   1.1       jtc 
    155   1.4  christos int
    156  1.12       jmc ran(int range)
    157   1.1       jtc {
    158   1.6     lukem 	long    i;
    159   1.1       jtc 
    160   1.1       jtc 	i = rand() % range;
    161   1.6     lukem 	return (i);
    162   1.1       jtc }
    163