BonusSystem.cpp 5.6 KB

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