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