ItemType.h 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. #pragma once
  2. #include <JSON.h>
  3. #include <Text.h>
  4. #include <Writer.h>
  5. #include "BlockType.h"
  6. #include "Game.h"
  7. #include "ModelInfo.h"
  8. class Item;
  9. class ItemStack;
  10. class ItemSkill;
  11. class ItemSkillLevelUpRule;
  12. class ItemTypeEnum
  13. {
  14. public:
  15. static const int PLAYER_HAND = 0;
  16. };
  17. class ItemType : public virtual Framework::ReferenceCounter
  18. {
  19. protected:
  20. int id;
  21. Framework::Text name;
  22. Framework::XML::Element* tooltipUIML;
  23. ModelInfo* model;
  24. int maxStackSize;
  25. Framework::RCArray<Framework::Text> groups;
  26. public:
  27. ItemType();
  28. virtual ~ItemType();
  29. protected:
  30. virtual void loadSuperItem(
  31. Item* zItem, Framework::StreamReader* zReader) const;
  32. virtual void saveSuperItem(
  33. const Item* zItem, Framework::StreamWriter* zWriter) const;
  34. public:
  35. virtual bool initialize(Game* zGame);
  36. virtual const ItemType* zBrokenItemType() const;
  37. virtual Item* createItem() const = 0;
  38. virtual ItemStack* createItemStack(int size) const;
  39. virtual ItemSkill* createDefaultItemSkill() const;
  40. virtual void levelUpItemSkill(ItemSkill* zSkill) const;
  41. virtual Item* cloneItem(const Item* zItem) const;
  42. virtual Item* breakItem(const Item* zItem) const;
  43. virtual Item* loadItem(Framework::StreamReader* zReader) const;
  44. virtual void saveItem(
  45. const Item* zItem, Framework::StreamWriter* zWriter) const;
  46. virtual void setItemAttribute(Item* zItem,
  47. Framework::Text name,
  48. Framework::JSON::JSONValue* zValue) const;
  49. virtual void addItemAttributes(
  50. Item* zItem, Framework::JSON::JSONObject* zItemObjet) const;
  51. void setTypeId(int id);
  52. int getId() const;
  53. void setName(Framework::Text name);
  54. const Framework::Text& getName() const;
  55. void setTooltipUIML(Framework::Text tooltipUIML);
  56. Framework::XML::Element* getTooltipUIML() const;
  57. void setModel(ModelInfo* model);
  58. ModelInfo* zModel() const;
  59. void setMaxStackSize(int maxStackSize);
  60. int getMaxStackSize() const;
  61. void addGroup(Framework::Text group);
  62. const Framework::RCArray<Framework::Text>& getGroups() const;
  63. static Item* createBasicItem(int id,
  64. const char* name,
  65. float hp,
  66. float maxHp,
  67. float durability,
  68. float maxDurability,
  69. bool eatable,
  70. bool placeable,
  71. bool equippable,
  72. bool solid,
  73. bool usable);
  74. static int getTypeId(const char* name);
  75. static const ItemType* zByName(const char* name);
  76. };
  77. template<typename S> class ItemTypeFactoryBase
  78. : public SubTypeFactory<ItemType, S>
  79. {
  80. public:
  81. ItemTypeFactoryBase()
  82. : SubTypeFactory<ItemType, S>()
  83. {}
  84. virtual S* fromJson(Framework::JSON::JSONObject* zJson) const override
  85. {
  86. S* result = createValue(zJson);
  87. ItemType* zType = dynamic_cast<ItemType*>(result);
  88. zType->setModel(Game::INSTANCE->zTypeRegistry()->fromJson<ModelInfo>(
  89. zJson->zValue("model")->asObject()));
  90. zType->setName(zJson->zValue("name")->asString()->getString());
  91. if (zJson->hasValue("tooltipUIML"))
  92. {
  93. zType->setTooltipUIML(
  94. zJson->zValue("tooltipUIML")->asString()->getString());
  95. }
  96. zType->setMaxStackSize(
  97. (int)zJson->zValue("maxStack")->asNumber()->getNumber());
  98. for (Framework::JSON::JSONValue* value :
  99. *zJson->zValue("groupNames")->asArray())
  100. {
  101. zType->addGroup(value->asString()->getString());
  102. }
  103. return result;
  104. }
  105. virtual Framework::JSON::JSONObject* toJsonObject(S* zObject) const
  106. {
  107. Framework::JSON::JSONObject* zResult
  108. = new Framework::JSON::JSONObject();
  109. ItemType* zType = dynamic_cast<ItemType*>(zObject);
  110. zResult->addValue("model",
  111. Game::INSTANCE->zTypeRegistry()->toJson<ModelInfo>(
  112. zType->zModel()));
  113. zResult->addValue(
  114. "name", new Framework::JSON::JSONString(zType->getName()));
  115. Framework::XML::Element* tooltipUIML = zType->getTooltipUIML();
  116. zResult->addValue("tooltipUIML",
  117. new Framework::JSON::JSONString(tooltipUIML->toString()));
  118. tooltipUIML->release();
  119. zResult->addValue("maxStack",
  120. new Framework::JSON::JSONNumber(zType->getMaxStackSize()));
  121. Framework::JSON::JSONArray* groupNames
  122. = new Framework::JSON::JSONArray();
  123. for (Framework::Text* groupName : zType->getGroups())
  124. {
  125. groupNames->addValue(new Framework::JSON::JSONString(*groupName));
  126. }
  127. zResult->addValue("groupNames", groupNames);
  128. return zResult;
  129. }
  130. virtual JSONObjectValidationBuilder* addToValidator(
  131. JSONObjectValidationBuilder* builder) const override
  132. {
  133. return builder
  134. ->withRequiredAttribute("model",
  135. Game::INSTANCE->zTypeRegistry()->getValidator<ModelInfo>())
  136. ->withRequiredString("name")
  137. ->finishString()
  138. ->withOptionalString("tooltipUIML")
  139. ->finishString()
  140. ->withRequiredNumber("maxStack")
  141. ->withDefault(50)
  142. ->finishNumber()
  143. ->withRequiredArray("groupNames")
  144. ->withDefault(new Framework::JSON::JSONArray())
  145. ->addAcceptedStringInArray()
  146. ->finishString()
  147. ->finishArray();
  148. }
  149. protected:
  150. virtual S* createValue(Framework::JSON::JSONObject* zJson) const = 0;
  151. };