10 #define MAXLINELENGTH 1000
15 /* global variables */
32 char pseudo[MAXLINELENGTH]="anonymous";
33 char url[MAXLINELENGTH]="";
35 SDL_Surface *cars[256];
40 if (sound) Mix_CloseAudio();
52 void zeRace_read_config()
55 char line[MAXLINELENGTH];
56 char keyword[MAXLINELENGTH];
57 char value[MAXLINELENGTH];
60 if ((fic=fopen("zeRace.cfg","rt"))==NULL)
62 fprintf(stderr,"can't open config file \"zeRace.cfg\"\n");
66 while (fgets(line,MAXLINELENGTH,fic))
69 if (*line!=';' && *line!='#' && *line!='/' && *line!='-' && *line!='\n')
71 if ((sscanf(line,"%s : %s\n",(char *)&keyword,(char *)&value))!=2) { fprintf(stderr,"error in config file : each line must have the format \"keyword : value\" (line %d)\n",configlines); exit(1); }
73 if (strcmp("pseudo",keyword)==0)
77 if (strcmp("url",keyword)==0)
81 if (strcmp("fullscreen",keyword)==0)
83 if (strcmp("no",value)==0) fullscreen=0;
84 else if (strcmp("yes",value)==0) fullscreen=1;
85 else { fprintf(stderr,"unknown value for \"fullscreen\" option, must be \"yes\" or \"no\"\n"); exit(1); }
89 if (strcmp("sound",keyword)==0)
91 if (strcmp("no",value)==0) sound=0;
92 else if (strcmp("yes",value)==0) sound=1;
93 else { fprintf(stderr,"unknown value for \"sound\" option, must be \"yes\" or \"no\"\n"); exit(1); }
96 else { fprintf(stderr,"error in config file : \"%s\" is an unknown keyword (line %d)\n",keyword,configlines); exit(1); }
102 void zeRace_get_tracks()
104 struct dirent **namelist;
106 unsigned char ext[5];
108 char *shortname=NULL;
109 char line[MAXLINELENGTH];
111 struct track *tmp=NULL,*first=NULL;
115 if ((dirp=opendir("tracks"))==NULL) { fprintf(stderr,"can't open \"tracks\" directory or no tracks\n"); return; }
117 while (dp=readdir(dirp)) if (strlen(dp->d_name)>4)
119 shortname=(char *)realloc(shortname,strlen(dp->d_name)-3);
120 strncpy(shortname,dp->d_name,strlen(dp->d_name)-4);
121 shortname[strlen(dp->d_name)-4]='\0';
122 for (i=0;i<5;i++) ext[i]=tolower(dp->d_name[strlen(dp->d_name)-4+i]);
123 if (strcmp(".txt",ext)==0)
125 tmp=(struct track *)malloc(sizeof(struct track));
126 if (first==NULL) first=tmp;
127 tmp->name=(char *)malloc(strlen(shortname)+1);
128 strcpy(tmp->name,shortname);
136 sprintf(line,"tracks/%s.txt",shortname);
137 if ((fic=fopen(line,"rt"))==NULL)
139 fprintf(stderr,"can't open track file \"%s\"\n",line);
142 while (fgets(line,MAXLINELENGTH,fic))
145 if (*line!=';' && *line!='#' && *line!='/' && *line!='-' && *line!='\n')
147 for (i=0;i<strlen(line)-2;i++) if (line[i]==' ' && line[i+1]==':' && line[i+2]==' ') break;
148 if (line[i]!=' ' || line[i+1]!=':' || line[i+2]!=' ')
150 fprintf(stderr,"error in track file \"%s\" : each line must have the format \"keyword : value\" (line %d)\n",shortname,configlines);
155 if (strcmp("title",line)==0)
157 tmp->title=(char *)malloc(strlen(line+i+3)+1);
158 strcpy(tmp->title,line+i+3);
162 if (strcmp("author",line)==0)
164 tmp->author=(char *)malloc(strlen(line+i+3)+1);
165 strcpy(tmp->author,line+i+3);
169 if (strcmp("x",line)==0)
170 tmp->x=atoi(line+i+3);
173 if (strcmp("y",line)==0)
174 tmp->y=atoi(line+i+3);
177 if (strcmp("a",line)==0)
178 tmp->a=atoi(line+i+3);
181 if (strcmp("version",line)==0)
183 tmp->version=(char *)malloc(strlen(line+i+3)+1);
184 strcpy(tmp->version,line+i+3);
187 else { fprintf(stderr,"error in track file \"%s\" : \"%s\" is an unknown keyword (line %d)\n",shortname,line,configlines); exit(1); }
191 tmp->full=(char *)malloc(strlen(line)+20);
192 sprintf(tmp->full,"tracks/%s.png",shortname);
193 tmp->function=(char *)malloc(strlen(line)+30);
194 sprintf(tmp->function,"tracks/%s_function.png",shortname);
196 if (tmp->prev) tmp->prev->next=tmp;
200 if (!tmp) { fprintf(stderr,"no circuits found !\n"); zeRace_exit(); }
201 while (tmp->prev) tmp=tmp->prev;
212 signal(SIGINT,zeRace_exit);
213 signal(SIGTERM,zeRace_exit);
214 zeRace_read_config();
215 //zeRace_check_version();
217 //zeRace_get_ghosts();
221 if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO)<0)
223 fprintf(stderr,"could not initialize SDL : %s\n",SDL_GetError());
228 if(SDLNet_Init()==-1)
230 fprintf(stderr,"could not initialize SDLNet : %s\n",SDLNet_GetError());
234 flags=SDL_HWSURFACE|SDL_ANYFORMAT;
235 if (fullscreen) flags|=SDL_FULLSCREEN;
237 if ((screen=SDL_SetVideoMode(WIDTH,HEIGHT,32,flags))==NULL)
239 fprintf(stderr,"could not create a surface : %s\n",SDL_GetError());
243 SDL_WM_SetIcon(SDL_LoadBMP("icon.bmp"),NULL);
244 SDL_WM_SetCaption("zeRace " VERSION,"zeRace " VERSION);
245 SDL_ShowCursor(SDL_DISABLE);
247 if (sound) if (Mix_OpenAudio(44100,MIX_DEFAULT_FORMAT,2,512)<0)
249 fprintf(stderr,"Mix_OpenAudio error\n");
253 car=IMG_Load("sprites/car.png");
258 cars[i]=SDL_CreateRGBSurface(SDL_SWSURFACE,car->h*2,car->h*2,32,0x000000ff,0x0000ff00,0x00ff0000,0xff000000);
261 fprintf(stderr,"CreateRGBSurface failed: %s\n",SDL_GetError());
264 tcos=cos(2*M_PI*i/256);
265 tsin=sin(2*M_PI*i/256);
266 for (x=0;x<cars[i]->w;x++) for (y=0;y<cars[i]->h;y++)
270 x2=(x-cars[i]->w/2.0)*tcos+(y-cars[i]->h/2.0)*tsin+car->w/2.0;
271 y2=(x-cars[i]->w/2.0)*tsin-(y-cars[i]->h/2.0)*tcos+car->h/2.0;
272 if (x2>0 && x2<car->w && y2>0 && y2<car->h)
273 putpixel(cars[i],x,y,getpixel(car,x2,y2));
279 void zeRace_send_time(float x,float y,float speed,float angle,int btime,char *bkeys)
285 "POST /zerace/time.php HTTP/1.1\n"
286 "Host: royale.zerezo.com\n"
287 "User-Agent: zeRace " VERSION "\n"
288 "Content-Type: application/x-www-form-urlencoded\n"
289 "Content-Length: 99999\n"
293 char *msg3="&track=";
294 char *msg4="&btime=";
297 char *msg7="&speed=";
298 char *msg8="&angle=";
299 char *msg9="&bkeys=";
302 printf("sending time... ");
305 if(SDLNet_ResolveHost(&ip,"royale.zerezo.com",80)==-1)
307 fprintf(stderr,"SDLNet_ResolveHost: %s\n",SDLNet_GetError());
311 tcpsock=SDLNet_TCP_Open(&ip);
314 fprintf(stderr,"SDLNet_TCP_Open: %s\n",SDLNet_GetError());
318 temp=(char *)malloc(strlen(msg1)+strlen(pseudo)+strlen(msg2)+strlen(url)+strlen(msg3)+strlen(tracklist->name)+strlen(msg4)+10+strlen(msg5)+10+strlen(msg6)+10+strlen(msg7)+10+strlen(msg8)+10+strlen(msg9)+strlen(bkeys)+100);
319 sprintf(temp,"%s%s%s%s%s%s%s%d%s%f%s%f%s%f%s%f%s%s\n",msg1,pseudo,msg2,url,msg3,tracklist->name,msg4,btime,msg5,x,msg6,y,msg7,speed,msg8,angle,msg9,bkeys);
322 result=SDLNet_TCP_Send(tcpsock,temp,len);
324 fprintf(stderr,"SDLNet_TCP_Send: %s\n", SDLNet_GetError());
328 SDLNet_TCP_Close(tcpsock);
334 SDL_Surface *cir,*fun;
337 int ku=0,kd=0,kl=0,kr=0;
338 int i,time=0,lastcheck=0,btime=10000;
340 float x,y,angle,speed;
341 float sx,sy,sangle,sspeed;
342 float bx,by,bangle,bspeed;
348 Mix_Music *light,*engine,*crash,*slide;
349 int lastsound_time=-999,alltime=0,lastsound=0;
351 cir=IMG_Load(tracklist->full);
352 fun=IMG_Load(tracklist->function);
355 sangle=angle=(tracklist->a*2*M_PI/360);
361 if (sound) if (!(light=Mix_LoadMUS("sounds/light.wav")) || !(engine=Mix_LoadMUS("sounds/engine.wav")) || !(crash=Mix_LoadMUS("sounds/crash.wav")) || !(slide=Mix_LoadMUS("sounds/slide.wav")))
363 fprintf(stderr,"Mix_LoadMUS error\n");
369 char startup[15]="sprites/?.png";
374 SDL_BlitSurface(cir,NULL,screen,NULL);
375 SDL_BlitSurface(cars[(unsigned char)(256*angle/2.0/M_PI)%256],NULL,screen,&pos);
378 temp=IMG_Load(startup);
379 pos.x=screen->w/2-temp->w/2;
380 pos.y=screen->h/2-temp->h/2;
381 SDL_BlitSurface(temp,NULL,screen,&pos);
382 SDL_FreeSurface(temp);
384 if (sound) if (i!=4) Mix_PlayMusic(light,1);
386 if (i!=-1) SDL_Delay(1000);
395 SDL_BlitSurface(cir,&pos,screen,&pos);
400 x=x-cos(angle)*speed;
401 y=y-sin(angle)*speed;
403 if (x<0 || x>screen->w-cars[0]->w || y<0 || y>screen->h-cars[0]->h)
412 i=(unsigned char)(256*angle/2.0/M_PI)%256;
413 SDL_BlitSurface(cars[i],NULL,screen,&pos);
414 SDL_UpdateRect(screen,ox,oy,cars[i]->w,cars[i]->h);
415 SDL_UpdateRect(screen,x,y,cars[i]->w,cars[i]->h);
419 if (ku) speed+=0.01*2;
422 if (lastsound_time+100<alltime)
425 lastsound_time=alltime;
426 if (sound) Mix_PlayMusic(engine,1);
429 if (kd && speed>0.5 || speed>2.0 && !ku)
432 if (lastsound_time+100<alltime || lastsound<1)
435 lastsound_time=alltime;
436 if (sound) Mix_PlayMusic(slide,1)==-1;
439 putpixel(cir,x+cars[i]->w/2+cos(angle)*cars[i]->w/3-sin(angle)*2,y+cars[i]->h/2+sin(angle)*cars[i]->h/3+cos(angle)*2,0);
440 putpixel(cir,x+cars[i]->w/2+cos(angle)*cars[i]->w/3+sin(angle)*5,y+cars[i]->h/2+sin(angle)*cars[i]->h/3-cos(angle)*5,0);
443 putpixel(cir,x+cars[i]->w/2+cos(angle)*cars[i]->w/3-sin(angle)*3,y+cars[i]->h/2+sin(angle)*cars[i]->h/3+cos(angle)*3,0);
444 putpixel(cir,x+cars[i]->w/2+cos(angle)*cars[i]->w/3+sin(angle)*4,y+cars[i]->h/2+sin(angle)*cars[i]->h/3-cos(angle)*4,0);
448 c=getpixel(fun,x+cars[i]->w/2,y+cars[i]->h/2);
456 if (lastsound_time+100<alltime || lastsound<2)
459 lastsound_time=alltime;
460 if (sound) Mix_PlayMusic(crash,1)==-1;
463 speed-=speed*(255-v)/1000;
465 if (r/8==lastcheck+1) lastcheck++;
466 if (r/8==0 && lastcheck==31)
468 printf("time = %d\"%d\n",time*5/1000,time*5%1000);
469 if (btime==-1 || time<btime)
477 memcpy(bkeys,keys,btime);
487 while (SDL_PollEvent(&event))
495 switch (event.key.keysym.sym)
497 case SDLK_ESCAPE: // escape
498 Mix_FreeMusic(light);
499 Mix_FreeMusic(engine);
500 Mix_FreeMusic(crash);
501 Mix_FreeMusic(slide);
502 if (btime<10000) zeRace_send_time(bx,by,bspeed,bangle,btime,bkeys);
507 case SDLK_DOWN: //down
510 case SDLK_LEFT: //left
513 case SDLK_RIGHT: //right
519 switch (event.key.keysym.sym)
524 case SDLK_DOWN: //down
527 case SDLK_LEFT: //left
530 case SDLK_RIGHT: //right
539 if (time<btime) keys[time]=(ku<<3 | kd<<2 | kl<<1 | kr)+'A';
551 char temp[20]="splashs/0.jpg";
553 SDL_FillRect(screen,NULL,0x000000);
554 temp[8]=rand()%3+'1';
555 splash=IMG_Load(temp);
556 pos.x=screen->w/2-splash->w/2-1;
558 pos.y=screen->h/2-splash->h/2-1;
560 SDL_FillRect(screen,&pos,0xffffff);
561 pos.x=screen->w/2-splash->w/2;
562 pos.y=screen->h/2-splash->h/2;
563 SDL_BlitSurface(splash,NULL,screen,&pos);
564 print(screen,screen->w/2-strlen("zeRace " VERSION)*5,screen->h/2-splash->h/2-20,"zeRace " VERSION);
565 SDL_FreeSurface(splash);
577 SDL_Surface *full,*preview;
579 SDL_FillRect(screen,NULL,0x000000);
580 print(screen,WIDTH/2-28*5,HEIGHT/6,"* Please choose your race *");
581 print(screen,WIDTH/2-strlen(tracklist->title)*5,5*HEIGHT/6-20,tracklist->title);
582 print(screen,WIDTH/2-(strlen(tracklist->author)+strlen("Author : "))*5,5*HEIGHT/6+0,"Author : ");
583 print(screen,WIDTH/2-(strlen(tracklist->author)-strlen("Author : "))*5,5*HEIGHT/6+0,tracklist->author);
584 print(screen,WIDTH/2-(strlen(tracklist->version)+strlen("Version : "))*5,5*HEIGHT/6+20,"Version : ");
585 print(screen,WIDTH/2-(strlen(tracklist->version)-strlen("Version : "))*5,5*HEIGHT/6+20,tracklist->version);
586 full=IMG_Load(tracklist->full);
587 preview=(SDL_Surface *)zoomSurface(full,0.5,0.5,1);
588 SDL_FreeSurface(full);
589 pos.x=WIDTH/2-preview->w/2-1;
591 pos.y=screen->h/2-preview->h/2-1;
593 SDL_FillRect(screen,&pos,0xffffff);
594 pos.x=WIDTH/2-preview->w/2;
595 pos.y=screen->h/2-preview->h/2;
596 SDL_BlitSurface(preview,NULL,screen,&pos);
597 SDL_FreeSurface(preview);
604 while (SDL_PollEvent(&event))
612 switch (event.key.keysym.sym)
614 case SDLK_ESCAPE: // escape
617 case SDLK_RETURN: //enter
618 case SDLK_SPACE: //space
622 case SDLK_LEFT: //left
623 tracklist=tracklist->next;
626 case SDLK_RIGHT: //right
627 tracklist=tracklist->prev;
639 int main(int argc,char *argv[])