command6.c revision 1.5 1 /* $NetBSD: command6.c,v 1.5 2009/08/12 05:20:38 dholland Exp $ */
2
3 /*
4 * Copyright (c) 1983, 1993
5 * The Regents of the University of California. All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. Neither the name of the University nor the names of its contributors
16 * may be used to endorse or promote products derived from this software
17 * without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 * SUCH DAMAGE.
30 */
31
32 #include <sys/cdefs.h>
33 #ifndef lint
34 #if 0
35 static char sccsid[] = "@(#)com6.c 8.2 (Berkeley) 4/28/95";
36 #else
37 __RCSID("$NetBSD: command6.c,v 1.5 2009/08/12 05:20:38 dholland Exp $");
38 #endif
39 #endif /* not lint */
40
41 #include "extern.h"
42 #include "pathnames.h"
43
44 static void post(int);
45
46 int
47 launch(void)
48 {
49 if (testbit(location[position].objects, VIPER) && !notes[CANTLAUNCH]) {
50 if (fuel > 4) {
51 clearbit(location[position].objects, VIPER);
52 position = location[position].up;
53 notes[LAUNCHED] = 1;
54 ourtime++;
55 fuel -= 4;
56 printf("You climb into the viper and prepare for ");
57 puts("launch.");
58 printf("With a touch of your thumb the turbo engines ");
59 printf("ignite, thrusting you back into\nyour seat.\n");
60 return (1);
61 } else
62 puts("Not enough fuel to launch.");
63 } else
64 puts("Can't launch.");
65 return (0);
66 }
67
68 int
69 land(void)
70 {
71 if (notes[LAUNCHED] && testbit(location[position].objects, LAND) &&
72 location[position].down) {
73 notes[LAUNCHED] = 0;
74 position = location[position].down;
75 setbit(location[position].objects, VIPER);
76 fuel -= 2;
77 ourtime++;
78 puts("You are down.");
79 return (1);
80 } else
81 puts("You can't land here.");
82 return (0);
83 }
84
85 void
86 die(void)
87 { /* endgame */
88 printf("bye.\nYour rating was %s.\n", rate());
89 post(' ');
90 exit(0);
91 }
92
93 void
94 diesig(int dummy __unused)
95 {
96 die();
97 }
98
99 void
100 live(void)
101 {
102 puts("\nYou win!");
103 post('!');
104 exit(0);
105 }
106
107 static FILE *score_fp;
108
109 void
110 open_score_file(void)
111 {
112 score_fp = fopen(_PATH_SCORE, "a");
113 if (score_fp == NULL)
114 warn("open %s for append", _PATH_SCORE);
115 if (score_fp != NULL && fileno(score_fp) < 3)
116 exit(1);
117 }
118
119 static void
120 post(int ch)
121 {
122 time_t tv;
123 char *date;
124 sigset_t isigset, osigset;
125
126 sigemptyset(&isigset);
127 sigaddset(&isigset, SIGINT);
128 sigprocmask(SIG_BLOCK, &isigset, &osigset);
129 tv = time(NULL);
130 date = ctime(&tv);
131 date[24] = '\0';
132 if (score_fp != NULL) {
133 fprintf(score_fp, "%s %8s %c%20s", date, username,
134 ch, rate());
135 if (wiz)
136 fprintf(score_fp, " wizard\n");
137 else
138 if (tempwiz)
139 fprintf(score_fp, " WIZARD!\n");
140 else
141 fprintf(score_fp, "\n");
142 }
143 sigprocmask(SIG_SETMASK, &osigset, (sigset_t *) 0);
144 }
145
146 const char *
147 rate(void)
148 {
149 int score;
150
151 score = max(max(pleasure, power), ego);
152 if (score == pleasure) {
153 if (score < 5)
154 return ("novice");
155 else if (score < 20)
156 return ("junior voyeur");
157 else if (score < 35)
158 return ("Don Juan");
159 else
160 return ("Marquis De Sade");
161 } else if (score == power) {
162 if (score < 5)
163 return ("serf");
164 else if (score < 8)
165 return ("Samurai");
166 else if (score < 13)
167 return ("Klingon");
168 else if (score < 22)
169 return ("Darth Vader");
170 else
171 return ("Sauron the Great");
172 } else {
173 if (score < 5)
174 return ("Polyanna");
175 else if (score < 10)
176 return ("philanthropist");
177 else if (score < 20)
178 return ("Tattoo");
179 else
180 return ("Mr. Roarke");
181 }
182 }
183
184 int
185 drive(void)
186 {
187 if (testbit(location[position].objects, CAR)) {
188 printf("You hop in the car and turn the key. There is ");
189 puts("a perceptible grating noise,");
190 puts("and an explosion knocks you unconscious...");
191 clearbit(location[position].objects, CAR);
192 setbit(location[position].objects, CRASH);
193 injuries[5] = injuries[6] = injuries[7] = injuries[8] = 1;
194 ourtime += 15;
195 zzz();
196 return (0);
197 } else
198 puts("There is nothing to drive here.");
199 return (-1);
200 }
201
202 int
203 ride(void)
204 {
205 if (testbit(location[position].objects, HORSE)) {
206 printf("You climb onto the stallion and kick it in the guts.");
207 puts(" The stupid steed launches");
208 printf("forward through bush and fern. You are thrown and ");
209 puts("the horse gallops off.");
210 clearbit(location[position].objects, HORSE);
211 while (!(position = rnd(NUMOFROOMS + 1)) || !OUTSIDE ||
212 !beenthere[position] || location[position].flyhere)
213 continue;
214 setbit(location[position].objects, HORSE);
215 if (location[position].north)
216 position = location[position].north;
217 else if (location[position].south)
218 position = location[position].south;
219 else if (location[position].east)
220 position = location[position].east;
221 else
222 position = location[position].west;
223 return (0);
224 } else
225 puts("There is no horse here.");
226 return (-1);
227 }
228
229 void
230 light(void)
231 { /* synonyms = {strike, smoke} *//* for
232 * matches, cigars */
233 if (testbit(inven, MATCHES) && matchcount) {
234 puts("Your match splutters to life.");
235 ourtime++;
236 matchlight = 1;
237 matchcount--;
238 if (position == 217) {
239 printf("The whole bungalow explodes with an ");
240 puts("intense blast.");
241 die();
242 }
243 } else
244 puts("You're out of matches.");
245 }
246
247 void
248 dooropen(void)
249 { /* synonyms = {open, unlock} */
250 wordnumber++;
251 if (wordnumber <= wordcount && wordtype[wordnumber] == NOUNS
252 && wordvalue[wordnumber] == DOOR) {
253 switch(position) {
254 case 189:
255 case 231:
256 if (location[189].north == 231)
257 puts("The door is already open.");
258 else
259 puts("The door does not budge.");
260 break;
261 case 30:
262 if (location[30].west == 25)
263 puts("The door is gone.");
264 else
265 puts("The door is locked tight.");
266 break;
267 case 31:
268 puts("That's one immovable door.");
269 break;
270 case 20:
271 puts("The door is already ajar.");
272 break;
273 default:
274 puts("What door?");
275 }
276 } else
277 puts("That doesn't open.");
278 }
279