#include <err.h>
#include <errno.h>
#include <fcntl.h>
#include <signal.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "robots.h"
void
usage(void)
{
fprintf(stderr, "usage: %s [-ajrst] [scorefile]\n", getprogname());
exit(1);
}
int
main(int ac, char *av[])
{
bool show_only;
extern char Scorefile[PATH_MAX];
int score_wfd;
int score_err = 0;
int ch;
int ret;
char *home;
#ifdef FANCY
char *sp;
#endif
home = getenv("HOME");
if (home == NULL || *home == '\0')
err(1, "getenv");
ret = snprintf(Scorefile, sizeof(Scorefile), "%s/%s", home,
".robots.scores");
if (ret < 0 || ret >= PATH_MAX)
errc(1, ENAMETOOLONG, "%s/%s", home, ".robots.scores");
if ((score_wfd = open(Scorefile, O_RDWR | O_CREAT, 0666)) == -1)
score_err = errno;
show_only = FALSE;
while ((ch = getopt(ac, av, "srajt")) != -1)
switch (ch) {
case 's':
show_only = TRUE;
break;
case 'r':
Real_time = TRUE;
tv.tv_sec = 3;
break;
case 'a':
Start_level = 4;
break;
case 'j':
Jump = TRUE;
break;
case 't':
Teleport = TRUE;
break;
default:
usage();
}
ac -= optind;
av += optind;
if (ac > 1)
usage();
if (ac == 1) {
if (strlcpy(Scorefile, av[0], sizeof(Scorefile)) >=
sizeof(Scorefile))
errc(1, ENAMETOOLONG, "%s", av[0]);
if (score_wfd >= 0)
close(score_wfd);
if ((score_wfd = open(Scorefile, O_RDWR | O_CREAT, 0666)) == -1)
score_err = errno;
#ifdef FANCY
sp = strrchr(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
}
if (show_only) {
show_score();
return 0;
}
if (score_wfd < 0) {
warnx("%s: %s; no scores will be saved", Scorefile,
strerror(score_err));
sleep(1);
}
initscr();
if (pledge("stdio tty", NULL) == -1)
err(1, "pledge");
signal(SIGINT, quit);
cbreak();
noecho();
nonl();
if (LINES != Y_SIZE || COLS != X_SIZE) {
if (LINES < Y_SIZE || COLS < X_SIZE) {
endwin();
errx(1, "Need at least a %dx%d screen", Y_SIZE, X_SIZE);
}
delwin(stdscr);
stdscr = newwin(Y_SIZE, X_SIZE, 0, 0);
}
do {
init_field();
for (Level = Start_level; !Dead; Level++) {
make_level();
play_level();
}
if (My_pos.x > X_FIELDSIZE - 16)
move(My_pos.y, X_FIELDSIZE - 16);
else
move(My_pos.y, My_pos.x);
printw("AARRrrgghhhh....");
refresh();
score(score_wfd);
} while (another());
quit(0);
}
void
quit(int dummy)
{
endwin();
exit(0);
}
bool
another(void)
{
int y;
#ifdef FANCY
if ((Stand_still || Pattern_roll) && !Newscore)
return TRUE;
#endif
if (query("Another game?")) {
if (Full_clear) {
for (y = 1; y <= Num_scores; y++) {
move(y, 1);
clrtoeol();
}
refresh();
}
return TRUE;
}
return FALSE;
}