1 #include "SitRepEntry.h"
2 
3 #include "i18n.h"
4 #include "Logger.h"
5 #include "AppInterface.h"
6 #include "../universe/Predicates.h"
7 #include "../universe/Building.h"
8 #include "../universe/Planet.h"
9 #include "../universe/System.h"
10 #include "../universe/Ship.h"
11 #include "../universe/Fleet.h"
12 #include "../universe/Universe.h"
13 
14 
SitRepEntry()15 SitRepEntry::SitRepEntry() :
16     VarText(),
17     m_turn(INVALID_GAME_TURN),
18     m_icon("/icons/sitrep/generic.png")
19 {}
20 
SitRepEntry(const std::string & template_string,int turn,const std::string & icon,const std::string label,bool stringtable_lookup)21 SitRepEntry::SitRepEntry(const std::string& template_string, int turn,
22                          const std::string& icon, const std::string label,
23                          bool stringtable_lookup) :
24     VarText(template_string, stringtable_lookup),
25     m_turn(turn),
26     m_icon(icon.empty() ? "/icons/sitrep/generic.png" : icon),
27     m_label(label)
28 {}
29 
GetDataIDNumber(const std::string & tag) const30 int SitRepEntry::GetDataIDNumber(const std::string& tag) const {
31     auto elem = m_variables.find(tag);
32     try {
33         if (elem != m_variables.end())
34             return boost::lexical_cast<int>(elem->second);
35     } catch (...) {
36         return -1;
37     }
38     return -1;
39 }
40 
GetDataString(const std::string & tag) const41 const std::string& SitRepEntry::GetDataString(const std::string& tag) const {
42     static const std::string EMPTY_STRING;
43     auto elem = m_variables.find(tag);
44     if (elem == m_variables.end())
45         return EMPTY_STRING;
46     return elem->second;
47 }
48 
Dump() const49 std::string SitRepEntry::Dump() const {
50     std::string retval = "SitRep template_string = \"" + m_template_string + "\"";
51     for (const auto& variable : m_variables)
52         retval += " " + variable.first + " = " + variable.second;
53     retval += " turn = " + std::to_string(m_turn);
54     retval += " icon = " + m_icon;
55     retval += " label = " + m_label;
56     return retval;
57 }
58 
CreateTechResearchedSitRep(const std::string & tech_name)59 SitRepEntry CreateTechResearchedSitRep(const std::string& tech_name) {
60     SitRepEntry sitrep(
61         UserStringNop("SITREP_TECH_RESEARCHED"),
62         CurrentTurn(),
63         "icons/sitrep/tech_researched.png",
64         UserStringNop("SITREP_TECH_RESEARCHED_LABEL"), true);
65     sitrep.AddVariable(VarText::TECH_TAG,          tech_name);
66     return sitrep;
67 }
68 
CreateShipBuiltSitRep(int ship_id,int system_id,int shipdesign_id)69 SitRepEntry CreateShipBuiltSitRep(int ship_id, int system_id, int shipdesign_id) {
70     SitRepEntry sitrep(
71         UserStringNop("SITREP_SHIP_BUILT"),
72         CurrentTurn() + 1,
73         "icons/sitrep/ship_produced.png",
74         UserStringNop("SITREP_SHIP_BUILT_LABEL"), true);
75     sitrep.AddVariable(VarText::SYSTEM_ID_TAG,     std::to_string(system_id));
76     sitrep.AddVariable(VarText::SHIP_ID_TAG,       std::to_string(ship_id));
77     sitrep.AddVariable(VarText::DESIGN_ID_TAG,     std::to_string(shipdesign_id));
78     return sitrep;
79 }
80 
CreateShipBlockBuiltSitRep(int system_id,int shipdesign_id,int number)81 SitRepEntry CreateShipBlockBuiltSitRep(int system_id, int shipdesign_id, int number) {
82     SitRepEntry sitrep(
83         UserStringNop("SITREP_SHIP_BATCH_BUILT"),
84         CurrentTurn() + 1,
85         "icons/sitrep/ship_produced.png",
86         UserStringNop("SITREP_SHIP_BATCH_BUILT_LABEL"), true);
87     sitrep.AddVariable(VarText::SYSTEM_ID_TAG,     std::to_string(system_id));
88     sitrep.AddVariable(VarText::DESIGN_ID_TAG,     std::to_string(shipdesign_id));
89     sitrep.AddVariable(VarText::RAW_TEXT_TAG,      std::to_string(number));
90     return sitrep;
91 }
92 
CreateBuildingBuiltSitRep(int building_id,int planet_id)93 SitRepEntry CreateBuildingBuiltSitRep(int building_id, int planet_id) {
94     SitRepEntry sitrep(
95         UserStringNop("SITREP_BUILDING_BUILT"),
96         CurrentTurn() + 1,
97         "icons/sitrep/building_produced.png",
98         UserStringNop("SITREP_BUILDING_BUILT_LABEL"), true);
99     sitrep.AddVariable(VarText::PLANET_ID_TAG,     std::to_string(planet_id));
100     sitrep.AddVariable(VarText::BUILDING_ID_TAG,   std::to_string(building_id));
101     return sitrep;
102 }
103 
CreateTechUnlockedSitRep(const std::string & tech_name)104 SitRepEntry CreateTechUnlockedSitRep(const std::string& tech_name) {
105     SitRepEntry sitrep(
106         UserStringNop("SITREP_TECH_UNLOCKED"),
107         CurrentTurn(),
108         "icons/sitrep/tech_unlocked.png",
109         UserStringNop("SITREP_TECH_UNLOCKED_LABEL"), true);
110     sitrep.AddVariable(VarText::TECH_TAG,          tech_name);
111     return sitrep;
112 }
113 
CreateBuildingTypeUnlockedSitRep(const std::string & building_type_name)114 SitRepEntry CreateBuildingTypeUnlockedSitRep(const std::string& building_type_name) {
115     SitRepEntry sitrep(
116         UserStringNop("SITREP_BUILDING_TYPE_UNLOCKED"),
117         CurrentTurn(),
118         "icons/sitrep/building_type_unlocked.png",
119         UserStringNop("SITREP_BUILDING_TYPE_UNLOCKED_LABEL"), true);
120     sitrep.AddVariable(VarText::BUILDING_TYPE_TAG,  building_type_name);
121     return sitrep;
122 }
123 
CreateShipHullUnlockedSitRep(const std::string & ship_hull_name)124 SitRepEntry CreateShipHullUnlockedSitRep(const std::string& ship_hull_name) {
125     SitRepEntry sitrep(
126         UserStringNop("SITREP_SHIP_HULL_UNLOCKED"),
127         CurrentTurn(),
128         "icons/sitrep/ship_hull_unlocked.png",
129         UserStringNop("SITREP_SHIP_HULL_UNLOCKED_LABEL"), true);
130     sitrep.AddVariable(VarText::SHIP_HULL_TAG,      ship_hull_name);
131     return sitrep;
132 }
133 
CreateShipPartUnlockedSitRep(const std::string & ship_part_name)134 SitRepEntry CreateShipPartUnlockedSitRep(const std::string& ship_part_name) {
135     SitRepEntry sitrep(
136         UserStringNop("SITREP_SHIP_PART_UNLOCKED"),
137         CurrentTurn(),
138         "icons/sitrep/ship_part_unlocked.png",
139         UserStringNop("SITREP_SHIP_PART_UNLOCKED_LABEL"), true);
140     sitrep.AddVariable(VarText::SHIP_PART_TAG,      ship_part_name);
141     return sitrep;
142 }
143 
CreateCombatSitRep(int system_id,int log_id,int enemy_id)144 SitRepEntry CreateCombatSitRep(int system_id, int log_id, int enemy_id) {
145     std::string template_string = (enemy_id == ALL_EMPIRES)
146         ? UserStringNop("SITREP_COMBAT_SYSTEM")
147         : UserStringNop("SITREP_COMBAT_SYSTEM_ENEMY");
148     std::string label_string = (enemy_id == ALL_EMPIRES)
149         ? UserStringNop("SITREP_COMBAT_SYSTEM_LABEL")
150         : UserStringNop("SITREP_COMBAT_SYSTEM_ENEMY_LABEL");
151     SitRepEntry sitrep(
152         template_string,
153         CurrentTurn() + 1, "icons/sitrep/combat.png", label_string, true);
154     sitrep.AddVariable(VarText::SYSTEM_ID_TAG,  std::to_string(system_id));
155     sitrep.AddVariable(VarText::COMBAT_ID_TAG,  std::to_string(log_id));
156     sitrep.AddVariable(VarText::EMPIRE_ID_TAG,  std::to_string(enemy_id));
157     return sitrep;
158 }
159 
CreateGroundCombatSitRep(int planet_id,int enemy_id)160 SitRepEntry CreateGroundCombatSitRep(int planet_id, int enemy_id) {
161     std::string template_string = (enemy_id == ALL_EMPIRES)
162         ? UserStringNop("SITREP_GROUND_BATTLE")
163         : UserStringNop("SITREP_GROUND_BATTLE_ENEMY");
164     std::string label_string = (enemy_id == ALL_EMPIRES)
165         ? UserStringNop("SITREP_GROUND_BATTLE_LABEL")
166         : UserStringNop("SITREP_GROUND_BATTLE_ENEMY_LABEL");
167     SitRepEntry sitrep(
168         template_string,
169         CurrentTurn() + 1, "icons/sitrep/ground_combat.png", label_string, true);
170     sitrep.AddVariable(VarText::PLANET_ID_TAG,     std::to_string(planet_id));
171     sitrep.AddVariable(VarText::EMPIRE_ID_TAG,     std::to_string(enemy_id));
172     return sitrep;
173 }
174 
CreatePlanetCapturedSitRep(int planet_id,int empire_id)175 SitRepEntry CreatePlanetCapturedSitRep(int planet_id, int empire_id) {
176     SitRepEntry sitrep(
177         UserStringNop("SITREP_PLANET_CAPTURED"),
178         CurrentTurn() + 1,
179         "icons/sitrep/planet_captured.png",
180         UserStringNop("SITREP_PLANET_CAPTURED_LABEL"), true);
181     sitrep.AddVariable(VarText::PLANET_ID_TAG,     std::to_string(planet_id));
182     sitrep.AddVariable(VarText::EMPIRE_ID_TAG,     std::to_string(empire_id));
183     return sitrep;
184 }
185 
186 namespace {
GenericCombatDamagedObjectSitrep(int combat_system_id)187     SitRepEntry GenericCombatDamagedObjectSitrep(int combat_system_id) {
188         SitRepEntry sitrep(
189             UserStringNop("SITREP_OBJECT_DAMAGED_AT_SYSTEM"),
190             CurrentTurn() + 1,
191             "icons/sitrep/combat_damage.png",
192             UserStringNop("SITREP_OBJECT_DAMAGED_AT_SYSTEM_LABEL"), true);
193         sitrep.AddVariable(VarText::SYSTEM_ID_TAG,     std::to_string(combat_system_id));
194         return sitrep;
195     }
196 
GenericCombatDestroyedObjectSitrep(int combat_system_id)197     SitRepEntry GenericCombatDestroyedObjectSitrep(int combat_system_id) {
198         SitRepEntry sitrep(
199             UserStringNop("SITREP_OBJECT_DESTROYED_AT_SYSTEM"),
200             CurrentTurn() + 1,
201             "icons/sitrep/combat_destroyed.png",
202             UserStringNop("SITREP_OBJECT_DESTROYED_AT_SYSTEM_LABEL"), true);
203         sitrep.AddVariable(VarText::SYSTEM_ID_TAG,     std::to_string(combat_system_id));
204         return sitrep;
205     }
206 }
207 
CreateCombatDamagedObjectSitRep(int object_id,int combat_system_id,int empire_id)208 SitRepEntry CreateCombatDamagedObjectSitRep(int object_id, int combat_system_id, int empire_id) {
209     auto obj = Objects().get(object_id);
210     if (!obj)
211         return GenericCombatDamagedObjectSitrep(combat_system_id);
212 
213     SitRepEntry sitrep;
214 
215     if (auto ship = std::dynamic_pointer_cast<const Ship>(obj)) {
216         if (ship->Unowned())
217             sitrep = SitRepEntry(
218                 UserStringNop("SITREP_UNOWNED_SHIP_DAMAGED_AT_SYSTEM"),
219                 CurrentTurn() + 1,
220                 "icons/sitrep/combat_damage.png",
221                 UserStringNop("SITREP_UNOWNED_SHIP_DAMAGED_AT_SYSTEM_LABEL"), true);
222         else
223             sitrep = SitRepEntry(
224                 UserStringNop("SITREP_SHIP_DAMAGED_AT_SYSTEM"),
225                 CurrentTurn() + 1,
226                 "icons/sitrep/combat_damage.png",
227                 UserStringNop("SITREP_SHIP_DAMAGED_AT_SYSTEM_LABEL"), true);
228         sitrep.AddVariable(VarText::SHIP_ID_TAG,       std::to_string(object_id));
229         sitrep.AddVariable(VarText::DESIGN_ID_TAG,     std::to_string(ship->DesignID()));
230 
231     } else if (auto planet = std::dynamic_pointer_cast<const Planet>(obj)) {
232         if (planet->Unowned())
233             sitrep = SitRepEntry(
234                 UserStringNop("SITREP_UNOWNED_PLANET_ATTACKED_AT_SYSTEM"),
235                 CurrentTurn() + 1,
236                 "icons/sitrep/colony_bombarded.png",
237                 UserStringNop("SITREP_UNOWNED_PLANET_ATTACKED_AT_SYSTEM_LABEL"), true);
238         else
239             sitrep = SitRepEntry(
240                 UserStringNop("SITREP_PLANET_ATTACKED_AT_SYSTEM"),
241                 CurrentTurn() + 1,
242                 "icons/sitrep/colony_bombarded.png",
243                 UserStringNop("SITREP_PLANET_ATTACKED_AT_SYSTEM_LABEL"), true);
244         sitrep.AddVariable(VarText::PLANET_ID_TAG,     std::to_string(object_id));
245 
246     } else {
247         sitrep = GenericCombatDestroyedObjectSitrep(combat_system_id);
248     }
249 
250     sitrep.AddVariable(VarText::EMPIRE_ID_TAG,     std::to_string(obj->Owner()));
251     sitrep.AddVariable(VarText::SYSTEM_ID_TAG,     std::to_string(combat_system_id));
252 
253     return sitrep;
254 }
255 
CreateCombatDestroyedObjectSitRep(int object_id,int combat_system_id,int empire_id)256 SitRepEntry CreateCombatDestroyedObjectSitRep(int object_id, int combat_system_id, int empire_id) {
257     auto obj = EmpireKnownObjects(empire_id).get(object_id);
258     if (!obj) {
259         DebugLogger() << "Object " << object_id << " does not exist!!!";
260         return GenericCombatDestroyedObjectSitrep(combat_system_id);
261     }
262 
263     SitRepEntry sitrep;
264 
265     if (auto ship = std::dynamic_pointer_cast<const Ship>(obj)) {
266         if (ship->Unowned())
267             sitrep = SitRepEntry(
268                 UserStringNop("SITREP_UNOWNED_SHIP_DESTROYED_AT_SYSTEM"),
269                 CurrentTurn() + 1,
270                 "icons/sitrep/combat_destroyed.png",
271                 UserStringNop("SITREP_UNOWNED_SHIP_DESTROYED_AT_SYSTEM_LABEL"), true);
272         else if (ship->OwnedBy(empire_id))
273             sitrep = SitRepEntry(
274                 UserStringNop("SITREP_OWN_SHIP_DESTROYED_AT_SYSTEM"),
275                 CurrentTurn() + 1,
276                 "icons/sitrep/combat_destroyed.png",
277                 UserStringNop("SITREP_OWN_SHIP_DESTROYED_AT_SYSTEM_LABEL"), true);
278         else
279             sitrep = SitRepEntry(
280                 UserStringNop("SITREP_SHIP_DESTROYED_AT_SYSTEM"),
281                 CurrentTurn() + 1,
282                 "icons/sitrep/combat_destroyed.png",
283                 UserStringNop("SITREP_SHIP_DESTROYED_AT_SYSTEM_LABEL"), true);
284         sitrep.AddVariable(VarText::SHIP_ID_TAG,       std::to_string(object_id));
285         sitrep.AddVariable(VarText::DESIGN_ID_TAG,     std::to_string(ship->DesignID()));
286 
287     } else if (auto fleet = std::dynamic_pointer_cast<const Fleet>(obj)) {
288         if (fleet->Unowned())
289             sitrep = SitRepEntry(
290                 UserStringNop("SITREP_UNOWNED_FLEET_DESTROYED_AT_SYSTEM"),
291                 CurrentTurn() + 1,
292                 "icons/sitrep/combat_destroyed.png",
293                 UserStringNop("SITREP_UNOWNED_FLEET_DESTROYED_AT_SYSTEM_LABEL"), true);
294         else
295             sitrep = SitRepEntry(
296                 UserStringNop("SITREP_FLEET_DESTROYED_AT_SYSTEM"),
297                 CurrentTurn() + 1,
298                 "icons/sitrep/combat_destroyed.png",
299                 UserStringNop("SITREP_FLEET_DESTROYED_AT_SYSTEM_LABEL"), true);
300         sitrep.AddVariable(VarText::FLEET_ID_TAG,      std::to_string(object_id));
301 
302     } else if (auto planet = std::dynamic_pointer_cast<const Planet>(obj)) {
303         if (planet->Unowned())
304             sitrep = SitRepEntry(
305                 UserStringNop("SITREP_UNOWNED_PLANET_DESTROYED_AT_SYSTEM"),
306                 CurrentTurn() + 1,
307                 "icons/sitrep/combat_destroyed.png",
308                 UserStringNop("SITREP_UNOWNED_PLANET_DESTROYED_AT_SYSTEM_LABEL"), true);
309         else
310             sitrep = SitRepEntry(
311                 UserStringNop("SITREP_PLANET_DESTROYED_AT_SYSTEM"),
312                 CurrentTurn() + 1,
313                 "icons/sitrep/combat_destroyed.png",
314                 UserStringNop("SITREP_PLANET_DESTROYED_AT_SYSTEM_LABEL"), true);
315         sitrep.AddVariable(VarText::PLANET_ID_TAG,     std::to_string(object_id));
316 
317     } else if (auto building = std::dynamic_pointer_cast<const Building>(obj)) {
318         if (building->Unowned())
319             sitrep = SitRepEntry(
320                 UserStringNop("SITREP_UNOWNED_BUILDING_DESTROYED_ON_PLANET_AT_SYSTEM"),
321                 CurrentTurn() + 1,
322                 "icons/sitrep/combat_destroyed.png",
323                 UserStringNop("SITREP_UNOWNED_BUILDING_DESTROYED_ON_PLANET_AT_SYSTEM_LABEL"), true);
324         else
325             sitrep = SitRepEntry(
326                 UserStringNop("SITREP_BUILDING_DESTROYED_ON_PLANET_AT_SYSTEM"),
327                 CurrentTurn() + 1,
328                 "icons/sitrep/combat_destroyed.png",
329                 UserStringNop("SITREP_BUILDING_DESTROYED_ON_PLANET_AT_SYSTEM_LABEL"), true);
330         sitrep.AddVariable(VarText::BUILDING_ID_TAG,   std::to_string(object_id));
331         sitrep.AddVariable(VarText::PLANET_ID_TAG,     std::to_string(building->PlanetID()));
332     } else {
333         sitrep = GenericCombatDestroyedObjectSitrep(combat_system_id);
334     }
335 
336     sitrep.AddVariable(VarText::EMPIRE_ID_TAG,     std::to_string(obj->Owner()));
337     sitrep.AddVariable(VarText::SYSTEM_ID_TAG,     std::to_string(combat_system_id));
338 
339     return sitrep;
340 }
341 
CreatePlanetDepopulatedSitRep(int planet_id)342 SitRepEntry CreatePlanetDepopulatedSitRep(int planet_id) {
343     SitRepEntry sitrep(
344         UserStringNop("SITREP_PLANET_DEPOPULATED"),
345         CurrentTurn() + 1,
346         "icons/sitrep/colony_destroyed.png",
347         UserStringNop("SITREP_PLANET_DEPOPULATED_LABEL"), true);
348     sitrep.AddVariable(VarText::PLANET_ID_TAG,     std::to_string(planet_id));
349     return sitrep;
350 }
351 
CreatePlanetColonizedSitRep(int planet_id,const std::string & species)352 SitRepEntry CreatePlanetColonizedSitRep(int planet_id, const std::string& species) {
353     SitRepEntry sitrep(
354         UserStringNop("SITREP_PLANET_COLONIZED"),
355         CurrentTurn() + 1,
356         "icons/sitrep/planet_colonized.png",
357         UserStringNop("SITREP_PLANET_COLONIZED_LABEL"), true);
358     sitrep.AddVariable(VarText::PLANET_ID_TAG,  std::to_string(planet_id));
359     sitrep.AddVariable(VarText::SPECIES_TAG,    species);
360     return sitrep;
361 }
362 
CreatePlanetOutpostedSitRep(int planet_id)363 SitRepEntry CreatePlanetOutpostedSitRep(int planet_id) {
364     SitRepEntry sitrep(
365         UserStringNop("SITREP_PLANET_OUTPOSTED"),
366         CurrentTurn() + 1,
367         "icons/sitrep/planet_colonized.png",
368         UserStringNop("SITREP_PLANET_OUTPOSTED_LABEL"), true);
369     sitrep.AddVariable(VarText::PLANET_ID_TAG,     std::to_string(planet_id));
370     return sitrep;
371 }
372 
CreatePlanetGiftedSitRep(int planet_id,int empire_id)373 SitRepEntry CreatePlanetGiftedSitRep(int planet_id, int empire_id) {
374     SitRepEntry sitrep(
375         UserStringNop("SITREP_PLANET_GIFTED"),
376         CurrentTurn() + 1,
377         "icons/sitrep/gift.png",
378         UserStringNop("SITREP_PLANET_GIFTED_LABEL"), true);
379     sitrep.AddVariable(VarText::PLANET_ID_TAG,  std::to_string(planet_id));
380     sitrep.AddVariable(VarText::EMPIRE_ID_TAG,  std::to_string(empire_id));
381     return sitrep;
382 }
383 
CreateFleetGiftedSitRep(int fleet_id,int empire_id)384 SitRepEntry CreateFleetGiftedSitRep(int fleet_id, int empire_id) {
385     SitRepEntry sitrep(
386         UserStringNop("SITREP_FLEET_GIFTED"),
387         CurrentTurn() + 1,
388         "icons/sitrep/gift.png",
389         UserStringNop("SITREP_FLEET_GIFTED_LABEL"), true);
390     sitrep.AddVariable(VarText::FLEET_ID_TAG,   std::to_string(fleet_id));
391     sitrep.AddVariable(VarText::EMPIRE_ID_TAG,  std::to_string(empire_id));
392     return sitrep;
393 }
394 
CreateFleetArrivedAtDestinationSitRep(int system_id,int fleet_id,int recipient_empire_id)395 SitRepEntry CreateFleetArrivedAtDestinationSitRep(int system_id, int fleet_id, int recipient_empire_id) {
396     auto fleet = Objects().get<Fleet>(fleet_id);
397 
398     //bool system_contains_recipient_empire_planets = false;
399     //if (const System* system = Objects().get<System>(system_id)) {
400     //    for (const auto& planet : system->all<Planet>()) {
401     //        if (!planet || planet->Unowned())
402     //            continue;
403     //        if (planet->OwnedBy(recipient_empire_id)) {
404     //            system_contains_recipient_empire_planets = true;
405     //            break;
406     //        }
407     //    }
408     //}
409 
410     //There are variants of this message for {monster, own, foreign} * {one ship, fleet}.
411     // TODO: More variants for systems with / without recipient-owned planets
412     //These should really be assembled from several pieces: a fleet description,
413     //a system description, and a message template into which both are substituted.
414     if (!fleet) {
415         SitRepEntry sitrep(
416             UserStringNop("SITREP_FLEET_ARRIVED_AT_SYSTEM"),
417             CurrentTurn() + 1,
418             "icons/sitrep/fleet_arrived.png",
419             UserStringNop("SITREP_FLEET_ARRIVED_AT_SYSTEM_LABEL"), true);
420         sitrep.AddVariable(VarText::SYSTEM_ID_TAG,  std::to_string(system_id));
421         sitrep.AddVariable(VarText::FLEET_ID_TAG,   std::to_string(fleet_id));
422         return sitrep;
423     } else if (fleet->Unowned() && fleet->HasMonsters()) {
424         if (fleet->NumShips() == 1) {
425             SitRepEntry sitrep(
426                 UserStringNop("SITREP_MONSTER_SHIP_ARRIVED_AT_DESTINATION"),
427                 CurrentTurn() + 1,
428                 "icons/sitrep/fleet_arrived.png",
429                 UserStringNop("SITREP_MONSTER_SHIP_ARRIVED_AT_DESTINATION_LABEL"), true);
430             sitrep.AddVariable(VarText::SYSTEM_ID_TAG,     std::to_string(system_id));
431             sitrep.AddVariable(VarText::FLEET_ID_TAG,      std::to_string(fleet_id));
432             int ship_id = *fleet->ShipIDs().begin();
433             sitrep.AddVariable(VarText::SHIP_ID_TAG,       std::to_string(ship_id));
434             if (auto ship = Objects().get<Ship>(ship_id))
435                 sitrep.AddVariable(VarText::DESIGN_ID_TAG, std::to_string(ship->DesignID()));
436             return sitrep;
437         } else {
438             SitRepEntry sitrep(
439                 UserStringNop("SITREP_MONSTER_FLEET_ARRIVED_AT_DESTINATION"),
440                 CurrentTurn() + 1,
441                 "icons/sitrep/fleet_arrived.png",
442                 UserStringNop("SITREP_MONSTER_FLEET_ARRIVED_AT_DESTINATION_LABEL"), true);
443             sitrep.AddVariable(VarText::SYSTEM_ID_TAG,  std::to_string(system_id));
444             sitrep.AddVariable(VarText::FLEET_ID_TAG,   std::to_string(fleet_id));
445             sitrep.AddVariable(VarText::RAW_TEXT_TAG,   std::to_string(fleet->NumShips()));
446             return sitrep;
447         }
448     } else if (fleet->Unowned()) {
449         SitRepEntry sitrep(
450             UserStringNop("SITREP_FLEET_ARRIVED_AT_DESTINATION"),
451             CurrentTurn() + 1,
452             "icons/sitrep/fleet_arrived.png",
453             UserStringNop("SITREP_FLEET_ARRIVED_AT_DESTINATION_LABEL"), true);
454         sitrep.AddVariable(VarText::SYSTEM_ID_TAG,  std::to_string(system_id));
455         sitrep.AddVariable(VarText::FLEET_ID_TAG,   std::to_string(fleet_id));
456         sitrep.AddVariable(VarText::RAW_TEXT_TAG,   std::to_string(fleet->NumShips()));
457         return sitrep;
458     } else if (fleet->OwnedBy(recipient_empire_id)) {
459         if (fleet->NumShips() == 1) {
460             SitRepEntry sitrep(
461                 UserStringNop("SITREP_OWN_SHIP_ARRIVED_AT_DESTINATION"),
462                 CurrentTurn() + 1,
463                 "icons/sitrep/fleet_arrived.png",
464                 UserStringNop("SITREP_OWN_SHIP_ARRIVED_AT_DESTINATION_LABEL"), true);
465             sitrep.AddVariable(VarText::SYSTEM_ID_TAG,     std::to_string(system_id));
466             sitrep.AddVariable(VarText::FLEET_ID_TAG,      std::to_string(fleet_id));
467             sitrep.AddVariable(VarText::EMPIRE_ID_TAG,     std::to_string(fleet->Owner()));
468             int ship_id = *fleet->ShipIDs().begin();
469             sitrep.AddVariable(VarText::SHIP_ID_TAG,       std::to_string(ship_id));
470             if (auto ship = Objects().get<Ship>(ship_id))
471                 sitrep.AddVariable(VarText::DESIGN_ID_TAG, std::to_string(ship->DesignID()));
472             return sitrep;
473         } else {
474             SitRepEntry sitrep(
475                 UserStringNop("SITREP_OWN_FLEET_ARRIVED_AT_DESTINATION"),
476                 CurrentTurn() + 1,
477                 "icons/sitrep/fleet_arrived.png",
478                 UserStringNop("SITREP_OWN_FLEET_ARRIVED_AT_DESTINATION_LABEL"), true);
479             sitrep.AddVariable(VarText::SYSTEM_ID_TAG,  std::to_string(system_id));
480             sitrep.AddVariable(VarText::FLEET_ID_TAG,   std::to_string(fleet_id));
481             sitrep.AddVariable(VarText::EMPIRE_ID_TAG,  std::to_string(fleet->Owner()));
482             sitrep.AddVariable(VarText::RAW_TEXT_TAG,   std::to_string(fleet->NumShips()));
483             return sitrep;
484         }
485     } else {
486         if (fleet->NumShips() == 1) {
487             SitRepEntry sitrep(
488                 UserStringNop("SITREP_FOREIGN_SHIP_ARRIVED_AT_DESTINATION"),
489                 CurrentTurn() + 1,
490                 "icons/sitrep/fleet_arrived.png",
491                 UserStringNop("SITREP_FOREIGN_SHIP_ARRIVED_AT_DESTINATION_LABEL"), true);
492             sitrep.AddVariable(VarText::SYSTEM_ID_TAG,     std::to_string(system_id));
493             sitrep.AddVariable(VarText::FLEET_ID_TAG,      std::to_string(fleet_id));
494             sitrep.AddVariable(VarText::EMPIRE_ID_TAG,     std::to_string(fleet->Owner()));
495             int ship_id = *fleet->ShipIDs().begin();
496             sitrep.AddVariable(VarText::SHIP_ID_TAG,       std::to_string(ship_id));
497             if (auto ship = Objects().get<Ship>(ship_id))
498                 sitrep.AddVariable(VarText::DESIGN_ID_TAG, std::to_string(ship->DesignID()));
499             return sitrep;
500         } else {
501             SitRepEntry sitrep(
502                 UserStringNop("SITREP_FOREIGN_FLEET_ARRIVED_AT_DESTINATION"),
503                 CurrentTurn() + 1,
504                 "icons/sitrep/fleet_arrived.png",
505                 UserStringNop("SITREP_FOREIGN_FLEET_ARRIVED_AT_DESTINATION_LABEL"), true);
506             sitrep.AddVariable(VarText::SYSTEM_ID_TAG,  std::to_string(system_id));
507             sitrep.AddVariable(VarText::FLEET_ID_TAG,   std::to_string(fleet_id));
508             sitrep.AddVariable(VarText::EMPIRE_ID_TAG,  std::to_string(fleet->Owner()));
509             sitrep.AddVariable(VarText::RAW_TEXT_TAG,   std::to_string(fleet->NumShips()));
510             return sitrep;
511         }
512     }
513 }
514 
CreateEmpireEliminatedSitRep(int empire_id)515 SitRepEntry CreateEmpireEliminatedSitRep(int empire_id) {
516     SitRepEntry sitrep(
517         UserStringNop("SITREP_EMPIRE_ELIMINATED"),
518         CurrentTurn() + 1,
519         "icons/sitrep/empire_eliminated.png",
520         UserStringNop("SITREP_EMPIRE_ELIMINATED_LABEL"), true);
521     sitrep.AddVariable(VarText::EMPIRE_ID_TAG, std::to_string(empire_id));
522     return sitrep;
523 }
524 
CreateVictorySitRep(const std::string & reason_string,int empire_id)525 SitRepEntry CreateVictorySitRep(const std::string& reason_string, int empire_id) {
526     SitRepEntry sitrep(reason_string, CurrentTurn() + 1, "icons/sitrep/victory.png", UserStringNop("SITREP_VICTORY_LABEL"), true);
527     sitrep.AddVariable(VarText::EMPIRE_ID_TAG, std::to_string(empire_id));
528     return sitrep;
529 }
530 
CreateSitRep(const std::string & template_string,int turn,const std::string & icon,const std::vector<std::pair<std::string,std::string>> & parameters,const std::string label,bool stringtable_lookup)531 SitRepEntry CreateSitRep(const std::string& template_string, int turn, const std::string& icon,
532                          const std::vector<std::pair<std::string, std::string>>& parameters,
533                          const std::string label, bool stringtable_lookup)
534 {
535     SitRepEntry sitrep(template_string, turn, icon, label, stringtable_lookup);
536     for (const std::pair<std::string, std::string>& parameter : parameters)
537     { sitrep.AddVariable(parameter.first, parameter.second); }
538     return sitrep;
539 }
540