1 #include "Building.h"
2 
3 #include "BuildingType.h"
4 #include "Predicates.h"
5 #include "Universe.h"
6 #include "Enums.h"
7 #include "../Empire/EmpireManager.h"
8 #include "../util/AppInterface.h"
9 #include "../util/i18n.h"
10 
11 
Building(int empire_id,const std::string & building_type,int produced_by_empire_id)12 Building::Building(int empire_id, const std::string& building_type,
13                    int produced_by_empire_id/* = ALL_EMPIRES*/) :
14     m_building_type(building_type),
15     m_produced_by_empire_id(produced_by_empire_id)
16 {
17     UniverseObject::SetOwner(empire_id);
18     const BuildingType* type = GetBuildingType(m_building_type);
19     if (type)
20         Rename(UserString(type->Name()));
21     else
22         Rename(UserString("ENC_BUILDING"));
23 
24     UniverseObject::Init();
25 }
26 
Clone(int empire_id) const27 Building* Building::Clone(int empire_id) const {
28     Visibility vis = GetUniverse().GetObjectVisibilityByEmpire(this->ID(), empire_id);
29 
30     if (!(vis >= VIS_BASIC_VISIBILITY && vis <= VIS_FULL_VISIBILITY))
31         return nullptr;
32 
33     Building* retval = new Building();
34     retval->Copy(shared_from_this(), empire_id);
35     return retval;
36 }
37 
Copy(std::shared_ptr<const UniverseObject> copied_object,int empire_id)38 void Building::Copy(std::shared_ptr<const UniverseObject> copied_object, int empire_id) {
39     if (copied_object.get() == this)
40         return;
41     auto copied_building = std::dynamic_pointer_cast<const Building>(copied_object);
42     if (!copied_building) {
43         ErrorLogger() << "Building::Copy passed an object that wasn't a Building";
44         return;
45     }
46 
47     int copied_object_id = copied_object->ID();
48     Visibility vis = GetUniverse().GetObjectVisibilityByEmpire(copied_object_id, empire_id);
49     auto visible_specials = GetUniverse().GetObjectVisibleSpecialsByEmpire(copied_object_id, empire_id);
50 
51     UniverseObject::Copy(copied_object, vis, visible_specials);
52 
53     if (vis >= VIS_BASIC_VISIBILITY) {
54         this->m_planet_id =                 copied_building->m_planet_id;
55 
56         if (vis >= VIS_PARTIAL_VISIBILITY) {
57             this->m_name =                      copied_building->m_name;
58 
59             this->m_building_type =             copied_building->m_building_type;
60             this->m_produced_by_empire_id = copied_building->m_produced_by_empire_id;
61 
62             if (vis >= VIS_FULL_VISIBILITY) {
63                 this->m_ordered_scrapped =      copied_building->m_ordered_scrapped;
64             }
65         }
66     }
67 }
68 
HostileToEmpire(int empire_id) const69 bool Building::HostileToEmpire(int empire_id) const {
70     if (OwnedBy(empire_id))
71         return false;
72     return empire_id == ALL_EMPIRES || Unowned() ||
73            Empires().GetDiplomaticStatus(Owner(), empire_id) == DIPLO_WAR;
74 }
75 
Tags() const76 std::set<std::string> Building::Tags() const {
77     const BuildingType* type = ::GetBuildingType(m_building_type);
78     if (!type)
79         return std::set<std::string>();
80     return type->Tags();
81 }
82 
HasTag(const std::string & name) const83 bool Building::HasTag(const std::string& name) const {
84     const BuildingType* type = GetBuildingType(m_building_type);
85 
86     return type && type->Tags().count(name);
87 }
88 
ObjectType() const89 UniverseObjectType Building::ObjectType() const
90 { return OBJ_BUILDING; }
91 
ContainedBy(int object_id) const92 bool Building::ContainedBy(int object_id) const {
93     return object_id != INVALID_OBJECT_ID
94         && (    object_id == m_planet_id
95             ||  object_id == this->SystemID());
96 }
97 
Dump(unsigned short ntabs) const98 std::string Building::Dump(unsigned short ntabs) const {
99     std::stringstream os;
100     os << UniverseObject::Dump(ntabs);
101     os << " building type: " << m_building_type
102        << " produced by empire id: " << m_produced_by_empire_id;
103     return os.str();
104 }
105 
Accept(const UniverseObjectVisitor & visitor) const106 std::shared_ptr<UniverseObject> Building::Accept(const UniverseObjectVisitor& visitor) const
107 { return visitor.Visit(std::const_pointer_cast<Building>(std::static_pointer_cast<const Building>(shared_from_this()))); }
108 
SetPlanetID(int planet_id)109 void Building::SetPlanetID(int planet_id) {
110     if (planet_id != m_planet_id) {
111         m_planet_id = planet_id;
112         StateChangedSignal();
113     }
114 }
115 
ResetTargetMaxUnpairedMeters()116 void Building::ResetTargetMaxUnpairedMeters() {
117     UniverseObject::ResetTargetMaxUnpairedMeters();
118 
119     //// give buildings base stealth slightly above 0, so that they can't be seen from a distance without high detection ability
120     //if (Meter* stealth = GetMeter(METER_STEALTH))
121     //    stealth->AddToCurrent(0.01f);
122 }
123 
Reset()124 void Building::Reset() {
125     UniverseObject::SetOwner(ALL_EMPIRES);
126     m_ordered_scrapped = false;
127 }
128 
SetOrderedScrapped(bool b)129 void Building::SetOrderedScrapped(bool b) {
130     bool initial_status = m_ordered_scrapped;
131     if (b == initial_status) return;
132     m_ordered_scrapped = b;
133     StateChangedSignal();
134 }
135 
136