v1.4.4
This commit is contained in:
commit
9c94d113d3
10260 changed files with 1237388 additions and 0 deletions
131
source/game/StarCelestialParameters.cpp
Normal file
131
source/game/StarCelestialParameters.cpp
Normal file
|
@ -0,0 +1,131 @@
|
|||
#include "StarCelestialParameters.hpp"
|
||||
#include "StarStaticRandom.hpp"
|
||||
#include "StarJsonExtra.hpp"
|
||||
#include "StarDataStreamDevices.hpp"
|
||||
#include "StarDataStreamExtra.hpp"
|
||||
#include "StarAssets.hpp"
|
||||
#include "StarRoot.hpp"
|
||||
#include "StarWeatherTypes.hpp"
|
||||
|
||||
namespace Star {
|
||||
|
||||
CelestialParameters::CelestialParameters() : m_seed(0) {}
|
||||
|
||||
CelestialParameters::CelestialParameters(CelestialCoordinate coordinate, uint64_t seed, String name, Json parameters)
|
||||
: m_coordinate(move(coordinate)), m_seed(seed), m_name(move(name)), m_parameters(move(parameters)) {
|
||||
if (auto worldType = getParameter("worldType").optString()) {
|
||||
if (worldType->equalsIgnoreCase("Terrestrial")) {
|
||||
auto worldSize = getParameter("worldSize").toString();
|
||||
auto type = randomizeParameterList("terrestrialType").toString();
|
||||
m_visitableParameters = generateTerrestrialWorldParameters(type, worldSize, m_seed);
|
||||
} else if (worldType->equalsIgnoreCase("Asteroids")) {
|
||||
m_visitableParameters = generateAsteroidsWorldParameters(m_seed);
|
||||
} else if (worldType->equalsIgnoreCase("FloatingDungeon")) {
|
||||
m_visitableParameters = generateFloatingDungeonWorldParameters(getParameter("dungeonWorld").toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
CelestialParameters::CelestialParameters(ByteArray netStore) {
|
||||
DataStreamBuffer ds(move(netStore));
|
||||
ds >> m_coordinate;
|
||||
ds >> m_seed;
|
||||
ds >> m_name;
|
||||
ds >> m_parameters;
|
||||
m_visitableParameters = netLoadVisitableWorldParameters(ds.read<ByteArray>());
|
||||
}
|
||||
|
||||
CelestialParameters::CelestialParameters(Json const& variant) {
|
||||
m_coordinate = CelestialCoordinate(variant.get("coordinate"));
|
||||
m_seed = variant.getUInt("seed");
|
||||
m_name = variant.getString("name");
|
||||
m_parameters = variant.get("parameters");
|
||||
m_visitableParameters = diskLoadVisitableWorldParameters(variant.get("visitableParameters"));
|
||||
}
|
||||
|
||||
Json CelestialParameters::diskStore() const {
|
||||
return JsonObject{{"coordinate", m_coordinate.toJson()},
|
||||
{"seed", m_seed},
|
||||
{"name", m_name},
|
||||
{"parameters", m_parameters},
|
||||
{"visitableParameters", diskStoreVisitableWorldParameters(m_visitableParameters)}};
|
||||
}
|
||||
|
||||
ByteArray CelestialParameters::netStore() const {
|
||||
DataStreamBuffer ds;
|
||||
ds << m_coordinate;
|
||||
ds << m_seed;
|
||||
ds << m_name;
|
||||
ds << m_parameters;
|
||||
ds.write(netStoreVisitableWorldParameters(m_visitableParameters));
|
||||
|
||||
return ds.takeData();
|
||||
}
|
||||
|
||||
CelestialCoordinate CelestialParameters::coordinate() const {
|
||||
return m_coordinate;
|
||||
}
|
||||
|
||||
String CelestialParameters::name() const {
|
||||
return m_name;
|
||||
}
|
||||
|
||||
uint64_t CelestialParameters::seed() const {
|
||||
return m_seed;
|
||||
}
|
||||
|
||||
Json CelestialParameters::parameters() const {
|
||||
return m_parameters;
|
||||
}
|
||||
|
||||
Json CelestialParameters::getParameter(String const& name, Json def) const {
|
||||
return m_parameters.get(name, move(def));
|
||||
}
|
||||
|
||||
Json CelestialParameters::randomizeParameterList(String const& name, int32_t mix) const {
|
||||
auto parameter = getParameter(name);
|
||||
if (parameter.isNull())
|
||||
return Json();
|
||||
return staticRandomFrom(parameter.toArray(), mix, m_seed, name);
|
||||
}
|
||||
|
||||
Json CelestialParameters::randomizeParameterRange(String const& name, int32_t mix) const {
|
||||
auto parameter = getParameter(name);
|
||||
if (parameter.isNull()) {
|
||||
return Json();
|
||||
} else {
|
||||
JsonArray list = parameter.toArray();
|
||||
if (list.size() != 2)
|
||||
throw CelestialException(
|
||||
strf("Parameter '%s' does not appear to be a range in CelestialParameters::randomizeRange", name));
|
||||
|
||||
return randomizeParameterRange(list, mix, name);
|
||||
}
|
||||
}
|
||||
|
||||
Json CelestialParameters::randomizeParameterRange(
|
||||
JsonArray const& range, int32_t mix, Maybe<String> const& name) const {
|
||||
if (range[0].type() == Json::Type::Int) {
|
||||
int64_t min = range[0].toInt();
|
||||
int64_t max = range[1].toInt();
|
||||
return staticRandomU64(mix, m_seed, name.value("")) % (max - min + 1) + min;
|
||||
} else {
|
||||
double min = range[0].toDouble();
|
||||
double max = range[1].toDouble();
|
||||
return staticRandomDouble(mix, m_seed, name.value("")) * (max - min) + min;
|
||||
}
|
||||
}
|
||||
|
||||
bool CelestialParameters::isVisitable() const {
|
||||
return (bool)m_visitableParameters;
|
||||
}
|
||||
|
||||
VisitableWorldParametersConstPtr CelestialParameters::visitableParameters() const {
|
||||
return m_visitableParameters;
|
||||
}
|
||||
|
||||
void CelestialParameters::setVisitableParameters(VisitableWorldParametersPtr const& newVisitableParameters) {
|
||||
m_visitableParameters = newVisitableParameters;
|
||||
}
|
||||
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue