Annotation of 43BSDReno/games/larn/scores.c, revision 1.1

1.1     ! root        1: /* scores.c                     Larn is copyrighted 1986 by Noah Morgan.
        !             2:  *
        !             3:  *     Functions in this file are:
        !             4:  *
        !             5:  *     readboard()     Function to read in the scoreboard into a static buffer
        !             6:  *     writeboard()    Function to write the scoreboard from readboard()'s buffer
        !             7:  *     makeboard()     Function to create a new scoreboard (wipe out old one)
        !             8:  *     hashewon()       Function to return 1 if player has won a game before, else 0
        !             9:  *     long paytaxes(x)         Function to pay taxes if any are due
        !            10:  *     winshou()               Subroutine to print out the winning scoreboard
        !            11:  *     shou(x)                 Subroutine to print out the non-winners scoreboard
        !            12:  *     showscores()            Function to show the scoreboard on the terminal
        !            13:  *     showallscores() Function to show scores and the iven lists that go with them
        !            14:  *     sortboard()             Function to sort the scoreboard
        !            15:  *     newscore(score, whoo, whyded, winner)   Function to add entry to scoreboard
        !            16:  *     new1sub(score,i,whoo,taxes)               Subroutine to put player into a 
        !            17:  *     new2sub(score,i,whoo,whyded)              Subroutine to put player into a 
        !            18:  *     died(x)         Subroutine to record who played larn, and what the score was
        !            19:  *     diedsub(x) Subroutine to print out a line showing player when he is killed
        !            20:  *     diedlog()       Subroutine to read a log file and print it out in ascii format
        !            21:  *     getplid(name)           Function to get players id # from id file
        !            22:  *
        !            23:  */
        !            24: #include <sys/types.h>
        !            25: #include <sys/times.h>
        !            26: #include <sys/stat.h>
        !            27: #include "header.h"
        !            28: 
        !            29: struct scofmt                  /*      This is the structure for the scoreboard                */
        !            30:        {
        !            31:        long score;                     /* the score of the player                                                      */
        !            32:        long suid;                      /* the user id number of the player                             */
        !            33:        short what;                     /* the number of the monster that killed player         */
        !            34:        short level;            /* the level player was on when he died                         */
        !            35:        short hardlev;          /* the level of difficulty player played at             */
        !            36:        short order;            /* the relative ordering place of this entry            */
        !            37:        char who[40];           /* the name of the character                                            */
        !            38:        char sciv[26][2];       /* this is the inventory list of the character          */
        !            39:        };
        !            40: struct wscofmt                 /* This is the structure for the winning scoreboard */
        !            41:        {
        !            42:        long score;                     /* the score of the player                                                      */
        !            43:        long timeused;          /* the time used in mobuls to win the game                      */
        !            44:        long taxes;                     /* taxes he owes to LRS                                                         */
        !            45:        long suid;                      /* the user id number of the player                             */
        !            46:        short hardlev;          /* the level of difficulty player played at             */
        !            47:        short order;            /* the relative ordering place of this entry            */
        !            48:        char who[40];           /* the name of the character                                            */
        !            49:        };
        !            50: 
        !            51: struct log_fmt                 /* 102 bytes struct for the log file                            */
        !            52:        {
        !            53:        long score;                     /* the players score                                                            */
        !            54:        long diedtime;          /* time when game was over                                                      */
        !            55:        short cavelev;          /* level in caves                                                                       */
        !            56:        short diff;                     /* difficulty player played at                                          */
        !            57: #ifdef EXTRA
        !            58:        long elapsedtime;       /* real time of game in seconds                                         */
        !            59:        long bytout;            /* bytes input and output                                                       */
        !            60:        long bytin;
        !            61:        long moves;                     /* number of moves made by player                                       */
        !            62:        short ac;                       /* armor class of player                                                        */
        !            63:        short hp,hpmax;         /* players hitpoints                                                            */
        !            64:        short cputime;          /* cpu time needed in seconds                                           */
        !            65:        short killed,spused;/* monsters killed and spells cast                                  */
        !            66:        short usage;            /* usage of the cpu in %                                                        */
        !            67:        short lev;                      /* player level                                                                         */
        !            68: #endif
        !            69:        char who[12];           /* player name                                                                          */
        !            70:        char what[46];          /* what happened to player                                                      */
        !            71:        };
        !            72: 
        !            73: static struct scofmt sco[SCORESIZE];   /* the structure for the scoreboard  */
        !            74: static struct wscofmt winr[SCORESIZE]; /* struct for the winning scoreboard */
        !            75: static struct log_fmt logg;                            /* structure for the log file            */
        !            76: static char *whydead[] = {
        !            77:        "quit", "suspended", "self - annihilated", "shot by an arrow",
        !            78:        "hit by a dart", "fell into a pit", "fell into a bottomless pit",
        !            79:        "a winner", "trapped in solid rock", "killed by a missing save file",
        !            80:        "killed by an old save file", "caught by the greedy cheater checker trap",
        !            81:        "killed by a protected save file","killed his family and committed suicide",
        !            82:        "erased by a wayward finger", "fell through a bottomless trap door",
        !            83:        "fell through a trap door", "drank some poisonous water",
        !            84:        "fried by an electric shock", "slipped on a volcano shaft",
        !            85:        "killed by a stupid act of frustration", "attacked by a revolting demon",
        !            86:        "hit by his own magic", "demolished by an unseen attacker",
        !            87:        "fell into the dreadful sleep", "killed by an exploding chest",
        !            88: /*26*/ "killed by a missing maze data file", "annihilated in a sphere",
        !            89:        "died a post mortem death","wasted by a malloc() failure"
        !            90:        };
        !            91: 
        !            92: /*
        !            93:  *     readboard()     Function to read in the scoreboard into a static buffer
        !            94:  *
        !            95:  *     returns -1 if unable to read in the scoreboard, returns 0 if all is OK
        !            96:  */
        !            97: readboard()
        !            98:        {
        !            99:        if (lopen(scorefile)<0)
        !           100:          { lprcat("Can't read scoreboard\n"); lflush(); return(-1); }
        !           101:        lrfill((char*)sco,sizeof(sco));         lrfill((char*)winr,sizeof(winr));
        !           102:        lrclose();  lcreat((char*)0);  return(0);
        !           103:        }
        !           104: 
        !           105: /*
        !           106:  *     writeboard()    Function to write the scoreboard from readboard()'s buffer
        !           107:  *
        !           108:  *     returns -1 if unable to write the scoreboard, returns 0 if all is OK
        !           109:  */
        !           110: writeboard()
        !           111:        {
        !           112:        set_score_output();
        !           113:        if (lcreat(scorefile)<0)
        !           114:          { lprcat("Can't write scoreboard\n"); lflush(); return(-1); }
        !           115:        lwrite((char*)sco,sizeof(sco));         lwrite((char*)winr,sizeof(winr));
        !           116:        lwclose();  lcreat((char*)0);  return(0);
        !           117:        }
        !           118: 
        !           119: /*
        !           120:  *     makeboard()             Function to create a new scoreboard (wipe out old one)
        !           121:  *
        !           122:  *     returns -1 if unable to write the scoreboard, returns 0 if all is OK
        !           123:  */
        !           124: makeboard()
        !           125:        {
        !           126:        register int i;
        !           127:        for (i=0; i<SCORESIZE; i++)
        !           128:                {
        !           129:                winr[i].taxes = winr[i].score = sco[i].score = 0;
        !           130:                winr[i].order = sco[i].order = i;
        !           131:                }
        !           132:        if (writeboard()) return(-1);
        !           133:        chmod(scorefile,0660);
        !           134:        return(0);
        !           135:        }
        !           136: 
        !           137: /*
        !           138:  *     hashewon()       Function to return 1 if player has won a game before, else 0
        !           139:  *
        !           140:  *     This function also sets c[HARDGAME] to appropriate value -- 0 if not a
        !           141:  *     winner, otherwise the next level of difficulty listed in the winners
        !           142:  *     scoreboard.  This function also sets outstanding_taxes to the value in
        !           143:  *     the winners scoreboard.
        !           144:  */
        !           145: hashewon()
        !           146:        {
        !           147:        register int i;
        !           148:        c[HARDGAME] = 0;
        !           149:        if (readboard() < 0) return(0); /* can't find scoreboard */
        !           150:        for (i=0; i<SCORESIZE; i++)     /* search through winners scoreboard */
        !           151:           if (winr[i].suid == userid)
        !           152:                  if (winr[i].score > 0)
        !           153:                        {
        !           154:                        c[HARDGAME]=winr[i].hardlev+1;  outstanding_taxes=winr[i].taxes;
        !           155:                        return(1);
        !           156:                        }
        !           157:        return(0);
        !           158:        }
        !           159: 
        !           160: /*
        !           161:  *     long paytaxes(x)                 Function to pay taxes if any are due
        !           162:  *
        !           163:  *     Enter with the amount (in gp) to pay on the taxes.
        !           164:  *     Returns amount actually paid.
        !           165:  */
        !           166: long paytaxes(x)
        !           167:        long x;
        !           168:        {
        !           169:        register int i;
        !           170:        register long amt;
        !           171:        if (x<0) return(0L);
        !           172:        if (readboard()<0) return(0L);
        !           173:        for (i=0; i<SCORESIZE; i++)
        !           174:                if (winr[i].suid == userid)     /* look for players winning entry */
        !           175:                        if (winr[i].score>0) /* search for a winning entry for the player */
        !           176:                                {
        !           177:                                amt = winr[i].taxes;
        !           178:                                if (x < amt) amt=x;             /* don't overpay taxes (Ughhhhh) */
        !           179:                                winr[i].taxes -= amt;
        !           180:                                outstanding_taxes -= amt;
        !           181:                                if (writeboard()<0) return(0);
        !           182:                                return(amt);
        !           183:                                }
        !           184:        return(0L);     /* couldn't find user on winning scoreboard */
        !           185:        }
        !           186: 
        !           187: /*
        !           188:  *     winshou()               Subroutine to print out the winning scoreboard
        !           189:  *
        !           190:  *     Returns the number of players on scoreboard that were shown 
        !           191:  */
        !           192: winshou()
        !           193:        {
        !           194:        register struct wscofmt *p;
        !           195:        register int i,j,count;
        !           196:        for (count=j=i=0; i<SCORESIZE; i++) /* is there anyone on the scoreboard? */
        !           197:                if (winr[i].score != 0)
        !           198:                        { j++; break; }
        !           199:        if (j)
        !           200:                {
        !           201:                lprcat("\n  Score    Difficulty   Time Needed   Larn Winners List\n");
        !           202: 
        !           203:                for (i=0; i<SCORESIZE; i++)     /* this loop is needed to print out the */
        !           204:                  for (j=0; j<SCORESIZE; j++) /* winners in order */
        !           205:                        {
        !           206:                        p = &winr[j];   /* pointer to the scoreboard entry */
        !           207:                        if (p->order == i)
        !           208:                                {
        !           209:                                if (p->score)
        !           210:                                        {
        !           211:                                        count++;
        !           212:                                        lprintf("%10d     %2d      %5d Mobuls   %s \n",
        !           213:                                        (long)p->score,(long)p->hardlev,(long)p->timeused,p->who);
        !           214:                                        }
        !           215:                                break;
        !           216:                                }
        !           217:                        }
        !           218:                }
        !           219:        return(count);  /* return number of people on scoreboard */
        !           220:        }
        !           221: 
        !           222: /*
        !           223:  *     shou(x)                 Subroutine to print out the non-winners scoreboard
        !           224:  *             int x;
        !           225:  *
        !           226:  *     Enter with 0 to list the scores, enter with 1 to list inventories too
        !           227:  *     Returns the number of players on scoreboard that were shown 
        !           228:  */
        !           229: shou(x)
        !           230:        int x;
        !           231:        {
        !           232:        register int i,j,n,k;
        !           233:        int count;
        !           234:        for (count=j=i=0; i<SCORESIZE; i++)     /* is the scoreboard empty? */
        !           235:                if (sco[i].score!= 0)
        !           236:                        { j++; break; }
        !           237:        if (j)
        !           238:                {
        !           239:                lprcat("\n   Score   Difficulty   Larn Visitor Log\n");
        !           240:                for (i=0; i<SCORESIZE; i++) /* be sure to print them out in order */
        !           241:                  for (j=0; j<SCORESIZE; j++)
        !           242:                        if (sco[j].order == i)
        !           243:                                {
        !           244:                                if (sco[j].score)
        !           245:                                        {
        !           246:                                        count++;
        !           247:                                        lprintf("%10d     %2d       %s ",
        !           248:                                                (long)sco[j].score,(long)sco[j].hardlev,sco[j].who);
        !           249:                                        if (sco[j].what < 256) lprintf("killed by a %s",monster[sco[j].what].name);
        !           250:                                                else lprintf("%s",whydead[sco[j].what - 256]);
        !           251:                                        if (x != 263) lprintf(" on %s",levelname[sco[j].level]);
        !           252:                                        if (x)
        !           253:                                                {
        !           254:                                                for (n=0; n<26; n++) { iven[n]=sco[j].sciv[n][0]; ivenarg[n]=sco[j].sciv[n][1]; }
        !           255:                                                for (k=1; k<99; k++)
        !           256:                                                  for (n=0; n<26; n++)
        !           257:                                                        if (k==iven[n])  { srcount=0; show3(n); }
        !           258:                                                lprcat("\n\n");
        !           259:                                                }
        !           260:                                        else lprc('\n');
        !           261:                                        }
        !           262:                                j=SCORESIZE;
        !           263:                                }
        !           264:                }
        !           265:        return(count);  /* return the number of players just shown */
        !           266:        }
        !           267: 
        !           268: /*
        !           269:  *     showscores()            Function to show the scoreboard on the terminal
        !           270:  *
        !           271:  *     Returns nothing of value
        !           272:  */
        !           273: static char esb[] = "The scoreboard is empty.\n";
        !           274: showscores()
        !           275:        {
        !           276:        register int i,j;
        !           277:        lflush();  lcreat((char*)0);  if (readboard()<0) return;
        !           278:        i=winshou();    j=shou(0);      
        !           279:        if (i+j == 0) lprcat(esb); else lprc('\n');
        !           280:        lflush();
        !           281:        }
        !           282: 
        !           283: /*
        !           284:  *     showallscores() Function to show scores and the iven lists that go with them
        !           285:  *
        !           286:  *     Returns nothing of value
        !           287:  */
        !           288: showallscores()
        !           289:        {
        !           290:        register int i,j;
        !           291:        lflush();  lcreat((char*)0);  if (readboard()<0) return;
        !           292:        c[WEAR] = c[WIELD] = c[SHIELD] = -1;  /* not wielding or wearing anything */
        !           293:        for (i=0; i<MAXPOTION; i++) potionname[i][0]=' ';
        !           294:        for (i=0; i<MAXSCROLL; i++) scrollname[i][0]=' ';
        !           295:        i=winshou();  j=shou(1);
        !           296:        if (i+j==0) lprcat(esb); else lprc('\n');
        !           297:        lflush();
        !           298:        }
        !           299: 
        !           300: /*
        !           301:  *     sortboard()             Function to sort the scoreboard
        !           302:  *
        !           303:  *     Returns 0 if no sorting done, else returns 1
        !           304:  */
        !           305: sortboard()
        !           306:        {
        !           307:        register int i,j,pos;
        !           308:        long jdat;
        !           309:        for (i=0; i<SCORESIZE; i++) sco[i].order = winr[i].order = -1;
        !           310:        pos=0;  while (pos < SCORESIZE)
        !           311:                {
        !           312:                jdat=0;
        !           313:                for (i=0; i<SCORESIZE; i++)
        !           314:                        if ((sco[i].order < 0) && (sco[i].score >= jdat))
        !           315:                                { j=i;  jdat=sco[i].score; }
        !           316:                sco[j].order = pos++;
        !           317:                }
        !           318:        pos=0;  while (pos < SCORESIZE)
        !           319:                {
        !           320:                jdat=0;
        !           321:                for (i=0; i<SCORESIZE; i++)
        !           322:                        if ((winr[i].order < 0) && (winr[i].score >= jdat))
        !           323:                                { j=i;  jdat=winr[i].score; }
        !           324:                winr[j].order = pos++;
        !           325:                }
        !           326:        return(1);
        !           327:        }
        !           328: 
        !           329: /*
        !           330:  *     newscore(score, whoo, whyded, winner)   Function to add entry to scoreboard
        !           331:  *             int score, winner, whyded;
        !           332:  *             char *whoo;
        !           333:  *
        !           334:  *     Enter with the total score in gp in score,  players name in whoo,
        !           335:  *             died() reason # in whyded, and TRUE/FALSE in winner if a winner
        !           336:  *     ex.             newscore(1000, "player 1", 32, 0);
        !           337:  */
        !           338: newscore(score, whoo, whyded, winner)
        !           339:        long score;
        !           340:        int winner, whyded;
        !           341:        char *whoo;
        !           342:        {
        !           343:        register int i;
        !           344:        long taxes;
        !           345:        if (readboard() < 0) return;    /*      do the scoreboard       */
        !           346:        /* if a winner then delete all non-winning scores */
        !           347:        if (cheat) winner=0;    /* if he cheated, don't let him win */
        !           348:        if (winner)
        !           349:                {
        !           350:                for (i=0; i<SCORESIZE; i++) if (sco[i].suid == userid) sco[i].score=0;
        !           351:                taxes = score*TAXRATE;
        !           352:                score += 100000*c[HARDGAME];    /* bonus for winning */
        !           353:        /* if he has a slot on the winning scoreboard update it if greater score */
        !           354:                for (i=0; i<SCORESIZE; i++) if (winr[i].suid == userid)
        !           355:                                { new1sub(score,i,whoo,taxes); return; }
        !           356:        /* he had no entry. look for last entry and see if he has a greater score */
        !           357:                for (i=0; i<SCORESIZE; i++) if (winr[i].order == SCORESIZE-1)
        !           358:                                { new1sub(score,i,whoo,taxes); return; }
        !           359:                }
        !           360:        else if (!cheat) /* for not winning scoreboard */
        !           361:                {
        !           362:        /* if he has a slot on the scoreboard update it if greater score */
        !           363:                for (i=0; i<SCORESIZE; i++) if (sco[i].suid == userid)
        !           364:                                { new2sub(score,i,whoo,whyded); return; }
        !           365:        /* he had no entry. look for last entry and see if he has a greater score */
        !           366:                for (i=0; i<SCORESIZE; i++) if (sco[i].order == SCORESIZE-1)
        !           367:                                { new2sub(score,i,whoo,whyded); return; }
        !           368:                }
        !           369:        }
        !           370: 
        !           371: /*
        !           372:  *     new1sub(score,i,whoo,taxes)       Subroutine to put player into a 
        !           373:  *             int score,i,whyded,taxes;                 winning scoreboard entry if his score
        !           374:  *             char *whoo;                                       is high enough
        !           375:  *
        !           376:  *     Enter with the total score in gp in score,  players name in whoo,
        !           377:  *             died() reason # in whyded, and TRUE/FALSE in winner if a winner
        !           378:  *             slot in scoreboard in i, and the tax bill in taxes.
        !           379:  *     Returns nothing of value
        !           380:  */
        !           381: new1sub(score,i,whoo,taxes)
        !           382:        long score,taxes;
        !           383:        int i;
        !           384:        char *whoo;
        !           385:        {
        !           386:        register struct wscofmt *p;
        !           387:        p = &winr[i];
        !           388:        p->taxes += taxes;
        !           389:        if ((score >= p->score) || (c[HARDGAME] > p->hardlev))
        !           390:                {
        !           391:                strcpy(p->who,whoo);            p->score=score;
        !           392:                p->hardlev=c[HARDGAME];         p->suid=userid;
        !           393:                p->timeused=gtime/100;
        !           394:                }
        !           395:        }
        !           396: 
        !           397: /*
        !           398:  *     new2sub(score,i,whoo,whyded)              Subroutine to put player into a 
        !           399:  *             int score,i,whyded,taxes;                 non-winning scoreboard entry if his
        !           400:  *             char *whoo;                                       score is high enough
        !           401:  *
        !           402:  *     Enter with the total score in gp in score,  players name in whoo,
        !           403:  *             died() reason # in whyded, and slot in scoreboard in i.
        !           404:  *     Returns nothing of value
        !           405:  */
        !           406: new2sub(score,i,whoo,whyded)
        !           407:        long score;
        !           408:        int i,whyded;
        !           409:        char *whoo;
        !           410:        {
        !           411:        register int j;
        !           412:        register struct scofmt *p;
        !           413:        p = &sco[i];
        !           414:        if ((score >= p->score) || (c[HARDGAME] > p->hardlev))
        !           415:                {
        !           416:                strcpy(p->who,whoo);  p->score=score;
        !           417:                p->what=whyded;       p->hardlev=c[HARDGAME];
        !           418:                p->suid=userid;           p->level=level;
        !           419:                for (j=0; j<26; j++)
        !           420:                        { p->sciv[j][0]=iven[j]; p->sciv[j][1]=ivenarg[j]; }
        !           421:                }
        !           422:        }
        !           423: 
        !           424: /*
        !           425:  *     died(x)         Subroutine to record who played larn, and what the score was
        !           426:  *             int x;
        !           427:  *
        !           428:  *     if x < 0 then don't show scores
        !           429:  *     died() never returns! (unless c[LIFEPROT] and a reincarnatable death!)
        !           430:  *
        !           431:  *             < 256   killed by the monster number
        !           432:  *             256             quit
        !           433:  *             257             suspended
        !           434:  *             258             self - annihilated
        !           435:  *             259             shot by an arrow
        !           436:  *             260             hit by a dart
        !           437:  *             261             fell into a pit
        !           438:  *             262             fell into a bottomless pit
        !           439:  *             263             a winner
        !           440:  *             264             trapped in solid rock
        !           441:  *             265             killed by a missing save file
        !           442:  *             266             killed by an old save file
        !           443:  *             267             caught by the greedy cheater checker trap
        !           444:  *             268             killed by a protected save file
        !           445:  *             269             killed his family and killed himself
        !           446:  *             270             erased by a wayward finger
        !           447:  *             271             fell through a bottomless trap door
        !           448:  *             272             fell through a trap door
        !           449:  *             273             drank some poisonous water
        !           450:  *             274             fried by an electric shock
        !           451:  *             275             slipped on a volcano shaft
        !           452:  *             276             killed by a stupid act of frustration
        !           453:  *             277             attacked by a revolting demon
        !           454:  *             278             hit by his own magic
        !           455:  *             279             demolished by an unseen attacker
        !           456:  *             280             fell into the dreadful sleep
        !           457:  *             281             killed by an exploding chest
        !           458:  *             282             killed by a missing maze data file
        !           459:  *             283             killed by a sphere of annihilation
        !           460:  *             284             died a post mortem death
        !           461:  *             285             malloc() failure
        !           462:  *             300             quick quit -- don't put on scoreboard
        !           463:  */
        !           464: 
        !           465: static int scorerror;
        !           466: died(x)
        !           467:        int x;
        !           468:        {
        !           469:        register int f,win;
        !           470:        char ch,*mod;
        !           471:        long zzz,i;
        !           472:        struct tms cputime;
        !           473:        if (c[LIFEPROT]>0) /* if life protection */
        !           474:                {
        !           475:                switch((x>0) ? x : -x)
        !           476:                        {
        !           477:                        case 256: case 257: case 262: case 263: case 265: case 266:
        !           478:                        case 267: case 268: case 269: case 271: case 282: case 284:
        !           479:                        case 285: case 300:  goto invalid; /* can't be saved */
        !           480:                        };
        !           481:                --c[LIFEPROT]; c[HP]=1; --c[CONSTITUTION];
        !           482:                cursors(); lprcat("\nYou feel wiiieeeeerrrrrd all over! "); beep();
        !           483:                lflush();  sleep(4);
        !           484:                return; /* only case where died() returns */
        !           485:                }
        !           486: invalid:
        !           487:        clearvt100();  lflush();  f=0;
        !           488:        if (ckpflag) unlink(ckpfile);   /* remove checkpoint file if used */
        !           489:        if (x<0) { f++; x = -x; }       /* if we are not to display the scores */
        !           490:        if ((x == 300) || (x == 257))  exit();  /* for quick exit or saved game */
        !           491:        if (x == 263)  win = 1;  else  win = 0;
        !           492:        c[GOLD] += c[BANKACCOUNT];   c[BANKACCOUNT] = 0;
        !           493:                /*      now enter the player at the end of the scoreboard */
        !           494:        newscore(c[GOLD], logname, x, win);
        !           495:        diedsub(x);     /* print out the score line */  lflush();
        !           496: 
        !           497:        set_score_output();
        !           498:        if ((wizard == 0) && (c[GOLD] > 0))     /*      wizards can't score             */
        !           499:                {
        !           500: #ifndef NOLOG
        !           501:                if (lappend(logfile)<0)  /* append to file */
        !           502:                        {
        !           503:                        if (lcreat(logfile)<0) /* and can't create new log file */
        !           504:                        {
        !           505:                                lcreat((char*)0);
        !           506:                                lprcat("\nCan't open record file:  I can't post your score.\n");
        !           507:                                sncbr();  resetscroll();  lflush();  exit();
        !           508:                                }
        !           509:                        chmod(logfile,0660);
        !           510:                        }
        !           511:                strcpy(logg.who,loginname);
        !           512:                logg.score = c[GOLD];           logg.diff = c[HARDGAME];
        !           513:                if (x < 256)
        !           514:                        {
        !           515:                        ch = *monster[x].name;
        !           516:                        if (ch=='a' || ch=='e' || ch=='i' || ch=='o' || ch=='u')
        !           517:                                mod="an";  else mod="a";
        !           518:                        sprintf(logg.what,"killed by %s %s",mod,monster[x].name);
        !           519:                        }
        !           520:                else sprintf(logg.what,"%s",whydead[x - 256]);
        !           521:                logg.cavelev=level;
        !           522:                time(&zzz);       /* get cpu time -- write out score info */
        !           523:                logg.diedtime=zzz;
        !           524: #ifdef EXTRA
        !           525:                times(&cputime);  /* get cpu time -- write out score info */
        !           526:                logg.cputime = i = (cputime.tms_utime + cputime.tms_stime)/60 + c[CPUTIME];
        !           527:                logg.lev=c[LEVEL];                      logg.ac=c[AC];
        !           528:                logg.hpmax=c[HPMAX];            logg.hp=c[HP];
        !           529:                logg.elapsedtime=(zzz-initialtime+59)/60;
        !           530:                logg.usage=(10000*i)/(zzz-initialtime);
        !           531:                logg.bytin=c[BYTESIN];          logg.bytout=c[BYTESOUT];
        !           532:                logg.moves=c[MOVESMADE];        logg.spused=c[SPELLSCAST];
        !           533:                logg.killed=c[MONSTKILLED];
        !           534: #endif
        !           535:                lwrite((char*)&logg,sizeof(struct log_fmt));     lwclose();
        !           536: #endif NOLOG
        !           537: 
        !           538: /*     now for the scoreboard maintenance -- not for a suspended game  */
        !           539:                if (x != 257)
        !           540:                        {
        !           541:                        if (sortboard())  scorerror = writeboard();
        !           542:                        }
        !           543:                }
        !           544:        if ((x==256) || (x==257) || (f != 0)) exit();
        !           545:        if (scorerror == 0) showscores();       /* if we updated the scoreboard */
        !           546:        if (x == 263) mailbill();               exit();
        !           547:        }
        !           548: 
        !           549: /*
        !           550:  *     diedsub(x) Subroutine to print out the line showing the player when he is killed
        !           551:  *             int x;
        !           552:  */
        !           553: diedsub(x)
        !           554: int x;
        !           555:        {
        !           556:        register char ch,*mod;
        !           557:        lprintf("Score: %d, Diff: %d,  %s ",(long)c[GOLD],(long)c[HARDGAME],logname);
        !           558:        if (x < 256)
        !           559:                {
        !           560:                ch = *monster[x].name;
        !           561:                if (ch=='a' || ch=='e' || ch=='i' || ch=='o' || ch=='u')
        !           562:                        mod="an";  else mod="a";
        !           563:                lprintf("killed by %s %s",mod,monster[x].name);
        !           564:                }
        !           565:        else lprintf("%s",whydead[x - 256]);
        !           566:        if (x != 263) lprintf(" on %s\n",levelname[level]);  else lprc('\n');
        !           567:        }
        !           568: 
        !           569: /*
        !           570:  *     diedlog()       Subroutine to read a log file and print it out in ascii format
        !           571:  */
        !           572: diedlog()
        !           573:        {
        !           574:        register int n;
        !           575:        register char *p;
        !           576:        struct stat stbuf;
        !           577:        lcreat((char*)0);
        !           578:        if (lopen(logfile)<0)
        !           579:                {
        !           580:                lprintf("Can't locate log file <%s>\n",logfile);
        !           581:                return;
        !           582:                }
        !           583:        if (fstat(fd,&stbuf) < 0)
        !           584:                {
        !           585:                lprintf("Can't  stat log file <%s>\n",logfile);
        !           586:                return;
        !           587:                }
        !           588:        for (n=stbuf.st_size/sizeof(struct log_fmt); n>0; --n)
        !           589:                {
        !           590:                lrfill((char*)&logg,sizeof(struct log_fmt));
        !           591:                p = ctime(&logg.diedtime); p[16]='\n'; p[17]=0;
        !           592:                lprintf("Score: %d, Diff: %d,  %s %s on %d at %s",(long)(logg.score),(long)(logg.diff),logg.who,logg.what,(long)(logg.cavelev),p+4);
        !           593: #ifdef EXTRA
        !           594:                if (logg.moves<=0) logg.moves=1;
        !           595:                lprintf("  Experience Level: %d,  AC: %d,  HP: %d/%d,  Elapsed Time: %d minutes\n",(long)(logg.lev),(long)(logg.ac),(long)(logg.hp),(long)(logg.hpmax),(long)(logg.elapsedtime));
        !           596:                lprintf("  CPU time used: %d seconds,  Machine usage: %d.%02d%%\n",(long)(logg.cputime),(long)(logg.usage/100),(long)(logg.usage%100));
        !           597:                lprintf("  BYTES in: %d, out: %d, moves: %d, deaths: %d, spells cast: %d\n",(long)(logg.bytin),(long)(logg.bytout),(long)(logg.moves),(long)(logg.killed),(long)(logg.spused));
        !           598:                lprintf("  out bytes per move: %d,  time per move: %d ms\n",(long)(logg.bytout/logg.moves),(long)((logg.cputime*1000)/logg.moves));
        !           599: #endif
        !           600:                }
        !           601:                lflush();  lrclose();  return;
        !           602:        }
        !           603: 
        !           604: #ifndef UIDSCORE
        !           605: /*
        !           606:  *     getplid(name)           Function to get players id # from id file
        !           607:  *
        !           608:  *     Enter with the name of the players character in name.
        !           609:  *     Returns the id # of the players character, or -1 if failure.
        !           610:  *     This routine will try to find the name in the id file, if its not there,
        !           611:  *     it will try to make a new entry in the file.  Only returns -1 if can't
        !           612:  *     find him in the file, and can't make a new entry in the file.
        !           613:  *     Format of playerids file:
        !           614:  *                     Id # in ascii     \n     character name     \n   
        !           615:  */
        !           616: static int havepid= -1;        /* playerid # if previously done */
        !           617: getplid(nam)
        !           618:        char *nam;
        !           619:        {
        !           620:        int fd7,high=999,no;
        !           621:        register char *p,*p2;
        !           622:        char name[80];
        !           623:        if (havepid != -1) return(havepid);     /* already did it */
        !           624:        lflush();       /* flush any pending I/O */
        !           625:        sprintf(name,"%s\n",nam);       /* append a \n to name */
        !           626:        if (lopen(playerids) < 0)       /* no file, make it */
        !           627:                {
        !           628:                if ((fd7=creat(playerids,0666)) < 0)  return(-1); /* can't make it */
        !           629:                close(fd7);  goto addone;       /* now append new playerid record to file */
        !           630:                }
        !           631:        for (;;)        /* now search for the name in the player id file */
        !           632:                {
        !           633:                p = lgetl();  if (p==NULL) break;       /* EOF? */
        !           634:                no = atoi(p);   /* the id # */
        !           635:                p2= lgetl();  if (p2==NULL) break;      /* EOF? */
        !           636:                if (no>high) high=no;   /* accumulate highest id # */
        !           637:                if (strcmp(p2,name)==0) /* we found him */
        !           638:                        {
        !           639:                        return(no);     /* his id number */
        !           640:                        }
        !           641:                }
        !           642:        lrclose();
        !           643:        /* if we get here, we didn't find him in the file -- put him there */
        !           644: addone:
        !           645:        if (lappend(playerids) < 0) return(-1); /* can't open file for append */
        !           646:        lprintf("%d\n%s",(long)++high,name);  /* new id # and name */
        !           647:        lwclose();
        !           648:        lcreat((char*)0);       /* re-open terminal channel */
        !           649:        return(high);
        !           650:        }
        !           651: #endif UIDSCORE
        !           652: 

unix.superglobalmegacorp.com

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