/** ******************************************************************************* @file /gui/contexts/MultiHost.cpp @brief Obrazovka pro server multiplayeru @author Pavel @version 0.1 ******************************************************************************/ #include "gui/contexts/MultiHost.h" #include "common/rm/rminit.h" #include "common/compatibility.h" #include "common/Log.h" // #include "gui/GUI.h" #include "gui/common/BasicFonts.h" #include "gui/common/Defs.h" #include "gui/engine/TextureManager.h" #include "gui/common/KTime.h" #include "gui/common/colors.h" // #include "world/world_messages.h" namespace gui{ // konstanty urcujici rozmisteni ovladacich prvku hlavniho okna #define TEXT_HEIGHT 16 #define BORDER 20 #define SMALL_BUTTON_WIDTH 100 #define SMALL_BUTTON_HEIGHT 20 #define MAINWINDOW_WIDTH 700 #define MAINWINDOW_HEIGHT 500 #define MAINWINDOW_X ((SCREEN_WIDTH-MAINWINDOW_WIDTH)/2) #define MAINWINDOW_Y ((SCREEN_HEIGHT-MAINWINDOW_HEIGHT)/2) #define BUTTON_WIDTH 150 #define BUTTON_HEIGHT 35 #define BUTTON_NEXT_X (BUTTON_WIDTH+BORDER) #define BUTTON_Y (MAINWINDOW_HEIGHT-(BORDER+BUTTON_HEIGHT)) #define BUTTON_X (320 + 2*BORDER) #define INFO_WIDTH 320 #define INFO_HEIGHT (4+(2+TEXT_HEIGHT)*3) #define INFO_Y BORDER #define INFO_X BORDER #define ENDGAME_X BORDER #define ENDGAME_Y (INFO_HEIGHT + INFO_Y + TEXT_HEIGHT + BORDER - 10) #define ENDGAME_WIDTH INFO_WIDTH #define ENDGAME_HEIGHT (5*16+2); #define ROLES_X BORDER #define ROLES_Y (INFO_HEIGHT + INFO_Y + TEXT_HEIGHT + BORDER + 82 - 20) #define ROLES_WIDTH INFO_WIDTH #define ROLES_HEIGHT (128-82 + 20) #define OPTIONS_X BORDER #define OPTIONS_Y (ROLES_Y+ROLES_HEIGHT+BORDER) #define OPTIONS_HEIGHT (200) #define OPTIONS_WIDTH (ROLES_WIDTH) #define OPTIONS_RADIO_SIZE 0 #define OPTIONS_OP_Y (OPTIONS_Y + BORDER + TEXT_HEIGHT) #define OPTIONS_OP_TF_LEN 16 #define OPTIONS_AIP_Y (OPTIONS_Y + BORDER + TEXT_HEIGHT + 80+10) #define DESCRIPTION_X (ROLES_WIDTH + 2*BORDER) #define CHAT_X DESCRIPTION_X #define CHAT_Y 250 #define CHAT_WIDTH 320 #define CHAT_HEIGHT 180 #define ITEM_HEIGHT 20 #define ITEM_BORDER 2 #define DIFICULTY_WIDTH 150 #define DIFICULTY_HEIGHT (3*ITEM_HEIGHT+2) #define CONNECTED_WIDTH 150 #define CONNECTED_HEIGHT (3*ITEM_HEIGHT+2) #define ROLE_RIGHT_LENGTH OPTIONS_OP_TF_LEN #define ROLE_LEFT_LENGTH 11 /////////////////////////////////////////////////////////////////////////////// TMultiHostWindow::TMultiHostWindow(int _mapnumber) : TWindow(AO_UNMOVABLE, MAINWINDOW_X, MAINWINDOW_Y, MAINWINDOW_WIDTH, MAINWINDOW_HEIGHT) { // docnasne pole pro konverzi retezcu wchar_t wtemp[MAP_DESC_LEN]; // cislo mapy, kterou server vybral mapnumber = _mapnumber; rmtxti = (rm::TRM_txt_i*)KSendGlobalMessage(MSG_GET_RM_TXT_I, MOD_GUI, MOD_RM, NULL); // Maps ... nadpis lmapcaption = new TLabel(rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_MAP), BORDER, INFO_Y); Add(lmapcaption); // seznam informaci ginfo = new TGroupBar(AO_NORMAL, BORDER, INFO_Y + TEXT_HEIGHT, INFO_WIDTH, INFO_HEIGHT); Add(ginfo); // rmmapi = (rm::TRM_map_i*)KSendGlobalMessage(MSG_GET_RM_MAP_I,MOD_GUI,MOD_RM,NULL); rmmapi->loadMapsInfo(MAP_TYPE_NEW_GAME, 0); rmmapi->getMapInfo(&info, mapnumber); players_c = info->players; // jmeno mapy UTF8toWideChar(info->name, wtemp, K8_MAX_FILE_NAME_LEN); lmapname = new TLabel(wtemp, 4, 2); ginfo->Add(lmapname); // pocet hracu lplayerscountcaption = new TLabel(rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_ROLES), 4, 2+(TEXT_HEIGHT+2)); ginfo->Add(lplayerscountcaption); snwprintf(wtemp, K8_MAX_FILE_NAME_LEN, L"%d", info->players); lplayerscount = new TLabel(wtemp, 100, 2+(TEXT_HEIGHT+2)); ginfo->Add(lplayerscount); // rozmery mapy lsizecaption = new TLabel(rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_SIZE), 4, 2+(TEXT_HEIGHT+2)*2); ginfo->Add(lsizecaption); snwprintf(wtemp, K8_MAX_FILE_NAME_LEN, L"%dx%d", info->sizex - 2 * MAP_BOUND_X, info->sizey - 2 * MAP_BOUND_Y); lsize = new TLabel(wtemp, 100, 2+(TEXT_HEIGHT+2)*2); ginfo->Add(lsize); // popis mapy descriptioncaption = new TLabel(rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_MAPDESCRIPTION), DESCRIPTION_X, BORDER); Add(descriptioncaption); TGroupBar* gdescription = new TGroupBar(AO_NORMAL, DESCRIPTION_X, BORDER+TEXT_HEIGHT, OPTIONS_WIDTH, 200); Add(gdescription); mldescription = new TMultiLabel(AO_NORMAL, 0, 0, OPTIONS_WIDTH, 200); gdescription->Add(mldescription); UTF8toWideChar(info->description, wtemp, MAP_DESC_LEN); mldescription->setText(wtemp); // Options ... nadpis loptionscaption = new TLabel(rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_ROLEOPTIONS), OPTIONS_X, OPTIONS_Y); Add(loptionscaption); // seznam nastaveni goptions = new TGroupBar(AO_NORMAL, OPTIONS_X, OPTIONS_Y + TEXT_HEIGHT, OPTIONS_WIDTH, OPTIONS_HEIGHT); Add(goptions); // lidsti hraci lotherplayer = new TLabel(rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_HUMANPLAYER), OPTIONS_X + BORDER, OPTIONS_OP_Y); Add(lotherplayer); // jmeno lotherplayername = new TLabel(rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_NAME), OPTIONS_X + 2*BORDER, OPTIONS_OP_Y + TEXT_HEIGHT); Add(lotherplayername); lbconnected = new TListBar(AO_NORMAL, 10+OPTIONS_X + 75 + 2*BORDER, OPTIONS_OP_Y + TEXT_HEIGHT, CONNECTED_WIDTH , CONNECTED_HEIGHT); Add(lbconnected); // umela inteligence lai = new TLabel(rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_AI), OPTIONS_X + BORDER, OPTIONS_AIP_Y); Add(lai); ldificulty = new TLabel(rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_DIFICULTY), OPTIONS_X + 2*BORDER , OPTIONS_AIP_Y + TEXT_HEIGHT); Add(ldificulty); lbdificulty = new TListBar(AO_NORMAL, 10+OPTIONS_X + 75 + 2*BORDER, OPTIONS_AIP_Y + TEXT_HEIGHT, DIFICULTY_WIDTH , DIFICULTY_HEIGHT); Add(lbdificulty); iai1 = new TItem(AO_NO, ITEM_HEIGHT); lbdificulty->Add(iai1); lai1 = new TLabel(rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_AI_1), ITEM_BORDER, ITEM_BORDER); iai1->Add(lai1); iai2 = new TItem(AO_NO, ITEM_HEIGHT); lbdificulty->Add(iai2); lai2 = new TLabel(rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_AI_2), ITEM_BORDER, ITEM_BORDER); iai2->Add(lai2); iai3 = new TItem(AO_NO, ITEM_HEIGHT); lbdificulty->Add(iai3); lai3 = new TLabel(rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_AI_3), ITEM_BORDER, ITEM_BORDER); iai3->Add(lai3); // konec hry lendgamec = new TLabel(rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_ENDGAME_CAPTION), ENDGAME_X, ENDGAME_Y); Add(lendgamec); gendgame = new TGroupBar(AO_NORMAL, ENDGAME_X, ENDGAME_Y + 18, ENDGAME_WIDTH, 6 + 2 * 20); Add(gendgame); rendgame1 = new TRadioBox(AO_CHECKED, 2, 4, 20, 18); gendgame->Add(rendgame1); rendgame2 = new TRadioBox(AO_NO, 2, 24, 20, 18); gendgame->Add(rendgame2); lendgame1 = new TLabel(rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_ENDGAME_1), 22, 6); gendgame->Add(lendgame1); lendgame2 = new TLabel(rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_ENDGAME_2), 22, 6+20); gendgame->Add(lendgame2); // role ... nadpis lrolescaption = new TLabel(rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_ROLES), ROLES_X, ROLES_Y); Add(lrolescaption); // seznam roli v mape roleslist = new TListBar(AO_NORMAL, ROLES_X, ROLES_Y + TEXT_HEIGHT, ROLES_WIDTH , ROLES_HEIGHT); Add(roleslist); // chatovaci okenko chatbox = new TChatBox(rmtxti, CHAT_X, CHAT_Y, CHAT_WIDTH, CHAT_HEIGHT, true); Add(chatbox); // start bplay = new TSoundedTextButton(AO_NORMAL, rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_PLAY), BUTTON_X, BUTTON_Y, BUTTON_WIDTH, BUTTON_HEIGHT, SAMPLE_CLICK); Add(bplay); // bplay->setShortcutKey(SDLK_RETURN); // back bback = new TSoundedTextButton(AO_NORMAL, rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_DESTROYGAME), BUTTON_X+BUTTON_NEXT_X, BUTTON_Y, BUTTON_WIDTH, BUTTON_HEIGHT, SAMPLE_CLICK); Add(bback); bback->setShortcutKey(SDLK_ESCAPE); /* bdisconnect = new TSoundedTextButton(AO_NORMAL, rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_DISCONNECTCLIENT), 0,0, 100, 20, SAMPLE_CLICK); Add(bdisconnect);*/ // pozadi setBgImage(RASTER_PANEL); for (int i = 1; i <= 8; i++) connected[i].enabled = false; // nainicializuj role podle pripojenych lidi k serveru a zbytek doplni inteligenci initRolesFromConnections(); // prekresli okno podle nastaveni roli updateLocalGameForm(); } void TMultiHostWindow::initRolesFromConnections() { int i; // naplneni seznamu roli (gui) int con = lbconectedRestore(); // seznam roli int j = 1, k = 1; for (i = 1; i < MAX_PLAYERS+1; i++) { if (info->roles[i] == NULL) players[i].type = MPT_UNUSED; else { if (j <= con) { while (!connected[k].enabled) k++; players[i].type = MPT_HUMAN; players[i].connected_id = k; j++; k++; } else players[i].type = MPT_AI_2; } } updateLocalGameForm(); } int TMultiHostWindow::lbconectedRestore() { TItem *item; wchar_t wtemp[MAP_DESC_LEN]; lbconnected->DelNFreeAll(); int con = 0, i; for (i = 1; i <= 8; i++) { if (connected[i].enabled) { item = new TItem(AO_NO, ITEM_HEIGHT); UTF8toWideChar(connected[i].caption, wtemp, ROLE_RIGHT_LENGTH); item->Add(new TLabel(wtemp, ITEM_BORDER, ITEM_BORDER)); con++; } else { item = new TItem(AO_NO, 0); } lbconnected->Add(item); connected[i].item = item; } return con; } void TMultiHostWindow::addClient(int cid) { int i, _cid; for (i = 1; i <= 8; i++) connected[i].enabled = false; for (i = 0; i < gui::TGUI::gui_inst->clientsinfo.num; i++) { _cid = gui::TGUI::gui_inst->clientsinfo.cinfo[i].clientid; connected[_cid].enabled = true; strncpy(connected[_cid].caption, gui::TGUI::gui_inst->clientsinfo.cinfo[i].profileName, K8_MAX_NAME_LEN); } // priradim hrace volne roli i = 1; while ( ((players[i].type == MPT_UNUSED) || (players[i].type == MPT_MAINHUMAN) || (players[i].type == MPT_HUMAN)) && (i <= players_c) ) i++; if (i <= players_c) { players[i].type = MPT_HUMAN; players[i].connected_id = cid; } lbconectedRestore(); updateLocalGameForm(); // klientovy poslu uvodni informace TPackage *mypacket; mypacket = new TPackage(MSG_NET_ROLESETTINGDATA); char ctemp[100]; mypacket->setInt(1, "msgtype", 0, NULL); mypacket->setChar(info->name,"mapinfo", 0, "name",0, NULL); mypacket->setInt(info->players, "mapinfo", 0, "players", 0, NULL); mypacket->setChar(info->description, "mapinfo", 0, "description", 0, NULL); mypacket->setInt(info->sizex, "mapinfo", 0, "width", 0, NULL); mypacket->setInt(info->sizey, "mapinfo", 0, "height", 0, NULL); for (i = 1; i <= 8; i++) { sprintf(ctemp, "role%d", i); if (info->roles[i]) { mypacket->setInt(1, "mapinfo", 0, ctemp, 0, NULL); sprintf(ctemp, "role%dname", i); mypacket->setChar(info->roles[i]->name, "mapinfo", 0, ctemp, 0, NULL); } else mypacket->setInt(0, "mapinfo", 0, ctemp, 0, NULL); } mypacket->send(TO_SERVER, TO_EVERYBODY); delete mypacket; sendSetting(0); // poslu do chatu, ze se nekdo pripojil rm::TRM_txt_i *rmtxti = (rm::TRM_txt_i*)KSendGlobalMessage(MSG_GET_RM_TXT_I, MOD_GUI, MOD_RM, NULL); snprintf(ctemp, LABEL_MAX_LENGTH, "%s %s", connected[cid].caption, rmtxti->getRaw(TEXT_HASCONNECTED)); chatbox->directSend(rmtxti->getRaw(TEXT_SERVER), ctemp); delete rmtxti; } void TMultiHostWindow::sendSetting(int to) { TPackage *mypacket = new TPackage(MSG_NET_ROLESETTINGDATA); char ctemp[100]; int i; mypacket->setInt(2, "msgtype", 0, NULL); if SELECTED(rendgame1) mypacket->setInt(0, "endgametype", 0, NULL); else mypacket->setInt(1, "endgametype", 0, NULL); for (i = 1; i <= MAX_PLAYERS; i++) { snprintf(ctemp, 100, "connected%d", i); mypacket->setInt((int)connected[i].enabled, ctemp, 0, NULL); if (connected[i].enabled) { snprintf(ctemp, 100, "connected%dname", i); mypacket->setChar(connected[i].caption, ctemp, 0, NULL); } } for (i = 1; i <= MAX_PLAYERS; i++) { snprintf(ctemp, 100, "players%dtype", i); mypacket->setInt((int)players[i].type, ctemp, 0, NULL); if (players[i].type == MPT_HUMAN) { snprintf(ctemp, 100, "players%id", i); mypacket->setInt(players[i].connected_id, ctemp, 0, NULL); } } if (to > 0) mypacket->send(TO_SERVER, to); else mypacket->send(TO_SERVER, TO_EVERYBODY); delete mypacket; } void TMultiHostWindow::delClient(int cid) { int i; connected[cid].enabled = false; for (i = 1; i < MAX_PLAYERS+1; i++) { if ( (players[i].type == MPT_HUMAN) && (players[i].connected_id == cid) ) players[i].type = MPT_AI_2; } lbconectedRestore(); updateLocalGameForm(); sendSetting(0); char ctemp[LABEL_MAX_LENGTH]; rm::TRM_txt_i *rmtxti = (rm::TRM_txt_i*)KSendGlobalMessage(MSG_GET_RM_TXT_I, MOD_GUI, MOD_RM, NULL); snprintf(ctemp, LABEL_MAX_LENGTH, "%s %s", connected[cid].caption, rmtxti->getRaw(TEXT_HASDISCONNECTED)); chatbox->directSend(rmtxti->getRaw(TEXT_SERVER), ctemp); delete rmtxti; } void TMultiHostWindow::receiveNetData(TPackage *p) { //TXMLdata * xml = p->getXML(); //char string[1000]; //xml->toXML(string,1000); //printf(string); //printf("\n************************************************************\n"); //delete p; } void TMultiHostWindow::updateLocalGameForm() { int selpla = roleslist->getSelection(); if (selpla < 0) selpla = 0; roleslist->DelNFreeAll(); TItem *item; TLabel *label; wchar_t wtemp[LABEL_MAX_LENGTH]; int i; // seznam roli for (i = 1; i < MAX_PLAYERS+1; i++) { if (players[i].type != MPT_UNUSED) { if (selpla == 0) item = new TItem(AO_YES, ITEM_HEIGHT); else item = new TItem(AO_NO, ITEM_HEIGHT); roleslist->Add(item); UTF8toWideChar(info->roles[i]->name, wtemp, ROLE_LEFT_LENGTH); label = new TLabel(wtemp, ITEM_BORDER, ITEM_BORDER); label->setColor(ColorPlayer[i][0]/255.f, ColorPlayer[i][1]/255.f, ColorPlayer[i][2]/255.f, 1); item->Add(label); switch (players[i].type){ case MPT_HUMAN: UTF8toWideChar(connected[players[i].connected_id].caption, wtemp, ROLE_RIGHT_LENGTH); break; case MPT_AI_1: rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_AI_1); break; case MPT_AI_2: rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_AI_2); break; case MPT_AI_3: rmtxti->getWChar(wtemp, LABEL_MAX_LENGTH, TEXT_AI_3); break; default: wcscpy(wtemp, L"undefined"); break; } label = new TLabel(wtemp, 100, ITEM_BORDER); label->setColor(ColorPlayer[i][0]/255.f, ColorPlayer[i][1]/255.f, ColorPlayer[i][2]/255.f, 1); item->Add(label); selpla--; } } // nastaveni int role = getSelectedRole(); switch (players[role].type){ case MPT_HUMAN: for (i = 1; i <= 8; i++) connected[i].item->setState(AO_NO); connected[players[role].connected_id].item->setState(AO_YES); iai1->setState(AO_NO); iai2->setState(AO_NO); iai3->setState(AO_NO); break; case MPT_AI_1: case MPT_AI_2: case MPT_AI_3: for (i = 1; i <= 8; i++) connected[i].item->setState(AO_NO); iai1->setState(AO_NO); iai2->setState(AO_NO); iai3->setState(AO_NO); switch (players[role].type){ case MPT_AI_1: iai1->setState(AO_YES); break; case MPT_AI_2: iai2->setState(AO_YES); break; case MPT_AI_3: iai3->setState(AO_YES); break; } break; } } int TMultiHostWindow::getSelectedRole() { int role = 0; int i = roleslist->getSelection(); while (i >= 0) { role++; if (players[role].type != MPT_UNUSED) i--; } return role; } TMultiHostWindow::~TMultiHostWindow() { delete rmmapi; delete rmtxti; } /////////////////////////////////////////////////////////////////////////////// TMultiHost::TMultiHost(TContextParameter contextparameter) { rmtxti = (rm::TRM_txt_i*)KSendGlobalMessage(MSG_GET_RM_TXT_I, MOD_GUI, MOD_RM, NULL); } TMultiHost::~TMultiHost() { // vypusti a odalokuje vsechny aktivni prvky v sobe (rekursivne) DelNFreeAll(); // delete rmtxti; } TContext* TMultiHost::createContext(...){ TMultiHost* n = new TMultiHost(TContextParameter()); strcpy(n->szName,"MULTIHOST"); return n; } void TMultiHost::activateContext(TContextParameter contextparameter) { // kdyz je kurzor na kraji obrazovky tak se nezmeni jeho obrazek na sipku TaoKernel::aoKernel->cursor->scrolling = false; gui::TGUI::gui_inst->IMHost = true; // cislo mapy mapnumber = *((int*)&contextparameter.iSecondary); //hlavni okno mainwindow = new TMultiHostWindow(mapnumber); Add(mainwindow); KSendGlobalMsg(MSG_ADD_LOCAL_CLIENT, ANNONYMOUS, MOD_NET, (PARAM)TGUI::gui_inst->profile->name); mainwindow->initRolesFromConnections(); //noticka notice = NULL; } void TMultiHost::deactivateContext() { DelNFreeAll(); } void TMultiHost::drawContext(){ TFrame::drawObject(); } int TMultiHost::workInput(INPUT *input) { int clid; int ret=TContext::workInput(input); if(notice){ if CLICKED(notice->bok) { Del(notice); delete notice; notice = NULL; } } if (mainwindow) { if CLICKED(mainwindow->bplay) { int i, j, k; bool playerused; //kontrola, ze server ma prirazenyho hrace playerused = false; for (j = 1; j <= MAX_PLAYERS ; j++) if (mainwindow->players[j].connected_id == 1){ playerused = true; break; } if (!playerused) { notice = new TErrorWindow(TEXT_SERVER_PLAYER, ewtNotice, true); Add(notice); return ret; } //ukaz hodiny TGUI::gui_inst->screen->selectContext( "GAMELOADINGCONTEXT", TContextParameter(context_networkgame, 0) ); // odpojit nepotrebne klienty, 0 je server for (i = 1; i <= 8; i++) { if (mainwindow->connected[i].enabled) { playerused = false; for (j = 1; j <= 8; j++) if ((mainwindow->players[j].type == MPT_HUMAN) && (mainwindow->players[j].connected_id == i)) playerused = true; if (!playerused) KSendGlobalMsg(MSG_NET_DISCONNECT, ANNONYMOUS, BROADCAST, *((PARAM*)&i) ); } } //zacni hru PACKET_GAME_START pgs; pgs.map_id = mapnumber; //vyber podminky konce hry if (SELECTED(mainwindow->rendgame1)) pgs.end_game_condition = EGC_CONQUER; else pgs.end_game_condition = EGC_DEATHMATCH; clid = 0; for (j = 1; j <= MAX_PLAYERS ; j++){ if (mainwindow->players[j].type != MPT_UNUSED){ //cislo role pgs.players[clid].player_id = j; //jmeno a typ switch (mainwindow->players[j].type){ case MPT_HUMAN: pgs.players[clid].client_id = mainwindow->players[j].connected_id; strncpy(pgs.players[clid].name, mainwindow->connected[mainwindow->players[j].connected_id].caption, MAX_STRLEN - 1); pgs.players[clid].type = World::PT_HUMAN; break; case MPT_AI_1: case MPT_AI_2: case MPT_AI_3: switch (mainwindow->players[j].type){ case MPT_AI_1: pgs.players[clid].type = World::PT_AI_1; break; case MPT_AI_2: pgs.players[clid].type = World::PT_AI_2; break; case MPT_AI_3: pgs.players[clid].type = World::PT_AI_3; break; } //pridej lokalniho hrace pro AI KSendGlobalMsg(MSG_ADD_LOCAL_CLIENT, ANNONYMOUS, MOD_NET, (PARAM)"LocalPlayer"); //world si sam dostadi id serveru pgs.players[clid].client_id = 0; strncpy(pgs.players[clid].name, mainwindow->info->roles[j]->name, MAX_STRLEN-1); break; }//switch clid++; }//if } //dopln zbytek for(k = clid; k < MAX_PLAYERS; k++){ pgs.players[k].client_id = -1; pgs.players[k].player_id = 0; } //posli vsem klientum, aby se prepli do cekaciho rezimu TPackage *mypacket = new TPackage(MSG_NET_ROLESETTINGDATA); mypacket->setInt(3, "msgtype", 0, NULL); mypacket->send(TO_SERVER, TO_EVERYBODY); delete mypacket; //zaciname TPacket_SyncResult* result = (TPacket_SyncResult*)KSendGlobalMsg(MSG_GAME_START, ANNONYMOUS, BROADCAST, &pgs); if(result){ if(result->status){ delete result; THROW(E_8K_GUI, "Failed to start the game!"); } delete result; } return ret; }//if if CLICKED(mainwindow->bback) { // odpojim vsechny klienty int i; for (i = 1; i <= MAX_PLAYERS; i++) { if (mainwindow->connected[i].enabled) KSendGlobalMsg(MSG_NET_DISCONNECT, ANNONYMOUS, BROADCAST, *((PARAM*)&i) ); } KSendGlobalMsg(MSG_NET_STOP, ANNONYMOUS, MOD_NET, NULL); TGUI::gui_inst->screen->selectContext("MAINMENU", TContextParameter(context_networkhostgame, 0) ); return ret; } if CLICKED(mainwindow->roleslist) { mainwindow->updateLocalGameForm(); return ret; } if CLICKED(mainwindow->lbconnected) { int newpos = mainwindow->getSelectedRole(); int humanid = mainwindow->lbconnected->getSelection(); if (humanid >= 0) { humanid++; int oldpos = 1; while ((oldpos <= MAX_PLAYERS) && ( (mainwindow->players[oldpos].type != MPT_HUMAN) || (mainwindow->players[oldpos].connected_id != humanid)) ) oldpos++; if (oldpos <= MAX_PLAYERS) { mainwindow->players[oldpos].type = mainwindow->players[newpos].type; mainwindow->players[oldpos].connected_id = mainwindow->players[newpos].connected_id; } mainwindow->players[newpos].type = MPT_HUMAN; mainwindow->players[newpos].connected_id = humanid; mainwindow->sendSetting(0); mainwindow->updateLocalGameForm(); } return ret; } if (CLICKED(mainwindow->rendgame1) || CLICKED(mainwindow->rendgame2)) mainwindow->sendSetting(0); if (CLICKED(mainwindow->lbdificulty)){ int newai = mainwindow->getSelectedRole(); int wai = mainwindow->lbdificulty->getSelection(); if (wai == -1) return ret; mainwindow->players[newai].type = (MYROLETYPE)((int)MPT_AI_1 + wai); mainwindow->players[newai].connected_id = -1; mainwindow->sendSetting(0); mainwindow->updateLocalGameForm(); return ret; } } return ret; } void TMultiHost::addClient(int cli) { if (mainwindow != 0) mainwindow->addClient(cli); } void TMultiHost::delClient(int clientid) { if (mainwindow != 0) mainwindow->delClient(clientid); } void TMultiHost::receiveNetData(TPackage *p) { if (mainwindow) mainwindow->receiveNetData(p); } void TMultiHost::chatMsg(TPackage *p) { if (mainwindow) { if (mainwindow->chatbox) mainwindow->chatbox->receiveMsg(p); } } }//namespace /*****************************************************************************/