TypeRegistry.cpp 3.6 KB

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