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

Annotation of early-roguelike/rogue4/rip.c, Revision 1.1.1.1

1.1       rubenllo    1: /*
                      2:  * File for the fun ends
                      3:  * Death or a total win
                      4:  *
                      5:  * @(#)rip.c   4.28 (Berkeley) 4/12/82
                      6:  *
                      7:  * Rogue: Exploring the Dungeons of Doom
                      8:  * Copyright (C) 1980, 1981, 1982 Michael Toy, Ken Arnold and Glenn Wichman
                      9:  * All rights reserved.
                     10:  *
                     11:  * See the file LICENSE.TXT for full copyright and licensing information.
                     12:  */
                     13:
                     14: #include <curses.h>
                     15: #include <time.h>
                     16: #include <signal.h>
                     17: #include <sys/types.h>
                     18: #include <string.h>
                     19: #include <stdlib.h>
                     20: #include "rogue.h"
                     21:
                     22: char *killname(char monst, bool doart);
                     23:
                     24: static char *rip[] = {
                     25: "                       __________",
                     26: "                      /          \\",
                     27: "                     /    REST    \\",
                     28: "                    /      IN      \\",
                     29: "                   /     PEACE      \\",
                     30: "                  /                  \\",
                     31: "                  |                  |",
                     32: "                  |                  |",
                     33: "                  |   killed by a    |",
                     34: "                  |                  |",
                     35: "                  |       1980       |",
                     36: "                 *|     *  *  *      | *",
                     37: "         ________)/\\\\_//(\\/(/\\)/\\//\\/|_)_______",
                     38:     0
                     39: };
                     40:
                     41: /*
                     42:  * score:
                     43:  *     Figure score and post it.
                     44:  */
                     45: /* VARARGS2 */
                     46: void
                     47: score(int amount, int flags, char monst)
                     48: {
                     49:     register struct sc_ent *scp;
                     50:     register int i;
                     51:     register struct sc_ent *sc2;
                     52:     register int prflags = 0;
                     53:     register void (*fp)(int);
                     54:     register int uid;
                     55:     char scoreline[MAXSTR + 100];
                     56:
                     57:     static struct sc_ent {
                     58:        char sc_name[MAXSTR];
                     59:        unsigned int sc_flags;
                     60:        unsigned int sc_uid;
                     61:        unsigned short sc_monster;
                     62:        unsigned short sc_score;
                     63:        unsigned short sc_level;
                     64:     } top_ten[10];
                     65:     static char *reason[] = {
                     66:        "killed",
                     67:        "quit",
                     68:        "A total winner",
                     69:     };
                     70:     void endit();
                     71:
                     72:     start_score();
                     73:
                     74:     for (scp = top_ten; scp <= &top_ten[9]; scp++)
                     75:     {
                     76:        scp->sc_score = 0;
                     77:        for (i = 0; i < MAXSTR; i++)
                     78:            scp->sc_name[i] = rnd(255);
                     79:        scp->sc_flags = RN;
                     80:        scp->sc_level = RN;
                     81:        scp->sc_monster = RN;
                     82:        scp->sc_uid = RN;
                     83:     }
                     84:
                     85:     signal(SIGINT, SIG_DFL);
                     86:     if (flags != -1
                     87: #ifdef WIZARD
                     88:            || wizard
                     89: #endif
                     90:        )
                     91:     {
                     92:        mvaddstr(LINES - 1, 0 , "[Press return to continue]");
                     93:         refresh();
                     94:         wgetnstr(stdscr,prbuf,80);
                     95:         move(LINES - 1, 0);
                     96:         clrtoeol();
                     97:         refresh();
                     98:         endwin();
                     99:     }
                    100: #ifdef WIZARD
                    101:     if (wizard)
                    102:        if (strcmp(prbuf, "names") == 0)
                    103:            prflags = 1;
                    104:        else if (strcmp(prbuf, "edit") == 0)
                    105:            prflags = 2;
                    106: #endif
                    107:     for(i=0; i<10; i++)
                    108:     {
                    109:         encread((char *) &top_ten[i].sc_name, MAXSTR, score_file);
                    110:        scoreline[0] = '\0';
                    111:         encread((char *) scoreline, 100, score_file);
                    112:         sscanf(scoreline, "%d %d %hd %hd %hd", &top_ten[i].sc_flags,
                    113:             &top_ten[i].sc_uid, &top_ten[i].sc_monster, &top_ten[i].sc_score,
                    114:             &top_ten[i].sc_level);
                    115:     }
                    116:     /*
                    117:      * Insert her in list if need be
                    118:      */
                    119:     sc2 = NULL;
                    120:     if (!noscore)
                    121:     {
                    122:        uid = md_getuid();
                    123:
                    124:        for (scp = top_ten; scp <= &top_ten[9]; scp++)
                    125:            if (amount > scp->sc_score)
                    126:                break;
                    127: #ifdef LIMIT_TOPTEN
                    128:             else if (flags != 2 && scp->sc_uid == uid && scp->sc_flags != 2)
                    129:                scp = &top_ten[9] + 1;  /* only one score per nowin uid */
                    130: #endif
                    131:        if (scp <= &top_ten[9])
                    132:        {
                    133: #ifdef LIMIT_TOPTEN
                    134:            if (flags != 2)
                    135:                for (sc2 = scp; sc2 <= &top_ten[9]; sc2++)
                    136:                {
                    137:                    if (sc2->sc_uid == uid && sc2->sc_flags != 2)
                    138:                        break;
                    139:                }
                    140:            else
                    141: #endif
                    142:                sc2 = &top_ten[9];
                    143:            while (sc2 > scp)
                    144:            {
                    145:                *sc2 = sc2[-1];
                    146:                sc2--;
                    147:            }
                    148:            scp->sc_score = amount;
                    149:            strncpy(scp->sc_name, whoami, MAXSTR);
                    150:            scp->sc_flags = flags;
                    151:            if (flags == 2)
                    152:                scp->sc_level = max_level;
                    153:            else
                    154:                scp->sc_level = level;
                    155:            scp->sc_monster = monst;
                    156:            scp->sc_uid = uid;
                    157:            sc2 = scp;
                    158:        }
                    159:     }
                    160:     /*
                    161:      * Print the list
                    162:      */
                    163:     printf("Top Ten Rogueists:\nRank\tScore\tName\n");
                    164:     for (scp = top_ten; scp <= &top_ten[9]; scp++)
                    165:     {
                    166:        if (scp->sc_score) {
                    167:            printf("%d\t%d\t%s: %s on level %d", scp - top_ten + 1,
                    168:                scp->sc_score, scp->sc_name, reason[scp->sc_flags],
                    169:                scp->sc_level);
                    170:            if (scp->sc_flags == 0)
                    171:                printf(" by %s", killname((char) scp->sc_monster, TRUE));
                    172:            if (prflags == 1)
                    173:            {
                    174:                char *name;
                    175:                name = md_getusername(scp->sc_uid);
                    176:
                    177:                if (name == NULL)
                    178:                    printf(" (%d)", scp->sc_uid);
                    179:                else
                    180:                    printf(" (%s)", name);
                    181:                putchar('\n');
                    182:            }
                    183:            else if (prflags == 2)
                    184:            {
                    185:                fflush(stdout);
                    186:                fgets(prbuf,80,stdin);
                    187:                if (prbuf[0] == 'd')
                    188:                {
                    189:                    for (sc2 = scp; sc2 < &top_ten[9]; sc2++)
                    190:                        *sc2 = *(sc2 + 1);
                    191:                    top_ten[9].sc_score = 0;
                    192:                    for (i = 0; i < MAXSTR; i++)
                    193:                        top_ten[9].sc_name[i] = rnd(255);
                    194:                    top_ten[9].sc_flags = RN;
                    195:                    top_ten[9].sc_level = RN;
                    196:                    top_ten[9].sc_monster = RN;
                    197:                    scp--;
                    198:                }
                    199:            }
                    200:            else
                    201:                printf(".\n");
                    202:        }
                    203:        else
                    204:            break;
                    205:     }
                    206:     fseek(score_file, 0L, 0);
                    207:     /*
                    208:      * Update the list file
                    209:      */
                    210:     if (sc2 != NULL)
                    211:     {
                    212:        if (lock_sc())
                    213:        {
                    214:             int i;
                    215:
                    216:            fp = signal(SIGINT, SIG_IGN);
                    217:
                    218:             for(i=0; i<10; i++)
                    219:             {
                    220:                 encwrite((char *) &top_ten[i].sc_name, MAXSTR, score_file);
                    221:                 sprintf(scoreline," %d %d %hd %hd %hd \n",
                    222:                     top_ten[i].sc_flags, top_ten[i].sc_uid,
                    223:                     top_ten[i].sc_monster, top_ten[i].sc_score,
                    224:                     top_ten[i].sc_level);
                    225:                 encwrite((char *) scoreline, 100, score_file);
                    226:             }
                    227:            unlock_sc();
                    228:            signal(SIGINT, fp);
                    229:        }
                    230:     }
                    231:     fclose(score_file);
                    232: }
                    233:
                    234: void writelog(int amount, int flags, char monst)
                    235: {
                    236:     char logmessage[220], ltemp[80];
                    237:     char *killer;
                    238:     if (noscore)
                    239:         return;
                    240: #ifdef LOGFILE
                    241:     if (log_file == NULL)
                    242:         return;
                    243:     /* otherwise writing should work */
                    244:     sprintf(logmessage, "%ld %d %s %d ", time(NULL), amount, whoami,
                    245:             pstats.s_lvl);
                    246:     if (flags == 0) /* died */
                    247:     {
                    248:         strcat(logmessage, "killed by ");
                    249:         killer = killname(monst, TRUE);
                    250:         strcat(logmessage, killer);
                    251:         if (amulet)
                    252:             sprintf(ltemp, " on level %d [max %d] with the Amulet\n",
                    253:                     level, max_level);
                    254:         else
                    255:             sprintf(ltemp, " on level %d\n", level);
                    256:         strcat(logmessage, ltemp);
                    257:     }
                    258:     else if (flags == 1) /* quit */
                    259:     {
                    260:         if (amulet)
                    261:             sprintf(ltemp, "quit on level %d [max %d] with the Amulet\n",
                    262:                     level, max_level);
                    263:         else
                    264:             sprintf(ltemp, "quit on level %d\n", level);
                    265:         strcat(logmessage, ltemp);
                    266:     }
                    267:     else if (flags == 2) /* won */
                    268:     {
                    269:         sprintf(ltemp, "escaped with the Amulet [deepest level: %d]\n",
                    270:                 max_level);
                    271:         strcat(logmessage, ltemp);
                    272:     }
                    273:     else
                    274:     {
                    275:         fclose(log_file);
                    276:         return;
                    277:     }
                    278:
                    279:     /* then write */
                    280:     fprintf(log_file, "%s", logmessage);
                    281:     fclose(log_file);
                    282: #endif
                    283:     return;
                    284: }
                    285:
                    286: /*
                    287:  * death:
                    288:  *     Do something really fun when he dies
                    289:  */
                    290: void
                    291: death(char monst)
                    292: {
                    293:     register char **dp = rip, *killer;
                    294:     register struct tm *lt;
                    295:     time_t date;
                    296:     char buf[MAXSTR];
                    297:     struct tm *localtime();
                    298:
                    299:     signal(SIGINT, SIG_IGN);
                    300:     purse -= purse / 10;
                    301:     signal(SIGINT, leave);
                    302:     time(&date);
                    303:     lt = localtime(&date);
                    304:     clear();
                    305:     move(8, 0);
                    306:     while (*dp)
                    307:        printw("%s\n", *dp++);
                    308:     mvaddstr(14, 28-((strlen(whoami)+1)/2), whoami);
                    309:     sprintf(buf, "%d Au", purse);
                    310:     mvaddstr(15, 28-((strlen(buf)+1)/2), buf);
                    311:     killer = killname(monst, FALSE);
                    312:     mvaddstr(17, 28-((strlen(killer)+1)/2), killer);
                    313:     if (monst == 's')
                    314:        mvaddch(16, 32, ' ');
                    315:     else
                    316:        mvaddstr(16, 33, vowelstr(killer));
                    317:     sprintf(prbuf, "%2d", 1900+lt->tm_year);
                    318:     mvaddstr(18, 26, prbuf);
                    319:     move(LINES-1, 0);
                    320:     refresh();
                    321:     writelog(purse, 0, monst);
                    322:     score(purse, 0, monst);
                    323:     /* Make sure the output gets through */
                    324:     printf("[Press return to exit]\n");
                    325:     fflush(NULL);
                    326:     getchar();
                    327:     exit(0);
                    328: }
                    329:
                    330: /*
                    331:  * total_winner:
                    332:  *     Code for a winner
                    333:  */
                    334: void
                    335: total_winner(void)
                    336: {
                    337:     register THING *obj;
                    338:     register int worth = 0;
                    339:     register char c;
                    340:     register int oldpurse;
                    341:
                    342:     clear();
                    343:     standout();
                    344:     addstr("                                                               \n");
                    345:     addstr("  @   @               @   @           @          @@@  @     @  \n");
                    346:     addstr("  @   @               @@ @@           @           @   @     @  \n");
                    347:     addstr("  @   @  @@@  @   @   @ @ @  @@@   @@@@  @@@      @  @@@    @  \n");
                    348:     addstr("   @@@@ @   @ @   @   @   @     @ @   @ @   @     @   @     @  \n");
                    349:     addstr("      @ @   @ @   @   @   @  @@@@ @   @ @@@@@     @   @     @  \n");
                    350:     addstr("  @   @ @   @ @  @@   @   @ @   @ @   @ @         @   @  @     \n");
                    351:     addstr("   @@@   @@@   @@ @   @   @  @@@@  @@@@  @@@     @@@   @@   @  \n");
                    352:     addstr("                                                               \n");
                    353:     addstr("     Congratulations, you have made it to the light of day!    \n");
                    354:     standend();
                    355:     addstr("\nYou have joined the elite ranks of those who have escaped the\n");
                    356:     addstr("Dungeons of Doom alive.  You journey home and sell all your loot at\n");
                    357:     addstr("a great profit and are admitted to the fighters guild.\n");
                    358:     mvaddstr(LINES - 1, 0, "--Press space to continue--");
                    359:     refresh();
                    360:     wait_for(' ');
                    361:     clear();
                    362:     mvaddstr(0, 0, "   Worth  Item");
                    363:     oldpurse = purse;
                    364:     for (c = 'a', obj = pack; obj != NULL; c++, obj = next(obj))
                    365:     {
                    366:        switch (obj->o_type)
                    367:        {
                    368:            case FOOD:
                    369:                worth = 2 * obj->o_count;
                    370:            when WEAPON:
                    371:                switch (obj->o_which)
                    372:                {
                    373:                    case MACE: worth = 8;
                    374:                    when SWORD: worth = 15;
                    375:                    when CROSSBOW: worth = 30;
                    376:                    when ARROW: worth = 1;
                    377:                    when DAGGER: worth = 2;
                    378:                    when TWOSWORD: worth = 75;
                    379:                    when DART: worth = 1;
                    380:                    when BOW: worth = 15;
                    381:                    when BOLT: worth = 1;
                    382:                    when SPEAR: worth = 5;
                    383:                }
                    384:                worth *= 3 * (obj->o_hplus + obj->o_dplus) + obj->o_count;
                    385:                obj->o_flags |= ISKNOW;
                    386:            when ARMOR:
                    387:                switch (obj->o_which)
                    388:                {
                    389:                    case LEATHER: worth = 20;
                    390:                    when RING_MAIL: worth = 25;
                    391:                    when STUDDED_LEATHER: worth = 20;
                    392:                    when SCALE_MAIL: worth = 30;
                    393:                    when CHAIN_MAIL: worth = 75;
                    394:                    when SPLINT_MAIL: worth = 80;
                    395:                    when BANDED_MAIL: worth = 90;
                    396:                    when PLATE_MAIL: worth = 150;
                    397:                }
                    398:                worth += (9 - obj->o_ac) * 100;
                    399:                worth += (10 * (a_class[obj->o_which] - obj->o_ac));
                    400:                obj->o_flags |= ISKNOW;
                    401:            when SCROLL:
                    402:                worth = s_magic[obj->o_which].mi_worth;
                    403:                worth *= obj->o_count;
                    404:                if (!s_know[obj->o_which])
                    405:                    worth /= 2;
                    406:                s_know[obj->o_which] = TRUE;
                    407:            when POTION:
                    408:                worth = p_magic[obj->o_which].mi_worth;
                    409:                worth *= obj->o_count;
                    410:                if (!p_know[obj->o_which])
                    411:                    worth /= 2;
                    412:                p_know[obj->o_which] = TRUE;
                    413:            when RING:
                    414:                worth = r_magic[obj->o_which].mi_worth;
                    415:                if (obj->o_which == R_ADDSTR || obj->o_which == R_ADDDAM ||
                    416:                    obj->o_which == R_PROTECT || obj->o_which == R_ADDHIT)
                    417:                        if (obj->o_ac > 0)
                    418:                            worth += obj->o_ac * 100;
                    419:                        else
                    420:                            worth = 10;
                    421:                if (!(obj->o_flags & ISKNOW))
                    422:                    worth /= 2;
                    423:                obj->o_flags |= ISKNOW;
                    424:                r_know[obj->o_which] = TRUE;
                    425:            when STICK:
                    426:                worth = ws_magic[obj->o_which].mi_worth;
                    427:                worth += 20 * obj->o_charges;
                    428:                if (!(obj->o_flags & ISKNOW))
                    429:                    worth /= 2;
                    430:                obj->o_flags |= ISKNOW;
                    431:                ws_know[obj->o_which] = TRUE;
                    432:            when AMULET:
                    433:                worth = 1000;
                    434:        }
                    435:        if (worth < 0)
                    436:            worth = 0;
                    437:        mvprintw(c - 'a' + 1, 0, "%c) %5d  %s", c, worth, inv_name(obj, FALSE));
                    438:        purse += worth;
                    439:     }
                    440:     mvprintw(c - 'a' + 1, 0,"   %5d  Gold Pieces          ", oldpurse);
                    441:     refresh();
                    442:     writelog(purse, 2, 0);
                    443:     score(purse, 2, 0);
                    444:     printf("[Press return to exit]\n");
                    445:     fflush(NULL);
                    446:     getchar();
                    447:     exit(0);
                    448: }
                    449:
                    450: /*
                    451:  * killname:
                    452:  *     Convert a code to a monster name
                    453:  */
                    454: char *
                    455: killname(char monst, bool doart)
                    456: {
                    457:     register const char *sp;
                    458:     register bool article;
                    459:
                    460:     sp = prbuf;
                    461:     article = TRUE;
                    462:     switch (monst)
                    463:     {
                    464:        case 'a':
                    465:            sp = "arrow";
                    466:        when 'b':
                    467:            sp = "bolt";
                    468:        when 'd':
                    469:            sp = "dart";
                    470:        when 's':
                    471:            sp = "starvation";
                    472:            article = FALSE;
                    473:        otherwise:
                    474:            if (monst >= 'A' && monst <= 'Z')
                    475:                sp = monsters[monst-'A'].m_name;
                    476:            else
                    477:            {
                    478:                sp = "God";
                    479:                article = FALSE;
                    480:            }
                    481:     }
                    482:     if (doart && article)
                    483:        sprintf(prbuf, "a%s ", vowelstr(sp));
                    484:     else
                    485:        prbuf[0] = '\0';
                    486:     strcat(prbuf, sp);
                    487:     return prbuf;
                    488: }

CVSweb