/** ******************************************************************************* @file /gui/contexts/MainMenu.cpp @brief Obrazovka MainMenu @author Pavel @version 0.1 ******************************************************************************/ // #include "gui/contexts/MainMenu.h" #include "gui/common/init_env.h" #include "gui/common/ActiveObjects.h" #include "gui/common/Sounds.h" #include "gui/common/BasicFonts.h" #include "gui/common/Defs.h" #include "gui/GUI.h" // #include "world/world_messages.h" // #include "common/rm/rminit.h" #include "common/compatibility.h" #include "common/Log.h" #include "config.h" // #include "net/locator.h" namespace gui{ /*****************************************************************************/ #define MAX_PROFILES_COUNT 20 #define BORDER 20 #define BUTTON_WIDTH 200 #define BUTTON_HEIGHT 30 #define PROFILEWINDOW_IF_SIZE 23 wchar_t* Version(wchar_t* wbuff, int len){ char buff[64]; snprintf(buff, 64, "ver. %s", VERSION); UTF8toWideChar(buff, wbuff, len); return wbuff; } /*****************************************************************************/ #define MAINWINDOW_WIDTH 300 #define MAINWINDOW_HEIGHT 480 #define MAINWINDOW_X (3*SCREEN_WIDTH/4-MAINWINDOW_WIDTH/2) #define MAINWINDOW_Y ((SCREEN_HEIGHT-MAINWINDOW_HEIGHT)/2) #define MAINMENU_BUTTON_WIDTH 200 #define MAINMENU_BUTTON_HEIGHT 45 #define MAINMENU_BUTTON_X ((MAINWINDOW_WIDTH-MAINMENU_BUTTON_WIDTH)/2) #define MAINMENU_BUTTON_Y 80 #define MAINMENU_BUTTON_Y_NEXT (MAINMENU_BUTTON_HEIGHT+BORDER) #define MAINMENU_GROUP_WIDTH (8*PROFILEWINDOW_IF_SIZE+2) #define MAINMENU_GROUP_X ((MAINWINDOW_WIDTH-MAINMENU_GROUP_WIDTH)/2) TMainWindow::TMainWindow(rm::TRM_txt_i *rmtxti) : TWindow(AO_UNMOVABLE, MAINWINDOW_X, MAINWINDOW_Y, MAINWINDOW_WIDTH, MAINWINDOW_HEIGHT) { wchar_t wtemp[LABEL_MAX_LENGTH]; //nasazeni hlavniho okna nabidky profilenamecaption = new TLabel(rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_PROFILENAME), MAINMENU_GROUP_X, 10); Add(profilenamecaption); ghighlight = new TGroupBar(AO_NORMAL, MAINMENU_GROUP_X, 26, MAINMENU_GROUP_WIDTH, 20); Add(ghighlight); UTF8toWideChar(TGUI::gui_inst->profile->name, wtemp, PROFILEWINDOW_IF_SIZE); profilename = new TLabel(wtemp, 2, 2); ghighlight->Add(profilename); bprofile = new TSoundedTextButton(AO_NORMAL, rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_PROFILECHANGE), MAINMENU_BUTTON_X, MAINMENU_BUTTON_Y, MAINMENU_BUTTON_WIDTH, MAINMENU_BUTTON_HEIGHT, SAMPLE_CLICK); Add(bprofile); blocal = new TSoundedTextButton(AO_NORMAL, rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_SINGLE), MAINMENU_BUTTON_X, MAINMENU_BUTTON_Y + 1 * MAINMENU_BUTTON_Y_NEXT, MAINMENU_BUTTON_WIDTH, MAINMENU_BUTTON_HEIGHT, SAMPLE_CLICK); Add(blocal); bnetwork = new TSoundedTextButton(AO_NORMAL, rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_MULTI), MAINMENU_BUTTON_X, MAINMENU_BUTTON_Y + 2 * MAINMENU_BUTTON_Y_NEXT, MAINMENU_BUTTON_WIDTH, MAINMENU_BUTTON_HEIGHT, SAMPLE_CLICK); Add(bnetwork); boptions = new TSoundedTextButton(AO_NORMAL, rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_OPTIONS), MAINMENU_BUTTON_X, MAINMENU_BUTTON_Y + 3 * MAINMENU_BUTTON_Y_NEXT, MAINMENU_BUTTON_WIDTH, MAINMENU_BUTTON_HEIGHT, SAMPLE_CLICK); Add(boptions); bcredits = new TSoundedTextButton(AO_NORMAL, rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_CREDITS), MAINMENU_BUTTON_X, MAINMENU_BUTTON_Y + 4 * MAINMENU_BUTTON_Y_NEXT, MAINMENU_BUTTON_WIDTH, MAINMENU_BUTTON_HEIGHT, SAMPLE_CLICK); Add(bcredits); bquit = new TSoundedTextButton(AO_NORMAL, rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_QUIT), MAINMENU_BUTTON_X, MAINMENU_BUTTON_Y + 5 * MAINMENU_BUTTON_Y_NEXT, MAINMENU_BUTTON_WIDTH, MAINMENU_BUTTON_HEIGHT, SAMPLE_CLICK); Add(bquit); bquit->setShortcutKey(SDLK_ESCAPE); setBgImage(RASTER_PANEL); //nastav zvuk podle profilu & prehraj "mainmenu theme" if(TSoundInterface::si) { TSoundInterface::si->setSoundVolume(TGUI::gui_inst->profile->sfx_volume/(float)(SOUND_VOLUME_LEVELS-1)); TSoundInterface::si->setMusicVolume(TGUI::gui_inst->profile->music_volume/(float)(MUSIC_VOLUME_LEVELS-1)); TSoundInterface::si->playMusic(MUSIC_MAINMENU_THEME); } } /*****************************************************************************/ #define CHOSEMAPWINDOW_WIDTH 320 #define CHOSEMAPWINDOW_HEIGHT 520 #define CHOSEMAPWINDOW_X (3*SCREEN_WIDTH/4-CHOSEMAPWINDOW_WIDTH/2) #define CHOSEMAPWINDOW_Y ((SCREEN_HEIGHT-CHOSEMAPWINDOW_HEIGHT)/2) #define LIST_WIDTH 280 #define LIST_HEIGHT 200 #define LIST_Y (BORDER+20) #define LIST_X ((CHOSEMAPWINDOW_WIDTH-LIST_WIDTH)/2) #define ITEM_HEIGHT 20 #define ITEM_BORDER 2 #define CHOSEMAP_BUTTON_WIDTH 200 #define CHOSEMAP_BUTTON_HEIGHT 55 #define CHOSEMAP_BUTTON_X ((CHOSEMAPWINDOW_WIDTH-CHOSEMAP_BUTTON_WIDTH)/2) #define CHOSEMAP_BUTTON_Y 50 #define CHOSEMAP_BUTTON_Y_NEXT (CHOSEMAP_BUTTON_HEIGHT+BORDER) #define LOAD_NEW_SHIFT 70 TChoseMap::TChoseMap(rm::TRM_txt_i *rmtxti) : TWindow(AO_UNMOVABLE, CHOSEMAPWINDOW_X, CHOSEMAPWINDOW_Y, CHOSEMAPWINDOW_WIDTH, CHOSEMAPWINDOW_HEIGHT) { wchar_t wtemp[K8_MAX_FILE_NAME_LEN]; chosemap = new TLabel(rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_CHOSEMAP), LIST_X, BORDER+15); Add(chosemap); listbar = new TListBar(AO_NORMAL, LIST_X, LIST_Y + LOAD_NEW_SHIFT, LIST_WIDTH, LIST_HEIGHT); Add(listbar); myrmtxti = rmtxti; rmmapi = (rm::TRM_map_i*)KSendGlobalMessage(MSG_GET_RM_MAP_I, MOD_GUI, MOD_RM, NULL); ginfo = new TGroupBar(AO_NORMAL, LIST_X, LIST_Y+LIST_HEIGHT+4+ LOAD_NEW_SHIFT, LIST_WIDTH, 20); Add(ginfo); linfo = new TLabel(L"", 4, 2); ginfo->Add(linfo); bplay = new TSoundedTextButton(AO_NORMAL, rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_PLAY), CHOSEMAP_BUTTON_X, BORDER + LIST_HEIGHT + LIST_Y + 20 + CHOSEMAP_BUTTON_Y_NEXT, CHOSEMAP_BUTTON_WIDTH, CHOSEMAP_BUTTON_HEIGHT, SAMPLE_CLICK); Add(bplay); bplay->setShortcutKey(SDLK_RETURN); gmapsource = new TGroupBar(AO_NORMAL, LIST_X, BORDER+36, LIST_WIDTH, CHOSEMAP_BUTTON_HEIGHT); Add(gmapsource); rnewgame = new TRadioBox(AO_YES, 20, 11, 10, 10); gmapsource->Add(rnewgame); rloadgame = new TRadioBox(AO_NO, 20, 31, 10, 10); gmapsource->Add(rloadgame); lnewgame = new TLabel(rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_NEWGAME), LIST_X + 20, 11); gmapsource->Add(lnewgame); lnewgame = new TLabel(rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_LOAD), LIST_X + 20, 31); gmapsource->Add(lnewgame); bback = new TSoundedTextButton(AO_NORMAL, rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_BACK), CHOSEMAP_BUTTON_X, BORDER + LIST_HEIGHT + LIST_Y + 20 + 2 * CHOSEMAP_BUTTON_Y_NEXT, CHOSEMAP_BUTTON_WIDTH, CHOSEMAP_BUTTON_HEIGHT, SAMPLE_CLICK); Add(bback); bback->setShortcutKey(SDLK_ESCAPE); //pozadi setBgImage(RASTER_PANEL); //obsah seznamu map changeSource(TChoseMap::chosemapsource_newgame); } TChoseMap::~TChoseMap() { delete rmmapi; } void TChoseMap::updateMapInfo() { int selection; rm::TMapInfo *info; wchar_t player_wstr[LABEL_MAX_LENGTH]; wchar_t size_wstr[LABEL_MAX_LENGTH]; TActiveObject* ao = listbar->getSelectedObject(); if ( ao ) { selection = ao->tag; myrmtxti->getWChar(player_wstr, LABEL_MAX_LENGTH/2, TEXT_PLAYERS); myrmtxti->getWChar(size_wstr, LABEL_MAX_LENGTH/2, TEXT_SIZE); rmmapi->getMapInfo(&info, selection); snwprintf(linfo->text, LABEL_MAX_LENGTH-1, L"%s: %d, %s: %dx%d", player_wstr, info->players, size_wstr, info->sizex - 2 * MAP_BOUND_X, info->sizey - 2 * MAP_BOUND_Y); } else { wcscpy(linfo->text, L""); } } #define LENGTH_OF_NAME_PART_DISPLAYED_IN_LIST 28 void TChoseMap::changeSource(TChoseMapSource newsource) { int i; TItem *item; TLabel *label; wchar_t wtemp[K8_MAX_FILE_NAME_LEN]; DA* mapinfos = NULL; chosemapsource = newsource; listbar->DelNFreeAll(); switch (chosemapsource){ case chosemapsource_newgame:{ //naraj info o novych mapach rmmapi->loadMapsInfo(MAP_TYPE_NEW_GAME,0); rmmapi->getMapsInfo(&mapinfos, MAP_TYPE_NEW_GAME); if (mapinfos) { //vypis mapy do okna for (i = (*mapinfos).getNext(-1); i != -1; i = (*mapinfos).getNext(i)) { if(i == (*mapinfos).getNext(-1)) item = new TItem(AO_YES, ITEM_HEIGHT); else item = new TItem(AO_NO, ITEM_HEIGHT); item->tag = i; listbar->Add(item); UTF8toWideChar((*mapinfos)[i]->name, wtemp, LENGTH_OF_NAME_PART_DISPLAYED_IN_LIST); label = new TLabel(wtemp, ITEM_BORDER, ITEM_BORDER); item->Add(label); } } } break; case chosemapsource_loadgame:{ //naraj info o novych mapach rmmapi->loadMapsInfo(MAP_TYPE_SAVE_GAME,0); rmmapi->getMapsInfo(&mapinfos, MAP_TYPE_SAVE_GAME); if (mapinfos) { //vypis mapy do okna for (i = (*mapinfos).getNext(-1); i != -1; i = (*mapinfos).getNext(i)) { if(i == (*mapinfos).getNext(-1)) item = new TItem(AO_YES, ITEM_HEIGHT); else item = new TItem(AO_NO, ITEM_HEIGHT); item->tag = i; listbar->Add(item); UTF8toWideChar((*mapinfos)[i]->file, wtemp, LENGTH_OF_NAME_PART_DISPLAYED_IN_LIST); label = new TLabel(wtemp, ITEM_BORDER, ITEM_BORDER); item->Add(label); } } } break; } updateMapInfo(); } /*****************************************************************************/ #define MPWINDOW_WIDTH 300 #define MPWINDOW_HEIGHT 215 #define MPWINDOW_X ((SCREEN_WIDTH-MPWINDOW_WIDTH)/2) #define MPWINDOW_Y ((SCREEN_HEIGHT-MPWINDOW_HEIGHT)/2) #define MPWINDOW_BUTTON_WIDTH 200 #define MPWINDOW_BUTTON_HEIGHT 45 #define MPWINDOW_BUTTON_X ((MPWINDOW_WIDTH-MPWINDOW_BUTTON_WIDTH)/2) #define MPWINDOW_BUTTON_Y 20 #define MPWINDOW_BUTTON_Y_NEXT (MPWINDOW_BUTTON_HEIGHT+BORDER) TMultiplayerWindow::TMultiplayerWindow(rm::TRM_txt_i *rmtxti) : TWindow(AO_UNMOVABLE, MPWINDOW_X, MPWINDOW_Y, MPWINDOW_WIDTH, MPWINDOW_HEIGHT) { wchar_t wtemp[LABEL_MAX_LENGTH]; bdirecthost = new TSoundedTextButton(AO_NORMAL, rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_DIRECTHOST), MPWINDOW_BUTTON_X, MPWINDOW_BUTTON_Y + 0 * MPWINDOW_BUTTON_Y_NEXT, MPWINDOW_BUTTON_WIDTH, MPWINDOW_BUTTON_HEIGHT, SAMPLE_CLICK); Add(bdirecthost); bdirectjoin = new TSoundedTextButton(AO_NORMAL, rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_DIRECTJOIN), MPWINDOW_BUTTON_X, MPWINDOW_BUTTON_Y + 1 * MPWINDOW_BUTTON_Y_NEXT, MPWINDOW_BUTTON_WIDTH, MPWINDOW_BUTTON_HEIGHT, SAMPLE_CLICK); Add(bdirectjoin); bback = new TSoundedTextButton(AO_NORMAL, rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_BACK), MPWINDOW_BUTTON_X, MPWINDOW_BUTTON_Y + 2 * MPWINDOW_BUTTON_Y_NEXT, MPWINDOW_BUTTON_WIDTH, MPWINDOW_BUTTON_HEIGHT, SAMPLE_CLICK); Add(bback); bback->setShortcutKey(SDLK_ESCAPE); setBgImage(RASTER_PANEL); } /*****************************************************************************/ #define OPTIONSWINDOW_WIDTH 400 #define OPTIONSWINDOW_HEIGHT 470 #define OPTIONSWINDOW_X ((SCREEN_WIDTH-OPTIONSWINDOW_WIDTH)/2) #define OPTIONSWINDOW_Y ((SCREEN_HEIGHT-OPTIONSWINDOW_HEIGHT)/2) #define OPTIONSWINDOW_BUTTON_WIDTH 150 #define OPTIONSWINDOW_BUTTON_Y (OPTIONSWINDOW_HEIGHT - BUTTON_HEIGHT - BORDER) #define OPTIONSWINDOW_BUTTON_X ((OPTIONSWINDOW_WIDTH - 2*(OPTIONSWINDOW_BUTTON_WIDTH) - BORDER)/2) #define OPTIONSWINDOW_SCROLL_WIDTH 150 #define OPTIONSWINDOW_SCROLL_HEIGHT 18 #define OPTIONSWINDOW_SET_X 190 #define OPTIONSWINDOW_TEXT_X (OPTIONSWINDOW_SET_X - 8 * (int)wcslen(wtemp) - BORDER) #define SPEED_RANGE 3 #define SOUND_RANGE SOUND_VOLUME_LEVELS #define MUSIC_RANGE MUSIC_VOLUME_LEVELS TOptionsWindow::TOptionsWindow(rm::TRM_txt_i *rmtxti) : TWindow(AO_UNMOVABLE, OPTIONSWINDOW_X, OPTIONSWINDOW_Y, OPTIONSWINDOW_WIDTH, OPTIONSWINDOW_HEIGHT) { wchar_t wtemp[LABEL_MAX_LENGTH]; // nadpis lsettingcaption = new TLabel(rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_OPTIONS), BORDER, BORDER); Add(lsettingcaption); group = new TGroupBar(AO_NORMAL, BORDER, BORDER + 20, OPTIONSWINDOW_WIDTH - 2 * BORDER, OPTIONSWINDOW_HEIGHT - BUTTON_HEIGHT - 3 * BORDER - 20); Add(group); // rozliseni rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_RESOLUTION); lresolution = new TLabel(wtemp, OPTIONSWINDOW_TEXT_X, 10); group->Add(lresolution); lbresolution = new TListBar(AO_NORMAL, OPTIONSWINDOW_SET_X, 10, 150, 80); group->Add(lbresolution); // fulscreen rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_FULSCREEN); lfulscreen = new TLabel(wtemp, OPTIONSWINDOW_TEXT_X, 100); group->Add(lfulscreen); chfulscreen = new TCheckBox(AO_NO, OPTIONSWINDOW_SET_X, 100, 18, 18); group->Add(chfulscreen); // hudba rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_MUSICVOLUME); lmusic = new TLabel(wtemp, OPTIONSWINDOW_TEXT_X, 130); group->Add(lmusic); smusicvolume = new TScrollBar(AO_HORIZONTAL, OPTIONSWINDOW_SET_X, 130, OPTIONSWINDOW_SCROLL_WIDTH, OPTIONSWINDOW_SCROLL_HEIGHT); group->Add(smusicvolume); // zvuky rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_SOUNDVOLUME); lsound = new TLabel(wtemp, OPTIONSWINDOW_TEXT_X, 160); group->Add(lsound); ssoundvolume = new TScrollBar(AO_HORIZONTAL, OPTIONSWINDOW_SET_X, 160, OPTIONSWINDOW_SCROLL_WIDTH, OPTIONSWINDOW_SCROLL_HEIGHT); group->Add(ssoundvolume); // jazyk rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_LANGUAGE); lsound = new TLabel(wtemp, OPTIONSWINDOW_TEXT_X, 190); group->Add(lsound); lblanguage = new TListBar(AO_NORMAL, OPTIONSWINDOW_SET_X, 190, 150, 80); group->Add(lblanguage); // rychlost rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_SPEED); lspeed = new TLabel(wtemp, OPTIONSWINDOW_TEXT_X, 280); group->Add(lspeed); sspeed = new TScrollBar(AO_HORIZONTAL, OPTIONSWINDOW_SET_X, 280, OPTIONSWINDOW_SCROLL_WIDTH, OPTIONSWINDOW_SCROLL_HEIGHT); group->Add(sspeed); // battle net rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_ANNOUNCE_GAMES); lbattlenet = new TLabel(wtemp, OPTIONSWINDOW_TEXT_X, 310); group->Add(lbattlenet); chbattlenet = new TCheckBox(AO_NO, OPTIONSWINDOW_SET_X, 310, 18, 18); group->Add(chbattlenet); // battle net rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_AUTOSAVE); lautosave = new TLabel(wtemp, OPTIONSWINDOW_TEXT_X, 330); group->Add(lautosave); chautosave = new TCheckBox(AO_NO, OPTIONSWINDOW_SET_X, 330, 18, 18); group->Add(chautosave); // ok/back bok = new TSoundedTextButton(AO_NORMAL, rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_OK), OPTIONSWINDOW_BUTTON_X, OPTIONSWINDOW_BUTTON_Y, OPTIONSWINDOW_BUTTON_WIDTH, BUTTON_HEIGHT, SAMPLE_CLICK); Add(bok); bok->setShortcutKey(SDLK_RETURN); bback = new TSoundedTextButton(AO_NORMAL, rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_BACK), OPTIONSWINDOW_BUTTON_X + OPTIONSWINDOW_BUTTON_WIDTH + BORDER, OPTIONSWINDOW_BUTTON_Y, OPTIONSWINDOW_BUTTON_WIDTH, BUTTON_HEIGHT, SAMPLE_CLICK); Add(bback); bback->setShortcutKey(SDLK_ESCAPE); setBgImage(RASTER_PANEL); init(); } void TOptionsWindow::init() { rm::TRM_conf_i *rmconfi = (rm::TRM_conf_i*)KSendGlobalMessage(MSG_GET_RM_CONF_I, MOD_GUI, MOD_RM, NULL); // zjisti puvodni hodnoty ispeed = TGUI::gui_inst->profile->speed; if (TSoundInterface::si) { fmusicvolume = TSoundInterface::si->getMusicVolume(); fsoundvolume = TSoundInterface::si->getSoundVolume(); } else { fsoundvolume = 0; fmusicvolume = 0; } // nastavim spravne scrolbary sspeed->ChangeTo(SPEED_RANGE, 1, ispeed-1 ); smusicvolume->ChangeTo(MUSIC_RANGE, 1, ROUND((MUSIC_RANGE - 1) * fmusicvolume) ); ssoundvolume->ChangeTo(SOUND_RANGE, 1, ROUND((SOUND_RANGE - 1) * fsoundvolume) ); // rozliseni Uint32 bpp; int i; TLabel *label; wchar_t wtemp[LABEL_MAX_LENGTH]; for (i = 0; i < RESOLUTIONS_COUNT; i++) { bpp = SDL_VideoModeOK(resolutions[i][0], resolutions[i][1], resolutions[i][2], SDL_FULLSCREEN | SDL_HWSURFACE); if (bpp >= 24) { if (rmconfi->getDefaultResolution() == i) itres[i] = new TItem(AO_YES, 18); else itres[i] = new TItem(AO_NO, 18); snwprintf(wtemp, LABEL_MAX_LENGTH, L"%dx%dx%d", resolutions[i][0], resolutions[i][1], bpp); label = new TLabel(1 + 8 * (13 - (int)wcslen(wtemp)), 1, wtemp); itres[i]->Add(label); } else { itres[i] = new TItem(AO_UNSELECTABLE, 0); } lbresolution->Add(itres[i]); } // fulscreen if (rmconfi->getDefaultFullscreen()) chfulscreen->state |= AO_CHECKED; // jazyky rm::TRM_txt_i *RMtxti = (rm::TRM_txt_i *)KSendMessage(RQUEUE, MSG_GET_RM_TXT_I, MOD_GUI, MOD_RM, NULL); DA langs; RMtxti->getLangs(&langs); TItem *item; for (i = langs.getNext(-1); i != -1; i = langs.getNext(i)) { if (langs[i]->iLangCode == rmconfi->getDefaultLanguage()) { item = new TItem(AO_YES, 18); } else item = new TItem(AO_NO, 18); label = new TLabel(2, 1, L""); UTF8toWideChar(langs[i]->szName, label->text, LABEL_MAX_LENGTH); item->Add(label); lblanguage->Add(item); KMemFree(langs[i]); } // battle net if (TGUI::gui_inst->profile->announce) chbattlenet->state |= AO_CHECKED; // battle net if (TGUI::gui_inst->profile->autosave) chautosave->state |= AO_CHECKED; delete RMtxti; delete rmconfi; } int TOptionsWindow::workInput(INPUT *input) { int ret = TWindow::workInput(input); if (active == AO_PASIVE) return ret; int newspeed = sspeed->pos(); float newmusic = smusicvolume->pos() / (float)(MUSIC_RANGE - 1); float newsound = ssoundvolume->pos() / (float)(SOUND_RANGE - 1); //zvuk if (TSoundInterface::si) { TSoundInterface::si->setMusicVolume(newmusic); TSoundInterface::si->setSoundVolume(newsound); } TGUI::gui_inst->profile->sfx_volume = ssoundvolume->pos(); TGUI::gui_inst->profile->music_volume = smusicvolume->pos(); //rychlost TGUI::gui_inst->profile->speed = newspeed+1; if CLICKED(bok) { ok(); } if CLICKED(bback) { cancel(); } return ret; } void TOptionsWindow::ok() { alert = false; int i, j; // rozliseni int resindex = lbresolution->getSelection(); //rozliseni se meni az pri restartovani programu // TGUI::gui_inst->screen->switchResolution(resolutions[resindex][0], resolutions[resindex][1],resolutions[resindex][2],(CHECKED(chfulscreen))); rm::TRM_conf_i *rmconfi = (rm::TRM_conf_i*)KSendGlobalMessage(MSG_GET_RM_CONF_I, MOD_GUI, MOD_RM, NULL); // rozliseni if ( (resindex >= 0) && (resindex < RESOLUTIONS_COUNT) && (resindex != rmconfi->getDefaultResolution()) ) { alert = true; rmconfi->setDefaultResolution(resindex); } // fulscreen if (CHECKED(chfulscreen) != rmconfi->getDefaultFullscreen() ) { alert = true; rmconfi->setDefaultFullscreen(CHECKED(chfulscreen)); } // jazyk int langindex = -1; rm::TRM_txt_i *RMtxti = (rm::TRM_txt_i *)KSendMessage(RQUEUE, MSG_GET_RM_TXT_I, MOD_GUI, MOD_RM, NULL); DA langs; RMtxti->getLangs(&langs); j = 1; for (i = langs.getNext(-1); i != -1, j <= lblanguage->getSelection() + 1; i = langs.getNext(i), j++) { langindex = langs[i]->iLangCode; KMemFree(langs[i]); } if ( (langindex > 0) && (rmconfi->getDefaultLanguage() != langindex)) { alert = true; rmconfi->setDefaultLanguage(langindex); } // battle net TGUI::gui_inst->profile->announce = CHECKED(chbattlenet); // savegame TGUI::gui_inst->profile->autosave = CHECKED(chautosave); delete RMtxti; delete rmconfi; } void TOptionsWindow::cancel() { //restartovat zvuk if (TSoundInterface::si) { TSoundInterface::si->setMusicVolume(fmusicvolume); TSoundInterface::si->setSoundVolume(fsoundvolume); } TGUI::gui_inst->profile->sfx_volume = (int)(fsoundvolume*(SOUND_RANGE - 1)); TGUI::gui_inst->profile->music_volume = (int)(fmusicvolume*(MUSIC_RANGE - 1)); //restartovat rychlost TGUI::gui_inst->profile->speed = ispeed+1; } /*****************************************************************************/ #define CREDITSTITLES_WIDTH 300 #define CREDITSTITLES_HEIGHT (SCREEN_HEIGHT/2) #define CREDITSTITLES_X ((SCREEN_WIDTH-CREDITSTITLES_WIDTH)/2) #define CREDITSTITLES_Y ((SCREEN_HEIGHT-CREDITSTITLES_HEIGHT)/2) #define CREDITSTITLES_DELAY 200 TCreditsTitles::TCreditsTitles() :TScrollingTitles(CREDITSTITLES_X, CREDITSTITLES_Y, CREDITSTITLES_WIDTH, CREDITSTITLES_HEIGHT, CREDITSTITLES_DELAY) { //experimentalni verze!! addLine(L""); addLine(L""); addLine(L""); addLine(L""); addLine(L""); addLine(L""); addLine(L""); addLine(L""); addLine(L""); addLine(L""); addLine(L""); addLine(L""); addLine(L"/* */"); addLine(L"/* 8 KINGDOMS */"); addLine(L"/* ------------ */" ); addLine(L"/* */"); addLine(L"/* ver. 1.1.0 */"); addLine(L""); addLine(L""); addLine(L"8 Kingdoms started as a software project"); addLine(L""); addLine(L"at Charles University in Prague, Czech Republic"); addLine(L""); addLine(L""); addLine(L"Because there are people who enjoy the game,"); addLine(L""); addLine(L"we decided to continue working on it..."); addLine(L""); addLine(L""); addLine(L"We thank to everyone, who somehow participated"); addLine(L""); addLine(L"on this ongoing effort."); addLine(L""); addLine(L""); addLine(L""); addLine(L""); addLine(L"Current team members: "); addLine(L""); addLine(L"Vojtech Hlaves - Coordinator, Networking, RM"); addLine(L""); addLine(L"Vaclav Krajicek - Game design, GUI, Linux distribution "); addLine(L""); addLine(L"Jason Drekler - Modeling"); addLine(L""); addLine(L"Greg - French translation"); addLine(L""); addLine(L""); addLine(L""); addLine(L"Thanks to: "); addLine(L""); addLine(L"Antti Waris - Finnish translation "); addLine(L""); addLine(L"David Lenaerts - Music "); addLine(L""); addLine(L""); addLine(L""); addLine(L"Previous team members: "); addLine(L""); addLine(L"Marta Vomlelova (till 1.0.0) - Supervisor at University "); addLine(L""); addLine(L"Pavel Zoha (till 1.0.0) - GUI "); addLine(L""); addLine(L"Petr Zita (till 1.0.0) - AI, Editor "); addLine(L""); addLine(L"Petr Wolf (till 1.0.0) - World (rules) engine "); addLine(L""); addLine(L""); addLine(L""); addLine(L""); addLine(L""); addLine(L""); addLine(L""); addLine(L""); addLine(L" ... press ESC to continue ... "); } /*****************************************************************************/ #define INBORDER 10 #define GETIPWINDOW_WIDTH 530 #define GETIPWINDOW_HEIGHT 420 #define GETIPWINDOW_X ((SCREEN_WIDTH-GETIPWINDOW_WIDTH)/2) #define GETIPWINDOW_Y ((SCREEN_HEIGHT-GETIPWINDOW_HEIGHT)/2) #define GETIPWINDOW_IF_SIZE ((GETIPWINDOW_WIDTH-2*BORDER-INBORDER-150)/8-1) #define GETIPWINDOW_IF_HEIGHT 25 #define GETIPWINDOW_BUTTON_HEIGHT 30 #define GETIPWINDOW_BUTTON_WIDTH 100 #define GETIPWINDOW_IF_PANEL_HEIGHT (GETIPWINDOW_IF_HEIGHT+2*INBORDER) #define GETIPWINDOW_BATTLENET_HEIGHT (GETIPWINDOW_HEIGHT - (GETIPWINDOW_IF_PANEL_HEIGHT+INBORDER+BORDER) - (GETIPWINDOW_BUTTON_HEIGHT+2*INBORDER+BORDER))/2 #define GETIPWINDOW_LOCALNET_HEIGHT (GETIPWINDOW_HEIGHT - (GETIPWINDOW_IF_PANEL_HEIGHT+INBORDER+BORDER) - (GETIPWINDOW_BUTTON_HEIGHT+2*INBORDER+BORDER))/2 TGetIPWindow::TGetIPWindow(rm::TRM_txt_i *rmtxti) : TWindow(AO_UNMOVABLE, GETIPWINDOW_X, GETIPWINDOW_Y, GETIPWINDOW_WIDTH, GETIPWINDOW_HEIGHT) { wchar_t wtemp[LABEL_MAX_LENGTH]; TGroupBar* group1 = new TGroupBar(AO_NORMAL, BORDER, BORDER, GETIPWINDOW_WIDTH-2*BORDER, GETIPWINDOW_IF_PANEL_HEIGHT); Add(group1); lIPcaption = new TLabel(rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_HOSTIP), INBORDER, INBORDER); group1->Add(lIPcaption); tfIP = new TLineTextField(150, INBORDER, GETIPWINDOW_IF_SIZE); group1->Add(tfIP); /// TGroupBar* group2 = new TGroupBar(AO_NORMAL, BORDER, GETIPWINDOW_IF_PANEL_HEIGHT+BORDER+INBORDER, GETIPWINDOW_WIDTH-2*BORDER, GETIPWINDOW_BATTLENET_HEIGHT); Add(group2); lBattleNet = new TLabel(rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_8KWW), INBORDER, INBORDER); group2->Add(lBattleNet); lbBattleNetServers = new TListBar(AO_NORMAL, INBORDER, INBORDER+BORDER, GETIPWINDOW_WIDTH-2*BORDER-2*INBORDER, GETIPWINDOW_BATTLENET_HEIGHT-3*BORDER); group2->Add(lbBattleNetServers); /// TGroupBar* group3 = new TGroupBar(AO_NORMAL, BORDER, GETIPWINDOW_IF_PANEL_HEIGHT+2*INBORDER+BORDER+GETIPWINDOW_BATTLENET_HEIGHT, GETIPWINDOW_WIDTH-2*BORDER, GETIPWINDOW_BATTLENET_HEIGHT); Add(group3); lLocalNet = new TLabel(rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_LANGAMES), INBORDER, INBORDER); group3->Add(lLocalNet); lbLocalNetServers = new TListBar(AO_NORMAL, INBORDER, INBORDER+BORDER, GETIPWINDOW_WIDTH-2*BORDER-2*INBORDER, GETIPWINDOW_LOCALNET_HEIGHT-3*BORDER); group3->Add(lbLocalNetServers); /// bconnect = new TSoundedTextButton(AO_NORMAL, rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_CONNECT), GETIPWINDOW_WIDTH/2 - GETIPWINDOW_BUTTON_WIDTH - (BORDER/2), GETIPWINDOW_HEIGHT - BORDER - GETIPWINDOW_BUTTON_HEIGHT, GETIPWINDOW_BUTTON_WIDTH, GETIPWINDOW_BUTTON_HEIGHT, SAMPLE_CLICK); Add(bconnect); bconnect->setShortcutKey(SDLK_RETURN); bback = new TSoundedTextButton(AO_NORMAL, rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_BACK), GETIPWINDOW_WIDTH/2 - (BORDER/2) + BORDER, GETIPWINDOW_HEIGHT - BORDER - GETIPWINDOW_BUTTON_HEIGHT, GETIPWINDOW_BUTTON_WIDTH, GETIPWINDOW_BUTTON_HEIGHT, SAMPLE_CLICK); Add(bback); bback->setShortcutKey(SDLK_ESCAPE); setBgImage(RASTER_PANEL); } void TGetIPWindow::unloadBattleNetGames(){ for(std::vector::iterator it = battlenetdata.begin(); it != battlenetdata.end(); it++) KMemFree(*it); battlenetdata.clear(); } void TGetIPWindow::unloadLocalNetGames(){ for(std::vector::iterator it = localnetdata.begin(); it != localnetdata.end(); it++) KMemFree(*it); localnetdata.clear(); } void TGetIPWindow::loadBattleNetGames( DA* p ){ //udelej misto unloadBattleNetGames(); lbBattleNetServers->DelNFreeAll(); // for (int i = (*p).getNext(-1); i != -1; i = (*p).getNext(i)) { char buff[255]; wchar_t wbuff[255]; snprintf(buff, 255, "%-15s %-10s %-20s %d", (*p)[i]->ip, (*p)[i]->mapname, (*p)[i]->description, (*p)[i]->players ); // net::TGames* ng = (net::TGames*)KMemAlloc( sizeof(net::TGames) ); memcpy(ng, (*p)[i], sizeof(net::TGames)); battlenetdata.push_back( ng ); TItem* item = new TItem(AO_NO, ITEM_HEIGHT); item->tag = *((int*)&ng); lbBattleNetServers->Add(item); // TLabel* label = new TLabel(UTF8toWideChar(buff, wbuff, 255), ITEM_BORDER, ITEM_BORDER); item->Add(label); }//for } void TGetIPWindow::loadLocalNetGames( DA* p ){ //udelej misto unloadLocalNetGames(); lbLocalNetServers->DelNFreeAll(); // for (int i = (*p).getNext(-1); i != -1; i = (*p).getNext(i)) { char buff[255]; wchar_t wbuff[255]; snprintf(buff, 255, "%-15s %-30s %d", (*p)[i]->ip, (*p)[i]->mapname, (*p)[i]->players ); // net::TGames* ng = (net::TGames*)KMemAlloc( sizeof(net::TGames) ); memcpy(ng, (*p)[i], sizeof(net::TGames)); localnetdata.push_back( ng ); TItem* item = new TItem(AO_NO, ITEM_HEIGHT); item->tag = *((int*)&ng); lbLocalNetServers->Add(item); // TLabel* label = new TLabel(UTF8toWideChar(buff, wbuff, 255), ITEM_BORDER, ITEM_BORDER); item->Add(label); }//for } TGetIPWindow::~TGetIPWindow(){ unloadBattleNetGames(); unloadLocalNetGames(); } /*****************************************************************************/ #define PROFILEWINDOW_WIDTH 250 #define PROFILEWINDOW_HEIGHT 345 #define PROFILEWINDOW_X ((SCREEN_WIDTH-PROFILEWINDOW_WIDTH)/2) #define PROFILEWINDOW_Y ((SCREEN_HEIGHT-PROFILEWINDOW_HEIGHT)/2) TProfileWindow::TProfileWindow(rm::TRM_txt_i *rmtxti) : TWindow(AO_UNMOVABLE, PROFILEWINDOW_X, PROFILEWINDOW_Y, PROFILEWINDOW_WIDTH, PROFILEWINDOW_HEIGHT) { wchar_t wtemp[LABEL_MAX_LENGTH]; lprofilenamecaption = new TLabel(rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_PROFILENAME), BORDER, BORDER); Add(lprofilenamecaption); tfprofilename = new TLineTextField(BORDER, BORDER + 25, PROFILEWINDOW_IF_SIZE); Add(tfprofilename); badd = new TSoundedTextButton(AO_NORMAL, rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_PROFILEADD), PROFILEWINDOW_WIDTH - BORDER - 100, BORDER+50, 100, 30, SAMPLE_CLICK); Add(badd); lprofilescaption = new TLabel(rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_PROFILES), BORDER, BORDER+90); Add(lprofilescaption); listbar = new TListBar(AO_NORMAL, BORDER, BORDER + 110, 210, 150); Add(listbar); rmconfi = (rm::TRM_conf_i*)KSendGlobalMessage(MSG_GET_RM_CONF_I, MOD_GUI, MOD_RM, NULL); bok = new TSoundedTextButton(AO_NORMAL, rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_PROFILEOK), BORDER, BORDER + 270, 100, 30, SAMPLE_CLICK); Add(bok); bok->setShortcutKey(SDLK_RETURN); bdelete = new TSoundedTextButton(AO_NORMAL, rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_PROFILEDEL), PROFILEWINDOW_WIDTH - BORDER - 100, BORDER + 270, 100, 30, SAMPLE_CLICK); Add(bdelete); //pozadi setBgImage(RASTER_PANEL); //obsah seznamu updateProfileList(); } int TProfileWindow::workInput(INPUT *input) { if FOCUSED(tfprofilename) { bok->setShortcutKey((SDLKey)0); badd->setShortcutKey(SDLK_RETURN); } else { bok->setShortcutKey(SDLK_RETURN); badd->setShortcutKey((SDLKey)0); } return TWindow::workInput(input); } void TProfileWindow::updateProfileList(int selid) { wchar_t wtemp[LABEL_MAX_LENGTH]; TLabel *label; TItem *item; DA *profiles; rm::TProfile **profiledata; int lastp = -1, actp; rmconfi->getProfiles(&profiles); profiledata = profiles->getData(); listbar->DelNFreeAll(); do { actp = profiles->getNext(lastp); if (actp > -1) { if ( ((lastp == -1)&&(selid == -1)) || (actp == selid) ) item = new TItem(AO_YES, ITEM_HEIGHT); else item = new TItem(AO_NO, ITEM_HEIGHT); item->tag = actp; listbar->Add(item); UTF8toWideChar(profiledata[actp]->name, wtemp, K8_MAX_FILE_NAME_LEN); label = new TLabel(wtemp, ITEM_BORDER, ITEM_BORDER); item->Add(label); } lastp = actp; } while (actp > -1); } int TProfileWindow::getSelectedProfileId() { TActiveObject* ao = listbar->getSelectedObject(); if ( !ao ) return -1; return ao->tag; } int TProfileWindow::getFirstFreeProfileId() { bool profileIsUsed[MAX_PROFILES_COUNT]; int profileid; int i; for (i = 0; i < MAX_PROFILES_COUNT; i++) profileIsUsed[i] = false; DA *profiles; rmconfi->getProfiles(&profiles); profileid = -1; do { profileid = profiles->getNext(profileid); if (profileid > -1) { profileIsUsed[ (*profiles)[profileid]->id-1 ] = true; } } while (profileid != -1); for (i = 0; (i < MAX_PROFILES_COUNT) && (profileIsUsed[i]); i++); if (i < MAX_PROFILES_COUNT) return i + 1; else return -1; } void TProfileWindow::setProfile2GUI() { int id = getSelectedProfileId(); DA *profiles; rmconfi->getProfiles(&profiles); gui::TGUI::gui_inst->profile = (*profiles)[id]; //nastvit jako posledni pouzity rmconfi->setLastUsedProfile(id); } TProfileWindow::~TProfileWindow() { delete rmconfi; } /*****************************************************************************/ TMainMenu::TMainMenu(TContextParameter contextparameter) { // rmtxti = (rm::TRM_txt_i*)KSendGlobalMessage(MSG_GET_RM_TXT_I, MOD_GUI, MOD_RM, NULL); switchTo(mmsUndefined); } TMainMenu::~TMainMenu() { // vypusti a odalokuje vsechny aktivni prvky v sobe (rekursivne) DelNFreeAll(); // delete rmtxti; } TContext* TMainMenu::createContext(...){ TMainMenu* n = new TMainMenu(TContextParameter()); strcpy(n->szName,"MAINMENU"); return n; } void TMainMenu::activateContext(TContextParameter contextparameter) { // kdyz je kurzor na kraji obrazovky tak se nezmeni jeho obrazek na sipku TaoKernel::aoKernel->cursor->scrolling = false; //defaultni nastaveni hlasitosti, pokud jeste neni znam profil if(TSoundInterface::si && !TGUI::gui_inst->profile){ TSoundInterface::si->setSoundVolume(0); TSoundInterface::si->setMusicVolume(0); } switch(contextparameter.iPrimary){ case context_profile: switchTo(mmsProfileDialog); break; case context_mainmenu: switchTo(mmsMainMenu); break; case context_localmultigame: switchTo(mmsLocalGameChooseMap); break; case context_networkhostgame: switchTo(mmsNetworkGameChooseMap); break; case context_networkjoingame: switchTo(mmsNetworkGameChooseMode); break; default: GLOBALLOG("TMainMenu::activateContext(): wrong context parametr"); break; } } void TMainMenu::deactivateContext() { DelNFreeAll(); } void TMainMenu::drawContext(){ //obrazovka TFrame::drawObject(); } void TMainMenu::battleNetGames( DA* p ){ if(getipwindow) getipwindow->loadBattleNetGames( p ); } void TMainMenu::localNetGames( DA* p ){ if(getipwindow) getipwindow->loadLocalNetGames( p ); } void TMainMenu::switchTo(TMainMenuStates state) { DelNFreeAll(); mainwindow = NULL; networkchosemap = NULL; localchosemap = NULL; multiplayerwindow = NULL; optionswindow = NULL; optionsalertwindow = NULL; credits = NULL; getipwindow = NULL; profilewindow = NULL; errconnection = NULL; //vstup switch(state){ case mmsProfileDialog: profilewindow = new TProfileWindow(rmtxti); Add(profilewindow); break; case mmsMainMenu: //pozadi background = new TWallpaper(RASTER_MAINMENU_BG, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); Add(background); //hlavni okno mainwindow = new TMainWindow(rmtxti); Add(mainwindow); break; case mmsOptions: optionswindow = new TOptionsWindow(rmtxti); Add(optionswindow); break; case mmsOptionsAlert: optionsalertwindow = new TErrorWindow(TEXT_OPTIONSALERT, ewtNotice, true); Add(optionsalertwindow); break; case mmsCredists:{ credits = new TCreditsTitles(); Add(credits); }break; case mmsLocalGameChooseMap: background = new TWallpaper(RASTER_CHOOSEMAP_BG, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); Add(background); localchosemap = new TChoseMap(rmtxti); Add(localchosemap); break; case mmsNetworkGameChooseMode: multiplayerwindow = new TMultiplayerWindow(rmtxti); Add(multiplayerwindow); break; case mmsNetworkGameChooseMap: background = new TWallpaper(RASTER_CHOOSEMAP_BG, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); Add(background); networkchosemap = new TChoseMap(rmtxti); Add(networkchosemap); break; case mmsNetworkGameIP: getipwindow = new TGetIPWindow(rmtxti); Add(getipwindow); break; case mmsNetworkGameErr: errconnection = new TErrorWindow(TEXT_ERRCONNECTION, ewtNotice, true); Add(errconnection); break; } //ad-hoc titulek verze wchar_t wbuff[64]; Add( new TLabel(Version(wbuff, 64), 10, SCREEN_HEIGHT-16) ); } void TMainMenu::connectionFailed() { if (getipwindow) { switchTo(mmsNetworkGameErr); } else { KSendGlobalMsg(MSG_NET_STOPCLIENT, MOD_GUI, MOD_NET, NULL); KSendGlobalMessage(MSG_SEARCH_GAMES, MOD_GUI, MOD_NET, NULL); } } void TMainMenu::connectionSuccessful() { switchTo(mmsUndefined); TGUI::gui_inst->screen->selectContext("MULTIJOIN", TContextParameter() ); } int TMainMenu::workInput(INPUT *input) { int ret=TContext::workInput(input); //vyber profilu if (profilewindow) { if CLICKED(profilewindow->badd) { wchar_t *wcprofilename = profilewindow->tfprofilename->getText(); if (wcslen(wcprofilename) == 0) return ret; rm::TProfile profile; profile.id = profilewindow->getFirstFreeProfileId(); if (profile.id > -1) { WideChartoUTF8(wcprofilename, profile.name, K8_MAX_NAME_LEN); profilewindow->rmconfi->addProfile(&profile); profilewindow->updateProfileList(profile.id); profilewindow->tfprofilename->setText(L""); profilewindow->tfprofilename->restart(); } return ret; } if CLICKED(profilewindow->bok) { int profileid = profilewindow->getSelectedProfileId(); if (profileid > -1) { profilewindow->setProfile2GUI(); switchTo(mmsMainMenu); } return ret; } if CLICKED(profilewindow->bdelete) { int profileid = profilewindow->getSelectedProfileId(); if (profileid > -1) profilewindow->rmconfi->deleteProfile(profileid); profilewindow->updateProfileList(); return ret; } if CLICKED(profilewindow->listbar) { profilewindow->tfprofilename->setText(L""); } } // hlavni menu if (mainwindow) { if CLICKED(mainwindow->bprofile) { switchTo(mmsProfileDialog); return ret; } if CLICKED(mainwindow->blocal) { switchTo(mmsLocalGameChooseMap); return ret; } if CLICKED(mainwindow->bnetwork) { switchTo(mmsNetworkGameChooseMode); return ret; } if CLICKED(mainwindow->boptions) { switchTo(mmsOptions); return ret; } if CLICKED(mainwindow->bcredits) { switchTo(mmsCredists); return ret; } if CLICKED(mainwindow->bquit) { TGUI::gui_inst->screen->exitMainLoop(TContextParameter()); return ret; } } if (localchosemap) { if CLICKED(localchosemap->bplay) { TActiveObject* ao = localchosemap->listbar->getSelectedObject(); if ( !ao ) return ret; int selection = ao->tag; //zprava pro WORLD PACKET_GAME_MODE pgm; pgm.address = NULL; strcpy(pgm.nick, TGUI::gui_inst->profile->name); pgm.mode = GM_LOCAL; KSendGlobalMsg(MSG_GAME_MODE, ANNONYMOUS, BROADCAST, &pgm); switchTo(mmsUndefined); TGUI::gui_inst->screen->selectContext("LOCALMULTI", TContextParameter(context_localmultigame, *((PARAM*)&selection)) ); return ret; } if CLICKED(localchosemap->bback) { switchTo(mmsMainMenu); return ret; } if CLICKED(localchosemap->listbar) { localchosemap->updateMapInfo(); } if CLICKED(localchosemap->rnewgame){ localchosemap->changeSource(TChoseMap::chosemapsource_newgame); } if CLICKED(localchosemap->rloadgame){ localchosemap->changeSource(TChoseMap::chosemapsource_loadgame); } } // vyber mapy u multiplayera if (networkchosemap) { if CLICKED(networkchosemap->bplay) { TActiveObject* ao = networkchosemap->listbar->getSelectedObject(); if ( !ao ) return ret; int selection = ao->tag; switchTo(mmsUndefined); rm::TRM_map_i * rmmi = (rm::TRM_map_i*)KSendGlobalMessage(MSG_GET_RM_MAP_I, MOD_GUI, MOD_RM, NULL); rmmi->selectMap(selection); delete(rmmi); //zprava pro WORLD PACKET_GAME_MODE pgm; pgm.mode = GM_NET_SERVER; pgm.address = NULL; strcpy(pgm.nick, gui::TGUI::gui_inst->profile->name); KSendGlobalMsg(MSG_GAME_MODE, ANNONYMOUS, BROADCAST, &pgm); TGUI::gui_inst->screen->selectContext("MULTIHOST", TContextParameter(context_networkhostgame, *((PARAM*)&selection)) ); return ret; } if CLICKED(networkchosemap->bback) { switchTo(mmsNetworkGameChooseMode); return ret; } if CLICKED(networkchosemap->listbar) { networkchosemap->updateMapInfo(); } if CLICKED(networkchosemap->rnewgame){ networkchosemap->changeSource(TChoseMap::chosemapsource_newgame); } if CLICKED(networkchosemap->rloadgame){ networkchosemap->changeSource(TChoseMap::chosemapsource_loadgame); } } if (getipwindow) { if CLICKED(getipwindow->lbBattleNetServers) { TActiveObject* ao = getipwindow->lbBattleNetServers->getSelectedObject(); if ( ao ) { getipwindow->lbLocalNetServers->deselectAll(); wchar_t wbuff[80]; UTF8toWideChar((*((net::TGames**)&ao->tag))->ip, wbuff, 80); getipwindow->tfIP->setText(wbuff); } } if CLICKED(getipwindow->lbLocalNetServers) { TActiveObject* ao = getipwindow->lbLocalNetServers->getSelectedObject(); if ( ao ) { getipwindow->lbBattleNetServers->deselectAll(); wchar_t wbuff[80]; UTF8toWideChar((*((net::TGames**)&ao->tag))->ip, wbuff, 80); getipwindow->tfIP->setText(wbuff); } } if CLICKED(getipwindow->bconnect) { char ip[50]; WideChartoUTF8(getipwindow->tfIP->getText(), ip, 50); if(strncmp(ip,"",50)){ //ukonci scannovani KSendGlobalMsg(MSG_NET_STOP_SEARCHING_LAN, MOD_GUI, MOD_NET, NULL); //posli zpravu PACKET_GAME_MODE pgm; pgm.mode = GM_NET_CLIENT; pgm.address = ip; strcpy(pgm.nick, gui::TGUI::gui_inst->profile->name); KSendGlobalMsg(MSG_GAME_MODE, ANNONYMOUS, BROADCAST, &pgm); getipwindow->bconnect->enabled = false; } return ret; } if CLICKED(getipwindow->bback) { KSendGlobalMsg(MSG_NET_STOP_SEARCHING_LAN, MOD_GUI, MOD_NET, NULL); switchTo(mmsNetworkGameChooseMode); return ret; } } if (errconnection) { if CLICKED(errconnection->bok) { KSendGlobalMsg(MSG_NET_STOPCLIENT, MOD_GUI, MOD_NET, NULL); KSendGlobalMessage(MSG_SEARCH_GAMES, MOD_GUI, MOD_NET, NULL); switchTo(mmsNetworkGameIP); return ret; } } // menu pro multiplayer,(host,client,zpet) if (multiplayerwindow) { if CLICKED(multiplayerwindow->bdirecthost) { switchTo(mmsNetworkGameChooseMap); return ret; } if CLICKED(multiplayerwindow->bdirectjoin) { //zeptej se na battle net KSendGlobalMessage(MSG_SEARCH_GAMES, MOD_GUI, MOD_NET, NULL); switchTo(mmsNetworkGameIP); return ret; } if CLICKED(multiplayerwindow->bback) { switchTo(mmsMainMenu); return ret; } } // menu pro nastaveni if (optionswindow) { if CLICKED(optionswindow->bback) { switchTo(mmsMainMenu); return ret; } if CLICKED(optionswindow->bok) { if (optionswindow->alert) switchTo(mmsOptionsAlert); else switchTo(mmsMainMenu); return ret; } } if (optionsalertwindow) { if CLICKED(optionsalertwindow->bok) { switchTo(mmsMainMenu); return ret; } } // menu pro credits if (credits) { if( input->key.sym == SDLK_ESCAPE ){ switchTo(mmsMainMenu); } } return ret; } }//namespace