home *** CD-ROM | disk | FTP | other *** search
/ 3D Games - Real-time Rend…ng & Software Technology / 3D Games - Real-time Rendering & Software Technology.iso / flysdk / frontend / flyServer / flyServer.cpp next >
Encoding:
C/C++ Source or Header  |  2000-12-12  |  8.7 KB  |  463 lines

  1. #include "../../lib/Fly3D.h"
  2. #include <conio.h>
  3.  
  4. #define IDLE_DELAY 50
  5. #define RUNNING_DELAY 10
  6.  
  7. class server_flyEngine : public flyEngine
  8. {
  9. public:
  10.     char line[80];
  11.     int cursor,linecount;
  12.  
  13.     int init_multiplayer(char *gamename);
  14.     void run();
  15.     int get_keys();
  16.     int command(char *str);
  17.     int command_tokens(char *str,char **token);
  18.     void print(char *fmt, ...);
  19.  
  20.     server_flyEngine() 
  21.     { cursor=0; line[0]=0; linecount=0; };
  22. };
  23.  
  24. void main(int an, char **av)
  25. {
  26.     if (an==3 || an==4)
  27.     {
  28.         set_engine(new server_flyEngine,0,0,FLYAPPID_FLYSERV);
  29.  
  30.         char gamename[256];
  31.         strcpy(gamename,av[2]);
  32.  
  33.         init_directx();
  34.         
  35.         printf("Starting Fly3D server...\n\nFlySDK path: %s\n       file: %s\n\n",flyengine->flysdkpath,av[1]);
  36.         if (flyengine->open_fly_file(av[1]) && flyengine->bsp)
  37.             {
  38.             printf("Scene loaded: %i plugins, %i faces, %i vertices\n\n",
  39.                 flyengine->dll.ndll,flyengine->nfaces,flyengine->nvert);
  40.             if (((server_flyEngine *)flyengine)->init_multiplayer(gamename))
  41.                 {
  42.                 ((server_flyEngine *)flyengine)->run();
  43.                 directx->free_multiplayer();
  44.                 }
  45.             else printf("Could not start TCP/IP multiplayer!");
  46.             }
  47.         else printf("Could not open scene file!");
  48.  
  49.         free_engine();
  50.         free_directx();
  51.     }
  52.     else printf("FlyServer.exe flyfile gamename");
  53. }
  54.  
  55. void server_flyEngine::print(char *fmt, ...)
  56. {
  57.     char ach[128];
  58.  
  59.     va_list va;
  60.     va_start( va, fmt );
  61.     wvsprintf( ach, fmt, va );
  62.     va_end( va );
  63.     strcat(ach,"\n");
  64.  
  65.     if (cursor)
  66.         printf("\r%79s\r%s%s","",ach,line);
  67.     else
  68.         printf("%s",ach);
  69. }
  70.  
  71. int server_flyEngine::init_multiplayer(char *gamename)
  72. {
  73.     if (directx->init_multiplayer(0)==0)
  74.         return 0;
  75.  
  76.     if (directx->create_game(&FLYGUID,gamename)==0)
  77.         return 0;
  78.  
  79.     printf("Server started at address: %s\n\n",
  80.         directx->get_player_address(DPID_SERVERPLAYER));
  81.  
  82.     return 1;
  83. }
  84.  
  85. int server_flyEngine::get_keys()
  86. {
  87.     int ret=0;
  88.     if (cursor==0)
  89.         {
  90.         putchar('>');
  91.         line[0]='>';
  92.         line[1]=0;
  93.         cursor=1;
  94.         }
  95.     if (_kbhit())
  96.     {
  97.         int key=_getch();
  98.         if (key==0 || key==224) 
  99.             key=-_getch();
  100.         if (key==27 && cursor>1)
  101.         {
  102.             line[1]=0;
  103.             cursor=1;
  104.             printf("\r%79s\r%s","",line);
  105.         }    
  106.         else
  107.         if (key==8 && cursor>1)
  108.         {
  109.             line[cursor--]=0;
  110.             printf("%c %c",8,8);
  111.         }
  112.         else
  113.         if (key==13)
  114.         {
  115.             printf("\n");
  116.             cursor=0;
  117.             ret=command(&line[1]);
  118.             line[0]=0;
  119.         }
  120.         else
  121.         if (key>27 && cursor<79)
  122.         {
  123.             line[cursor++]=key;
  124.             line[cursor]=0;
  125.             putchar(key);
  126.         }
  127.     }
  128.     return ret;
  129. }
  130.  
  131. void server_flyEngine::run()
  132. {
  133.     int T1=timeGetTime(),frames=0,dt;
  134.     
  135.     while(1)
  136.     {
  137.     if (get_keys())
  138.         break;
  139.  
  140.     if (directx->nplayers==1)
  141.         Sleep(IDLE_DELAY);
  142.  
  143.     dt=step();
  144.     if (dt>0)
  145.         frames++;
  146.  
  147.     if(con.linecount>linecount)
  148.         {
  149.         int i,j=con.linecount-linecount;
  150.         for( i=0;i<j;i++ )
  151.             print(con.buf[i]);
  152.         linecount=con.linecount;
  153.         }
  154.  
  155.     if (dt<RUNNING_DELAY)
  156.         Sleep(RUNNING_DELAY-dt);
  157.     }
  158.  
  159.     int T0=timeGetTime();
  160.     printf("\n%i fps\n",frames*1000/(T0-T1));
  161. }
  162.  
  163. int server_flyEngine::command_tokens(char *str,char **token)
  164. {
  165.     int ntoken=0;
  166.  
  167.     do
  168.     {
  169.     while( *str==' ' )
  170.         *(str++)=0;
  171.     if (*str==0)
  172.         break;
  173.     token[ntoken]=str;
  174.  
  175.     str=strchr(str,' ');
  176.     if (token[ntoken][0]=='(')
  177.         {
  178.         token[ntoken]++;
  179.         str=strchr(token[ntoken],')');
  180.         if (str)
  181.             *(str++)=0;
  182.         }
  183.     if (token[ntoken][0]=='\"')
  184.         {
  185.         token[ntoken]++;
  186.         str=strchr(token[ntoken],'\"');
  187.         if (str)
  188.             *(str++)=0;
  189.         }
  190.  
  191.     ntoken++;
  192.     }while(str);
  193.  
  194.     return ntoken;
  195. }
  196.  
  197. int server_flyEngine::command(char *str) 
  198. {
  199.     char *token[256],buf[256];
  200.     int ntoken;
  201.     int i,j,k;
  202.  
  203.     strcpy(buf,str);
  204.     strlwr(buf);
  205.  
  206.     ntoken=command_tokens(buf,token);
  207.  
  208.     if (ntoken==0)
  209.         {
  210.         set_status_msg("Invalid command!");
  211.         return 0;
  212.         }
  213.     
  214.     if (!strcmp(token[0],"help") || token[0][0]=='?')
  215.         {
  216.         set_status_msg("commands:");
  217.         set_status_msg(" get [ varname | objname.objparam ]");
  218.         set_status_msg(" set [ varname | objname.objparam ] val");
  219.         set_status_msg(" list [ \"plugins\" | \"classes\" | classname | objname ]");
  220.         set_status_msg(" map [ path/level.fly ]");
  221.         set_status_msg(" activate objname");
  222.         set_status_msg(" quit");
  223.         }
  224.     else
  225.     if (!strcmp(token[0],"map"))
  226.     {
  227.         set_status_msg("map: %s",flyfile[0]==0?"(none)":flyfile);
  228.     }
  229.     else
  230.     if (!strcmp(token[0],"quit"))
  231.          return 1;
  232.     else
  233.     if (!strcmp(token[0],"list"))
  234.         {
  235.         char s[256]="";
  236.         if (ntoken==1)
  237.         {
  238.             param_desc pd;
  239.             j=get_global_param_desc(0,0);
  240.             for( k=0;k<j;k++ )
  241.                 {
  242.                 get_global_param_desc(k,&pd);
  243.                 strcpy(s,pd.name);
  244.                 strcat(s,"=");
  245.                 strcat(s,pd.get_string());
  246.                 set_status_msg(s);
  247.                 }
  248.         }
  249.         else
  250.         if (!strcmp(token[1],"plugins"))
  251.             {
  252.             for( i=0;i<dll.ndll;i++ )
  253.                 set_status_msg(dll.dll[i]->dll_filename);
  254.             }
  255.         else
  256.         if (!strcmp(token[1],"classes"))
  257.             {
  258.             for( i=0;i<dll.ncd;i++ )
  259.                 {
  260.                 if (i&1)
  261.                     {
  262.                     j=strlen(dll.cd[i-1]->get_name());
  263.                     if (j<8)
  264.                         strcat(s,"\t");
  265.                     if (j<16)
  266.                         strcat(s,"\t");
  267.                     strcat(s,"\t");
  268.                     }
  269.                 if ((i&1)==0 && i>0)
  270.                     {
  271.                     set_status_msg(s);
  272.                     s[0]=0;
  273.                     }
  274.                 strcat(s,dll.cd[i]->get_name());
  275.                 }
  276.             if (s[0]!=0)
  277.                 set_status_msg(s);
  278.             }
  279.         else
  280.         if (strchr(token[1],'.'))
  281.             {
  282.             char *c=strchr(token[1],'.');
  283.             *c=0;
  284.             bsp_object *o=stock_obj0;
  285.             while(o)
  286.                 {
  287.                 if (!stricmp(o->long_name,token[1]))
  288.                     break;
  289.                 o=(bsp_object *)o->next_obj;
  290.                 }
  291.             if (o)
  292.                 {
  293.                 param_desc pd;
  294.                 j=o->get_param_desc(0,0);
  295.                 for( k=0;k<j;k++ )
  296.                     {
  297.                     o->get_param_desc(k,&pd);
  298.                     if (!stricmp(c+1,pd.name))
  299.                         {
  300.                         strcpy(s,pd.name);
  301.                         strcat(s,"=");
  302.                         strcat(s,pd.get_string());
  303.                         set_status_msg(s);
  304.                         break;
  305.                         }
  306.                     }
  307.                 if (k==j)
  308.                     set_status_msg("Invalid object parameter !");
  309.                 }
  310.             else set_status_msg("Invalid object name!");
  311.             }
  312.         else
  313.             {
  314.             for( i=0;i<dll.ncd;i++ )
  315.                 if (!strcmp(token[1],dll.cd[i]->get_name()))
  316.                     break;
  317.             if (i<dll.ncd)
  318.                 {
  319.                 j=dll.cd[i]->get_type();
  320.                 bsp_object *o=stock_obj0;;
  321.                 while(o)
  322.                     {
  323.                     if (o->type==j)
  324.                         set_status_msg(o->long_name);
  325.                     o=(bsp_object *)o->next_obj;
  326.                     }
  327.                 }
  328.             else
  329.                 {
  330.                 bsp_object *o=stock_obj0;
  331.                 while(o)
  332.                     {
  333.                     if (!stricmp(o->long_name,token[1]))
  334.                         break;
  335.                     o=(bsp_object *)o->next_obj;
  336.                     }
  337.                 if (o==0)
  338.                     set_status_msg("Invalid class/object name!");
  339.                 else 
  340.                     {
  341.                     param_desc pd;
  342.                     j=o->get_param_desc(0,0);
  343.                     for( k=0;k<j;k++ )
  344.                         {
  345.                         o->get_param_desc(k,&pd);
  346.                         strcpy(s,pd.name);
  347.                         strcat(s,"=");
  348.                         strcat(s,pd.get_string());
  349.                         set_status_msg(s);
  350.                         }
  351.                     }
  352.                 }
  353.             }
  354.         }
  355.     else
  356.     if (!strcmp(token[0],"set"))
  357.     {
  358.         if (ntoken<3)
  359.         {
  360.             set_status_msg("Missing parameters!");
  361.             return 0;
  362.         }
  363.  
  364.         if (strchr(token[1],'.'))
  365.         {
  366.             char *c=strchr(token[1],'.');
  367.             *c=0;
  368.             i=set_obj_param(token[1],c+1,token[2]);
  369.             if (i==1)
  370.                 set_status_msg("Invalid object name!");
  371.             else if (i==2) 
  372.                 set_status_msg("Invalid object parameter!");
  373.             else if (i==3) 
  374.                 set_status_msg("Unsuported parameter type!");
  375.             else if (i==-1)
  376.                 {
  377.                 close_texture_cache();
  378.                 init_texture_cache();
  379.                 }
  380.             return 0;
  381.         }
  382.  
  383.         i=get_global_param_desc(0,0);
  384.         param_desc pd;
  385.         for( j=0;j<i;j++ )
  386.             {
  387.             get_global_param_desc(j,&pd);
  388.             if (!stricmp(token[1],pd.name))
  389.                 break;
  390.             }
  391.         if (j==i)
  392.             {
  393.             set_status_msg("Invalid parameter name!");
  394.             return 0;
  395.             }
  396.         pd.set_string(token[2]);
  397.         close_texture_cache();
  398.         init_texture_cache();
  399.         return 0;
  400.     }
  401.     else if (!strcmp(token[0],"activate"))
  402.     {
  403.         bsp_object *o=stock_obj0;
  404.         while(o)
  405.         {
  406.             if (!stricmp(token[1],o->long_name))
  407.                 break;
  408.             o=(bsp_object *)o->next_obj;
  409.         }
  410.         if (o)
  411.             flyengine->activate(o->clone());
  412.         else set_status_msg("Invalid object name!");
  413.     }
  414.     else if (!strcmp(token[0],"get"))
  415.     {
  416.         char s[256]="";
  417.         if (!strncmp(token[1],"obj(",4))
  418.         {
  419.             char *objname=&token[1][4];
  420.             char *objparam=strchr(token[1],'.');
  421.             char *c=strchr(objname,')');
  422.             if (c==0 || objparam==0)
  423.                 {
  424.                 set_status_msg("Invalid sintax!");
  425.                 return 0;
  426.                 }
  427.             *c=0;
  428.             i=get_obj_param(objname,objparam+1,s);
  429.             if (i)
  430.             {
  431.             if (i==1)
  432.                 set_status_msg("Invalid object name!");
  433.             else if (i==2) 
  434.                 set_status_msg("Invalid object parameter!");
  435.             else if (i==3) 
  436.                 set_status_msg("Unsuported parameter type!");
  437.             return 0;
  438.             }
  439.         }
  440.         else
  441.         {
  442.             i=get_global_param_desc(0,0);
  443.             param_desc pd;
  444.             for( j=0;j<i;j++ )
  445.                 {
  446.                 get_global_param_desc(j,&pd);
  447.                 if (!stricmp(token[1],pd.name))
  448.                     break;
  449.                 }
  450.             if (j==i)
  451.                 {
  452.                 set_status_msg("Invalid variable name!");
  453.                 return 0;
  454.                 }
  455.             else strcpy(s,pd.get_string());
  456.         }
  457.         set_status_msg(s);
  458.     }
  459.     else 
  460.         set_status_msg("Invalid command!");
  461.     return 0;
  462. }
  463.