Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/game/StarBiome.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/game/StarBiome.cpp')
-rw-r--r--source/game/StarBiome.cpp94
1 files changed, 94 insertions, 0 deletions
diff --git a/source/game/StarBiome.cpp b/source/game/StarBiome.cpp
new file mode 100644
index 0000000..bd9f4a1
--- /dev/null
+++ b/source/game/StarBiome.cpp
@@ -0,0 +1,94 @@
+#include "StarBiome.hpp"
+#include "StarJsonExtra.hpp"
+#include "StarParallax.hpp"
+#include "StarAmbient.hpp"
+
+namespace Star {
+
+BiomePlaceables::BiomePlaceables() {
+ grassMod = NoModId;
+ grassModDensity = 0.0f;
+ ceilingGrassMod = NoModId;
+ ceilingGrassModDensity = 0.0f;
+}
+
+BiomePlaceables::BiomePlaceables(Json const& variant) {
+ grassMod = variant.getInt("grassMod");
+ grassModDensity = variant.getFloat("grassModDensity");
+ ceilingGrassMod = variant.getInt("ceilingGrassMod");
+ ceilingGrassModDensity = variant.getFloat("ceilingGrassModDensity");
+ itemDistributions = variant.getArray("itemDistributions").transformed(construct<BiomeItemDistribution>());
+}
+
+Json BiomePlaceables::toJson() const {
+ return JsonObject{
+ {"grassMod", grassMod},
+ {"grassModDensity", grassModDensity},
+ {"ceilingGrassMod", ceilingGrassMod},
+ {"ceilingGrassModDensity", ceilingGrassModDensity},
+ {"itemDistributions", itemDistributions.transformed(mem_fn(&BiomeItemDistribution::toJson))}
+ };
+}
+
+Maybe<TreeVariant> BiomePlaceables::firstTreeType() const {
+ for (auto const& itemDistribution : itemDistributions) {
+ for (auto const& biomeItem : itemDistribution.allItems()) {
+ if (biomeItem.is<TreePair>())
+ return biomeItem.get<TreePair>().first;
+ }
+ }
+ return {};
+}
+
+Biome::Biome() {
+ mainBlock = EmptyMaterialId;
+ hueShift = 0.0f;
+ materialHueShift = MaterialHue();
+}
+
+Biome::Biome(Json const& store) : Biome() {
+ baseName = store.getString("baseName");
+ description = store.getString("description");
+
+ mainBlock = store.getUInt("mainBlock");
+ subBlocks = store.getArray("subBlocks").transformed([](Json const& v) -> MaterialId { return v.toUInt(); });
+ ores =
+ store.getArray("ores").transformed([](Json const& v) { return pair<ModId, float>(v.getUInt(0), v.getFloat(1)); });
+ hueShift = store.getFloat("hueShift");
+ materialHueShift = store.getUInt("materialHueShift");
+
+ surfacePlaceables = BiomePlaceables(store.get("surfacePlaceables"));
+ undergroundPlaceables = BiomePlaceables(store.get("undergroundPlaceables"));
+
+ if (auto config = store.opt("spawnProfile"))
+ spawnProfile = SpawnProfile(*config);
+
+ if (auto config = store.opt("parallax"))
+ parallax = make_shared<Parallax>(*config);
+
+ if (auto config = store.opt("ambientNoises"))
+ ambientNoises = make_shared<AmbientNoisesDescription>(*config);
+ if (auto config = store.opt("musicTrack"))
+ musicTrack = make_shared<AmbientNoisesDescription>(*config);
+}
+
+Json Biome::toJson() const {
+ return JsonObject{{"baseName", baseName},
+ {"description", description},
+ {"mainBlock", mainBlock},
+ {"subBlocks", subBlocks.transformed(construct<Json>())},
+ {"ores",
+ ores.transformed([](pair<ModId, float> const& p) -> Json {
+ return JsonArray{p.first, p.second};
+ })},
+ {"hueShift", hueShift},
+ {"materialHueShift", materialHueShift},
+ {"surfacePlaceables", surfacePlaceables.toJson()},
+ {"undergroundPlaceables", undergroundPlaceables.toJson()},
+ {"spawnProfile", spawnProfile.toJson()},
+ {"parallax", parallax ? parallax->store() : Json()},
+ {"ambientNoises", ambientNoises ? ambientNoises->toJson() : Json()},
+ {"musicTrack", musicTrack ? musicTrack->toJson() : Json()}};
+}
+
+}