home *** CD-ROM | disk | FTP | other *** search
/ Enter 2005 March / ENTER.ISO / files / fwp-0.0.6-win32-installer.exe / StartServerMenu.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2005-01-21  |  15.9 KB  |  508 lines

  1. #include "StartServerMenu.h"
  2.  
  3. #include "GuiInfo.h"
  4. #include "Gui.h"
  5.  
  6. #include "TextureHandler.h"
  7. #include "version.h"
  8. #include "Display.h"
  9. #include "Renderer.h"
  10. #include "Game.h"
  11. #include "log.h"
  12. #include "Network.h"
  13.  
  14.  
  15. //static int numDummyItems = 1;
  16. //static const char* dummyItems[] = {""};
  17.  
  18. static void CB_SSM_backButton(){
  19.     
  20.     //Gui::startServerMenu->closeAllSubmenus();
  21.     Gui::startServerMenu->close();
  22. }
  23. static void CB_SSM_startButton(){
  24.     Gui::startServerMenu->closeAllSubmenus();
  25.  
  26.     Gui::startServerMenu->applySettings();
  27.  
  28.     Network::info.cvar.network_server_hostName->setValStr("localhost");
  29.     Game::info.cvar.game_clientGame->setVal(false);
  30.  
  31.     Game::init();
  32. }
  33. static void CB_SSM_toggleExpertSettingsButton(){
  34.     if( Gui::startServerMenu->expertSettingsMenu->isOpened() ){
  35.         Gui::startServerMenu->expertSettingsMenu->close();
  36.     }else{
  37.         Gui::startServerMenu->expertSettingsMenu->open();
  38.     }
  39. }
  40.  
  41.  
  42. StartServerMenu::StartServerMenu():Menu("StartServerMenu"){
  43.     int i;
  44.  
  45.     backgroundTexture = TextureHandler::getTexture("gui/menu/main_menu_background.jpg");
  46.  
  47.     TextButton* backButton=new TextButton(40, 100, 120, 25, "< back");
  48.     backButton->setCallbackFunction(&CB_SSM_backButton);
  49.     addMenuItem(backButton);
  50. //    backButton->deactivate();
  51.  
  52.     startButton=new TextButton(640, 100, 120, 25, "start >");
  53.     startButton->setCallbackFunction(&CB_SSM_startButton);
  54.     addMenuItem(startButton);
  55. //    backButton->deactivate();
  56.  
  57.     TextButton* toggleExpertSettingsButton=new TextButton(240, 100, 320, 25, "^ toggle expert settings ^");
  58.     toggleExpertSettingsButton->setCallbackFunction(&CB_SSM_toggleExpertSettingsButton);
  59.     addMenuItem(toggleExpertSettingsButton);
  60. //    backButton->deactivate();
  61.  
  62.  
  63.     expertSettingsMenu = new SSMExpertSettingsMenu();
  64.     addSubmenu( expertSettingsMenu );
  65.  
  66.  
  67.     serverNameTextfield = new Textfield(40, 470, 1, CON_MAX_STRING_LENGTH, "server name: ");
  68.     addMenuItem(serverNameTextfield);
  69. //    serverNameTextfield->deactivate();
  70.  
  71.     serverDescriptionTextfield = new Textfield(40, 450, 1, CON_MAX_STRING_LENGTH, "description: ");
  72.     addMenuItem(serverDescriptionTextfield);
  73.  
  74. //    serverPortTextfield = new Textfield(40, 430, 1, 5, "server port: ");
  75. //    addMenuItem(serverPortTextfield);
  76. //    serverPortTextfield->deactivate();
  77.  
  78.     maxPlayersToggleButtonNumItems = NETWORK_MAX_CLIENTS;
  79.     maxPlayersToggleButtonItems = new char*[maxPlayersToggleButtonNumItems];
  80.     for(i=0;i<maxPlayersToggleButtonNumItems;i++){
  81.         char buff[256];
  82.         sprintf(buff, "%i", i+1);
  83.         maxPlayersToggleButtonItems[i] = newString(buff);
  84.     }
  85.     maxPlayersToggleButton = new ToggleButton(40, 410, (const char**)maxPlayersToggleButtonItems, maxPlayersToggleButtonNumItems, "max players: ");
  86.     addMenuItem(maxPlayersToggleButton);
  87.  
  88.  
  89.  
  90.     gamemodeToggleButtonNumItems = GAME_NUM_MODES;
  91.     gamemodeToggleButtonItems = new char*[gamemodeToggleButtonNumItems];
  92.     for(i=0;i<gamemodeToggleButtonNumItems;i++){
  93.         char buff[256];
  94.         sprintf(buff, "%s", Game::getModeName(i));
  95.         gamemodeToggleButtonItems[i] = newString(buff);
  96.     }
  97.     gamemodeToggleButton = new ToggleButton(40, 390, (const char**)gamemodeToggleButtonItems, gamemodeToggleButtonNumItems, "game mode: ");
  98.     addMenuItem(gamemodeToggleButton);
  99.  
  100.  
  101.     arenaToggleButtonItems[0] = "";
  102.     arenaToggleButtonNumItems = 1;
  103.     arenaToggleButton = new ToggleButton(40, 370, (const char**)arenaToggleButtonItems, arenaToggleButtonNumItems, "arena: ");
  104.     addMenuItem(arenaToggleButton);
  105.  
  106.     allowConsole = true;
  107.  
  108. }
  109.  
  110. StartServerMenu::~StartServerMenu(){
  111.     int i;
  112.  
  113.     if(backgroundTexture!=NULL)
  114.         TextureHandler::releaseTexture(backgroundTexture);
  115.  
  116.     delete expertSettingsMenu;
  117.  
  118.     for(i=0;i<maxPlayersToggleButtonNumItems;i++){
  119.         delete[] maxPlayersToggleButtonItems[i];
  120.     }
  121.     delete[] maxPlayersToggleButtonItems;
  122.  
  123.     for(i=0;i<gamemodeToggleButtonNumItems;i++){
  124.         delete[] gamemodeToggleButtonItems[i];
  125.     }
  126.     delete[] gamemodeToggleButtonItems;
  127.  
  128.  
  129.     deleteArenaInfos();
  130.     deleteArenaCycleElements();
  131. }
  132.  
  133. bool StartServerMenu::open(){
  134.     updateSettings();
  135.  
  136.     opened = true;
  137.     mainLoop();    // waits until menu is closed again
  138.     return true;
  139. }
  140.  
  141.  
  142. void StartServerMenu::drawBackground(){
  143.     glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
  144.     Renderer::drawTexturedQuad(0, 0, DISPLAY_VSCREEN_WIDTH, DISPLAY_VSCREEN_HEIGHT, backgroundTexture);
  145.  
  146.     Renderer::drawQuad(30, 90, 770, 570, Gui::info.var.menu_normalColor, Gui::info.var.menu_backgroundColor);
  147.  
  148.     glColor4fv(Gui::info.var.menu_normalColor);
  149.     drawScaledAndAlignedString(400, 500, 0.8f, 0.8f, Gui::info.var.menu_bigFont, TEXT_ALIGN_CENTER,
  150.         "< START SERVER >");
  151.  
  152.  
  153.     if( arenaToggleButton->isActive() && arenaToggleButton->getIndex() == arenaToggleButtonNumItems-1 ){        // <use arenacycle>-option
  154.         int y = 350;
  155.         for(int i=0;i<arenaCycleElements.size();i++){
  156.             y -= 20;
  157.             drawScaledAndAlignedFormatString(50, y, 1.0f, 1.0f, Gui::info.var.menu_smallFont, TEXT_ALIGN_LEFT, "%s (%i min)"
  158.                 , arenaCycleElements[i].arena, arenaCycleElements[i].durationMillis/1000/60);
  159.         }
  160.     }else if(arenaToggleButton->isActive() && arenaInfos[arenaToggleButton->getIndex()].thumbnail != NULL){    // normal arena
  161.         glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
  162.         Renderer::drawTexturedQuad(50, 150, 250, 350, arenaInfos[arenaToggleButton->getIndex()].thumbnail);
  163.     }
  164.  
  165.     glColor4fv(Gui::info.var.menu_normalColor);
  166.     drawScaledAndAlignedFormatString(DISPLAY_VSCREEN_WIDTH, 0, 0.8f, 0.8f, Gui::info.var.menu_smallFont, TEXT_ALIGN_RIGHT,
  167.         "FIGHT WIN PREVAIL v%s (%s)   %s ", FWP_VERSION_STRING, FWP_OS_STRING, FWP_COPYRIGHT_NOTE);
  168. }
  169. /*
  170. void StartServerMenu::drawArenasBar(){
  171.     for(i=0;i<arenaInfos.size();i++){
  172.         arenaToggleButtonItems[arenaToggleButtonNumItems] = arenaInfos[i].name;
  173.         arenaToggleButtonNumItems++;
  174.     }
  175. }
  176. */
  177.  
  178. void StartServerMenu::readArenaList(){
  179.     char buff[256];
  180.  
  181.     log("Reading 'arenas/arenas.list'...\n");
  182.  
  183.     if( !File::exists("arenas/arenas.list") ){
  184.         error("(in StartServerMenu::readArenaList()): File 'arenas/arenas.list' does not exist.\n\n");
  185.         disableArenaToggleButton();
  186.         return;
  187.     }
  188.  
  189.     File f("arenas/arenas.list", "rt");
  190.     if( !f.isOpen() ){
  191.         error("(in StartServerMenu::readArenaList()): Couldn't open file 'arenas/arenas.list'.\n\n");
  192.         disableArenaToggleButton();
  193.         return;
  194.     }
  195.  
  196.     while(f.readLine(256, buff, true) != -1){
  197.         if(strlen(buff) == 0){
  198.             continue;
  199.         }
  200.  
  201. //printf("trying file '%s'...\n", buff);
  202.         
  203.         File af(buff, "rt");
  204.         if(!af.isOpen()){
  205.             warn("(in StartServerMenu::readArenaList()): Couldn't open file '%s'. Ignoring.\n\n", buff);
  206.             continue;
  207.         }
  208.  
  209.         arenaInfos.push_back( readArenaInfo(&af) );
  210.  
  211.         af.close();
  212.  
  213. //        log("added arena '%s' to list.\n", buff);
  214.     }
  215.  
  216. //    updateArenaToggleButtonItems(gamemodeToggleButton->getIndex());
  217.  
  218. }
  219.  
  220. void StartServerMenu::deleteArenaInfos(){
  221.     arenaInfos.clear();
  222. }
  223.  
  224. arenaInfo_t StartServerMenu::readArenaInfo(File* f){
  225.     char buff[256];
  226.     Tokenizer t(" =\t\n\r\"", "\"");
  227.  
  228.     arenaInfo_t ret;
  229. //    strncpy(ret->filename, f->filename, CON_MAX_STRING_LENGTH);
  230.     strcpy(ret.filename, f->filename);
  231.     ret.thumbnail = NULL;
  232.     strcpy(ret.name, "<NOT DEFINED>");
  233.  
  234.     while(f->readLine(256, buff, true) != -1){
  235.     
  236.     //    printf("line: %s\n", buff);
  237.         t.tokenize(buff);
  238.  
  239.         if(t.tokc==0)
  240.             continue;
  241.  
  242. //        if(t.tokc!=2){
  243. //            warn("(in Arena::readFromFile() (%s, line %i)): Wrong number of tokens (needed 2 but read %i).\n\n", f->line, f->line, t.tokc);
  244. //            continue;
  245. //        }
  246.  
  247.         if(streq(t.tokv[0], "name")){
  248.             strncpy(ret.name, t.tokv[1], CON_MAX_STRING_LENGTH);
  249.         }else if(streq(t.tokv[0], "thumbnailTexture")){
  250.             ret.thumbnail = TextureHandler::getTexture(t.tokv[1]);
  251.         }
  252.     }
  253.  
  254.     return ret;
  255. }
  256.  
  257.  
  258.  
  259. void StartServerMenu::readArenaCycleElements(){
  260.     char buff[256];
  261.  
  262.     const char* arenaCycleList = Game::info.cvar.game_arenaCycleList->getVal();
  263.     log("Reading '%s'...\n", arenaCycleList);
  264.  
  265.     if( !File::exists(arenaCycleList) ){
  266.         error("(in StartServerMenu::readArenaCycleElements()): File '%s' does not exist.\n\n", arenaCycleList);
  267.         disableArenaToggleButton();
  268.         return;
  269.     }
  270.  
  271.     File f(arenaCycleList, "rt");
  272.     if( !f.isOpen() ){
  273.         error("(in StartServerMenu::readArenaCycleElements()): Couldn't open file '%s'.\n\n", arenaCycleList);
  274.         disableArenaToggleButton();
  275.         return;
  276.     }
  277.  
  278.     while(f.readLine(256, buff, true) != -1){
  279.         if(strlen(buff) == 0){
  280.             continue;
  281.         }
  282.  
  283.         Tokenizer t(buff, "\" \t", "\"");
  284.  
  285.         if(t.tokc!=2){
  286.             warn("(in StartServerMenu::readArenaCycleElements()): Wrong number of tokens in line %i of file '%s' (needed 2 but read %i).\n\n", f.line, f.filename, t.tokc);
  287.             continue;
  288.         }
  289.  
  290.         arenaCycleElement_t ace;
  291.         strncpy(ace.arena, t.tokv[0], CON_MAX_STRING_LENGTH);
  292.         ace.durationMillis = atoi(t.tokv[1]) * 60 * 1000;
  293.         arenaCycleElements.push_back( ace );
  294.     }
  295.  
  296. //    updateArenaToggleButtonItems(gamemodeToggleButton->getIndex());
  297.  
  298. }
  299.  
  300. void StartServerMenu::deleteArenaCycleElements(){
  301.     arenaCycleElements.clear();
  302.  
  303. }
  304.  
  305.  
  306.  
  307.  
  308. void StartServerMenu::disableArenaToggleButton(){
  309.     arenaToggleButtonNumItems = 1;
  310.     arenaToggleButtonItems[0] = "<no arena>";
  311.  
  312.     arenaToggleButton->changeItems((const char**)arenaToggleButtonItems, arenaToggleButtonNumItems);
  313.     arenaToggleButton->deactivate();
  314.  
  315.     startButton->deactivate();
  316. }
  317.  
  318. void StartServerMenu::updateArenaToggleButtonItems(){
  319.     int i;
  320.  
  321.     arenaToggleButtonNumItems = 0;
  322.     for(i=0;i<arenaInfos.size();i++){
  323.         arenaToggleButtonItems[arenaToggleButtonNumItems] = arenaInfos[i].name;
  324.         arenaToggleButtonNumItems++;
  325.     }
  326.     arenaToggleButtonItems[arenaToggleButtonNumItems] = "<use arenacycle>";
  327.     arenaToggleButtonNumItems++;
  328.  
  329.     arenaToggleButton->changeItems((const char**)arenaToggleButtonItems, arenaToggleButtonNumItems);
  330.     arenaToggleButton->activate();
  331.     startButton->activate();
  332. }
  333.  
  334.  
  335. void StartServerMenu::applySettings(){
  336.     Network::info.cvar.network_server_name->setValStr(serverNameTextfield->getText());
  337.     Network::info.cvar.network_server_description->setValStr(serverDescriptionTextfield->getText());
  338. //    Network::info.cvar.network_server_port->setValStr(serverPortTextfield->getText());
  339.  
  340.     if( arenaToggleButton->getIndex() == arenaToggleButtonNumItems-1 ){        // <use arenacycle>-option
  341.         Game::info.cvar.game_arena->setValStr("<arenacycle>");
  342.         Game::info.cvar.game_useArenaCycle->setVal( true );
  343.     }else{
  344.         Game::info.cvar.game_arena->setValStr(arenaInfos[arenaToggleButton->getIndex()].filename);
  345.         Game::info.cvar.game_useArenaCycle->setVal( false );
  346.     }
  347.  
  348.  
  349.     Network::info.cvar.network_server_maxClients->setVal(maxPlayersToggleButton->getIndex()+1);
  350.     Game::info.cvar.game_mode->setVal(gamemodeToggleButton->getIndex());
  351. }
  352.  
  353. void StartServerMenu::updateSettings(){
  354.  
  355.     deleteArenaInfos();
  356.     readArenaList();
  357.     deleteArenaCycleElements();
  358.     readArenaCycleElements();
  359.     updateArenaToggleButtonItems();
  360.  
  361.     serverNameTextfield->setText(Network::info.cvar.network_server_name->getVal());
  362.     serverDescriptionTextfield->setText(Network::info.cvar.network_server_description->getVal());
  363. //    char buff[CON_MAX_STRING_LENGTH];
  364. //    serverPortTextfield->setText(Network::info.cvar.network_server_port->getValStr(buff));
  365.  
  366.     maxPlayersToggleButton->setIndex(Network::info.cvar.network_server_maxClients->getVal()-1);
  367.  
  368.     gamemodeToggleButton->setIndex(Game::info.cvar.game_mode->getVal());
  369. }
  370.  
  371.  
  372.  
  373.  
  374.  
  375.  
  376.  
  377.  
  378.  
  379.  
  380.  
  381.  
  382. SSMExpertSettingsMenu::SSMExpertSettingsMenu(): Menu("SSMExpertSettingsMenu"){
  383.     int i;
  384.  
  385.     portToggleButtonNumItems = 65536;
  386.     portToggleButtonItems = new char*[portToggleButtonNumItems];
  387.     for(i=0; i<portToggleButtonNumItems; i++){
  388.         char buff[256];
  389.         sprintf(buff, "%i", i);
  390.         portToggleButtonItems[i] = newString( buff );
  391.     }
  392.     portToggleButton = new ToggleButton(230, 270, (const char**)portToggleButtonItems, portToggleButtonNumItems, "server port: ");
  393.     addMenuItem( portToggleButton );
  394.  
  395.     friendlyFireToggleButtonNumItems = 2;
  396.     friendlyFireToggleButtonItems = new char*[friendlyFireToggleButtonNumItems];
  397.     friendlyFireToggleButtonItems[0] = newString( "enabled" );
  398.     friendlyFireToggleButtonItems[1] = newString( "disabled" );
  399.     friendlyFireToggleButton = new ToggleButton(230, 250, (const char**)friendlyFireToggleButtonItems, friendlyFireToggleButtonNumItems, "friendly fire: ");
  400.     addMenuItem( friendlyFireToggleButton );
  401.  
  402.     ghostTimeToggleButtonNumItems = 20;
  403.     ghostTimeToggleButtonItems = new char*[ghostTimeToggleButtonNumItems];
  404.     for(i=0; i<ghostTimeToggleButtonNumItems; i++){
  405.         char buff[256];
  406.         sprintf(buff, "%i sec", i+1);
  407.         ghostTimeToggleButtonItems[i] = newString( buff );
  408.     }
  409.     ghostTimeToggleButton = new ToggleButton(230, 230, (const char**)ghostTimeToggleButtonItems, ghostTimeToggleButtonNumItems, "ghosttime: ");
  410.     addMenuItem( ghostTimeToggleButton );
  411.  
  412.     voiceMessagesToggleButtonNumItems = 3;
  413.     voiceMessagesToggleButtonItems = new char*[voiceMessagesToggleButtonNumItems];
  414.     voiceMessagesToggleButtonItems[0] = newString( "disabled" );
  415.     voiceMessagesToggleButtonItems[1] = newString( "text only" );
  416.     voiceMessagesToggleButtonItems[2] = newString( "voice+text" );
  417.     voiceMessagesToggleButton = new ToggleButton(230, 210, (const char**)voiceMessagesToggleButtonItems, voiceMessagesToggleButtonNumItems, "voice messages: ");
  418.     addMenuItem( voiceMessagesToggleButton );
  419.     voiceMessagesToggleButton->deactivate();
  420.  
  421.     maxClientIdleTimeToggleButtonNumItems = 6;
  422.     maxClientIdleTimeToggleButtonItems = new char*[maxClientIdleTimeToggleButtonNumItems];
  423.     for(i=0; i<maxClientIdleTimeToggleButtonNumItems; i++){
  424.         char buff[256];
  425.         sprintf(buff, "%i sec", (i+1)*10);
  426.         maxClientIdleTimeToggleButtonItems[i] = newString( buff );
  427.     }
  428.     maxClientIdleTimeToggleButton = new ToggleButton(230, 190, (const char**)maxClientIdleTimeToggleButtonItems, maxClientIdleTimeToggleButtonNumItems, "maxClientIdleTime: ");
  429.     addMenuItem( maxClientIdleTimeToggleButton );
  430.  
  431. }
  432.  
  433. SSMExpertSettingsMenu::~SSMExpertSettingsMenu(){
  434.     int i;
  435.  
  436.     for(i=0;i<portToggleButtonNumItems;i++){
  437.         delete[] portToggleButtonItems[i];
  438.     }
  439.     delete[] portToggleButtonItems;
  440.  
  441.     for(i=0;i<friendlyFireToggleButtonNumItems;i++){
  442.         delete[] friendlyFireToggleButtonItems[i];
  443.     }
  444.     delete[] friendlyFireToggleButtonItems;
  445.  
  446.     for(i=0;i<ghostTimeToggleButtonNumItems;i++){
  447.         delete[] ghostTimeToggleButtonItems[i];
  448.     }
  449.     delete[] ghostTimeToggleButtonItems;
  450.  
  451.     for(i=0;i<voiceMessagesToggleButtonNumItems;i++){
  452.         delete[] voiceMessagesToggleButtonItems[i];
  453.     }
  454.     delete[] voiceMessagesToggleButtonItems;
  455.  
  456.     for(i=0;i<maxClientIdleTimeToggleButtonNumItems;i++){
  457.         delete[] maxClientIdleTimeToggleButtonItems[i];
  458.     }
  459.     delete[] maxClientIdleTimeToggleButtonItems;
  460. }
  461.  
  462. bool SSMExpertSettingsMenu::open(){
  463.     updateSettings();
  464.     return Menu::open();
  465. }
  466.  
  467. bool SSMExpertSettingsMenu::close(){
  468.     applySettings();
  469.     return Menu::close();
  470. }
  471.  
  472. void SSMExpertSettingsMenu::drawBackground(){
  473.     Renderer::drawQuad(220, 135, 580, 300, Gui::info.var.menu_normalColor, Gui::info.var.menu_backgroundColor);
  474. }
  475.  
  476. void SSMExpertSettingsMenu::applySettings(){
  477.     Network::info.cvar.network_server_port->setVal( portToggleButton->getIndex() );
  478.     Game::info.cvar.game_enableFriendlyFire->setVal( friendlyFireToggleButton->getIndex() == 0 );
  479.     Game::info.cvar.game_ghostTime->setVal( (ghostTimeToggleButton->getIndex()+1) * 1000 );
  480.     Game::info.cvar.game_allowVoiceMessages->setVal( voiceMessagesToggleButton->getIndex() );
  481.     Network::info.cvar.network_server_maxClientIdleTime->setVal( (maxClientIdleTimeToggleButton->getIndex()+1) * 10 * 1000);
  482. }
  483.  
  484. void SSMExpertSettingsMenu::updateSettings(){
  485.     portToggleButton->setIndex( Network::info.cvar.network_server_port->getVal() );
  486.     friendlyFireToggleButton->setIndex( Game::info.cvar.game_enableFriendlyFire->getVal() ? 0 : 1 );
  487.  
  488.     int ghostTimeIndex = (Game::info.cvar.game_ghostTime->getVal()/1000) - 1;
  489.     if( ghostTimeIndex > 19 )
  490.         ghostTimeIndex = 19;
  491.     if( ghostTimeIndex < 0 )
  492.         ghostTimeIndex = 0;
  493.  
  494.     ghostTimeToggleButton->setIndex( ghostTimeIndex );
  495.  
  496.     voiceMessagesToggleButton->setIndex( Game::info.cvar.game_allowVoiceMessages->getVal() );
  497.  
  498.     int maxClientIdleTimeIndex = (Network::info.cvar.network_server_maxClientIdleTime->getVal()/1000)/10 - 1;
  499.     if( maxClientIdleTimeIndex > 5 )
  500.         maxClientIdleTimeIndex = 5;
  501.     if( maxClientIdleTimeIndex < 0 )
  502.         maxClientIdleTimeIndex = 0;
  503.  
  504.     maxClientIdleTimeToggleButton->setIndex( maxClientIdleTimeIndex );
  505.  
  506. }
  507.  
  508.