Bug #1505 ยป atc.diff
| games/atc/Makefile | ||
|---|---|---|
|
# $DragonFly: src/games/atc/Makefile,v 1.4 2006/10/08 16:22:35 pavalos Exp $
|
||
|
PROG= atc
|
||
|
CFLAGS+=-DBSD -I${.CURDIR} -I.
|
||
|
CFLAGS+=-I${.CURDIR} -I.
|
||
|
SRCS= extern.c grammar.y graphics.c input.c lex.l list.c log.c \
|
||
|
main.c tunable.c update.c y.tab.h
|
||
|
MAN= atc.6
|
||
|
DPADD= ${LIBL} ${LIBM} ${LIBCURSES} ${LIBTERMCAP}
|
||
|
LDADD= -ll -lm -lcurses -ltermcap
|
||
|
DPADD= ${LIBL} ${LIBM} ${LIBCURSES}
|
||
|
LDADD= -ll -lm -lcurses
|
||
|
FILES= Game_List Killer crossover default easy game_2
|
||
|
FILESDIR= ${SHAREDIR}/games/atc
|
||
|
HIDEGAME=hidegame
|
||
| games/atc/extern.c | ||
|---|---|---|
|
LIST air, ground;
|
||
|
struct sgttyb tty_start, tty_new;
|
||
|
struct termios tty_start, tty_new;
|
||
|
DISPLACEMENT displacement[MAXDIR] = {
|
||
|
{ 0, -1 },
|
||
| games/atc/extern.h | ||
|---|---|---|
|
extern LIST air, ground;
|
||
|
extern struct sgttyb tty_start, tty_new;
|
||
|
extern struct termios tty_start, tty_new;
|
||
|
extern DISPLACEMENT displacement[MAXDIR];
|
||
| games/atc/graphics.c | ||
|---|---|---|
|
* For more info on this and all of my stuff, mail edjames@berkeley.edu.
|
||
|
*/
|
||
|
#include <stdlib.h>
|
||
|
#include "include.h"
|
||
|
#ifdef SYSV
|
||
|
#include <errno.h>
|
||
|
#endif
|
||
|
#define C_TOPBOTTOM '-'
|
||
|
#define C_LEFTRIGHT '|'
|
||
| ... | ... | |
|
int
|
||
|
getAChar(void)
|
||
|
{
|
||
|
#ifdef BSD
|
||
|
return (getchar());
|
||
|
#endif
|
||
|
#ifdef SYSV
|
||
|
int c;
|
||
|
while ((c = getchar()) == -1 && errno == EINTR) ;
|
||
|
errno = 0;
|
||
|
while ((c = getchar()) == -1 && errno == EINTR) {
|
||
|
errno = 0;
|
||
|
clearerr(stdin);
|
||
|
}
|
||
|
return(c);
|
||
|
#endif
|
||
|
}
|
||
|
void
|
||
| ... | ... | |
|
quit(void)
|
||
|
{
|
||
|
int c, y, x;
|
||
|
#ifdef BSD
|
||
|
struct itimerval itv;
|
||
|
#endif
|
||
|
getyx(input, y, x);
|
||
|
wmove(input, 2, 0);
|
||
| ... | ... | |
|
c = getchar();
|
||
|
if (c == EOF || c == 'y') {
|
||
|
/* disable timer */
|
||
|
#ifdef BSD
|
||
|
itv.it_value.tv_sec = 0;
|
||
|
itv.it_value.tv_usec = 0;
|
||
|
setitimer(ITIMER_REAL, &itv, NULL);
|
||
|
#endif
|
||
|
#ifdef SYSV
|
||
|
alarm(0);
|
||
|
#endif
|
||
|
fflush(stdout);
|
||
|
clear();
|
||
|
refresh();
|
||
| ... | ... | |
|
PLANE *pp;
|
||
|
int warning = 0;
|
||
|
#ifdef BSD
|
||
|
wclear(planes);
|
||
|
#endif
|
||
|
wmove(planes, 0,0);
|
||
|
#ifdef SYSV
|
||
|
wclrtobot(planes);
|
||
|
#endif
|
||
|
wprintw(planes, "Time: %-4d Safe: %d", clck, safe_planes);
|
||
|
wmove(planes, 2, 0);
|
||
|
waddstr(planes, "pl dt comm");
|
||
|
for (pp = air.head; pp != NULL; pp = pp->next) {
|
||
|
if (waddch(planes, '\n') == ERR) {
|
||
| ... | ... | |
|
loser(const PLANE *p, const char *s)
|
||
|
{
|
||
|
int c;
|
||
|
#ifdef BSD
|
||
|
struct itimerval itv;
|
||
|
#endif
|
||
|
/* disable timer */
|
||
|
#ifdef BSD
|
||
|
itv.it_value.tv_sec = 0;
|
||
|
itv.it_value.tv_usec = 0;
|
||
|
setitimer(ITIMER_REAL, &itv, NULL);
|
||
|
#endif
|
||
|
#ifdef SYSV
|
||
|
alarm(0);
|
||
|
#endif
|
||
|
wmove(input, 0, 0);
|
||
|
wclrtobot(input);
|
||
| games/atc/include.h | ||
|---|---|---|
|
* For more info on this and all of my stuff, mail edjames@berkeley.edu.
|
||
|
*/
|
||
|
#include <stdio.h>
|
||
|
#include <ctype.h>
|
||
|
#include <sys/types.h>
|
||
|
#include <pwd.h>
|
||
|
#ifdef BSD
|
||
|
#include <sgtty.h>
|
||
|
#include <sys/time.h>
|
||
|
#include <sys/file.h>
|
||
|
#endif
|
||
|
#include <fcntl.h>
|
||
|
#include <unistd.h>
|
||
|
#include <string.h>
|
||
|
#include <stdlib.h>
|
||
|
#ifdef SYSV
|
||
|
#include <sys/types.h>
|
||
|
#include <sys/utsname.h>
|
||
|
#endif
|
||
|
#include <signal.h>
|
||
|
#include <math.h>
|
||
|
#include <ctype.h>
|
||
|
#include <curses.h>
|
||
|
#ifdef SYSV
|
||
|
#define index strchr
|
||
|
#define rindex strrchr
|
||
|
#define bcopy(a,b,c) memcpy((b), (a), (c))
|
||
|
#define bzero(a,b) memset((a), '\0', (b))
|
||
|
#define srandom srand
|
||
|
#define random rand
|
||
|
#define sgttyb termio
|
||
|
#define sg_erase c_cc[2]
|
||
|
#define sg_kill c_cc[3]
|
||
|
#endif
|
||
|
#include <fcntl.h>
|
||
|
#include <math.h>
|
||
|
#include <pwd.h>
|
||
|
#include <signal.h>
|
||
|
#include <stdio.h>
|
||
|
#include <string.h>
|
||
|
#include <termios.h>
|
||
|
#include <unistd.h>
|
||
|
#include "def.h"
|
||
|
#include "struct.h"
|
||
| games/atc/input.c | ||
|---|---|---|
|
#include <sys/wait.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <string.h>
|
||
|
#include "include.h"
|
||
|
#include "pathnames.h"
|
||
| ... | ... | |
|
#define MAXDEPTH 15
|
||
|
#define RETTOKEN '\r'
|
||
|
#ifdef SYSV
|
||
|
#define CRTOKEN '\r'
|
||
|
#endif
|
||
|
#define REDRAWTOKEN '\014' /* CTRL(L) */
|
||
|
#define SHELLTOKEN '!'
|
||
|
#define HELPTOKEN '?'
|
||
| ... | ... | |
|
RULE state0[] = { { ALPHATOKEN, 1, "%c:", setplane},
|
||
|
{ RETTOKEN, -1, "", NULL },
|
||
|
#ifdef SYSV
|
||
|
{ CRTOKEN, -1, "", NULL },
|
||
|
#endif
|
||
|
{ HELPTOKEN, 12, " [a-z]<ret>", NULL }},
|
||
|
state1[] = { { 't', 2, " turn", turn },
|
||
|
{ 'a', 3, " altitude:", NULL },
|
||
| ... | ... | |
|
state4[] = { { '@', 9, " at", NULL },
|
||
|
{ 'a', 9, " at", NULL },
|
||
|
{ RETTOKEN, -1, "", NULL },
|
||
|
#ifdef SYSV
|
||
|
{ CRTOKEN, -1, "", NULL },
|
||
|
#endif
|
||
|
{ HELPTOKEN, 12, " @a<ret>", NULL }},
|
||
|
state5[] = { { NUMTOKEN, 7, "%c", delayb },
|
||
|
{ HELPTOKEN, 12, " [0-9]", NULL }},
|
||
| ... | ... | |
|
{ 'a', 4, " 270", rel_dir },
|
||
|
{ 'q', 4, " 315", rel_dir },
|
||
|
{ RETTOKEN, -1, "", NULL },
|
||
|
#ifdef SYSV
|
||
|
{ CRTOKEN, -1, "", NULL },
|
||
|
#endif
|
||
|
{ HELPTOKEN, 12, " @a<dir><ret>",NULL }},
|
||
|
state7[] = { { RETTOKEN, -1, "", NULL },
|
||
|
#ifdef SYSV
|
||
|
{ CRTOKEN, -1, "", NULL },
|
||
|
#endif
|
||
|
{ HELPTOKEN, 12, " <ret>", NULL }},
|
||
|
state8[] = { { NUMTOKEN, 4, "%c", benum },
|
||
|
{ HELPTOKEN, 12, " [0-9]", NULL }},
|
||
| ... | ... | |
|
do {
|
||
|
c = gettoken();
|
||
|
if (c == tty_new.sg_erase) {
|
||
|
if (c == tty_new.c_cc[VERASE]) {
|
||
|
if (pop() < 0)
|
||
|
noise();
|
||
|
} else if (c == tty_new.sg_kill) {
|
||
|
} else if (c == tty_new.c_cc[VKILL]) {
|
||
|
while (pop() >= 0)
|
||
|
;
|
||
|
} else {
|
||
| ... | ... | |
|
{
|
||
|
if (tval == SHELLTOKEN)
|
||
|
{
|
||
|
#ifdef BSD
|
||
|
struct itimerval itv;
|
||
|
itv.it_value.tv_sec = 0;
|
||
|
itv.it_value.tv_usec = 0;
|
||
|
setitimer(ITIMER_REAL, &itv, NULL);
|
||
|
#endif
|
||
|
#ifdef SYSV
|
||
|
int aval;
|
||
|
aval = alarm(0);
|
||
|
#endif
|
||
|
if (fork() == 0) /* child */
|
||
|
{
|
||
|
char *shell, *base;
|
||
| ... | ... | |
|
}
|
||
|
wait(0);
|
||
|
#ifdef BSD
|
||
|
ioctl(fileno(stdin), TIOCSETP, &tty_new);
|
||
|
tcsetattr(fileno(stdin), TCSANOW, &tty_new);
|
||
|
itv.it_value.tv_sec = 0;
|
||
|
itv.it_value.tv_usec = 1;
|
||
|
itv.it_interval.tv_sec = sp->update_secs;
|
||
|
itv.it_interval.tv_usec = 0;
|
||
|
setitimer(ITIMER_REAL, &itv, NULL);
|
||
|
#endif
|
||
|
#ifdef SYSV
|
||
|
ioctl(fileno(stdin), TCSETAW, &tty_new);
|
||
|
alarm(aval);
|
||
|
#endif
|
||
|
}
|
||
|
redraw();
|
||
|
}
|
||
| games/atc/log.c | ||
|---|---|---|
|
#include "include.h"
|
||
|
#include "pathnames.h"
|
||
|
#ifdef SYSV
|
||
|
#include <sys/utsname.h>
|
||
|
#endif
|
||
|
static FILE *score_fp;
|
||
| ... | ... | |
|
struct passwd *pw;
|
||
|
char *cp;
|
||
|
SCORE score[100], thisscore;
|
||
|
#ifdef SYSV
|
||
|
struct utsname name;
|
||
|
#endif
|
||
|
if (score_fp == NULL) {
|
||
|
warnx("no score file available");
|
||
|
return (-1);
|
||
|
}
|
||
|
#ifdef BSD
|
||
|
if (flock(fileno(score_fp), LOCK_EX) < 0)
|
||
|
#endif
|
||
|
#ifdef SYSV
|
||
|
while (lockf(fileno(score_fp), F_LOCK, 1) < 0)
|
||
|
#endif
|
||
|
{
|
||
|
warn("flock %s", _PATH_SCORE);
|
||
|
return (-1);
|
||
| ... | ... | |
|
return (-1);
|
||
|
}
|
||
|
strcpy(thisscore.name, pw->pw_name);
|
||
|
#ifdef BSD
|
||
|
if (gethostname(thisscore.host, sizeof (thisscore.host)) < 0) {
|
||
|
perror("gethostname");
|
||
|
return (-1);
|
||
|
}
|
||
|
#endif
|
||
|
#ifdef SYSV
|
||
|
uname(&name);
|
||
|
strcpy(thisscore.host, name.nodename);
|
||
|
#endif
|
||
|
cp = rindex(filename, '/');
|
||
|
if (cp == NULL) {
|
||
| ... | ... | |
|
}
|
||
|
putchar('\n');
|
||
|
}
|
||
|
#ifdef BSD
|
||
|
flock(fileno(score_fp), LOCK_UN);
|
||
|
#endif
|
||
|
#ifdef SYSV
|
||
|
/* lock will evaporate upon close */
|
||
|
#endif
|
||
|
fclose(score_fp);
|
||
|
printf("%2s: %-8s %-8s %-18s %4s %9s %4s\n", "#", "name", "host",
|
||
|
"game", "time", "real time", "planes safe");
|
||
| games/atc/main.c | ||
|---|---|---|
|
* For more info on this and all of my stuff, mail edjames@berkeley.edu.
|
||
|
*/
|
||
|
#include <stdlib.h>
|
||
|
#include "include.h"
|
||
|
#include "pathnames.h"
|
||
| ... | ... | |
|
int f_printpath = 0;
|
||
|
const char *file = NULL;
|
||
|
char *p_name, *ptr;
|
||
|
#ifdef BSD
|
||
|
struct itimerval itv;
|
||
|
#endif
|
||
|
/* Open the score file then revoke setgid privileges */
|
||
|
open_score_file();
|
||
| ... | ... | |
|
signal(SIGINT, (sig_t)quit);
|
||
|
signal(SIGQUIT, (sig_t)quit);
|
||
|
#ifdef BSD
|
||
|
signal(SIGTSTP, SIG_IGN);
|
||
|
signal(SIGSTOP, SIG_IGN);
|
||
|
#endif
|
||
|
signal(SIGHUP, (sig_t)log_score);
|
||
|
signal(SIGTERM, (sig_t)log_score);
|
||
|
#ifdef BSD
|
||
|
ioctl(fileno(stdin), TIOCGETP, &tty_start);
|
||
|
bcopy(&tty_start, &tty_new, sizeof(tty_new));
|
||
|
tty_new.sg_flags |= CBREAK;
|
||
|
tty_new.sg_flags &= ~ECHO;
|
||
|
ioctl(fileno(stdin), TIOCSETP, &tty_new);
|
||
|
#endif
|
||
|
#ifdef SYSV
|
||
|
ioctl(fileno(stdin), TCGETA, &tty_start);
|
||
|
tcgetattr(fileno(stdin), &tty_start);
|
||
|
bcopy(&tty_start, &tty_new, sizeof(tty_new));
|
||
|
tty_new.c_lflag &= ~ICANON;
|
||
|
tty_new.c_lflag &= ~ECHO;
|
||
|
tty_new.c_cc[VMIN] = 1;
|
||
|
tty_new.c_cc[VTIME] = 0;
|
||
|
ioctl(fileno(stdin), TCSETAW, &tty_new);
|
||
|
#endif
|
||
|
tcsetattr(fileno(stdin), TCSANOW, &tty_new);
|
||
|
signal(SIGALRM, (sig_t)update);
|
||
|
#ifdef BSD
|
||
|
itv.it_value.tv_sec = 0;
|
||
|
itv.it_value.tv_usec = 1;
|
||
|
itv.it_interval.tv_sec = sp->update_secs;
|
||
|
itv.it_interval.tv_usec = 0;
|
||
|
setitimer(ITIMER_REAL, &itv, NULL);
|
||
|
#endif
|
||
|
#ifdef SYSV
|
||
|
alarm(sp->update_secs);
|
||
|
#endif
|
||
|
for (;;) {
|
||
|
if (getcommand() != 1)
|
||
|
planewin();
|
||
|
else {
|
||
|
#ifdef BSD
|
||
|
itv.it_value.tv_sec = 0;
|
||
|
itv.it_value.tv_usec = 0;
|
||
|
setitimer(ITIMER_REAL, &itv, NULL);
|
||
|
#endif
|
||
|
#ifdef SYSV
|
||
|
alarm(0);
|
||
|
#endif
|
||
|
update();
|
||
|
#ifdef BSD
|
||
|
itv.it_value.tv_sec = sp->update_secs;
|
||
|
itv.it_value.tv_usec = 0;
|
||
|
itv.it_interval.tv_sec = sp->update_secs;
|
||
|
itv.it_interval.tv_usec = 0;
|
||
|
setitimer(ITIMER_REAL, &itv, NULL);
|
||
|
#endif
|
||
|
#ifdef SYSV
|
||
|
alarm(sp->update_secs);
|
||
|
#endif
|
||
|
}
|
||
|
}
|
||
|
}
|
||
| games/atc/update.c | ||
|---|---|---|
|
int i, dir_diff, mask, unclean;
|
||
|
PLANE *pp, *p1, *p2;
|
||
|
#ifdef BSD
|
||
|
mask = sigblock(sigmask(SIGINT));
|
||
|
#endif
|
||
|
#ifdef SYSV
|
||
|
alarm(0);
|
||
|
signal(SIGALRM, update);
|
||
|
#endif
|
||
|
clck++;
|
||
| ... | ... | |
|
if ((random() % sp->newplane_time) == 0)
|
||
|
addplane();
|
||
|
#ifdef BSD
|
||
|
sigsetmask(mask);
|
||
|
#endif
|
||
|
#ifdef SYSV
|
||
|
alarm(sp->update_secs);
|
||
|
#endif
|
||
|
}
|
||
|
const char *
|
||