diff options
Diffstat (limited to 'source/game/StarCelestialParameters.cpp')
-rw-r--r-- | source/game/StarCelestialParameters.cpp | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/source/game/StarCelestialParameters.cpp b/source/game/StarCelestialParameters.cpp new file mode 100644 index 0000000..c637e43 --- /dev/null +++ b/source/game/StarCelestialParameters.cpp @@ -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; +} + +} |