|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T u
Length: 4907 (0x132b)
Types: TextFile
Names: »user.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/General/MazewarV/user.c«
/*
* This file is part of "mazewar", an interactive
* multiuser action game for non-BSD-Unix-systems.
* Copyright (C) 1988 Hans Korneder korn@altger.uucp
* Permission is granted to the public
* to copy all parts of the source, as long as no money
* is made out of it, and the copyrightmessage is not removed.
*/
#include <signal.h>
#include <curses.h>
#include "globals.h"
char *user_pipe_name;
int user_pipe_fd, daemon_pipe_fd;
int parent_pid, child_pid;
char richtung[4] = { '>','^','<','v' };
catch(s)
int s;
{
signal(s,catch);
}
fehler(text)
char *text;
{
standout();
mvaddstr(23,0,text);
standend();
refresh();
sleep(4);
}
main()
{
catch(SIGALRM);
catch(SIGPIPE);
parent_pid = getpid();
initscr(); noecho(); raw();
draw_maze();
if ( init_pipes() ) play_the_game();
clear(); refresh(); noraw(); echo(); endwin();
}
draw_maze()
{
int x,y;
erase();
for(y=0; y<MAZE_ROWS; y++)
{
move(y,0);
for(x=0; x<MAZE_COLS; x++)
if ( maze[y][x] != ' ' ) addstr("[]");
else addstr(" ");
}
mvaddstr(19,0,"a = turn left");
mvaddstr(20,0,"d = turn right");
mvaddstr(21,0,"x = turn back");
mvaddstr(22,0,"s = shoot");
mvaddstr(23,0,"q = quit");
mvaddstr(19,20,"w = walk");
mvaddstr(20,20,"_ = walk back");
mvaddstr(21,20,"r = reposition");
refresh();
}
int init_pipes()
{
int n_bytes;
extern char *mktemp();
struct anmeldung anm;
umask(0);
user_pipe_name = mktemp(MAZE_PIPE);
if ( mknod(user_pipe_name,010600,0)<0 )
{
fehler("MAZE_PIPE cannot be created");
return 0;
}
user_pipe_fd = open(user_pipe_name,2);
if ( user_pipe_fd<0 )
{
fehler("MAZE_PIPE cannot be opened");
return 0;
}
alarm(3);
daemon_pipe_fd = open(MAZE_DAEMON,1);
alarm(0);
if ( daemon_pipe_fd<0 )
{
fehler("MAZE_DAEMON_PIPE cannot be opened");
return 0;
}
/* startup message to the daemon */
anm.an_magic = ANMELD;
anm.an_pid = parent_pid;
anm.an_uid = getuid();
strcpy(anm.an_pipe,user_pipe_name);
alarm(3);
n_bytes = write(daemon_pipe_fd,&anm,sizeof(anm));
alarm(0);
if ( n_bytes<0 )
{
fehler("startupmessage to the daemon could not be sent");
return 0;
}
return 1;
}
play_the_game()
{
switch( child_pid=fork() )
{
case -1:
fehler("cannot fork");
break;
case 0: /* child */
child_proc();
break;
default: /* parent */
parent_proc();
break;
}
}
child_proc()
{
struct sp_anzeige spa;
close(user_pipe_fd);
user_pipe_fd = open(user_pipe_name,0);
while ( read(user_pipe_fd,&spa,sizeof(spa))>0 )
switch ( spa.sp_magic )
{
case BILD_NEU:
clearok(stdscr);
refresh();
break;
case SP_ANZ:
if ( spa.sp_flag & 1 ) /* within the game */
mvprintw(19+spa.sp_lfd_nr%5,40+(spa.sp_lfd_nr/5)*20,
"%c: %-8.8s %6d", spa.sp_lfd_nr+'A', spa.sp_name,
spa.sp_score);
else /* Aus dem Spiel raus */
mvaddstr(19+spa.sp_lfd_nr%5,40+(spa.sp_lfd_nr/5)*20,
" ");
if ( spa.sp_flag & 2 ) /* visible */
{
move(spa.sp_y_pos,spa.sp_x_pos*2);
if ( spa.sp_pid==parent_pid )
addch(richtung[spa.sp_richtg]);
else
addch(spa.sp_lfd_nr + 'A');
addch(richtung[spa.sp_richtg]);
}
else
mvaddstr(spa.sp_y_pos,spa.sp_x_pos*2," ");
refresh();
break;
}
exit(0);
}
parent_proc()
{
long now;
int code, status;
struct bewegung bew;
struct sp_anzeige spa;
static long last_shot = 0;
extern long time();
bew.be_magic = BEWEGUNG;
bew.be_pid = parent_pid;
spa.sp_magic = BILD_NEU;
do switch( code=getch() )
{
case 'a': case 'A':
bew.be_code = 'A';
if ( write(daemon_pipe_fd,&bew,sizeof(bew) )<0 ) code=EXIT;
break;
case 'd': case 'D':
bew.be_code = 'D';
if ( write(daemon_pipe_fd,&bew,sizeof(bew) )<0 ) code=EXIT;
break;
case 'x': case 'X':
bew.be_code = 'X';
if ( write(daemon_pipe_fd,&bew,sizeof(bew) )<0 ) code=EXIT;
break;
case 'w': case 'W':
bew.be_code = 'W';
if ( write(daemon_pipe_fd,&bew,sizeof(bew) )<0 ) code=EXIT;
break;
case ' ': case '_':
bew.be_code = ' ';
if ( write(daemon_pipe_fd,&bew,sizeof(bew) )<0 ) code=EXIT;
break;
case 's': case 'S':
/* allow for 1 shot per second */
now = time((long *)0);
if ( last_shot == now ) break;
last_shot = now;
bew.be_code = 'S';
if ( write(daemon_pipe_fd,&bew,sizeof(bew) )<0 ) code=EXIT;
break;
case 'r': case 'R':
bew.be_code = 'R';
if ( write(daemon_pipe_fd,&bew,sizeof(bew) )<0 ) code=EXIT;
break;
case 'Q': case 'q': case 127: case 4: /* ^D */
code = EXIT;
bew.be_code = EXIT;
if ( write(daemon_pipe_fd,&bew,sizeof(bew) )<0 ) code=EXIT;
break;
case 12: /* ^L */ case 022: /* ^R */
if ( write(user_pipe_fd ,&spa,sizeof(spa) )<0 ) code=EXIT;
break;
}
while ( code!=EXIT );
close(user_pipe_fd);
while ( wait(&status) != child_pid ) ;
}
msg(t)char*t;{write(2,t,strlen(t));}
/* ENDE */