rnd-19981001-1
[rocksndiamonds.git] / src / init.c
index 2f6bb8ed971a97e28b695647c0863c89eb75f9d5..36eb3217283048a8d4bfdc10a159057fb27fff2a 100644 (file)
 *  init.c                                                  *
 ***********************************************************/
 
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
 #include <signal.h>
-#include <sys/types.h>
-#include <sys/time.h>
-#include <sys/wait.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <netinet/tcp.h>
-#include <arpa/inet.h>
-#include <netdb.h>
-#include <errno.h>
 
 #include "init.h"
 #include "misc.h"
@@ -34,6 +22,7 @@
 #include "joystick.h"
 #include "gfxload.h"
 #include "gifload.h"
+#include "network.h"
 
 #ifdef DEBUG
 /*
@@ -67,14 +56,8 @@ static void InitElementProperties(void);
 
 void OpenAll(int argc, char *argv[])
 {
-
-
-  /* TEST TEST TEST */
-  InitServer();
-  /* TEST TEST TEST */
-
-
   InitLevelAndPlayerInfo();
+  InitServer();
 
   InitCounter();
   InitSound();
@@ -97,231 +80,33 @@ void OpenAll(int argc, char *argv[])
   DrawMainMenu();
 }
 
-
-
-/* TEST STUFF -------------------------------------------------------------- */
-
-int norestart = 0;
-int nospeedup = 0;
-
-#define DEFAULTPORT 19503
-
-#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
-
-int sfd;
-unsigned char realbuf[512], readbuf[BUFLEN], writbuf[BUFLEN];
-unsigned char *buf = realbuf + 4;
-int nread = 0, nwrite = 0;
-
-void sysmsg(char *s)
-{
-  printf("** %s\n", s);
-  fflush(stdout);
-}
-
-void fatal(char *s)
-{
-  fprintf(stderr, "%s.\n", s);
-  exit(1);
-}
-
-void u_sleep(int i)
-{
-  struct timeval tm;
-  tm.tv_sec = i / 1000000;
-  tm.tv_usec = i % 1000000;
-  select(0, NULL, NULL, NULL, &tm);
-}
-
-void flushbuf()
-{
-  if (nwrite)
-  {
-    write(sfd, writbuf, nwrite);
-    nwrite = 0;
-  }
-}
-
-void sendbuf(int len)
-{
-  if (!standalone)
-  {
-    realbuf[0] = realbuf[1] = realbuf[2] = 0;
-    realbuf[3] = (unsigned char)len;
-    buf[0] = 0;
-    if (nwrite + 4 + len >= BUFLEN)
-      fatal("Internal error: send buffer overflow");
-    memcpy(writbuf + nwrite, realbuf, 4 + len);
-    nwrite += 4 + len;
-  }
-}
-
-void startserver()
-{
-  char *options[2];
-  int n = 0;
-
-  options[0] = options[1] = NULL;
-  if (norestart)
-    options[n++] = "-norestart";
-  if (nospeedup)
-    options[n++] = "-nospeedup";
-
-  switch (fork())
-  {
-    case 0:
-      execlp(
-#ifdef XTRISPATH
-      XTRISPATH "/rnd_server",
-#else
-      "rnd_server",
-#endif
-      "rnd_server", "-once", "-v", options[0], options[1], NULL);
-
-      fprintf(stderr, "Can't start server '%s'.\n",
-#ifdef XTRISPATH
-       XTRISPATH "/rnd_server"
-#else
-       "rnd_server"
-#endif
-             );
-
-      _exit(1);
-    
-    case -1:
-      fatal("fork() failed");
-    
-    default:
-      return;
-  }
-}
-
-void connect2server(char *host, int port)
+void InitLevelAndPlayerInfo()
 {
-  struct hostent *hp;
-  struct sockaddr_in s;
-  struct protoent *tcpproto;
-  int on = 1, i;
-
-  if (host)
-  {
-    if ((s.sin_addr.s_addr = inet_addr(host)) == -1)
-    {
-      hp = gethostbyname(host);
-      if (!hp)
-       fatal("Host not found");
-      s.sin_addr = *(struct in_addr *)(hp->h_addr_list[0]);
-    }
-  }
-  else
-    s.sin_addr.s_addr = inet_addr("127.0.0.1");
-
-  s.sin_port = htons(port);
-  s.sin_family = AF_INET;
-  sfd = socket(PF_INET, SOCK_STREAM, 0);
-  if (sfd < 0)
-    fatal("Out of file descriptors");
-  if ((tcpproto = getprotobyname("tcp")) != NULL)
-    setsockopt(sfd, tcpproto->p_proto, TCP_NODELAY, (char *)&on, sizeof(int));
-
-  if (connect(sfd, (struct sockaddr *)&s, sizeof(s)) < 0)
-  {
-    if (!host)
-    {
-      printf("No rocksndiamonds server on localhost - starting up one ...\n");
-      startserver();
-      for (i=0; i<6; i++)
-      {
-       u_sleep(500000);
-       close(sfd);
-       sfd = socket(PF_INET, SOCK_STREAM, 0);
-       if (sfd < 0)
-         fatal("Out of file descriptors");
-       setsockopt(sfd, tcpproto->p_proto, TCP_NODELAY, (char *)&on, sizeof(int));
-       if (connect(sfd, (struct sockaddr *)&s, sizeof(s)) >= 0)
-         break;
-      }
-      if (i==6)
-       fatal("Can't connect to server");
-    }
-    else
-      fatal("Can't connect to server");
-  }
-}
+  local_player = &stored_player[0];
 
-static void send_nickname(char *nickname)
-{
-  static char msgbuf[300];
+  if (!LoadLevelInfo())                        /* global level info */
+    CloseAll();
 
-  buf[1] = OP_NICK;
-  memcpy(&buf[2], nickname, strlen(nickname));
-  sendbuf(2 + strlen(nickname));
-  sprintf(msgbuf, "you set your nick to %s", nickname);
-  sysmsg(msgbuf);
+  LoadPlayerInfo(PLAYER_SETUP);                /* global setup info */
+  LoadPlayerInfo(PLAYER_LEVEL);                /* level specific info */
 }
 
 void InitServer()
 {
-  if (server_port == 0)
-    server_port = DEFAULTPORT;
-
   standalone = FALSE;
 
-  if (!standalone)
-    connect2server(server_host, server_port);
-
-  send_nickname("dummyplayer");
-
-  buf[1] = OP_VERSION;
-  buf[2] = PROT_VERS_1;
-  buf[3] = PROT_VERS_2;
-  buf[4] = PROT_VERS_3;
-  sendbuf(5);
-}
-
-/* TEST STUFF -------------------------------------------------------------- */
-
-
-
-void InitLevelAndPlayerInfo()
-{
-  local_player = &stored_player[0];
+  if (standalone)
+    return;
 
-  if (!LoadLevelInfo())                        /* global level info */
-    CloseAll();
+  if (!ConnectToServer(server_host, server_port))
+  {
+    fprintf(stderr,"%s: cannot connect to multiplayer server.\n", 
+           progname);
+    exit(-1);
+  }
 
-  LoadPlayerInfo(PLAYER_SETUP);                /* global setup info */
-  LoadPlayerInfo(PLAYER_LEVEL);                /* level specific info */
+  SendNicknameToServer(local_player->alias_name);
+  SendProtocolVersionToServer();
 }
 
 void InitSound()