]> git.cameronkatri.com Git - bsdgames-darwin.git/blobdiff - robots/main.c
avoid duplicating symbols in libterminfo.
[bsdgames-darwin.git] / robots / main.c
index d30928b720d5edbaade6deae5f35332ebe398d05..3030b4126ccaa8f141eca9bd7b7ee667abf8f8ab 100644 (file)
@@ -1,6 +1,8 @@
+/*     $NetBSD: main.c,v 1.33 2020/07/26 15:38:22 nia Exp $    */
+
 /*
- * Copyright (c) 1980 Regents of the University of California.
- * All rights reserved.
+ * Copyright (c) 1980, 1993
+ *     The Regents of the University of California.  All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * 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. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *     This product includes software developed by the University of
- *     California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
+ * 3. Neither the name of the University nor the names of its contributors
  *    may be used to endorse or promote products derived from this software
  *    without specific prior written permission.
  *
  * SUCH DAMAGE.
  */
 
+#include <sys/cdefs.h>
 #ifndef lint
-char copyright[] =
-"@(#) Copyright (c) 1980 Regents of the University of California.\n\
- All rights reserved.\n";
+__COPYRIGHT("@(#) Copyright (c) 1980, 1993\
+ The Regents of the University of California.  All rights reserved.");
 #endif /* not lint */
 
 #ifndef lint
-static char sccsid[] = "@(#)main.c     5.5 (Berkeley) 2/28/91";
+#if 0
+static char sccsid[] = "@(#)main.c     8.1 (Berkeley) 5/31/93";
+#else
+__RCSID("$NetBSD: main.c,v 1.33 2020/07/26 15:38:22 nia Exp $");
+#endif
 #endif /* not lint */
 
-# include      "robots.h"
-# include      <signal.h>
-# include      <ctype.h>
+#include <ctype.h>
+#include <curses.h>
+#include <err.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <stdlib.h>
+#include <time.h>
+#include <unistd.h>
+#include "robots.h"
+
+extern const char *Scorefile;
+extern int Max_per_uid;
 
-main(ac, av)
-int    ac;
-char   **av;
+static bool another(void);
+
+int
+main(int argc, char **argv)
 {
-       register char   *sp;
-       register bool   bad_arg;
-       register bool   show_only;
-       extern char     *Scorefile;
-       extern int      Max_per_uid;
-       void quit();
-
-       show_only = FALSE;
-       if (ac > 1) {
-               bad_arg = FALSE;
-               for (++av; ac > 1 && *av[0]; av++, ac--)
-                       if (av[0][0] != '-')
-                               if (isdigit(av[0][0]))
-                                       Max_per_uid = atoi(av[0]);
-                               else {
-                                       setuid(getuid());
-                                       setgid(getgid());
-                                       Scorefile = av[0];
-# ifdef        FANCY
-                                       sp = rindex(Scorefile, '/');
-                                       if (sp == NULL)
-                                               sp = Scorefile;
-                                       if (strcmp(sp, "pattern_roll") == 0)
-                                               Pattern_roll = TRUE;
-                                       else if (strcmp(sp, "stand_still") == 0)
-                                               Stand_still = TRUE;
-                                       if (Pattern_roll || Stand_still)
-                                               Teleport = TRUE;
-# endif
-                               }
-                       else
-                               for (sp = &av[0][1]; *sp; sp++)
-                                       switch (*sp) {
-                                         case 's':
-                                               show_only = TRUE;
-                                               break;
-                                         case 'r':
-                                               Real_time = TRUE;
-                                               break;
-                                         case 'a':
-                                               Start_level = 4;
-                                               break;
-                                         case 'j':
-                                               Jump = TRUE;
-                                               break;
-                                         case 't':
-                                               Teleport = TRUE;
-                                               break;
-                                         default:
-                                               fprintf(stderr, "robots: uknown option: %c\n", *sp);
-                                               bad_arg = TRUE;
-                                               break;
-                                       }
-               if (bad_arg) {
-                       exit(1);
-                       /* NOTREACHED */
+       const char *word;
+       bool show_only;
+       int score_wfd; /* high score writable file descriptor */
+       int score_err = 0; /* hold errno from score file open */
+       int maximum = 0;
+       int ch, i;
+
+       score_wfd = open(Scorefile, O_RDWR);
+       if (score_wfd < 0)
+               score_err = errno;
+       else if (score_wfd < 3)
+               exit(1);
+
+       /* Revoke setgid privileges */
+       setgid(getgid());
+
+       show_only = false;
+       Num_games = 1;
+
+       while ((ch = getopt(argc, argv, "Aajnrst")) != -1) {
+               switch (ch) {
+                   case 'A':
+                       Auto_bot = true;
+                       break;
+                   case 'a':
+                       Start_level = 4;
+                       break;
+                   case 'j':
+                       Jump = true;
+                       break;
+                   case 'n':
+                       Num_games++;
+                       break;
+                   case 'r':
+                       Real_time = true;
+                       break;
+                   case 's':
+                       show_only = true;
+                       break;
+                   case 't':
+                       Teleport = true;
+                       break;
+                   default:
+                       errx(1,
+                           "Usage: robots [-Aajnrst] [maximum] [scorefile]");
+                       break;
+               }
+       }
+
+       for (i = optind; i < argc; i++) {
+               word = argv[i];
+               if (isdigit((unsigned char)word[0])) {
+                       maximum = atoi(word);
+               } else {
+                       Scorefile = word;
+                       Max_per_uid = maximum;
+                       if (score_wfd >= 0)
+                               close(score_wfd);
+                       score_wfd = open(Scorefile, O_RDWR);
+                       if (score_wfd < 0)
+                               score_err = errno;
+#ifdef FANCY
+                       word = strrchr(Scorefile, '/');
+                       if (word == NULL)
+                               word = Scorefile;
+                       if (strcmp(word, "pattern_roll") == 0)
+                               Pattern_roll = true;
+                       else if (strcmp(word, "stand_still") == 0)
+                               Stand_still = true;
+                       if (Pattern_roll || Stand_still)
+                               Teleport = true;
+#endif
                }
        }
 
@@ -114,9 +143,17 @@ char       **av;
                /* NOTREACHED */
        }
 
-       initscr();
+       if (score_wfd < 0) {
+               errno = score_err;
+               warn("%s", Scorefile);
+               warnx("High scores will not be recorded!");
+               sleep(2);
+       }
+
+       if (!initscr())
+               errx(0, "couldn't initialize screen");
        signal(SIGINT, quit);
-       crmode();
+       cbreak();
        noecho();
        nonl();
        if (LINES != Y_SIZE || COLS != X_SIZE) {
@@ -130,21 +167,32 @@ char      **av;
                stdscr = newwin(Y_SIZE, X_SIZE, 0, 0);
        }
 
-       srand(getpid());
        if (Real_time)
                signal(SIGALRM, move_robots);
        do {
-               init_field();
-               for (Level = Start_level; !Dead; Level++) {
-                       make_level();
-                       play_level();
+               while (Num_games--) {
+                       init_field();
+                       for (Level = Start_level; !Dead; Level++) {
+                               make_level();
+                               play_level();
+                               if (Auto_bot)
+                                       sleep(1);
+                       }
+                       move(My_pos.y, My_pos.x);
+                       printw("AARRrrgghhhh....");
+                       refresh();
+                       if (Auto_bot)
+                               sleep(1);
+                       score(score_wfd);
+                       if (Auto_bot)
+                               sleep(1);
+                       refresh();
                }
-               move(My_pos.y, My_pos.x);
-               printw("AARRrrgghhhh....");
-               refresh();
-               score();
-       } while (another());
-       quit();
+               Num_games = 1;
+       } while (!Auto_bot && another());
+       quit(0);
+       /* NOTREACHED */
+       return(0);
 }
 
 /*
@@ -152,19 +200,9 @@ char       **av;
  *     Leave the program elegantly.
  */
 void
-quit()
+quit(int dummy __unused)
 {
-       extern int      _putchar();
-
-       mvcur(0, COLS - 1, LINES - 1, 0);
-       if (CE) {
-               tputs(CE, 1, _putchar);
-               endwin();
-       }
-       else {
-               endwin();
-               putchar('\n');
-       }
+       endwin();
        exit(0);
        /* NOTREACHED */
 }
@@ -173,13 +211,14 @@ quit()
  * another:
  *     See if another game is desired
  */
-another()
+static bool
+another(void)
 {
-       register int    y;
+       int y;
 
-#ifdef FANCY
+#ifdef FANCY
        if ((Stand_still || Pattern_roll) && !Newscore)
-               return TRUE;
+               return true;
 #endif
 
        if (query("Another game?")) {
@@ -190,7 +229,7 @@ another()
                        }
                        refresh();
                }
-               return TRUE;
+               return true;
        }
-       return FALSE;
+       return false;
 }