unofficial version 0.7.2: mainly sync/reset fixes
[netris.git] / server.c
index f67721f6eb3019366f229df40e20b4e9721b0240..6fe46f0c49f25c72c63ec8b54c37d1728481d26f 100644 (file)
--- a/server.c
+++ b/server.c
@@ -49,7 +49,7 @@ static struct option options[] = {
 };
 
 static char minplayers = 2;
-static char countPlayers = 0;
+static char playercount;
 static char verbose = 0;
 
 struct sockaddr_in addr;
@@ -166,8 +166,10 @@ ExtFunc void SCloseNet(short playa)
        MyEvent event;
 
        if (netGen[playa].fd >= 0) {
-               SendPacketTo(playa, 0, NP_endConn, 0, NULL);
-               do{} while (WaitMyEvent(&event, EM_net) != E_lostConn);
+               if (Players[playa].alive >= 0) {
+                       SendPacketTo(playa, 0, NP_endConn, 0, NULL);
+                       do{} while (WaitMyEvent(&event, EM_net) != E_lostConn);
+               } //say bye to player
                close(netGen[playa].fd);
                netGen[playa].fd = -1;
        }
@@ -313,22 +315,38 @@ static MyEventType ConnGenFunc(EventGenRec *gen, MyEvent *event)
        return E_connect;
 } //ConnGenFunc
 
+ExtFunc void CountPlayers(void)
+{ //count number of players/teams
+       int i, j;
+       playercount = 0;
+       for (i = 1; i < MAX_SCREENS; i++) if (Players[i].alive > 0) {
+               if (Players[i].team < 128) for (j = 1; j < i; j++)
+                       if (Players[j].alive > 0 && (Players[j].team == Players[i].team)) {
+                               playercount--;
+                               break;
+                       } //player of same team counted before
+               playercount++;
+       } //player alive
+} //CountPlayers
+
 ExtFunc int StartServer(void)
 {
        MyEvent event;
        netint2 currentpiece[MAX_SCREENS];
-       int playercount;
        int playersReady = 0;
+       int paused = 1;
        int i;
+       char teams[10][7] = { "", "Green", "Cyan", "Blue", "Purple",
+                                                       "Red", "Grey", "White", "*Orange" };
 
        do {
                switch (WaitMyEvent(&event, EM_any)) {
                        case E_lostConn: //client went away :(
-                               Players[event.u.net.sender].alive = 0;
+                               Players[event.u.net.sender].alive = -1;
                                for (i = 1; i < MAX_SCREENS; i++)
-                                       if (Players[i].alive)
+                                       if (Players[i].alive >= 0)
                                                SendPacketTo(i, event.u.net.sender,
-                                                       NP_argghhh, sizeof(Players[0].alive),
+                                                       NP_part, sizeof(Players[0].alive),
                                                        &Players[event.u.net.sender].alive);
                                SCloseNet(event.u.net.sender);
                                break; //NP_endConn
@@ -366,14 +384,20 @@ ExtFunc int StartServer(void)
                                        //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)
+                                               if (Players[event.u.net.sender].team < 1
+                                               || Players[event.u.net.sender].team > 7) {
                                                        Players[event.u.net.sender].team =
-                                                               256 - event.u.net.sender;
+                                                               event.u.net.sender % 7 + 1;
+                                                       SendPacketTo(event.u.net.sender,
+                                                               event.u.net.sender, NP_team,
+                                                               sizeof(Players[event.u.net.sender].team),
+                                                               &Players[event.u.net.sender].team);
+                                               } //invalid team
                                                if (Game.started < 2)
                                                        Players[event.u.net.sender].flags |= SCF_paused;
                                                if (!Game.continuous && Game.started >= 2) {
                                                        char data[40];
-                                                       strcpy(data,"Can't join: Game has already started");
+                                                       strcpy(data, "Can't join: Game has already started");
                                                        fprintf(stderr, "- Can't join player #%d in "
                                                                "non-continuous game\n", event.u.net.sender);
                                                        SendPacketTo(event.u.net.sender, 0, NP_error,
@@ -414,21 +438,22 @@ ExtFunc int StartServer(void)
                                                                        - sizeof(Players[0].small),
                                                                        &Players[event.u.net.sender]);
                                                        } //send (to) players
-                                               fprintf(stderr, "> Joined player #%d: %s <%s>\n",
+                                               fprintf(stderr, "> Joined player #%d: %s <%s> (%s)\n",
                                                        event.u.net.sender,
                                                        Players[event.u.net.sender].name,
-                                                       Players[event.u.net.sender].host);
+                                                       Players[event.u.net.sender].host,
+                                                       teams[Players[event.u.net.sender].team]);
                                                if (++playersReady >= minplayers) {
-                                                       if (Game.started)
+                                                       if (Game.started > 1)
                                                                SendPacketTo(event.u.net.sender, 0,
                                                                        NP_start, 0, NULL);
-                                                       else {
+/*                                                     else {
                                                                fprintf(stderr, "* Starting game (%010d)\n",
                                                                        Game.seed);
                                                                for (i = 1; i < MAX_SCREENS; i++)
                                                                        SendPacketTo(i, 0, NP_start, 0, NULL);
                                                                Game.started++;
-                                                       } //first goahead (to all)
+                                                       } //first goahead (to all)*/
                                                } //give go ahead
                                                break; //NP_playerdata
                                        case NP_newPiece:
@@ -442,18 +467,22 @@ ExtFunc int StartServer(void)
                                                //check for unpaused game
                                        case NP_pause:
                                        {
-                                               int paused;
                                                Players[event.u.net.sender].flags ^= SCF_paused;
                                                paused = Game.started < 1;
-                                               for (i = 1; i < MAX_SCREENS; i++) if (Players[i].alive)
-                                                       paused |= Players[i].flags & SCF_paused;
+                                               for (i = 1; i < MAX_SCREENS; i++)
+                                                       if (Players[i].alive > 0)
+                                                               paused |= Players[i].flags & SCF_paused;
+                                               fprintf(stderr, "* Player #%d (un)paused (pause=%d)\n",
+                                                       event.u.net.sender, paused);
                                                if (paused) paused = 1;
-                                               else if (Game.started == 1) Game.started++;
                                                goto sendtoall;
                                        } //NP_pause
                                        default: //relay data to all players
                                        sendtoall:
 //                                             if (event.u.net.type >= NP_pause)
+                                               if (event.u.net.type >= NP_rotright
+                                               && Game.started < 2)
+                                                       break;
                                                for (i = 1; i < MAX_SCREENS; i++)
                                                        if (i != event.u.net.sender)
                                                        if (event.u.net.type != NP_giveJunk ||
@@ -474,20 +503,36 @@ ExtFunc int StartServer(void)
                                break;
                        } //E_connect
                } //event
-               {
-                       int j;
-                       playercount = 0;
-                       for (i = 1; i < MAX_SCREENS; i++) if (Players[i].alive) {
-                               if (Players[i].team < 128) for (j = 1; j < i; j++)
-                                       if (Players[j].alive
-                                       && (Players[j].team == Players[i].team)) {
-                                               playercount--;
-                                               break;
-                                       } //player of same team counted before
-                               playercount++;
-                       } //player alive
-               } //count players
-       } while (Game.started < 2 || playercount > 1 || Game.continuous);
+               CountPlayers();
+               if (Game.started < 1) {
+                       if (playercount > 1) {
+                               fprintf(stderr, "* Game (%010d) ready to start\n", Game.seed);
+                               Game.started++;
+                       } //give goahead
+               } //game not yet started
+               else {
+                       if (playercount < 2) {
+                               fprintf(stderr, "* Stopping game\n");
+                               if (Game.seed) Game.seed++;
+                               if (Game.started > 1) for (i = 1; i < MAX_SCREENS; i++)
+                                       if (Players[i].alive >= 0) {
+                                               Players[i].alive = 1;
+                                               Players[i].flags |= SCF_paused;
+                                               SendPacketTo(i, 0, NP_stop,
+                                                       sizeof(Game.seed), &Game.seed);
+                                       } //transmit game stop and set players not ready
+                               paused = 1;
+                               Game.started = 0;
+                       } //too few players for game
+                       if (Game.started == 1 && !paused) {
+                               Game.started++;
+                               fprintf(stderr, "* Game starts\n");
+                               for (i = 1; i < MAX_SCREENS; i++)
+                                       if (Players[i].alive > 0)
+                                               SendPacketTo(i, 0, NP_start, 0, NULL);
+                       } //everybody ready to start
+               } //game (ready to) start(ed)
+       } while (1);
        fprintf(stderr, "* Exiting server\n");
 } //StartServer
 
@@ -639,6 +684,12 @@ ExtFunc int main(int argc, char **argv)
        Game.maxplayers = 8;
        Game.initspeed = DEFAULT_INTERVAL;
        Game.seed = time(0);
+       {
+               int i;
+
+               for (i = 1; i < MAX_SCREENS; i++)
+                       Players[i].alive = -1;
+       }
 
 //     if (getopt(argc, argv, "f:") == 'f')
 //             ReadConf(optarg);