Recipie.h 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  1. #pragma once
  2. #include <Array.h>
  3. #include <JSON.h>
  4. #include "Game.h"
  5. #include "ItemFilter.h"
  6. #include "ItemModifier.h"
  7. #include "TypeRegistry.h"
  8. class CraftingStorage;
  9. class ShapedCraftingStorage;
  10. struct ItemInfo
  11. {
  12. int type;
  13. int count;
  14. float hp;
  15. float maxHp;
  16. float durability;
  17. float maxDurability;
  18. };
  19. class RecipieInput : public Framework::ReferenceCounter
  20. {
  21. private:
  22. ItemFilter* filter;
  23. ItemModifier* modifier;
  24. int amount;
  25. public:
  26. RecipieInput();
  27. ~RecipieInput();
  28. void setFilter(ItemFilter* filter);
  29. ItemFilter* zFilter() const;
  30. void setModifier(ItemModifier* modifier);
  31. ItemModifier* zModifier() const;
  32. void setAmount(int amount);
  33. int getAmount() const;
  34. };
  35. class RecipieInputFactory : public ObjectTypeFactory<RecipieInput>
  36. {
  37. public:
  38. RecipieInputFactory();
  39. RecipieInput* fromJson(Framework::JSON::JSONObject* zJson) const override;
  40. Framework::JSON::JSONObject* toJsonObject(
  41. RecipieInput* zObject) const override;
  42. JSONObjectValidationBuilder* addToValidator(
  43. JSONObjectValidationBuilder* builder) const override;
  44. };
  45. class RecipieOutput : public Framework::ReferenceCounter
  46. {
  47. private:
  48. int itemTypeId;
  49. int amount;
  50. ItemModifier* modifier;
  51. public:
  52. RecipieOutput();
  53. ~RecipieOutput();
  54. void setItemTypeId(int itemTypeId);
  55. int getItemTypeId() const;
  56. void setAmount(int amount);
  57. int getAmount() const;
  58. void setModifier(ItemModifier* modifier);
  59. ItemModifier* zModifier() const;
  60. Item* createItem() const;
  61. };
  62. class RecipieOutputFactory : public ObjectTypeFactory<RecipieOutput>
  63. {
  64. public:
  65. RecipieOutputFactory();
  66. RecipieOutput* fromJson(Framework::JSON::JSONObject* zJson) const override;
  67. Framework::JSON::JSONObject* toJsonObject(
  68. RecipieOutput* zObject) const override;
  69. JSONObjectValidationBuilder* addToValidator(
  70. JSONObjectValidationBuilder* builder) const override;
  71. };
  72. class Recipie : public virtual Framework::ReferenceCounter
  73. {
  74. protected:
  75. Framework::Text groupName;
  76. Framework::RCArray<RecipieOutput> outputs;
  77. public:
  78. Recipie();
  79. virtual bool testApplicability(CraftingStorage* zStorage) = 0;
  80. virtual void consumeInputs(CraftingStorage* zStorage) = 0;
  81. virtual void produceOutputs(CraftingStorage* zStorage) = 0;
  82. virtual void apply(CraftingStorage* zStorage);
  83. virtual Framework::XML::Element* getRecipieUIML() const = 0;
  84. void addOutput(RecipieOutput* outputs);
  85. virtual Framework::Array<ItemInfo> getOutput() const;
  86. bool createsOutput(int itemTypeId);
  87. void setGroupName(Framework::Text groupName);
  88. const Framework::RCArray<RecipieOutput>& getOutputs() const;
  89. Framework::Text getGroupName() const;
  90. virtual int getTicksNeeded() const;
  91. virtual int getFuelPerTickNeeded() const;
  92. };
  93. template<typename S> class RecipieFactory : public SubTypeFactory<Recipie, S>
  94. {
  95. public:
  96. RecipieFactory()
  97. : SubTypeFactory<Recipie, S>()
  98. {}
  99. S* fromJson(Framework::JSON::JSONObject* zJson) const override
  100. {
  101. S* result = createValue(zJson);
  102. Recipie* zRecipie = dynamic_cast<Recipie*>(result);
  103. for (Framework::JSON::JSONValue* output :
  104. *zJson->zValue("outputs")->asArray())
  105. {
  106. zRecipie->addOutput(
  107. Game::INSTANCE->zTypeRegistry()->fromJson<RecipieOutput>(
  108. output));
  109. }
  110. zRecipie->setGroupName(zJson->zValue("group")->asString()->getString());
  111. return result;
  112. }
  113. Framework::JSON::JSONObject* toJsonObject(S* zObject) const override
  114. {
  115. Framework::JSON::JSONObject* result = new Framework::JSON::JSONObject();
  116. Recipie* zRecipie = dynamic_cast<Recipie*>(result);
  117. Framework::JSON::JSONArray* outputs = new Framework::JSON::JSONArray();
  118. for (RecipieOutput* output : zRecipie->getOutputs())
  119. {
  120. outputs->addValue(Game::INSTANCE->zTypeRegistry()->toJson(output));
  121. }
  122. result->addValue("outputs", outputs);
  123. result->addValue(
  124. "group", new Framework::JSON::JSONString(zRecipie->getGroupName()));
  125. return result;
  126. };
  127. JSONObjectValidationBuilder* addToValidator(
  128. JSONObjectValidationBuilder* builder) const override
  129. {
  130. return builder->withRequiredArray("outputs")
  131. ->addAcceptedTypeInArray(
  132. Game::INSTANCE->zTypeRegistry()->getValidator<RecipieOutput>())
  133. ->finishArray()
  134. ->withRequiredString("group")
  135. ->finishString();
  136. }
  137. protected:
  138. virtual S* createValue(Framework::JSON::JSONObject* zJson) const = 0;
  139. };
  140. class UnshapedRecipie : public Recipie
  141. {
  142. private:
  143. Framework::RCArray<RecipieInput> inputs;
  144. public:
  145. UnshapedRecipie();
  146. bool testApplicability(CraftingStorage* zStorage) override;
  147. void consumeInputs(CraftingStorage* zStorage) override;
  148. void produceOutputs(CraftingStorage* zStorage) override;
  149. Framework::XML::Element* getRecipieUIML() const override;
  150. void addInput(RecipieInput* input);
  151. const Framework::RCArray<RecipieInput>& getInputs() const;
  152. };
  153. template<class T,
  154. typename = std::enable_if<std::is_base_of<UnshapedRecipie, T>::value>>
  155. class UnshapedRecipieFactory : public RecipieFactory<T>
  156. {
  157. public:
  158. UnshapedRecipieFactory()
  159. : RecipieFactory<T>()
  160. {}
  161. T* createValue(Framework::JSON::JSONObject* zJson) const override
  162. {
  163. return (T*)new UnshapedRecipie();
  164. }
  165. T* fromJson(Framework::JSON::JSONObject* zJson) const override
  166. {
  167. UnshapedRecipie* result = dynamic_cast<UnshapedRecipie*>(
  168. RecipieFactory<T>::fromJson(zJson));
  169. for (Framework::JSON::JSONValue* input :
  170. *zJson->zValue("inputs")->asArray())
  171. {
  172. result->addInput(
  173. Game::INSTANCE->zTypeRegistry()->fromJson<RecipieInput>(input));
  174. }
  175. return dynamic_cast<T*>(result);
  176. }
  177. Framework::JSON::JSONObject* toJsonObject(T* zObject) const override
  178. {
  179. Framework::JSON::JSONObject* result
  180. = RecipieFactory<T>::toJsonObject(zObject);
  181. Framework::JSON::JSONArray* inputs = new Framework::JSON::JSONArray();
  182. for (RecipieInput* input : zObject->getInputs())
  183. {
  184. inputs->addValue(Game::INSTANCE->zTypeRegistry()->toJson(input));
  185. }
  186. result->addValue("inputs", inputs);
  187. return result;
  188. }
  189. JSONObjectValidationBuilder* addToValidator(
  190. JSONObjectValidationBuilder* builder) const override
  191. {
  192. return RecipieFactory<T>::addToValidator(
  193. builder->withRequiredArray("inputs")
  194. ->addAcceptedTypeInArray(Game::INSTANCE->zTypeRegistry()
  195. ->getValidator<RecipieInput>())
  196. ->finishArray());
  197. }
  198. const char* getTypeToken() const override
  199. {
  200. return "unshaped";
  201. }
  202. };
  203. class ShapedRecipie : public Recipie
  204. {
  205. private:
  206. Framework::RCArray<RecipieInput> inputs;
  207. int width;
  208. int height;
  209. public:
  210. ShapedRecipie();
  211. bool testApplicability(CraftingStorage* zStorage) override;
  212. void consumeInputs(CraftingStorage* zStorage) override;
  213. void produceOutputs(CraftingStorage* zStorage) override;
  214. Framework::XML::Element* getRecipieUIML() const override;
  215. void setWidth(int width);
  216. int getWidth() const;
  217. void setHeight(int height);
  218. int getHeight() const;
  219. void addInput(RecipieInput* input);
  220. void setInput(int index, RecipieInput* input);
  221. const Framework::RCArray<RecipieInput>& getInputs() const;
  222. };
  223. class ShapedRecipieFactory : public RecipieFactory<ShapedRecipie>
  224. {
  225. public:
  226. ShapedRecipieFactory();
  227. ShapedRecipie* createValue(
  228. Framework::JSON::JSONObject* zJson) const override;
  229. ShapedRecipie* fromJson(Framework::JSON::JSONObject* zJson) const override;
  230. Framework::JSON::JSONObject* toJsonObject(
  231. ShapedRecipie* zObject) const override;
  232. JSONObjectValidationBuilder* addToValidator(
  233. JSONObjectValidationBuilder* builder) const override;
  234. const char* getTypeToken() const override;
  235. };
  236. class MachineRecipie : public UnshapedRecipie
  237. {
  238. private:
  239. int neededTicks;
  240. int neededFuelPerTick;
  241. public:
  242. MachineRecipie();
  243. void setTicksNeeded(int ticks);
  244. virtual int getTicksNeeded() const override;
  245. void setFuelPerTickNeeded(int fuel);
  246. virtual int getFuelPerTickNeeded() const override;
  247. };
  248. class MachineRecipieFactory : public UnshapedRecipieFactory<MachineRecipie>
  249. {
  250. public:
  251. MachineRecipieFactory();
  252. MachineRecipie* createValue(
  253. Framework::JSON::JSONObject* zJson) const override;
  254. MachineRecipie* fromJson(Framework::JSON::JSONObject* zJson) const override;
  255. Framework::JSON::JSONObject* toJsonObject(
  256. MachineRecipie* zObject) const override;
  257. JSONObjectValidationBuilder* addToValidator(
  258. JSONObjectValidationBuilder* builder) const override;
  259. const char* getTypeToken() const override;
  260. };