WarOrder.lua 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. local OrderExcel = require("excel.warOrder")
  2. local Grid = require("bag.Grid")
  3. local ItemDefine = require("bag.ItemDefine")
  4. local BagLogic = require("bag.BagLogic")
  5. ------------------------------------------------------
  6. -- 战令对应数据
  7. ------------------------------------------------------
  8. local battleOrder = 1
  9. local devilOrder = 2
  10. local clanOrder = 3
  11. local arenaOrder = 4
  12. local passBattleExp = 5
  13. local passDevilExp = 5
  14. local passClanBattleExp = 10
  15. local victoryArenaBattleExp = 2
  16. local orderExpMap = {
  17. [battleOrder] = passBattleExp,
  18. [devilOrder] = passDevilExp,
  19. [clanOrder] = passClanBattleExp,
  20. [arenaOrder] = victoryArenaBattleExp,
  21. }
  22. local orderNameMap = {
  23. [battleOrder] = "battleOrder",
  24. [devilOrder] = "devilOrder",
  25. [clanOrder] = "clanOrder",
  26. [arenaOrder] = "arenaOrder",
  27. }
  28. local GC_WARORDER_CHANGE = 13
  29. local isRed = {}
  30. ------------------------------------------------------
  31. -- local 函数
  32. ------------------------------------------------------
  33. --[[
  34. warOrder = {
  35. [battleOrder] = {
  36. unlock = number
  37. exp = number
  38. finish = {
  39. [lv] = number
  40. }
  41. upgradeFinish = {}
  42. }
  43. }
  44. ]]
  45. local function checkRewardByIdx(human,orderType,idx)
  46. local orderName = orderNameMap[orderType]
  47. local orderData = human.db.warOrder[orderName]
  48. local isUpgradeOk
  49. if orderData.unlock ~= 0 and not orderData.upgradeFinish[idx] then
  50. isUpgradeOk = true
  51. end
  52. return not orderData.finish[idx] , isUpgradeOk
  53. end
  54. local function checkRed(human,orderType)
  55. if isRed[orderType] then
  56. return true
  57. end
  58. local orderName = orderNameMap[orderType]
  59. local cfg = OrderExcel[orderName]
  60. local orderData = human.db.warOrder[orderName]
  61. local exp = orderData.exp
  62. local maxFinishIdx = 0
  63. for _,lv in ipairs(orderData.finish) do
  64. if maxFinishIdx <= lv then
  65. maxFinishIdx = lv
  66. end
  67. end
  68. local maxExpIdx = 0
  69. for _,cfg in pairs(cfg) do
  70. if cfg.process <= exp and maxExpIdx <= cfg.idx then
  71. maxExpIdx = cfg.idx
  72. end
  73. end
  74. isRed[orderType] = maxFinishIdx < maxExpIdx
  75. return (isRed[orderType] == true) and 1 or 0
  76. end
  77. local function getWarOrderByType(human,orderType)
  78. local orderName = orderNameMap[orderType]
  79. local orderData = human.db.warOrder[orderName]
  80. local finish = {}
  81. for lv in pairs(orderData.finish) do
  82. finish[#finish+1] = lv
  83. end
  84. local upgradeFinish = {}
  85. for lv in pairs(orderData.upgradeFinish) do
  86. finish[#finish+1] = lv
  87. end
  88. return {
  89. type = orderType,
  90. exp = orderData.exp,
  91. isRed = checkRed(human,orderType),
  92. unlock = orderData.unlock,
  93. finish = finish,
  94. upgradeFinish = upgradeFinish,
  95. }
  96. end
  97. ------------------------------------------------------
  98. -- 对外暴露接口
  99. ------------------------------------------------------
  100. function warOrderInfo(human,orderType)
  101. local orderName = orderNameMap[orderType]
  102. local cfg = OrderExcel[orderName]
  103. local langCfg = OrderExcel.desc
  104. local orderData = human.db.warOrder[orderName]
  105. if not cfg or not orderData then
  106. return
  107. end
  108. -- 获取配置表相关数据, 发送给客户端
  109. local normal = {}
  110. local upgrade = {}
  111. for _,v in pairs(cfg) do
  112. local cfgData = {
  113. idx = v.idx,
  114. process = v.process,
  115. }
  116. local content = {}
  117. local upgradeContent = {}
  118. if #v.content ~= 0 then
  119. for _,item in ipairs(v.content) do
  120. local data = {
  121. getway = {},
  122. suipian = {},
  123. equip = {},
  124. fuwen = {},
  125. }
  126. if not ItemDefine.isEquip(item[1]) then
  127. Grid.makeItem(data, item[1], item[2])
  128. end
  129. content[#content + 1] = data
  130. end
  131. end
  132. if #v.upgradeContent ~= 0 then
  133. for _,item in ipairs(v.upgradeContent) do
  134. local data = {
  135. getway = {},
  136. suipian = {},
  137. equip = {},
  138. fuwen = {},
  139. }
  140. if not ItemDefine.isEquip(item[1]) then
  141. Grid.makeItem(data, item[1], item[2])
  142. end
  143. upgradeContent[#upgradeContent + 1] = data
  144. end
  145. end
  146. cfgData.content = content
  147. cfgData.upgradeContent = upgradeContent
  148. normal[#normal+1] = cfgData
  149. end
  150. local language = ""
  151. for _,v in pairs(langCfg) do
  152. if v.type == orderType then
  153. language = v.desc
  154. break
  155. end
  156. end
  157. -------------------
  158. local finish = {}
  159. for lv in pairs(orderData.finish) do
  160. finish[#finish+1] = lv
  161. end
  162. local upgradeFinish = {}
  163. for lv in pairs(orderData.upgradeFinish) do
  164. finish[#finish+1] = lv
  165. end
  166. return {
  167. orderType = orderType,
  168. normal = normal,
  169. language = language,
  170. upgrade = upgrade,
  171. -- 自身的进度问题
  172. exp = orderData.exp,
  173. unlock = orderData.unlock,
  174. finish = finish,
  175. upgradeFinish = upgradeFinish,
  176. }
  177. end
  178. function warOrderReward(human,orderType)
  179. local orderName = orderNameMap[orderType]
  180. local cfg = OrderExcel[orderName]
  181. local orderData = human.db.warOrder[orderName]
  182. if not cfg or not orderData then
  183. return
  184. end
  185. local process = orderData.exp
  186. local itemMap = {}
  187. local finish_copy = table.copy(orderData.finish)
  188. local upgrade_finish_copy = table.copy(orderData.upgradeFinish)
  189. for _,v in pairs(cfg) do
  190. if process >= v.process then
  191. local isOk,isUpgradeOk = checkRewardByIdx(human,orderType,v.idx)
  192. if isOk then
  193. for _,item in ipairs(v.content) do
  194. itemMap[item[1]] = itemMap[item[1]] or 0
  195. itemMap[item[1]] = itemMap[item[1]] + item[2]
  196. end
  197. finish_copy[v.idx] = 0
  198. end
  199. if isUpgradeOk then
  200. for _,item in ipairs(v.upgradeContent) do
  201. itemMap[item[1]] = itemMap[item[1]] or 0
  202. itemMap[item[1]] = itemMap[item[1]] + item[2]
  203. end
  204. upgrade_finish_copy[v.idx] = 0
  205. end
  206. end
  207. end
  208. -- 检查是否有可领取的item
  209. if not next(itemMap) then
  210. return
  211. end
  212. local itemList = {}
  213. for id,count in pairs(itemMap) do
  214. itemList[#itemList+1] = {
  215. id,count
  216. }
  217. end
  218. BagLogic.addItemList(human,itemList,"war_order_get")
  219. -- 同步数据
  220. orderData.finish = finish_copy
  221. orderData.upgradeFinish = upgrade_finish_copy
  222. ------------------------------------------------
  223. local finish = {}
  224. for lv in pairs(orderData.finish) do
  225. finish[#finish+1] = lv
  226. end
  227. local upgradeFinish = {}
  228. for lv in pairs(orderData.upgradeFinish) do
  229. finish[#finish+1] = lv
  230. end
  231. isRed[orderType] = nil
  232. return {
  233. orderType = orderType,
  234. exp = orderData.exp,
  235. unlock = orderData.unlock,
  236. finish = finish,
  237. upgradeFinish = upgradeFinish,
  238. isRed = checkRed(human,orderType),
  239. }
  240. end
  241. -- 解锁战令
  242. function warOrderUnlock(human,orderType)
  243. local orderName = orderNameMap[orderType]
  244. local orderData = human.db.warOrder[orderName]
  245. if not orderData then
  246. return
  247. end
  248. -- 已经解锁
  249. if orderData.unlock ~= 0 then
  250. return
  251. end
  252. orderData.unlock = 1
  253. return true
  254. end
  255. -- 触发战令增加经验
  256. function trigger(human,orderType)
  257. local orderName = orderNameMap[orderType]
  258. local orderData = human.db.warOrder[orderName]
  259. local exp = orderExpMap[orderType]
  260. orderData.exp = orderData.exp + exp
  261. -- 是否需要推送?
  262. local finish = {}
  263. for lv in pairs(orderData.finish) do
  264. finish[#finish+1] = lv
  265. end
  266. local upgradeFinish = {}
  267. for lv in pairs(orderData.upgradeFinish) do
  268. finish[#finish+1] = lv
  269. end
  270. local data = {
  271. orderType = orderType,
  272. exp = orderData.exp,
  273. unlock = orderData.unlock,
  274. finish = finish,
  275. upgradeFinish = upgradeFinish,
  276. isRed = checkRed(human,orderType),
  277. }
  278. -- 临时require 确保两个文件不会相互引用
  279. local newLogic = require "role.NewLogic"
  280. newLogic.PushClient(human,GC_WARORDER_CHANGE,data)
  281. end
  282. function getWarOrderInfo(human)
  283. local ret = {}
  284. -- 用于遍历
  285. for orderType in pairs(orderExpMap) do
  286. ret[#ret + 1] = getWarOrderByType(human,orderType)
  287. end
  288. return ret
  289. end