void SendDiplomaticMessage(const DiplomaticMessage& diplo_message) { AIClientApp* app = AIClientApp::GetApp(); if (!app) return; int sender_player_id = app->PlayerID(); if (sender_player_id == Networking::INVALID_PLAYER_ID) return; int recipient_empire_id = diplo_message.RecipientEmpireID(); int recipient_player_id = app->EmpirePlayerID(recipient_empire_id); if (recipient_player_id == Networking::INVALID_PLAYER_ID) return; app->Networking().SendMessage(DiplomacyMessage(sender_player_id, recipient_player_id, diplo_message)); }
void PlayerListWnd::PlayerRightClicked(GG::ListBox::iterator it, const GG::Pt& pt) { // check that a valid player was clicked and that it wasn't this client's own player int clicked_player_id = PlayerInRow(it); if (clicked_player_id == Networking::INVALID_PLAYER_ID) return; const ClientApp* app = ClientApp::GetApp(); if (!app) { Logger().errorStream() << "PlayerListWnd::PlayerRightClicked couldn't get client app!"; return; } int client_player_id = app->PlayerID(); if (client_player_id == Networking::INVALID_PLAYER_ID) return; int client_empire_id = app->EmpireID(); // get empire id of clicked player const std::map<int, PlayerInfo>& players = app->Players(); std::map<int, PlayerInfo>::const_iterator clicked_player_it = players.find(clicked_player_id); if (clicked_player_it == players.end()) { Logger().errorStream() << "PlayerListWnd::PlayerRightClicked couldn't find player with id " << clicked_player_id; return; } const PlayerInfo& clicked_player_info = clicked_player_it->second; int clicked_empire_id = clicked_player_info.empire_id; if (!Empires().Lookup(clicked_empire_id)) { Logger().errorStream() << "PlayerListWnd::PlayerRightClicked tried to look up empire id " << clicked_empire_id << " for player " << clicked_player_id << " but couldn't find such an empire"; return; } GG::MenuItem menu_contents; if (app->GetClientType() == Networking::CLIENT_TYPE_HUMAN_PLAYER) { // get diplomatic status between client and clicked empires DiplomaticStatus diplo_status = Empires().GetDiplomaticStatus(clicked_empire_id, client_empire_id); if (diplo_status == INVALID_DIPLOMATIC_STATUS && clicked_player_id != client_player_id) { Logger().errorStream() << "PlayerListWnd::PlayerRightClicked found invalid diplomatic status between client and clicked empires."; return; } DiplomaticMessage existing_message = Empires().GetDiplomaticMessage(clicked_empire_id, client_empire_id); // create popup menu with diplomacy options in it if ( client_empire_id != ALL_EMPIRES) { if (diplo_status == DIPLO_WAR) { if (existing_message.GetType() == DiplomaticMessage::PEACE_PROPOSAL) { // who sent message? if (existing_message.SenderEmpireID() == client_empire_id) menu_contents.next_level.push_back(GG::MenuItem(UserString("PEACE_PROPOSAL_CANEL"), 4, false, false)); else if (existing_message.SenderEmpireID() == clicked_empire_id) menu_contents.next_level.push_back(GG::MenuItem(UserString("PEACE_ACCEPT"), 3, false, false)); } else if (existing_message.GetType() == DiplomaticMessage::INVALID_DIPLOMATIC_MESSAGE_TYPE) { menu_contents.next_level.push_back(GG::MenuItem(UserString("PEACE_PROPOSAL"), 2, false, false)); } } else if (diplo_status == DIPLO_PEACE) { if (existing_message.GetType() == DiplomaticMessage::INVALID_DIPLOMATIC_MESSAGE_TYPE) menu_contents.next_level.push_back(GG::MenuItem(UserString("WAR_DECLARATION"), 1, false, false)); } } } menu_contents.next_level.push_back(GG::MenuItem(str(FlexibleFormat(UserString("ENC_LOOKUP")) % Empires().Lookup(clicked_empire_id)->Name()), 5, false, false)); ClientNetworking& net = HumanClientApp::GetApp()->Networking(); GG::PopupMenu popup(pt.x, pt.y, ClientUI::GetFont(), menu_contents, ClientUI::TextColor(), ClientUI::WndOuterBorderColor(), ClientUI::WndColor(), ClientUI::EditHiliteColor()); if (popup.Run()) { switch (popup.MenuID()) { case 1: { // WAR_DECLARATION net.SendMessage(DiplomacyMessage(client_player_id, clicked_player_id, WarDeclarationDiplomaticMessage(client_empire_id, clicked_empire_id))); break; } case 2: { // PEACE_PROPOSAL net.SendMessage(DiplomacyMessage(client_player_id, clicked_player_id, PeaceProposalDiplomaticMessage(client_empire_id, clicked_empire_id))); break; } case 3: { // PEACE_ACCEPT net.SendMessage(DiplomacyMessage(client_player_id, clicked_player_id, AcceptDiplomaticMessage(client_empire_id, clicked_empire_id))); break; } case 4: { // PEACE_PROPOSAL_CANEL net.SendMessage(DiplomacyMessage(client_player_id, clicked_player_id, CancelDiplomaticMessage(client_empire_id, clicked_empire_id))); break; } case 5: { // Pedia lookup ClientUI::GetClientUI()->ZoomToEmpire(clicked_empire_id); break; } default: break; } } }