From 199e6d09ee05a8bac61629455cae8f3a600bb672 Mon Sep 17 00:00:00 2001 From: "Ignacio R. Morelle" Date: Wed, 31 Oct 2007 16:37:55 +0000 Subject: [PATCH] Update to gender choice for Multiplayer games. Mainly for next pot-update. --- src/leader_list.cpp | 53 ++++++++++++++++++++++++++++++------- src/leader_list.hpp | 1 + src/multiplayer_connect.cpp | 9 +++++++ 3 files changed, 54 insertions(+), 9 deletions(-) diff --git a/src/leader_list.cpp b/src/leader_list.cpp index 8fe22eb54bd..8ff610ba2bb 100644 --- a/src/leader_list.cpp +++ b/src/leader_list.cpp @@ -104,23 +104,59 @@ void leader_list_manager::update_gender_list(const std::string& leader) { int gender_index = gender_combo_ != NULL ? gender_combo_->selected() : 0; genders_.clear(); + gender_ids_.clear(); + if (leader == "random" || leader == "-" || leader == "?") { + // Assume random/unknown leader/faction == unknown gender + gender_ids_.push_back("null"); + genders_.push_back("-"); + gender_combo_->enable(false); + gender_combo_->set_items(genders_); + gender_combo_->set_selected(0); + return; + } + const game_data::unit_type_map& utypes = data_->unit_types; if (utypes.find(leader) != utypes.end()) { - const std::vector genders = utypes.find(leader)->second.genders(); + const unit_type* ut; + const unit_type* utg; + ut = &(utypes.find(leader)->second); + const std::vector genders = ut->genders(); if (genders.size() < 2) { gender_combo_->enable(false); } else { - genders_.push_back("random"); + gender_ids_.push_back("random"); + genders_.push_back(IMAGE_PREFIX + random_enemy_picture + COLUMN_SEPARATOR + _("Random")); gender_combo_->enable(true); } for (std::vector::const_iterator i=genders.begin(); i != genders.end(); ++i) { - genders_.push_back(*i == unit_race::FEMALE ? "female" : "male"); + utg = &(ut->get_gender_unit_type(*i)); + + // Make the internationalized titles for each gender, along with the WML ids + if (*i == unit_race::FEMALE) + { + gender_ids_.push_back("female"); +#ifdef LOW_MEM + genders_.push_back(IMAGE_PREFIX + utg->image() + COLUMN_SEPARATOR + _("Feminine ♀")); +#else + genders_.push_back(IMAGE_PREFIX + utg->image() + std::string("~RC(" + ut->flag_rgb() + ">1)") + COLUMN_SEPARATOR + _("Feminine ♀")); +#endif + } + else + { + gender_ids_.push_back("male"); +#ifdef LOW_MEM + genders_.push_back(IMAGE_PREFIX + utg->image() + COLUMN_SEPARATOR + _("Masculine ♂")); +#else + genders_.push_back(IMAGE_PREFIX + utg->image() + std::string("~RC(" + ut->flag_rgb() + ">1)") + COLUMN_SEPARATOR + _("Masculine ♂")); +#endif + } } gender_combo_->set_items(genders_); gender_index %= genders_.size(); gender_combo_->set_selected(gender_index); } else { - genders_.push_back("random"); + gender_ids_.push_back("random"); + genders_.push_back(IMAGE_PREFIX + random_enemy_picture + COLUMN_SEPARATOR + _("Random")); gender_combo_->enable(false); gender_combo_->set_items(genders_); gender_combo_->set_selected(0); @@ -139,10 +175,9 @@ void leader_list_manager::populate_leader_combo(int selected_index) { const unit_type* ut; ut = &(utypes.find(*itor)->second); if (gender_combo_ != NULL && !genders_.empty() && size_t(gender_combo_->selected()) < genders_.size()) { - // TODO: add support for translating these in the UI!!! - if (genders_[gender_combo_->selected()] == "male"){ + if (gender_ids_[gender_combo_->selected()] == "male"){ ut = &(utypes.find(*itor)->second.get_gender_unit_type(unit_race::MALE)); - } else if (genders_[gender_combo_->selected()] == "female") { + } else if (gender_ids_[gender_combo_->selected()] == "female") { ut = &(utypes.find(*itor)->second.get_gender_unit_type(unit_race::FEMALE)); } } @@ -218,6 +253,6 @@ std::string leader_list_manager::get_leader() const std::string leader_list_manager::get_gender() const { if(gender_combo_ == NULL || genders_.empty() || size_t(gender_combo_->selected()) >= genders_.size()) - return "?"; - return genders_[gender_combo_->selected()]; + return "null"; + return gender_ids_[gender_combo_->selected()]; } diff --git a/src/leader_list.hpp b/src/leader_list.hpp index 35cf1e65a8e..e1bc38ad138 100644 --- a/src/leader_list.hpp +++ b/src/leader_list.hpp @@ -42,6 +42,7 @@ private: void populate_leader_combo(int selected_index); std::vector leaders_; std::vector genders_; + std::vector gender_ids_; config::child_list side_list_; const game_data* data_; gui::combo* leader_combo_; diff --git a/src/multiplayer_connect.cpp b/src/multiplayer_connect.cpp index 4da24e8c77f..b3c2bf9f128 100644 --- a/src/multiplayer_connect.cpp +++ b/src/multiplayer_connect.cpp @@ -230,6 +230,7 @@ connect::side::side(connect& parent, const config& cfg, int index) : if(*itor == *search) { faction_ = faction_index; llm_.update_leader_list(faction_); + llm_.update_gender_list(llm_.get_leader()); combo_faction_.enable(false); } } @@ -270,6 +271,9 @@ connect::side::side(const side& a) : { llm_.set_leader_combo((enabled_ && leader_.empty()) ? &combo_leader_ : NULL); llm_.set_gender_combo((enabled_ && leader_.empty()) ? &combo_gender_ : NULL); + // FIXME: this is an ugly hack to force updating the gender list when the side + // widget is initialized. Need an optimal way. -- shadowmaster + llm_.update_gender_list(llm_.get_leader()); } void connect::side::add_widgets_to_scrollpane(gui::scrollpane& pane, int pos) @@ -690,9 +694,12 @@ void connect::side::import_network_user(const config& data) if(faction_ > int(parent_->era_sides_.size())) faction_ = 0; llm_.update_leader_list(faction_); + llm_.update_gender_list(llm_.get_leader()); } if(combo_leader_.enabled()) { llm_.set_leader(data["leader"]); + } + if (combo_gender_.enabled()) { llm_.set_gender(data["gender"]); } } @@ -710,6 +717,8 @@ void connect::side::reset(mp::controller controller) faction_ = 0; if(combo_leader_.enabled()) llm_.update_leader_list(0); + if (combo_gender_.enabled()) + llm_.update_gender_list(llm_.get_leader()); } update_ui();