예제 #1
0
 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));
 }
예제 #2
0
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;
        }
    }
}