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