rnd-19980930-3
[rocksndiamonds.git] / src / events.c
index d0684ed3d220061fbcb3076b55b6ddd1c97054b2..f1cd50dafaa7dca21d6b7c4583d94300c0540e78 100644 (file)
@@ -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: