rnd-19980930-3
[rocksndiamonds.git] / src / events.c
index ff86409e640952345561ebeacf78ece8163d1eb3..f1cd50dafaa7dca21d6b7c4583d94300c0540e78 100644 (file)
@@ -1,13 +1,12 @@
 /***********************************************************
 *  Rocks'n'Diamonds -- McDuffin Strikes Back!              *
 *----------------------------------------------------------*
-*  ©1995 Artsoft Development                               *
-*        Holger Schemel                                    *
-*        33659 Bielefeld-Senne                             *
-*        Telefon: (0521) 493245                            *
-*        eMail: aeglos@valinor.owl.de                      *
-*               aeglos@uni-paderborn.de                    *
-*               q99492@pbhrzx.uni-paderborn.de             *
+*  (c) 1995-98 Artsoft Entertainment                       *
+*              Holger Schemel                              *
+*              Oststrasse 11a                              *
+*              33604 Bielefeld                             *
+*              phone: ++49 +521 290471                     *
+*              email: aeglos@valinor.owl.de                *
 *----------------------------------------------------------*
 *  events.c                                                *
 ***********************************************************/
@@ -26,7 +25,7 @@ void EventLoop(void)
 {
   while(1)
   {
-    if (XPending(display))     /* got an event */
+    if (XPending(display))     /* got event from X server */
     {
       XEvent event;
 
@@ -694,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)
@@ -702,6 +894,8 @@ void HandleNoXEvent()
     return;
   }
 
+  HandleNetworking();
+
   switch(game_status)
   {
     case MAINMENU: