[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

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