home *** CD-ROM | disk | FTP | other *** search
Wrap
#include "StartServerMenu.h" #include "GuiInfo.h" #include "Gui.h" #include "TextureHandler.h" #include "version.h" #include "Display.h" #include "Renderer.h" #include "Game.h" #include "log.h" #include "Network.h" //static int numDummyItems = 1; //static const char* dummyItems[] = {""}; static void CB_SSM_backButton(){ //Gui::startServerMenu->closeAllSubmenus(); Gui::startServerMenu->close(); } static void CB_SSM_startButton(){ Gui::startServerMenu->closeAllSubmenus(); Gui::startServerMenu->applySettings(); Network::info.cvar.network_server_hostName->setValStr("localhost"); Game::info.cvar.game_clientGame->setVal(false); Game::init(); } static void CB_SSM_toggleExpertSettingsButton(){ if( Gui::startServerMenu->expertSettingsMenu->isOpened() ){ Gui::startServerMenu->expertSettingsMenu->close(); }else{ Gui::startServerMenu->expertSettingsMenu->open(); } } StartServerMenu::StartServerMenu():Menu("StartServerMenu"){ int i; backgroundTexture = TextureHandler::getTexture("gui/menu/main_menu_background.jpg"); TextButton* backButton=new TextButton(40, 100, 120, 25, "< back"); backButton->setCallbackFunction(&CB_SSM_backButton); addMenuItem(backButton); // backButton->deactivate(); startButton=new TextButton(640, 100, 120, 25, "start >"); startButton->setCallbackFunction(&CB_SSM_startButton); addMenuItem(startButton); // backButton->deactivate(); TextButton* toggleExpertSettingsButton=new TextButton(240, 100, 320, 25, "^ toggle expert settings ^"); toggleExpertSettingsButton->setCallbackFunction(&CB_SSM_toggleExpertSettingsButton); addMenuItem(toggleExpertSettingsButton); // backButton->deactivate(); expertSettingsMenu = new SSMExpertSettingsMenu(); addSubmenu( expertSettingsMenu ); serverNameTextfield = new Textfield(40, 470, 1, CON_MAX_STRING_LENGTH, "server name: "); addMenuItem(serverNameTextfield); // serverNameTextfield->deactivate(); serverDescriptionTextfield = new Textfield(40, 450, 1, CON_MAX_STRING_LENGTH, "description: "); addMenuItem(serverDescriptionTextfield); // serverPortTextfield = new Textfield(40, 430, 1, 5, "server port: "); // addMenuItem(serverPortTextfield); // serverPortTextfield->deactivate(); maxPlayersToggleButtonNumItems = NETWORK_MAX_CLIENTS; maxPlayersToggleButtonItems = new char*[maxPlayersToggleButtonNumItems]; for(i=0;i<maxPlayersToggleButtonNumItems;i++){ char buff[256]; sprintf(buff, "%i", i+1); maxPlayersToggleButtonItems[i] = newString(buff); } maxPlayersToggleButton = new ToggleButton(40, 410, (const char**)maxPlayersToggleButtonItems, maxPlayersToggleButtonNumItems, "max players: "); addMenuItem(maxPlayersToggleButton); gamemodeToggleButtonNumItems = GAME_NUM_MODES; gamemodeToggleButtonItems = new char*[gamemodeToggleButtonNumItems]; for(i=0;i<gamemodeToggleButtonNumItems;i++){ char buff[256]; sprintf(buff, "%s", Game::getModeName(i)); gamemodeToggleButtonItems[i] = newString(buff); } gamemodeToggleButton = new ToggleButton(40, 390, (const char**)gamemodeToggleButtonItems, gamemodeToggleButtonNumItems, "game mode: "); addMenuItem(gamemodeToggleButton); arenaToggleButtonItems[0] = ""; arenaToggleButtonNumItems = 1; arenaToggleButton = new ToggleButton(40, 370, (const char**)arenaToggleButtonItems, arenaToggleButtonNumItems, "arena: "); addMenuItem(arenaToggleButton); allowConsole = true; } StartServerMenu::~StartServerMenu(){ int i; if(backgroundTexture!=NULL) TextureHandler::releaseTexture(backgroundTexture); delete expertSettingsMenu; for(i=0;i<maxPlayersToggleButtonNumItems;i++){ delete[] maxPlayersToggleButtonItems[i]; } delete[] maxPlayersToggleButtonItems; for(i=0;i<gamemodeToggleButtonNumItems;i++){ delete[] gamemodeToggleButtonItems[i]; } delete[] gamemodeToggleButtonItems; deleteArenaInfos(); deleteArenaCycleElements(); } bool StartServerMenu::open(){ updateSettings(); opened = true; mainLoop(); // waits until menu is closed again return true; } void StartServerMenu::drawBackground(){ glColor4f(1.0f, 1.0f, 1.0f, 1.0f); Renderer::drawTexturedQuad(0, 0, DISPLAY_VSCREEN_WIDTH, DISPLAY_VSCREEN_HEIGHT, backgroundTexture); Renderer::drawQuad(30, 90, 770, 570, Gui::info.var.menu_normalColor, Gui::info.var.menu_backgroundColor); glColor4fv(Gui::info.var.menu_normalColor); drawScaledAndAlignedString(400, 500, 0.8f, 0.8f, Gui::info.var.menu_bigFont, TEXT_ALIGN_CENTER, "< START SERVER >"); if( arenaToggleButton->isActive() && arenaToggleButton->getIndex() == arenaToggleButtonNumItems-1 ){ // <use arenacycle>-option int y = 350; for(int i=0;i<arenaCycleElements.size();i++){ y -= 20; drawScaledAndAlignedFormatString(50, y, 1.0f, 1.0f, Gui::info.var.menu_smallFont, TEXT_ALIGN_LEFT, "%s (%i min)" , arenaCycleElements[i].arena, arenaCycleElements[i].durationMillis/1000/60); } }else if(arenaToggleButton->isActive() && arenaInfos[arenaToggleButton->getIndex()].thumbnail != NULL){ // normal arena glColor4f(1.0f, 1.0f, 1.0f, 1.0f); Renderer::drawTexturedQuad(50, 150, 250, 350, arenaInfos[arenaToggleButton->getIndex()].thumbnail); } glColor4fv(Gui::info.var.menu_normalColor); drawScaledAndAlignedFormatString(DISPLAY_VSCREEN_WIDTH, 0, 0.8f, 0.8f, Gui::info.var.menu_smallFont, TEXT_ALIGN_RIGHT, "FIGHT WIN PREVAIL v%s (%s) %s ", FWP_VERSION_STRING, FWP_OS_STRING, FWP_COPYRIGHT_NOTE); } /* void StartServerMenu::drawArenasBar(){ for(i=0;i<arenaInfos.size();i++){ arenaToggleButtonItems[arenaToggleButtonNumItems] = arenaInfos[i].name; arenaToggleButtonNumItems++; } } */ void StartServerMenu::readArenaList(){ char buff[256]; log("Reading 'arenas/arenas.list'...\n"); if( !File::exists("arenas/arenas.list") ){ error("(in StartServerMenu::readArenaList()): File 'arenas/arenas.list' does not exist.\n\n"); disableArenaToggleButton(); return; } File f("arenas/arenas.list", "rt"); if( !f.isOpen() ){ error("(in StartServerMenu::readArenaList()): Couldn't open file 'arenas/arenas.list'.\n\n"); disableArenaToggleButton(); return; } while(f.readLine(256, buff, true) != -1){ if(strlen(buff) == 0){ continue; } //printf("trying file '%s'...\n", buff); File af(buff, "rt"); if(!af.isOpen()){ warn("(in StartServerMenu::readArenaList()): Couldn't open file '%s'. Ignoring.\n\n", buff); continue; } arenaInfos.push_back( readArenaInfo(&af) ); af.close(); // log("added arena '%s' to list.\n", buff); } // updateArenaToggleButtonItems(gamemodeToggleButton->getIndex()); } void StartServerMenu::deleteArenaInfos(){ arenaInfos.clear(); } arenaInfo_t StartServerMenu::readArenaInfo(File* f){ char buff[256]; Tokenizer t(" =\t\n\r\"", "\""); arenaInfo_t ret; // strncpy(ret->filename, f->filename, CON_MAX_STRING_LENGTH); strcpy(ret.filename, f->filename); ret.thumbnail = NULL; strcpy(ret.name, "<NOT DEFINED>"); while(f->readLine(256, buff, true) != -1){ // printf("line: %s\n", buff); t.tokenize(buff); if(t.tokc==0) continue; // if(t.tokc!=2){ // warn("(in Arena::readFromFile() (%s, line %i)): Wrong number of tokens (needed 2 but read %i).\n\n", f->line, f->line, t.tokc); // continue; // } if(streq(t.tokv[0], "name")){ strncpy(ret.name, t.tokv[1], CON_MAX_STRING_LENGTH); }else if(streq(t.tokv[0], "thumbnailTexture")){ ret.thumbnail = TextureHandler::getTexture(t.tokv[1]); } } return ret; } void StartServerMenu::readArenaCycleElements(){ char buff[256]; const char* arenaCycleList = Game::info.cvar.game_arenaCycleList->getVal(); log("Reading '%s'...\n", arenaCycleList); if( !File::exists(arenaCycleList) ){ error("(in StartServerMenu::readArenaCycleElements()): File '%s' does not exist.\n\n", arenaCycleList); disableArenaToggleButton(); return; } File f(arenaCycleList, "rt"); if( !f.isOpen() ){ error("(in StartServerMenu::readArenaCycleElements()): Couldn't open file '%s'.\n\n", arenaCycleList); disableArenaToggleButton(); return; } while(f.readLine(256, buff, true) != -1){ if(strlen(buff) == 0){ continue; } Tokenizer t(buff, "\" \t", "\""); if(t.tokc!=2){ 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); continue; } arenaCycleElement_t ace; strncpy(ace.arena, t.tokv[0], CON_MAX_STRING_LENGTH); ace.durationMillis = atoi(t.tokv[1]) * 60 * 1000; arenaCycleElements.push_back( ace ); } // updateArenaToggleButtonItems(gamemodeToggleButton->getIndex()); } void StartServerMenu::deleteArenaCycleElements(){ arenaCycleElements.clear(); } void StartServerMenu::disableArenaToggleButton(){ arenaToggleButtonNumItems = 1; arenaToggleButtonItems[0] = "<no arena>"; arenaToggleButton->changeItems((const char**)arenaToggleButtonItems, arenaToggleButtonNumItems); arenaToggleButton->deactivate(); startButton->deactivate(); } void StartServerMenu::updateArenaToggleButtonItems(){ int i; arenaToggleButtonNumItems = 0; for(i=0;i<arenaInfos.size();i++){ arenaToggleButtonItems[arenaToggleButtonNumItems] = arenaInfos[i].name; arenaToggleButtonNumItems++; } arenaToggleButtonItems[arenaToggleButtonNumItems] = "<use arenacycle>"; arenaToggleButtonNumItems++; arenaToggleButton->changeItems((const char**)arenaToggleButtonItems, arenaToggleButtonNumItems); arenaToggleButton->activate(); startButton->activate(); } void StartServerMenu::applySettings(){ Network::info.cvar.network_server_name->setValStr(serverNameTextfield->getText()); Network::info.cvar.network_server_description->setValStr(serverDescriptionTextfield->getText()); // Network::info.cvar.network_server_port->setValStr(serverPortTextfield->getText()); if( arenaToggleButton->getIndex() == arenaToggleButtonNumItems-1 ){ // <use arenacycle>-option Game::info.cvar.game_arena->setValStr("<arenacycle>"); Game::info.cvar.game_useArenaCycle->setVal( true ); }else{ Game::info.cvar.game_arena->setValStr(arenaInfos[arenaToggleButton->getIndex()].filename); Game::info.cvar.game_useArenaCycle->setVal( false ); } Network::info.cvar.network_server_maxClients->setVal(maxPlayersToggleButton->getIndex()+1); Game::info.cvar.game_mode->setVal(gamemodeToggleButton->getIndex()); } void StartServerMenu::updateSettings(){ deleteArenaInfos(); readArenaList(); deleteArenaCycleElements(); readArenaCycleElements(); updateArenaToggleButtonItems(); serverNameTextfield->setText(Network::info.cvar.network_server_name->getVal()); serverDescriptionTextfield->setText(Network::info.cvar.network_server_description->getVal()); // char buff[CON_MAX_STRING_LENGTH]; // serverPortTextfield->setText(Network::info.cvar.network_server_port->getValStr(buff)); maxPlayersToggleButton->setIndex(Network::info.cvar.network_server_maxClients->getVal()-1); gamemodeToggleButton->setIndex(Game::info.cvar.game_mode->getVal()); } SSMExpertSettingsMenu::SSMExpertSettingsMenu(): Menu("SSMExpertSettingsMenu"){ int i; portToggleButtonNumItems = 65536; portToggleButtonItems = new char*[portToggleButtonNumItems]; for(i=0; i<portToggleButtonNumItems; i++){ char buff[256]; sprintf(buff, "%i", i); portToggleButtonItems[i] = newString( buff ); } portToggleButton = new ToggleButton(230, 270, (const char**)portToggleButtonItems, portToggleButtonNumItems, "server port: "); addMenuItem( portToggleButton ); friendlyFireToggleButtonNumItems = 2; friendlyFireToggleButtonItems = new char*[friendlyFireToggleButtonNumItems]; friendlyFireToggleButtonItems[0] = newString( "enabled" ); friendlyFireToggleButtonItems[1] = newString( "disabled" ); friendlyFireToggleButton = new ToggleButton(230, 250, (const char**)friendlyFireToggleButtonItems, friendlyFireToggleButtonNumItems, "friendly fire: "); addMenuItem( friendlyFireToggleButton ); ghostTimeToggleButtonNumItems = 20; ghostTimeToggleButtonItems = new char*[ghostTimeToggleButtonNumItems]; for(i=0; i<ghostTimeToggleButtonNumItems; i++){ char buff[256]; sprintf(buff, "%i sec", i+1); ghostTimeToggleButtonItems[i] = newString( buff ); } ghostTimeToggleButton = new ToggleButton(230, 230, (const char**)ghostTimeToggleButtonItems, ghostTimeToggleButtonNumItems, "ghosttime: "); addMenuItem( ghostTimeToggleButton ); voiceMessagesToggleButtonNumItems = 3; voiceMessagesToggleButtonItems = new char*[voiceMessagesToggleButtonNumItems]; voiceMessagesToggleButtonItems[0] = newString( "disabled" ); voiceMessagesToggleButtonItems[1] = newString( "text only" ); voiceMessagesToggleButtonItems[2] = newString( "voice+text" ); voiceMessagesToggleButton = new ToggleButton(230, 210, (const char**)voiceMessagesToggleButtonItems, voiceMessagesToggleButtonNumItems, "voice messages: "); addMenuItem( voiceMessagesToggleButton ); voiceMessagesToggleButton->deactivate(); maxClientIdleTimeToggleButtonNumItems = 6; maxClientIdleTimeToggleButtonItems = new char*[maxClientIdleTimeToggleButtonNumItems]; for(i=0; i<maxClientIdleTimeToggleButtonNumItems; i++){ char buff[256]; sprintf(buff, "%i sec", (i+1)*10); maxClientIdleTimeToggleButtonItems[i] = newString( buff ); } maxClientIdleTimeToggleButton = new ToggleButton(230, 190, (const char**)maxClientIdleTimeToggleButtonItems, maxClientIdleTimeToggleButtonNumItems, "maxClientIdleTime: "); addMenuItem( maxClientIdleTimeToggleButton ); } SSMExpertSettingsMenu::~SSMExpertSettingsMenu(){ int i; for(i=0;i<portToggleButtonNumItems;i++){ delete[] portToggleButtonItems[i]; } delete[] portToggleButtonItems; for(i=0;i<friendlyFireToggleButtonNumItems;i++){ delete[] friendlyFireToggleButtonItems[i]; } delete[] friendlyFireToggleButtonItems; for(i=0;i<ghostTimeToggleButtonNumItems;i++){ delete[] ghostTimeToggleButtonItems[i]; } delete[] ghostTimeToggleButtonItems; for(i=0;i<voiceMessagesToggleButtonNumItems;i++){ delete[] voiceMessagesToggleButtonItems[i]; } delete[] voiceMessagesToggleButtonItems; for(i=0;i<maxClientIdleTimeToggleButtonNumItems;i++){ delete[] maxClientIdleTimeToggleButtonItems[i]; } delete[] maxClientIdleTimeToggleButtonItems; } bool SSMExpertSettingsMenu::open(){ updateSettings(); return Menu::open(); } bool SSMExpertSettingsMenu::close(){ applySettings(); return Menu::close(); } void SSMExpertSettingsMenu::drawBackground(){ Renderer::drawQuad(220, 135, 580, 300, Gui::info.var.menu_normalColor, Gui::info.var.menu_backgroundColor); } void SSMExpertSettingsMenu::applySettings(){ Network::info.cvar.network_server_port->setVal( portToggleButton->getIndex() ); Game::info.cvar.game_enableFriendlyFire->setVal( friendlyFireToggleButton->getIndex() == 0 ); Game::info.cvar.game_ghostTime->setVal( (ghostTimeToggleButton->getIndex()+1) * 1000 ); Game::info.cvar.game_allowVoiceMessages->setVal( voiceMessagesToggleButton->getIndex() ); Network::info.cvar.network_server_maxClientIdleTime->setVal( (maxClientIdleTimeToggleButton->getIndex()+1) * 10 * 1000); } void SSMExpertSettingsMenu::updateSettings(){ portToggleButton->setIndex( Network::info.cvar.network_server_port->getVal() ); friendlyFireToggleButton->setIndex( Game::info.cvar.game_enableFriendlyFire->getVal() ? 0 : 1 ); int ghostTimeIndex = (Game::info.cvar.game_ghostTime->getVal()/1000) - 1; if( ghostTimeIndex > 19 ) ghostTimeIndex = 19; if( ghostTimeIndex < 0 ) ghostTimeIndex = 0; ghostTimeToggleButton->setIndex( ghostTimeIndex ); voiceMessagesToggleButton->setIndex( Game::info.cvar.game_allowVoiceMessages->getVal() ); int maxClientIdleTimeIndex = (Network::info.cvar.network_server_maxClientIdleTime->getVal()/1000)/10 - 1; if( maxClientIdleTimeIndex > 5 ) maxClientIdleTimeIndex = 5; if( maxClientIdleTimeIndex < 0 ) maxClientIdleTimeIndex = 0; maxClientIdleTimeToggleButton->setIndex( maxClientIdleTimeIndex ); }