1 /* @(#)wizard.c 8.1 (Berkeley) 6/2/93 */ 2 /* $NetBSD: wizard.c,v 1.16 2012/10/12 15:41:10 dholland Exp $ */ 3 4 /*- 5 * Copyright (c) 1991, 1993 6 * The Regents of the University of California. All rights reserved. 7 * 8 * The game adventure was originally written in Fortran by Will Crowther 9 * and Don Woods. It was later translated to C and enhanced by Jim 10 * Gillogly. This code is derived from software contributed to Berkeley 11 * by Jim Gillogly at The Rand Corporation. 12 * 13 * Redistribution and use in source and binary forms, with or without 14 * modification, are permitted provided that the following conditions 15 * are met: 16 * 1. Redistributions of source code must retain the above copyright 17 * notice, this list of conditions and the following disclaimer. 18 * 2. Redistributions in binary form must reproduce the above copyright 19 * notice, this list of conditions and the following disclaimer in the 20 * documentation and/or other materials provided with the distribution. 21 * 3. Neither the name of the University nor the names of its contributors 22 * may be used to endorse or promote products derived from this software 23 * without specific prior written permission. 24 * 25 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 26 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 28 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 31 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 32 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 33 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 34 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 35 * SUCH DAMAGE. 36 */ 37 38 /* Re-coding of advent in C: privileged operations */ 39 40 #include <stdio.h> 41 #include <string.h> 42 #include <stdlib.h> 43 #include <time.h> 44 #include "hdr.h" 45 #include "extern.h" 46 47 static int wizard(void); 48 49 void 50 datime(int *d, int *t) 51 { 52 time_t tvec; 53 struct tm *tptr; 54 55 time(&tvec); 56 tptr = localtime(&tvec); 57 /* day since 1977 (mod leap) */ 58 *d = (tptr->tm_yday + 365 * (tptr->tm_year - 77) 59 + (tptr->tm_year - 77) / 4 - (tptr->tm_year - 1) / 100 60 + (tptr->tm_year + 299) / 400); 61 /* bug: this will overflow in the year 2066 AD (with 16 bit int) */ 62 /* it will be attributed to Wm the C's millenial celebration */ 63 /* and minutes since midnite */ 64 *t = tptr->tm_hour * 60 + tptr->tm_min; 65 } /* pretty painless */ 66 67 68 static char magic[6]; 69 70 void 71 poof(void) 72 { 73 strcpy(magic, DECR('d', 'w', 'a', 'r', 'f')); 74 latency = 45; 75 } 76 77 int 78 Start(void) 79 { 80 int d, t, delay; 81 82 datime(&d, &t); 83 delay = (d - saveday) * 1440 + (t - savet); /* good for about a 84 * month */ 85 86 if (delay >= latency) { 87 saved = -1; 88 return (FALSE); 89 } 90 printf("This adventure was suspended a mere %d minute%s ago.", 91 delay, delay == 1 ? "" : "s"); 92 if (delay <= latency / 3) { 93 mspeak(2); 94 exit(0); 95 } 96 mspeak(8); 97 if (!wizard()) { 98 mspeak(9); 99 exit(0); 100 } 101 saved = -1; 102 return (FALSE); 103 } 104 105 /* not as complex as advent/10 (for now) */ 106 static int 107 wizard(void) 108 { 109 char *word, *x; 110 if (!yesm(16, 0, 7)) 111 return (FALSE); 112 mspeak(17); 113 getin(&word, &x); 114 if (!weq(word, magic)) { 115 mspeak(20); 116 return (FALSE); 117 } 118 mspeak(19); 119 return (TRUE); 120 } 121 122 void 123 ciao(void) 124 { 125 char fname[80]; 126 size_t pos; 127 128 printf("What would you like to call the saved version?\n"); 129 /* XXX - should use fgetln to avoid arbitrary limit */ 130 for (pos = 0; pos < sizeof(fname) - 1; pos++) { 131 int ch; 132 ch = getchar(); 133 if (ch == '\n' || ch == EOF) 134 break; 135 fname[pos] = ch; 136 } 137 fname[pos] = '\0'; 138 if (save(fname) != 0) 139 return; /* Save failed */ 140 printf("To resume, say \"adventure %s\".\n", fname); 141 printf("\"With these rooms I might now have been familiarly "); 142 printf("acquainted.\"\n"); 143 exit(0); 144 } 145 146 147 int 148 ran(int range) 149 { 150 long i; 151 152 i = rand() % range; 153 return (i); 154 } 155