#pragma once #include #include #include #include "BiomGenerator.h" #include "CaveGenerator.h" #include "Chunk.h" #include "JNoise.h" #include "JsonExpression.h" class DimensionEnum { public: static const int OVERWORLD = 0; }; class DimensionGenerator; class DimensionGeneratorFactory : public virtual Framework::ReferenceCounter { private: Framework::Text name; int dimensionId; public: DimensionGeneratorFactory(Framework::Text name, int dimensionId); virtual DimensionGenerator* createDimensionGenerator( int worldSeed, Framework::JSON::JSONValue* config) = 0; virtual Framework::JSON::Validator::JSONValidator* getConfigValidator() = 0; virtual Framework::JSON::JSONValue* getDefaultConfig() = 0; Framework::Text getName() const; int getDimensionId() const; }; class WorldHeightLayer : public virtual Framework::ReferenceCounter { private: Noise* noise; Framework::Text name; JFloatExpression* value; public: WorldHeightLayer( Framework::JSON::JSONValue* zConfig, JExpressionMemory* zMemory); ~WorldHeightLayer(); void calculateValue(JExpressionMemory* zMemory); static Framework::JSON::Validator::JSONValidator* getValidator(); }; class DimensionGenerator : public virtual Framework::ReferenceCounter { private: JExpressionMemory* jExpressionMemory; Framework::RCArray heightLayers; const int dimensionId; protected: DimensionGenerator(Framework::JSON::JSONValue* zConfig, int worldSeed); ~DimensionGenerator(); JExpressionMemory* zMemory() const; void calculateHeightLayers(); public: virtual Chunk* generateChunk(int centerX, int centerY) = 0; virtual Framework::Either generateBlock( Framework::Vec3 location) = 0; virtual bool spawnStructure(Framework::Vec3 location, std::function filter) = 0; int getDimensionId() const; template static Framework::JSON::Validator::ObjectValidationBuilder* addConfigAttributes( Framework::JSON::Validator::ObjectValidationBuilder* zBuilder) { return zBuilder ->withRequiredAttribute( "dimensionSeed", JExpressionParser::getFloatValidator()) ->withRequiredAttribute("heightLayers", Framework::JSON::Validator::JSONValidator::buildForArray() ->withDefault(new Framework::JSON::JSONArray()) ->removeInvalidEntries() ->addAcceptedTypeInArray(WorldHeightLayer::getValidator()) ->finishArray()); } }; class BiomGenerator; class BiomedCavedDimensionGenerator : public DimensionGenerator { private: Framework::RCArray biomGenerators; CaveGenerator* caveGenerator; Noise* biomNoise; Framework::Vec3 minStructureOffset; Framework::Vec3 maxStructureOffset; BiomGenerator* zBiomGenerator(); protected: Framework::RCArray* getGeneratedStructoresForArea( Framework::Vec3 minPos, Framework::Vec3 maxPos); public: BiomedCavedDimensionGenerator( Framework::JSON::JSONValue* zConfig, int worldSeed); ~BiomedCavedDimensionGenerator(); Chunk* generateChunk(int centerX, int centerY); Framework::Either generateBlock(Framework::Vec3 location); bool spawnStructure(Framework::Vec3 location, std::function filter); template static Framework::JSON::Validator::ObjectValidationBuilder* addConfigAttributes( Framework::JSON::Validator::ObjectValidationBuilder* zBuilder) { return DimensionGenerator::addConfigAttributes(zBuilder ->withRequiredArray("bioms") ->addAcceptedTypeInArray(BiomGenerator::getConfigValidator()) ->finishArray() ->withRequiredAttribute("biomNoise", JNoise::getValidator(false))); } };