Pioneer
Loading...
Searching...
No Matches
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
18class Galaxy;
19class CustomSystem;
20
21class Faction : public DeleteEmitter {
22 friend class FactionsDatabase;
23
24public:
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;
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
74private:
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
88public:
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
114private:
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
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
Galaxy * GetGalaxy() const
Definition Factions.h:101
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
~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 RefCounted.h:36
Definition Sector.h:38
Definition SystemPath.h:13
GovType
Definition Polit.h:25
Definition Color.h:66