// ManiaDrive - CQFD Corp // http://maniadrive.raydium.org/ char *version="ManiaDrive 1.2custom"; #include "raydium/index.c" #include "mania.h" #include "mania_creds.h" #define NO_NETWORK_COLLISIONS #ifdef WIN32 #define SERVER_BINARY "mania_server.exe" #else #define SERVER_BINARY "./mania_server.static" #endif #define STORY_FILE_BEG "mania_drive.story.beg" #define STORY_FILE_PRO "mania_drive.story.pro" #define HISTORY_STATE_FILE raydium_file_home_path("mania_drive.state") #define MUSIC_MENU "mania_music/i_got_it_bad_-_The_Napoleon_Blown_Aparts.ogg" #define RESOLUTION_LIST "320x240\n640x480\n800x600\n1024x768" GLfloat sun[]={1.0,0.9,0.5,1.0}; GLfloat amb[]={1.0,0.0,0.0,1.0}; GLfloat tmp2[]={1.0,1.0,1.0,1.0}; GLfloat zero[]={0.0,0.0,0.0,0.0}; GLfloat temps[]={0,0,0}; int sound_car; int sound_checkpoint; int sound_owww; int sound_wizz; char vue=3; GLfloat camx=-20; GLfloat camy=50; GLfloat camz=40; char cam[255]; char draw_debug=-1; char is_explosive_tag=29; dReal cam_angle_h=0; dReal cam_angle_v=90; float scroll=-1; signed char camera_lag; float camera_lag_speed; signed char shadow_support; signed char windowed_mode; char windowed_res[32]; // "%ix%i" format signed char windowed_mode_save; // use to display "must restart game" message char windowed_res_save[32]; // same float music_volume; signed joystick_enabled; int object_ground,object_boxes; int game_state; GLfloat timer; GLfloat countdown; GLfloat partytime; GLfloat yourbest; char mni_current[RAYDIUM_MAX_NAME_LEN]; GLfloat track_bottom; char mni_next[RAYDIUM_MAX_NAME_LEN]; char message[RAYDIUM_MAX_NAME_LEN]; signed char mode; signed char simple_mni=0; signed char congrats=0; signed char music_popup_inc=-1; dReal gears[]={-0.4,0.4,0.6,0.8,0.9,1.0}; int gear=1; void change_game_state(int type); void create_car(void); void load_boxes(char *filename); void dat_load(char *filename); void hms(GLfloat t,int *h, int *m, int *s, int *ms); int mni_load(char *mni); signed char mni_network_get(char *mni); void build_gui_Main(void); void music_random(void); void leave(void); void build_gui_ErrorDownload(void); void build_gui_Lan(void); void btnBackToMainMenu(raydium_gui_Object *w); void build_gui_NeedRestart(void); void build_gui_Story(void); void showMessage(char *file, int id); void build_gui_Solo(void); #define NET_SCORE_TRACK (RAYDIUM_NETWORK_PACKET_BASE+1) #define NET_RESTART (RAYDIUM_NETWORK_PACKET_BASE+2) #define NET_CHANGE_MAP (RAYDIUM_NETWORK_PACKET_BASE+3) #define NET_REMAINING (RAYDIUM_NETWORK_PACKET_BASE+4) #define NET_SCORE_BASE (RAYDIUM_NETWORK_PACKET_BASE+10) typedef struct Score { float time; char player[RAYDIUM_MAX_NAME_LEN]; } Score; typedef struct TrackData { char name[RAYDIUM_MAX_NAME_LEN]; char author[RAYDIUM_MAX_NAME_LEN]; float gold_time; float author_time; char message_file[RAYDIUM_MAX_NAME_LEN]; } TrackData; TrackData trackdata; Score best_score[RAYDIUM_NETWORK_MAX_CLIENTS]; Score track_score; pid_t server_pid=0; #define GAME_COUNTDOWN 1 #define GAME_GAME 2 #define GAME_END 3 #define GAME_SCORE 4 #define MODE_NONE 0 #define MODE_SOLO 1 #define MODE_NET 2 #define MODE_MULTI 3 #define SHADOW_OFFSET 0.3 void change_music_volume(float vol) { raydium_sound_SetSourceGain(0,vol); } float get_score(char *track,char *player) { char ltrack[RAYDIUM_MAX_NAME_LEN]; float res=0; if(!strcmp(track,"dyn_track.mni")) { player[0]=0; return 0; } // since PHP will write to variables .. strcpy(ltrack,track); strcpy(player,"unavailable"); raydium_register_variable(ltrack,RAYDIUM_REGISTER_STR,"track"); raydium_register_variable(player,RAYDIUM_REGISTER_STR,"player"); raydium_register_variable(&res,RAYDIUM_REGISTER_FLOAT,"score"); raydium_php_exec("mania_score_get.php"); raydium_register_variable_unregister_last(); raydium_register_variable_unregister_last(); raydium_register_variable_unregister_last(); return res; } int post_score(char *track, char *name, char *score) { char ltrack[RAYDIUM_MAX_NAME_LEN]; char lname[RAYDIUM_MAX_NAME_LEN]; char lscore[RAYDIUM_MAX_NAME_LEN]; char lversion[RAYDIUM_MAX_NAME_LEN]; int position; if(!strcmp(track,"dyn_track.mni")) return 0; // since PHP will write to variables .. strcpy(ltrack,track); strcpy(lname,name); strcpy(lscore,score); strcpy(lversion,version); raydium_register_variable(ltrack,RAYDIUM_REGISTER_STR,"track"); raydium_register_variable(lname,RAYDIUM_REGISTER_STR,"name"); raydium_register_variable(lscore,RAYDIUM_REGISTER_STR,"score"); raydium_register_variable(lversion,RAYDIUM_REGISTER_STR,"version"); raydium_register_variable(&position,RAYDIUM_REGISTER_INT,"position"); raydium_php_exec("mania_score.php"); raydium_register_variable_unregister_last(); raydium_register_variable_unregister_last(); raydium_register_variable_unregister_last(); raydium_register_variable_unregister_last(); raydium_register_variable_unregister_last(); return position; } void post_score_local(char *track, float time) { FILE *fp; fp=fopen(HISTORY_STATE_FILE,"at"); if(!fp) { raydium_log("ERROR: cannot save story state"); return; } fprintf(fp,"%s;%f\n",track,time); fclose(fp); } signed char get_tracklist(char *list) { int ok; raydium_register_variable(list,RAYDIUM_REGISTER_STR,"list"); raydium_register_variable(&ok,RAYDIUM_REGISTER_INT,"ok"); raydium_php_exec("mania_tracklist.php"); raydium_register_variable_unregister_last(); raydium_register_variable_unregister_last(); return ok; } void restart_asked_from_network(int type,char *buff) { create_car(); } void netcall_mni_change(int type, char *buff) { if(!mni_network_get(buff+RAYDIUM_NETWORK_PACKET_OFFSET)) return; mni_load(buff+RAYDIUM_NETWORK_PACKET_OFFSET); } void netcall_remaining_time(int type, char *buff) { float f; char *trck; memcpy(&f,buff+RAYDIUM_NETWORK_PACKET_OFFSET,sizeof(float)); trck=buff+RAYDIUM_NETWORK_PACKET_OFFSET+sizeof(float); if(strlen(mni_current)==0 || strcmp(mni_current,trck)) { if(!mni_network_get(trck)) return; mni_load(trck); } partytime=f; } signed char mni_network_get(char *mni) { // download track from server, and exit multiplayer mode in case of failure, // displaying an error window if(raydium_web_client_get(mni)) return 1; // ok // failed leave(); raydium_gui_window_delete_name("menu"); build_gui_Lan(); build_gui_ErrorDownload(); return 0; } int mni_load(char *mni) { char tri[RAYDIUM_MAX_NAME_LEN]; char base[RAYDIUM_MAX_NAME_LEN]; GLfloat min[3]; GLfloat max[3]; int i,ret; if(!mni || !strlen(mni)) return 0; ret=mni_generate(mni); if(ret==0) { raydium_log("CANNOT GENERATE TRACK FROM MNI FILE '%s'",mni); if(simple_mni) exit(1); return 0; } raydium_ode_object_delete_name("WATURE"); strcpy(mni_current,mni); raydium_file_basename(base,mni); sprintf(tri,"%s/mania_%s.tri",raydium_homedir,base); rename(raydium_file_home_path("mania.tri"),tri); raydium_ode_ground_set_name(tri); unlink(tri); load_boxes(raydium_file_home_path("mania.box")); dat_load(raydium_file_home_path("mania.dat")); raydium_object_find_minmax(raydium_object_find(tri),min,max); track_bottom=min[2]; if(mode!=MODE_SOLO) track_score.time=get_score(mni,track_score.player); raydium_network_propag_refresh(NET_SCORE_TRACK); for(i=0;i=0) { if(!raydium_video_isplaying_name("video_beg")) alpha-=raydium_frame_time; raydium_live_texture_draw_name("video_beg",alpha,px,py,px+size,py+size); if(alpha<=0) raydium_video_delete_name("video_beg"); } else alpha=1; } void video_beg_delete(void) { raydium_video_delete_name("video_beg"); } void btnDriveNet(raydium_gui_Object *w) { char track[RAYDIUM_MAX_NAME_LEN]; raydium_gui_read_name("menu","cboTrack",track); raydium_gui_read_name("menu","edtPlayerName",raydium_network_name_local); raydium_parser_db_set("Generic-PlayerName",raydium_network_name_local); raydium_parser_db_set("ManiaDrive-LastInternetTrack",track); strcat(track,".mni"); drive(track); mode=MODE_NET; } void btnDriveSolo(raydium_gui_Object *w) { drive(w->name); mode=MODE_SOLO; } void btnOtherTracksSolo(raydium_gui_Object *w) { char track[RAYDIUM_MAX_NAME_LEN]; raydium_gui_read_name("menu","cboTrack",track); raydium_parser_db_set("ManiaDrive-LastSoloTrack",track); drive(track); mode=MODE_SOLO; } void btnBackToMainMenu(raydium_gui_Object *w) { change_music_volume(music_volume); raydium_gui_window_delete_name("menu"); build_gui_Main(); } void btnCantDrive(raydium_gui_Object *w) { int handle; char *str="You can't drive here yet !"; handle=raydium_gui_window_create("cantdrive",25,45,50,15); raydium_gui_widget_sizes(0,0,18); raydium_gui_label_create("lblCantDrive",handle,50,80,str,0,0,0); raydium_gui_widget_sizes(15,5,18); raydium_gui_button_create("btnCantDriveOk",handle,35,15,"OK",btnCantDriveOk); } void btnKeyHelp(raydium_gui_Object *w) { int handle; handle=raydium_gui_window_create("keyhelp",5,45,50,50); raydium_gui_widget_sizes(5,5,25); raydium_gui_label_create("lblTitle",handle,50,90,"- Controls Help -",0.7,0,0); raydium_gui_widget_sizes(0,0,16); raydium_gui_label_create("lblKH10",handle,50,80,"Key Up : accelerate",0,0,0); raydium_gui_label_create("lblKH20",handle,50,75,"Key Down : brake / reverse",0,0,0); raydium_gui_label_create("lblKH30",handle,50,65,"Space : restart track",0,0,0); raydium_gui_label_create("lblKH40",handle,50,60,"Backspace : restart LAN clients",0,0,0); raydium_gui_label_create("lblKH50",handle,50,50,"F3 : default external view",0,0,0); raydium_gui_label_create("lblKH60",handle,50,45,"F6 : in-board fixed view",0,0,0); raydium_gui_label_create("lblKH65",handle,50,40,"C : switch camera",0,0,0); raydium_gui_label_create("lblKH70",handle,50,30,"... and maybe hidden ones :)",0,0,0); raydium_gui_widget_sizes(3,3,16); if(raydium_joy) { raydium_gui_check_create("chkJoy",handle,15,17," joystick/joypad enabled",joystick_enabled); } else { raydium_gui_label_create("lblKH80",handle,50,20,"(no joystick/joypad found)",0.3,0,0); } raydium_gui_widget_sizes(15,5,18); raydium_gui_button_create("btnCantDriveOk",handle,35,5,"OK",btnKeyHelpOk); } void btnErrorOkClick(raydium_gui_Object *w) { raydium_gui_window_delete_name("error"); } void btnStoryCompletedOk(raydium_gui_Object *w) { raydium_gui_window_delete_name("storycompleted"); build_gui_Story(); } void btnRestartClick(raydium_gui_Object *w) { raydium_gui_window_delete_name("restart"); } void btnNetworkConnect(raydium_gui_Object *w) { char server[512]; int handle; raydium_gui_read_name("menu","edtServer",server); raydium_gui_read_name("menu","edtPlayerName",raydium_network_name_local); raydium_parser_db_set("ManiaDrive-Server",server); raydium_parser_db_set("Generic-PlayerName",raydium_network_name_local); if(!raydium_network_client_connect_to(server)) { handle=raydium_gui_window_create("error",25,45,50,15); raydium_gui_widget_sizes(0,0,18); raydium_gui_label_create("lblError",handle,50,80,"Cannot connect to server ...",0,0,0); raydium_gui_widget_sizes(15,5,18); raydium_gui_button_create("btnErrorOk",handle,35,15,"OK",btnErrorOkClick); return; } mode=MODE_MULTI; raydium_gui_window_delete_name("menu"); handle=raydium_gui_window_create("menu",25,45,50,15); raydium_gui_widget_sizes(0,0,18); raydium_gui_label_create("lblInfo",handle,50,50,"Please, wait ...",0,0,0); } void btnServerClick(raydium_gui_Object *w) { char str[RAYDIUM_MAX_NAME_LEN]; int zone; char name[RAYDIUM_MAX_NAME_LEN]; char ip[RAYDIUM_MAX_NAME_LEN]; char info[RAYDIUM_MAX_NAME_LEN]; int player_count; int player_max; zone=raydium_gui_read_widget(w,str); if(raydium_network_discover_getserver(zone,name,ip,info,&player_count,&player_max)<=0) return; // hu ?! raydium_gui_widget_sizes(0,0,0); raydium_gui_edit_create("edtServer",w->window,0,0,ip); raydium_gui_edit_create("edtPlayerName",w->window,0,0,raydium_network_name_local); btnNetworkConnect(NULL); } void btnSearchLAN(raydium_gui_Object *w) { int i,n; int handle; float y; char str[RAYDIUM_MAX_NAME_LEN]; char name[RAYDIUM_MAX_NAME_LEN]; char ip[RAYDIUM_MAX_NAME_LEN]; char info[RAYDIUM_MAX_NAME_LEN]; int player_count; int player_max; raydium_gui_window_delete_name("menu"); handle=raydium_gui_window_create("menu",10,25,80,50); raydium_gui_widget_sizes(0,0,18); raydium_gui_label_create("lblLanServerSearch",handle,50,92,"- LAN Servers - ",0,0,0); raydium_gui_widget_sizes(0,0,12); sprintf(str,"%-30s","Name"); raydium_gui_label_create("lblCol1",handle,20,85,str,0.4,0,0); sprintf(str,"%-15s","Track"); raydium_gui_label_create("lblCol2",handle,50,85,str,0.4,0,0); sprintf(str,"%-15s","Address"); raydium_gui_label_create("lblCol3",handle,70,85,str,0.4,0,0); sprintf(str,"%-15s","Players"); raydium_gui_label_create("lblCol4",handle,90,85,str,0.4,0,0); sprintf(str,"%-30s","------------------------------"); raydium_gui_label_create("lblCol1s",handle,20,83,str,0.4,0,0); sprintf(str,"%-15s","---------------"); raydium_gui_label_create("lblCol2s",handle,50,83,str,0.4,0,0); sprintf(str,"%-15s","---------------"); raydium_gui_label_create("lblCol3s",handle,70,83,str,0.4,0,0); sprintf(str,"%-15s","---------------"); raydium_gui_label_create("lblCol4s",handle,90,83,str,0.4,0,0); y=80; n=raydium_network_discover_numservers(); for(i=0;iname,part1,part2,';'); id=atoi(part2); showMessage(trackdata.message_file,id); } void showMessage(char *file, int id) { int handle; FILE *fp; int count; signed char found=0; int lines[32]; // start index of each line int ret; char var[RAYDIUM_MAX_NAME_LEN]; char val_s[RAYDIUM_GUI_DATASIZE]; float val_f[10]; int size; raydium_gui_window_delete_name("menu"); fp=raydium_file_fopen(file,"rt"); if(fp) { count=0; while( (ret=raydium_parser_read(var,val_s,val_f,&size,fp))!=RAYDIUM_PARSER_TYPE_EOF) { if(!strcasecmp(var,"en")) { if(ret!=RAYDIUM_PARSER_TYPE_RAWDATA) { raydium_log("message is wrong type, must be RAWDATA."); continue; } if(count!=id) { count++; continue; } found=1; break; } } fclose(fp); } // fp was ok if(found) { int nlines=0; int i; int start=0; int len; float width; float heigth; int mx; len=strlen(val_s); mx=0; for(i=0;imx) mx=strlen(val_s+start); start=i+1; nlines++; } width=mx*1.6; heigth=(nlines+2)*5; if(width<20) width=40; handle=raydium_gui_window_create("menu",((float)100-width)/2,((float)100-heigth)/2,width,heigth); raydium_gui_widget_sizes(0,0,18); for(i=0;i0 && partytime==0) // end of this party change_game_state(GAME_SCORE); if(game_state==GAME_GAME) timer+=step; if(game_state==GAME_COUNTDOWN && strlen(trackdata.message_file)==0) { if(step<1) // wow .. this a a "track loading" lag countdown-=step; if(countdown<=0) change_game_state(GAME_GAME); } } void change_game_state(int type) { game_state=type; countdown=0; raydium_log("Changing game state to %i",type); if(type==GAME_END) { int h,m,s,ms; char score[64]; hms(timer,&h,&m,&s,&ms); sprintf(score,"%i:%02i:%02i:%03i",h,m,s,ms); if((timer=0) { best_score[raydium_network_uid].time=timer; strcpy(best_score[raydium_network_uid].player,raydium_network_name_local); raydium_network_propag_refresh(NET_SCORE_BASE+raydium_network_uid); } if(timer=60) { (*m)++; (*s)-=60; } while(*m>=60) { (*h)++; (*m)-=60; } } void draw_timer(void) { int h,m,s,ms; int h2,m2,s2,ms2; hms(timer,&h,&m,&s,&ms); raydium_osd_color_change(0.89,0.85,0.66); raydium_osd_printf(55,4,12,0.5,"font-impact.tga"," lap time:"); raydium_osd_printf(68,4,12,0.7,"font-lcdmono.tga","%i:%02i:%02i:%03i",h,m,s,ms); if(mode==MODE_MULTI) { hms(partytime,&h2,&m2,&s2,&ms2); raydium_osd_color_change(0.89,0.85,0.66); raydium_osd_printf(10,4,12,0.5,"font-impact.tga"," party time:"); raydium_osd_printf(23,4,12,0.7,"font-lcdmono.tga","^f%i:%02i:%02i:%03i",h2,m2,s2,ms2); } else { int off=0; if(mode==MODE_NET || simple_mni) off=10; hms(yourbest,&h2,&m2,&s2,&ms2); raydium_osd_color_change(0.89,0.85,0.66); raydium_osd_printf(20-off,4,12,0.5,"font-impact.tga"," your best:"); raydium_osd_printf(33-off,4,12,0.7,"font-lcdmono.tga","^f%i:%02i:%02i:%03i",h2,m2,s2,ms2); } if(mode==MODE_SOLO) { hms(trackdata.gold_time,&h2,&m2,&s2,&ms2); raydium_osd_color_change(0.89,0.85,0.66); raydium_osd_printf(20,7,12,0.5,"font-impact.tga"," gold time:"); raydium_osd_printf(33,7,12,0.7,"font-lcdmono.tga","^e%i:%02i:%02i:%03i",h2,m2,s2,ms2); } } void draw_best_score(void) { int h,m,s,ms; char ok[RAYDIUM_NETWORK_MAX_CLIENTS]; float best; float pos; int i,j,bestid; int cpt=1; if(mode==MODE_SOLO) { return; } if(track_score.time>=0) { hms(track_score.time,&h,&m,&s,&ms); raydium_osd_color_change(0.89,0.85,0.66); raydium_osd_printf(10,7,12,0.5,"font-impact.tga"," record:"); raydium_osd_printf(23,7,12,0.7,"font-lcdmono.tga","^e%i:%02i:%02i:%03i",h,m,s,ms); raydium_osd_printf(39,7,12,0.5,"font-impact.tga","^f- %s",track_score.player); } for(i=0;i=0) { raydium_osd_printf(2,pos,10,0.5,"font-impact.tga","^c%i ^f-",cpt); raydium_osd_color_change(0.89,0.85,0.66); raydium_osd_printf(5,pos,10,0.5,"font-lcdmono.tga","%i:%02i:%02i:%03i",h,m,s,ms); raydium_osd_printf(15,pos-0.05,12,0.5,"font-impact.tga","^f%s",best_score[bestid].player); pos-=3; cpt++; } } if(game_state==GAME_SCORE) { raydium_osd_printf(35+SHADOW_OFFSET,30-SHADOW_OFFSET,40,0.5,"font-impact.tga","^0Game over !"); raydium_osd_printf(35,30,40,0.5,"font-impact.tga","^cGame over !"); } } int music_playlist(char *newfile) { raydium_register_variable(newfile,RAYDIUM_REGISTER_STR,"raydium_ogg_file"); raydium_php_exec("mania_playlist.php"); raydium_register_variable_unregister_last(); change_music_volume(music_volume); return strlen(newfile)!=0; } void music_random(void) { char var[RAYDIUM_MAX_NAME_LEN]; if(!music_volume) return; music_playlist(var); raydium_sound_load_music(var); change_music_volume(music_volume); } void music_change(void) { music_popup_inc=1; } #define sizepp 50.f #define maxpp 0.f #define minpp -sizepp #define posypp 5.f #define ratiopp 3.f #define rollbackpp 200.f #define speedpp 100.f #define printoffsetpp 4.f #define printcolpp "^0" #define printcol2pp "^f" #define printlenpp 24 #define shadowoffpp 0.2f void trc(char *in, char *out, int len) { strcpy(out,in); if(strlen(out)>len) { out[len-3]=0; strcat(out,"..."); } } void draw_music_popup(void) { char str[RAYDIUM_MAX_NAME_LEN]; static GLfloat pos=0; GLfloat real; pos+=(raydium_frame_time*speedpp*music_popup_inc); real=pos; if(real>maxpp) real=maxpp; if(realrollbackpp) { music_popup_inc=-1; } raydium_osd_draw_name("BOXmania_music_popup.tga",real,posypp,sizepp+real,posypp+sizepp/ratiopp); trc(raydium_sound_music_info.title,str,printlenpp); raydium_osd_printf(real+2+shadowoffpp,posypp+sizepp/ratiopp-printoffsetpp-shadowoffpp, 20,0.4,"font2.tga","%s%s",printcol2pp,str); raydium_osd_printf(real+2,posypp+sizepp/ratiopp-printoffsetpp, 20,0.4,"font2.tga","%s%s",printcolpp,str); trc(raydium_sound_music_info.artist,str,printlenpp); raydium_osd_printf(real+2+shadowoffpp,posypp+sizepp/ratiopp-printoffsetpp*2-shadowoffpp, 20,0.4,"font2.tga","%s%s",printcol2pp,str); raydium_osd_printf(real+2,posypp+sizepp/ratiopp-printoffsetpp*2,20,0.4,"font2.tga","%s%s",printcolpp,str); trc(raydium_sound_music_info.album,str,printlenpp); raydium_osd_printf(real+2+shadowoffpp,posypp+sizepp/ratiopp-printoffsetpp*3-shadowoffpp, 20,0.4,"font2.tga","%s%s",printcol2pp,str); raydium_osd_printf(real+2,posypp+sizepp/ratiopp-printoffsetpp*3,20,0.4,"font2.tga","%s%s",printcolpp,str); } void col_car_box(int car, int box_id) { int id; int i; int n,m; dReal vect[3]; id=raydium_ode_element_tag_get(box_id); switch(id) { case TYPE_CHECKPOINT: for(i=0;i=0) { raydium_gui_window_delete_name("menu"); raydium_gui_hide(); } if(old==MODE_SOLO) build_gui_Story(); else if(old==MODE_NET) build_gui_InternetTracks(); else if(old==MODE_MULTI) build_gui_Lan(); } void display(void) { dReal speed,accel; dReal direct; dReal *tmp; dReal *pos; if(scroll>=0) { int i,cpt; float y,tmp; if(scroll!=99999) scroll+=raydium_frame_time*10; // must #define factor if(raydium_key_last==1027) credits_stop(); raydium_clear_frame(); raydium_camera_look_at(0.1,0.1,0,0,1,0); raydium_live_texture_mask_name("video2",1); // draw credits y=scroll; cpt=0; for(i=0;i-10 && y<110) { // centering ... tmp=30/RAYDIUM_OSD_FONT_SIZE_FACTOR; tmp=((strlen(credits_lines[i])-1)*tmp)/2; tmp=50-tmp; raydium_osd_printf(tmp+(SHADOW_OFFSET*3),y-(SHADOW_OFFSET*3),30,0.5,"font-impact.tga","^0%s",credits_lines[i]); raydium_osd_printf(tmp,y,30,0.5,"font-impact.tga","^f%s",credits_lines[i]); cpt++; } y-=10; // per line step (must #define it) } draw_music_popup(); // raydium_log("%i %f",cpt,y); if(cpt==0 && scroll!=99999) { GLfloat from[4]={0,0,0,0}; GLfloat to[4]={0,0,0,1}; scroll=99999; // ugly :) raydium_osd_fade_from(from,to,1,credits_stop); } raydium_rendering_finish(); return; } if(strlen(mni_current)==0) { if(raydium_key_last==1027) exit(0); raydium_clear_frame(); raydium_camera_look_at(0.1,0.1,0,0,1,0); if(!raydium_gui_isvisible()) build_gui_Main(); // MODE_NONE raydium_live_texture_mask_name("video",1); { static float a=1.5; float b; a-=(raydium_frame_time/6); b=a; if(b<0.9) b=0.9; if(b>1) b=1; raydium_osd_mask_texture_name("mania_logo2.tga",b); } //raydium_osd_logo("logoc.tga"); draw_music_popup(); raydium_rendering_finish(); if(raydium_gui_widget_find("lblLanServerSearch",raydium_gui_window_find("menu"))>=0) { static GLfloat timer; timer+=raydium_frame_time; if(timer>RAYDIUM_NETWORK_BEACON_DELAY) { timer=0; btnSearchLAN(NULL); } } return; } if(raydium_key_last==1027) { if(simple_mni) exit(0); leave(); return; } if(!joystick_enabled) { // all this should be Raydium's job, not our ... int sav; sav=raydium_joy; raydium_joy=0; raydium_joy_x=raydium_joy_y=0; raydium_joy_key_emul(); raydium_joy=sav; } else raydium_joy_key_emul(); if(raydium_key[GLUT_KEY_F1]) { raydium_projection_fov/=(1.04); raydium_window_view_update(); } if(raydium_key[GLUT_KEY_F2]) { raydium_projection_fov*=(1.04); raydium_window_view_update(); } // sets motor speed if(vue==3 || vue==4 || vue==5 || vue==6) { if(game_state==GAME_END) raydium_joy_y=raydium_joy_x=0; speed=0; accel=0.12; if(raydium_joy_y>0.3) { speed=raydium_joy_y*55; raydium_ode_motor_power_max_name("moteur",accel); raydium_particle_generator_enable_name("corps",1); } else if(raydium_joy_y<0.3) { speed=raydium_joy_y*5; raydium_ode_motor_power_max_name("moteur",0.2 * -raydium_joy_y); raydium_particle_generator_enable_name("corps",0); } else { speed=0; raydium_ode_motor_power_max_name("moteur",0.2 * -raydium_joy_y); // 0.2 ? joy_y ? raydium_particle_generator_enable_name("corps",0); } direct=raydium_joy_x*0.3; raydium_ode_motor_speed_name("moteur",-speed); raydium_ode_motor_angle_name("direction",direct); } if(raydium_key_last==1116) draw_debug*=-1; if(raydium_key_last==1032) create_car(); if(raydium_key_last==1008) network_ask_restart(); if(raydium_key_last==1097) { raydium_ode_time_change(0); } if(raydium_key_last==1122) { raydium_ode_time_change(10); } if(raydium_key_last==1101) { raydium_ode_time_change(100); } if(raydium_key_last==1000+'c') { if(vue==3) raydium_key_last=6; else raydium_key_last=3; } if(raydium_key_last==5) { vue=5; raydium_projection_near=10; raydium_projection_fov=2; raydium_window_view_update(); } if(raydium_key_last==6) { vue=6; raydium_projection_near=0.05 ; raydium_projection_fov=60; raydium_window_view_update(); } if(raydium_key_last==3 && vue!=3) { vue=3; raydium_projection_near=0.05 ; raydium_projection_fov=70; raydium_window_view_update(); raydium_camera_path_reset(); } if(raydium_key_last==4) { vue=4; raydium_projection_near=0.05; raydium_projection_fov=40; raydium_window_view_update(); } /* if(raydium_key_last==7) { vue=7; raydium_projection_near=0.05; raydium_projection_fov=70; raydium_window_view_update(); } */ //F9 to capture screen in jpg if(raydium_key_last==9) raydium_capture_frame_jpeg_auto(); raydium_background_color_change(sun[0],sun[1],sun[2],sun[3]); raydium_light_position[0][0]=50; raydium_light_position[0][1]=150; raydium_light_position[0][2]=200; raydium_light_position[0][3]=1.0; raydium_clear_frame(); glLoadIdentity(); pos=raydium_ode_element_pos_get_name("corps"); if(pos[2]0) { raydium_osd_printf(10+SHADOW_OFFSET,50-SHADOW_OFFSET,40,0.5,"font-impact.tga","^0Ready ? Start in %i seconds",(int)countdown+1); raydium_osd_printf(10,50,40,0.5,"font-impact.tga","^cReady ? Start in ^f%i^c seconds",(int)countdown+1); } raydium_osd_color_ega('f'); //raydium_osd_logo("logoc.tga"); draw_music_popup(); raydium_rendering_finish(); raydium_ode_network_element_send_iterative(RAYDIUM_ODE_NETWORK_OPTIMAL); } int main(int argc, char **argv) { //char server[RAYDIUM_MAX_NAME_LEN]; int i; char str[RAYDIUM_MAX_NAME_LEN]; char lagActive[RAYDIUM_MAX_NAME_LEN]; char lagSpeed[RAYDIUM_MAX_NAME_LEN]; int full_sx_i,full_sy_i; int mode; raydium_init_args_name(argc,argv,"mania_drive"); raydium_parser_db_get("ManiaDrive-Windowed",str,"0"); windowed_mode=atoi(str); raydium_parser_db_get("ManiaDrive-WindowedRes",windowed_res,"800x600"); mode=(windowed_mode?RAYDIUM_RENDERING_WINDOW:RAYDIUM_RENDERING_FULLSCREEN); sscanf(windowed_res,"%ix%i",&full_sx_i,&full_sy_i); raydium_window_create(full_sx_i,full_sy_i,mode,version); raydium_parser_db_get("Generic-PlayerName",raydium_network_name_local,NULL); raydium_texture_filter_change(RAYDIUM_TEXTURE_FILTER_TRILINEAR); raydium_projection_near=0.01; raydium_projection_far=1000; raydium_projection_fov=70; //raydium_light_disable(); raydium_fog_disable(); raydium_light_on(0); //raydium_light_on(1); memcpy(raydium_light_color[0],sun,raydium_internal_size_vector_float_4); //raydium_light_intensity[0]=400; raydium_light_intensity[0]=1000000; raydium_light_update_all(0); memcpy(raydium_light_color[1],amb,raydium_internal_size_vector_float_4); raydium_light_intensity[1]=10000; raydium_light_update_all(1); raydium_window_view_update(); /* if(raydium_init_cli_option("server",server)) if(!raydium_network_client_connect_to(server)) exit(1); */ raydium_sound_DefaultReferenceDistance=4.f; sound_car=raydium_sound_LoadWav("murcielago.wav"); raydium_sound_SetSourcePitch(sound_car,0); raydium_sound_SetSourceGain(sound_car,0.1); // Engine Gain sound_checkpoint=raydium_sound_LoadWav("touched.wav"); raydium_sound_SetSourceLoop(sound_checkpoint,0); sound_owww=raydium_sound_LoadWav("owww.wav"); raydium_sound_SetSourceLoop(sound_owww,0); sound_wizz=raydium_sound_LoadWav("wizz.wav"); raydium_sound_SetSourceLoop(sound_wizz,0); strcpy(raydium_console_config_texture,"logo_console.tga"); raydium_sky_box_cache(); strcpy(cam,"corps"); raydium_register_variable(&camx,RAYDIUM_REGISTER_FLOAT,"camx"); raydium_register_variable(&camy,RAYDIUM_REGISTER_FLOAT,"camy"); raydium_register_variable(&camz,RAYDIUM_REGISTER_FLOAT,"camz"); raydium_register_variable(&cam,RAYDIUM_REGISTER_STR,"cam"); raydium_register_variable(&vue,RAYDIUM_REGISTER_INT,"vue"); // read options raydium_parser_db_get("ManiaDrive-CameraLagActive",lagActive,"y"); raydium_parser_db_get("ManiaDrive-CameraSpeed",lagSpeed,"5.0"); camera_lag=(lagActive[0]=='y'?1:0); sscanf(lagSpeed,"%f",&camera_lag_speed); raydium_parser_db_get("ManiaDrive-ShadowSupport",str,"1"); shadow_support=atoi(str); raydium_parser_db_get("ManiaDrive-MusicVolume",str,"1.0"); sscanf(str,"%f",&music_volume); raydium_parser_db_get("ManiaDrive-JoystickEnabled",str,"y"); joystick_enabled=(str[0]=='y'?1:0); raydium_gui_theme_load("maniadrive.gui"); if(raydium_init_cli_option("mni",mni_current)) { simple_mni=1; mni_load(mni_current); } raydium_timecall_add(frame_step,-1); change_game_state(GAME_COUNTDOWN); message[0]=0; mode=MODE_NONE; raydium_sound_music_eof_callback=music_playlist; raydium_sound_music_changed_callback=music_change; raydium_ode_AfterElementDrawCallback=draw_element_after; raydium_ode_CollideCallback=collide; raydium_ode_ObjectNearCollide=nearcall; //raydium_ode_StepCallback=ode_step; object_ground=raydium_ode_object_find("GLOBAL"); object_boxes=raydium_ode_object_find("BOXES"); raydium_network_propag_add(NET_SCORE_TRACK,&track_score,sizeof(Score)); raydium_network_netcall_add(restart_asked_from_network,NET_RESTART,1); raydium_network_netcall_add(netcall_mni_change,NET_CHANGE_MAP,1); raydium_network_netcall_add(netcall_remaining_time,NET_REMAINING,1); for(i=0;i