version 0.4
[zeRace] / server.c
index c6da730..047d985 100644 (file)
--- a/server.c
+++ b/server.c
@@ -54,14 +54,14 @@ void announce(char *name,int clients)
   printf("announcing server... ");
   fflush(stdout);
 
-  if(SDLNet_ResolveHost(&ip,"royale.zerezo.com",80)==-1)
+  if (SDLNet_ResolveHost(&ip,"royale.zerezo.com",80)==-1)
   {
     fprintf(stderr,"SDLNet_ResolveHost: %s\n",SDLNet_GetError());
     return;
   }
   
   tcpsock=SDLNet_TCP_Open(&ip);
-  if(!tcpsock)
+  if (!tcpsock)
   {
     fprintf(stderr,"SDLNet_TCP_Open: %s\n",SDLNet_GetError());
     return;
@@ -72,11 +72,12 @@ void announce(char *name,int clients)
   
   len=strlen(temp);
   result=SDLNet_TCP_Send(tcpsock,temp,len);
-  if(result<len)
+  if (result<len)
     fprintf(stderr,"SDLNet_TCP_Send: %s\n", SDLNet_GetError());
   else
     printf("done\n");
-
+  
+  free(temp);
   SDLNet_TCP_Close(tcpsock);
 }
 
@@ -165,10 +166,10 @@ int main(int argc,char *argv[])
     *tmp++=1; /* startup countdown */
     strcpy(tmp,tracklist->name);
     tmp+=strlen(tmp)+1;
-    memcpy(tmp,&time,sizeof(int));
-    tmp+=sizeof(int);
-    memcpy(tmp,&network_speed,sizeof(int));
-    tmp+=sizeof(int);
+    SDLNet_Write32(time,tmp);
+    tmp+=4;
+    SDLNet_Write32(network_speed,tmp);
+    tmp+=4;
     packet->len=(void *)tmp-(void *)packet->data;
     for (i=0;i<MAX_CLIENTS;i++) if (clients[i].connected)
     {
@@ -178,7 +179,8 @@ int main(int argc,char *argv[])
     
     /* wait for everybody startup */
     for (i=0;i<MAX_CLIENTS;i++) if (clients[i].connected) break;
-    if (i!=MAX_CLIENTS) SDL_Delay(5000);
+    /* 5000ms for countdown, and 500ms for loading time... */
+    if (i!=MAX_CLIENTS) SDL_Delay(5500);
     
     printf("go\n");
     
@@ -216,7 +218,7 @@ int main(int argc,char *argv[])
             tmp+=strlen(tmp)+1;
             strcpy(clients[i].pseudo,tmp);
             tmp+=strlen(tmp)+1;
-            memcpy(&clients[i].car.color,tmp,sizeof(int));
+            clients[i].car.color=SDLNet_Read16(tmp);
             clients[i].car.x=tracklist->x;
             clients[i].car.y=tracklist->y;
             clients[i].car.w=30;
@@ -233,10 +235,10 @@ int main(int argc,char *argv[])
             *tmp++=0; /* no startup countdown */
             strcpy(tmp,tracklist->name);
             tmp+=strlen(tmp)+1;
-            memcpy(tmp,&time,sizeof(int));
-            tmp+=sizeof(int);
-            memcpy(tmp,&network_speed,sizeof(int));
-            tmp+=sizeof(int);
+            SDLNet_Write32(time,tmp);
+            tmp+=4;
+            SDLNet_Write32(network_speed,tmp);
+            tmp+=4;
             packet->len=(void *)tmp-(void *)packet->data;
             SDLNet_UDP_Send(udpsock,-1,packet);
             break;
@@ -264,10 +266,11 @@ int main(int argc,char *argv[])
           {
             int temp;
             tmp+=strlen(tmp)+1;
-            memcpy(&temp,tmp,sizeof(int));
-            tmp+=sizeof(int);
-            if (clients[id].lasttime==temp)
+            temp=SDLNet_Read32(tmp);
+            tmp+=4;
+            if (clients[id].lasttime<=temp)
             {
+              tmp+=temp-clients[id].lasttime;
               /* printf("servertime = %d lasttime = %d temp = %d strlen(tmp) = %d\n",time,clients[id].lasttime,temp,strlen(tmp)); */
               /*printf("keys = %s\n",tmp);*/
               while (*tmp)
@@ -298,20 +301,26 @@ int main(int argc,char *argv[])
         tmp=packet->data;
         strcpy(tmp,"positions");
         tmp+=strlen(tmp)+1;
-        memcpy(tmp,&time,sizeof(int));
-        tmp+=sizeof(int); /* for server time */
-        tmp+=sizeof(int); /* for client time */
-        tmp+=sizeof(int); /* for number of cars */
+        SDLNet_Write32(time,tmp);
+        tmp+=4; /* for server time */
+        tmp+=4; /* for client time */
+        tmp+=2; /* for number of cars */
         nb=0;
         for (j=0;j<MAX_CLIENTS;j++) if (j!=i && clients[j].connected)
         {
-          memcpy(tmp,&clients[j].car,sizeof(struct _car));
-          tmp+=sizeof(struct _car);
+          SDLNet_Write16(clients[j].car.x,tmp);
+          tmp+=2;
+          SDLNet_Write16(clients[j].car.y,tmp);
+          tmp+=2;
+          SDLNet_Write16(clients[j].car.angle*1000,tmp);
+          tmp+=2;
+          SDLNet_Write16(clients[j].car.color,tmp);
+          tmp+=2;
           nb++;
         }
-        memcpy(packet->data+strlen("positions")+1+sizeof(int)+sizeof(int),&nb,sizeof(int));
+        SDLNet_Write16(nb,packet->data+strlen("positions")+1+4+4);
+        SDLNet_Write32(clients[i].lasttime,packet->data+strlen("positions")+1+4);
         packet->len=(void *)tmp-(void *)packet->data;
-        memcpy(packet->data+strlen("positions")+1+sizeof(int),&clients[i].lasttime,sizeof(int));
         packet->address=clients[i].address;
         SDLNet_UDP_Send(udpsock,-1,packet);
       }
@@ -329,7 +338,7 @@ int main(int argc,char *argv[])
     tmp=packet->data;
     strcpy(tmp,"finish");
     tmp+=strlen(tmp)+1;
-    tmp+=sizeof(int); /* space for number */
+    tmp+=2; /* space for number */
     nb=0;
     for (i=0;i<10;i++)
     {
@@ -343,14 +352,14 @@ int main(int argc,char *argv[])
       {
         sprintf(tmp,"%s : %d",clients[best_id].pseudo,best_sc);
         tmp+=strlen(tmp)+1;
-        memcpy(tmp,&clients[best_id].car.color,sizeof(int));
-        tmp+=sizeof(int);
+        SDLNet_Write16(clients[best_id].car.color,tmp);
+        tmp+=2;
         clients[best_id].car.lap=-1;
         nb++;
         printf("top %d : %s - %d\n",nb,clients[best_id].pseudo,best_sc);
       }
     }
-    memcpy(packet->data+strlen("finish")+1,&nb,sizeof(int));
+    SDLNet_Write16(nb,packet->data+strlen("finish")+1);
     packet->len=(void *)tmp-(void *)packet->data;
     for (i=0;i<MAX_CLIENTS;i++) if (clients[i].connected)
     {
@@ -358,7 +367,8 @@ int main(int argc,char *argv[])
       SDLNet_UDP_Send(udpsock,-1,packet);
     }
     SDL_Delay(5000);
-  
+    
+    SDL_FreeSurface(fun);
     tracklist=tracklist->next;
   }