X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Finit.c;h=36eb3217283048a8d4bfdc10a159057fb27fff2a;hb=3abeab753b05c534b4061ad20a1de50a39da6daa;hp=2f6bb8ed971a97e28b695647c0863c89eb75f9d5;hpb=b2a0ff1ddd4430110b331129469dabb8ea7b6ba7;p=rocksndiamonds.git diff --git a/src/init.c b/src/init.c index 2f6bb8ed..36eb3217 100644 --- a/src/init.c +++ b/src/init.c @@ -11,19 +11,7 @@ * init.c * ***********************************************************/ -#include -#include -#include #include -#include -#include -#include -#include -#include -#include -#include -#include -#include #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()