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

Annotation of early-roguelike/rogue5/main.c, Revision 1.1.1.1

1.1       rubenllo    1: /*
                      2:  * Rogue: Exploring the Dungeons of Doom
                      3:  * Copyright (C) 1980-1983, 1985, 1999 Michael Toy, Ken Arnold and Glenn Wichman
                      4:  * All rights reserved.
                      5:  *
                      6:  * See the file LICENSE.TXT for full copyright and licensing information.
                      7:  *
                      8:  * @(#)main.c  4.22 (Berkeley) 02/05/99
                      9:  */
                     10:
                     11: #include <stdlib.h>
                     12: #include <string.h>
                     13: #include <signal.h>
                     14: #include <time.h>
                     15: #include <curses.h>
                     16: #include "rogue.h"
                     17:
                     18: /*
                     19:  * main:
                     20:  *     The main program, of course
                     21:  */
                     22: int
                     23: main(int argc, char **argv)
                     24: {
                     25:     char *env;
                     26:
                     27:     md_init();
                     28:
                     29: #ifdef MASTER
                     30:     /*
                     31:      * Check to see if he is a wizard
                     32:      */
                     33:     if (argc >= 2 && argv[1][0] == '\0')
                     34:        if (strcmp(PASSWD, md_crypt(md_getpass("wizard's password: "), "mT")) == 0)
                     35:        {
                     36:            wizard = TRUE;
                     37:            player.t_flags |= SEEMONST;
                     38:            argv++;
                     39:            argc--;
                     40:        }
                     41:
                     42: #endif
                     43:
                     44:     /* Check to see if savefiles should be stored in the system location */
                     45: #ifdef SAVEDIR
                     46:     if (argc >= 3 && !strcmp(argv[1], "-n"))
                     47:     {
                     48:         use_savedir = TRUE;
                     49:         strncpy(whoami, argv[2], MAXSTR);
                     50:         whoami[MAXSTR-1] = '\0';
                     51:         snprintf(file_name, MAXSTR, "%s/%d-%.80s.r5sav", SAVEDIR,
                     52:                  md_getuid(), whoami);
                     53:     }
                     54: #endif
                     55:
                     56:     open_score();
                     57:     open_log();
                     58:
                     59:     /*
                     60:      * get home and options from environment
                     61:      */
                     62:
                     63:     strcpy(home, md_gethomedir());
                     64:
                     65:        if (strlen(home) > MAXSTR - strlen("rogue5.save") - 1)
                     66:                *home = 0;
                     67:
                     68:     if (!use_savedir)
                     69:     {
                     70:         md_normaluser();
                     71:         strcpy(file_name, home);
                     72:         strcat(file_name, "rogue5.save");
                     73:     }
                     74:
                     75:     if ((env = getenv("ROGUEOPTS")) != NULL)
                     76:        parse_opts(env);
                     77:     if (!use_savedir && (env == NULL || whoami[0] == '\0'))
                     78:         strucpy(whoami, md_getusername(), strlen(md_getusername()));
                     79:     if (getenv("SEED") != NULL)
                     80:     {
                     81:        dnum = atoi(getenv("SEED"));
                     82:        noscore = 1;
                     83:     }
                     84:     else
                     85:        dnum = md_random_seed();
                     86:     seed = dnum;
                     87:
                     88:     /*
                     89:      * check for print-score option
                     90:      */
                     91:
                     92:     if (argc == 2)
                     93:     {
                     94:        if (strcmp(argv[1], "-s") == 0)
                     95:        {
                     96:            noscore = TRUE;
                     97:            score(0, -1, 0);
                     98:            exit(0);
                     99:        }
                    100:        else if (strcmp(argv[1], "-d") == 0)
                    101:        {
                    102:            dnum = rnd(100);    /* throw away some rnd()s to break patterns */
                    103:            while (--dnum)
                    104:                rnd(100);
                    105:            purse = rnd(100) + 1;
                    106:            level = rnd(100) + 1;
                    107:            initscr();
                    108:            getltchars();
                    109:            death(death_monst());
                    110:            exit(0);
                    111:        }
                    112:     }
                    113:
                    114:     init_check();                      /* check for legal startup */
                    115:     if (use_savedir)
                    116:     {
                    117:         /* If there is a saved game, restore() will not return.  If it
                    118:          * returns 1, there isn't a game, so start one.  If 0, there was
                    119:          * an error. */
                    120:         if (!restore(file_name))
                    121:             my_exit(1);
                    122:     }
                    123:     else if (argc == 2)
                    124:        if (!restore(argv[1]))  /* Note: restore will never return */
                    125:            my_exit(1);
                    126: #ifdef MASTER
                    127:     if (wizard)
                    128:        printf("Hello %s, welcome to dungeon #%d\n", whoami, dnum);
                    129:     else
                    130: #endif
                    131:        printf("Hello %s, just a moment while I dig the dungeon...\n", whoami);
                    132:     fflush(stdout);
                    133:
                    134:     initscr();                         /* Start up cursor package */
                    135:     init_probs();                      /* Set up prob tables for objects */
                    136:     init_player();                     /* Set up initial player stats */
                    137:     init_names();                      /* Set up names of scrolls */
                    138:     init_colors();                     /* Set up colors of potions */
                    139:     init_stones();                     /* Set up stone settings of rings */
                    140:     init_materials();                  /* Set up materials of wands */
                    141:     setup();
                    142:
                    143:     /*
                    144:      * The screen must be at least NUMLINES x NUMCOLS
                    145:      */
                    146:     if (LINES < NUMLINES || COLS < NUMCOLS)
                    147:     {
                    148:        printf("\nSorry, the screen must be at least %dx%d\n", NUMLINES, NUMCOLS);
                    149:        endwin();
                    150:        my_exit(1);
                    151:     }
                    152:
                    153:     /*
                    154:      * Set up windows
                    155:      */
                    156:     hw = newwin(LINES, COLS, 0, 0);
                    157:     idlok(stdscr, TRUE);
                    158:     idlok(hw, TRUE);
                    159: #ifdef MASTER
                    160:     noscore = wizard;
                    161: #endif
                    162:     new_level();                       /* Draw current level */
                    163:     /*
                    164:      * Start up daemons and fuses
                    165:      */
                    166:     start_daemon(runners, 0, AFTER);
                    167:     start_daemon(doctor, 0, AFTER);
                    168:     fuse(swander, 0, WANDERTIME, AFTER);
                    169:     start_daemon(stomach, 0, AFTER);
                    170:     playit();
                    171:     return(0);
                    172: }
                    173:
                    174: /*
                    175:  * endit:
                    176:  *     Exit the program abnormally.
                    177:  */
                    178:
                    179: void
                    180: endit(int sig)
                    181: {
                    182:     NOOP(sig);
                    183:     fatal("Okay, bye bye!\n");
                    184: }
                    185:
                    186: /*
                    187:  * fatal:
                    188:  *     Exit the program, printing a message.
                    189:  */
                    190:
                    191: void
                    192: fatal(const char *s)
                    193: {
                    194:     mvaddstr(LINES - 2, 0, s);
                    195:     refresh();
                    196:     endwin();
                    197:     my_exit(0);
                    198: }
                    199:
                    200: /*
                    201:  * rnd:
                    202:  *     Pick a very random number.
                    203:  */
                    204: int
                    205: rnd(int range)
                    206: {
                    207:     return range == 0 ? 0 : abs((int) RN) % range;
                    208: }
                    209:
                    210: /*
                    211:  * roll:
                    212:  *     Roll a number of dice
                    213:  */
                    214: int
                    215: roll(int number, int sides)
                    216: {
                    217:     int dtotal = 0;
                    218:
                    219:     while (number--)
                    220:        dtotal += rnd(sides)+1;
                    221:     return dtotal;
                    222: }
                    223:
                    224: /*
                    225:  * tstp:
                    226:  *     Handle stop and start signals
                    227:  */
                    228:
                    229: void
                    230: tstp(int ignored)
                    231: {
                    232:     int y, x;
                    233:     int oy, ox;
                    234:
                    235:        NOOP(ignored);
                    236:
                    237:     /*
                    238:      * leave nicely
                    239:      */
                    240:     getyx(curscr, oy, ox);
                    241:     mvcur(0, COLS - 1, LINES - 1, 0);
                    242:     endwin();
                    243:     resetltchars();
                    244:     fflush(stdout);
                    245:        md_tstpsignal();
                    246:
                    247:     /*
                    248:      * start back up again
                    249:      */
                    250:        md_tstpresume();
                    251:     raw();
                    252:     noecho();
                    253:     nonl();
                    254:     keypad(stdscr,1);
                    255:     playltchars();
                    256:     clearok(curscr, TRUE);
                    257:     wrefresh(curscr);
                    258:     getyx(curscr, y, x);
                    259:     mvcur(y, x, oy, ox);
                    260:     fflush(stdout);
                    261:     curscr->_cury = oy;
                    262:     curscr->_curx = ox;
                    263: }
                    264:
                    265: /*
                    266:  * playit:
                    267:  *     The main loop of the program.  Loop until the game is over,
                    268:  *     refreshing things and looking at the proper times.
                    269:  */
                    270:
                    271: void
                    272: playit(void)
                    273: {
                    274:     char *opts;
                    275:
                    276:     /*
                    277:      * set up defaults for slow terminals
                    278:      */
                    279:
                    280:     if (baudrate() <= 1200)
                    281:     {
                    282:        terse = TRUE;
                    283:        jump = TRUE;
                    284:        see_floor = FALSE;
                    285:     }
                    286:
                    287:     if (md_hasclreol())
                    288:        inv_type = INV_CLEAR;
                    289:
                    290:     /*
                    291:      * parse environment declaration of options
                    292:      */
                    293:     if ((opts = getenv("ROGUEOPTS")) != NULL)
                    294:        parse_opts(opts);
                    295:
                    296:
                    297:     oldpos = hero;
                    298:     oldrp = roomin(&hero);
                    299:     while (playing)
                    300:        command();                      /* Command execution */
                    301:     endit(0);
                    302: }
                    303:
                    304: /*
                    305:  * quit:
                    306:  *     Have player make certain, then exit.
                    307:  */
                    308:
                    309: void
                    310: quit(int sig)
                    311: {
                    312:     int oy, ox;
                    313:
                    314:     NOOP(sig);
                    315:
                    316:     /*
                    317:      * Reset the signal in case we got here via an interrupt
                    318:      */
                    319:     if (!q_comm)
                    320:        mpos = 0;
                    321:     getyx(curscr, oy, ox);
                    322:     msg("really quit?");
                    323:     if (readchar() == 'y')
                    324:     {
                    325:        signal(SIGINT, leave);
                    326:        clear();
                    327:        mvprintw(LINES - 2, 0, "You quit with %d gold pieces", purse);
                    328:        move(LINES - 1, 0);
                    329:        refresh();
                    330:         writelog(purse, 1, 0);
                    331:        score(purse, 1, 0);
                    332:        printf("[Press return to exit]\n");
                    333:        fflush(NULL);
                    334:        getchar();
                    335:        my_exit(0);
                    336:     }
                    337:     else
                    338:     {
                    339:        move(0, 0);
                    340:        clrtoeol();
                    341:        status();
                    342:        move(oy, ox);
                    343:        refresh();
                    344:        mpos = 0;
                    345:        count = 0;
                    346:        to_death = FALSE;
                    347:     }
                    348: }
                    349:
                    350: /*
                    351:  * leave:
                    352:  *     Leave quickly, but curteously
                    353:  */
                    354:
                    355: void
                    356: leave(int sig)
                    357: {
                    358:     static char buf[BUFSIZ];
                    359:
                    360:     NOOP(sig);
                    361:
                    362:     setbuf(stdout, buf);       /* throw away pending output */
                    363:
                    364:     if (!isendwin())
                    365:     {
                    366:        mvcur(0, COLS - 1, LINES - 1, 0);
                    367:        endwin();
                    368:     }
                    369:
                    370:     putchar('\n');
                    371:     my_exit(0);
                    372: }
                    373:
                    374: /*
                    375:  * shell:
                    376:  *     Let them escape for a while
                    377:  */
                    378:
                    379: void
                    380: shell(void)
                    381: {
                    382:     /*
                    383:      * Set the terminal back to original mode
                    384:      */
                    385:     move(LINES-1, 0);
                    386:     refresh();
                    387:     endwin();
                    388:     resetltchars();
                    389:     putchar('\n');
                    390:     in_shell = TRUE;
                    391:     after = FALSE;
                    392:     fflush(stdout);
                    393:     /*
                    394:      * Fork and do a shell
                    395:      */
                    396:     md_shellescape();
                    397:
                    398:     noecho();
                    399:     raw();
                    400:     nonl();
                    401:     keypad(stdscr,1);
                    402:     playltchars();
                    403:     in_shell = FALSE;
                    404:     clearok(stdscr, TRUE);
                    405: }
                    406:
                    407: /*
                    408:  * my_exit:
                    409:  *     Leave the process properly
                    410:  */
                    411:
                    412: void
                    413: my_exit(int st)
                    414: {
                    415:     resetltchars();
                    416:     exit(st);
                    417: }
                    418:

CVSweb