X-Git-Url: http://git.shiar.nl/netris.git/blobdiff_plain/b9be7d416f4550cd6c6d98228d8a61e4c61e2901..111faa2a586338771d8193bcc9f4f109f9ba8adf:/server.c diff --git a/server.c b/server.c index 39a28a0..70406a3 100644 --- a/server.c +++ b/server.c @@ -21,6 +21,7 @@ #include "netris.h" #include +#include #include #include #include @@ -32,6 +33,7 @@ #include #include "util.h" +#include "msg.h" #define HEADER_SIZE sizeof(netint4[3]) @@ -57,7 +59,7 @@ static char verbose = 0; struct sockaddr_in addr; -MyEventType NetGenFunc(EventGenRec *gen, MyEvent *event); +static MyEventType NetGenFunc(EventGenRec *gen, MyEvent *event); static EventGenRec netGen[MAX_SCREENS] = { { NULL, 0, FT_read, -1, NetGenFunc, EM_net, 0, "\0", 0, HEADER_SIZE } }; @@ -77,19 +79,19 @@ static EventGenRec *nextGen = &alarmGen; static sigjmp_buf close_env; -void SendPacketTo(short playa, short uid, NetPacketType type, int size, void *data) +static void SendPacketTo(short player, short uid, NetPacketType type, int size, void *data) { //send to someone netint4 header[3]; - if (netGen[playa].fd >= 0) { + if (netGen[player].fd >= 0) { if (verbose) - fprintf(stderr, ": send %d from %d to %d\n", type, uid, playa); + fprintf(stderr, MSG_SERVER_DBG_SEND "\n", type, uid, player); header[0] = hton4(uid); header[1] = hton4(type); header[2] = hton4(size + HEADER_SIZE); - if (MyWrite(netGen[playa].fd, header, HEADER_SIZE) != HEADER_SIZE) + if (MyWrite(netGen[player].fd, header, HEADER_SIZE) != HEADER_SIZE) die("write (header)"); - if (size > 0 && data && MyWrite(netGen[playa].fd, data, size) != size) + if (size > 0 && data && MyWrite(netGen[player].fd, data, size) != size) die("write"); } } @@ -99,33 +101,33 @@ static MyEventType AlarmGenFunc(EventGenRec *gen, MyEvent *event) return E_alarm; } -void SCloseNet(short playa) +static void SCloseNet(short player) { //kick some connection's ass! MyEvent event; - if (netGen[playa].fd >= 0) { - if (Players[playa].alive >= 0) { - SendPacketTo(playa, 0, NP_endConn, 0, NULL); + if (netGen[player].fd >= 0) { + if (Players[player].alive >= 0) { + SendPacketTo(player, 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; + close(netGen[player].fd); + netGen[player].fd = -1; } - if (netGen[playa].next) - RemoveEventGen(&netGen[playa]); + if (netGen[player].next) + RemoveEventGen(&netGen[player]); } -void CloseNets(void) +static void CloseNets(void) { //nou oogjes dicht en snaveltjes toe int i; - fprintf(stderr, "- Closing connections...\n"); + fprintf(stderr, MSG_SERVER_CLOSE_ALL "\n"); for (i = 1; i < MAX_SCREENS; i++) - SCloseNet(i); //bye everybuddy - fprintf(stderr, "* All Done\n\n"); + SCloseNet(i); // bye everybuddy + fprintf(stderr, MSG_SERVER_CLOSE_ALL_DONE "\n\n"); } -MyEventType NetGenFunc(EventGenRec *gen, MyEvent *event) +static MyEventType NetGenFunc(EventGenRec *gen, MyEvent *event) { //receive int result; short uid, type, size; @@ -134,14 +136,14 @@ MyEventType NetGenFunc(EventGenRec *gen, MyEvent *event) result = MyRead(gen->fd, gen->buf + gen->bufSize, gen->bufGoal - gen->bufSize); if (result < 0) { - fprintf(stderr, "- Closed connection to player #%d\n", gen->player); + fprintf(stderr, MSG_SERVER_PLAYER_CLOSED "\n", gen->player); return E_lostConn; } gen->bufSize += result; if (gen->bufSize < gen->bufGoal) return E_none; // *ugly* memcpy(data, gen->buf, sizeof(data)); - uid = ntoh4(data[0]); + uid = ntoh4(data[0]); type = ntoh4(data[1]); size = ntoh4(data[2]); gen->bufGoal = size; @@ -155,7 +157,7 @@ MyEventType NetGenFunc(EventGenRec *gen, MyEvent *event) event->u.net.size = size - HEADER_SIZE; event->u.net.data = gen->buf + HEADER_SIZE; if (type == NP_endConn) { - fprintf(stderr, "- Quit player #%d\n", gen->player); + fprintf(stderr, MSG_SERVER_PLAYER_QUIT "\n", gen->player); return E_lostConn; } //client sent quit signal return E_net; @@ -173,10 +175,11 @@ static MyEventType ConnGenFunc(EventGenRec *gen, MyEvent *event) if (netGen[new].fd < 0) break; if (new > maxplayers) return; - if ((netGen[new].fd = - accept(gen->fd, (struct sockaddr *)&addr, &addrLen)) < 0) - die("accept"); - fprintf(stderr, "+ Connection: %s\n", inet_ntoa(addr.sin_addr)); + if (( + netGen[new].fd = accept(gen->fd, (struct sockaddr *)&addr, &addrLen) + ) < 0) + die("accept"); + fprintf(stderr, MSG_SERVER_CONNECT "\n", inet_ntoa(addr.sin_addr)); val2.l_onoff = 1; val2.l_linger = 0; setsockopt(netGen[new].fd, SOL_SOCKET, SO_LINGER,(void *)&val2, @@ -188,8 +191,9 @@ static MyEventType ConnGenFunc(EventGenRec *gen, MyEvent *event) sprintf(Players[new].host, "%s", inet_ntoa(addr.sin_addr)); if (addr.sin_family == AF_INET) { - host = gethostbyaddr((void *)&addr.sin_addr, - sizeof(struct in_addr), AF_INET); + host = gethostbyaddr( + (void *)&addr.sin_addr, sizeof(struct in_addr), AF_INET + ); if (host) { strncpy(Players[new].host, host->h_name, sizeof(Players[new].host) - 1); @@ -200,31 +204,28 @@ static MyEventType ConnGenFunc(EventGenRec *gen, MyEvent *event) return E_connect; } -void CountPlayers(void) +static 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--; + if (Players[i].team < 128) for (j = 1; j < i; j++) { + if (Players[j].alive > 0 && Players[j].team == Players[i].team) { + playercount--; // player of same team counted before break; - } //player of same team counted before + } + } playercount++; } //player alive } -int StartServer(void) +static int StartServer(void) { MyEvent event; netint2 currentpiece[MAX_SCREENS]; int playersReady = 0; - int paused = 1; + bool paused = 1; int i; - char teams[10][7] = { - "", "Green", "Cyan", "Blue", "Purple", - "Red", "Grey", "White", "*Orange" - }; do { switch (WaitMyEvent(&event, EM_any)) { @@ -238,7 +239,7 @@ int StartServer(void) SCloseNet(event.u.net.sender); break; //NP_endConn case E_net: - if (verbose) fprintf(stderr, ": %d sent %d\n", + if (verbose) fprintf(stderr, MSG_SERVER_DBG_RECV "\n", netGen[event.u.net.sender].fd, event.u.net.type); switch(event.u.net.type) { case NP_hello: @@ -249,8 +250,7 @@ int StartServer(void) int major; int protocolVersion; - memcpy(versiondata, event.u.net.data, - sizeof(versiondata)); + memcpy(versiondata, event.u.net.data, sizeof(versiondata)); major = ntoh4(versiondata[0]); protocolVersion = ntoh4(versiondata[1]); if (major != MAJOR_VERSION @@ -258,13 +258,13 @@ int StartServer(void) snprintf(data, sizeof(data), "Version mismatch: received %d.%d", major, protocolVersion); - fprintf(stderr, "= Wrong version player #%d (%s)\n", + fprintf(stderr, MSG_SERVER_PLAYER_EVERSION "\n", event.u.net.sender, data); SendPacketTo(event.u.net.sender, 0, NP_error, strlen(data)+1, data); SCloseNet(event.u.net.sender); } //version mismatch - fprintf(stderr, "* Accepted player #%d\n", + fprintf(stderr, MSG_SERVER_PLAYER_ACCEPT "\n", event.u.net.sender); break; } //NP_hello @@ -273,14 +273,14 @@ int StartServer(void) memcpy(&Players[event.u.net.sender], event.u.net.data, event.u.net.size); if (Players[event.u.net.sender].team < 1 - || Players[event.u.net.sender].team > 7) { + || Players[event.u.net.sender].team > 7) { int team; for (team = 1; team < 7; team++) { for (i = 1; i < MAX_SCREENS; i++) - if ((Players[i].alive > 0) && (Players[i].team == team)) + if (Players[i].alive > 0 && Players[i].team == team) break; //team in use - if (i==MAX_SCREENS) break; + if (i == MAX_SCREENS) break; } //find unused team Players[event.u.net.sender].team = team; SendPacketTo(event.u.net.sender, event.u.net.sender, NP_team, @@ -292,8 +292,8 @@ int StartServer(void) if (!Game.continuous && Game.started >= 2) { char data[40]; 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); + fprintf(stderr, MSG_SERVER_PLAYER_JOIN_ESTARTED, + event.u.net.sender); SendPacketTo(event.u.net.sender, 0, NP_error, strlen(data)+1, data); // SCloseNet(event.u.net.sender, 0); @@ -306,30 +306,31 @@ int StartServer(void) int started; //2 int continuous; //3 long seed; //4 + float shapes[7]; int initspeed; //5 } data; memcpy(&data, &Players[event.u.net.sender].flags, sizeof(data.playerflags)); - memcpy(&data.gravity, &Game, + memcpy(&data.gravity, &Game.gravity, sizeof(data) - sizeof(data.playerflags)); SendPacketTo(event.u.net.sender, 0, NP_gamedata, sizeof(data), &data); } //send game options for (i = 1; i < MAX_SCREENS; i++) if (netGen[i].fd >= 0 && i != event.u.net.sender) { - SendPacketTo(event.u.net.sender, i, - NP_newPlayer, sizeof(_Player), &Players[i]); + SendPacketTo(event.u.net.sender, i, NP_newPlayer, + sizeof(player_t), &Players[i]); SendPacketTo(event.u.net.sender, i, NP_newPiece, sizeof(Players[i].curShape), &Players[i].curShape); SendPacketTo(i, event.u.net.sender, NP_newPlayer, - sizeof(_Player), &Players[event.u.net.sender]); + sizeof(player_t), &Players[event.u.net.sender]); } //send (to) players - fprintf(stderr, "> Joined player #%d: %s <%s> (%s)\n", + fprintf(stderr, MSG_SERVER_PLAYER_JOIN "\n", event.u.net.sender, Players[event.u.net.sender].name, Players[event.u.net.sender].host, - teams[Players[event.u.net.sender].team]); + teamname[Players[event.u.net.sender].team]); if (++playersReady >= minplayers) { if (Game.started > 1) SendPacketTo(event.u.net.sender, 0, @@ -349,7 +350,7 @@ int StartServer(void) goto sendtoall; case NP_argghhh: Players[event.u.net.sender].alive = 0; - fprintf(stderr, "< Player #%d died\n", + fprintf(stderr, MSG_SERVER_PLAYER_DIE "\n", event.u.net.sender); //check for unpaused game case NP_pause: @@ -358,10 +359,9 @@ int StartServer(void) paused = Game.started < 1; 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", + paused |= (Players[i].flags & SCF_paused) != 0; + fprintf(stderr, MSG_SERVER_PLAYER_PAUSE "\n", event.u.net.sender, paused); - if (paused) paused = 1; goto sendtoall; } //NP_pause default: //relay data to all players @@ -372,8 +372,8 @@ int StartServer(void) break; for (i = 1; i < MAX_SCREENS; i++) if (i != event.u.net.sender) - if (event.u.net.type != NP_giveJunk || - Players[i].team != Players[event.u.net.sender].team) + 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); @@ -392,28 +392,29 @@ int StartServer(void) } //event CountPlayers(); if (Game.started < 1) { - if (playercount > 1) { - fprintf(stderr, "* Game (%010d) ready to start\n", Game.seed); + if (playercount >= 2) { + fprintf(stderr, MSG_SERVER_GAME_READY "\n", Game.seed); Game.started++; } //give goahead } //game not yet started else { if (playercount < 2) { - fprintf(stderr, "* Stopping game\n"); + fprintf(stderr, MSG_SERVER_GAME_STOP "\n"); if (Game.seed) Game.seed++; - if (Game.started > 1) for (i = 1; i < MAX_SCREENS; i++) + 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"); + fprintf(stderr, MSG_SERVER_GAME_START "\n"); for (i = 1; i < MAX_SCREENS; i++) if (Players[i].alive > 0) SendPacketTo(i, 0, NP_start, 0, NULL); @@ -424,14 +425,12 @@ int StartServer(void) } -void SHeader(void) +static void SHeader(void) { - fprintf(stderr, - "NETRIS Server %s\t(c) 2002 Shiar \n\n", - version_string); + fprintf(stderr, MSG_SERVER_TITLE "\n\n", version_string); } -void SUsage(void) +static void SUsage(void) { SHeader(); fprintf(stderr, @@ -440,33 +439,19 @@ void SUsage(void) " -h, --help\t\tPrint this usage information\n" " -H, --info\t\tShow distribution and warranty information\n" "\n" - " -p, --port \tSet port number (default is %d)\n" + " -p, --port %d\tSet port number\n" "\n" " -s, --seed \tStart with given random seed\n" - " -i, --speed \tSet the initial step-down interval, in seconds\n" - " -m, --min-players <2>\tNumber of players required before starting the game\n" - " -x, --max-players <8>\tMaximum number of players allowed in the game\n" + " -i, --speed %.2f\tSet the initial step-down interval, in seconds\n" + " -m, --min-players %d\tNumber of players required before starting the game\n" + " -x, --max-players %d\tMaximum number of players allowed in the game\n" " -c, --continuous\tDon'n quit the game\n" - "\n", DEFAULT_PORT); -} - -void WriteConf(void) -{ - FILE *file_out; - - file_out = fopen(CONFIG_FILE, "w"); - if (file_out == NULL) { - perror("Error writing config file"); - exit(1); - } - - fprintf(file_out, "### NETRIS %s Config file ###\n\n", version_string); - - fclose(file_out); - fprintf(stderr, "Wrote new game configuration to %s\n", CONFIG_FILE); + "\n", + DEFAULT_PORT, DEFAULT_INTERVAL/1e6, minplayers, maxplayers + ); } -void HandleOption(char tag, char *value) +static void HandleOption(char tag, char *value) { switch (tag) { case 'v': //verbose @@ -482,9 +467,7 @@ void HandleOption(char tag, char *value) minplayers = atoi(value); break; case 'x': //max-players - maxplayers = atoi(value); - if (maxplayers >= MAX_SCREENS) - maxplayers = MAX_SCREENS; + maxplayers = MIN(atoi(value), MAX_SCREENS); break; case 'q': //quadra-style gravity Game.gravity ^= 1; @@ -497,15 +480,17 @@ void HandleOption(char tag, char *value) break; case 'H': //info SHeader(); - DistInfo(); exit(0); + DistInfo(); + exit(0); case 'h': //help - SUsage(); exit(0); + SUsage(); + exit(0); default: break; } } -void ReadConf(char *filename) +static void ReadConf(char *filename) { FILE *file_in; char buf[513]; @@ -540,13 +525,14 @@ void ReadConf(char *filename) } -void CatchInt(int sig) +static void CatchInt(int sig) { siglongjmp(close_env, 1); } int main(int argc, char **argv) { + int i; char ch; if (sigsetjmp(close_env, 1)) exit(0); @@ -555,6 +541,8 @@ int main(int argc, char **argv) maxplayers = 8; Game.initspeed = DEFAULT_INTERVAL; Game.seed = time(0); + for (i = 0; i < sizeof(Game.shapes) / sizeof(Game.shapes[0]); i++) + Game.shapes[i] = 1; Game.gravity = 0; { int i;