[BACK]Return to rip.c CVS log [TXT][DIR] Up to [contributed] / early-roguelike / srogue

Annotation of early-roguelike/srogue/rip.c, Revision 1.1

1.1     ! rubenllo    1: /*
        !             2:  * File for the fun, ends in death or a total win
        !             3:  *
        !             4:  * @(#)rip.c   9.0     (rdk)    7/17/84
        !             5:  *
        !             6:  * Super-Rogue
        !             7:  * Copyright (C) 1984 Robert D. Kindelberger
        !             8:  * All rights reserved.
        !             9:  *
        !            10:  * Based on "Rogue: Exploring the Dungeons of Doom"
        !            11:  * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
        !            12:  * All rights reserved.
        !            13:  *
        !            14:  * See the file LICENSE.TXT for full copyright and licensing information.
        !            15:  */
        !            16:
        !            17: #include <ctype.h>
        !            18: #include <string.h>
        !            19: #include <sys/types.h>
        !            20: #include <fcntl.h>
        !            21: #include <time.h>
        !            22: #include "rogue.h"
        !            23: #include "rogue.ext"
        !            24:
        !            25: static char scoreline[100];
        !            26:
        !            27: static char *rip[] = {
        !            28: "                          ____________________",
        !            29: "                         /                    \\",
        !            30: "                        /  Bob Kindelberger's  \\",
        !            31: "                       /       Graveyard        \\",
        !            32: "                      /                          \\",
        !            33: "                     /       REST IN PEACE        \\",
        !            34: "                    /                              \\",
        !            35: "                    |                              |",
        !            36: "                    |                              |",
        !            37: "                    |        Destroyed by a        |",
        !            38: "                    |                              |",
        !            39: "                    |                              |",
        !            40: "                    |                              |",
        !            41: "                    |                              |",
        !            42: "                    |                              |",
        !            43: "                    |                              |",
        !            44: "                    |                              |",
        !            45: "                   *|     *     *     *     *      |*",
        !            46: "          ________)\\\\//\\//\\)/\\//\\)/\\//\\)/\\//\\)/\\//\\//(________",
        !            47: };
        !            48:
        !            49: #define RIP_LINES (sizeof rip / (sizeof (char *)))
        !            50:
        !            51: extern FILE *scoreboard;
        !            52: extern FILE *logfile;
        !            53:
        !            54: char *killname(unsigned char monst);
        !            55: void showpack(bool winner, char *howso);
        !            56:
        !            57: /*
        !            58:  * death:
        !            59:  *     Do something really fun when he dies
        !            60:  */
        !            61:
        !            62: #include <time.h>
        !            63: void
        !            64: death(char monst)
        !            65: {
        !            66:        reg char *killer;
        !            67:        int dp;
        !            68:        struct tm *lt;
        !            69:        time_t date;
        !            70:        char buf[LINLEN];
        !            71:        struct tm *localtime();
        !            72:
        !            73:        time(&date);
        !            74:        lt = localtime(&date);
        !            75:        clear();
        !            76:        move(3, 0);
        !            77:        for (dp = 0; dp < RIP_LINES; dp++)
        !            78:                printw("%s\n", rip[dp]);
        !            79:        mvaddstr(10, 36 - ((strlen(whoami) + 1) / 2), whoami);
        !            80:        killer = killname(monst);
        !            81:        mvaddstr(12, 43, vowelstr(killer));
        !            82:        mvaddstr(14, 36 - ((strlen(killer) + 1) / 2), killer);
        !            83:        purse -= purse/10;
        !            84:        sprintf(buf, "%d Gold Pieces", purse);
        !            85:        mvaddstr(16, 36 - ((strlen(buf) + 1) / 2), buf);
        !            86:        sprintf(prbuf, "%d/%d/%d", lt->tm_mon + 1, lt->tm_mday, 1900+lt->tm_year);
        !            87:        mvaddstr(18, 32, prbuf);
        !            88:        move(LINES-1, 0);
        !            89:        refresh();
        !            90:        writelog(purse, KILLED, monst);
        !            91:        score(purse, KILLED, monst);
        !            92:        printf("[Press return to exit]\n");
        !            93:        fflush(NULL);
        !            94:        getchar();
        !            95:        byebye(0);
        !            96: }
        !            97:
        !            98: /*
        !            99:  * top ten entry structure
        !           100:  */
        !           101: static struct sc_ent {
        !           102:        int sc_score;                   /* gold */
        !           103:        char sc_name[LINLEN];           /* players name */
        !           104:        int sc_flags;                   /* reason for being here */
        !           105:        int sc_level;                   /* dungeon level */
        !           106:        int sc_uid;                     /* user ID */
        !           107:        unsigned char sc_monster;       /* killer */
        !           108:        int sc_explvl;                  /* experience level */
        !           109:        long int sc_exppts;             /* experience points */
        !           110:        time_t sc_date;                 /* time this score was posted */
        !           111: } top_ten[10];
        !           112:
        !           113: char *reason[] = {
        !           114:        "Killed",
        !           115:        "Chickened out",
        !           116:        "A Total Winner"
        !           117: };
        !           118: int oldpurse;
        !           119:
        !           120: /*
        !           121:  * score:
        !           122:  *     Figure score and post it.
        !           123:  */
        !           124: void
        !           125: score(int amount, int aflag, char monst)
        !           126: {
        !           127:        reg struct sc_ent *scp, *sc2;
        !           128:        reg int i, prflags = 0;
        !           129:        char *packend;
        !           130:
        !           131:        md_onsignal_exit();
        !           132:        if (aflag != WINNER) {
        !           133:                if (aflag == CHICKEN)
        !           134:                        packend = "when you chickened out";
        !           135:                else
        !           136:                        packend = "at your untimely demise";
        !           137:                mvaddstr(LINES - 1, 0, retstr);
        !           138:                refresh();
        !           139:                wgetnstr(stdscr,prbuf,80);
        !           140:                oldpurse = purse;
        !           141:                showpack(FALSE, packend);
        !           142:        }
        !           143:        /*
        !           144:         * Open file and read list
        !           145:         */
        !           146:        if (scoreboard == NULL)
        !           147:                return;
        !           148:        for (scp = top_ten; scp <= &top_ten[9]; scp++) {
        !           149:                scp->sc_score = 0;
        !           150:                for (i = 0; i < 80; i++)
        !           151:                        scp->sc_name[i] = rnd(255);
        !           152:                scp->sc_flags = rnd(255);
        !           153:                scp->sc_level = rnd(255);
        !           154:                scp->sc_monster = rnd(255);
        !           155:                scp->sc_uid = rnd(255);
        !           156:                scp->sc_date = rnd(255);
        !           157:        }
        !           158:        mvaddstr(LINES - 1, 0, retstr);
        !           159:        refresh();
        !           160:        wgetnstr(stdscr,prbuf,80);
        !           161:        if (author() || wizard)
        !           162:                if (strcmp(prbuf, "names") == 0)
        !           163:                        prflags = 1;
        !           164:         for(i = 0; i < 10; i++)
        !           165:         {
        !           166:             unsigned int mon;
        !           167:
        !           168:             encread((char *) &top_ten[i].sc_name, LINLEN, scoreboard);
        !           169:             encread((char *) scoreline, 100, scoreboard);
        !           170:             sscanf(scoreline, " %d %d %d %d %u %d %ld %lx \n",
        !           171:                 &top_ten[i].sc_score,   &top_ten[i].sc_flags,
        !           172:                 &top_ten[i].sc_level,   &top_ten[i].sc_uid,
        !           173:                 &mon,                   &top_ten[i].sc_explvl,
        !           174:                 &top_ten[i].sc_exppts,  &top_ten[i].sc_date);
        !           175:             top_ten[i].sc_monster = mon;
        !           176:         }
        !           177:        /*
        !           178:         * Insert it in list if need be
        !           179:         */
        !           180:        if (!waswizard) {
        !           181:                for (scp = top_ten; scp <= &top_ten[9]; scp++)
        !           182:                        if (amount > scp->sc_score)
        !           183:                                break;
        !           184:                if (scp <= &top_ten[9]) {
        !           185:                        for (sc2 = &top_ten[9]; sc2 > scp; sc2--)
        !           186:                                *sc2 = *(sc2-1);
        !           187:                        scp->sc_score = amount;
        !           188:                        strcpy(scp->sc_name, whoami);
        !           189:                        scp->sc_flags = aflag;
        !           190:                        if (aflag == WINNER)
        !           191:                                scp->sc_level = max_level;
        !           192:                        else
        !           193:                                scp->sc_level = level;
        !           194:                        scp->sc_monster = monst;
        !           195:                        scp->sc_uid = playuid;
        !           196:                        scp->sc_explvl = him->s_lvl;
        !           197:                        scp->sc_exppts = him->s_exp;
        !           198:                        time(&scp->sc_date);
        !           199:                }
        !           200:        }
        !           201:        ignore();
        !           202:        fseek(scoreboard, 0L, 0);
        !           203:         for(i = 0; i < 10; i++)
        !           204:         {
        !           205:             memset(scoreline,0,100);
        !           206:             encwrite((char *) top_ten[i].sc_name, LINLEN, scoreboard);
        !           207:             sprintf(scoreline, " %d %d %d %d %u %d %ld %lx \n",
        !           208:                 top_ten[i].sc_score, top_ten[i].sc_flags,
        !           209:                 top_ten[i].sc_level, top_ten[i].sc_uid,
        !           210:                 top_ten[i].sc_monster, top_ten[i].sc_explvl,
        !           211:                 top_ten[i].sc_exppts, top_ten[i].sc_date);
        !           212:             encwrite((char *) scoreline, 100, scoreboard);
        !           213:         }
        !           214:        fclose(scoreboard);
        !           215:        md_onsignal_exit();
        !           216:        clear();
        !           217:        refresh();
        !           218:        endwin();
        !           219:        showtop(prflags);               /* print top ten list */
        !           220: }
        !           221:
        !           222: void writelog(int amount, int aflag, char monst)
        !           223: {
        !           224:        char logmessage[220], ltemp[80], mlev[40];
        !           225:        char *killer;
        !           226:
        !           227:        if (waswizard)
        !           228:                return;
        !           229: #ifdef LOGFILE
        !           230:        if (logfile == NULL)
        !           231:                return;
        !           232:        sprintf(logmessage, "%ld %d %s %d ", time(NULL), amount, whoami,
        !           233:                him->s_lvl);
        !           234:        if (amulet)
        !           235:                sprintf(mlev, " [max %d] with the Amulet", max_level);
        !           236:        else
        !           237:                mlev[0] = '\0';
        !           238:        if (aflag == KILLED) {
        !           239:                killer = killname(monst);
        !           240:                sprintf(ltemp, "killed by a%s %s on level %d%s\n",
        !           241:                        vowelstr(killer), killer, level, mlev);
        !           242:        }
        !           243:        else if (aflag == CHICKEN) {
        !           244:                sprintf(ltemp, "quit on level %d%s\n", level, mlev);
        !           245:        }
        !           246:         else if (aflag == WINNER) {
        !           247:                sprintf(ltemp, "escaped with the Amulet [deepest level: %d]\n",
        !           248:                        max_level);
        !           249:        }
        !           250:        else
        !           251:                return;
        !           252:        strcat(logmessage, ltemp);
        !           253:        fprintf(logfile, "%s", logmessage);
        !           254:        fclose(logfile);
        !           255: #endif
        !           256:        return;
        !           257: }
        !           258:
        !           259: /*
        !           260:  * showtop:
        !           261:  *     Display the top ten on the screen
        !           262:  */
        !           263: bool
        !           264: showtop(int showname)
        !           265: {
        !           266:        reg int i;
        !           267:        char *killer;
        !           268:        struct sc_ent *scp;
        !           269:        FILE *score_rdonly;
        !           270:
        !           271:        if ((score_rdonly = fopen(scorefile, "r")) == NULL)
        !           272:                return FALSE;
        !           273:
        !           274:         for(i = 0; i < 10; i++)
        !           275:         {
        !           276:             unsigned int mon;
        !           277:             encread((char *) &top_ten[i].sc_name, LINLEN, score_rdonly);
        !           278:             encread((char *) scoreline, 100, score_rdonly);
        !           279:             sscanf(scoreline, " %d %d %d %d %u %d %ld %lx \n",
        !           280:                 &top_ten[i].sc_score,   &top_ten[i].sc_flags,
        !           281:                 &top_ten[i].sc_level,   &top_ten[i].sc_uid,
        !           282:                 &mon,                   &top_ten[i].sc_explvl,
        !           283:                 &top_ten[i].sc_exppts,  &top_ten[i].sc_date);
        !           284:             top_ten[i].sc_monster = mon;
        !           285:         }
        !           286:        fclose(score_rdonly);
        !           287:        printf("Top Ten Adventurers:\nRank\tScore\tName\n");
        !           288:        for (scp = top_ten; scp <= &top_ten[9]; scp++) {
        !           289:                if (scp->sc_score > 0) {
        !           290:                        printf("%d\t%d\t%s: %s\t\t--> %s on level %d",
        !           291:                          scp - top_ten + 1, scp->sc_score, scp->sc_name,
        !           292:                          ctime(&scp->sc_date), reason[scp->sc_flags],
        !           293:                          scp->sc_level);
        !           294:                        if (scp->sc_flags == KILLED) {
        !           295:                                killer = killname(scp->sc_monster);
        !           296:                                printf(" by a%s %s",vowelstr(killer), killer);
        !           297:                        }
        !           298:                        printf(" [Exp: %d/%ld]",scp->sc_explvl,scp->sc_exppts);
        !           299:                        if (showname) {
        !           300:                                printf(" (%s)\n", md_getrealname(scp->sc_uid));
        !           301:                        }
        !           302:                        else
        !           303:                                printf("\n");
        !           304:                }
        !           305:        }
        !           306:        return TRUE;
        !           307: }
        !           308:
        !           309: /*
        !           310:  * total_winner:
        !           311:  *     The hero made it back out alive
        !           312:  */
        !           313: void
        !           314: total_winner(void)
        !           315: {
        !           316:        clear();
        !           317: addstr("                                                               \n");
        !           318: addstr("  @   @               @   @           @          @@@  @     @  \n");
        !           319: addstr("  @   @               @@ @@           @           @   @     @  \n");
        !           320: addstr("  @   @  @@@  @   @   @ @ @  @@@   @@@@  @@@      @  @@@    @  \n");
        !           321: addstr("   @@@@ @   @ @   @   @   @     @ @   @ @   @     @   @     @  \n");
        !           322: addstr("      @ @   @ @   @   @   @  @@@@ @   @ @@@@@     @   @     @  \n");
        !           323: addstr("  @   @ @   @ @  @@   @   @ @   @ @   @ @         @   @  @     \n");
        !           324: addstr("   @@@   @@@   @@ @   @   @  @@@@  @@@@  @@@     @@@   @@   @  \n");
        !           325: addstr("                                                               \n");
        !           326: addstr("     Congratulations, you have made it to the light of day!    \n");
        !           327: addstr("\nYou have joined the elite ranks of those who have escaped the\n");
        !           328: addstr("Dungeons of Doom alive.  You journey home and sell all your loot at\n");
        !           329: addstr("a great profit and are admitted to the fighters guild.\n");
        !           330:
        !           331:        mvaddstr(LINES - 1, 0,spacemsg);
        !           332:        refresh();
        !           333:        wait_for(stdscr, ' ');
        !           334:        clear();
        !           335:        oldpurse = purse;
        !           336:        showpack(TRUE, NULL);
        !           337:        writelog(purse, WINNER, 0);
        !           338:        score(purse, WINNER, 0);
        !           339:        printf("[Press return to exit]\n");
        !           340:        fflush(NULL);
        !           341:        getchar();
        !           342:        byebye(0);
        !           343: }
        !           344:
        !           345: /*
        !           346:  * showpack:
        !           347:  *     Display the contents of the hero's pack
        !           348:  */
        !           349: void
        !           350: showpack(bool winner, char *howso)
        !           351: {
        !           352:        reg char *iname;
        !           353:        reg int cnt, worth, ch;
        !           354:        reg struct linked_list *item;
        !           355:        reg struct object *obj;
        !           356:
        !           357:        idenpack();
        !           358:        cnt = 1;
        !           359:        clear();
        !           360:        if (winner)
        !           361:                mvaddstr(0, 0, "   Worth  Item");
        !           362:        else
        !           363:                mvprintw(0, 0, "Contents of your pack %s:\n",howso);
        !           364:        ch = 'a';
        !           365:        for (item = pack; item != NULL; item = next(item)) {
        !           366:                obj = OBJPTR(item);
        !           367:                iname = inv_name(obj, FALSE);
        !           368:                if (winner) {
        !           369:                        worth = get_worth(obj);
        !           370:                        worth *= obj->o_count;
        !           371:                        mvprintw(cnt, 0, "  %6d  %s",worth,iname);
        !           372:                        purse += worth;
        !           373:                }
        !           374:                else {
        !           375:                        mvprintw(cnt, 0, "%c) %s\n",ch,iname);
        !           376:                        ch = npch(ch);
        !           377:                }
        !           378:                if (++cnt >= LINES - 2 && next(item) != NULL) {
        !           379:                        cnt = 1;
        !           380:                        mvaddstr(LINES - 1, 0, morestr);
        !           381:                        refresh();
        !           382:                        wait_for(stdscr, ' ');
        !           383:                        clear();
        !           384:                }
        !           385:        }
        !           386:        mvprintw(cnt + 1,0,"--- %d  Gold Pieces ---",oldpurse);
        !           387:        refresh();
        !           388: }
        !           389:
        !           390: /*
        !           391:  * killname:
        !           392:  *     Returns what the hero was killed by.
        !           393:  */
        !           394: char *
        !           395: killname(unsigned char monst)
        !           396: {
        !           397:        if (monst < MAXMONS + 1)
        !           398:                return monsters[monst].m_name;
        !           399:        else            /* things other than monsters */
        !           400:                switch (monst) {
        !           401:                        case K_ARROW:   return "crooked arrow";
        !           402:                        case K_DART:    return "sharp dart";
        !           403:                        case K_BOLT:    return "jagged bolt";
        !           404:                        case K_POOL:    return "magic pool";
        !           405:                        case K_ROD:     return "exploding rod";
        !           406:                        case K_SCROLL:  return "burning scroll";
        !           407:                        case K_STONE:   return "transmogrification to stone";
        !           408:                        case K_STARVE:  return "starvation";
        !           409:        }
        !           410:        return "Bob Kindelberger";
        !           411: }

CVSweb