# 2.11BSD#431 - /usr/src/games/warp/score.c

##### Functions

    display_status    X
    save_game         X
    score             X
    score_init        X
    wavescore         X
    wscore            X

       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

display_status defined in line 249; used 4 times

- in /usr/src/games/warp/play.c line 42, 52
- in /usr/src/games/warp/score.h line 46
- in /usr/src/games/warp/term.c line 560

save_game defined in line 679; used 3 times

- in /usr/src/games/warp/score.h line 49
- in /usr/src/games/warp/sig.c line 185
- in /usr/src/games/warp/warp.c line 394

score defined in line 531; used 2 times

- in /usr/src/games/warp/score.h line 48
- in /usr/src/games/warp/warp.c line 396

score_init defined in line 31; used 2 times

- in /usr/src/games/warp/score.h line 44
- in /usr/src/games/warp/warp.c line 315

wavescore defined in line 373; used 2 times

- in /usr/src/games/warp/score.h line 47
- in /usr/src/games/warp/warp.c line 358

wscore defined in line 207; used 2 times

- in line 64
- in /usr/src/games/warp/score.h line 45

Last modified: 1995-01-22 Generated: 2016-12-26 | Generated by src2html V0.67 page hit count: 1880 |