HeroTenZhiHuan.lua 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. -- 十星英雄置换 神将置换
  2. -- 拒绝潜规则
  3. local HeroExcel = require("excel.hero")
  4. local UpNeedExcel = require("excel.upNeed")
  5. local Lang = require("common.Lang")
  6. local Util = require("common.Util")
  7. local Msg = require("core.Msg")
  8. local ObjHuman = require("core.ObjHuman")
  9. local Grid = require("bag.Grid")
  10. local BagLogic = require("bag.BagLogic")
  11. local ItemDefine = require("bag.ItemDefine")
  12. local Broadcast = require("broadcast.Broadcast")
  13. local HeroLogic = require("hero.HeroLogic")
  14. local HeroGrid = require("hero.HeroGrid")
  15. local HeroEquip = require("hero.HeroEquip")
  16. local HeroDefine = require("hero.HeroDefine")
  17. local FenjieLogic = require("hecheng.FenjieLogic")
  18. local FuwenLogic = require("fuwen.FuwenLogic")
  19. MATERIAL1_NEED_STAR = 10 -- 材料1,需要10星以上的英雄
  20. MATERIAL2_NEED_STAR = 5 -- 材料2,需要5星的英雄
  21. local MAX_LEN = 100
  22. -- 可否作为材料1
  23. -- 得大于10星
  24. function canBeMaterial1(heroID, star)
  25. if not heroID or not star then return end
  26. local heroConfig = HeroExcel.hero[heroID]
  27. if not heroConfig then return end
  28. if star < MATERIAL1_NEED_STAR then
  29. return
  30. end
  31. local attrConfig = HeroDefine.getAttrConfig(heroID, star)
  32. return attrConfig
  33. end
  34. -- 可否作为材料2
  35. function canBeMaterial2(heroID)
  36. if not heroID then return end
  37. local heroConfig = HeroExcel.hero[heroID]
  38. if not heroConfig then return end
  39. if heroConfig.star ~= MATERIAL2_NEED_STAR then
  40. return
  41. end
  42. -- 能否找到10-13星的目标英雄
  43. for starI = MATERIAL1_NEED_STAR, HeroLogic.HERO_MAX_STAR do
  44. local attrConfig = HeroDefine.getAttrConfig(heroID, starI)
  45. if not attrConfig then
  46. return
  47. end
  48. end
  49. return heroConfig
  50. end
  51. -- 发送魂匣信息给前端
  52. function query(human)
  53. local material2List = {}
  54. for index,heroGrid in pairs(human.db.heroBag) do
  55. if index ~= 0 and canBeMaterial2(heroGrid.id) then
  56. material2List[heroGrid.id] = true
  57. end
  58. end
  59. local msgRet = Msg.gc.GC_HERO_TEN_ZHIHUAN_QUERY
  60. Grid.makeItem(msgRet.needItem, ItemDefine.ITEM_MONTHACT_TENSTAR_ID, 1)
  61. msgRet.canHeroId[0] = 0
  62. for heroID in pairs(material2List) do
  63. if msgRet.canHeroId[0] >= MAX_LEN then
  64. break
  65. end
  66. msgRet.canHeroId[0] = msgRet.canHeroId[0] + 1
  67. msgRet.canHeroId[msgRet.canHeroId[0]] = heroID
  68. end
  69. msgRet.material1Star = MATERIAL1_NEED_STAR
  70. msgRet.material2Star = MATERIAL2_NEED_STAR
  71. msgRet.needMaterial2Cnts[0] = 0
  72. msgRet.needItemCnts[0] = 0
  73. for i = MATERIAL1_NEED_STAR, HeroLogic.HERO_MAX_STAR do
  74. local config = UpNeedExcel.zhihuan[i]
  75. -- 消耗5星英雄数量
  76. msgRet.needMaterial2Cnts[0] = msgRet.needMaterial2Cnts[0] + 1
  77. msgRet.needMaterial2Cnts[msgRet.needMaterial2Cnts[0]] = config and config.needHeroCnt or 0
  78. -- 消耗道具数量
  79. msgRet.needItemCnts[0] = msgRet.needItemCnts[0] + 1
  80. msgRet.needItemCnts[msgRet.needItemCnts[0]] = config and config.useItem[2] or 0
  81. end
  82. --Msg.trace(msgRet)
  83. Msg.send(msgRet, human.fd)
  84. end
  85. function zhihuan(human, material2ID, heroIndexList)
  86. local heroConfig = canBeMaterial2(material2ID)
  87. if not heroConfig then
  88. return Broadcast.sendErr(human, Lang.TENSTAR_ERR_NOTENSTAR)
  89. end
  90. local materialList = {}
  91. local material2Cnt = 0
  92. local material1Star = 0
  93. for i = 1, heroIndexList[0] do
  94. local heroIndex = heroIndexList[i]
  95. local heroID = HeroLogic.getHeroIdByIndex(human, heroIndex)
  96. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  97. if not heroID or not heroGrid or materialList[heroIndex] then -- 不存在或重复材料不允许!
  98. return Broadcast.sendErr(human, Lang.TENSTAR_ERR_MATERIAL)
  99. end
  100. materialList[heroIndex] = true
  101. if heroID == material2ID then
  102. material2Cnt = material2Cnt + 1
  103. else
  104. local material1Config = canBeMaterial1(heroID, heroGrid.star)
  105. if not material1Config then
  106. return Broadcast.sendErr(human, Lang.TENSTAR_ERR_MATERIAL)
  107. end
  108. local materialHeroConfig = HeroExcel.hero[material1Config.heroID]
  109. if materialHeroConfig.camp ~= materialHeroConfig.camp then
  110. return Broadcast.sendErr(human, Lang.TENSTAR_ERR_CAMP)
  111. end
  112. material1Star = math.max(material1Star, material1Config.star)
  113. end
  114. end
  115. local config = UpNeedExcel.zhihuan[material1Star]
  116. if not config then
  117. return Broadcast.sendErr(human, Lang.TENSTAR_ERR_SIZE)
  118. end
  119. -- 物品检查
  120. local useItemID = config.useItem[1]
  121. local useItemCnt = config.useItem[2]
  122. if BagLogic.getItemCnt(human, useItemID) < useItemCnt then
  123. local itemName = ItemDefine.getValue(useItemID, "name")
  124. return Broadcast.sendErr(human, Util.format(Lang.COMMON_NO_ITEM, itemName))
  125. end
  126. local needMaterial2Cnt = config.needHeroCnt
  127. if material2Cnt ~= needMaterial2Cnt then
  128. return Broadcast.sendErr(human, Lang.TENSTAR_ERR_SIZE)
  129. end
  130. local attrConfig = HeroDefine.getAttrConfig(material2ID, material1Star)
  131. if not attrConfig then return end
  132. -- 扣物品
  133. BagLogic.delItem(human, useItemID, useItemCnt, "tenStar_displace")
  134. local fuwenTb = nil
  135. local equipTb = nil
  136. local newHeroGrid = nil
  137. local outItems = {}
  138. for heroIndex in pairs(materialList) do
  139. local heroID = HeroLogic.getHeroIdByIndex(human, heroIndex)
  140. if heroID == material2ID then
  141. HeroEquip.putOffQuick(human, heroID, heroIndex, true)
  142. FuwenLogic.putOffQuick(human, heroID, heroIndex, true)
  143. local inputIDList = {[0]=1, [1]=heroID}
  144. local inputIndexList = {[0]=1, [1]=heroIndex}
  145. outItems[#outItems + 1] = FenjieLogic.fenjie(human, FenjieLogic.FENJIE_DO_TENSTAR, inputIDList, inputIndexList, nil, "tenStar_displace")
  146. else
  147. equipTb,fuwenTb = HeroEquip.getEquipAndFuwenByHeroIndex(human,heroID,heroIndex)
  148. newHeroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  149. HeroLogic.delHeroByIndex(human, heroIndex, "tenStar_displace")
  150. end
  151. end
  152. BagLogic.sendItemGetList3(human, outItems, "tenStar_displace")
  153. newHeroGrid.id = attrConfig.heroID
  154. local newIndex = HeroLogic.addHeroByGrid(human, newHeroGrid, "tenStar_displace")
  155. if equipTb ~= nil then
  156. for i = 1,ItemDefine.EQUIP_MAX_CNT do
  157. if i ~= ItemDefine.EQUIP_SUBTYPE_SHUIJIN and equipTb[i] ~= nil then
  158. HeroEquip.putOn(human, attrConfig.heroID, newIndex, equipTb[i])
  159. end
  160. end
  161. end
  162. if fuwenTb ~= nil then
  163. for i = 1,2 do
  164. if fuwenTb[i] ~= nil then
  165. FuwenLogic.putOn(human, attrConfig.heroID, newIndex, fuwenTb[i],i)
  166. end
  167. end
  168. end
  169. -- 发送给前端用来显示获得的英雄
  170. local msgRet = Msg.gc.GC_HERO_TEN_ZHIHUAN
  171. HeroGrid.makeHeroSimple(msgRet.heroSimple, newHeroGrid, newIndex, human)
  172. Msg.send(msgRet, human.fd)
  173. end