1: /* $Header: /usr/src/games/warp/RCS/score.c,v 1.1.1 95/01/21 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: }

Defined functions

score defined in line 531; used 2 times
score_init defined in line 31; used 2 times
wavescore defined in line 373; used 2 times
wscore defined in line 207; used 2 times
Last modified: 1995-01-22
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 4869
Valid CSS Valid XHTML 1.0 Strict