#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' },
{ 0, 0, 0, 0 }
};
+static char Connections = 2;
+
static char *gameNames[GT_len] = { "OnePlayer", "ClassicTwo" };
ExtFunc MyEventType NetGenFunc(EventGenRec *gen, MyEvent *event);
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));
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:
{ //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
// 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
{
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);
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();
// WriteConf();
Header();
- StartServer(portStr);
+ WaitForConnection(port);
+ StartServer();
return 0;
}