void Planet::Conquer(int conquerer) { m_just_conquered = true; // deal with things on production queue located at this planet Empire::ConquerProductionQueueItemsAtLocation(ID(), conquerer); // deal with UniverseObjects (eg. buildings) located on this planet std::vector<TemporaryPtr<Building> > buildings = Objects().FindObjects<Building>(m_buildings); for (std::vector<TemporaryPtr<Building> >::iterator it = buildings.begin(); it != buildings.end(); ++it) { TemporaryPtr<Building> building = *it; const BuildingType* type = GetBuildingType(building->BuildingTypeName()); // determine what to do with building of this type... const CaptureResult cap_result = type->GetCaptureResult(building->Owner(), conquerer, this->ID(), false); if (cap_result == CR_CAPTURE) { // replace ownership building->SetOwner(conquerer); } else if (cap_result == CR_DESTROY) { // destroy object //DebugLogger() << "Planet::Conquer destroying object: " << building->Name(); this->RemoveBuilding(building->ID()); if (TemporaryPtr<System> system = GetSystem(this->SystemID())) system->Remove(building->ID()); GetUniverse().Destroy(building->ID()); } else if (cap_result == CR_RETAIN) { // do nothing } } // replace ownership SetOwner(conquerer); GetMeter(METER_SUPPLY)->SetCurrent(0.0f); GetMeter(METER_SUPPLY)->BackPropagate(); GetMeter(METER_INDUSTRY)->SetCurrent(0.0f); GetMeter(METER_INDUSTRY)->BackPropagate(); GetMeter(METER_RESEARCH)->SetCurrent(0.0f); GetMeter(METER_RESEARCH)->BackPropagate(); GetMeter(METER_TRADE)->SetCurrent(0.0f); GetMeter(METER_TRADE)->BackPropagate(); GetMeter(METER_CONSTRUCTION)->SetCurrent(0.0f); GetMeter(METER_CONSTRUCTION)->BackPropagate(); GetMeter(METER_DEFENSE)->SetCurrent(0.0f); GetMeter(METER_DEFENSE)->BackPropagate(); GetMeter(METER_SHIELD)->SetCurrent(0.0f); GetMeter(METER_SHIELD)->BackPropagate(); GetMeter(METER_HAPPINESS)->SetCurrent(0.0f); GetMeter(METER_HAPPINESS)->BackPropagate(); }
void BuildingIndicator::Refresh() { if (!s_scanline_shader && GetOptionsDB().Get<bool>("UI.system-fog-of-war")) { boost::filesystem::path shader_path = GetRootDataDir() / "default" / "shaders" / "scanlines.frag"; std::string shader_text; ReadFile(shader_path, shader_text); s_scanline_shader = boost::shared_ptr<ShaderProgram>( ShaderProgram::shaderProgramFactory("", shader_text)); } SetBrowseModeTime(GetOptionsDB().Get<int>("UI.tooltip-delay")); TemporaryPtr<const Building> building = GetBuilding(m_building_id); if (!building) return; ClearBrowseInfoWnd(); if (m_graphic) { delete m_graphic; m_graphic = 0; } if (m_scrap_indicator) { delete m_scrap_indicator; m_scrap_indicator = 0; } if (const BuildingType* type = GetBuildingType(building->BuildingTypeName())) { boost::shared_ptr<GG::Texture> texture = ClientUI::BuildingIcon(type->Name()); m_graphic = new GG::StaticGraphic(texture, GG::GRAPHIC_FITGRAPHIC | GG::GRAPHIC_PROPSCALE); AttachChild(m_graphic); std::string desc = UserString(type->Description()); if (building->GetMeter(METER_STEALTH)) desc = UserString("METER_STEALTH") + boost::io::str(boost::format(": %3.1f\n\n") % building->GetMeter(METER_STEALTH)->Current()) + desc; if (GetOptionsDB().Get<bool>("UI.autogenerated-effects-descriptions") && !type->Effects().empty()) desc += boost::io::str(FlexibleFormat(UserString("ENC_EFFECTS_STR")) % AutoGeneratedDescription(type->Effects())); SetBrowseInfoWnd(boost::shared_ptr<GG::BrowseInfoWnd>( new IconTextBrowseWnd(texture, UserString(type->Name()), desc))); } if (building && building->OrderedScrapped()) { boost::shared_ptr<GG::Texture> scrap_texture = ClientUI::GetTexture(ClientUI::ArtDir() / "misc" / "scrapped.png", true); m_scrap_indicator = new GG::StaticGraphic(scrap_texture, GG::GRAPHIC_FITGRAPHIC | GG::GRAPHIC_PROPSCALE); AttachChild(m_scrap_indicator); } DoLayout(); }
void BuildingIndicator::RClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) { // verify that this indicator represents an existing building, and not a // queued production item, and that the owner of the building is this // client's player's empire int empire_id = HumanClientApp::GetApp()->EmpireID(); TemporaryPtr<Building> building = GetBuilding(m_building_id); if (!building) return; const MapWnd* map_wnd = ClientUI::GetClientUI()->GetMapWnd(); if (ClientPlayerIsModerator() && map_wnd->GetModeratorActionSetting() != MAS_NoAction) { RightClickedSignal(m_building_id); // response handled in MapWnd return; } GG::MenuItem menu_contents; if (!building->OrderedScrapped()) { // create popup menu with "Scrap" option menu_contents.next_level.push_back(GG::MenuItem(UserString("ORDER_BUIDLING_SCRAP"), 3, false, false)); } else { // create popup menu with "Cancel Scrap" option menu_contents.next_level.push_back(GG::MenuItem(UserString("ORDER_CANCEL_BUIDLING_SCRAP"), 4, false, false)); } const std::string& building_type = building->BuildingTypeName(); const BuildingType* bt = GetBuildingType(building_type); if (bt) { std::string popup_label = boost::io::str(FlexibleFormat(UserString("ENC_LOOKUP")) % UserString(building_type)); menu_contents.next_level.push_back(GG::MenuItem(popup_label, 5, false, false)); } 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 3: { // scrap building if (m_order_issuing_enabled) HumanClientApp::GetApp()->Orders().IssueOrder( OrderPtr(new ScrapOrder(empire_id, m_building_id))); break; } case 4: { // un-scrap building if (!m_order_issuing_enabled) break; // find order to scrap this building, and recind it std::map<int, int> pending_scrap_orders = PendingScrapOrders(); std::map<int, int>::const_iterator it = pending_scrap_orders.find(building->ID()); if (it != pending_scrap_orders.end()) { HumanClientApp::GetApp()->Orders().RecindOrder(it->second); break; } } case 5: { // pedia lookup building type ClientUI::GetClientUI()->ZoomToBuildingType(building_type); break; } default: break; } } }