X-Git-Url: https://git.cameronkatri.com/bsdgames-darwin.git/blobdiff_plain/77e3814f0c0e3dea4d0032e25666f77e6f83bfff..68d82673282bfd2baa3f9533c92be6121d346cd9:/hack/hack.main.c diff --git a/hack/hack.main.c b/hack/hack.main.c index d2d59a2f..7e399193 100644 --- a/hack/hack.main.c +++ b/hack/hack.main.c @@ -1,9 +1,77 @@ -/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ -/* hack.main.c - version 1.0.3 */ +/* $NetBSD: hack.main.c,v 1.8 2003/04/02 18:36:37 jsm Exp $ */ + +/* + * Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica, + * Amsterdam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * - Neither the name of the Stichting Centrum voor Wiskunde en + * Informatica, nor the names of its contributors may be used to endorse or + * promote products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * Copyright (c) 1982 Jay Fenlason + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#ifndef lint +__RCSID("$NetBSD: hack.main.c,v 1.8 2003/04/02 18:36:37 jsm Exp $"); +#endif /* not lint */ -#include #include +#include +#include +#include #include "hack.h" +#include "extern.h" #ifdef QUEST #define gamename "quest" @@ -11,43 +79,38 @@ #define gamename "hack" #endif -extern char *getlogin(), *getenv(); -extern char plname[PL_NSIZ], pl_character[PL_CSIZ]; -extern struct permonst mons[CMNUM+2]; -extern char genocided[], fut_geno[]; - -int (*afternmv)(); -int (*occupation)(); -char *occtxt; /* defined when occupation != NULL */ - -void done1(); -void hangup(); +int (*afternmv) __P((void)); +int (*occupation) __P((void)); +const char *occtxt; /* defined when occupation != NULL */ -int hackpid; /* current pid */ -int locknum; /* max num of players */ +int hackpid; /* current pid */ +int locknum; /* max num of players */ #ifdef DEF_PAGER -char *catmore; /* default pager */ +const char *catmore; /* default pager */ #endif -char SAVEF[PL_NSIZ + 11] = "save/"; /* save/99999player */ -char *hname; /* name of the game (argv[0] of call) */ -char obuf[BUFSIZ]; /* BUFSIZ is defined in stdio.h */ +char SAVEF[PL_NSIZ + 11] = "save/"; /* save/99999player */ +char *hname; /* name of the game (argv[0] of call) */ +char obuf[BUFSIZ]; /* BUFSIZ is defined in stdio.h */ -extern char *nomovemsg; -extern long wailmsg; - -#ifdef CHDIR -static void chdirx(); -#endif +int main __P((int, char *[])); +static void chdirx __P((const char *, boolean)); -main(argc,argv) -int argc; -char *argv[]; +int +main(argc, argv) + int argc; + char *argv[]; { - register int fd; + int fd; #ifdef CHDIR - register char *dir; + char *dir; #endif + /* Check for dirty tricks with closed fds 0, 1, 2 */ + fd = open("/dev/null", O_RDONLY); + if (fd < 3) + exit(1); + close(fd); + hname = argv[0]; hackpid = getpid(); @@ -61,18 +124,19 @@ char *argv[]; */ dir = getenv("HACKDIR"); - if(argc > 1 && !strncmp(argv[1], "-d", 2)) { + if (argc > 1 && !strncmp(argv[1], "-d", 2)) { argc--; argv++; - dir = argv[0]+2; - if(*dir == '=' || *dir == ':') dir++; - if(!*dir && argc > 1) { + dir = argv[0] + 2; + if (*dir == '=' || *dir == ':') + dir++; + if (!*dir && argc > 1) { argc--; argv++; dir = argv[0]; } - if(!*dir) - error("Flag -d must be followed by a directory name."); + if (!*dir) + error("Flag -d must be followed by a directory name."); } #endif @@ -87,40 +151,40 @@ char *argv[]; * Note that we trust him here; it is possible to play under * somebody else's name. */ - { register char *s; - - initoptions(); - if(!*plname && (s = getenv("USER"))) - (void) strncpy(plname, s, sizeof(plname)-1); - if(!*plname && (s = getenv("LOGNAME"))) - (void) strncpy(plname, s, sizeof(plname)-1); - if(!*plname && (s = getlogin())) - (void) strncpy(plname, s, sizeof(plname)-1); + { + char *s; + + initoptions(); + if (!*plname && (s = getenv("USER"))) + (void) strncpy(plname, s, sizeof(plname) - 1); + if (!*plname && (s = getenv("LOGNAME"))) + (void) strncpy(plname, s, sizeof(plname) - 1); + if (!*plname && (s = getlogin())) + (void) strncpy(plname, s, sizeof(plname) - 1); } /* * Now we know the directory containing 'record' and * may do a prscore(). */ - if(argc > 1 && !strncmp(argv[1], "-s", 2)) { + if (argc > 1 && !strncmp(argv[1], "-s", 2)) { #ifdef CHDIR - chdirx(dir,0); + chdirx(dir, 0); #endif prscore(argc, argv); exit(0); } - /* * It seems he really wants to play. * Remember tty modes, to be restored on exit. */ gettty(); - setbuf(stdout,obuf); + setbuf(stdout, obuf); setrandom(); startup(); cls(); - u.uhp = 1; /* prevent RIP on early quits */ - u.ux = FAR; /* prevent nscr() */ + u.uhp = 1; /* prevent RIP on early quits */ + u.ux = FAR; /* prevent nscr() */ (void) signal(SIGHUP, hangup); /* @@ -133,22 +197,23 @@ char *argv[]; * We cannot do chdir earlier, otherwise gethdate will fail. */ #ifdef CHDIR - chdirx(dir,1); + chdirx(dir, 1); #endif /* * Process options. */ - while(argc > 1 && argv[1][0] == '-'){ + while (argc > 1 && argv[1][0] == '-') { argv++; argc--; - switch(argv[0][1]){ + switch (argv[0][1]) { #ifdef WIZARD case 'D': -/* if(!strcmp(getlogin(), WIZARD)) */ - wizard = TRUE; -/* else - printf("Sorry.\n"); */ + /* if(!strcmp(getlogin(), WIZARD)) */ + wizard = TRUE; + /* + * else printf("Sorry.\n"); + */ break; #endif #ifdef NEWS @@ -157,76 +222,81 @@ char *argv[]; break; #endif case 'u': - if(argv[0][2]) - (void) strncpy(plname, argv[0]+2, sizeof(plname)-1); - else if(argc > 1) { - argc--; - argv++; - (void) strncpy(plname, argv[0], sizeof(plname)-1); + if (argv[0][2]) + (void) strncpy(plname, argv[0] + 2, sizeof(plname) - 1); + else if (argc > 1) { + argc--; + argv++; + (void) strncpy(plname, argv[0], sizeof(plname) - 1); } else printf("Player name expected after -u\n"); break; default: /* allow -T for Tourist, etc. */ - (void) strncpy(pl_character, argv[0]+1, - sizeof(pl_character)-1); + (void) strncpy(pl_character, argv[0] + 1, + sizeof(pl_character) - 1); /* printf("Unknown option: %s\n", *argv); */ } } - if(argc > 1) + if (argc > 1) locknum = atoi(argv[1]); #ifdef MAX_NR_OF_PLAYERS - if(!locknum || locknum > MAX_NR_OF_PLAYERS) + if (!locknum || locknum > MAX_NR_OF_PLAYERS) locknum = MAX_NR_OF_PLAYERS; #endif #ifdef DEF_PAGER - if(!(catmore = getenv("HACKPAGER")) && !(catmore = getenv("PAGER"))) + if (((catmore = getenv("HACKPAGER")) == NULL && + (catmore = getenv("PAGER")) == NULL) || + catmore[0] == '\0') catmore = DEF_PAGER; #endif #ifdef MAIL getmailstatus(); #endif #ifdef WIZARD - if(wizard) (void) strcpy(plname, "wizard"); else + if (wizard) + (void) strcpy(plname, "wizard"); + else #endif - if(!*plname || !strncmp(plname, "player", 4) + if (!*plname || !strncmp(plname, "player", 4) || !strncmp(plname, "games", 4)) askname(); plnamesuffix(); /* strip suffix from name; calls askname() */ - /* again if suffix was whole name */ - /* accepts any suffix */ + /* again if suffix was whole name */ + /* accepts any suffix */ #ifdef WIZARD - if(!wizard) { + if (!wizard) { #endif /* * check for multiple games under the same name * (if !locknum) or check max nr of players (otherwise) */ - (void) signal(SIGQUIT,SIG_IGN); - (void) signal(SIGINT,SIG_IGN); - if(!locknum) - (void) strcpy(lock,plname); + (void) signal(SIGQUIT, SIG_IGN); + (void) signal(SIGINT, SIG_IGN); + if (!locknum) + (void) strcpy(lock, plname); getlock(); /* sets lock if locknum != 0 */ #ifdef WIZARD } else { - register char *sfoo; - (void) strcpy(lock,plname); - if(sfoo = getenv("MAGIC")) - while(*sfoo) { - switch(*sfoo++) { - case 'n': (void) srandom(*sfoo++); + char *sfoo; + (void) strcpy(lock, plname); + if ((sfoo = getenv("MAGIC")) != NULL) + while (*sfoo) { + switch (*sfoo++) { + case 'n': + (void) srandom(*sfoo++); break; } } - if(sfoo = getenv("GENOCIDED")){ - if(*sfoo == '!'){ - register struct permonst *pm = mons; - register char *gp = genocided; + if ((sfoo = getenv("GENOCIDED")) != NULL) { + if (*sfoo == '!') { + const struct permonst *pm = mons; + char *gp = genocided; - while(pm < mons+CMNUM+2){ - if(!index(sfoo, pm->mlet)) + while (pm < mons + CMNUM + 2) { + if (!strchr(sfoo, pm->mlet)) *gp++ = pm->mlet; pm++; } @@ -239,13 +309,13 @@ char *argv[]; #endif setftty(); (void) sprintf(SAVEF, "save/%d%s", getuid(), plname); - regularize(SAVEF+5); /* avoid . or / in name */ - if((fd = open(SAVEF,0)) >= 0 && - (uptodate(fd) || unlink(SAVEF) == 666)) { - (void) signal(SIGINT,done1); + regularize(SAVEF + 5); /* avoid . or / in name */ + if ((fd = open(SAVEF, O_RDONLY)) >= 0 && + (uptodate(fd) || unlink(SAVEF) == 666)) { + (void) signal(SIGINT, done1); pline("Restoring old save file..."); (void) fflush(stdout); - if(!dorecover(fd)) + if (!dorecover(fd)) goto not_recovered; pline("Hello %s, welcome to %s!", plname, gamename); flags.move = 0; @@ -259,7 +329,7 @@ not_recovered: init_objects(); u_init(); - (void) signal(SIGINT,done1); + (void) signal(SIGINT, done1); mklev(); u.ux = xupstair; u.uy = yupstair; @@ -267,12 +337,14 @@ not_recovered: setsee(); flags.botlx = 1; makedog(); - { register struct monst *mtmp; - if(mtmp = m_at(u.ux, u.uy)) mnexto(mtmp); /* riv05!a3 */ + { + struct monst *mtmp; + if ((mtmp = m_at(u.ux, u.uy)) != NULL) + mnexto(mtmp); /* riv05!a3 */ } seemons(); #ifdef NEWS - if(flags.nonews || !readnews()) + if (flags.nonews || !readnews()) /* after reading news we did docrt() already */ #endif docrt(); @@ -281,134 +353,139 @@ not_recovered: pline("Hello %s, welcome to %s!", plname, gamename); pickup(1); - read_engr_at(u.ux,u.uy); + read_engr_at(u.ux, u.uy); flags.move = 1; } flags.moonphase = phase_of_the_moon(); - if(flags.moonphase == FULL_MOON) { + if (flags.moonphase == FULL_MOON) { pline("You are lucky! Full moon tonight."); u.uluck++; - } else if(flags.moonphase == NEW_MOON) { + } else if (flags.moonphase == NEW_MOON) { pline("Be careful! New moon tonight."); } - initrack(); - for(;;) { - if(flags.move) { /* actual time passed */ + for (;;) { + if (flags.move) { /* actual time passed */ settrack(); - if(moves%2 == 0 || - (!(Fast & ~INTRINSIC) && (!Fast || rn2(3)))) { - extern struct monst *makemon(); + if (moves % 2 == 0 || + (!(Fast & ~INTRINSIC) && (!Fast || rn2(3)))) { movemon(); - if(!rn2(70)) - (void) makemon((struct permonst *)0, 0, 0); + if (!rn2(70)) + (void) makemon((struct permonst *) 0, 0, 0); } - if(Glib) glibr(); + if (Glib) + glibr(); timeout(); ++moves; - if(flags.time) flags.botl = 1; - if(u.uhp < 1) { + if (flags.time) + flags.botl = 1; + if (u.uhp < 1) { pline("You die..."); done("died"); } - if(u.uhp*10 < u.uhpmax && moves-wailmsg > 50){ - wailmsg = moves; - if(u.uhp == 1) - pline("You hear the wailing of the Banshee..."); - else - pline("You hear the howling of the CwnAnnwn..."); + if (u.uhp * 10 < u.uhpmax && moves - wailmsg > 50) { + wailmsg = moves; + if (u.uhp == 1) + pline("You hear the wailing of the Banshee..."); + else + pline("You hear the howling of the CwnAnnwn..."); } - if(u.uhp < u.uhpmax) { - if(u.ulevel > 9) { - if(Regeneration || !(moves%3)) { - flags.botl = 1; - u.uhp += rnd((int) u.ulevel-9); - if(u.uhp > u.uhpmax) - u.uhp = u.uhpmax; + if (u.uhp < u.uhpmax) { + if (u.ulevel > 9) { + if (Regeneration || !(moves % 3)) { + flags.botl = 1; + u.uhp += rnd((int) u.ulevel - 9); + if (u.uhp > u.uhpmax) + u.uhp = u.uhpmax; } - } else if(Regeneration || - (!(moves%(22-u.ulevel*2)))) { + } else if (Regeneration || + (!(moves % (22 - u.ulevel * 2)))) { flags.botl = 1; u.uhp++; } } - if(Teleportation && !rn2(85)) tele(); - if(Searching && multi >= 0) (void) dosearch(); + if (Teleportation && !rn2(85)) + tele(); + if (Searching && multi >= 0) + (void) dosearch(); gethungry(); invault(); amulet(); } - if(multi < 0) { - if(!++multi){ + if (multi < 0) { + if (!++multi) { pline(nomovemsg ? nomovemsg : - "You can move again."); + "You can move again."); nomovemsg = 0; - if(afternmv) (*afternmv)(); + if (afternmv) + (*afternmv) (); afternmv = 0; } } - find_ac(); #ifndef QUEST - if(!flags.mv || Blind) + if (!flags.mv || Blind) #endif { seeobjs(); seemons(); nscr(); } - if(flags.botl || flags.botlx) bot(); + if (flags.botl || flags.botlx) + bot(); flags.move = 1; - if(multi >= 0 && occupation) { - if(monster_nearby()) + if (multi >= 0 && occupation) { + if (monster_nearby()) stop_occupation(); - else if ((*occupation)() == 0) + else if ((*occupation) () == 0) occupation = 0; continue; } - - if(multi > 0) { + if (multi > 0) { #ifdef QUEST - if(flags.run >= 4) finddir(); + if (flags.run >= 4) + finddir(); #endif lookaround(); - if(!multi) { /* lookaround may clear multi */ + if (!multi) { /* lookaround may clear multi */ flags.move = 0; continue; } - if(flags.mv) { - if(multi < COLNO && !--multi) + if (flags.mv) { + if (multi < COLNO && !--multi) flags.mv = flags.run = 0; domove(); } else { --multi; rhack(save_cm); } - } else if(multi == 0) { + } else if (multi == 0) { #ifdef MAIL ckmailstatus(); #endif rhack((char *) 0); } - if(multi && multi%7 == 0) + if (multi && multi % 7 == 0) (void) fflush(stdout); } } +void glo(foo) -register foo; + int foo; { /* construct the string xlock.n */ - register char *tf; + char *tf; tf = lock; - while(*tf && *tf != '.') tf++; + while (*tf && *tf != '.') + tf++; (void) sprintf(tf, ".%d", foo); } @@ -417,82 +494,93 @@ register foo; * explicitly (-w implies wizard) or by askname. * It may still contain a suffix denoting pl_character. */ -askname(){ -register int c,ct; +void +askname() +{ + int c, ct; printf("\nWho are you? "); (void) fflush(stdout); ct = 0; - while((c = getchar()) != '\n'){ - if(c == EOF) error("End of input\n"); + while ((c = getchar()) != '\n') { + if (c == EOF) + error("End of input\n"); /* some people get confused when their erase char is not ^H */ - if(c == '\010') { - if(ct) ct--; + if (c == '\010') { + if (ct) + ct--; continue; } - if(c != '-') - if(c < 'A' || (c > 'Z' && c < 'a') || c > 'z') c = '_'; - if(ct < sizeof(plname)-1) plname[ct++] = c; + if (c != '-') + if (c < 'A' || (c > 'Z' && c < 'a') || c > 'z') + c = '_'; + if (ct < sizeof(plname) - 1) + plname[ct++] = c; } plname[ct] = 0; - if(ct == 0) askname(); + if (ct == 0) + askname(); } -/*VARARGS1*/ -impossible(s,x1,x2) -register char *s; +/* VARARGS1 */ +void +impossible(const char *s, ...) { - pline(s,x1,x2); + va_list ap; + + va_start(ap, s); + vpline(s, ap); + va_end(ap); pline("Program in disorder - perhaps you'd better Quit."); } #ifdef CHDIR static void chdirx(dir, wr) -char *dir; -boolean wr; + const char *dir; + boolean wr; { #ifdef SECURE - if(dir /* User specified directory? */ + if (dir /* User specified directory? */ #ifdef HACKDIR - && strcmp(dir, HACKDIR) /* and not the default? */ + && strcmp(dir, HACKDIR) /* and not the default? */ #endif ) { - (void) setuid(getuid()); /* Ron Wessels */ + (void) setuid(getuid()); /* Ron Wessels */ (void) setgid(getgid()); } #endif #ifdef HACKDIR - if(dir == NULL) + if (dir == NULL) dir = HACKDIR; #endif - if(dir && chdir(dir) < 0) { + if (dir && chdir(dir) < 0) { perror(dir); error("Cannot chdir to %s.", dir); } - /* warn the player if he cannot write the record file */ /* perhaps we should also test whether . is writable */ /* unfortunately the access systemcall is worthless */ - if(wr) { - register fd; - - if(dir == NULL) - dir = "."; - if((fd = open(RECORD, 2)) < 0) { - printf("Warning: cannot write %s/%s", dir, RECORD); - getret(); - } else - (void) close(fd); + if (wr) { + int fd; + + if (dir == NULL) + dir = "."; + if ((fd = open(RECORD, O_RDWR)) < 0) { + printf("Warning: cannot write %s/%s", dir, RECORD); + getret(); + } else + (void) close(fd); } } #endif +void stop_occupation() { - if(occupation) { + if (occupation) { pline("You stop %s.", occtxt); occupation = 0; }