ItemType.cpp 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. #include "ItemType.h"
  2. #include <InMemoryBuffer.h>
  3. #include <Logging.h>
  4. #include "Game.h"
  5. #include "ItemSkill.h"
  6. #include "ItemStack.h"
  7. #include "UIMLBuilder.h"
  8. ItemType::ItemType()
  9. : ReferenceCounter(),
  10. name(""),
  11. tooltipUIML(0),
  12. model(0),
  13. maxStackSize(0),
  14. groups()
  15. {}
  16. ItemType::~ItemType()
  17. {
  18. if (model) model->release();
  19. if (tooltipUIML) tooltipUIML->release();
  20. }
  21. void ItemType::loadSuperItem(
  22. Item* zItem, Framework::StreamReader* zReader) const
  23. {
  24. zReader->lese((char*)&zItem->hp, 4);
  25. zReader->lese((char*)&zItem->maxHp, 4);
  26. zReader->lese((char*)&zItem->durability, 4);
  27. zReader->lese((char*)&zItem->maxDurability, 4);
  28. unsigned char flags = 0;
  29. zReader->lese((char*)&flags, 1);
  30. zItem->eatable = (flags | 1) == flags;
  31. zItem->placeable = (flags | 2) == flags;
  32. zItem->equippable = (flags | 4) == flags;
  33. zItem->solid = (flags | 8) == flags;
  34. zItem->usable = (flags | 16) == flags;
  35. unsigned char len = 0;
  36. zReader->lese((char*)&len, 1);
  37. zItem->name.fillText(' ', len);
  38. zReader->lese((char*)zItem->name.getText(), len);
  39. }
  40. void ItemType::saveSuperItem(
  41. const Item* zItem, Framework::StreamWriter* zWriter) const
  42. {
  43. zWriter->schreibe((char*)&zItem->hp, 4);
  44. zWriter->schreibe((char*)&zItem->maxHp, 4);
  45. zWriter->schreibe((char*)&zItem->durability, 4);
  46. zWriter->schreibe((char*)&zItem->maxDurability, 4);
  47. unsigned char flags
  48. = (unsigned char)((zItem->usable << 4) | (zItem->solid << 3)
  49. | (zItem->equippable << 2) | (zItem->placeable << 1)
  50. | (int)zItem->eatable);
  51. zWriter->schreibe((char*)&flags, 1);
  52. unsigned char len = (unsigned char)zItem->name.getLength();
  53. zWriter->schreibe((char*)&len, 1);
  54. zWriter->schreibe(zItem->name, len);
  55. }
  56. bool ItemType::initialize(Game* zGame)
  57. {
  58. return true;
  59. }
  60. const ItemType* ItemType::zBrokenItemType() const
  61. {
  62. return 0;
  63. }
  64. ItemStack* ItemType::createItemStack(int size) const
  65. {
  66. Item* item = createItem();
  67. if (!item) return 0;
  68. return new ItemStack(item, MIN(size, item->getMaxStackSize()));
  69. }
  70. ItemSkill* ItemType::createDefaultItemSkill() const
  71. {
  72. return 0;
  73. }
  74. void ItemType::levelUpItemSkill(ItemSkill* zSkill) const {}
  75. Item* ItemType::cloneItem(const Item* zItem) const
  76. {
  77. Framework::InMemoryBuffer buffer;
  78. saveItem(zItem, &buffer);
  79. return loadItem(&buffer);
  80. }
  81. Item* ItemType::breakItem(const Item* zItem) const
  82. {
  83. return 0;
  84. }
  85. Item* ItemType::loadItem(Framework::StreamReader* zReader) const
  86. {
  87. Item* item = createItem();
  88. loadSuperItem(item, zReader);
  89. return item;
  90. }
  91. void ItemType::saveItem(
  92. const Item* zItem, Framework::StreamWriter* zWriter) const
  93. {
  94. saveSuperItem(zItem, zWriter);
  95. }
  96. void ItemType::setItemAttribute(
  97. Item* zItem, Framework::Text name, Framework::JSON::JSONValue* zValue) const
  98. {
  99. bool ok = true;
  100. if (zValue->getType() == Framework::AbstractType::NUMBER)
  101. {
  102. if (name.istGleich("hp"))
  103. zItem->hp = (float)zValue->asNumber()->getNumber();
  104. else if (name.istGleich("maxHp"))
  105. zItem->maxHp = (float)zValue->asNumber()->getNumber();
  106. else if (name.istGleich("durability"))
  107. zItem->durability = (float)zValue->asNumber()->getNumber();
  108. else if (name.istGleich("maxDurability"))
  109. zItem->maxDurability = (float)zValue->asNumber()->getNumber();
  110. else
  111. ok = false;
  112. }
  113. else if (zValue->getType() == Framework::AbstractType::STRING)
  114. {
  115. if (name.istGleich("name"))
  116. zItem->name = zValue->asString()->getString();
  117. else
  118. ok = false;
  119. }
  120. if (!ok)
  121. {
  122. Framework::Logging::warning()
  123. << "Invalid Item Attribute '" << name << "' for item type '"
  124. << getName() << "'\n";
  125. }
  126. }
  127. void ItemType::addItemAttributes(
  128. Item* zItem, Framework::JSON::JSONObject* zItemObjet) const
  129. {
  130. zItemObjet->addValue(
  131. "hp", new Framework::JSON::JSONNumber((double)zItem->hp));
  132. zItemObjet->addValue(
  133. "maxHp", new Framework::JSON::JSONNumber((double)zItem->maxHp));
  134. zItemObjet->addValue("durability",
  135. new Framework::JSON::JSONNumber((double)zItem->durability));
  136. zItemObjet->addValue("maxDurability",
  137. new Framework::JSON::JSONNumber((double)zItem->maxDurability));
  138. zItemObjet->addValue("name", new Framework::JSON::JSONString(zItem->name));
  139. }
  140. void ItemType::setTypeId(int id)
  141. {
  142. this->id = id;
  143. }
  144. int ItemType::getId() const
  145. {
  146. return id;
  147. }
  148. void ItemType::setName(Framework::Text name)
  149. {
  150. this->name = name;
  151. if (!tooltipUIML)
  152. {
  153. tooltipUIML
  154. = UIMLBuilder::createTooltip()
  155. ->addElement(UIMLBuilder::createTextAuto(name)->build())
  156. ->build();
  157. }
  158. }
  159. const Framework::Text& ItemType::getName() const
  160. {
  161. return name;
  162. }
  163. void ItemType::setTooltipUIML(Framework::Text tooltipUIML)
  164. {
  165. if (this->tooltipUIML)
  166. {
  167. this->tooltipUIML->release();
  168. }
  169. this->tooltipUIML = new Framework::XML::Element(tooltipUIML);
  170. }
  171. Framework::XML::Element* ItemType::getTooltipUIML() const
  172. {
  173. return dynamic_cast<Framework::XML::Element*>(tooltipUIML->getThis());
  174. }
  175. void ItemType::setModel(ModelInfo* model)
  176. {
  177. if (this->model) this->model->release();
  178. this->model = model;
  179. }
  180. ModelInfo* ItemType::zModel() const
  181. {
  182. return model;
  183. }
  184. void ItemType::setMaxStackSize(int maxStackSize)
  185. {
  186. this->maxStackSize = maxStackSize;
  187. }
  188. int ItemType::getMaxStackSize() const
  189. {
  190. return maxStackSize;
  191. }
  192. void ItemType::addGroup(Framework::Text group)
  193. {
  194. groups.add(new Framework::Text(group));
  195. }
  196. const Framework::RCArray<Framework::Text>& ItemType::getGroups() const
  197. {
  198. return groups;
  199. }
  200. Item* ItemType::createBasicItem(int id,
  201. const char* name,
  202. float hp,
  203. float maxHp,
  204. float durability,
  205. float maxDurability,
  206. bool eatable,
  207. bool placeable,
  208. bool equippable,
  209. bool solid,
  210. bool usable)
  211. {
  212. Item* item = new Item(id, name);
  213. item->hp = hp;
  214. item->maxHp = maxHp;
  215. item->durability = durability;
  216. item->maxDurability = maxDurability;
  217. item->eatable = eatable;
  218. item->placeable = placeable;
  219. item->equippable = equippable;
  220. item->solid = solid;
  221. item->usable = usable;
  222. return item;
  223. }
  224. int ItemType::getTypeId(const char* name)
  225. {
  226. for (int i = 0; i < Game::INSTANCE->getItemTypeCount(); i++)
  227. {
  228. if (Game::INSTANCE->zItemType(i)
  229. && Game::INSTANCE->zItemType(i)->getName().istGleich(name))
  230. return Game::INSTANCE->zItemType(i)->getId();
  231. }
  232. return 0;
  233. }
  234. const ItemType* ItemType::zByName(const char* name)
  235. {
  236. for (int i = 0; i < Game::INSTANCE->getItemTypeCount(); i++)
  237. {
  238. if (Game::INSTANCE->zItemType(i)
  239. && Game::INSTANCE->zItemType(i)->getName().istGleich(name))
  240. return Game::INSTANCE->zItemType(i);
  241. }
  242. return 0;
  243. }