4 #define MAXRECORDKEYS 9999
7 struct _tracklist *tracklist;
12 char pseudo[MAXLINELENGTH];
13 char url[MAXLINELENGTH];
22 } config = {"anonymous","",0,0,1,SDLK_UP,SDLK_DOWN,SDLK_LEFT,SDLK_RIGHT,6};
24 /* full script for a lap */
27 float x,y,angle,speed;
28 char keys[MAXRECORDKEYS];
33 UDPsocket udpsock=NULL;
39 /* exit the game and clean */
49 /* initialize the game */
52 /* do a clean exit in case of emergency */
53 signal(SIGINT,zeRace_exit);
54 signal(SIGTERM,zeRace_exit);
56 /* get the list of local tracks */
57 if (!zeRace_get_tracks(&tracklist)) zeRace_exit();
61 /* robot configuration */
62 sprintf(config.pseudo,"\"%s\" bot(%d)",bot_name(),aleas);
63 config.color=rand()%16;
67 fprintf(stderr,"could not initialize SDL : %s\n",SDL_GetError());
72 if (SDLNet_Init()==-1)
74 fprintf(stderr,"could not initialize SDLNet : %s\n",SDLNet_GetError());
78 packet=SDLNet_AllocPacket(1024);
81 fprintf(stderr,"SDLNet_AllocPacket: %s\n",SDLNet_GetError());
87 /* launch a new race */
88 void zeRace_launch(int alltime,int go)
90 SDL_Surface *cir,*fun;
91 int ku=0,kd=0,kl=0,kr=0,i;
97 cir=IMG_Load(tracklist->full);
98 fun=IMG_Load(tracklist->function);
101 car.angle=tracklist->a*2*M_PI/360;
102 car.ox=car.x=tracklist->x;
103 car.oy=car.y=tracklist->y;
109 /* startup countdown */
113 if (i!=-1) SDL_Delay(1000);
120 bot_ia(tracklist->name,&car,fun,&ku,&kd,&kl,&kr);
122 /* random movement if asked */
123 if (aleas) if (rand()%aleas==0)
133 net.keys[net.time]=(ku<<3 | kd<<2 | kl<<1 | kr)+'A';
134 net.keys[net.time+1]='\0';
138 move_car(&car,(ku<<3 | kd<<2 | kl<<1 | kr),fun);
141 /* if we are in network mode */
145 while (SDLNet_UDP_Recv(udpsock,packet)) if (strcmp(packet->data,"positions")==0)
147 int servertime,clienttime,nb;
148 servertime=SDLNet_Read32(packet->data+strlen("positions")+1);
149 clienttime=SDLNet_Read32(packet->data+strlen("positions")+1+4);
150 nb=SDLNet_Read16(packet->data+strlen("positions")+1+4+4);
151 if (clienttime>lastack)
153 memcpy(net.keys,net.keys+clienttime-lastack,net.time+1);
154 net.time-=clienttime-lastack;
155 if (clienttime>servertime+5) delay+=DELAY;
156 if (clienttime<servertime-5) delay-=DELAY;
157 if (delay<0) delay=0;
161 else if (strcmp(packet->data,"collision")==0)
165 lastack=SDLNet_Read32(packet->data+strlen("collision")+1);
166 car.x=(float)SDLNet_Read32(packet->data+strlen("collision")+1+4)/65536-100;
167 car.y=(float)SDLNet_Read32(packet->data+strlen("collision")+1+4+4)/65536-100;
168 car.speed=(float)SDLNet_Read32(packet->data+strlen("collision")+1+4+4+4)/65536-100;
169 car.angle=(float)SDLNet_Read32(packet->data+strlen("collision")+1+4+4+4+4)/65536-100;
171 else /* end of this network race */
173 SDL_FreeSurface(cir);
174 SDL_FreeSurface(fun);
177 if (strlen(net.keys)!=0)
182 SDLNet_Write32(lastack,tmp);
184 SDLNet_Write32(car.x,tmp);
186 SDLNet_Write32(car.y,tmp);
188 strcpy(tmp,net.keys);
190 packet->len=(void *)tmp-(void *)packet->data+10;
191 if (net.time%network_speed==0) if (!SDLNet_UDP_Send(udpsock,-1,packet))
193 fprintf(stderr,"SDLNet_UDP_Send: %s\n",SDLNet_GetError());
199 /* let the system breath */
204 if (udpsock && net.time>MAX_LAG)
206 fprintf(stderr,"timeout !\n");
207 SDL_FreeSurface(cir);
208 SDL_FreeSurface(fun);
216 /* connect to a server */
217 void zeRace_connect(char *host,int port)
221 udpsock=SDLNet_UDP_Open(0);
224 fprintf(stderr,"SDLNet_UDP_Open: %s\n",SDLNet_GetError());
227 SDLNet_ResolveHost(&packet->address,host,port);
229 strcpy(tmp,"connect");
231 strcpy(tmp,config.pseudo);
233 SDLNet_Write16(config.color,tmp);
235 packet->len=(void *)tmp-(void *)packet->data;
236 SDLNet_UDP_Send(udpsock,-1,packet);
238 while (SDLNet_UDP_Recv(udpsock,packet) || lag<MAX_LAG)
241 if (strcmp(tmp,"track")==0)
243 struct _tracklist *loopcheck=tracklist;
248 printf("server asked for track : %s\n",tmp);
249 do if (strcmp(tracklist->name,tmp)==0) break; else tracklist=tracklist->next; while (tracklist!=loopcheck);
250 if (strcmp(tracklist->name,tmp)!=0)
252 fprintf(stderr,"unknown track : %s\n",tmp);
256 time=SDLNet_Read32(tmp);
258 network_speed=SDLNet_Read32(tmp);
259 zeRace_launch(time,go);
260 if (strcmp(packet->data,"finish")==0) SDL_Delay(5000);
266 SDLNet_UDP_Close(udpsock);
272 int main(int argc,char *argv[])
274 if (argc!=4) { fprintf(stderr,"Usage : %s host port random\n host : host or ip of the server to connect to\n port : port number of the server to connect to\n random : frequency of random moves (0 = no random moves, 1 = only random, 1000 = 1/1000 random moves)\n",argv[0]); exit(1); }
277 zeRace_connect(argv[1],atoi(argv[2]));