1 /* $OpenBSD: init.c,v 1.16 2015/12/31 17:51:19 mestre Exp $ */ 2 /* $NetBSD: init.c,v 1.4 1995/03/21 15:07:35 cgd Exp $ */ 3 4 /* 5 * Copyright (c) 1983, 1993 6 * The Regents of the University of California. All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 3. Neither the name of the University nor the names of its contributors 17 * may be used to endorse or promote products derived from this software 18 * without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 30 * SUCH DAMAGE. 31 */ 32 33 #include <err.h> 34 #include <signal.h> 35 #include <stdio.h> 36 #include <stdlib.h> 37 #include <string.h> 38 #include <unistd.h> 39 40 #include "extern.h" 41 42 static int checkout(const char *); 43 static const char *getutmp(void); 44 static int wizard(const char *); 45 46 void 47 initialize(const char *filename) 48 { 49 const struct objs *p; 50 char *savefile; 51 52 puts("Version 4.2, fall 1984."); 53 puts("First Adventure game written by His Lordship, the honorable"); 54 puts("Admiral D.W. Riggle\n"); 55 location = dayfile; 56 username = getutmp(); 57 if (username == NULL) 58 errx(1, "Don't know who you are."); 59 wordinit(); 60 if (filename == NULL) { 61 direction = NORTH; 62 ourtime = 0; 63 snooze = CYCLE * 1.5; 64 position = 22; 65 SetBit(wear, PAJAMAS); 66 fuel = TANKFULL; 67 torps = TORPEDOES; 68 for (p = dayobjs; p->room != 0; p++) 69 SetBit(location[p->room].objects, p->obj); 70 } else { 71 savefile = save_file_name(filename, strlen(filename)); 72 restore(savefile); 73 free(savefile); 74 } 75 wiz = wizard(username); 76 signal(SIGINT, die); 77 } 78 79 static const char * 80 getutmp(void) 81 { 82 const char *name; 83 84 name = getenv("LOGNAME"); 85 if (name == NULL || *name == 0) 86 name = getenv("USER"); 87 if (name == NULL || *name == 0) 88 name = getlogin(); 89 if (name == NULL || *name == 0) 90 name = " ??? "; 91 92 return(strdup(name)); 93 } 94 95 /* Hereditary wizards. A configuration file might make more sense. */ 96 static const char *const list[] = { 97 "riggle", 98 "chris", 99 "edward", 100 "comay", 101 "yee", 102 "dmr", 103 "ken", 104 0 105 }; 106 107 static const char *const badguys[] = { 108 "wnj", 109 "root", 110 "ted", 111 0 112 }; 113 114 static int 115 wizard(const char *username) 116 { 117 int flag; 118 119 if ((flag = checkout(username)) != 0) 120 printf("You are the Great wizard %s.\n", username); 121 return flag; 122 } 123 124 static int 125 checkout(const char *username) 126 { 127 const char *const *ptr; 128 129 for (ptr = list; *ptr; ptr++) 130 if (strcmp(*ptr, username) == 0) 131 return 1; 132 for (ptr = badguys; *ptr; ptr++) 133 if (strcmp(*ptr, username) == 0) { 134 printf("You are the Poor anti-wizard %s. Good Luck!\n", 135 username); 136 if (location != NULL) { 137 CUMBER = 3; 138 WEIGHT = 9; /* that'll get him! */ 139 ourclock = 10; 140 SetBit(location[7].objects, WOODSMAN); /* viper room */ 141 SetBit(location[20].objects, WOODSMAN); /* laser " */ 142 SetBit(location[13].objects, DARK); /* amulet " */ 143 SetBit(location[8].objects, ELF); /* closet */ 144 } 145 return 0; /* anything else, Chris? */ 146 } 147 return 0; 148 } 149