Annotation of researchv10no/games/rogue/rip.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * File for the fun ends
        !             3:  * Death or a total win
        !             4:  *
        !             5:  * @(#)rip.c   3.13 (Berkeley) 6/16/81
        !             6:  */
        !             7: 
        !             8: #include <curses.h>
        !             9: #include <time.h>
        !            10: #include <signal.h>
        !            11: #include <ctype.h>
        !            12: #include <sys/types.h>
        !            13: #include <pwd.h>
        !            14: #include "mach_dep.h"
        !            15: #include "rogue.h"
        !            16: 
        !            17: static char *rip[] = {
        !            18: "                       __________",
        !            19: "                      /          \\",
        !            20: "                     /    REST    \\",
        !            21: "                    /      IN      \\",
        !            22: "                   /     PEACE      \\",
        !            23: "                  /                  \\",
        !            24: "                  |                  |",
        !            25: "                  |                  |",
        !            26: "                  |   killed by a    |",
        !            27: "                  |                  |",
        !            28: "                  |       1980       |",
        !            29: "                 *|     *  *  *      | *",
        !            30: "         ________)/\\\\_//(\\/(/\\)/\\//\\/|_)_______",
        !            31:     0
        !            32: };
        !            33: 
        !            34: char   *killname();
        !            35: 
        !            36: /*
        !            37:  * death:
        !            38:  *     Do something really fun when he dies
        !            39:  */
        !            40: 
        !            41: death(monst)
        !            42: register char monst;
        !            43: {
        !            44:     register char **dp = rip, *killer;
        !            45:     register struct tm *lt;
        !            46:     time_t date;
        !            47:     char buf[80];
        !            48:     struct tm *localtime();
        !            49: 
        !            50:     time(&date);
        !            51:     lt = localtime(&date);
        !            52:     clear();
        !            53:     move(8, 0);
        !            54:     while (*dp)
        !            55:        printw("%s\n", *dp++);
        !            56:     mvaddstr(14, 28-((strlen(whoami)+1)/2), whoami);
        !            57:     purse -= purse/10;
        !            58:     sprintf(buf, "%d Au", purse);
        !            59:     mvaddstr(15, 28-((strlen(buf)+1)/2), buf);
        !            60:     killer = killname(monst);
        !            61:     mvaddstr(17, 28-((strlen(killer)+1)/2), killer);
        !            62:     mvaddstr(16, 33, vowelstr(killer));
        !            63:     mvaddstr(18, 28, sprintf(prbuf, "%2d", lt->tm_year));
        !            64:     move(LINES-1, 0);
        !            65:     draw(stdscr);
        !            66:     score(purse, 0, monst);
        !            67:     endwin();
        !            68:     exit(0);
        !            69: }
        !            70: 
        !            71: /*
        !            72:  * score -- figure score and post it.
        !            73:  */
        !            74: 
        !            75: /* VARARGS2 */
        !            76: score(amount, flags, monst)
        !            77: char monst;
        !            78: {
        !            79:     static struct sc_ent {
        !            80:        int sc_score;
        !            81:        char sc_name[80];
        !            82:        int sc_flags;
        !            83:        int sc_level;
        !            84:        int sc_uid;
        !            85:        char sc_monster;
        !            86:     } top_ten[10];
        !            87:     register struct sc_ent *scp;
        !            88:     register int i;
        !            89:     register struct sc_ent *sc2;
        !            90:     register FILE *outf;
        !            91:     register char *killer;
        !            92:     register int prflags = 0;
        !            93:     register int fd;
        !            94:     static char *reason[] = {
        !            95:        "killed",
        !            96:        "quit",
        !            97:        "A total winner",
        !            98:     };
        !            99:     int        endit();
        !           100: 
        !           101:     if (flags != -1)
        !           102:        endwin();
        !           103:     /*
        !           104:      * Open file and read list
        !           105:      */
        !           106: 
        !           107:     if ((fd = open(cheating?"/usr/games/lib/cheat_roll":SCOREFILE, 2)) < 0)
        !           108:        return;
        !           109:     outf = fdopen(fd, "w");
        !           110: 
        !           111:     for (scp = top_ten; scp < &top_ten[10]; scp++)
        !           112:     {
        !           113:        scp->sc_score = 0;
        !           114:        for (i = 0; i < 80; i++)
        !           115:            scp->sc_name[i] = rnd(255);
        !           116:        scp->sc_flags = RN;
        !           117:        scp->sc_level = RN;
        !           118:        scp->sc_monster = RN;
        !           119:        scp->sc_uid = RN;
        !           120:     }
        !           121: 
        !           122:     signal(SIGINT, SIG_DFL);
        !           123:     if (flags != -1)
        !           124:     {
        !           125:        printf("[Press return to continue]");
        !           126:        fflush(stdout);
        !           127:        gets(prbuf);
        !           128:     }
        !           129:     if (wizard)
        !           130:        if (strcmp(prbuf, "names") == 0)
        !           131:            prflags = 1;
        !           132:        else if (strcmp(prbuf, "edit") == 0)
        !           133:            prflags = 2;
        !           134:     encread((char *) top_ten, sizeof top_ten, fd);
        !           135:     /*
        !           136:      * Insert her in list if need be
        !           137:      */
        !           138:     if (!waswizard)
        !           139:     {
        !           140:        for (scp = top_ten; scp < &top_ten[10]; scp++)
        !           141:            if (amount > scp->sc_score)
        !           142:                break;
        !           143:        if (scp < &top_ten[10])
        !           144:        {
        !           145:            for (sc2 = &top_ten[9]; sc2 > scp; sc2--)
        !           146:                *sc2 = *(sc2-1);
        !           147:            scp->sc_score = amount;
        !           148:            strcpy(scp->sc_name, whoami);
        !           149:            scp->sc_flags = flags;
        !           150:            if (flags == 2)
        !           151:                scp->sc_level = max_level;
        !           152:            else
        !           153:                scp->sc_level = level;
        !           154:            scp->sc_monster = monst;
        !           155:            scp->sc_uid = getuid();
        !           156:        }
        !           157:     }
        !           158:     /*
        !           159:      * Print the list
        !           160:      */
        !           161:     printf("\nTop Ten Adventurers:\nRank\tScore\tName\n");
        !           162:     for (scp = top_ten; scp < &top_ten[10]; scp++) {
        !           163:        if (scp->sc_score) {
        !           164:            printf("%d\t%d\t%s: %s on level %d", scp - top_ten + 1,
        !           165:                scp->sc_score, scp->sc_name, reason[scp->sc_flags],
        !           166:                scp->sc_level);
        !           167:            if (scp->sc_flags == 0) {
        !           168:                printf(" by a");
        !           169:                killer = killname(scp->sc_monster);
        !           170:                if (*killer == 'a' || *killer == 'e' || *killer == 'i' ||
        !           171:                    *killer == 'o' || *killer == 'u')
        !           172:                        putchar('n');
        !           173:                printf(" %s", killer);
        !           174:            }
        !           175:            if (prflags == 1)
        !           176:            {
        !           177:                struct passwd *pp, *getpwuid();
        !           178: 
        !           179:                if ((pp = getpwuid(scp->sc_uid)) == NULL)
        !           180:                    printf(" (%d)", scp->sc_uid);
        !           181:                else
        !           182:                    printf(" (%s)", pp->pw_name);
        !           183:                putchar('\n');
        !           184:            }
        !           185:            else if (prflags == 2)
        !           186:            {
        !           187:                fflush(stdout);
        !           188:                gets(prbuf);
        !           189:                if (prbuf[0] == 'd')
        !           190:                {
        !           191:                    for (sc2 = scp; sc2 < &top_ten[9]; sc2++)
        !           192:                        *sc2 = *(sc2 + 1);
        !           193:                    top_ten[9].sc_score = 0;
        !           194:                    for (i = 0; i < 80; i++)
        !           195:                        top_ten[9].sc_name[i] = rnd(255);
        !           196:                    top_ten[9].sc_flags = RN;
        !           197:                    top_ten[9].sc_level = RN;
        !           198:                    top_ten[9].sc_monster = RN;
        !           199:                    scp--;
        !           200:                }
        !           201:            }
        !           202:            else
        !           203:                printf(".\n");
        !           204:        }
        !           205:     }
        !           206:     fseek(outf, 0L, 0);
        !           207:     /*
        !           208:      * Update the list file
        !           209:      */
        !           210:     encwrite((char *) top_ten, sizeof top_ten, outf);
        !           211:     fclose(outf);
        !           212: }
        !           213: 
        !           214: total_winner()
        !           215: {
        !           216:     register struct linked_list *item;
        !           217:     register struct object *obj;
        !           218:     register int worth;
        !           219:     register char c;
        !           220:     register int oldpurse;
        !           221: 
        !           222:     clear();
        !           223:     standout();
        !           224:     addstr("                                                               \n");
        !           225:     addstr("  @   @               @   @           @          @@@  @     @  \n");
        !           226:     addstr("  @   @               @@ @@           @           @   @     @  \n");
        !           227:     addstr("  @   @  @@@  @   @   @ @ @  @@@   @@@@  @@@      @  @@@    @  \n");
        !           228:     addstr("   @@@@ @   @ @   @   @   @     @ @   @ @   @     @   @     @  \n");
        !           229:     addstr("      @ @   @ @   @   @   @  @@@@ @   @ @@@@@     @   @     @  \n");
        !           230:     addstr("  @   @ @   @ @  @@   @   @ @   @ @   @ @         @   @  @     \n");
        !           231:     addstr("   @@@   @@@   @@ @   @   @  @@@@  @@@@  @@@     @@@   @@   @  \n");
        !           232:     addstr("                                                               \n");
        !           233:     addstr("     Congratulations, you have made it to the light of day!    \n");
        !           234:     standend();
        !           235:     addstr("\nYou have joined the elite ranks of those who have escaped the\n");
        !           236:     addstr("Dungeons of Doom alive.  You journey home and sell all your loot at\n");
        !           237:     addstr("a great profit and are admitted to the fighters guild.\n");
        !           238:     mvaddstr(LINES - 1, 0, "--Press space to continue--");
        !           239:     refresh();
        !           240:     wait_for(' ');
        !           241:     clear();
        !           242:     mvaddstr(0, 0, "   Worth  Item");
        !           243:     oldpurse = purse;
        !           244:     for (c = 'a', item = pack; item != NULL; c++, item = next(item))
        !           245:     {
        !           246:        obj = (struct object *) ldata(item);
        !           247:        switch (obj->o_type)
        !           248:        {
        !           249:            when FOOD:
        !           250:                worth = 2 * obj->o_count;
        !           251:            when WEAPON:
        !           252:                switch (obj->o_which)
        !           253:                {
        !           254:                    when MACE: worth = 8;
        !           255:                    when SWORD: worth = 15;
        !           256:                    when BOW: worth = 75;
        !           257:                    when ARROW: worth = 1;
        !           258:                    when DAGGER: worth = 2;
        !           259:                    when ROCK: worth = 1;
        !           260:                    when TWOSWORD: worth = 30;
        !           261:                    when SLING: worth = 1;
        !           262:                    when DART: worth = 1;
        !           263:                    when CROSSBOW: worth = 15;
        !           264:                    when BOLT: worth = 1;
        !           265:                    when SPEAR: worth = 2;
        !           266:                    otherwise: worth = 0;
        !           267:                }
        !           268:                worth *= (1 + (10 * obj->o_hplus + 10 * obj->o_dplus));
        !           269:                worth *= obj->o_count;
        !           270:                obj->o_flags |= ISKNOW;
        !           271:            when ARMOR:
        !           272:                switch (obj->o_which)
        !           273:                {
        !           274:                    when LEATHER: worth = 5;
        !           275:                    when RING_MAIL: worth = 30;
        !           276:                    when STUDDED_LEATHER: worth = 15;
        !           277:                    when SCALE_MAIL: worth = 3;
        !           278:                    when CHAIN_MAIL: worth = 75;
        !           279:                    when SPLINT_MAIL: worth = 80;
        !           280:                    when BANDED_MAIL: worth = 90;
        !           281:                    when PLATE_MAIL: worth = 400;
        !           282:                    otherwise: worth = 0;
        !           283:                }
        !           284:                worth *= (1 + (10 * (a_class[obj->o_which] - obj->o_ac)));
        !           285:                obj->o_flags |= ISKNOW;
        !           286:            when SCROLL:
        !           287:                s_know[obj->o_which] = TRUE;
        !           288:                worth = s_magic[obj->o_which].mi_worth;
        !           289:                worth *= obj->o_count;
        !           290:            when POTION:
        !           291:                p_know[obj->o_which] = TRUE;
        !           292:                worth = p_magic[obj->o_which].mi_worth;
        !           293:                worth *= obj->o_count;
        !           294:            when RING:
        !           295:                obj->o_flags |= ISKNOW;
        !           296:                r_know[obj->o_which] = TRUE;
        !           297:                worth = r_magic[obj->o_which].mi_worth;
        !           298:                if (obj->o_which == R_ADDSTR || obj->o_which == R_ADDDAM ||
        !           299:                    obj->o_which == R_PROTECT || obj->o_which == R_ADDHIT)
        !           300:                        if (obj->o_ac > 0)
        !           301:                            worth += obj->o_ac * 20;
        !           302:                        else
        !           303:                            worth = 50;
        !           304:            when STICK:
        !           305:                obj->o_flags |= ISKNOW;
        !           306:                ws_know[obj->o_which] = TRUE;
        !           307:                worth = ws_magic[obj->o_which].mi_worth;
        !           308:                worth += 20 * obj->o_charges;
        !           309:            when AMULET:
        !           310:                worth = 1000;
        !           311:        }
        !           312:        mvprintw(c - 'a' + 1, 0, "%c) %5d  %s", c, worth, inv_name(obj, FALSE));
        !           313:        purse += worth;
        !           314:     }
        !           315:     mvprintw(c - 'a' + 1, 0,"   %5d  Gold Peices          ", oldpurse);
        !           316:     refresh();
        !           317:     score(purse, 2);
        !           318:     exit(0);
        !           319: }
        !           320: 
        !           321: char *
        !           322: killname(monst)
        !           323: register char monst;
        !           324: {
        !           325:     if (isupper(monst))
        !           326:        return monsters[monst-'A'].m_name;
        !           327:     else
        !           328:        switch (monst)
        !           329:        {
        !           330:            case 'a':
        !           331:                return "arrow";
        !           332:            case 'd':
        !           333:                return "dart";
        !           334:            case 'b':
        !           335:                return "bolt";
        !           336:        }
        !           337: }

unix.superglobalmegacorp.com

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