Mercurial > hg > early-roguelike
comparison arogue7/rip.c @ 125:adfa37e67084
Import Advanced Rogue 7.7 from the Roguelike Restoration Project (r1490)
| author | John "Elwin" Edwards |
|---|---|
| date | Fri, 08 May 2015 15:24:40 -0400 |
| parents | |
| children | b786053d2f37 |
comparison
equal
deleted
inserted
replaced
| 124:d10fc4a065ac | 125:adfa37e67084 |
|---|---|
| 1 /* | |
| 2 * rip.c - File for the fun ends Death or a total win | |
| 3 * | |
| 4 * Advanced Rogue | |
| 5 * Copyright (C) 1984, 1985, 1986 Michael Morgan, Ken Dalka and AT&T | |
| 6 * All rights reserved. | |
| 7 * | |
| 8 * Based on "Rogue: Exploring the Dungeons of Doom" | |
| 9 * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman | |
| 10 * All rights reserved. | |
| 11 * | |
| 12 * See the file LICENSE.TXT for full copyright and licensing information. | |
| 13 */ | |
| 14 | |
| 15 /* Print flags for scoring */ | |
| 16 #define REALLIFE 1 /* Print out machine and logname */ | |
| 17 #define EDITSCORE 2 /* Edit the current score file */ | |
| 18 #define ADDSCORE 3 /* Add a new score */ | |
| 19 | |
| 20 #define NAMELEN 80 | |
| 21 | |
| 22 /* | |
| 23 * File for the fun ends | |
| 24 * Death or a total win | |
| 25 * | |
| 26 */ | |
| 27 | |
| 28 #include "curses.h" | |
| 29 #ifdef BSD | |
| 30 #include <sys/time.h> | |
| 31 #else | |
| 32 #include <time.h> | |
| 33 #endif | |
| 34 #include <signal.h> | |
| 35 #include <ctype.h> | |
| 36 #include <sys/types.h> | |
| 37 #include <fcntl.h> | |
| 38 #include "mach_dep.h" | |
| 39 #include "network.h" | |
| 40 #include "rogue.h" | |
| 41 #ifdef PC7300 | |
| 42 #include "sys/window.h" | |
| 43 extern struct uwdata wdata, oldwin; | |
| 44 extern char oldtext[WTXTNUM][WTXTLEN]; | |
| 45 #endif | |
| 46 | |
| 47 #ifdef NUMNET | |
| 48 /* Network machines (for mutual score keeping) */ | |
| 49 static struct network Network[NUMNET] = { | |
| 50 { "ihwpt", "/t1/michael/bin/rg" }, | |
| 51 }; | |
| 52 #endif | |
| 53 | |
| 54 /* | |
| 55 * If you change this structure, change the compatibility routines | |
| 56 * scoreout() and scorein() to reflect the change. Also update SCORELEN. | |
| 57 */ | |
| 58 struct sc_ent { | |
| 59 unsigned long sc_score; | |
| 60 char sc_name[NAMELEN]; | |
| 61 char sc_system[SYSLEN]; | |
| 62 char sc_login[LOGLEN]; | |
| 63 short sc_flags; | |
| 64 short sc_level; | |
| 65 short sc_ctype; | |
| 66 short sc_monster; | |
| 67 short sc_quest; | |
| 68 }; | |
| 69 #define SCORELEN \ | |
| 70 (sizeof(unsigned long) + NAMELEN + SYSLEN + LOGLEN + 5*sizeof(short)) | |
| 71 | |
| 72 static char *rip[] = { | |
| 73 " __________", | |
| 74 " / \\", | |
| 75 " / REST \\", | |
| 76 " / IN \\", | |
| 77 " / PEACE \\", | |
| 78 " / \\", | |
| 79 " | |", | |
| 80 " | |", | |
| 81 " | killed by |", | |
| 82 " | |", | |
| 83 " | 1984 |", | |
| 84 " *| * * * | *", | |
| 85 " ________)/\\\\_//(\\/(/\\)/\\//\\/|_)_______", | |
| 86 0 | |
| 87 }; | |
| 88 | |
| 89 char *killname(); | |
| 90 | |
| 91 | |
| 92 | |
| 93 | |
| 94 | |
| 95 void | |
| 96 byebye(sig) | |
| 97 int sig; | |
| 98 { | |
| 99 if (!isendwin()) { | |
| 100 clear(); | |
| 101 endwin(); | |
| 102 } | |
| 103 #ifdef PC7300 | |
| 104 endhardwin(); | |
| 105 #endif | |
| 106 printf("\n"); | |
| 107 exit(0); | |
| 108 } | |
| 109 | |
| 110 | |
| 111 /* | |
| 112 * death: | |
| 113 * Do something really fun when he dies | |
| 114 */ | |
| 115 | |
| 116 death(monst) | |
| 117 register short monst; | |
| 118 { | |
| 119 register char **dp = rip, *killer; | |
| 120 register struct tm *lt; | |
| 121 time_t date; | |
| 122 char buf[LINELEN]; | |
| 123 struct tm *localtime(); | |
| 124 | |
| 125 time(&date); | |
| 126 lt = localtime(&date); | |
| 127 clear(); | |
| 128 move(8, 0); | |
| 129 while (*dp) | |
| 130 printw("%s\n", *dp++); | |
| 131 mvaddstr(14, 28-((strlen(whoami)+1)/2), whoami); | |
| 132 sprintf(buf, "%lu Points", pstats.s_exp ); | |
| 133 mvaddstr(15, 28-((strlen(buf)+1)/2), buf); | |
| 134 killer = killname(monst); | |
| 135 mvaddstr(17, 28-((strlen(killer)+1)/2), killer); | |
| 136 mvaddstr(18, 26, (sprintf(prbuf, "%4d", 1900+lt->tm_year), prbuf)); | |
| 137 move(lines-1, 0); | |
| 138 refresh(); | |
| 139 score(pstats.s_exp, KILLED, monst); | |
| 140 endwin(); | |
| 141 #ifdef PC7300 | |
| 142 endhardwin(); | |
| 143 #endif | |
| 144 exit(0); | |
| 145 } | |
| 146 | |
| 147 #ifdef PC7300 | |
| 148 /* | |
| 149 * Restore window characteristics on a hard window terminal (PC7300). | |
| 150 */ | |
| 151 endhardwin() | |
| 152 { | |
| 153 register int i; | |
| 154 struct utdata labelbuf; | |
| 155 | |
| 156 /* Restore the old window size */ | |
| 157 if (oldwin.uw_width) ioctl(1, WIOCSETD, &oldwin); | |
| 158 | |
| 159 /* Restore the old window text */ | |
| 160 for (i=0; i<WTXTNUM; i++) { | |
| 161 labelbuf.ut_num = i; | |
| 162 strcpy(labelbuf.ut_text, oldtext[i]); | |
| 163 ioctl(1, WIOCSETTEXT, &labelbuf); | |
| 164 } | |
| 165 } | |
| 166 #endif | |
| 167 | |
| 168 char * | |
| 169 killname(monst) | |
| 170 register short monst; | |
| 171 { | |
| 172 static char mons_name[LINELEN]; | |
| 173 int i; | |
| 174 | |
| 175 if (monst > NUMMONST) return("a strange monster"); | |
| 176 | |
| 177 if (monst >= 0) { | |
| 178 switch (monsters[monst].m_name[0]) { | |
| 179 case 'a': | |
| 180 case 'e': | |
| 181 case 'i': | |
| 182 case 'o': | |
| 183 case 'u': | |
| 184 sprintf(mons_name, "an %s", monsters[monst].m_name); | |
| 185 break; | |
| 186 default: | |
| 187 sprintf(mons_name, "a %s", monsters[monst].m_name); | |
| 188 } | |
| 189 return(mons_name); | |
| 190 } | |
| 191 for (i = 0; i< DEATHNUM; i++) { | |
| 192 if (deaths[i].reason == monst) | |
| 193 break; | |
| 194 } | |
| 195 if (i >= DEATHNUM) | |
| 196 return ("strange death"); | |
| 197 return (deaths[i].name); | |
| 198 } | |
| 199 | |
| 200 | |
| 201 /* | |
| 202 * score -- figure score and post it. | |
| 203 */ | |
| 204 | |
| 205 /* VARARGS2 */ | |
| 206 score(amount, flags, monst) | |
| 207 unsigned long amount; | |
| 208 short monst; | |
| 209 { | |
| 210 static struct sc_ent top_ten[NUMSCORE]; | |
| 211 register struct sc_ent *scp; | |
| 212 register int i; | |
| 213 register struct sc_ent *sc2; | |
| 214 register int outfd; | |
| 215 register char *killer; | |
| 216 register int prflags = 0; | |
| 217 register int fd; | |
| 218 short upquest, wintype, uplevel, uptype; /* For network updating */ | |
| 219 char upsystem[SYSLEN], uplogin[LOGLEN]; | |
| 220 char *thissys; /* Holds the name of this system */ | |
| 221 char *compatstr=NULL; /* Holds scores for writing compatible score files */ | |
| 222 char scoreline[100]; | |
| 223 #define REASONLEN 3 | |
| 224 static char *reason[] = { | |
| 225 "killed", | |
| 226 "quit", | |
| 227 "A total winner", | |
| 228 "somehow left", | |
| 229 }; | |
| 230 char *packend; | |
| 231 | |
| 232 signal(SIGINT, byebye); | |
| 233 if (flags != WINNER && flags != SCOREIT && flags != UPDATE) { | |
| 234 if (flags == CHICKEN) | |
| 235 packend = "when you quit"; | |
| 236 else | |
| 237 { | |
| 238 packend = "at your untimely demise"; | |
| 239 mvaddstr(lines - 1, 0, retstr); | |
| 240 refresh(); | |
| 241 getstr(prbuf); | |
| 242 } | |
| 243 showpack(packend); | |
| 244 } | |
| 245 purse = 0; /* Steal all the gold */ | |
| 246 | |
| 247 /* | |
| 248 * Open file and read list | |
| 249 */ | |
| 250 | |
| 251 if ((fd = open(score_file, O_RDWR | O_CREAT, 0666)) < 0) return; | |
| 252 outfd = fd; | |
| 253 | |
| 254 #ifndef SYSTEM | |
| 255 thissys = md_gethostname(); | |
| 256 #else | |
| 257 thissys = SYSTEM; | |
| 258 #endif | |
| 259 | |
| 260 for (scp = top_ten; scp <= &top_ten[NUMSCORE-1]; scp++) | |
| 261 { | |
| 262 scp->sc_score = 0L; | |
| 263 for (i = 0; i < NAMELEN; i++) | |
| 264 scp->sc_name[i] = rnd(255); | |
| 265 scp->sc_quest= RN; | |
| 266 scp->sc_flags = RN; | |
| 267 scp->sc_level = RN; | |
| 268 scp->sc_monster = RN; | |
| 269 scp->sc_ctype = 0; | |
| 270 strncpy(scp->sc_system, thissys, SYSLEN); | |
| 271 scp->sc_login[0] = '\0'; | |
| 272 } | |
| 273 | |
| 274 /* | |
| 275 * If this is a SCOREIT optin (rogue -s), don't call byebye. The | |
| 276 * endwin() call in byebye() will result in a core dump. | |
| 277 */ | |
| 278 if (flags == SCOREIT) signal(SIGINT, SIG_DFL); | |
| 279 else signal(SIGINT, byebye); | |
| 280 | |
| 281 if (flags != SCOREIT && flags != UPDATE) | |
| 282 { | |
| 283 mvaddstr(lines - 1, 0, retstr); | |
| 284 refresh(); | |
| 285 fflush(stdout); | |
| 286 getstr(prbuf); | |
| 287 } | |
| 288 | |
| 289 /* Check for special options */ | |
| 290 if (strcmp(prbuf, "names") == 0) | |
| 291 prflags = REALLIFE; | |
| 292 #ifdef WIZARD | |
| 293 else if (wizard) { | |
| 294 if (strcmp(prbuf, "edit") == 0) prflags = EDITSCORE; | |
| 295 else if (strcmp(prbuf, "add") == 0) { | |
| 296 prflags = ADDSCORE; | |
| 297 waswizard = FALSE; /* We want the new score recorded */ | |
| 298 } | |
| 299 } | |
| 300 #endif | |
| 301 | |
| 302 /* Read the score and convert it to a compatible format */ | |
| 303 for(i = 0; i < NUMSCORE; i++) | |
| 304 { | |
| 305 encread(top_ten[i].sc_name, NAMELEN, fd); | |
| 306 encread(top_ten[i].sc_system, SYSLEN, fd); | |
| 307 encread(top_ten[i].sc_login, LOGLEN, fd); | |
| 308 encread(scoreline, 100, fd); | |
| 309 sscanf(scoreline, " %lu %hd %hd %hd %hd %hd \n", | |
| 310 &top_ten[i].sc_score, &top_ten[i].sc_flags, | |
| 311 &top_ten[i].sc_level, &top_ten[i].sc_ctype, | |
| 312 &top_ten[i].sc_monster, &top_ten[i].sc_quest | |
| 313 ); | |
| 314 } | |
| 315 | |
| 316 /* Get some values if this is an update */ | |
| 317 if (flags == UPDATE) { | |
| 318 unsigned long netread(); | |
| 319 int errcheck, errors = 0; | |
| 320 | |
| 321 upquest = (short) netread(&errcheck, sizeof(short), stdin); | |
| 322 if (errcheck) errors++; | |
| 323 | |
| 324 if (fread(whoami, 1, NAMELEN, stdin) != NAMELEN) errors++; | |
| 325 | |
| 326 wintype = (short) netread(&errcheck, sizeof(short), stdin); | |
| 327 if (errcheck) errors++; | |
| 328 | |
| 329 uplevel = (short) netread(&errcheck, sizeof(short), stdin); | |
| 330 if (errcheck) errors++; | |
| 331 | |
| 332 uptype = (short) netread(&errcheck, sizeof(short), stdin); | |
| 333 if (errcheck) errors++; | |
| 334 | |
| 335 if (fread(upsystem, 1, SYSLEN, stdin) != SYSLEN) | |
| 336 errors++; | |
| 337 if (fread(uplogin, 1, LOGLEN, stdin) != LOGLEN) | |
| 338 errors++; | |
| 339 | |
| 340 if (errors) { | |
| 341 close(outfd); | |
| 342 free(compatstr); | |
| 343 return; | |
| 344 } | |
| 345 } | |
| 346 | |
| 347 /* | |
| 348 * Insert player in list if need be | |
| 349 */ | |
| 350 if (!waswizard) { | |
| 351 char *login; | |
| 352 | |
| 353 if (flags != UPDATE) { | |
| 354 login = md_getusername(); | |
| 355 } | |
| 356 | |
| 357 if (flags == UPDATE) | |
| 358 (void) update(top_ten, amount, upquest, whoami, wintype, | |
| 359 uplevel, monst, uptype, upsystem, uplogin); | |
| 360 else { | |
| 361 #ifdef WIZARD | |
| 362 if (prflags == ADDSCORE) { /* Overlay characteristic by new ones */ | |
| 363 char buffer[LINELEN]; | |
| 364 | |
| 365 clear(); | |
| 366 mvaddstr(1, 0, "Score: "); | |
| 367 mvaddstr(2, 0, "Quest (number): "); | |
| 368 mvaddstr(3, 0, "Name: "); | |
| 369 mvaddstr(4, 0, "System: "); | |
| 370 mvaddstr(5, 0, "Login: "); | |
| 371 mvaddstr(6, 0, "Level: "); | |
| 372 mvaddstr(7, 0, "Char type: "); | |
| 373 mvaddstr(8, 0, "Result: "); | |
| 374 | |
| 375 /* Get the score */ | |
| 376 move(1, 7); | |
| 377 get_str(buffer, stdscr); | |
| 378 amount = atol(buffer); | |
| 379 | |
| 380 /* Get the character's quest -- must be a number */ |
