summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/client.c23
-rw-r--r--src/net_multiplayer.c1
-rw-r--r--src/proto.c79
-rw-r--r--src/screen_world.c2
-rw-r--r--src/server.c15
-rw-r--r--src/tux.c29
-rw-r--r--src/udp.c1
7 files changed, 138 insertions, 12 deletions
diff --git a/src/client.c b/src/client.c
index 530c0f3..dc9d324 100644
--- a/src/client.c
+++ b/src/client.c
@@ -18,6 +18,7 @@ static int protocolType;
static sock_tcp_t *sock_server_tcp;
static sock_udp_t *sock_server_udp;
static buffer_t *clientBuffer;
+static Uint32 lastPing;
static void initClient()
{
@@ -34,7 +35,7 @@ int initTcpClient(char *ip, int port)
return -1;
}
- printf("connect %s %d\n", ip, port);
+ printf("connect TCP %s %d\n", ip, port);
protocolType = NET_PROTOCOL_TYPE_TCP;
initClient();
@@ -50,8 +51,9 @@ int initUdpClient(char *ip, int port)
return -1;
}
- printf("connect %s %d\n", ip, port);
+ printf("connect UDP %s %d\n", ip, port);
protocolType = NET_PROTOCOL_TYPE_UDP;
+ lastPing = SDL_GetTicks();
initClient();
return 0;
@@ -143,6 +145,8 @@ void eventServerBuffer()
if( strncmp(line, "newtux", 6) == 0 )proto_recv_newtux_client(line);
if( strncmp(line, "deltux", 6) == 0 )proto_recv_deltux_client(line);
if( strncmp(line, "additem", 7) == 0 )proto_recv_additem_client(line);
+ if( strncmp(line, "kill", 4) == 0 )proto_recv_kill_client(line);
+ if( strncmp(line, "score", 5) == 0 )proto_recv_score_client(line);
if( strncmp(line, "end", 3) == 0 )proto_recv_end_client(line);
}
}
@@ -168,12 +172,27 @@ void selectClientTcpSocket()
}
}
+void eventPingServer()
+{
+ Uint32 currentTime;
+
+ currentTime = SDL_GetTicks();
+
+ if( currentTime - lastPing > CLIENT_TIMEOUT )
+ {
+ proto_send_ping_client();
+ lastPing = SDL_GetTicks();
+ }
+}
+
void selectClientUdpSocket()
{
fd_set readfds;
struct timeval tv;
int max_fd;
+ eventPingServer();
+
tv.tv_sec = 0;
tv.tv_usec = 0;
diff --git a/src/net_multiplayer.c b/src/net_multiplayer.c
index cbf9cb8..c8f8965 100644
--- a/src/net_multiplayer.c
+++ b/src/net_multiplayer.c
@@ -121,6 +121,7 @@ void eventNetMultiplayer()
eventServerBuffer();
break;
case NET_PROTOCOL_TYPE_UDP :
+ eventPingServer();
selectClientUdpSocket();
eventServerBuffer();
break;
diff --git a/src/proto.c b/src/proto.c
index 2c2c5c4..ddfc51c 100644
--- a/src/proto.c
+++ b/src/proto.c
@@ -193,6 +193,66 @@ void proto_recv_newtux_client(char *msg)
tux->status = TUX_STATUS_ALIVE;
}
+void proto_send_kill_server(tux_t *tux)
+{
+ char msg[STR_SIZE];
+
+ assert( tux != NULL );
+
+ sprintf(msg, "kill %d\n", tux->id);
+
+ sendAllClient(msg);
+}
+
+void proto_recv_kill_client(char *msg)
+{
+ char cmd[STR_SIZE];
+ int id;
+ tux_t *tux;
+
+ assert( msg != NULL );
+
+ sscanf(msg, "%s %d", cmd, &id);
+
+ tux = getTuxID(getWorldArena()->listTux, id);
+
+ if( tux != NULL )
+ {
+ eventTuxIsDead(tux);
+ }
+}
+
+void proto_send_score_server(tux_t *tux)
+{
+ char msg[STR_SIZE];
+
+ assert( tux != NULL );
+
+ sprintf(msg, "score %d %d\n", tux->id, tux->score);
+
+ sendAllClient(msg);
+}
+
+void proto_recv_score_client(char *msg)
+{
+ char cmd[STR_SIZE];
+ int id, score;
+ tux_t *tux;
+
+ assert( msg != NULL );
+
+ sscanf(msg, "%s %d %d", cmd, &id, &score);
+
+ tux = getTuxID(getWorldArena()->listTux, id);
+
+ if( tux != NULL )
+ {
+ tux->score = score;
+ }
+
+ countRoundInc();
+}
+
void proto_send_deltux_server(client_t *client)
{
char msg[STR_SIZE];
@@ -293,19 +353,34 @@ void proto_recv_context_server(client_t *client, char *msg)
proto_send_newtux_server(NULL, client->tux);
}
+void proto_send_ping_client()
+{
+ char msg[STR_SIZE];
+ strcpy(msg, "ping\n");
+ sendServer(msg);
+}
+
+void proto_recv_ping_server(client_t *client, char *msg)
+{
+ assert( msg != NULL );
+ assert( client != NULL );
+
+ client->lastPing = SDL_GetTicks();
+}
+
void proto_send_end_client()
{
char msg[STR_SIZE];
strcpy(msg, "end\n");
sendServer(msg);
- printf("proto_send_end_client\n");
}
void proto_recv_end_server(client_t *client, char *msg)
{
assert( msg != NULL );
+ assert( client != NULL );
+
client->status = NET_STATUS_ZOMBIE;
- printf("proto_recv_end_server\n");
}
void proto_send_end_server()
diff --git a/src/screen_world.c b/src/screen_world.c
index 068ac08..fb9a559 100644
--- a/src/screen_world.c
+++ b/src/screen_world.c
@@ -104,9 +104,11 @@ void countRoundInc()
}
count++;
+ printf("count %d\n", count);
if( count >= max_count )
{
+ printf("count %d ending\n", count);
playSound("end", SOUND_GROUP_BASE);
addTimer(timer_endArena, NULL, TIMER_END_ARENA);
}
diff --git a/src/server.c b/src/server.c
index 419990d..6ff8491 100644
--- a/src/server.c
+++ b/src/server.c
@@ -34,7 +34,7 @@ int initTcpServer(int port)
initServer();
- printf("server listen port %d\n", port);
+ printf("server listen TCP port %d\n", port);
return 0;
}
@@ -52,7 +52,7 @@ int initUdpServer(int port)
initServer();
- printf("server listen port %d\n", port);
+ printf("server listen UDP port %d\n", port);
return 0;
}
@@ -68,6 +68,7 @@ static client_t* newAnyClient()
new->buffer = newBuffer(LIMIT_BUFFER);
new->tux = newTux();
new->tux->control = TUX_CONTROL_NET;
+ new->lastPing = SDL_GetTicks();
addList(getWorldArena()->listTux, new->tux);
return new;
@@ -269,6 +270,7 @@ static void eventClientBuffer(client_t *client)
if( strncmp(line, "hello", 5) == 0 )proto_recv_hello_server(client, line);
if( strncmp(line, "event", 5) == 0 )proto_recv_event_server(client, line);
if( strncmp(line, "context", 7) == 0 )proto_recv_context_server(client, line);
+ if( strncmp(line, "ping", 4) == 0 )proto_recv_ping_server(client, line);
if( strncmp(line, "end", 3) == 0 )proto_recv_end_server(client, line);
}
}
@@ -357,12 +359,21 @@ static client_t* findUdpClient(sock_udp_t *sock_udp)
static void delZombieCLient()
{
client_t *thisClient;
+ Uint32 currentTime;
int i;
+ currentTime = SDL_GetTicks();
+
for( i = 0 ; i < listClient->count; i++)
{
thisClient = (client_t *) listClient->list[i];
+ if( currentTime - thisClient->lastPing > SERVER_TIMEOUT )
+ {
+ printf("client ping timeout\n");
+ thisClient->status = NET_STATUS_ZOMBIE;
+ }
+
if( thisClient->status == NET_STATUS_ZOMBIE )
{
proto_send_deltux_server(thisClient);
diff --git a/src/tux.c b/src/tux.c
index a39c3d2..b007a93 100644
--- a/src/tux.c
+++ b/src/tux.c
@@ -346,7 +346,8 @@ void eventTuxIsDead(tux_t *tux)
return;
}
- playSound("dead", SOUND_GROUP_BASE);
+ playSound("dead", SOUND_GROUP_BASE);
+ printf("tux id %d is dead\n", tux->id);
tux->status = TUX_STATUS_DEAD;
memset(tux->shot, 0, sizeof(int) * GUN_COUNT);
@@ -364,11 +365,22 @@ void eventTuxIsDead(tux_t *tux)
{
addTimer(timer_spawnTux, newInt(tux->id), TUX_TIME_SPAWN );
}
+
+ if( getNetTypeGame() == NET_GAME_TYPE_SERVER )
+ {
+ proto_send_kill_server(tux);
+ }
}
static void eventTuxIsDeadWIthShot(tux_t *tux, shot_t *shot)
{
shot->author->score++;
+
+ if( getNetTypeGame() == NET_GAME_TYPE_SERVER )
+ {
+ proto_send_score_server(shot->author);
+ }
+
countRoundInc();
eventTuxIsDead(tux);
}
@@ -378,10 +390,14 @@ void tuxTeleport(tux_t *tux)
int x, y;
playSound("teleport", SOUND_GROUP_BASE);
+ printf("tux id %d teleporting\n", tux->id);
+
+ if( getNetTypeGame() != NET_GAME_TYPE_CLIENT )
+ {
+ findFreeSpace(&x, &y, TUX_WIDTH, TUX_HEIGHT);
+ setTuxProportion(tux, x, y);
+ }
- findFreeSpace(&x, &y, TUX_WIDTH, TUX_HEIGHT);
- setTuxProportion(tux, x, y);
-
if( getNetTypeGame() == NET_GAME_TYPE_SERVER )
{
proto_send_newtux_server(NULL, tux);
@@ -420,7 +436,10 @@ void eventConflictTuxWithShot(list_t *listTux, list_t *listShot)
continue;
}
- eventTuxIsDeadWIthShot(thisTux, thisShot);
+ if( getNetTypeGame() != NET_GAME_TYPE_CLIENT )
+ {
+ eventTuxIsDeadWIthShot(thisTux, thisShot);
+ }
}
delListItem(listShot, i, destroyShot);
diff --git a/src/udp.c b/src/udp.c
index 0f86dc6..ee8a216 100644
--- a/src/udp.c
+++ b/src/udp.c
@@ -62,7 +62,6 @@ sock_udp_t* bindUdpSocket(int port)
return NULL;
}
-
return new;
}