Index: test6.c
===================================================================
--- test6.c	(revision 655)
+++ test6.c	(revision 656)
@@ -18,12 +18,12 @@
 
 
 #define ROCKET_FIABILITY  5
-#define ROCKET_SPEED	 70
-#define RELOAD_TIME	2.5
+#define ROCKET_SPEED     70
+#define RELOAD_TIME     2.5
 #define PLAYER_SPEED    0.2
-#define PLAYER_JUMP	 20
-#define BULLET_SPEED	 50
-#define BULLET_RATE	 50
+#define PLAYER_JUMP      20
+#define BULLET_SPEED     50
+#define BULLET_RATE      50
 
 #define SOUND_MAX_EXPLOS 4
 char wav_boom[SOUND_MAX_EXPLOS][128]={"xf_boom1.wav","xf_boom2.wav","xf_boom3.wav","xf_boom4.wav"};
@@ -234,8 +234,8 @@
 
 void create_game(char alive)
 {
-#define BREAK_FORCE	130
-#define ROTFRICTION	0.0005
+#define BREAK_FORCE     130
+#define ROTFRICTION     0.0005
 int a;
     
     
@@ -457,32 +457,32 @@
 switch(dir)
     {
     case 1:
-	ptmp=-45;
-	break;
+        ptmp=-45;
+        break;
     case 2:
-	ptmp=0;
-	break;
+        ptmp=0;
+        break;
     case 3:
-	ptmp=45;
-	break;
+        ptmp=45;
+        break;
     case 4:
-	ptmp=-90;
-	break;
+        ptmp=-90;
+        break;
     case 5:
-	speed=0; // stops player
-	break;
+        speed=0; // stops player
+        break;
     case 6:
-	ptmp=90;
-	break;
+        ptmp=90;
+        break;
     case 7:
-	ptmp=-135;
-	break;
+        ptmp=-135;
+        break;
     case 8:
-	ptmp=180;
-	break;
+        ptmp=180;
+        break;
     case 9:
-	ptmp=135;
-	break;
+        ptmp=135;
+        break;
     }
 
 raydium_ode_motor_speed_name("player_react",speed);
ime -> return
+	for(i=0;i<RAYDIUM_NETWORK_MAX_SERVERS;i++)
+	    if(raydium_network_server_list[i].when!=0)
+		if(raydium_network_server_list[i].id==id)
+		    {
+		    raydium_network_server_list[i].when=now;
+		    return(RAYDIUM_NETWORK_DATA_NONE);
+		    }
+
+	memcpy(&version,raydium_network_beacon+dec,sizeof(version));
+	dec+=sizeof(version);
+
+	app_or_mod=raydium_network_beacon+dec;
+	dec+=(strlen(app_or_mod)+1);
+	
+	// else -> id not found -> test game+version
+	if(version != raydium_network_beacon_search.version ||
+	   strcmp(app_or_mod,raydium_network_beacon_search.app_or_mod))
+		return(RAYDIUM_NETWORK_DATA_NONE); // not for us ...
+
+	name=raydium_network_beacon+dec;	
+
+	// true -> search free -> add server
+	slot=-1;
+	for(i=0;i<RAYDIUM_NETWORK_MAX_SERVERS;i++)
+	    if(raydium_network_server_list[i].when==0)
+		slot=i;
+
+	if(slot<0)
+	    {
+	    raydium_log("network: discover: too much server in this LAN ! (max=%i)",RAYDIUM_NETWORK_MAX_SERVERS);
+	    return(RAYDIUM_NETWORK_DATA_NONE);
+	    }
+
+	raydium_network_server_list[slot].id=id;
+	raydium_network_server_list[slot].when=now;
+	strcpy(raydium_network_server_list[slot].name,name);
+	strcpy(raydium_network_server_list[slot].ip,inet_ntoa(((struct sockaddr_in *)(&from))->sin_addr));
 	}
     return(RAYDIUM_NETWORK_DATA_NONE);
     }
@@ -822,6 +884,7 @@
 signed char raydium_network_server_broadcast(char *name, char *app_or_mod, int version)
 {
 int dec=0;
+int id;
 
 if(raydium_network_mode!=RAYDIUM_NETWORK_MODE_SERVER)
     {
@@ -831,16 +894,18 @@
 
 dec=RAYDIUM_NETWORK_PACKET_OFFSET;
 
-if( strlen(name)+strlen(app_or_mod)+dec+sizeof(version) >= 
+if( strlen(name)+strlen(app_or_mod)+dec+sizeof(version)+sizeof(id) >= 
     RAYDIUM_NETWORK_PACKET_SIZE-10)
     {
     raydium_log("network: ERROR: cannot set server attributes: packet's too small");
     return 0;   
     }    
-
+id=rand();
 dec=RAYDIUM_NETWORK_PACKET_OFFSET;
 raydium_network_beacon[dec]=1;
 dec++;
+memcpy(raydium_network_beacon+dec,&id,sizeof(id)); // server id
+dec+=sizeof(id);
 memcpy(raydium_network_beacon+dec,&version,sizeof(version));
 dec+=sizeof(version);
 strcpy(raydium_network_beacon+dec,app_or_mod);
@@ -1048,7 +1113,9 @@
     return(0);
     }
 
-// need to copy game+version somewhere, here
+raydium_network_beacon_search.active=1;
+strcpy(raydium_network_beacon_search.app_or_mod,game);
+raydium_network_beacon_search.version=version;
 raydium_network_mode=RAYDIUM_NETWORK_MODE_DISCOVER;
 setsockopt(raydium_network_socket,SOL_SOCKET,SO_BROADCAST,(char *)&on,sizeof(on));
 raydium_network_set_socket_block(0);
@@ -1057,6 +1124,59 @@
 }
 
 
+// return :
+// -1 : not in discover mode
+// 0 and more : number of broadcasting servers
+int raydium_network_discover_numservers(void)
+{
+int i;
+int cpt=0;
+
+if(raydium_network_mode!=RAYDIUM_NETWORK_MODE_DISCOVER ||
+   !raydium_network_beacon_search.active)
+    return -1;
+
+for(i=0;i<RAYDIUM_NETWORK_MAX_SERVERS;i++)
+    if(raydium_network_server_list[i].when!=0)
+	cpt++;
+
+return cpt;
+}
+
+// "num" starts from 0 to raydium_network_discover_numservers()-1
+// return :
+// -1 : not in discover mode
+// 0 : "num" is invalid
+// 1 : ok
+signed char raydium_network_discover_getserver(int num, char *name, char *ip)
+{
+int i,cpt;
+int slot=-1;
+
+if( raydium_network_mode!=RAYDIUM_NETWORK_MODE_DISCOVER ||
+   !raydium_network_beacon_search.active)
+    return -1;
+
+for(cpt=0,i=0;i<RAYDIUM_NETWORK_MAX_SERVERS;i++)
+    if(raydium_network_server_list[i].when!=0)
+	{
+	if(cpt==num)
+	    {
+	    slot=i;
+	    break;
+	    }
+	cpt++;
+	}
+
+if(slot<0)
+    return 0;
+
+strcpy(name,raydium_network_server_list[slot].name);
+strcpy(ip,raydium_network_server_list[slot].ip);
+return 1;
+}
+
+
 void raydium_network_client_disconnect(void)
 {
 raydium_network_init_sub();
@@ -1280,7 +1400,6 @@
 
     addr = *(struct sockaddr_in *)&ifreqp->ifr_addr;
     strcpy(name,ifreqp->ifr_name);
-    //printf("interface name %s\n", ifreqp->ifr_name);
     //printf("\taddress %s\n", inet_ntoa(addr.sin_addr));
 
     ifreq = *ifreqp;
@@ -1319,14 +1438,10 @@
 
     addr = *(struct sockaddr_in *)&ifreq.ifr_addr;
 
-    //memset(&full_addr, 0, sizeof(full_addr));
     addr.sin_family = AF_INET;
     addr.sin_port=htons(RAYDIUM_NETWORK_PORT);
-    //s.sin_addr.s_addr=htonl(INADDR_BROADCAST); // tagxf
-    //memcpy(&(full_addr.sin_addr),&addr.sin_addr,sizeof(struct in_addr));
     memcpy( &raydium_network_broadcast_interfaces[raydium_network_broadcast_interface_index],
-	    &addr,sizeof(addr));
-    //printf("\tbroadcast address %s\n", inet_ntoa(addr.sin_addr));
+	    &addr,sizeof(addr)); // broadcast address
     strcat(msg,name);
     strcat(msg," ");
     raydium_network_broadcast_interface_index++;