⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 billard3d.c

📁 这是一个相当棒的Linux下的台球游戏
💻 C
📖 第 1 页 / 共 5 页
字号:
    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 + -