[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     ! 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