X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Fevents.c;h=f1cd50dafaa7dca21d6b7c4583d94300c0540e78;hp=d0684ed3d220061fbcb3076b55b6ddd1c97054b2;hb=b2a0ff1ddd4430110b331129469dabb8ea7b6ba7;hpb=823bddb0d9cc63ddda17a2cd20266aa3b82bde38 diff --git a/src/events.c b/src/events.c index d0684ed3..f1cd50da 100644 --- a/src/events.c +++ b/src/events.c @@ -25,7 +25,7 @@ void EventLoop(void) { while(1) { - if (XPending(display)) /* got an event */ + if (XPending(display)) /* got event from X server */ { XEvent event; @@ -693,6 +693,199 @@ void HandleKey(KeySym key, int key_status) } } + + +/* TEST STUFF -------------------------------------------------------------- */ + +#define PROT_VERS_1 1 +#define PROT_VERS_2 0 +#define PROT_VERS_3 1 + +#define OP_NICK 1 +#define OP_PLAY 2 +#define OP_FALL 3 +#define OP_DRAW 4 +#define OP_LOST 5 +#define OP_GONE 6 +#define OP_CLEAR 7 +#define OP_NEW 8 +#define OP_LINES 9 +#define OP_GROW 10 +#define OP_MODE 11 +#define OP_LEVEL 12 +#define OP_BOT 13 +#define OP_KILL 14 +#define OP_PAUSE 15 +#define OP_CONT 16 +#define OP_VERSION 17 +#define OP_BADVERS 18 +#define OP_MSG 19 +#define OP_YOUARE 20 +#define OP_LINESTO 21 +#define OP_WON 22 +#define OP_ZERO 23 + +/* server stuff */ + +#define BUFLEN 4096 + +extern int sfd; +extern unsigned char realbuf[], readbuf[], writbuf[]; +extern unsigned char *buf; +extern int nread, nwrite; + +extern void fatal(char *); +extern void flushbuf(void); +extern void sysmsg(char *); + +/* like memcpy, but guaranteed to handle overlap when s <= t */ +void copydown(char *s, char *t, int n) +{ + for (; n; n--) + *(s++) = *(t++); +} + +void handlemessages() +{ + unsigned int len; + static char msgbuf[300]; + + while (nread >= 4 && nread >= 4 + readbuf[3]) + { + len = readbuf[3]; + if (readbuf[0] || readbuf[1] || readbuf[2]) + fatal("Wrong server line length"); + + memcpy(buf, &readbuf[4], len); + nread -= 4 + len; + copydown(readbuf, readbuf + 4 + len, nread); + + switch(buf[1]) + { + case OP_YOUARE: + printf("OP_YOUARE: %d\n", buf[0]); + break; + + case OP_NEW: + printf("OP_NEW: %d\n", buf[0]); + sprintf(msgbuf, "new client %d connected", buf[0]); + sysmsg(msgbuf); + break; + + case OP_GONE: + printf("OP_GONE: %d\n", buf[0]); + sprintf(msgbuf, "client %d disconnected", buf[0]); + sysmsg(msgbuf); + break; + + case OP_BADVERS: + { + static char tmpbuf[128]; + + sprintf(tmpbuf, "Protocol version mismatch: server expects %d.%d.x instead of %d.%d.%d\n", buf[2], buf[3], PROT_VERS_1, PROT_VERS_2, PROT_VERS_3); + fatal(tmpbuf); + } + break; + + case OP_PLAY: + printf("OP_PLAY: %d\n", buf[0]); + sprintf(msgbuf, "client %d starts game", buf[0]); + sysmsg(msgbuf); + break; + + case OP_PAUSE: + printf("OP_PAUSE: %d\n", buf[0]); + sprintf(msgbuf, "client %d pauses game", buf[0]); + sysmsg(msgbuf); + break; + + case OP_CONT: + printf("OP_CONT: %d\n", buf[0]); + sprintf(msgbuf, "client %d continues game", buf[0]); + sysmsg(msgbuf); + break; + + case OP_WON: + printf("OP_WON: %d\n", buf[0]); + sprintf(msgbuf, "client %d wins the game", buf[0]); + sysmsg(msgbuf); + break; + + case OP_ZERO: + printf("OP_ZERO: %d\n", buf[0]); + sprintf(msgbuf, "client %d resets game counters", buf[0]); + sysmsg(msgbuf); + break; + + case OP_NICK: + printf("OP_NICK: %d\n", buf[0]); + sprintf(msgbuf, "client %d calls itself %s", buf[0], &buf[2]); + sysmsg(msgbuf); + break; + + case OP_MSG: + printf("OP_MSG: %d\n", buf[0]); + sprintf(msgbuf, "client %d sends message", buf[0]); + break; + + case OP_LOST: + printf("OP_MSG: %d\n", buf[0]); + sprintf(msgbuf, "client %d has lost", buf[0]); + break; + + case OP_LEVEL: + printf("OP_MSG: %d\n", buf[0]); + sprintf(msgbuf, "client %d sets level to %d", buf[0], buf[2]); + break; + } + } + + fflush(stdout); +} + + + +static void HandleNetworking() +{ + static struct timeval tv = { 0, 0 }; + fd_set rfds; + int r = 0; + + if (standalone) + return; + + flushbuf(); + + FD_ZERO(&rfds); + FD_SET(sfd, &rfds); + + r = select(sfd + 1, &rfds, NULL, NULL, &tv); + + if (r < 0 && errno != EINTR) + { + perror("select"); + fatal("fatal: select() failed"); + } + + if (r < 0) + FD_ZERO(&rfds); + + if (FD_ISSET(sfd, &rfds)) + { + int r; + + r = read(sfd, readbuf + nread, BUFLEN - nread); + + if (r < 0) + fatal("Error reading from server"); + if (r == 0) + fatal("Connection to server lost"); + nread += r; + + handlemessages(); + } +} + void HandleNoXEvent() { if (button_status && game_status != PLAYING) @@ -701,6 +894,8 @@ void HandleNoXEvent() return; } + HandleNetworking(); + switch(game_status) { case MAINMENU: