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

summaryrefslogtreecommitdiff
path: root/source/game/StarWeatherTypes.cpp
blob: 9108dc368d26f3d74068d5d7ace9946007bb4d29 (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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#include "StarWeatherTypes.hpp"
#include "StarDataStreamExtra.hpp"
#include "StarJsonExtra.hpp"
#include "StarRoot.hpp"
#include "StarAssets.hpp"
#include "StarBiomeDatabase.hpp"

namespace Star {

WeatherType::WeatherType() {
  maximumWind = 0;
}

WeatherType::WeatherType(Json config, String path) {
  if (config.isType(Json::Type::String)) {
    path = config.toString();
    config = Root::singleton().assets()->json(path);
  }

  name = config.getString("name");

  for (auto v : config.getArray("particles", JsonArray())) {
    ParticleConfig config;
    config.particle = Particle(v.get("particle"), path);
    config.density = v.getFloat("density");
    config.autoRotate = v.getBool("autoRotate", false);
    particles.append(std::move(config));
  }

  for (auto v : config.getArray("projectiles", JsonArray())) {
    ProjectileConfig config;
    config.projectile = v.getString("projectile");
    config.parameters = v.get("parameters", {});
    config.velocity = jsonToVec2F(v.get("velocity"));
    config.ratePerX = v.getFloat("ratePerX");
    config.spawnAboveRegion = v.getInt("spawnAboveRegion");
    config.spawnHorizontalPad = v.getInt("spawnHorizontalPad");
    config.windAffectAmount = v.getFloat("windAffectAmount", 0.0f);
    projectiles.append(std::move(config));
  }

  maximumWind = config.getFloat("maximumWind", 0.0f);
  duration = jsonToVec2F(config.get("duration"));
  weatherNoises = jsonToStringList(config.get("weatherNoises", JsonArray()));
  statusEffects = jsonToStringList(config.get("statusEffects", JsonArray()));
}

Json WeatherType::toJson() const {
  return JsonObject{{"name", name},
      {"particles",
          particles.transformed([](ParticleConfig const& pc) -> Json {
            return JsonObject{
                {"particle", pc.particle.toJson()}, {"density", pc.density}, {"autoRotate", pc.autoRotate}};
          })},
      {"projectiles",
          projectiles.transformed([](ProjectileConfig const& pc) -> Json {
            return JsonObject{{"projectile", pc.projectile},
                {"parameters", pc.parameters},
                {"velocity", jsonFromVec2F(pc.velocity)},
                {"ratePerX", pc.ratePerX},
                {"spawnAboveRegion", pc.spawnAboveRegion},
                {"spawnHorizontalPad", pc.spawnHorizontalPad},
                {"windAffectAmount", pc.windAffectAmount}};
          })},
      {"maximumWind", maximumWind},
      {"duration", jsonFromVec2F(duration)},
      {"weatherNoises", jsonFromStringList(weatherNoises)},
      {"statusEffects", jsonFromStringList(statusEffects)}};
}

DataStream& operator>>(DataStream& ds, WeatherType& weatherType) {
  ds.read(weatherType.name);
  ds.readContainer(weatherType.particles,
      [](DataStream& ds, WeatherType::ParticleConfig& config) {
        ds.read(config.particle);
        ds.read(config.density);
        ds.read(config.autoRotate);
      });
  ds.readContainer(weatherType.projectiles,
      [](DataStream& ds, WeatherType::ProjectileConfig& config) {
        ds.read(config.projectile);
        ds.read(config.parameters);
        ds.read(config.velocity);
        ds.read(config.ratePerX);
        ds.read(config.spawnAboveRegion);
        ds.read(config.spawnHorizontalPad);
        ds.read(config.windAffectAmount);
      });
  ds.read(weatherType.maximumWind);
  ds.read(weatherType.duration);
  ds.readContainer(weatherType.weatherNoises);
  ds.readContainer(weatherType.statusEffects);

  return ds;
}

DataStream& operator<<(DataStream& ds, WeatherType const& weatherType) {
  ds.write(weatherType.name);
  ds.writeContainer(weatherType.particles,
      [](DataStream& ds, WeatherType::ParticleConfig const& config) {
        ds.write(config.particle);
        ds.write(config.density);
        ds.write(config.autoRotate);
      });
  ds.writeContainer(weatherType.projectiles,
      [](DataStream& ds, WeatherType::ProjectileConfig const& config) {
        ds.write(config.projectile);
        ds.write(config.parameters);
        ds.write(config.velocity);
        ds.write(config.ratePerX);
        ds.write(config.spawnAboveRegion);
        ds.write(config.spawnHorizontalPad);
        ds.write(config.windAffectAmount);
      });
  ds.write(weatherType.maximumWind);
  ds.write(weatherType.duration);
  ds.writeContainer(weatherType.weatherNoises);
  ds.writeContainer(weatherType.statusEffects);

  return ds;
}

}