|
|
1.1 ! root 1: /* $Header: /usr/src/games/warp/RCS/score.c,v 1.1 87/07/03 02:13:26 games Exp $ */ ! 2: ! 3: /* $Log: score.c,v $ ! 4: * Revision 7.0.1.2a 87/07/03 02:13:26 games ! 5: * Fixed numerous long vs. int bugs in printfs, etc. ! 6: * ! 7: * Revision 7.0.1.2 86/10/20 12:06:56 lwall ! 8: * Made all exits reset tty. ! 9: * ! 10: * Revision 7.0.1.1 86/10/16 10:52:47 lwall ! 11: * Added Damage. Fixed random bugs. ! 12: * ! 13: * Revision 7.0 86/10/08 15:13:14 lwall ! 14: * Split into separate files. Added amoebas and pirates. ! 15: * ! 16: */ ! 17: ! 18: #include "EXTERN.h" ! 19: #include "warp.h" ! 20: #include "intrp.h" ! 21: #include "object.h" ! 22: #include "play.h" ! 23: #include "sig.h" ! 24: #include "term.h" ! 25: #include "us.h" ! 26: #include "util.h" ! 27: #include "weapon.h" ! 28: #include "INTERN.h" ! 29: #include "score.h" ! 30: ! 31: void ! 32: score_init() ! 33: { ! 34: Reg1 char *s; ! 35: Reg2 int i; ! 36: FILE *savfil; ! 37: ! 38: if (stat(SAVEDIR,&filestat)) { ! 39: printf("Cannot access %s\r\n",SAVEDIR); ! 40: finalize(1); ! 41: } ! 42: if (filestat.st_uid != geteuid()) { ! 43: printf("Warp will not run right without being setuid.\r\n"); ! 44: finalize(1); ! 45: } ! 46: if ((filestat.st_mode & 0605) != 0605) { ! 47: printf("%s is not protected correctly (must be u+rw o+rx).\r\n",SAVEDIR); ! 48: finalize(1); ! 49: } ! 50: ! 51: #ifdef SCOREFULL ! 52: interp(longlognam, sizeof longlognam, "%N"); ! 53: for (i=strlen(longlognam); i<24; i++) ! 54: longlognam[i] = ' '; /* make sure it is 24 long for strncmp */ ! 55: longlognam[24] = '\0'; ! 56: #else ! 57: interp(longlognam, sizeof longlognam, "%L"); ! 58: for (i=strlen(longlognam); i<8; i++) ! 59: longlognam[i] = ' '; /* make sure it is 8 long for strncmp */ ! 60: longlognam[8] = '\0'; ! 61: #endif ! 62: ! 63: if (scorespec) ! 64: wscore(); ! 65: ! 66: Sprintf(savefilename, "save.%s", logname); ! 67: ! 68: savfil = experimenting ? NULL : fopen(savefilename,"r"); ! 69: if (savfil != NULL && fgets(spbuf,100,savfil) != NULL) { ! 70: char tmpbuf[80]; ! 71: ! 72: spbuf[strlen(spbuf)-1] = '\0'; ! 73: if (fgets(tmpbuf,80,savfil) != NULL) { ! 74: int processnum; ! 75: ! 76: tmpbuf[strlen(tmpbuf)-1] = '\0'; ! 77: printf("You seem to have left a game %s.\r\n",tmpbuf+9); ! 78: s = index(tmpbuf+9, ','); ! 79: *s = '\0'; ! 80: processnum = atoi(s+11); ! 81: if (kill(processnum, SIGINT)) { ! 82: /* does process not exist? */ ! 83: /* (warp ignores SIGINT) */ ! 84: printf("\r\n\ ! 85: That process does not seem to exist anymore, so you'll have to start the\r\n"); ! 86: printf( ! 87: "last wave over.\r\n\n"); ! 88: printf( ! 89: " [type anything to continue]"); ! 90: Fflush(stdout); ! 91: eat_typeahead(); ! 92: getcmd(tmpbuf); ! 93: if (*tmpbuf == INTRCH) ! 94: finalize(0); ! 95: printf("\r\n"); ! 96: } ! 97: else { ! 98: if (strcmp(term+8,tmpbuf+23)) { ! 99: printf( ! 100: "That is not your current terminal--you are on %s.\r\n", term+5); ! 101: printf("\r\nYour options:\r\n"); ! 102: printf(" 1) Exit and find the terminal it's running on\r\n"); ! 103: } ! 104: else { ! 105: printf("\r\nYour options:\r\n"); ! 106: printf(" 1) Exit and try to foreground it\r\n"); ! 107: } ! 108: printf(" 2) Let me terminate the other game\r\n\n"); ! 109: printf("What do you want to do? "); ! 110: Fflush(stdout); ! 111: eat_typeahead(); ! 112: getcmd(tmpbuf); ! 113: printf("\r\n"); ! 114: if (*tmpbuf == INTRCH) ! 115: finalize(0); ! 116: if (*tmpbuf == '1') { ! 117: printf( ! 118: "If you don't succeed, come back and do option 2 instead. Good luck.\r\n"); ! 119: finalize(0); ! 120: } ! 121: printf( ! 122: "Ok, hang on a few moments \r\n"); ! 123: Fclose(savfil); ! 124: if (kill(processnum, SIGQUIT)) { ! 125: printf("Unable to kill process #%d!\r\n",processnum); ! 126: roundsleep(2); ! 127: } ! 128: else { ! 129: #ifdef SIGCONT ! 130: kill(processnum, SIGCONT); ! 131: #endif ! 132: for (i=15; i; --i) { ! 133: sleep(1); ! 134: if (kill(processnum,SIGINT)) ! 135: /* does process not exist? */ ! 136: /* (warp ignores SIGINT) */ ! 137: break; ! 138: } ! 139: didkill++; ! 140: } ! 141: savfil = fopen(savefilename,"r"); ! 142: if (savfil != NULL) { ! 143: Fgets(spbuf,100,savfil); ! 144: } ! 145: } ! 146: } ! 147: } ! 148: else ! 149: savfil = NULL; ! 150: if (savfil == NULL) { ! 151: totalscore = smarts = cumsmarts = wave = 0; ! 152: numents = 5; ! 153: numbases = 3; ! 154: } ! 155: else { ! 156: totalscore = atol(spbuf+9); ! 157: smarts = atoi(spbuf+20); ! 158: cumsmarts = atoi(spbuf+24); ! 159: numents = atoi(spbuf+30); ! 160: numbases = atoi(spbuf+33); ! 161: wave = atoi(spbuf+36); ! 162: apolspec = (spbuf[40] == 'a'); ! 163: beginner = (spbuf[41] == 'b'); ! 164: crushspec = (spbuf[42] == 'c'); ! 165: gornspec = (spbuf[43] == 'g'); ! 166: massacre = (spbuf[44] == 'm'); ! 167: romspec = (spbuf[45] == 'r'); ! 168: tholspec = (spbuf[46] == 't'); ! 169: lowspeed = (spbuf[47] == 'l') || lowspeed; ! 170: amoebaspec = (spbuf[48] == '&'); ! 171: Fclose(savfil); ! 172: } ! 173: ! 174: if (!ismarts) { ! 175: ismarts = 1; ! 176: clear(); ! 177: page(NEWSFILE,FALSE); ! 178: if (smarts) { ! 179: printf("\r\nSaved game: SCORE DIFF CUMDIFF ENTERPRISES BASES WAVE"); ! 180: printf("\r\n %7ld %2d %4d %1d %1d %3d", ! 181: totalscore,smarts,cumsmarts,numents,numbases,wave); ! 182: } ! 183: printf("\r\nWould you like instructions? "); ! 184: Fflush(stdout); ! 185: eat_typeahead(); ! 186: getcmd(buf); ! 187: printf("\r\n"); ! 188: if (*buf == INTRCH) ! 189: finalize(0); ! 190: if (*buf == 'Y' || *buf == 'y') { ! 191: page(HELPFILE,FALSE); ! 192: printf("\r\nWould you like to play easy games for a while? "); ! 193: Fflush(stdout); ! 194: eat_typeahead(); ! 195: getcmd(buf); ! 196: printf("\r\n"); ! 197: if (*buf == 'Y' || *buf == 'y') { ! 198: beginner = TRUE; ! 199: lowspeed = TRUE; ! 200: } ! 201: } ! 202: } ! 203: if (!smarts) ! 204: smarts = ismarts; ! 205: } ! 206: ! 207: void ! 208: wscore() ! 209: { ! 210: clear(); ! 211: printf(" TOP WARPISTS\r\n\n"); ! 212: printf("RANK WHO AKA SCORE DIFF CUMDIFF WHEN\r\n"); ! 213: page(SCOREBOARD,TRUE); ! 214: printf(" [Type anything to continue]"); ! 215: Fflush(stdout); ! 216: getcmd(spbuf); ! 217: if (*spbuf == INTRCH) ! 218: finalize(0); ! 219: clear(); ! 220: printf(" TOP LOW-SPEED WARPISTS\r\n\n"); ! 221: printf("RANK WHO AKA SCORE DIFF CUMDIFF WHEN\r\n"); ! 222: page(LSCOREBOARD,TRUE); ! 223: printf(" [Type anything to continue]"); ! 224: Fflush(stdout); ! 225: getcmd(spbuf); ! 226: if (*spbuf == INTRCH) ! 227: finalize(0); ! 228: clear(); ! 229: printf(" TOP FUNNY WARPISTS\r\n\n"); ! 230: printf("RANK WHO AKA SCORE DIFF CUMDIFF WHEN\r\n"); ! 231: page(FSCOREBOARD,TRUE); ! 232: printf(" [Type anything to continue]"); ! 233: Fflush(stdout); ! 234: getcmd(spbuf); ! 235: if (*spbuf == INTRCH) ! 236: finalize(0); ! 237: clear(); ! 238: printf(" GAMES SAVED OR IN PROGRESS\r\n\n"); ! 239: printf("WHO SCORE DF CDF E B WV FLAGS\r\n"); ! 240: resetty(); ! 241: Sprintf(spbuf,"/bin/cat %ssave.*",SAVEDIR); ! 242: #ifndef lint ! 243: execl("/bin/sh", "sh", "-c", spbuf, 0); ! 244: #endif ! 245: finalize(1); ! 246: } ! 247: ! 248: ! 249: void ! 250: display_status() ! 251: { ! 252: Reg1 int tmp; ! 253: static char *status_names[] = {"Impl", "Warp", "Base", "****" }; ! 254: ! 255: if (oldstatus != status) { ! 256: Sprintf(spbuf,"%-4s",status_names[status]); ! 257: mvaddstr(0,0, spbuf); ! 258: oldstatus = status; ! 259: } ! 260: if (ent) { ! 261: if (ent->energy != oldeenergy) { ! 262: oldeenergy = ent->energy; ! 263: Sprintf(spbuf,"%4ld",oldeenergy); ! 264: mvaddstr(0,8, spbuf); ! 265: } ! 266: if (etorp != oldetorp) { ! 267: Sprintf(spbuf,"%2d",etorp); ! 268: mvaddstr(0,13, spbuf); ! 269: oldetorp = etorp; ! 270: } ! 271: } ! 272: else { ! 273: if (etorp >= 0) { ! 274: etorp = -1; ! 275: mvaddstr(0,8,"*******"); ! 276: damage = 0; ! 277: } ! 278: } ! 279: if (base) { ! 280: if (base->energy != oldbenergy) { ! 281: oldbenergy = base->energy; ! 282: Sprintf(spbuf,"%5ld",oldbenergy); ! 283: mvaddstr(0,19, spbuf); ! 284: } ! 285: if (btorp != oldbtorp) { ! 286: Sprintf(spbuf,"%3d",btorp); ! 287: mvaddstr(0,25, spbuf); ! 288: oldbtorp = btorp; ! 289: } ! 290: } ! 291: else { ! 292: if (btorp >= 0) { ! 293: btorp = -1; ! 294: mvaddstr(0,19,"*********"); ! 295: } ! 296: } ! 297: if (damage) { ! 298: if (!olddamage) ! 299: mvaddstr(0,42,"*** "); ! 300: if (damage > 1 || !damflag[dam]) { ! 301: do { ! 302: if (++dam == MAXDAMAGE) ! 303: dam = 0; ! 304: } while (!damflag[dam]); ! 305: } ! 306: if (!--damflag[dam]) { ! 307: olddamage = damage; ! 308: damage--; ! 309: Sprintf(spbuf,"%s OK *** ",dammess[dam]); ! 310: spbuf[15] = '\0'; ! 311: mvaddstr(0,46,spbuf); ! 312: } ! 313: else if (dam == NOSHIELDS) { ! 314: olddamage = damage; ! 315: tmp = (34 - damflag[dam]) * 3 - rand_mod(3); ! 316: if (tmp < 0) ! 317: tmp = 0; ! 318: Sprintf(spbuf,"%d%% %s *** ",tmp,dammess[dam]); ! 319: spbuf[15] = '\0'; ! 320: mvaddstr(0,46,spbuf); ! 321: } ! 322: else if (dam != lastdam || !olddamage) { ! 323: olddamage = damage; ! 324: Sprintf(spbuf,"NO %s *** ",dammess[dam]); ! 325: spbuf[15] = '\0'; ! 326: mvaddstr(0,46,spbuf); ! 327: } ! 328: if (status < 2) { ! 329: if (dam == NOIMPULSE && !entmode) ! 330: status = entmode = 1; ! 331: if (dam == NOWARP && entmode) ! 332: status = entmode = 0; ! 333: } ! 334: tmp = damflag[dam] * damage; ! 335: Sprintf(spbuf,"%3d.%1d ETR",tmp/10,tmp%10); ! 336: mvaddstr(0,69,spbuf); ! 337: lastdam = dam; ! 338: } ! 339: else { ! 340: if (olddamage) { ! 341: Sprintf(spbuf,"Stars: %-3d Stardate",numstars); ! 342: mvaddstr(0,42,spbuf); ! 343: lastdam = -1; ! 344: olddamage = 0; ! 345: oldcurscore = -1; ! 346: } ! 347: else if (numstars != oldstrs) { ! 348: Sprintf(spbuf,"%-3d",numstars); ! 349: mvaddstr(0,49, spbuf); ! 350: } ! 351: oldstrs = numstars; ! 352: } ! 353: if (numenemies != oldenemies) { ! 354: Sprintf(spbuf,"%-3d",numenemies); ! 355: mvaddstr(0,38, spbuf); ! 356: oldenemies = numenemies; ! 357: } ! 358: if (tmp = timer%10) { ! 359: Sprintf(spbuf,"%1d",tmp); ! 360: mvaddstr(0,67, spbuf); ! 361: } ! 362: else { ! 363: Sprintf(spbuf,"%5d.%1d",timer/10+smarts*100,tmp); ! 364: mvaddstr(0,61, spbuf); ! 365: } ! 366: if ((!damage || !damflag[dam]) && curscore != oldcurscore) { ! 367: Sprintf(spbuf,"%9ld",curscore); ! 368: mvaddstr(0,69, spbuf); ! 369: oldcurscore = curscore; ! 370: } ! 371: } ! 372: ! 373: void ! 374: wavescore() ! 375: { ! 376: double power, effectscore, starscore, pi_over_2; ! 377: long bonuses; ! 378: long tmp; ! 379: FILE *mapfp; ! 380: int row; ! 381: double pow(); ! 382: #ifndef lint ! 383: double atan2(); ! 384: #endif ! 385: ! 386: clear(); ! 387: if (curscore > possiblescore) ! 388: curscore = possiblescore; ! 389: pi_over_2 = 3.14159265 / 2.0; ! 390: power = pow((double)inumenemies+ /* total number of enemies */ ! 391: inumroms*2+ /* count roms 3 times */ ! 392: inumgorns+ /* count gorns 2 times */ ! 393: inumthols+ /* count thols 2 times */ ! 394: inumapollos*4+ /* count apollo 5 times */ ! 395: inumcrushes*3+ /* count crushers 4 times */ ! 396: inumamoebas*5 /* count amoebas 6 times */ ! 397: , 0.50) * /* skew it a little */ ! 398: (double)smarts; /* average energy and intelligence */ ! 399: if (inumstars < 350 && inumenemies > 5) ! 400: power += (350.0 - (double)inumstars) * ((double)inumenemies - 5.0); ! 401: if (inumstars > 850 && inumenemies > 2) ! 402: power += ((double)inumstars - 850.0) * ((double)inumenemies - 2.0); ! 403: #ifndef lint ! 404: effectscore = ((double)curscore / possiblescore) * ! 405: atan2(power, (double) timer + 1.0) / pi_over_2; ! 406: #else ! 407: effectscore = pi_over_2; ! 408: #endif ! 409: if (inumstars) ! 410: starscore = (double) numstars / (double) inumstars; ! 411: else ! 412: starscore = 1.0; ! 413: wave++; ! 414: Sprintf(spbuf,"Wave = %d, Difficulty = %d, cumulative difficulty = %d", ! 415: wave, smarts, cumsmarts); ! 416: mvaddstr(1, 13+(smarts<10), spbuf); ! 417: mvaddstr( 4, 68, " BONUS"); ! 418: Sprintf(spbuf,"Efficiency rating: %1.8f (diff=%0.2f,time=%d)", ! 419: effectscore, power, timer + 1); ! 420: mvaddstr( 5,5, spbuf); ! 421: if (effectscore < 0.8) ! 422: bonuses = tmp = 0; ! 423: else ! 424: bonuses = tmp = (long) ((effectscore-0.8) * smarts * 1000); ! 425: Sprintf(spbuf, "%6ld", tmp); ! 426: mvaddstr( 5, 68, spbuf); ! 427: Sprintf(spbuf,"Star save ratio: %1.8f (%d/%d)", ! 428: starscore, numstars, inumstars); ! 429: mvaddstr( 6,5, spbuf); ! 430: #ifndef lint ! 431: bonuses += tmp = (long) (((double)curscore / possiblescore) * ! 432: (starscore*starscore) * smarts * 20); ! 433: #endif ! 434: Sprintf(spbuf, "%6ld", tmp); ! 435: mvaddstr( 6, 68, spbuf); ! 436: row = 7; ! 437: if (inuminhab != numinhab) { ! 438: Sprintf(spbuf, "Inhabited stars depopulated: %5d", inuminhab-numinhab); ! 439: mvaddstr(row,5, spbuf); ! 440: bonuses += tmp = (long) (inuminhab-numinhab) * -500; ! 441: Sprintf(spbuf, "%6ld", tmp); ! 442: mvaddstr(row, 68, spbuf); ! 443: row++; ! 444: } ! 445: if (inumfriends != numfriends) { ! 446: Sprintf(spbuf, "Friendly craft destroyed: %5d", ! 447: inumfriends-numfriends); ! 448: mvaddstr(row,5, spbuf); ! 449: bonuses += tmp = (long) (inumfriends-numfriends) * -250; ! 450: Sprintf(spbuf, "%6ld", tmp); ! 451: mvaddstr(row, 68, spbuf); ! 452: row++; ! 453: } ! 454: if (deadmudds) { ! 455: mvaddstr(row,5,"For destroying Harry Mudd:"); ! 456: bonuses += tmp = (long) rand_mod(deadmudds * 20 + 1) - deadmudds*10; ! 457: Sprintf(spbuf, "%6ld", tmp); ! 458: mvaddstr(row, 68, spbuf); ! 459: row++; ! 460: } ! 461: if (bombed_out) { ! 462: mvaddstr(row,5, "For running away from reality:"); ! 463: bonuses += tmp = (long) -possiblescore/2; ! 464: Sprintf(spbuf, "%6ld", tmp); ! 465: mvaddstr(row, 68, spbuf); ! 466: row++; ! 467: } ! 468: if (row < 9) ! 469: row++; ! 470: Sprintf(spbuf, "Enterprise: %-9s%5d remaining", ! 471: !ient?"":ent?"saved":"destroyed", numents); ! 472: mvaddstr(row,5, spbuf); ! 473: bonuses += tmp = ent && !bombed_out ? (smarts+1)*15 : 0; ! 474: Sprintf(spbuf, "%6ld", tmp); ! 475: mvaddstr(row, 68, spbuf); ! 476: row++; ! 477: Sprintf(spbuf, "Base: %-9s %5d remaining", ! 478: !ibase?"":base?"saved":"destroyed", numbases); ! 479: mvaddstr(row,5, spbuf); ! 480: bonuses += tmp = base && !bombed_out ? (smarts+1)*10 : 0; ! 481: Sprintf(spbuf, "%6ld", tmp); ! 482: mvaddstr(row, 68, spbuf); ! 483: if (beginner) { ! 484: mvaddstr(13+(row>11),19, "(Special games count only a tenth as much)"); ! 485: curscore /= 10; ! 486: bonuses /= 10; ! 487: } ! 488: Sprintf(spbuf, "Previous point total:%10ld",lastscore); ! 489: mvaddstr(15,24, spbuf); ! 490: Sprintf(spbuf, "Points this round: %10ld",curscore); ! 491: mvaddstr(16,24, spbuf); ! 492: Sprintf(spbuf, "Bonuses: %10ld",bonuses); ! 493: mvaddstr(17,24, spbuf); ! 494: totalscore = lastscore + curscore + bonuses; ! 495: Sprintf(spbuf, "New point total: %10ld",totalscore); ! 496: mvaddstr(18,24, spbuf); ! 497: if (lastscore / ENTBOUNDARY < totalscore / ENTBOUNDARY) { ! 498: mvaddstr(row-1,42,"+ 1 new"); ! 499: numents++; ! 500: } ! 501: else if (numents>0 && ! 502: lastscore / ENTBOUNDARY > totalscore / ENTBOUNDARY) { ! 503: mvaddstr(row-1,42,"- 1 obsolete"); ! 504: numents--; ! 505: } ! 506: if (lastscore / BASEBOUNDARY < totalscore / BASEBOUNDARY) { ! 507: mvaddstr(row,42,"+ 1 new"); ! 508: numbases++; ! 509: } ! 510: else if (numbases>0 && ! 511: lastscore / BASEBOUNDARY > totalscore / BASEBOUNDARY) { ! 512: mvaddstr(row,42,"- 1 obsolete"); ! 513: numbases--; ! 514: } ! 515: if (starscore < 0.8 && inumstars > 200 && numstars > 50) { ! 516: Sprintf(spbuf, "smap.%d",rand_mod(MAPS-PERMMAPS)+PERMMAPS); ! 517: if ((mapfp = fopen(spbuf,"w")) != NULL) { ! 518: Reg1 OBJECT *obj; ! 519: ! 520: fprintf(mapfp,"%d\n",numstars); ! 521: for (obj = root.next; obj != &root; obj = obj->next) { ! 522: if (obj->type == Star) { ! 523: fprintf(mapfp,"%d %d\n",obj->posy,obj->posx); ! 524: } ! 525: } ! 526: Fclose(mapfp); ! 527: } ! 528: } ! 529: } ! 530: ! 531: void ! 532: score() ! 533: { ! 534: char tmp, *retval, cdate[30]; ! 535: Reg1 FILE *logfd; ! 536: Reg2 FILE *outfd; ! 537: Reg3 int i; ! 538: long nowtime, time(); ! 539: char *scoreboard; ! 540: ! 541: for (i=0; link(LOGFILE, LOCKFILE) == -1 && i<10; i++) ! 542: sleep(1); ! 543: nowtime = time((long *)0); ! 544: strcpy(cdate,ctime(&nowtime)); ! 545: if ((logfd = fopen(LOGFILE,"a")) != NULL) { ! 546: fprintf(logfd, ! 547: "%-24s%-9s%7ld%c%2d %4d %s", ! 548: realname, logname, totalscore, c,smarts, cumsmarts, cdate); ! 549: Fclose(logfd); ! 550: } ! 551: strcpy(cdate+11,cdate+20); ! 552: if (beginner) ! 553: scoreboard = FSCOREBOARD; ! 554: else if (lowspeed) ! 555: scoreboard = LSCOREBOARD; ! 556: else ! 557: scoreboard = SCOREBOARD; ! 558: if (eaccess(scoreboard,0)) { ! 559: if ((logfd = fopen(scoreboard,"w")) != NULL) ! 560: Fclose(logfd); ! 561: } ! 562: if ((logfd = fopen(scoreboard,"r")) != NULL && ! 563: (outfd = fopen(TMPSCOREBOARD,"w")) != NULL) { ! 564: for (i=0; i<20; i++) { ! 565: if ((retval = fgets(buf, 100, logfd)) == NULL) ! 566: break; ! 567: if (atol(buf+32) < totalscore) ! 568: break; ! 569: if (strnEQ(buf+COMPOFF,COMPNAME,COMPLEN)) { ! 570: i = 100; ! 571: break; ! 572: } ! 573: fprintf(outfd, "%s", buf); ! 574: } ! 575: if (i == 100) { ! 576: mvaddstr(20,21, "You did not better your previous score"); ! 577: Fclose(outfd); ! 578: unlink(TMPSCOREBOARD); ! 579: } ! 580: else if (i < 20) { ! 581: fprintf(outfd, "%-24s%-8s%8ld%c %2d %4d %s", ! 582: realname, logname, totalscore, c,smarts, cumsmarts, cdate); ! 583: i++; ! 584: Sprintf(spbuf, " Congratulations--you've placed %d%s", ! 585: i, i==1?"st":(i==2?"nd":(i==3?"rd":"th"))); ! 586: if (retval != NULL) { ! 587: if (strnNE(buf+COMPOFF,COMPNAME,COMPLEN)) { ! 588: fprintf(outfd, "%s", buf); ! 589: i++; ! 590: } ! 591: else ! 592: strcpy(spbuf,"Congratulations--you've bettered your score"); ! 593: while (i<20) { ! 594: if (fgets(buf, 100, logfd) == NULL) ! 595: break; ! 596: if (strnNE(buf+COMPOFF,COMPNAME,COMPLEN)) { ! 597: fprintf(outfd, "%s", buf); ! 598: i++; ! 599: } ! 600: } ! 601: } ! 602: mvaddstr(20,19, spbuf); ! 603: Fclose(logfd); ! 604: Fclose(outfd); ! 605: while (unlink(scoreboard) == 0) ! 606: ; ! 607: link(TMPSCOREBOARD,scoreboard); ! 608: unlink(TMPSCOREBOARD); ! 609: logfd = fopen(scoreboard,"r"); ! 610: } ! 611: else { ! 612: mvaddstr(20,22,"You did not place within the top 20"); ! 613: Fclose(outfd); ! 614: } ! 615: } ! 616: else { ! 617: Sprintf(spbuf,"(Cannot access %s file, error %d)", ! 618: (logfd==NULL?"log":"tmp"),errno); ! 619: mvaddstr(20,22,spbuf); ! 620: } ! 621: move(23,0,0); ! 622: erase_eol(); ! 623: mvaddstr(23,11, ! 624: "[Hit space for scoreboard, 'r' for new game, 'q' to quit]"); ! 625: unlink(LOCKFILE); ! 626: Fflush(stdout); ! 627: eat_typeahead(); ! 628: do { ! 629: getcmd(&tmp); ! 630: } while (tmp != INTRCH && tmp != BREAKCH && !index(" rqQ",tmp)); ! 631: if (index("qQr",tmp)) { ! 632: justonemoretime = (tmp == 'r'); ! 633: if (logfd != NULL) ! 634: Fclose(logfd); ! 635: } ! 636: else { ! 637: clear(); ! 638: if (logfd != NULL) { ! 639: fseek(logfd, 0L, 0); ! 640: if (beginner) ! 641: mvaddstr(0,31,"TOP FUNNY WARPISTS"); ! 642: else if (lowspeed) ! 643: mvaddstr(0,29,"TOP LOW-SPEED WARPISTS"); ! 644: else ! 645: mvaddstr(0,33,"TOP WARPISTS"); ! 646: mvaddstr(2,0,"RANK WHO AKA SCORE DIFF CUMDIFF WHEN"); ! 647: for (i=1; i<=20; i++) { ! 648: if (fgets(buf, 100, logfd) == NULL) ! 649: break; ! 650: buf[strlen(buf)-1] = '\0'; ! 651: Sprintf(spbuf, " %2d %s", i, buf); ! 652: mvaddstr(i+2,0, spbuf); ! 653: } ! 654: Fclose(logfd); ! 655: } ! 656: roundsleep(1); ! 657: mvaddstr(23,25,"Would you like to play again?"); ! 658: eat_typeahead(); ! 659: do { ! 660: getcmd(&tmp); ! 661: } while (tmp != INTRCH && tmp != BREAKCH && !index("nNyY \n\r",tmp)); ! 662: if (tmp == 'n' || tmp == 'N' || tmp == INTRCH || tmp == BREAKCH) ! 663: justonemoretime = FALSE; ! 664: } ! 665: ! 666: smarts = ismarts; ! 667: totalscore = cumsmarts = wave = 0; ! 668: numents = 5; ! 669: numbases = 3; ! 670: apolspec = FALSE; ! 671: beginner = FALSE; ! 672: crushspec = FALSE; ! 673: gornspec = FALSE; ! 674: massacre = (ismarts >= 40); ! 675: romspec = FALSE; ! 676: tholspec = FALSE; ! 677: } ! 678: ! 679: void ! 680: save_game() ! 681: { ! 682: FILE *savfil; ! 683: ! 684: if (experimenting) ! 685: return; ! 686: if ((savfil = fopen(savefilename,"w")) == NULL) { ! 687: resetty(); ! 688: printf("Cannot save game\r\n"); ! 689: finalize(1); ! 690: } ! 691: fprintf(savfil, "%-8s %10ld, %2d,%5d,%2d,%2d,%3d %c%c%c%c%c%c%c%c\n", ! 692: logname, totalscore, smarts, cumsmarts, numents, numbases, wave, ! 693: apolspec ? 'a' : ' ', ! 694: beginner ? 'b' : ' ', ! 695: crushspec ? 'c' : ' ', ! 696: gornspec ? 'g' : ' ', ! 697: massacre ? 'm' : ' ', ! 698: romspec ? 'r' : ' ', ! 699: tholspec ? 't' : ' ', ! 700: lowspeed ? 'l' : ' ', ! 701: amoebaspec ? '&' : ' ' ! 702: ); ! 703: Fclose(savfil); ! 704: resetty(); ! 705: if (panic) ! 706: finalize(0); ! 707: clear(); ! 708: finalize(0); ! 709: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.