DimensionGenerator.h 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. #pragma once
  2. #include <Array.h>
  3. #include <Either.h>
  4. #include <ReferenceCounter.h>
  5. #include "BiomGenerator.h"
  6. #include "CaveGenerator.h"
  7. #include "Chunk.h"
  8. #include "JNoise.h"
  9. #include "JsonExpression.h"
  10. class DimensionGenerator;
  11. class WorldHeightLayer : public virtual Framework::ReferenceCounter
  12. {
  13. private:
  14. Framework::JSON::JSONObject* noiseConfig;
  15. Noise* noise;
  16. Framework::Text name;
  17. JFloatExpression* value;
  18. public:
  19. WorldHeightLayer();
  20. ~WorldHeightLayer();
  21. void initialize(JExpressionMemory* zMemory);
  22. void calculateValue(JExpressionMemory* zMemory);
  23. void setNoiseConfig(Framework::JSON::JSONObject* noiseConfig);
  24. Framework::JSON::JSONObject* zNoiseConfig() const;
  25. void setName(Framework::Text name);
  26. Framework::Text getName() const;
  27. void setValue(JFloatExpression* value);
  28. JFloatExpression* zValue() const;
  29. };
  30. class WorldHeightLayerFactory : public ObjectTypeFactory<WorldHeightLayer>
  31. {
  32. public:
  33. WorldHeightLayerFactory();
  34. WorldHeightLayer* fromJson(
  35. Framework::JSON::JSONObject* zJson) const override;
  36. Framework::JSON::JSONObject* toJsonObject(
  37. WorldHeightLayer* zObject) const override;
  38. JSONObjectValidationBuilder* addToValidator(
  39. JSONObjectValidationBuilder* builder) const override;
  40. };
  41. class DimensionGenerator : public virtual Framework::ReferenceCounter
  42. {
  43. private:
  44. JExpressionMemory* jExpressionMemory;
  45. JFloatExpression* seedExpression;
  46. Framework::RCArray<WorldHeightLayer> heightLayers;
  47. Framework::Text name;
  48. int dimensionId;
  49. protected:
  50. DimensionGenerator();
  51. ~DimensionGenerator();
  52. JExpressionMemory* zMemory() const;
  53. void calculateHeightLayers();
  54. public:
  55. Dimension* createDimension();
  56. virtual void initialize(int worldSeed);
  57. virtual Chunk* generateChunk(int centerX, int centerY) = 0;
  58. virtual Framework::Either<Block*, int> generateBlock(
  59. Framework::Vec3<int> location)
  60. = 0;
  61. virtual bool spawnStructure(Framework::Vec3<int> location,
  62. std::function<bool(GeneratorTemplate* tmpl)> filter)
  63. = 0;
  64. virtual void generateEntities(Chunk* zChunk) = 0;
  65. int getDimensionId() const;
  66. void addHeightLayer(WorldHeightLayer* layer);
  67. const Framework::RCArray<WorldHeightLayer>& getHeightLayers() const;
  68. void setName(Framework::Text name);
  69. Framework::Text getName() const;
  70. void setId(int id);
  71. int getId() const;
  72. void setSeed(JFloatExpression* seed);
  73. JFloatExpression* zSeed() const;
  74. static const Framework::Text X;
  75. static const Framework::Text Y;
  76. static const Framework::Text Z;
  77. };
  78. template<typename S> class DimensionGeneratorFactory
  79. : public SubTypeFactory<DimensionGenerator, S>
  80. {
  81. public:
  82. DimensionGeneratorFactory()
  83. : SubTypeFactory<DimensionGenerator, S>()
  84. {}
  85. S* fromJson(Framework::JSON::JSONObject* zJson) const override
  86. {
  87. S* result = createValue(zJson);
  88. DimensionGenerator* zGenerator
  89. = dynamic_cast<DimensionGenerator*>(result);
  90. zGenerator->setName(zJson->zValue("name")->asString()->getString());
  91. zGenerator->setId((int)zJson->zValue("id")->asNumber()->getNumber());
  92. zGenerator->setSeed(
  93. Game::INSTANCE->zTypeRegistry()->fromJson<JFloatExpression>(
  94. zJson->zValue("dimensionSeed")));
  95. for (Framework::JSON::JSONValue* layer :
  96. *zJson->zValue("heightLayers")->asArray())
  97. {
  98. zGenerator->addHeightLayer(
  99. Game::INSTANCE->zTypeRegistry()->fromJson<WorldHeightLayer>(
  100. layer));
  101. }
  102. return result;
  103. }
  104. Framework::JSON::JSONObject* toJsonObject(S* zObject) const override
  105. {
  106. Framework::JSON::JSONObject* result = new Framework::JSON::JSONObject();
  107. DimensionGenerator* zGenerator
  108. = dynamic_cast<DimensionGenerator*>(zObject);
  109. result->addValue(
  110. "name", new Framework::JSON::JSONString(zGenerator->getName()));
  111. result->addValue(
  112. "id", new Framework::JSON::JSONNumber(zGenerator->getId()));
  113. result->addValue("dimensionSeed",
  114. Game::INSTANCE->zTypeRegistry()->toJson<JFloatExpression>(
  115. zGenerator->zSeed()));
  116. Framework::JSON::JSONArray* hightLayers
  117. = new Framework::JSON::JSONArray();
  118. for (WorldHeightLayer* layer : zGenerator->getHeightLayers())
  119. {
  120. hightLayers->addValue(
  121. Game::INSTANCE->zTypeRegistry()->toJson(layer));
  122. }
  123. result->addValue("heightLayers", hightLayers);
  124. return result;
  125. }
  126. JSONObjectValidationBuilder* addToValidator(
  127. JSONObjectValidationBuilder* builder) const override
  128. {
  129. return builder
  130. ->withRequiredAttribute("dimensionSeed",
  131. Game::INSTANCE->zTypeRegistry()
  132. ->getValidator<JFloatExpression>())
  133. ->withRequiredArray("heightLayers")
  134. ->addAcceptedTypeInArray(Game::INSTANCE->zTypeRegistry()
  135. ->getValidator<WorldHeightLayer>())
  136. ->finishArray()
  137. ->withRequiredString("name")
  138. ->finishString()
  139. ->withRequiredNumber("id")
  140. ->finishNumber();
  141. }
  142. protected:
  143. virtual S* createValue(Framework::JSON::JSONObject* zJson) const = 0;
  144. };
  145. class BiomGenerator;
  146. class BiomedCavedDimensionGenerator : public DimensionGenerator
  147. {
  148. private:
  149. Framework::RCArray<BiomGenerator> biomGenerators;
  150. CaveGenerator* caveGenerator;
  151. Framework::JSON::JSONObject* noiseConfig;
  152. Noise* biomNoise;
  153. Framework::Vec3<int> minStructureOffset;
  154. Framework::Vec3<int> maxStructureOffset;
  155. BiomGenerator* zBiomGenerator();
  156. protected:
  157. Framework::RCArray<GeneratedStructure>* getGeneratedStructoresForArea(
  158. Framework::Vec3<int> minPos, Framework::Vec3<int> maxPos);
  159. public:
  160. BiomedCavedDimensionGenerator();
  161. ~BiomedCavedDimensionGenerator();
  162. virtual void initialize(int worldSeed) override;
  163. Chunk* generateChunk(int centerX, int centerY);
  164. void generateEntities(Chunk* zChunk);
  165. Framework::Either<Block*, int> generateBlock(Framework::Vec3<int> location);
  166. bool spawnStructure(Framework::Vec3<int> location,
  167. std::function<bool(GeneratorTemplate* tmpl)> filter);
  168. void addBiomGenerator(BiomGenerator* biomGenerator);
  169. const Framework::RCArray<BiomGenerator>& getBiomGenerators() const;
  170. void setBiomNoiseConfig(Framework::JSON::JSONObject* biomNoiseConfig);
  171. Framework::JSON::JSONObject* zBiomNoiseConfig() const;
  172. };
  173. class BiomedCavedDimensionGeneratorFactory
  174. : public DimensionGeneratorFactory<BiomedCavedDimensionGenerator>
  175. {
  176. public:
  177. BiomedCavedDimensionGeneratorFactory();
  178. BiomedCavedDimensionGenerator* createValue(
  179. Framework::JSON::JSONObject* zJson) const override;
  180. BiomedCavedDimensionGenerator* fromJson(
  181. Framework::JSON::JSONObject* zJson) const override;
  182. Framework::JSON::JSONObject* toJsonObject(
  183. BiomedCavedDimensionGenerator* zObject) const override;
  184. JSONObjectValidationBuilder* addToValidator(
  185. JSONObjectValidationBuilder* builder) const override;
  186. const char* getTypeToken() const override;
  187. };