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()%12;
65 if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO)<0)
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 /* if we are in network mode */
142 while (SDLNet_UDP_Recv(udpsock,packet)) if (strcmp(packet->data,"positions")==0)
144 int servertime,clienttime,nb;
145 servertime=SDLNet_Read32(packet->data+strlen("positions")+1);
146 clienttime=SDLNet_Read32(packet->data+strlen("positions")+1+4);
147 nb=SDLNet_Read16(packet->data+strlen("positions")+1+4+4);
148 if (clienttime>lastack)
150 memcpy(net.keys,net.keys+clienttime-lastack,net.time+1);
151 net.time-=clienttime-lastack;
152 if (clienttime>servertime+5) delay+=DELAY;
153 if (clienttime<servertime-5) delay-=DELAY;
154 if (delay<0) delay=0;
158 else /* end of this network race */
160 SDL_FreeSurface(cir);
161 SDL_FreeSurface(fun);
164 if (strlen(net.keys)!=0)
169 SDLNet_Write32(lastack,tmp);
171 strcpy(tmp,net.keys);
173 packet->len=(void *)tmp-(void *)packet->data+10;
174 if (net.time%network_speed==0) if (!SDLNet_UDP_Send(udpsock,-1,packet))
176 fprintf(stderr,"SDLNet_UDP_Send: %s\n",SDLNet_GetError());
183 move_car(&car,(ku<<3 | kd<<2 | kl<<1 | kr),fun);
185 /* let the system breath */
190 if (udpsock && net.time>MAX_LAG)
192 fprintf(stderr,"timeout !\n");
193 SDL_FreeSurface(cir);
194 SDL_FreeSurface(fun);
202 /* connect to a server */
203 void zeRace_connect(char *host,int port)
207 udpsock=SDLNet_UDP_Open(0);
210 fprintf(stderr,"SDLNet_UDP_Open: %s\n",SDLNet_GetError());
213 SDLNet_ResolveHost(&packet->address,host,port);
215 strcpy(tmp,"connect");
217 strcpy(tmp,config.pseudo);
219 SDLNet_Write16(config.color,tmp);
221 packet->len=(void *)tmp-(void *)packet->data;
222 SDLNet_UDP_Send(udpsock,-1,packet);
224 while (SDLNet_UDP_Recv(udpsock,packet) || lag<MAX_LAG)
227 if (strcmp(tmp,"track")==0)
229 struct _tracklist *loopcheck=tracklist;
234 printf("server asked for track : %s\n",tmp);
235 while (tracklist->next!=loopcheck) if (strcmp(tracklist->name,tmp)==0) break; else tracklist=tracklist->next;
236 if (strcmp(tracklist->name,tmp)!=0)
238 fprintf(stderr,"unknown track : %s\n",tmp);
242 time=SDLNet_Read32(tmp);
244 network_speed=SDLNet_Read32(tmp);
245 zeRace_launch(time,go);
246 if (strcmp(packet->data,"finish")==0) SDL_Delay(5000);
252 SDLNet_UDP_Close(udpsock);
258 int main(int argc,char *argv[])
260 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); }
263 zeRace_connect(argv[1],atoi(argv[2]));