WarOrder.lua 9.9 KB

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