date and time created 85/05/30 18:34:12 by mckusick
[unix-history] / usr / src / games / robots / main.c
CommitLineData
dfd0969b
KM
1/*
2 * Copyright (c) 1980 Regents of the University of California.
3 * All rights reserved. The Berkeley software License Agreement
4 * specifies the terms and conditions for redistribution.
5 */
6
7#ifndef lint
8char copyright[] =
9"@(#) Copyright (c) 1980 Regents of the University of California.\n\
10 All rights reserved.\n";
11#endif not lint
12
13#ifndef lint
14static char sccsid[] = "@(#)main.c 5.1 (Berkeley) %G%";
15#endif not lint
16
17# include "robots.h"
18# include <signal.h>
19# include <ctype.h>
20
21main(ac, av)
22int ac;
23char **av;
24{
25 register char *sp;
26 register bool bad_arg;
27 register bool show_only;
28 extern char *Scorefile;
29 extern int Max_per_uid;
30 extern char *rindex();
31
32 show_only = FALSE;
33 if (ac > 1) {
34 bad_arg = FALSE;
35 for (++av; ac > 1 && *av[0]; av++, ac--)
36 if (av[0][0] != '-')
37 if (isdigit(av[0][0]))
38 Max_per_uid = atoi(av[0]);
39 else {
40 setuid(getuid());
41 setgid(getgid());
42 Scorefile = av[0];
43# ifdef FANCY
44 sp = rindex(Scorefile, '/');
45 if (sp == NULL)
46 sp = Scorefile;
47 if (strcmp(sp, "pattern_roll") == 0)
48 Pattern_roll = TRUE;
49 else if (strcmp(sp, "stand_still") == 0)
50 Stand_still = TRUE;
51 if (Pattern_roll || Stand_still)
52 Teleport = TRUE;
53# endif
54 }
55 else
56 for (sp = &av[0][1]; *sp; sp++)
57 switch (*sp) {
58 case 's':
59 show_only = TRUE;
60 break;
61 case 'r':
62 Real_time = TRUE;
63 break;
64 case 'a':
65 Start_level = 4;
66 break;
67 case 'j':
68 Jump = TRUE;
69 break;
70 case 't':
71 Teleport = TRUE;
72 break;
73 default:
74 fprintf(stderr, "robots: uknown option: %c\n", *sp);
75 bad_arg = TRUE;
76 break;
77 }
78 if (bad_arg) {
79 exit(1);
80 /* NOTREACHED */
81 }
82 }
83
84 if (show_only) {
85 show_score();
86 exit(0);
87 /* NOTREACHED */
88 }
89
90 initscr();
91 signal(SIGINT, quit);
92 crmode();
93 noecho();
94 nonl();
95 if (LINES != Y_SIZE || COLS != X_SIZE) {
96 if (LINES < Y_SIZE || COLS < X_SIZE) {
97 endwin();
98 printf("Need at least a %dx%d screen\n", Y_SIZE, X_SIZE);
99 exit(1);
100 }
101 delwin(stdscr);
102 stdscr = newwin(Y_SIZE, X_SIZE, 0, 0);
103 }
104
105 srand(getpid());
106 if (Real_time)
107 signal(SIGALRM, move_robots);
108 do {
109 init_field();
110 for (Level = Start_level; !Dead; Level++) {
111 make_level();
112 play_level();
113 }
114 move(My_pos.y, My_pos.x);
115 printw("AARRrrgghhhh....");
116 refresh();
117 score();
118 } while (another());
119 quit();
120}
121
122/*
123 * quit:
124 * Leave the program elegantly.
125 */
126quit()
127{
128 extern int _putchar();
129
130 mvcur(0, COLS - 1, LINES - 1, 0);
131 if (CE) {
132 tputs(CE, 1, _putchar);
133 endwin();
134 }
135 else {
136 endwin();
137 putchar('\n');
138 }
139 exit(0);
140 /* NOTREACHED */
141}
142
143/*
144 * another:
145 * See if another game is desired
146 */
147another()
148{
149 register int y;
150
151#ifdef FANCY
152 if ((Stand_still || Pattern_roll) && !Newscore)
153 return TRUE;
154#endif
155
156 if (query("Another game?")) {
157 if (Full_clear) {
158 for (y = 1; y <= Num_scores; y++) {
159 move(y, 1);
160 clrtoeol();
161 }
162 refresh();
163 }
164 return TRUE;
165 }
166 return FALSE;
167}