From: <geo...@us...> - 2013-01-29 07:41:04
|
Revision: 5691 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5691&view=rev Author: geoffthemedio Date: 2013-01-29 07:40:57 +0000 (Tue, 29 Jan 2013) Log Message: ----------- Colonization suitability report by yandonman. Modified Paths: -------------- trunk/FreeOrion/UI/ClientUI.cpp trunk/FreeOrion/UI/ClientUI.h trunk/FreeOrion/UI/EncyclopediaDetailPanel.cpp trunk/FreeOrion/UI/EncyclopediaDetailPanel.h trunk/FreeOrion/UI/MapWnd.cpp trunk/FreeOrion/UI/MapWnd.h trunk/FreeOrion/UI/SidePanel.cpp trunk/FreeOrion/default/eng_stringtable.txt Modified: trunk/FreeOrion/UI/ClientUI.cpp =================================================================== --- trunk/FreeOrion/UI/ClientUI.cpp 2013-01-28 22:37:20 UTC (rev 5690) +++ trunk/FreeOrion/UI/ClientUI.cpp 2013-01-29 07:40:57 UTC (rev 5691) @@ -515,6 +515,12 @@ return false; } +bool ClientUI::ZoomToPlanetPedia(int id) { + if (const Planet* planet = GetPlanet(id)) + m_map_wnd->ShowPlanet(id); + return false; +} + bool ClientUI::ZoomToSystem(int id) { if (const System* system = GetSystem(id)) { ZoomToSystem(system); Modified: trunk/FreeOrion/UI/ClientUI.h =================================================================== --- trunk/FreeOrion/UI/ClientUI.h 2013-01-28 22:37:20 UTC (rev 5690) +++ trunk/FreeOrion/UI/ClientUI.h 2013-01-29 07:40:57 UTC (rev 5691) @@ -69,6 +69,7 @@ bool ZoomToObject(const std::string& name); bool ZoomToObject(int id); bool ZoomToPlanet(int id); //!< Zooms to a particular planet on the galaxy map and opens the sidepanel to show it + bool ZoomToPlanetPedia(int id); //!< Opens the encyclodedia window and presents the entry for the given planet bool ZoomToSystem(int id); //!< Zooms to a particular system on the galaxy map and opens the sidepanel to show it bool ZoomToFleet(int id); //!< Zooms to a particular fleet on the galaxy map and opens the fleet window bool ZoomToShip(int id); //!< Zooms to a particular ship on the galaxy map and opens its fleet and/or ship window Modified: trunk/FreeOrion/UI/EncyclopediaDetailPanel.cpp =================================================================== --- trunk/FreeOrion/UI/EncyclopediaDetailPanel.cpp 2013-01-28 22:37:20 UTC (rev 5690) +++ trunk/FreeOrion/UI/EncyclopediaDetailPanel.cpp 2013-01-29 07:40:57 UTC (rev 5691) @@ -36,6 +36,7 @@ const std::string EMPTY_STRING; const std::string INCOMPLETE_DESIGN = "incomplete design"; const std::string UNIVERSE_OBJECT = "universe object"; + const std::string PLANET_SUITABILITY_REPORT = "planet suitability report"; } namespace { @@ -398,6 +399,8 @@ try { if (link_type == VarText::PLANET_ID_TAG) { ClientUI::GetClientUI()->ZoomToPlanet(lexical_cast<int>(data)); + this->SetPlanet(lexical_cast<int>(data)); + } else if (link_type == VarText::SYSTEM_ID_TAG) { ClientUI::GetClientUI()->ZoomToSystem(lexical_cast<int>(data)); } else if (link_type == VarText::FLEET_ID_TAG) { @@ -1120,6 +1123,116 @@ return; } } + } else if (m_items_it->first == PLANET_SUITABILITY_REPORT) { + general_type = UserString("SP_PLANET_SUITABILITY"); + + int planet_id = boost::lexical_cast<int>(m_items_it->second); + Planet* planet = GetPlanet(planet_id); + + std::string original_planet_species = planet->SpeciesName(); + int original_owner_id = planet->Owner(); + name = planet->PublicName(planet_id); + + int empire_id = HumanClientApp::GetApp()->EmpireID(); + Empire* empire = HumanClientApp::GetApp()->Empires().Lookup(empire_id); + if (!empire) { + return; + } + const std::vector<int> pop_center_ids = empire->GetPopulationPool().PopCenterIDs(); + + std::set<std::string> species_names; + std::map<std::string, std::pair<PlanetEnvironment, float> > population_counts; + + //Collect species colonizing/environment hospitality information + for (std::vector<int>::const_iterator it = pop_center_ids.begin(); it != pop_center_ids.end(); it++) { + const UniverseObject* obj = objects.Object(*it); + const PopCenter* pc = dynamic_cast<const PopCenter*>(obj); + if (!pc) + continue; + + const std::string& species_name = pc->SpeciesName(); + if (species_name.empty()) + continue; + + species_names.insert(species_name); + } + + boost::shared_ptr<GG::Font> font = ClientUI::GetFont(); + GG::X max_species_name_column1_width(0); + + for (std::set<std::string>::const_iterator it = species_names.begin(); it != species_names.end(); it++) { + std::string species_name = *it; + + std::string species_name_column1 = str(FlexibleFormat(UserString("ENC_SPECIES_PLANET_TYPE_SUITABILITY_COLUMN1")) % UserString(species_name)); + max_species_name_column1_width = std::max(font->TextExtent(species_name_column1).x, max_species_name_column1_width); + + // Setting the planet's species allows all of it meters to reflect species (and empire) properties, such as environment type preferences and tech. + // @see also: MapWnd::UpdateMeterEstimates() + planet->SetSpecies(species_name); + planet->SetOwner(empire_id); + + GetUniverse().UpdateMeterEstimates(planet_id); + + const Species* species = GetSpecies(species_name); + PlanetEnvironment planet_environment = PE_UNINHABITABLE; + if (species) + planet_environment = species->GetPlanetEnvironment(planet->Type()); + + double planet_capacity = ((planet_environment == PE_UNINHABITABLE) ? 0 : planet->CurrentMeterValue(METER_TARGET_POPULATION)); + + population_counts[species_name].first = planet_environment; + population_counts[species_name].second = planet_capacity; + } + + std::multimap<float, std::pair<std::string, PlanetEnvironment> > target_population_species; + for (std::map<std::string, std::pair<PlanetEnvironment, float> >::const_iterator it = population_counts.begin(); + it != population_counts.end(); ++it) + { target_population_species.insert(std::make_pair(it->second.second, std::make_pair(it->first, it->second.first))); } + + + bool positive_header_placed = false; + bool negative_header_placed = false; + + for (std::multimap<float, std::pair<std::string, PlanetEnvironment> >::const_reverse_iterator it = target_population_species.rbegin(); it != target_population_species.rend(); it++) { + std::string user_species_name = UserString(it->second.first); + std::string species_name_column1 = str(FlexibleFormat(UserString("ENC_SPECIES_PLANET_TYPE_SUITABILITY_COLUMN1")) % user_species_name); + + while (font->TextExtent(species_name_column1).x < max_species_name_column1_width) { + species_name_column1 += "\t"; + } + + if (it->first > 0) { + if (!positive_header_placed) { + detailed_description += str(FlexibleFormat(UserString("ENC_SUITABILITY_REPORT_POSITIVE_HEADER")) % planet->PublicName(planet_id)); + positive_header_placed = true; + } + + detailed_description += str(FlexibleFormat(UserString("ENC_SPECIES_PLANET_TYPE_SUITABILITY")) + % species_name_column1 + % UserString(boost::lexical_cast<std::string>(it->second.second)) + % (GG::RgbaTag(ClientUI::StatIncrColor()) + DoubleToString(it->first, 2, true) + "</rgba>") ); + + } else if (it->first <= 0) { + if (!negative_header_placed) { + if (positive_header_placed) + detailed_description += "\n\n"; + + detailed_description += str(FlexibleFormat(UserString("ENC_SUITABILITY_REPORT_NEGATIVE_HEADER")) % planet->PublicName(planet_id)); + negative_header_placed = true; + } + + detailed_description += str(FlexibleFormat(UserString("ENC_SPECIES_PLANET_TYPE_SUITABILITY")) + % species_name_column1 + % UserString(boost::lexical_cast<std::string>(it->second.second)) + % (GG::RgbaTag(ClientUI::StatDecrColor()) + DoubleToString(it->first, 2, true) + "</rgba>") ); + } + + detailed_description += "\n"; + } + + planet->SetSpecies(original_planet_species); + planet->SetOwner(original_owner_id); + GetUniverse().UpdateMeterEstimates(planet_id); } // Create Icons @@ -1220,6 +1333,22 @@ AddItem(TextLinker::ENCYCLOPEDIA_TAG, (text.empty() || !lookup_in_stringtable) ? text : UserString(text)); } + +void EncyclopediaDetailPanel::SetPlanet(int planet_id) { + + int current_item_id = INVALID_OBJECT_ID; + if (m_items_it != m_items.end()) { + try { + current_item_id = boost::lexical_cast<int>(m_items_it->second); + } catch (...) { + } + } + if (planet_id == current_item_id) + return; + + AddItem(PLANET_SUITABILITY_REPORT, boost::lexical_cast<std::string>(planet_id)); +} + void EncyclopediaDetailPanel::SetTech(const std::string& tech_name) { if (m_items_it != m_items.end() && tech_name == m_items_it->second) return; @@ -1326,6 +1455,9 @@ void EncyclopediaDetailPanel::SetIndex() { AddItem(TextLinker::ENCYCLOPEDIA_TAG, "ENC_INDEX"); } +void EncyclopediaDetailPanel::SetItem(const Planet* planet) +{ SetPlanet(planet ? planet->ID() : INVALID_OBJECT_ID); } + void EncyclopediaDetailPanel::SetItem(const Tech* tech) { SetTech(tech ? tech->Name() : EMPTY_STRING); } Modified: trunk/FreeOrion/UI/EncyclopediaDetailPanel.h =================================================================== --- trunk/FreeOrion/UI/EncyclopediaDetailPanel.h 2013-01-28 22:37:20 UTC (rev 5690) +++ trunk/FreeOrion/UI/EncyclopediaDetailPanel.h 2013-01-29 07:40:57 UTC (rev 5691) @@ -4,6 +4,7 @@ #include "CUIWnd.h" +class Planet; class Tech; class PartType; class HullType; @@ -42,6 +43,8 @@ int GetItemsSize () { return m_items.size(); } void SetText(const std::string& text, bool lookup_in_stringtable = true); + void SetPlanet(int planet_id); + void SetItem(const Planet* planet); void SetTech(const std::string& tech_name); void SetItem(const Tech* tech); void SetPartType(const std::string& part_name); Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2013-01-28 22:37:20 UTC (rev 5690) +++ trunk/FreeOrion/UI/MapWnd.cpp 2013-01-29 07:40:57 UTC (rev 5691) @@ -2577,6 +2577,13 @@ MoveTo(move_to_pt - GG::Pt(AppWidth(), AppHeight())); } + +void MapWnd::ShowPlanet(int planet_id) { + if (!m_pedia_panel->Visible()) + TogglePedia(); + m_pedia_panel->SetPlanet(planet_id); +} + void MapWnd::ShowTech(const std::string& tech_name) { if (!m_research_wnd->Visible()) ToggleResearch(); Modified: trunk/FreeOrion/UI/MapWnd.h =================================================================== --- trunk/FreeOrion/UI/MapWnd.h 2013-01-28 22:37:20 UTC (rev 5690) +++ trunk/FreeOrion/UI/MapWnd.h 2013-01-29 07:40:57 UTC (rev 5691) @@ -130,6 +130,7 @@ void CenterOnObject(int id); //!< centers the map on object with id \a id void CenterOnObject(const UniverseObject* obj); //!< centers the map on object \a id + void ShowPlanet(int planet_id); //!< brings up encyclpedia panel and displays info about the planet void ShowTech(const std::string& tech_name); //!< brings up the research screen and centers the tech tree on \a tech_name void ShowBuildingType(const std::string& building_type_name);//!< brings up the production screen and displays info about the buildtype \a type_name void ShowPartType(const std::string& part_type_name); //!< brings up the production screen and displays info about the buildtype \a type_name Modified: trunk/FreeOrion/UI/SidePanel.cpp =================================================================== --- trunk/FreeOrion/UI/SidePanel.cpp 2013-01-28 22:37:20 UTC (rev 5690) +++ trunk/FreeOrion/UI/SidePanel.cpp 2013-01-29 07:40:57 UTC (rev 5691) @@ -1472,11 +1472,15 @@ void SidePanel::PlanetPanel::RClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) { const Planet* planet = GetPlanet(m_planet_id); - if (!planet || !planet->OwnedBy(HumanClientApp::GetApp()->EmpireID()) || !m_order_issuing_enabled) + if (!planet) return; + GG::MenuItem menu_contents; - menu_contents.next_level.push_back(GG::MenuItem(UserString("SP_RENAME_PLANET"), 1, false, false)); + if (planet->OwnedBy(HumanClientApp::GetApp()->EmpireID()) && m_order_issuing_enabled ) + menu_contents.next_level.push_back(GG::MenuItem(UserString("SP_RENAME_PLANET"), 1, false, false)); + + menu_contents.next_level.push_back(GG::MenuItem(UserString("SP_PLANET_SUITABILITY"), 2, false, false)); GG::PopupMenu popup(pt.x, pt.y, ClientUI::GetFont(), menu_contents, ClientUI::TextColor(), ClientUI::WndOuterBorderColor(), ClientUI::WndColor()); @@ -1495,6 +1499,10 @@ } break; } + case 2: + { // colonizable/suitability report + ClientUI::GetClientUI()->ZoomToPlanetPedia(m_planet_id); + } default: break; } Modified: trunk/FreeOrion/default/eng_stringtable.txt =================================================================== --- trunk/FreeOrion/default/eng_stringtable.txt 2013-01-28 22:37:20 UTC (rev 5690) +++ trunk/FreeOrion/default/eng_stringtable.txt 2013-01-29 07:40:57 UTC (rev 5691) @@ -2119,6 +2119,9 @@ SP_ENTER_NEW_PLANET_NAME Enter new planet name +SP_PLANET_SUITABILITY +Planet Suitability + ################# # Fleet Window # ################# @@ -2519,7 +2522,22 @@ #### E N C Y C L O P E D I A #### ############################################################# +ENC_SPECIES_PLANET_TYPE_SUITABILITY_COLUMN1 +%1%: +ENC_SPECIES_PLANET_TYPE_SUITABILITY +%1% %2% (%3%) + +ENC_SUITABILITY_REPORT_POSITIVE_HEADER +'''%1% is suitable for colonization by these species. + +''' + +ENC_SUITABILITY_REPORT_NEGATIVE_HEADER +'''%1% is not suitable for colonization by these species. Attempts to colonize will either fail or eventually die off. + +''' + # types of things that can be shown in encyclopedia ENC_SHIP_PART Ship Part |