BonusSystem.cpp 5.5 KB

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