BattleWillLogic.lua 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. ------------------------------------------------------
  2. -- 战意逻辑
  3. ------------------------------------------------------
  4. local Lang = require("common.Lang")
  5. local Util = require("common.Util")
  6. local Msg = require("core.Msg")
  7. local ObjHuman = require("core.ObjHuman")
  8. local Broadcast = require("broadcast.Broadcast")
  9. local Grid = require("bag.Grid")
  10. local BagLogic = require("bag.BagLogic")
  11. local ItemDefine = require("bag.ItemDefine")
  12. local HeroLogic = require("hero.HeroLogic")
  13. local Log = require("common.Log")
  14. -- 战意回退配置
  15. local BATTLE_WILL_ROLLBACK_CONFIG = {
  16. [1] = { -- 初级
  17. needItemID = 1050, -- 消耗道具ID
  18. needItemCnt = 1, -- 消耗数量:1个
  19. returnBattleWillID = 0, -- 返还战意道具ID(需要确认实际ID)
  20. returnBattleWillCnt = 1, -- 返还战意:1个
  21. returnFragmentID = 0, -- 返还战意碎片道具ID(需要确认实际ID)
  22. returnFragmentCnt = 0, -- 返还战意碎片:0
  23. returnAncientSpiritID = 0, -- 返还远古之灵道具ID(需要确认实际ID)
  24. returnAncientSpiritCnt = 0 -- 返还远古之灵:0
  25. },
  26. [2] = { -- 中级
  27. needItemID = 1050,
  28. needItemCnt = 5, -- 消耗数量:5个
  29. returnBattleWillID = 0,
  30. returnBattleWillCnt = 4, -- 返还战意:4个
  31. returnFragmentID = 0,
  32. returnFragmentCnt = 10000, -- 返还战意碎片:10,000
  33. returnAncientSpiritID = 0,
  34. returnAncientSpiritCnt = 0
  35. },
  36. [3] = { -- 高级
  37. needItemID = 1050,
  38. needItemCnt = 12, -- 消耗数量:12个
  39. returnBattleWillID = 0,
  40. returnBattleWillCnt = 9, -- 返还战意:9个
  41. returnFragmentID = 0,
  42. returnFragmentCnt = 40000, -- 返还战意碎片:40,000
  43. returnAncientSpiritID = 0,
  44. returnAncientSpiritCnt = 0
  45. },
  46. [4] = { -- 超级
  47. needItemID = 1050,
  48. needItemCnt = 50, -- 消耗数量:50个
  49. returnBattleWillID = 0,
  50. returnBattleWillCnt = 19, -- 返还战意:19个
  51. returnFragmentID = 0,
  52. returnFragmentCnt = 90000, -- 返还战意碎片:90,000
  53. returnAncientSpiritID = 0,
  54. returnAncientSpiritCnt = 100 -- 返还远古之灵:100
  55. }
  56. }
  57. -- 获取战意格子数据
  58. -- 假设战意数据存储在 heroGrid.battleWill[index] 中,包含 level 字段
  59. function getBattleWillGrid(heroGrid, index)
  60. if not heroGrid then return end
  61. if not heroGrid.battleWill then return end
  62. return index and heroGrid.battleWill[index]
  63. end
  64. -- 获取战意等级
  65. function getBattleWillLevel(heroGrid, index)
  66. local grid = getBattleWillGrid(heroGrid, index)
  67. if not grid then return 0 end
  68. return grid.level or 0
  69. end
  70. -- 查询回退信息
  71. function sendRollbackQuery(human, heroID, heroIndex, index)
  72. Log.write(Log.LOGID_DEBUG, "[sendRollbackQuery] 收到查询请求: heroID="..(heroID or "nil")..", heroIndex="..(heroIndex or "nil")..", index="..(index or "nil"))
  73. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  74. if not heroGrid then
  75. Log.write(Log.LOGID_DEBUG, "[sendRollbackQuery] 英雄不存在")
  76. return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
  77. end
  78. local currentLevel = getBattleWillLevel(heroGrid, index)
  79. Log.write(Log.LOGID_DEBUG, "[sendRollbackQuery] 当前战意等级: "..currentLevel)
  80. -- 检查等级是否可回退(等级0为空,不可回退)
  81. if currentLevel == 0 or currentLevel < 1 or currentLevel > 4 then
  82. Log.write(Log.LOGID_DEBUG, "[sendRollbackQuery] 当前等级不可回退: level="..currentLevel)
  83. return Broadcast.sendErr(human, "当前战意格子为空,无法回退")
  84. end
  85. local config = BATTLE_WILL_ROLLBACK_CONFIG[currentLevel]
  86. if not config then
  87. Log.write(Log.LOGID_DEBUG, "[sendRollbackQuery] 配置不存在: level="..currentLevel)
  88. return Broadcast.sendErr(human, Lang.COMMON_COMFIG_ERROR)
  89. end
  90. local msgRet = Msg.gc.GC_BATTLE_WILL_ROLLBACK_QUERY
  91. msgRet.heroID = heroID
  92. msgRet.heroIndex = heroIndex
  93. msgRet.index = index
  94. msgRet.currentLevel = currentLevel
  95. msgRet.targetLevel = 0 -- 回退后等级固定为0(空)
  96. -- 消耗道具
  97. Grid.makeItem(msgRet.needItem, config.needItemID, config.needItemCnt)
  98. -- 返还物品列表
  99. msgRet.returnItems[0] = 0
  100. local itemCnt = 0
  101. -- 返还战意
  102. if config.returnBattleWillCnt > 0 and config.returnBattleWillID > 0 then
  103. itemCnt = itemCnt + 1
  104. if itemCnt <= #msgRet.returnItems then
  105. Grid.makeItem(msgRet.returnItems[itemCnt], config.returnBattleWillID, config.returnBattleWillCnt)
  106. end
  107. end
  108. -- 返还战意碎片
  109. if config.returnFragmentCnt > 0 and config.returnFragmentID > 0 then
  110. itemCnt = itemCnt + 1
  111. if itemCnt <= #msgRet.returnItems then
  112. Grid.makeItem(msgRet.returnItems[itemCnt], config.returnFragmentID, config.returnFragmentCnt)
  113. end
  114. end
  115. -- 返还远古之灵
  116. if config.returnAncientSpiritCnt > 0 and config.returnAncientSpiritID > 0 then
  117. itemCnt = itemCnt + 1
  118. if itemCnt <= #msgRet.returnItems then
  119. Grid.makeItem(msgRet.returnItems[itemCnt], config.returnAncientSpiritID, config.returnAncientSpiritCnt)
  120. end
  121. end
  122. msgRet.returnItems[0] = itemCnt
  123. Log.write(Log.LOGID_DEBUG, "[sendRollbackQuery] 发送查询结果: currentLevel="..currentLevel..", needItemCnt="..config.needItemCnt..", returnItemsCount="..itemCnt)
  124. Msg.send(msgRet, human.fd)
  125. end
  126. -- 执行回退
  127. function rollback(human, heroID, heroIndex, index)
  128. Log.write(Log.LOGID_DEBUG, "[rollback] 收到回退请求: heroID="..(heroID or "nil")..", heroIndex="..(heroIndex or "nil")..", index="..(index or "nil"))
  129. local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
  130. if not heroGrid then
  131. Log.write(Log.LOGID_DEBUG, "[rollback] 英雄不存在")
  132. return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
  133. end
  134. local currentLevel = getBattleWillLevel(heroGrid, index)
  135. Log.write(Log.LOGID_DEBUG, "[rollback] 当前战意等级: "..currentLevel)
  136. -- 检查等级是否可回退
  137. if currentLevel == 0 or currentLevel < 1 or currentLevel > 4 then
  138. Log.write(Log.LOGID_DEBUG, "[rollback] 当前等级不可回退: level="..currentLevel)
  139. return Broadcast.sendErr(human, "当前战意格子为空,无法回退")
  140. end
  141. local config = BATTLE_WILL_ROLLBACK_CONFIG[currentLevel]
  142. if not config then
  143. Log.write(Log.LOGID_DEBUG, "[rollback] 配置不存在: level="..currentLevel)
  144. return Broadcast.sendErr(human, Lang.COMMON_COMFIG_ERROR)
  145. end
  146. -- 检查消耗道具
  147. if not BagLogic.checkItemCnt(human, config.needItemID, config.needItemCnt) then
  148. Log.write(Log.LOGID_DEBUG, "[rollback] 消耗道具不足: needItemID="..config.needItemID..", needItemCnt="..config.needItemCnt)
  149. return Broadcast.sendErr(human, Lang.COMMON_NO_ITEM)
  150. end
  151. -- 扣除消耗道具
  152. BagLogic.delItem(human, config.needItemID, config.needItemCnt, "battleWill_rollback")
  153. Log.write(Log.LOGID_DEBUG, "[rollback] 扣除消耗道具: needItemID="..config.needItemID..", needItemCnt="..config.needItemCnt)
  154. -- 收集返还物品
  155. local returnItemList = {}
  156. -- 返还战意
  157. if config.returnBattleWillCnt > 0 and config.returnBattleWillID > 0 then
  158. returnItemList[config.returnBattleWillID] = config.returnBattleWillCnt
  159. end
  160. -- 返还战意碎片
  161. if config.returnFragmentCnt > 0 and config.returnFragmentID > 0 then
  162. returnItemList[config.returnFragmentID] = config.returnFragmentCnt
  163. end
  164. -- 返还远古之灵
  165. if config.returnAncientSpiritCnt > 0 and config.returnAncientSpiritID > 0 then
  166. returnItemList[config.returnAncientSpiritID] = config.returnAncientSpiritCnt
  167. end
  168. -- 发放返还物品(使用通用道具发放逻辑)
  169. if next(returnItemList) then
  170. BagLogic.addItemList(human, returnItemList, "battleWill_rollback")
  171. Log.write(Log.LOGID_DEBUG, "[rollback] 发放返还物品")
  172. end
  173. -- 更新战意等级为0(清空)
  174. if not heroGrid.battleWill then
  175. heroGrid.battleWill = {}
  176. end
  177. if not heroGrid.battleWill[index] then
  178. heroGrid.battleWill[index] = {}
  179. end
  180. heroGrid.battleWill[index].level = 0
  181. Log.write(Log.LOGID_DEBUG, "[rollback] 回退完成: 等级从 "..currentLevel.." 变为 0")
  182. -- 重新计算英雄属性
  183. ObjHuman.doCalcHero(human, heroIndex)
  184. -- 发送英雄数据更新(如果需要)
  185. HeroLogic.sendHeroBagDynamic(human, heroID, heroIndex)
  186. end