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

Annotation of early-roguelike/rogue4/main.c, Revision 1.1

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

CVSweb