TypeRegistry.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. #include "TypeRegistry.h"
  2. #include "BlockTypeGeneratorRule.h"
  3. #include "OverworldDimensionGenerator.h"
  4. #include "TreeTemplate.h"
  5. #include "OverworldDimension.h"
  6. TypeRegistry::TypeRegistry()
  7. : ReferenceCounter()
  8. {
  9. // register dimension generators
  10. registerDimensionGeneratorFactory(new OverworldDimensionGeneratorFactory());
  11. // register dimensions
  12. registerDimension(new OverworldDimensionFactory());
  13. // register rules
  14. registerGeneratorRuleFactory(new BlockTypeGeneratorRuleFactory());
  15. // register templates
  16. registerGeneratorTemplate(new TreeTemplateFactory());
  17. }
  18. void TypeRegistry::registerGeneratorRuleFactory(GeneratorRuleFactory* factory)
  19. {
  20. generatorRules.add(factory);
  21. }
  22. GeneratorRule* TypeRegistry::createGeneratorRule(
  23. Framework::JSON::JSONValue* zConfig, JExpressionMemory* zMemory)
  24. {
  25. for (GeneratorRuleFactory* f : generatorRules)
  26. {
  27. Framework::JSON::Validator::JSONValidator* validator
  28. = f->getValidator();
  29. if (validator->isValid(zConfig))
  30. {
  31. validator->release();
  32. return f->createRule(zConfig, zMemory);
  33. }
  34. validator->release();
  35. }
  36. return 0;
  37. }
  38. Framework::JSON::Validator::JSONValidator*
  39. TypeRegistry::getGeneratorRuleValidator()
  40. {
  41. auto validator = Framework::JSON::Validator::JSONValidator::buildForOneOf()
  42. ->typeSpecifiedByAttribute("type");
  43. for (GeneratorRuleFactory* f : generatorRules)
  44. {
  45. validator->addAcceptedType(f->getValidator());
  46. }
  47. return validator->finishOneOf();
  48. }
  49. void TypeRegistry::registerDimensionGeneratorFactory(
  50. DimensionGeneratorFactory* factory)
  51. {
  52. dimensionGenerators.add(factory);
  53. }
  54. DimensionGenerator* TypeRegistry::createDimensionGenerator(
  55. Framework::JSON::JSONValue* zConfig, int worldSeed)
  56. {
  57. for (DimensionGeneratorFactory* f : dimensionGenerators)
  58. {
  59. Framework::JSON::Validator::JSONValidator* validator
  60. = f->getConfigValidator();
  61. if (validator->isValid(zConfig))
  62. {
  63. validator->release();
  64. std::cout << "Loaded Config for dimension '" << f->getName()
  65. << "' with id " << f->getDimensionId() << "\n";
  66. return f->createDimensionGenerator(worldSeed, zConfig);
  67. }
  68. validator->release();
  69. }
  70. return 0;
  71. }
  72. Framework::JSON::Validator::JSONValidator*
  73. TypeRegistry::getDimensionGeneratorValidator()
  74. {
  75. auto validator = Framework::JSON::Validator::JSONValidator::buildForOneOf()
  76. ->typeSpecifiedByAttribute("dimension");
  77. for (DimensionGeneratorFactory* f : dimensionGenerators)
  78. {
  79. validator->addAcceptedType(f->getConfigValidator());
  80. }
  81. return validator->finishOneOf();
  82. }
  83. const Framework::RCArray<DimensionGeneratorFactory>&
  84. TypeRegistry::getDimensionGeneratorFactories() const
  85. {
  86. return dimensionGenerators;
  87. }
  88. void TypeRegistry::registerDimension(DimensionFactory* factory)
  89. {
  90. dimensionFactories.add(factory);
  91. }
  92. Dimension* TypeRegistry::createDimension(int id)
  93. {
  94. for (DimensionFactory* factory : dimensionFactories)
  95. {
  96. if (factory->getDimensionId() == id)
  97. {
  98. return factory->createDimension();
  99. }
  100. }
  101. return 0;
  102. }
  103. void TypeRegistry::registerGeneratorTemplate(GeneratorTemplateFactory* factory)
  104. {
  105. generatorTemplates.add(factory);
  106. }
  107. GeneratorTemplate* TypeRegistry::createGeneratorTemplate(
  108. Framework::JSON::JSONValue* zConfig)
  109. {
  110. for (GeneratorTemplateFactory* f : generatorTemplates)
  111. {
  112. Framework::JSON::Validator::JSONValidator* validator
  113. = f->getValidator();
  114. if (validator->isValid(zConfig))
  115. {
  116. validator->release();
  117. return f->createTemplate(zConfig);
  118. }
  119. validator->release();
  120. }
  121. return 0;
  122. }
  123. Framework::JSON::Validator::JSONValidator*
  124. TypeRegistry::getGeneratorTemplateValidator()
  125. {
  126. auto validator = Framework::JSON::Validator::JSONValidator::buildForOneOf()
  127. ->typeSpecifiedByAttribute("type");
  128. for (GeneratorTemplateFactory* f : generatorTemplates)
  129. {
  130. validator->addAcceptedType(f->getValidator());
  131. }
  132. return validator->finishOneOf();
  133. }