Annotation of 43BSDReno/games/warp/score.c, revision 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.