X-Git-Url: http://git.shiar.nl/netris.git/blobdiff_plain/e3d58186949bfcdb149cc2a545ce6c14a8689268..21add7c13bc1df386e45aad2939ee5ff2a152c2b:/server.c?ds=sidebyside diff --git a/server.c b/server.c index 7e0aca1..9297b13 100644 --- a/server.c +++ b/server.c @@ -33,13 +33,11 @@ #include #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; }