BonusSystem.cpp 5.7 KB

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