📄 billard3d.c
字号:
OPT_GEOMETRY, OPT_FULLSCREEN, OPT_FREEMOVE, OPT_CUBEREF, OPT_CUBERES, OPT_BUMPREF, OPT_BUMPWOOD, OPT_BALLTRACE, OPT_GAMEMODE, OPT_BALL_FRESNEL, OPT_AVATAR, OPT_TOURFAST, OPT_CLOTHTEX, OPT_DUMMY};static char * appname_str="foobillard";static struct option long_options[] ={ {"player1", required_argument, (int *)"arg=ai|human set player1 ai/human", OPT_PLAYER1}, {"player2", required_argument, (int *)"arg=ai|human set player2 ai/human", OPT_PLAYER2}, {"p1", required_argument, (int *)"arg=ai|human set player1 ai/human", OPT_PLAYER1}, {"p2", required_argument, (int *)"arg=ai|human set player2 ai/human", OPT_PLAYER2}, {"name1", required_argument, (int *)"set name of player1", OPT_NAME1}, {"name2", required_argument, (int *)"set name of player2", OPT_NAME2}, {"8ball", no_argument, (int *)"8ball pool game", OPT_8BALL}, {"9ball", no_argument, (int *)"9ball pool game", OPT_9BALL}, {"carambol", no_argument, (int *)"carambol billard game", OPT_CARAMBOL}, {"snooker", no_argument, (int *)"snooker billard game", OPT_SNOOKER}, {"tablecolor", required_argument, (int *)"table color in C-style hex notation <0xrrggbb>", OPT_TABLECOL}, {"edgecolor", required_argument, (int *)"edge color in C-style hex notation <0xrrggbb>", OPT_EDGECOL}, {"framecolor", required_argument, (int *)"frame color in C-style hex notation <0xrrggbb>", OPT_FRAMECOL}, {"chromeblue", no_argument, (int *)"blue table with chrome edges", OPT_CHROMEBLUE}, {"goldgreen", no_argument, (int *)"green table with gold edges", OPT_GOLDGREEN}, {"goldred", no_argument, (int *)"red table with gold edges", OPT_GOLDRED}, {"blackwhite", no_argument, (int *)"balck table with white frame", OPT_BLACKWHITE}, {"blackbeige", no_argument, (int *)"beige table with balck metal", OPT_BLACKBEIGE}, {"tablesize", required_argument, (int *)"table size (length) in foot (default=7.0)", OPT_TABLESIZE}, {"lensflare", no_argument, (int *)"turn on lensfare", OPT_LENSFLARE}, {"nolensflare", no_argument, (int *)"turn off lensfare", OPT_NOLENSFLARE}, {"poslight", no_argument, (int *)"use positional light", OPT_POSLIGHT}, {"dirlight", no_argument, (int *)"use directional light", OPT_DIRLIGHT}, {"ai1err", required_argument, (int *)"to err is artificial (player1 error 0..1)", OPT_AI1ERR}, {"ai2err", required_argument, (int *)"to err is artificial (player2 error 0..1)", OPT_AI2ERR}, {"balldetail", required_argument, (int *)"set ball detail l[ow] m[edium] h[igh] or v[eryhigh]", OPT_BALLDETAIL}, {"rgstereo", no_argument, (int *)"start in stereo mode (red-green(cyan))", OPT_RGSTEREO}, {"rgaim", required_argument, (int *)"arg=left|right|middle for aiming eye position", OPT_RGAIM},// {"netgame", no_argument, (int *)"host a networkgame (player2=client)", OPT_NETGAME},// {"host", required_argument, (int *)"arg=IP play network game with IP as host", OPT_HOST}, {"hostaddr", required_argument, (int *)"arg=IP-address for TCP/IP connection", OPT_HOSTADDR}, {"portnum", required_argument, (int *)"arg=port# for TCP/IP connection", OPT_PORTNUM}, {"geometry", required_argument, (int *)"<width>x<height> window geometry", OPT_GEOMETRY}, {"fullscreen", no_argument, (int *)"play in fullscreen mode", OPT_FULLSCREEN}, {"freemove", required_argument, (int *)"arg=on|off free move in external view mode", OPT_FREEMOVE}, {"cuberef", required_argument, (int *)"arg=on|off rendered cubemep reflections", OPT_CUBEREF}, {"cuberes", required_argument, (int *)"arg=<texture size for cuberef> (must be power of 2)", OPT_CUBERES}, {"bumpref", required_argument, (int *)"arg=on|off bumpmap reflections of edges", OPT_BUMPREF}, {"bumpwood", required_argument, (int *)"arg=on|off bumpmap of wood covers", OPT_BUMPWOOD}, {"balltraces", required_argument, (int *)"arg=on|off trace lines of balls", OPT_BALLTRACE}, {"gamemode", required_argument, (int *)"arg=match|training|tournament", OPT_GAMEMODE}, {"fresnel", required_argument, (int *)"arg=on|off fresnel ball reflections", OPT_BALL_FRESNEL}, {"avatar", required_argument, (int *)"arg=on|off enable/disable avatar", OPT_AVATAR}, {"tourfast", required_argument, (int *)"arg=1.0..10.0 AI fast motion ratio for tournament", OPT_TOURFAST}, {"clothtex", required_argument, (int *)"arg=on|off for table detail map", OPT_CLOTHTEX}, {"help", no_argument, (int *)"this help", OPT_HELP}, {NULL, 0, NULL, 0}};void set_gametype( int gtype );void process_option(enum optionType act_option){ switch(act_option){ case OPT_PLAYER1: human_player_roster.player[0].is_AI=(optarg[0]=='a')?1:0; human_player_roster.player[0].queue_view=(optarg[0]=='a')?0:1; // FIXME queue_view=human_player_roster.player[0].queue_view; break; case OPT_PLAYER2: human_player_roster.player[1].is_AI=(optarg[0]=='a')?1:0; human_player_roster.player[1].queue_view=(optarg[0]=='a')?0:1; break; case OPT_NAME1: strcpy_uscore_2_whtspace(human_player_roster.player[0].name,optarg); break; case OPT_NAME2: strcpy_uscore_2_whtspace(human_player_roster.player[1].name,optarg); break; case OPT_8BALL: set_gametype( GAME_8BALL ); break; case OPT_9BALL: set_gametype( GAME_9BALL ); break; case OPT_CARAMBOL: set_gametype( GAME_CARAMBOL ); break; case OPT_SNOOKER: set_gametype( GAME_SNOOKER ); break; case OPT_TABLECOL: sscanf(optarg,"%x",&options_table_color); break; case OPT_EDGECOL: sscanf(optarg,"%x",&options_diamond_color); break; case OPT_FRAMECOL: sscanf(optarg,"%x",&options_frame_color); break; case OPT_CHROMEBLUE: options_diamond_color=options_diamond_color_chrome; options_table_color=options_table_color_blue; options_frame_tex_var=1; break; case OPT_GOLDGREEN: options_diamond_color=options_diamond_color_gold; options_table_color=options_table_color_green; options_frame_tex_var=1; break; case OPT_GOLDRED: options_diamond_color=options_diamond_color_gold; options_table_color=options_table_color_red; options_frame_tex_var=1; break; case OPT_BLACKBEIGE: options_diamond_color=options_diamond_color_black; options_table_color=options_table_color_beige; options_frame_tex_var=1; break; case OPT_BLACKWHITE: options_diamond_color=options_diamond_color_black; options_table_color=options_table_color_black; options_frame_tex_var=0; options_frame_color=options_frame_color_white; break; case OPT_TABLESIZE: sscanf(optarg,"%lf",&options_table_size); options_table_size*=0.3048; break; case OPT_LENSFLARE: options_lensflare=1; break; case OPT_NOLENSFLARE: options_lensflare=0; break; case OPT_POSLIGHT: options_positional_light=1; break; case OPT_DIRLIGHT: options_positional_light=0; break; case OPT_AI1ERR: sscanf(optarg,"%lf",&(human_player_roster.player[0].err)); break; case OPT_AI2ERR: sscanf(optarg,"%lf",&(human_player_roster.player[1].err)); break; case OPT_BALLDETAIL: switch(optarg[0]){ case 'l': options_max_ball_detail = options_max_ball_detail_LOW; options_ball_detail_nearmax = options_ball_detail_nearmax_LOW; options_ball_detail_farmin = options_ball_detail_farmin_LOW; break; case 'm': options_max_ball_detail = options_max_ball_detail_MED; options_ball_detail_nearmax = options_ball_detail_nearmax_MED; options_ball_detail_farmin = options_ball_detail_farmin_MED; break; case 'h': options_max_ball_detail = options_max_ball_detail_HIGH; options_ball_detail_nearmax = options_ball_detail_nearmax_HIGH; options_ball_detail_farmin = options_ball_detail_farmin_HIGH; break; case 'v': options_max_ball_detail = options_max_ball_detail_VERYHIGH; options_ball_detail_nearmax = options_ball_detail_nearmax_VERYHIGH; options_ball_detail_farmin = options_ball_detail_farmin_VERYHIGH; break; } break; case OPT_RGSTEREO: options_rgstereo_on=1; break; case OPT_RGAIM: if(optarg[0]=='l') options_rgaim=1; if(optarg[0]=='r') options_rgaim=2; if(optarg[0]=='m') options_rgaim=0; break;/* case OPT_NETGAME: player[1].is_net=1; player[0].is_net=0; g_is_host=1; g_network_play=1; break; case OPT_HOST: player[1].is_net=0; player[0].is_net=1; g_is_host=0; g_network_play=1; options_net_hostname = optarg; break;*/ case OPT_HOSTADDR: strcpy(options_net_hostname,optarg); break; case OPT_PORTNUM: sscanf(optarg,"%d",&options_net_portnum); break; case OPT_GEOMETRY: sscanf(optarg,"%dx%d",&win_width,&win_height); break; case OPT_FULLSCREEN: fullscreen=1; break; case OPT_FREEMOVE: switch(optarg[1]){ case 'f': /* off */ options_free_view_on=0; break; case 'n': /* on */ options_free_view_on=1; break; } break; case OPT_CUBEREF: switch(optarg[1]){ case 'f': /* off */ options_cuberef=0; break; case 'n': /* on */ options_cuberef=1; break; } break; case OPT_CUBERES: sscanf(optarg,"%d", &options_cuberef_res); break; case OPT_BUMPREF: switch(optarg[1]){ case 'f': /* off */ options_bumpref=0; break; case 'n': /* on */ options_bumpref=1; break; } break; case OPT_BUMPWOOD: switch(optarg[1]){ case 'f': /* off */ options_bumpwood=0; break; case 'n': /* on */ options_bumpwood=1; break; } break; case OPT_BALLTRACE: switch(optarg[1]){ case 'f': /* off */ options_balltrace=0; break; case 'n': /* on */ options_balltrace=1; break; } break; case OPT_GAMEMODE: if (strncasecmp("match",optarg,5)==0){ options_gamemode=options_gamemode_match; } else if(strncasecmp("train",optarg,5)==0){ options_gamemode=options_gamemode_training; } else if(strncasecmp("tourn",optarg,5)==0){ options_gamemode=options_gamemode_tournament; } break; case OPT_BALL_FRESNEL:switch(optarg[1]){ case 'f': /* off */ options_ball_fresnel_refl=0; break; case 'n': /* on */ options_ball_fresnel_refl=1; break; } break; case OPT_AVATAR: switch(optarg[1]){ case 'f': /* off */ options_avatar_on=0; break; case 'n': /* on */ options_avatar_on=1; break; } break; case OPT_TOURFAST: sscanf(optarg,"%lf",&options_tourfast); break; case OPT_CLOTHTEX: switch(optarg[1]){ case 'f': /* off */ options_cloth_tex=0; break; case 'n': /* on */ options_cloth_tex=1; break; } break; case OPT_HELP: exit(1); break; case OPT_DUMMY: break; }}void print_help(struct option * opt, char *appname, FILE * io){ int i; fprintf(io,"usage: %s [--option [<arg>]]\n",appname); fprintf(io," options:\n"); for(i=0;opt[i].name!=0;i++){ fprintf(io,"--%s %s\n",opt[i].name,opt[i].has_arg?"<arg>":""); fprintf(io," %s\n",(char *)(opt[i].flag)); opt[i].flag=NULL; } printf("the color <0xrrggbb> means one byte for each red, green, blue\n");// printf("the transparency specification is optional e.g. <0xrrggbb>\n"); fprintf(io,"\n");}int load_config( char *** confv, int * confc, char ** argv, int argc ){ FILE * f; int c,i; char * str; char allstr[64000]; char filename[512]; *confc=1; str=allstr; sprintf(filename,"%s/.foobillardrc",getenv("HOME")); if( (f=fopen(filename,"rb")) != NULL ){ do{ str[0]='-'; str[1]='-'; for( i=2 ; (c=fgetc(f))!='\n' && c!=EOF ; i++ ){ if( c!=' ' && c!=0x13 && c!=0x0A ) str[i]=c; else { str[i]=0; (*confc)++;// while((c=fgetc(f))==' ' && c!=EOF); } } str[i]=0; if( str[2]!=0 ){ (*confc)++;/* fprintf(stderr,"confstring:<%s> confc=%d\n",str,*confc);*/ str+=i+1; } } while( c!=EOF ); *confv = malloc( (argc+*confc)*sizeof(char *) ); str=allstr;/* fprintf(stderr,"allstr:<%s>\n",allstr);*/ (*confv)[0]=argv[0]; for(i=1;i<*confc;i++){ (*confv)[i]=str;/* fprintf(stderr,"confstring2:<%s>\n",(*confv)[i]);*/ if( i!=(*confc)-1 ){ for(;(*str)!=0;str++); str++; } } for(i=1;i<argc;i++){ (*confv)[*confc+i-1]=argv[i]; } (*confc)+=argc-1; } else { (*confv)=argv; *confc=argc;/* fprintf(stderr,"no rc file found\n");*/ }/* printf("number of args = %d\n",*confc); for(i=0;i<*confc;i++){ printf("arg %d = %s\n",i,(*confv)[i]); }*/ return (f!=NULL);}void write_rc(FILE * f, int opt, char * arg){ int i; for( i=0; i<OPT_DUMMY && long_options[i].val!=opt ; i++ ); if( arg!=NULL ){// int j; char argstr[256];// for(j=0;(argstr[j]=arg[j])!=0;j++) if(argstr[j]==' ') argstr[j]=='_'; strcpy_whtspace_2_uscore(argstr,arg); fprintf(f,"%s=%s\n",long_options[i].name,argstr); } else { fprintf(f,"%s\n",long_options[i].name); }}void save_config(){ int opt; FILE * f; char filename[512]; char str[256]; sprintf(filename,"%s/.foobillardrc",getenv("HOME")); if((f=fopen(filename,"wb"))==NULL){ fprintf(stderr,"can't write to %s - check rights\n",filename); return; } for(opt=0;opt<OPT_DUMMY;opt++){ DPRINTF("save_config: writing option %d\n",opt); switch(opt){ case OPT_PLAYER1: write_rc(f,opt,(human_player_roster.player[0].is_AI)?"ai":"human"); break; case OPT_PLAYER2: write_rc(f,opt,(human_player_roster.player[1].is_AI)?"ai":"human"); break; case OPT_NAME1: write_rc(f,opt,human_player_roster.player[0].name); break; case OPT_NAME2: write_rc(f,opt,human_player_roster.player[1].name); break; case OPT_8BALL: if(gametype==GAME_8BALL) write_rc(f,opt,NULL); break; case OPT_9BALL: if(gametype==GAME_9BALL) write_rc(f,opt,NULL); break; case OPT_CARAMBOL: if(gametype==GAME_CARAMBOL) write_rc(f,opt,NULL); break; case OPT_SNOOKER: if(gametype==GAME_SNOOKER) write_rc(f,opt,NULL); break;/* case OPT_TABLECOL: sprintf(str,"0x%06X",&options_table_color); write_rc(OPT_TABCOL,str); break; case OPT_EDGECOL: sprintf(str,"0x%06X",&options_diamond_color); write_rc(OPT_EDGECOL,str); break; case OPT_FRAMECOL: sprintf(str,"0x%06X",&options_frame_color); write_rc(OPT_FRAMECOL,str); break;*/ case OPT_CHROMEBLUE: if( options_diamond_color==options_diamond_color_chrome && options_table_color==options_table_color_blue && options_frame_tex_var==1 ) write_rc(f,opt,NULL); break; case OPT_GOLDGREEN: if( options_diamond_color==options_diamond_color_gold && options_table_color==options_table_color_green && options_frame_tex_var==1 ) write_rc(f,opt,NULL); break; case OPT_GOLDRED: if( options_diamond_color==options_diamond_color_gold && options_table_color==options_table_color_red && options_frame_tex_var==1 ) write_rc(f,opt,NULL); break; case OPT_BLACKBEIGE: if( options_diamond_color==options_diamond_color_black && options_table_color==options_table_color_beige && options_frame_tex_var==1 ) write_rc(f,opt,NULL); break; case OPT_BLACKWHITE: if( options_diamond_color==options_diamond_color_black && options_table_color==options_table_color_black && options_frame_tex_var==0 && options_frame_color==options_frame_color_white ) write_rc(f,opt,NULL); break; case OPT_TABLESIZE: sprintf(str,"%f",options_table_size/0.3048); write_rc(f,opt,str); break; case OPT_LENSFLARE: if (options_lensflare) write_rc(f,opt,NULL); break;/* case OPT_POSLIGHT: options_positional_light=1; break; case OPT_DIRLIGHT: options_positional_light=0; break;*/ case OPT_AI1ERR: sprintf(str,"%f",human_player_roster.player[0].err); write_rc(f,opt,str); break; case OPT_AI2ERR: sprintf(str,"%f",human_player_roster.player[1].err); write_rc(f,opt,str); break; case OPT_BALLDETAIL: if ( options_max_ball_detail == options_max_ball_detail_LOW ){ write_rc(f,opt,"l"); break; } else if( options_max_ball_detail == options_max_ball_detail_MED ){ write_rc(f,opt,"m"); break; } else if( options_max_ball_detail == options_max_ball_detail_HIGH ){ write_rc(f,opt,"h"); break; } else if( options_max_ball_detail == options_max_ball_detail_VERYHIGH ){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -