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

Annotation of early-roguelike/rogue5/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.57 (Berkeley) 02/05/99
                      6:  *
                      7:  * Rogue: Exploring the Dungeons of Doom
                      8:  * Copyright (C) 1980-1983, 1985, 1999 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 <stdlib.h>
                     15: #include <string.h>
                     16: #include <time.h>
                     17: #include <signal.h>
                     18: #include <sys/types.h>
                     19: #include <ctype.h>
                     20: #include <fcntl.h>
                     21: #include <curses.h>
                     22: #include "rogue.h"
                     23: #include "score.h"
                     24:
                     25: static char *rip[] = {
                     26: "                       __________\n",
                     27: "                      /          \\\n",
                     28: "                     /    REST    \\\n",
                     29: "                    /      IN      \\\n",
                     30: "                   /     PEACE      \\\n",
                     31: "                  /                  \\\n",
                     32: "                  |                  |\n",
                     33: "                  |                  |\n",
                     34: "                  |   killed by a    |\n",
                     35: "                  |                  |\n",
                     36: "                  |       1980       |\n",
                     37: "                 *|     *  *  *      | *\n",
                     38: "         ________)/\\\\_//(\\/(/\\)/\\//\\/|_)_______\n",
                     39:     0
                     40: };
                     41:
                     42: /*
                     43:  * score:
                     44:  *     Figure score and post it.
                     45:  */
                     46: /* VARARGS2 */
                     47:
                     48: void
                     49: score(int amount, int flags, int monst)
                     50: {
                     51:     SCORE *scp;
                     52:     int i;
                     53:     SCORE *sc2;
                     54:     SCORE *top_ten, *endp;
                     55: # ifdef MASTER
                     56:     int prflags = 0;
                     57: # endif
                     58:     void (*fp)(int);
                     59:     uid_t uid;
                     60:     char *reason[] = {
                     61:        "killed",
                     62:        "quit",
                     63:        "A total winner",
                     64:        "killed with Amulet"
                     65:     };
                     66:
                     67:     start_score();
                     68:
                     69:  if (flags >= 0
                     70: #ifdef MASTER
                     71:             || wizard
                     72: #endif
                     73:         )
                     74:     {
                     75:        mvaddstr(LINES - 1, 0 , "[Press return to continue]");
                     76:         refresh();
                     77:         wgetnstr(stdscr,prbuf,80);
                     78:        endwin();
                     79:         printf("\n");
                     80:         resetltchars();
                     81:        /*
                     82:         * free up space to "guarantee" there is space for the top_ten
                     83:         */
                     84:        delwin(stdscr);
                     85:        delwin(curscr);
                     86:        if (hw != NULL)
                     87:            delwin(hw);
                     88:     }
                     89:
                     90:     top_ten = malloc(numscores * sizeof (SCORE));
                     91:
                     92:        if (top_ten == NULL)
                     93:                return;
                     94:
                     95:     endp = &top_ten[numscores];
                     96:     for (scp = top_ten; scp < endp; scp++)
                     97:     {
                     98:        scp->sc_score = 0;
                     99:        for (i = 0; i < MAXSTR; i++)
                    100:            scp->sc_name[i] = (char) rnd(255);
                    101:        scp->sc_flags = RN;
                    102:        scp->sc_level = RN;
                    103:        scp->sc_monster = RN;
                    104:        scp->sc_uid = RN;
                    105:     }
                    106:
                    107:     signal(SIGINT, SIG_DFL);
                    108:
                    109: #ifdef MASTER
                    110:     if (wizard)
                    111:        if (strcmp(prbuf, "names") == 0)
                    112:            prflags = 1;
                    113:        else if (strcmp(prbuf, "edit") == 0)
                    114:            prflags = 2;
                    115: #endif
                    116:     rd_score(top_ten);
                    117:     /*
                    118:      * Insert her in list if need be
                    119:      */
                    120:     sc2 = NULL;
                    121:     if (!noscore)
                    122:     {
                    123:        uid = md_getuid();
                    124:        for (scp = top_ten; scp < endp; scp++)
                    125:            if (amount > scp->sc_score)
                    126:                break;
                    127:            else if (!allscore &&       /* only one score per nowin uid */
                    128:                flags != 2 && scp->sc_uid == uid && scp->sc_flags != 2)
                    129:                    scp = endp;
                    130:        if (scp < endp)
                    131:        {
                    132:            if (flags != 2 && !allscore)
                    133:            {
                    134:                for (sc2 = scp; sc2 < endp; sc2++)
                    135:                {
                    136:                    if (sc2->sc_uid == uid && sc2->sc_flags != 2)
                    137:                        break;
                    138:                }
                    139:                if (sc2 >= endp)
                    140:                    sc2 = endp - 1;
                    141:            }
                    142:            else
                    143:                sc2 = endp - 1;
                    144:            while (sc2 > scp)
                    145:            {
                    146:                *sc2 = sc2[-1];
                    147:                sc2--;
                    148:            }
                    149:            scp->sc_score = amount;
                    150:            strncpy(scp->sc_name, whoami, MAXSTR);
                    151:            scp->sc_flags = flags;
                    152:            if (flags == 2)
                    153:                scp->sc_level = max_level;
                    154:            else
                    155:                scp->sc_level = level;
                    156:            scp->sc_monster = monst;
                    157:            scp->sc_uid = uid;
                    158:            sc2 = scp;
                    159:        }
                    160:     }
                    161:     /*
                    162:      * Print the list
                    163:      */
                    164:     if (flags != -1)
                    165:        putchar('\n');
                    166:     printf("Top %s %s:\n", Numname, allscore ? "Scores" : "Rogueists");
                    167:     printf("   Score Name\n");
                    168:     for (scp = top_ten; scp < endp; scp++)
                    169:     {
                    170:        if (scp->sc_score) {
                    171:            if (sc2 == scp)
                    172:             md_raw_standout();
                    173:            printf("%2d %5d %s: %s on level %d", (int) (scp - top_ten + 1),
                    174:                scp->sc_score, scp->sc_name, reason[scp->sc_flags],
                    175:                scp->sc_level);
                    176:            if (scp->sc_flags == 0 || scp->sc_flags == 3)
                    177:                printf(" by %s", killname(scp->sc_monster, TRUE));
                    178: #ifdef MASTER
                    179:            if (prflags == 1)
                    180:            {
                    181:            printf(" (%s)", md_getrealname(scp->sc_uid));
                    182:            }
                    183:            else if (prflags == 2)
                    184:            {
                    185:                fflush(stdout);
                    186:                (void) fgets(prbuf,10,stdin);
                    187:                if (prbuf[0] == 'd')
                    188:                {
                    189:                    for (sc2 = scp; sc2 < endp - 1; sc2++)
                    190:                        *sc2 = *(sc2 + 1);
                    191:                    sc2 = endp - 1;
                    192:                    sc2->sc_score = 0;
                    193:                    for (i = 0; i < MAXSTR; i++)
                    194:                        sc2->sc_name[i] = (char) rnd(255);
                    195:                    sc2->sc_flags = RN;
                    196:                    sc2->sc_level = RN;
                    197:                    sc2->sc_monster = RN;
                    198:                    scp--;
                    199:                }
                    200:            }
                    201:            else
                    202: #endif /* MASTER */
                    203:                 printf(".");
                    204:            if (sc2 == scp)
                    205:                    md_raw_standend();
                    206:             putchar('\n');
                    207:        }
                    208:        else
                    209:            break;
                    210:     }
                    211:     /*
                    212:      * Update the list file
                    213:      */
                    214:     if (sc2 != NULL)
                    215:     {
                    216:        if (lock_sc())
                    217:        {
                    218:            fp = signal(SIGINT, SIG_IGN);
                    219:            wr_score(top_ten);
                    220:            unlock_sc();
                    221:            signal(SIGINT, fp);
                    222:        }
                    223:     }
                    224: }
                    225:
                    226: void writelog(int amount, int flags, int monst)
                    227: {
                    228: #ifdef LOGFILE
                    229:     char logmessage[220], ltemp[80];
                    230:
                    231:     if (logfi == NULL)
                    232:         return;
                    233: #ifdef MASTER
                    234:     if (wizard)
                    235:     {
                    236:         fclose(logfi);
                    237:         return;
                    238:     }
                    239: #endif
                    240:     sprintf(logmessage, "%ld %d %.80s %d ", time(NULL), amount, whoami,
                    241:             pstats.s_lvl);
                    242:     if (flags == 0) /* dead */
                    243:     {
                    244:         sprintf(ltemp, "killed by %s on level %d\n", killname(monst, TRUE),
                    245:                 level);
                    246:         strcat(logmessage, ltemp);
                    247:     }
                    248:     else if (flags == 1) /* quit */
                    249:     {
                    250:         if (amulet)
                    251:             sprintf(ltemp, "quit on level %d [max %d] with the Amulet\n",
                    252:                 level, max_level);
                    253:         else
                    254:             sprintf(ltemp, "quit on level %d\n", level);
                    255:         strcat(logmessage, ltemp);
                    256:     }
                    257:     else if (flags == 2) /* won */
                    258:     {
                    259:         sprintf(ltemp, "escaped with the Amulet [deepest level: %d]\n",
                    260:                 max_level);
                    261:         strcat(logmessage, ltemp);
                    262:     }
                    263:     else if (flags == 3) /* killed with Amulet */
                    264:     {
                    265:         strcat(logmessage, "killed by ");
                    266:         strcat(logmessage, killname(monst, TRUE));
                    267:         sprintf(ltemp, " on level %d [max %d] with the Amulet\n",
                    268:                 level, max_level);
                    269:         strcat(logmessage, ltemp);
                    270:     }
                    271:     else
                    272:     {
                    273:         fclose(logfi);
                    274:         return;
                    275:     }
                    276:     fprintf(logfi, "%s", logmessage);
                    277:     fclose(logfi);
                    278: #endif
                    279:     return;
                    280: }
                    281:
                    282: /*
                    283:  * death:
                    284:  *     Do something really fun when he dies
                    285:  */
                    286:
                    287: void
                    288: death(int monst)
                    289: {
                    290:     char **dp;
                    291:     const char *killer;
                    292:     struct tm *lt;
                    293:     time_t date;
                    294:
                    295:     signal(SIGINT, SIG_IGN);
                    296:     purse -= purse / 10;
                    297:     signal(SIGINT, leave);
                    298:     clear();
                    299:     killer = killname(monst, FALSE);
                    300:     if (!tombstone)
                    301:     {
                    302:        mvprintw(LINES - 2, 0, "Killed by ");
                    303:        killer = killname(monst, FALSE);
                    304:        if (monst != 's' && monst != 'h')
                    305:            printw("a%s ", vowelstr(killer));
                    306:        printw("%s with %d gold", killer, purse);
                    307:     }
                    308:     else
                    309:     {
                    310:        time(&date);
                    311:        lt = localtime(&date);
                    312:        move(8, 0);
                    313:        dp = rip;
                    314:        while (*dp)
                    315:            addstr(*dp++);
                    316:        mvaddstr(17, center(killer), killer);
                    317:        if (monst == 's' || monst == 'h')
                    318:            mvaddch(16, 32, ' ');
                    319:        else
                    320:            mvaddstr(16, 33, vowelstr(killer));
                    321:        mvaddstr(14, center(whoami), whoami);
                    322:        sprintf(prbuf, "%d Au", purse);
                    323:        move(15, center(prbuf));
                    324:        addstr(prbuf);
                    325:        sprintf(prbuf, "%4d", 1900+lt->tm_year);
                    326:        mvaddstr(18, 26, prbuf);
                    327:     }
                    328:     move(LINES - 1, 0);
                    329:     refresh();
                    330:     writelog(purse, amulet ? 3 : 0, monst);
                    331:     score(purse, amulet ? 3 : 0, monst);
                    332:     /* Make sure the output gets through. */
                    333:     printf("[Press return to exit]\n");
                    334:     fflush(NULL);
                    335:     getchar();
                    336:     my_exit(0);
                    337: }
                    338:
                    339: /*
                    340:  * center:
                    341:  *     Return the index to center the given string
                    342:  */
                    343: int
                    344: center(const char *str)
                    345: {
                    346:     return 28 - (((int)strlen(str) + 1) / 2);
                    347: }
                    348:
                    349: /*
                    350:  * total_winner:
                    351:  *     Code for a winner
                    352:  */
                    353:
                    354: void
                    355: total_winner(void)
                    356: {
                    357:     THING *obj;
                    358:     struct obj_info *op;
                    359:     int worth = 0;
                    360:     int oldpurse;
                    361:
                    362:     clear();
                    363:     standout();
                    364:     addstr("                                                               \n");
                    365:     addstr("  @   @               @   @           @          @@@  @     @  \n");
                    366:     addstr("  @   @               @@ @@           @           @   @     @  \n");
                    367:     addstr("  @   @  @@@  @   @   @ @ @  @@@   @@@@  @@@      @  @@@    @  \n");
                    368:     addstr("   @@@@ @   @ @   @   @   @     @ @   @ @   @     @   @     @  \n");
                    369:     addstr("      @ @   @ @   @   @   @  @@@@ @   @ @@@@@     @   @     @  \n");
                    370:     addstr("  @   @ @   @ @  @@   @   @ @   @ @   @ @         @   @  @     \n");
                    371:     addstr("   @@@   @@@   @@ @   @   @  @@@@  @@@@  @@@     @@@   @@   @  \n");
                    372:     addstr("                                                               \n");
                    373:     addstr("     Congratulations, you have made it to the light of day!    \n");
                    374:     standend();
                    375:     addstr("\nYou have joined the elite ranks of those who have escaped the\n");
                    376:     addstr("Dungeons of Doom alive.  You journey home and sell all your loot at\n");
                    377:     addstr("a great profit and are admitted to the Fighters' Guild.\n");
                    378:     mvaddstr(LINES - 1, 0, "--Press space to continue--");
                    379:     refresh();
                    380:     wait_for(stdscr, ' ');
                    381:     clear();
                    382:     mvaddstr(0, 0, "   Worth  Item\n");
                    383:     oldpurse = purse;
                    384:     for (obj = pack; obj != NULL; obj = next(obj))
                    385:     {
                    386:        switch (obj->o_type)
                    387:        {
                    388:            case FOOD:
                    389:                worth = 2 * obj->o_count;
                    390:            when WEAPON:
                    391:                worth = weap_info[obj->o_which].oi_worth;
                    392:                worth *= 3 * (obj->o_hplus + obj->o_dplus) + obj->o_count;
                    393:                obj->o_flags |= ISKNOW;
                    394:            when ARMOR:
                    395:                worth = arm_info[obj->o_which].oi_worth;
                    396:                worth += (9 - obj->o_arm) * 100;
                    397:                worth += (10 * (a_class[obj->o_which] - obj->o_arm));
                    398:                obj->o_flags |= ISKNOW;
                    399:            when SCROLL:
                    400:                worth = scr_info[obj->o_which].oi_worth;
                    401:                worth *= obj->o_count;
                    402:                op = &scr_info[obj->o_which];
                    403:                if (!op->oi_know)
                    404:                    worth /= 2;
                    405:                op->oi_know = TRUE;
                    406:            when POTION:
                    407:                worth = pot_info[obj->o_which].oi_worth;
                    408:                worth *= obj->o_count;
                    409:                op = &pot_info[obj->o_which];
                    410:                if (!op->oi_know)
                    411:                    worth /= 2;
                    412:                op->oi_know = TRUE;
                    413:            when RING:
                    414:                op = &ring_info[obj->o_which];
                    415:                worth = op->oi_worth;
                    416:                if (obj->o_which == R_ADDSTR || obj->o_which == R_ADDDAM ||
                    417:                    obj->o_which == R_PROTECT || obj->o_which == R_ADDHIT)
                    418:                {
                    419:                        if (obj->o_arm > 0)
                    420:                            worth += obj->o_arm * 100;
                    421:                        else
                    422:                            worth = 10;
                    423:                }
                    424:                if (!(obj->o_flags & ISKNOW))
                    425:                    worth /= 2;
                    426:                obj->o_flags |= ISKNOW;
                    427:                op->oi_know = TRUE;
                    428:            when STICK:
                    429:                op = &ws_info[obj->o_which];
                    430:                worth = op->oi_worth;
                    431:                worth += 20 * obj->o_charges;
                    432:                if (!(obj->o_flags & ISKNOW))
                    433:                    worth /= 2;
                    434:                obj->o_flags |= ISKNOW;
                    435:                op->oi_know = TRUE;
                    436:            when AMULET:
                    437:                worth = 1000;
                    438:        }
                    439:        if (worth < 0)
                    440:            worth = 0;
                    441:        printw("%c) %5d  %s\n", obj->o_packch, worth, inv_name(obj, FALSE));
                    442:        purse += worth;
                    443:     }
                    444:     printw("   %5d  Gold Pieces          ", oldpurse);
                    445:     refresh();
                    446:     writelog(purse, 2, ' ');
                    447:     score(purse, 2, ' ');
                    448:     printf("[Press return to exit]\n");
                    449:     fflush(NULL);
                    450:     getchar();
                    451:     my_exit(0);
                    452: }
                    453:
                    454: /*
                    455:  * killname:
                    456:  *     Convert a code to a monster name
                    457:  */
                    458: const char *
                    459: killname(int monst, int doart)
                    460: {
                    461:     struct h_list *hp;
                    462:     const char *sp;
                    463:     int article;
                    464:     struct h_list nlist[] = {
                    465:        {'a',   "arrow",                TRUE},
                    466:        {'b',   "bolt",                 TRUE},
                    467:        {'d',   "dart",                 TRUE},
                    468:        {'h',   "hypothermia",          FALSE},
                    469:        {'s',   "starvation",           FALSE},
                    470:        {'\0'}
                    471:     };
                    472:
                    473:     if (isupper(monst))
                    474:     {
                    475:        sp = monsters[monst-'A'].m_name;
                    476:        article = TRUE;
                    477:     }
                    478:     else
                    479:     {
                    480:        sp = "Wally the Wonder Badger";
                    481:        article = FALSE;
                    482:        for (hp = nlist; hp->h_ch; hp++)
                    483:            if (hp->h_ch == monst)
                    484:            {
                    485:                sp = hp->h_desc;
                    486:                article = hp->h_print;
                    487:                break;
                    488:            }
                    489:     }
                    490:     if (doart && article)
                    491:        sprintf(prbuf, "a%s ", vowelstr(sp));
                    492:     else
                    493:        prbuf[0] = '\0';
                    494:     strcat(prbuf, sp);
                    495:     return prbuf;
                    496: }
                    497:
                    498: /*
                    499:  * death_monst:
                    500:  *     Return a monster appropriate for a random death.
                    501:  */
                    502: int
                    503: death_monst(void)
                    504: {
                    505:     int poss[] =
                    506:     {
                    507:        'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L',
                    508:        'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
                    509:        'Y', 'Z', 'a', 'b', 'h', 'd', 's',
                    510:        ' '     /* This is provided to generate the "Wally the Wonder Badger"
                    511:                   message for killer */
                    512:     };
                    513:
                    514:     return poss[rnd(sizeof poss / sizeof (int))];
                    515: }

CVSweb