Annotation of 43BSDReno/games/warp/score.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.