BonusSystem.cpp 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. /*
  2. * BonusSystem.cpp, part of VCMI engine
  3. *
  4. * Authors: listed in file AUTHORS in main folder
  5. *
  6. * License: GNU General Public License v2.0 or later
  7. * Full text of license available in license.txt file, in main folder
  8. *
  9. */
  10. #include "StdInc.h"
  11. #include "BonusSystem.h"
  12. #include "../../../lib/HeroBonus.h"
  13. #include "Registry.h"
  14. #include "../LuaStack.h"
  15. #include "../LuaCallWrapper.h"
  16. VCMI_LIB_NAMESPACE_BEGIN
  17. namespace scripting
  18. {
  19. namespace api
  20. {
  21. VCMI_REGISTER_SCRIPT_API(BonusProxy, "Bonus");
  22. const std::vector<BonusProxy::CustomRegType> BonusProxy::REGISTER_CUSTOM =
  23. {
  24. {"getType", &BonusProxy::getType, false},
  25. {"getSubtype", &BonusProxy::getSubtype, false},
  26. {"getDuration", &BonusProxy::getDuration, false},
  27. {"getTurns", &BonusProxy::getTurns, false},
  28. {"getValueType", &BonusProxy::getValueType, false},
  29. {"getVal", &BonusProxy::getVal, false},
  30. {"getSource", &BonusProxy::getSource, false},
  31. {"getSourceID", &BonusProxy::getSourceID, false},
  32. {"getEffectRange", &BonusProxy::getEffectRange, false},
  33. {"getStacking", &BonusProxy::getStacking, false},
  34. {"getDescription", &BonusProxy::getDescription, false},
  35. {"toJsonNode", &BonusProxy::toJsonNode, false}
  36. };
  37. int BonusProxy::getType(lua_State * L)
  38. {
  39. LuaStack S(L);
  40. std::shared_ptr<const Bonus> object;
  41. if(!S.tryGet(1, object))
  42. return S.retNil();
  43. return LuaStack::quickRetInt(L, object->type);
  44. }
  45. int BonusProxy::getSubtype(lua_State * L)
  46. {
  47. LuaStack S(L);
  48. std::shared_ptr<const Bonus> object;
  49. if(!S.tryGet(1, object))
  50. return S.retNil();
  51. return LuaStack::quickRetInt(L, object->subtype);
  52. }
  53. int BonusProxy::getDuration(lua_State * L)
  54. {
  55. LuaStack S(L);
  56. std::shared_ptr<const Bonus> object;
  57. if(!S.tryGet(1, object))
  58. return S.retNil();
  59. return LuaStack::quickRetInt(L, object->duration);
  60. }
  61. int BonusProxy::getTurns(lua_State * L)
  62. {
  63. LuaStack S(L);
  64. std::shared_ptr<const Bonus> object;
  65. if(!S.tryGet(1, object))
  66. return S.retNil();
  67. return LuaStack::quickRetInt(L, object->turnsRemain);
  68. }
  69. int BonusProxy::getValueType(lua_State * L)
  70. {
  71. LuaStack S(L);
  72. std::shared_ptr<const Bonus> object;
  73. if(!S.tryGet(1, object))
  74. return S.retNil();
  75. return LuaStack::quickRetInt(L, object->valType);
  76. }
  77. int BonusProxy::getVal(lua_State * L)
  78. {
  79. LuaStack S(L);
  80. std::shared_ptr<const Bonus> object;
  81. if(!S.tryGet(1, object))
  82. return S.retNil();
  83. return LuaStack::quickRetInt(L, object->val);
  84. }
  85. int BonusProxy::getSource(lua_State * L)
  86. {
  87. LuaStack S(L);
  88. std::shared_ptr<const Bonus> object;
  89. if(!S.tryGet(1, object))
  90. return S.retNil();
  91. return LuaStack::quickRetInt(L, object->source);
  92. }
  93. int BonusProxy::getSourceID(lua_State * L)
  94. {
  95. LuaStack S(L);
  96. std::shared_ptr<const Bonus> object;
  97. if(!S.tryGet(1, object))
  98. return S.retNil();
  99. return LuaStack::quickRetInt(L, object->sid);
  100. }
  101. int BonusProxy::getEffectRange(lua_State * L)
  102. {
  103. LuaStack S(L);
  104. std::shared_ptr<const Bonus> object;
  105. if(!S.tryGet(1, object))
  106. return S.retNil();
  107. return LuaStack::quickRetInt(L, object->effectRange);
  108. }
  109. int BonusProxy::getStacking(lua_State * L)
  110. {
  111. LuaStack S(L);
  112. std::shared_ptr<const Bonus> object;
  113. if(!S.tryGet(1, object))
  114. return S.retNil();
  115. return LuaStack::quickRetStr(L, object->stacking);
  116. }
  117. int BonusProxy::getDescription(lua_State * L)
  118. {
  119. LuaStack S(L);
  120. std::shared_ptr<const Bonus> object;
  121. if(!S.tryGet(1, object))
  122. return S.retNil();
  123. return LuaStack::quickRetStr(L, object->description);
  124. }
  125. int BonusProxy::toJsonNode(lua_State * L)
  126. {
  127. LuaStack S(L);
  128. std::shared_ptr<const Bonus> object;
  129. if(!S.tryGet(1, object))
  130. return S.retNil();
  131. S.clear();
  132. S.push(object->toJsonNode());
  133. return 1;
  134. }
  135. template <typename T>
  136. static void publishMap(lua_State * L, const T & map)
  137. {
  138. for(auto & p : map)
  139. {
  140. const std::string & name = p.first;
  141. int32_t id = static_cast<int32_t>(p.second);
  142. lua_pushstring(L, name.c_str());
  143. lua_pushinteger(L, id);
  144. lua_rawset(L, -3);
  145. }
  146. }
  147. void BonusProxy::adjustStaticTable(lua_State * L) const
  148. {
  149. publishMap(L, bonusNameMap);
  150. publishMap(L, bonusValueMap);
  151. publishMap(L, bonusSourceMap);
  152. publishMap(L, bonusDurationMap);
  153. }
  154. VCMI_REGISTER_SCRIPT_API(BonusListProxy, "BonusList");
  155. const std::vector<BonusListProxy::CustomRegType> BonusListProxy::REGISTER_CUSTOM =
  156. {
  157. };
  158. std::shared_ptr<const Bonus> BonusListProxy::index(std::shared_ptr<const BonusList> self, int key)
  159. {
  160. //field = __index(self, key)
  161. std::shared_ptr<const Bonus> ret;
  162. if((key >= 1) && (key <= self->size()))
  163. ret = (*self)[key-1];
  164. return ret;
  165. }
  166. void BonusListProxy::adjustMetatable(lua_State * L) const
  167. {
  168. lua_pushstring(L, "__index");
  169. lua_pushcclosure(L, LuaFunctionWrapper<decltype(&BonusListProxy::index), &BonusListProxy::index>::invoke, 0);
  170. lua_rawset(L, -3);
  171. }
  172. VCMI_REGISTER_SCRIPT_API(BonusBearerProxy, "BonusBearer");
  173. const std::vector<BonusBearerProxy::CustomRegType> BonusBearerProxy::REGISTER_CUSTOM =
  174. {
  175. {"getBonuses", &BonusBearerProxy::getBonuses, false},
  176. };
  177. int BonusBearerProxy::getBonuses(lua_State * L)
  178. {
  179. LuaStack S(L);
  180. const IBonusBearer * object = nullptr;
  181. if(!S.tryGet(1, object))
  182. return S.retNil();
  183. TConstBonusListPtr ret;
  184. const bool hasSelector = S.isFunction(2);
  185. const bool hasRangeSelector = S.isFunction(3);
  186. if(hasSelector)
  187. {
  188. auto selector = [](const Bonus * b)
  189. {
  190. return false; //TODO: BonusBearerProxy::getBonuses selector
  191. };
  192. if(hasRangeSelector)
  193. {
  194. auto rangeSelector = [](const Bonus * b)
  195. {
  196. return false;//TODO: BonusBearerProxy::getBonuses rangeSelector
  197. };
  198. ret = object->getBonuses(selector, rangeSelector);
  199. }
  200. else
  201. {
  202. ret = object->getBonuses(selector, Selector::all);
  203. }
  204. }
  205. else
  206. {
  207. ret = object->getBonuses(Selector::all, Selector::all);
  208. }
  209. S.clear();
  210. S.push(ret);
  211. return S.retPushed();
  212. }
  213. }
  214. }
  215. VCMI_LIB_NAMESPACE_END