comparison xrogue/rip.c @ 133:e6179860cb76

Import XRogue 8.0 from the Roguelike Restoration Project (r1490)
author John "Elwin" Edwards
date Tue, 21 Apr 2015 08:55:20 -0400
parents
children ce0cf824c192
comparison
equal deleted inserted replaced
124:d10fc4a065ac 133:e6179860cb76
1 /*
2 rip.c - File for the fun ends Death or a total win
3
4 XRogue: Expeditions into the Dungeons of Doom
5 Copyright (C) 1991 Robert Pietkivitch
6 All rights reserved.
7
8 Based on "Advanced Rogue"
9 Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka and AT&T
10 All rights reserved.
11
12 Based on "Rogue: Exploring the Dungeons of Doom"
13 Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
14 All rights reserved.
15
16 See the file LICENSE.TXT for full copyright and licensing information.
17 */
18
19 #define REALLIFE 1 /* Print out machine and logname */
20 #define EDITSCORE 2 /* Edit the current score file */
21 #define ADDSCORE 3 /* Add a new score */
22
23 #include <curses.h>
24 #include <time.h>
25 #include <signal.h>
26 #include <ctype.h>
27 #include <sys/types.h>
28 #include <fcntl.h>
29 #include "mach_dep.h"
30 #include "network.h"
31 #include "rogue.h"
32
33 /* Network machines (for mutual score keeping) */
34 struct network Network[] = {
35 { "", "" },
36 };
37
38 static char *rip[] = {
39 " ___________",
40 " / \\",
41 " / \\",
42 " / R. I. P. \\",
43 " / \\",
44 " / \\",
45 " | |",
46 " | |",
47 " | killed by |",
48 " | |",
49 " | |",
50 " | |",
51 " *| * * * |*",
52 " _________)|//\\\\///\\///\\//\\//\\/|(_________",
53 NULL
54 };
55
56 char *killname();
57
58 /*UNUSED*/
59 void
60 byebye(sig)
61 int sig;
62 {
63 NOOP(sig);
64 exit_game(EXIT_ENDWIN);
65 }
66
67
68 /*
69 * death:
70 * Do something really fun when he dies
71 */
72
73 death(monst)
74 register short monst;
75 {
76 register char **dp = rip, *killer;
77 register struct tm *lt;
78 time_t date;
79 char buf[LINELEN];
80 struct tm *localtime();
81
82 time(&date);
83 lt = localtime(&date);
84 clear();
85 move(8, 0);
86 while (*dp)
87 printw("%s\n", *dp++);
88 mvaddstr(14, 28-((strlen(whoami)+1)/2), whoami);
89 sprintf(buf, "%lu Points", pstats.s_exp );
90 mvaddstr(15, 28-((strlen(buf)+1)/2), buf);
91 killer = killname(monst);
92 mvaddstr(17, 28-((strlen(killer)+1)/2), killer);
93 mvaddstr(18, 25, (sprintf(prbuf, "%4d", 1900+lt->tm_year), prbuf));
94 move(lines-1, 0);
95 refresh();
96 score(pstats.s_exp, KILLED, monst);
97 exit_game(EXIT_ENDWIN);
98 }
99
100 char *
101 killname(monst)
102 register short monst;
103 {
104 static char mons_name[LINELEN/2];
105 int i;
106
107 if (monst > NUMMONST) return("a strange monster");
108
109 if (monst >= 0) {
110 switch (monsters[monst].m_name[0]) {
111 case 'a':
112 case 'e':
113 case 'i':
114 case 'o':
115 case 'u':
116 sprintf(mons_name, "an %s", monsters[monst].m_name);
117 break;
118 default:
119 sprintf(mons_name, "a %s", monsters[monst].m_name);
120 }
121 return(mons_name);
122 }
123 for (i = 0; i< DEATHNUM; i++) {
124 if (deaths[i].reason == monst)
125 break;
126 }
127 if (i >= DEATHNUM)
128 return ("strange death");
129 return (deaths[i].name);
130 }
131
132 /*
133 * score -- figure score and post it.
134 */
135
136 /* VARARGS2 */
137 score(amount, flags, monst)
138 unsigned long amount;
139 int flags;
140 short monst;
141 {
142 struct sc_ent top_ten[NUMSCORE];
143 register struct sc_ent *scp;
144 register int i;
145 register struct sc_ent *sc2;
146 register FILE *outf;
147 register char *killer;
148 register int prflags = 0;
149 short upquest=0, wintype=0, uplevel=0, uptype=0; /* For network updating */
150 char upsystem[SYSLEN], uplogin[LOGLEN];
151 char *thissys; /* Holds the name of this system */
152
153 #define REASONLEN 3
154 static char *reason[] = {
155 "killed",
156 "quit",
157 "A total winner",
158 "somehow left",
159 };
160 char *packend;
161
162 memset(top_ten,0,sizeof(top_ten));
163
164 signal(SIGINT, byebye);
165 if (level == 0 && max_level == 0)
166 amount = 0; /*don't count if quit early */
167 if (flags != WINNER && flags != SCOREIT && flags != UPDATE) {
168 if (flags == CHICKEN) {
169 packend = "when you quit";
170 amount = amount / 100;
171 }
172 else
173 packend = "at your untimely demise";
174 mvaddstr(lines - 1, 0, retstr);
175 refresh();
176 getstr(prbuf);
177 showpack(packend);
178 }
179 purse = 0; /* Steal all the gold */
180
181 /*
182 * Open file and read list
183 */
184
185 if ((outf = fopen(score_file, "rb+")) == NULL)
186 {
187 if ((outf = fopen(score_file, "wb+")) == NULL)
188 {
189 mvprintw(lines - 1, 0, "Unable to open or create score file: %s",score_file);
190 refresh();
191 return;
192 }
193 }
194
195 thissys = md_gethostname();
196
197 /*
198 * If this is a SCOREIT optin (rogue -s), don't call byebye. The
199 * endwin() calls in byebye() will and this results in a core dump.
200 */
201 if (flags == SCOREIT) signal(SIGINT, SIG_DFL);
202 else signal(SIGINT, byebye);
203
204 if (flags != SCOREIT && flags != UPDATE)
205 {
206 mvaddstr(lines - 1, 0, retstr);
207 refresh();
208 fflush(stdout);
209 getstr(prbuf);
210 }
211
212 /* Check for special options */
213 if (strcmp(prbuf, "names") == 0)
214 prflags = REALLIFE;
215 else if (wizard) {
216 if (strcmp(prbuf, "edit") == 0) prflags = EDITSCORE;
217 else if (strcmp(prbuf, "add") == 0) {
218 prflags = ADDSCORE;
219 waswizard = FALSE; /* We want the new score recorded */
220 }
221 }
222
223 /* Read the score and convert it to a compatible format */
224
225 fseek(outf, 0, SEEK_SET);
226 rs_read_scorefile(outf, top_ten, NUMSCORE);
227
228 /* Get some values if this is an update */
229 if (flags == UPDATE) {
230 int errcheck, errors = 0;
231
232 upquest = (short) netread(&errcheck, sizeof(short), stdin);
233 if (errcheck) errors++;
234
235 if (fread(whoami, 1, NAMELEN, stdin) != NAMELEN) errors++;
236
237 wintype = (short) netread(&errcheck, sizeof(short), stdin);
238 if (errcheck) errors++;
239
240 uplevel = (short) netread(&errcheck, sizeof(short), stdin);
241 if (errcheck) errors++;
242
243 uptype = (short) netread(&errcheck, sizeof(short), stdin);
244 if (errcheck) errors++;
245
246 if (fread(upsystem, 1, SYSLEN, stdin) != SYSLEN)
247 errors++;
248 if (fread(uplogin, 1, LOGLEN, stdin) != LOGLEN)
249 errors++;
250
251 if (errors) {
252 fclose(outf);
253 return;
254 }
255 }
256
257 /*
258 * Insert player in list if need be
259 */
260 if (!waswizard) {
261 char *login= NULL;
262
263 if (flags != UPDATE) {
264 login = md_getusername();
265
266 if ((login == NULL) || (*login == 0))
267 login = "another rogue fiend";
268 }
269
270 if (flags == UPDATE)
271 (void) update(top_ten, amount, upquest, whoami, wintype,
272 uplevel, monst, uptype, upsystem, uplogin);
273 else {
274 if (prflags == ADDSCORE) { /* Overlay characteristic by new ones */
275 char buffer[LINELEN];
276
277 clear();
278 mvaddstr(1, 0, "Score: ");
279 mvaddstr(2, 0, "Quest (number): ");
280 mvaddstr(3, 0, "Name: ");
281 mvaddstr(4, 0, "System: ");
282 mvaddstr(5, 0, "Login: ");
283 mvaddstr(6, 0, "Level: ");
284 mvaddstr(7, 0, "Char type: ");
285 mvaddstr(8, 0, "Result: ");
286
287 /* Get the score */
288 move(1, 7);
289 get_str(buffer, stdscr);
290 amount = atol(buffer);
291
292 /* Get the character's quest -- must be a number */
293 move(2, 16);
294 get_str(buffer, stdscr);
295 quest_item = atoi(buffer);
296
297 /* Get the character's name */
298 move(3, 6);
299 get_str(buffer, stdscr);
300 strncpy(whoami, buffer, NAMELEN);
301
302 /* Get the system */
303 move(4, 8);
304 get_str(buffer, stdscr);
305 strncpy(thissys, buffer, SYSLEN);
306
307 /* Get the login */
308 move(5, 7);
309 get_str(buffer, stdscr);
310 strncpy(login, buffer, LOGLEN);
311
312 /* Get the level */
313 move(6, 7);
314 get_str(buffer, stdscr);
315 level = max_level = (short) atoi(buffer);
316
317 /* Get the character type */
318 move(7, 11);
319 get_str(buffer, stdscr);
320 for (i=0; i<NUM_CHARTYPES; i++) {
321 if (EQSTR(buffer, char_class[i].name, strlen(buffer)))
322 break;
323 }
324 player.t_ctype = i;
325
326 /* Get the win type */
327 move(8, 8);
328 get_str(buffer, stdscr);
329 switch (buffer[0]) {
330 case 'W':
331 case 'w':
332 case 'T':
333 case 't':
334 flags = WINNER;
335 break;
336
337 case 'Q':
338 case 'q':
339 flags = CHICKEN;
340 break;
341
342 case 'k':
343 case 'K':
344 default:
345 flags = KILLED;
346 break;
347 }
348
349 /* Get the monster if player was killed */
350 if (flags == KILLED) {
351 mvaddstr(9, 0, "Death type: ");
352 get_str(buffer, stdscr);
353 if (buffer[0] == 'M' || buffer[0] == 'm')
354 do {
355 monst = makemonster(TRUE, "choose");
356 } while (monst < 0); /* Force a choice */
357 else monst = getdeath();
358 }
359 }
360
361 if (update(top_ten, amount, (short) quest_item, whoami, flags,
362 (flags == WINNER) ? (short) max_level : (short) level,
363 monst, player.t_ctype, thissys, login)
364 ) {
365 /* Send this update to the other systems in the network */
366 int i, j;
367 char cmd[256]; /* Command for remote execution */