124 lines
3.3 KiB
C++
124 lines
3.3 KiB
C++
// Copyright © 2008-2021 Pioneer Developers. See AUTHORS.txt for details
|
|
// Licensed under the terms of the GPL v3. See licenses/GPL-3.txt
|
|
|
|
#ifndef _CUSTOMSYSTEM_H
|
|
#define _CUSTOMSYSTEM_H
|
|
|
|
#include "Color.h"
|
|
#include "Polit.h"
|
|
#include "galaxy/SystemBody.h"
|
|
|
|
#include "fixed.h"
|
|
#include "vector3.h"
|
|
|
|
class Faction;
|
|
class Galaxy;
|
|
|
|
class CustomSystemBody {
|
|
public:
|
|
CustomSystemBody();
|
|
~CustomSystemBody();
|
|
|
|
std::string name;
|
|
SystemBody::BodyType type;
|
|
fixed radius; // in earth radii for planets, sol radii for stars (equatorial radius)
|
|
fixed aspectRatio; // the ratio between equatorial radius and polar radius for bodies flattened due to equatorial bulge (1.0 to infinity)
|
|
fixed mass; // earth masses or sol masses
|
|
int averageTemp; // kelvin
|
|
fixed semiMajorAxis; // in AUs
|
|
fixed eccentricity;
|
|
fixed orbitalOffset;
|
|
fixed orbitalPhaseAtStart; // mean anomaly at start 0 to 2 pi
|
|
bool want_rand_offset;
|
|
// for orbiting things, latitude = inclination
|
|
float latitude, longitude; // radians
|
|
fixed rotationPeriod; // in days
|
|
fixed rotationalPhaseAtStart; // 0 to 2 pi
|
|
fixed axialTilt; // in radians
|
|
std::string heightMapFilename;
|
|
int heightMapFractal;
|
|
std::vector<CustomSystemBody *> children;
|
|
|
|
/* composition */
|
|
fixed metallicity; // (crust) 0.0 = light (Al, SiO2, etc), 1.0 = heavy (Fe, heavy metals)
|
|
fixed volatileGas; // 1.0 = earth atmosphere density
|
|
fixed volatileLiquid; // 1.0 = 100% ocean cover (earth = 70%)
|
|
fixed volatileIces; // 1.0 = 100% ice cover (earth = 3%)
|
|
fixed volcanicity; // 0 = none, 1.0 = fucking volcanic
|
|
fixed atmosOxidizing; // 0.0 = reducing (H2, NH3, etc), 1.0 = oxidising (CO2, O2, etc)
|
|
fixed life; // 0.0 = dead, 1.0 = teeming
|
|
|
|
/* rings */
|
|
enum RingStatus {
|
|
WANT_RANDOM_RINGS,
|
|
WANT_RINGS,
|
|
WANT_NO_RINGS,
|
|
WANT_CUSTOM_RINGS
|
|
};
|
|
RingStatus ringStatus;
|
|
fixed ringInnerRadius;
|
|
fixed ringOuterRadius;
|
|
Color ringColor;
|
|
|
|
Uint32 seed;
|
|
bool want_rand_seed;
|
|
std::string spaceStationType;
|
|
|
|
void SanityChecks();
|
|
|
|
};
|
|
|
|
class CustomSystem {
|
|
public:
|
|
static const int CUSTOM_ONLY_RADIUS = 4;
|
|
CustomSystem();
|
|
~CustomSystem();
|
|
|
|
std::string name;
|
|
std::vector<std::string> other_names;
|
|
CustomSystemBody *sBody;
|
|
SystemBody::BodyType primaryType[4];
|
|
unsigned numStars;
|
|
int sectorX, sectorY, sectorZ;
|
|
vector3f pos;
|
|
Uint32 seed;
|
|
bool want_rand_explored;
|
|
bool explored;
|
|
const Faction *faction;
|
|
Polit::GovType govType;
|
|
bool want_rand_lawlessness;
|
|
fixed lawlessness; // 0.0 = lawful, 1.0 = totally lawless
|
|
std::string shortDesc;
|
|
std::string longDesc;
|
|
|
|
void SanityChecks();
|
|
|
|
bool IsRandom() const { return !sBody; }
|
|
};
|
|
|
|
class CustomSystemsDatabase {
|
|
public:
|
|
CustomSystemsDatabase(Galaxy *galaxy, const std::string &customSysDir) :
|
|
m_galaxy(galaxy),
|
|
m_customSysDirectory(customSysDir) {}
|
|
~CustomSystemsDatabase();
|
|
|
|
void Load();
|
|
|
|
typedef std::vector<const CustomSystem *> SystemList;
|
|
// XXX this is not as const-safe as it should be
|
|
const SystemList &GetCustomSystemsForSector(int sectorX, int sectorY, int sectorZ) const;
|
|
void AddCustomSystem(const SystemPath &path, CustomSystem *csys);
|
|
Galaxy *GetGalaxy() const { return m_galaxy; }
|
|
|
|
private:
|
|
typedef std::map<SystemPath, SystemList> SectorMap;
|
|
|
|
Galaxy *const m_galaxy;
|
|
const std::string m_customSysDirectory;
|
|
SectorMap m_sectorMap;
|
|
static const SystemList s_emptySystemList; // see: Null Object pattern
|
|
};
|
|
|
|
#endif /* _CUSTOMSYSTEM_H */
|