Pioneer
Factions.h
Go to the documentation of this file.
1 // Copyright © 2008-2023 Pioneer Developers. See AUTHORS.txt for details
2 // Licensed under the terms of the GPL v3. See licenses/GPL-3.txt
3 
4 #ifndef _FACTIONS_H
5 #define _FACTIONS_H
6 
7 #include "DeleteEmitter.h"
8 #include "Polit.h"
9 #include "fixed.h"
10 #include "galaxy/Economy.h"
11 #include "galaxy/Sector.h"
12 #include "galaxy/StarSystem.h"
13 #include "vector3.h"
14 #include <map>
15 #include <utility>
16 #include <vector>
17 
18 class Galaxy;
19 class CustomSystem;
20 
21 class Faction : public DeleteEmitter {
22  friend class FactionsDatabase;
23 
24 public:
25  static const Uint32 BAD_FACTION_IDX; // used by the no faction object to denote it's not a proper faction
26  static const Color BAD_FACTION_COLOUR; // factionColour to use on failing to find an appropriate faction
27  static const float FACTION_BASE_ALPHA; // Alpha to use on factionColour of systems with unknown population
28 
29  Faction(Galaxy *galaxy);
30 
31  Uint32 idx; // faction index
32  std::string name; // Formal name "Federation", "Empire", "Bob's Rib-shack consortium of delicious worlds (tm)", etc.
33  std::string description_short; // short description
34  std::string description; // detailed description describing formation, current status, etc
35 
36  // government types with weighting
37  typedef std::pair<Polit::GovType, Sint32> GovWeight;
38  typedef std::vector<GovWeight> GovWeightVec;
39  typedef GovWeightVec::const_iterator GovWeightIterator;
42 
44  SystemPath homeworld; // sector(x,y,x) + system index + body index = location in a (custom?) system of homeworld
45  double foundingDate; // date faction came into existence
46  double expansionRate; // lightyears per year that the volume expands.
47  std::string military_name; // "Space Defense Force", "Imperial Will Enforcement Division"...
48  //military logo
49  std::string police_name; // "Police", "Polizia Locale"...
50  std::string police_ship; // "kanara", "varada"...
51  //police logo
52  //goods/equipment availability (1-per-economy-type: aka agricultural, industrial, tourist, etc)
53 
54  typedef std::vector<SystemPath> ClaimList;
56  void PushClaim(SystemPath path) { m_ownedsystemlist.push_back(path); }
57  bool IsClaimed(SystemPath) const;
58 
59  // commodity legality
60  typedef std::map<GalacticEconomy::CommodityId, Uint32> CommodityProbMap;
62 
64 
65  double Radius() const { return (FACTION_CURRENT_YEAR - foundingDate) * expansionRate; };
66  bool IsValid() const { return idx != BAD_FACTION_IDX; };
67  Color AdjustedColour(fixed population, bool inRange) const;
68  Polit::GovType PickGovType(Random &rand) const;
69 
70  // set the homeworld to one near the supplied co-ordinates
71  void SetBestFitHomeworld(Sint32 x, Sint32 y, Sint32 z, Sint32 si, Uint32 bi, Sint32 axisChange);
73 
74 private:
75  static const double FACTION_CURRENT_YEAR; // used to calculate faction radius
76 
77  Galaxy *const m_galaxy; // galaxy we are part of
78  mutable RefCountedPtr<const Sector> m_homesector; // cache of home sector to use in distance calculations
79  bool IsCloserAndContains(double &closestFactionDist, const Sector::System *sys) const;
80 };
81 
82 /* One day it might grow up to become a full tree, on the other hand it might be
83  cut down before it's full growth to be replaced by
84  a proper spatial data structure.
85 */
86 
88 public:
89  FactionsDatabase(Galaxy *galaxy, const std::string &factionDir) :
90  m_galaxy(galaxy),
91  m_factionDirectory(factionDir),
92  m_no_faction(galaxy),
93  m_may_assign_factions(false),
94  m_initialized(false) {}
96 
97  void Init();
98  void PostInit();
99  void ClearCache() { ClearHomeSectors(); }
100  bool IsInitialized() const;
101  Galaxy *GetGalaxy() const { return m_galaxy; }
102  void RegisterCustomSystem(CustomSystem *cs, const std::string &factionName);
103  void AddFaction(Faction *faction);
104 
105  const Faction *GetFaction(const Uint32 index) const;
106  const Faction *GetFaction(const std::string &factionName) const;
107  const Faction *GetNearestClaimant(const Sector::System *sys) const;
108  bool IsHomeSystem(const SystemPath &sysPath) const;
109 
110  Uint32 GetNumFactions() const;
111 
112  bool MayAssignFactions() const;
113 
114 private:
115  class Octsapling {
116  public:
117  void Add(const Faction *faction);
118  const std::vector<const Faction *> &CandidateFactions(const Sector::System *sys) const;
119 
120  private:
121  std::vector<const Faction *> octbox[2][2][2];
122  static int BoxIndex(Sint32 sectorIndex) { return sectorIndex < 0 ? 0 : 1; };
123  void PruneDuplicates(const int bx, const int by, const int bz);
124  };
125 
126  typedef std::vector<Faction *> FactionList;
127  typedef FactionList::iterator FactionIterator;
128  typedef const std::vector<const Faction *> ConstFactionList;
129  typedef ConstFactionList::const_iterator ConstFactionIterator;
130  typedef std::map<std::string, Faction *> FactionMap;
131  typedef std::set<SystemPath> HomeSystemSet;
132  typedef std::map<std::string, std::list<CustomSystem *>> MissingFactionsMap;
133 
134  void ClearHomeSectors();
135  void SetHomeSectors();
136 
137  Galaxy *const m_galaxy;
138  const std::string m_factionDirectory;
139  Faction m_no_faction; // instead of answering null, we often want to answer a working faction object for no faction
140  FactionList m_factions;
141  FactionMap m_factions_byName;
142  HomeSystemSet m_homesystems;
143  Octsapling m_spatial_index;
144  bool m_may_assign_factions;
145  bool m_initialized = false;
146  MissingFactionsMap m_missingFactionsMap;
147 };
148 
149 #endif /* _FACTIONS_H */
Definition: CustomSystem.h:71
Definition: DeleteEmitter.h:16
Definition: Factions.h:21
GovWeightVec::const_iterator GovWeightIterator
Definition: Factions.h:39
std::string military_name
Definition: Factions.h:47
SystemPath homeworld
Definition: Factions.h:44
std::vector< GovWeight > GovWeightVec
Definition: Factions.h:38
static const Color BAD_FACTION_COLOUR
Definition: Factions.h:26
bool IsValid() const
Definition: Factions.h:66
double Radius() const
Definition: Factions.h:65
Color colour
Definition: Factions.h:63
double foundingDate
Definition: Factions.h:45
static const Uint32 BAD_FACTION_IDX
Definition: Factions.h:25
void SetBestFitHomeworld(Sint32 x, Sint32 y, Sint32 z, Sint32 si, Uint32 bi, Sint32 axisChange)
Definition: Factions.cpp:700
RefCountedPtr< const Sector > GetHomeSector() const
Definition: Factions.cpp:767
static const float FACTION_BASE_ALPHA
Definition: Factions.h:27
Polit::GovType PickGovType(Random &rand) const
Definition: Factions.cpp:673
std::string police_name
Definition: Factions.h:49
Faction(Galaxy *galaxy)
Definition: Factions.cpp:774
std::string description
Definition: Factions.h:34
std::vector< SystemPath > ClaimList
Definition: Factions.h:54
CommodityProbMap commodity_legality
Definition: Factions.h:61
bool IsClaimed(SystemPath) const
Definition: Factions.cpp:603
std::string description_short
Definition: Factions.h:33
Color AdjustedColour(fixed population, bool inRange) const
Definition: Factions.cpp:662
double expansionRate
Definition: Factions.h:46
ClaimList m_ownedsystemlist
Definition: Factions.h:55
void PushClaim(SystemPath path)
Definition: Factions.h:56
Sint32 govtype_weights_total
Definition: Factions.h:41
std::string police_ship
Definition: Factions.h:50
bool hasHomeworld
Definition: Factions.h:43
Uint32 idx
Definition: Factions.h:31
GovWeightVec govtype_weights
Definition: Factions.h:40
std::map< GalacticEconomy::CommodityId, Uint32 > CommodityProbMap
Definition: Factions.h:60
std::string name
Definition: Factions.h:32
std::pair< Polit::GovType, Sint32 > GovWeight
Definition: Factions.h:37
Definition: Factions.h:87
const Faction * GetFaction(const Uint32 index) const
Definition: Factions.cpp:544
FactionsDatabase(Galaxy *galaxy, const std::string &factionDir)
Definition: Factions.h:89
void PostInit()
Definition: Factions.cpp:488
void AddFaction(Faction *faction)
Definition: Factions.cpp:525
const Faction * GetNearestClaimant(const Sector::System *sys) const
Definition: Factions.cpp:574
bool IsInitialized() const
Definition: Factions.cpp:515
bool IsHomeSystem(const SystemPath &sysPath) const
Definition: Factions.cpp:596
void Init()
Definition: Factions.cpp:448
Galaxy * GetGalaxy() const
Definition: Factions.h:101
~FactionsDatabase()
Definition: Factions.cpp:415
Uint32 GetNumFactions() const
Definition: Factions.cpp:562
bool MayAssignFactions() const
Definition: Factions.cpp:568
void ClearCache()
Definition: Factions.h:99
void RegisterCustomSystem(CustomSystem *cs, const std::string &factionName)
Definition: Factions.cpp:520
Definition: Galaxy.h:18
Definition: Random.h:27
Definition: Sector.h:38
Definition: SystemPath.h:13
GovType
Definition: Polit.h:25
Definition: Color.h:66