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

summaryrefslogtreecommitdiff
path: root/source/game/StarBiome.cpp
blob: bd9f4a1f9f6a4bd506029c5233edf0f223657c50 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
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()}};
}

}