unofficial version 0.7: multiplayer improvements
[netris.git] / server.c
index 7e0aca1eb91de6d4df5d8b30e79093d4d19a28e0..9297b13a96374dbfe4c44f70a4db165cdd490d65 100644 (file)
--- a/server.c
+++ b/server.c
 #include <setjmp.h>
 
 #define HEADER_SIZE sizeof(netint4[3])
-#define MAX_CONNECTIONS 3
-
-char *version_string = "0.5.89";
 
 static struct option options[] = {
        { "wait",               0, 0, 'w' },
        { "port",               1, 0, 'p' },
+       { "connections",1, 0, 'c' },
        { "speed",              1, 0, 'i' },
        { "seed",               1, 0, 's' },
        { "info",               0, 0, 'H' },
@@ -47,6 +45,8 @@ static struct option options[] = {
        { 0,                    0, 0,  0 }
 };
 
+static char Connections = 2;
+
 static char *gameNames[GT_len] = { "OnePlayer", "ClassicTwo" };
 
 ExtFunc MyEventType NetGenFunc(EventGenRec *gen, MyEvent *event);
@@ -296,7 +296,7 @@ ExtFunc int WaitForConnection(short port)
                die("listen");
 
        addrLen = sizeof(addr);
-       for (i = 1; i <= MAX_CONNECTIONS; i++) {
+       for (i = 1; i <= Connections; i++) {
                if ((netGen[i].fd = accept(sockListen, (struct sockaddr *)&addr, &addrLen)) < 0)
                        die("accept");
                fprintf(stderr, "Connection: %s\n", inet_ntoa(addr.sin_addr));
@@ -344,38 +344,33 @@ ExtFunc int WaitForConnection(short port)
        return 0;
 } //WaitForConnection
 
-ExtFunc int StartServer(char *portStr)
+ExtFunc int StartServer(void)
 {
        MyEvent event;
-       char serverdata[255];
        int playercount;
+       int playersReady = 0;
        int i;
 
        {
-               short port;
-
-               if (portStr)
-                       port = atoi(portStr);   /* XXX Error checking */
-               else
-                       port = DEFAULT_PORT;
-               WaitForConnection(port);
-       }
-
-       playercount = MAX_CONNECTIONS;
-
-       for (i = 1; i <= playercount; i++) {
-               sprintf(serverdata, "Netris server %s", version_string);
-               SendPacketTo(i, i, NP_hello, strlen(serverdata)+1, serverdata);
+               char serverdata[255];
+               for (i = 1; i <= totalPlayers; i++) {
+                       sprintf(serverdata, "Netris server %s", version_string);
+                       SendPacketTo(i, i, NP_hello, strlen(serverdata)+1, serverdata);
+               }
        }
 
-       while(1) {
+       do {
                if (WaitMyEvent(&event, EM_net) == E_net) {
 //                     fprintf(stderr, "in %d: %d\n",
 //                             netGen[event.u.net.sender].fd, event.u.net.type);
                        switch(event.u.net.type) {
                                case NP_endConn:
                                { //client went away :(
-                                       //tell the others! :)
+                                       Players[event.u.net.sender].alive = 0;
+                                       for (i = 1; i <= totalPlayers; i++)
+                                               SendPacketTo(i, event.u.net.sender,
+                                                       NP_argghhh, sizeof(Players[0].alive),
+                                                       &Players[event.u.net.sender].alive);
                                        break;
                                } //NP_endConn
                                case NP_hello:
@@ -384,19 +379,22 @@ ExtFunc int StartServer(char *portStr)
                                { //receive player details and return other players
                                        memcpy(&Players[event.u.net.sender],
                                                event.u.net.data, event.u.net.size);
+                                       if (!Players[event.u.net.sender].team)
+                                               Players[event.u.net.sender].team = 256 - event.u.net.sender;
                                        fprintf(stderr, "player %d: %s <%s>\n", event.u.net.sender,
                                                event.u.net.data, //Players[event.u.net.sender].name
                                                Players[event.u.net.sender].host);
+                                       SendPacketTo(event.u.net.sender, 0, NP_gamedata,
+                                               sizeof(Game.seed)+sizeof(Game.initspeed), &Game);
                                        for (i = 1; i <= totalPlayers; i++)
                                                if (i != event.u.net.sender)
                                                        SendPacketTo(i, event.u.net.sender, event.u.net.type,
                                                                sizeof(Player) - sizeof(Players[0].spy),
                                                                &Players[event.u.net.sender]);
-                                       if (--playercount == 0) {
-                                               fprintf(stderr, "Starting game\n");
+                                       if (++playersReady >= totalPlayers) {
+                                               fprintf(stderr, "Starting game (%010d)\n", Game.seed);
                                                for (i = 1; i <= totalPlayers; i++)
                                                        SendPacketTo(i, 0, NP_goAhead, 0, NULL);
-                                               playercount++;
                                        } //give go ahead
                                        break;
                                } //NP_playerdata
@@ -405,13 +403,18 @@ ExtFunc int StartServer(char *portStr)
        //                              if (event.u.net.type >= NP_pause)
                                        for (i = 1; i <= totalPlayers; i++)
                                                if (i != event.u.net.sender)
+                                               if (event.u.net.type != NP_giveJunk
+                                               || Players[i].team != Players[event.u.net.sender].team)
                                                        SendPacketTo(i, event.u.net.sender, event.u.net.type,
                                                                event.u.net.size, event.u.net.data);
                                        break;
                                }
-                       } //E_net
-               }
-       } //loop
+                       }
+               } //E_net
+               playercount = 0;
+               for (i = 1; i <= totalPlayers; i++)
+                       if (netGen[i].fd >= 0) playercount++;
+       } while (playercount > 1);
 } //StartServer
 
 
@@ -478,13 +481,16 @@ ExtFunc void HandleOption(char tag, char *value)
 {
        switch (tag) {
                case 'p':       //port
-                       portStr = value; break;
+                       port = atoi(value);
+                       break;
+               case 'c':       //connections
+                       Connections = atoi(value);
+                       break;
                case 'i':       //speed (of level 1)
                        Game.initspeed = atof(value) * 1e6;
                        break;
                case 's':       //seed
                        Game.seed = atoi(value);
-                       Players[0].flags |= SCF_setSeed;
                        break;
                case 'H':       //info
                        DistInfo(); exit(0);
@@ -540,15 +546,16 @@ ExtFunc int main(int argc, char **argv)
 
        if (sigsetjmp(close_env, 1)) exit(0);
        signal(SIGINT, CatchInt);
-       Game.standout = Game.color = 1;
+       port = DEFAULT_PORT;
        Game.initspeed = DEFAULT_INTERVAL;
+       Game.seed = time(0);
 
 //     if (getopt(argc, argv, "f:") == 'f')
 //             ReadConf(optarg);
 //     else
        ReadConf(CONFIG_FILE);
        while ((ch = getopt_long(argc, argv,
-                       "hHp:i:s:", options, NULL)) != -1)
+                       "hHp:i:s:c:", options, NULL)) != -1)
                HandleOption(ch, optarg);
        if (optind < argc) {
                Usage();
@@ -557,7 +564,8 @@ ExtFunc int main(int argc, char **argv)
 //     WriteConf();
 
        Header();
-       StartServer(portStr);
+       WaitForConnection(port);
+       StartServer();
        return 0;
 }