#pragma once #include #include #include "Block.h" #include "JNoise.h" #include "JsonExpression.h" class GeneratorRule : public virtual Framework::ReferenceCounter { private: Noise* noise; float threshold; JBoolExpression* condition; protected: virtual Framework::Either createBlock( int x, int y, int z, int dimensionId) = 0; public: GeneratorRule( Framework::JSON::JSONValue* zConfig, JExpressionMemory* zMemory); ~GeneratorRule(); bool checkCondition(JExpressionMemory* zMemory); Framework::Either generateBlock( int x, int y, int z, int dimensionId); template static Framework::JSON::Validator::ObjectValidationBuilder* addToValidator( Framework::JSON::Validator::ObjectValidationBuilder* builder) { return builder ->withRequiredAttribute("noise", JNoise::getValidator(true)) ->withRequiredAttribute( "condition", JExpressionParser::getBoolValidator()) ->withRequiredNumber("threshold") ->whichIsOptional() ->whichIsGreaterOrEqual(0.0) ->whichIsLessOrEqual(1.0) ->finishNumber(); } }; class GeneratorRuleFactory : public virtual Framework::ReferenceCounter { public: GeneratorRuleFactory(); virtual GeneratorRule* createRule( Framework::JSON::JSONValue* zConfig, JExpressionMemory* zMemory) = 0; virtual Framework::JSON::Validator::JSONValidator* getValidator() = 0; };