RecipieLoader.cpp 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. #include "RecipieLoader.h"
  2. #include <Datei.h>
  3. #include <iostream>
  4. #include <Logging.h>
  5. #include <stdexcept>
  6. #include "Game.h"
  7. #include "JsonUtils.h"
  8. using namespace Framework::JSON;
  9. using namespace Framework::Validator;
  10. RecipieLoader::RecipieLoader()
  11. : Framework::ReferenceCounter()
  12. {}
  13. RecipieLoader::~RecipieLoader() {}
  14. void RecipieLoader::loadRecipies(const char* path)
  15. {
  16. DataValidator* validator
  17. = Framework::Validator::DataValidator::buildForArray()
  18. ->addAcceptedTypeInArray(Game::INSTANCE->zTypeRegistry()
  19. ->getValidator<RecipieGroupConfig>())
  20. ->removeInvalidEntries()
  21. ->finishArray();
  22. loadAllJsonsFromDirectory(Framework::Text(path) + "/recipieGroups",
  23. [this, &validator](JSONValue* zJson, Framework::Text path) {
  24. Framework::Logging::info()
  25. << "loading recipie groups from '" << path << "'";
  26. Framework::RCArray<ValidationResult> invalidParts;
  27. JSONValue* valid = validator->getValidParts(zJson, &invalidParts);
  28. for (ValidationResult* invalidPart : invalidParts)
  29. {
  30. Framework::Logging::error() << invalidPart->getInvalidInfo();
  31. }
  32. int count = 0;
  33. if (valid)
  34. {
  35. for (JSONValue* value : *valid->asArray())
  36. {
  37. RecipieGroupConfig* recipieGroup
  38. = Game::INSTANCE->zTypeRegistry()
  39. ->fromJson<RecipieGroupConfig>(value);
  40. if (recipieGroup)
  41. {
  42. groupConfigs.add(recipieGroup);
  43. count++;
  44. }
  45. }
  46. }
  47. Framework::Logging::info()
  48. << count << " recipie groups were loaded.";
  49. });
  50. Framework::JSON::JSONObject* schema = validator->getJsonSchema();
  51. Framework::Datei syntaxFile;
  52. syntaxFile.setDatei("data/syntax/schema/recipieGroups.json");
  53. syntaxFile.erstellen();
  54. syntaxFile.open(Framework::Datei::Style::schreiben);
  55. syntaxFile.schreibe(schema->toString(), schema->toString().getLength());
  56. syntaxFile.close();
  57. schema->release();
  58. validator->release();
  59. validator
  60. = Framework::Validator::DataValidator::buildForArray()
  61. ->addAcceptedTypeInArray(
  62. Game::INSTANCE->zTypeRegistry()->getValidator<Recipie>())
  63. ->removeInvalidEntries()
  64. ->finishArray();
  65. loadAllJsonsFromDirectory(Framework::Text(path) + "/recipies",
  66. [this, &validator](JSONValue* zJson, Framework::Text path) {
  67. Framework::Logging::info()
  68. << "loading recipies from '" << path << "'";
  69. Framework::RCArray<ValidationResult> invalidParts;
  70. JSONValue* valid = validator->getValidParts(zJson, &invalidParts);
  71. for (ValidationResult* invalidPart : invalidParts)
  72. {
  73. Framework::Logging::error() << invalidPart->getInvalidInfo();
  74. }
  75. int count = 0;
  76. if (valid)
  77. {
  78. for (JSONValue* value : *valid->asArray())
  79. {
  80. Recipie* recipie
  81. = Game::INSTANCE->zTypeRegistry()->fromJson<Recipie>(
  82. value);
  83. if (recipie)
  84. {
  85. Framework::Text group = recipie->getGroupName();
  86. RecipieList* list = zRecipieList(group);
  87. if (!list)
  88. {
  89. registerRecipieList(group);
  90. list = zRecipieList(group);
  91. }
  92. list->addRecipie(recipie);
  93. count++;
  94. }
  95. }
  96. }
  97. Framework::Logging::info() << count << " recipies were loaded.";
  98. });
  99. schema = validator->getJsonSchema();
  100. syntaxFile.setDatei("data/syntax/schema/recipies.json");
  101. syntaxFile.erstellen();
  102. syntaxFile.open(Framework::Datei::Style::schreiben);
  103. syntaxFile.schreibe(schema->toString(), schema->toString().getLength());
  104. syntaxFile.close();
  105. schema->release();
  106. validator->release();
  107. for (RecipieList* list : lists)
  108. {
  109. bool found = 0;
  110. for (RecipieGroupConfig* groupConfig : groupConfigs)
  111. {
  112. if (list->getName().istGleich(groupConfig->getGroupName()))
  113. {
  114. found = 1;
  115. break;
  116. }
  117. }
  118. if (!found)
  119. {
  120. Framework::Logging::warning()
  121. << "Recipie list '" << list->getName()
  122. << "' has no group config. The recipies can not be viewed by "
  123. "the client.";
  124. }
  125. }
  126. }
  127. RecipieList* RecipieLoader::zRecipieList(const char* name) const
  128. {
  129. for (RecipieList* l : lists)
  130. {
  131. if (l->getName().istGleich(name)) return l;
  132. }
  133. return 0;
  134. }
  135. void RecipieLoader::registerRecipieList(const char* name)
  136. {
  137. if (zRecipieList(name))
  138. throw new std::invalid_argument("the recipie list already exists");
  139. lists.add(new RecipieList(name));
  140. }
  141. Framework::Text RecipieLoader::getCrafingUIML(int itemTypeId)
  142. {
  143. Framework::Text result = "<dialog id=\"crafting_";
  144. result.append() << itemTypeId << "\"><craftingRecipies>";
  145. for (RecipieList* list : lists)
  146. {
  147. Framework::RCArray<Recipie> recipies;
  148. list->findRecipies(itemTypeId, recipies);
  149. if (recipies.getEintragAnzahl() > 0)
  150. {
  151. for (RecipieGroupConfig* groupConfig : groupConfigs)
  152. {
  153. if (list->getName().istGleich(groupConfig->getGroupName()))
  154. {
  155. result.append() << "<craftingRecipieGroup name=\""
  156. << list->getName() << "\" itemIcon=\""
  157. << groupConfig->getIconItemType() << "\">";
  158. for (Recipie* recipie : recipies)
  159. {
  160. result += recipie->getRecipieUIML();
  161. }
  162. result += "</craftingRecipieGroup>";
  163. break;
  164. }
  165. }
  166. }
  167. }
  168. result += "</craftingRecipies></dialog>";
  169. return result;
  170. }