TypeRegistry.cpp 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. #include "TypeRegistry.h"
  2. #include <Datei.h>
  3. #include "BasicBlocks.h"
  4. #include "BasicItems.h"
  5. #include "BasicTool.h"
  6. #include "BlockFilter.h"
  7. #include "BlockInstanceGeneratorRule.h"
  8. #include "BlockTypeGeneratorRule.h"
  9. #include "Chest.h"
  10. #include "Dimension.h"
  11. #include "DimensionGenerator.h"
  12. #include "FluidBlock.h"
  13. #include "FluidContainer.h"
  14. #include "GeneratorRule.h"
  15. #include "Grass.h"
  16. #include "GrowingPlant.h"
  17. #include "LightSources.h"
  18. #include "ModelInfo.h"
  19. #include "OverworldDimension.h"
  20. #include "OverworldDimensionGenerator.h"
  21. #include "PlaceableProof.h"
  22. #include "Quest.h"
  23. #include "Recipie.h"
  24. #include "TreeSeblingBlock.h"
  25. #include "TreeTemplate.h"
  26. TypeRegistry::TypeRegistry()
  27. : ReferenceCounter()
  28. {
  29. // register dimension generators
  30. registerDimensionGeneratorFactory(new OverworldDimensionGeneratorFactory());
  31. // register dimensions
  32. registerDimension(new OverworldDimensionFactory());
  33. // register rules
  34. registerGeneratorRuleFactory(new BlockTypeGeneratorRuleFactory());
  35. registerGeneratorRuleFactory(new BlockInstanceGeneratorRuleFactory());
  36. // register templates
  37. registerSubType(new TreeTemplateFactory());
  38. // register quest datastructures
  39. registerType(new QuestRequirementStorageType());
  40. registerType(new QuestStorageType());
  41. registerType(new QuestPartyType());
  42. registerType(new QuestType());
  43. registerType(new QuestCollectionType());
  44. registerSubType(new QuestRequirementOpenDialogType());
  45. registerType(new ItemJsonType());
  46. registerType(new ItemStackInfoType());
  47. registerSubType(new QuestRewardGiveItemsType());
  48. // block types
  49. registerType(new ModelInfoFactory());
  50. registerSubType(new BasicBlockTypeFactory());
  51. registerSubType(new AdditionalItemSpawningBlockTypeFactory());
  52. registerSubType(new BasicLightSourceBlockTypeFactory());
  53. registerSubType(new ChestBlockTypeFactory());
  54. registerSubType(new FluidBlockTypeFactory());
  55. registerSubType(new GrassBlockTypeFactory());
  56. registerSubType(new GrowingPlantBlockTypeFactory());
  57. registerSubType(new TreeSeblingBlockTypeFactory());
  58. // block filter
  59. registerSubType(new BlockFilterAndFactory());
  60. registerSubType(new BlockFilterOrFactory());
  61. registerSubType(new BlockFilterNotFactory());
  62. registerSubType(new BlockFilterBlockTypeFactory());
  63. registerSubType(new BlockFilterTypeGroupFactory());
  64. registerSubType(new BlockFilterMaxHardnessFactory());
  65. registerSubType(new BlockFilterMinHardnessFactory());
  66. registerSubType(new BlockFilterMaxHeatFactory());
  67. // placeable proof
  68. registerSubType(new PlaceableProofAndFactory());
  69. registerSubType(new PlaceableProofOrFactory());
  70. registerSubType(new PlaceableProofNotFactory());
  71. registerSubType(new PlaceableProofBlockFilterFactory());
  72. // item types
  73. registerSubType(new BasicBlockItemTypeFactory());
  74. registerSubType(new BasicItemTypeFactory());
  75. registerSubType(new BasicToolItemTypeFactory());
  76. registerSubType(new FluidContainerItemTypeFactory());
  77. // item skills
  78. registerSubType(new XPBasedLevelUpRuleFactory());
  79. registerType(new DamagingItemSkillConfigFactory());
  80. registerSubType(new DamagingItemSkillFactory());
  81. registerType(new BlockReplaceItemSkillConfigFactory());
  82. registerSubType(new BlockReplaceItemSkillFactory());
  83. registerType(new FluidContainerItemSkillConfigFactory());
  84. registerSubType(new FluidContainerItemSkillFactory());
  85. // reipies
  86. registerType(new RecipieInputFactory());
  87. registerType(new RecipieOutputFactory());
  88. registerSubType(new ShapedRecipieFactory());
  89. registerSubType(new UnshapedRecipieFactory());
  90. // item modifiers
  91. registerSubType(new ConsumeItemModifierFactory());
  92. registerSubType(new DoNothingModifierFactory());
  93. registerSubType(new AttributeItemModifierFactory());
  94. registerSubType(new CombinedItemModifierFactory());
  95. // item filters
  96. registerSubType(new CombinedItemFilterFactory());
  97. registerSubType(new AnyItemFilterFactory());
  98. registerSubType(new TypeItemFilterFactory());
  99. registerSubType(new GroupItemFilterFactory());
  100. }
  101. void TypeRegistry::registerGeneratorRuleFactory(GeneratorRuleFactory* factory)
  102. {
  103. generatorRules.add(factory);
  104. }
  105. GeneratorRule* TypeRegistry::createGeneratorRule(
  106. Framework::JSON::JSONValue* zConfig, JExpressionMemory* zMemory)
  107. {
  108. for (GeneratorRuleFactory* f : generatorRules)
  109. {
  110. Framework::JSON::Validator::JSONValidator* validator
  111. = f->getValidator();
  112. if (validator->isValid(zConfig))
  113. {
  114. validator->release();
  115. return f->createRule(zConfig, zMemory);
  116. }
  117. validator->release();
  118. }
  119. return 0;
  120. }
  121. Framework::JSON::Validator::JSONValidator*
  122. TypeRegistry::getGeneratorRuleValidator()
  123. {
  124. auto validator = Framework::JSON::Validator::JSONValidator::buildForOneOf()
  125. ->typeSpecifiedByAttribute("type");
  126. for (GeneratorRuleFactory* f : generatorRules)
  127. {
  128. validator->addAcceptedType(f->getValidator());
  129. }
  130. return validator->finishOneOf();
  131. }
  132. void TypeRegistry::registerDimensionGeneratorFactory(
  133. DimensionGeneratorFactory* factory)
  134. {
  135. dimensionGenerators.add(factory);
  136. }
  137. DimensionGenerator* TypeRegistry::createDimensionGenerator(
  138. Framework::JSON::JSONValue* zConfig, int worldSeed)
  139. {
  140. for (DimensionGeneratorFactory* f : dimensionGenerators)
  141. {
  142. Framework::JSON::Validator::JSONValidator* validator
  143. = f->getConfigValidator();
  144. if (validator->isValid(zConfig))
  145. {
  146. validator->release();
  147. std::cout << "Loaded Config for dimension '" << f->getName()
  148. << "' with id " << f->getDimensionId() << "\n";
  149. return f->createDimensionGenerator(worldSeed, zConfig);
  150. }
  151. validator->release();
  152. }
  153. return 0;
  154. }
  155. Framework::JSON::Validator::JSONValidator*
  156. TypeRegistry::getDimensionGeneratorValidator()
  157. {
  158. auto validator = Framework::JSON::Validator::JSONValidator::buildForOneOf()
  159. ->typeSpecifiedByAttribute("dimension");
  160. for (DimensionGeneratorFactory* f : dimensionGenerators)
  161. {
  162. validator->addAcceptedType(f->getConfigValidator());
  163. }
  164. return validator->finishOneOf();
  165. }
  166. const Framework::RCArray<DimensionGeneratorFactory>&
  167. TypeRegistry::getDimensionGeneratorFactories() const
  168. {
  169. return dimensionGenerators;
  170. }
  171. void TypeRegistry::registerDimension(DimensionFactory* factory)
  172. {
  173. dimensionFactories.add(factory);
  174. }
  175. Dimension* TypeRegistry::createDimension(int id)
  176. {
  177. for (DimensionFactory* factory : dimensionFactories)
  178. {
  179. if (factory->getDimensionId() == id)
  180. {
  181. return factory->createDimension();
  182. }
  183. }
  184. return 0;
  185. }
  186. void TypeRegistry::writeSyntaxInfo(Framework::Text folderPath) const
  187. {
  188. for (Framework::Text* typeId : parsableTypeNames)
  189. {
  190. TypeFatoryRef* factory
  191. = parsableTypes.z(typeId->getText(), typeId->getLength());
  192. Framework::JSON::Validator::JSONValidator* validator
  193. = factory->getValidator();
  194. Framework::Datei syntaxFile(
  195. new Framework::Text(folderPath + "/" + *typeId + ".xml"));
  196. syntaxFile.erstellen();
  197. Framework::Text syntaxContent = validator->zConstraints()->toString();
  198. syntaxFile.open(Framework::Datei::Style::schreiben);
  199. syntaxFile.schreibe(syntaxContent, syntaxContent.getLength());
  200. syntaxFile.close();
  201. validator->release();
  202. }
  203. }