JibanLogic.lua 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473
  1. local Msg = require("core.Msg")
  2. local Util = require("common.Util")
  3. local CombatPosLogic = require("combat.CombatPosLogic")
  4. local HeroGrid = require("hero.HeroGrid")
  5. local BeSkill = require("combat.BeSkill")
  6. local CombatDefine = require("combat.CombatDefine")
  7. local JibanExcel = require("excel.jiban")
  8. local RoleSystemLogic = require("roleSystem.RoleSystemLogic")
  9. local RoleSystemDefine = require("roleSystem.RoleSystemDefine")
  10. local Broadcast = require("broadcast.Broadcast")
  11. local Lang = require("common.Lang")
  12. local HeroLogic = require("hero.HeroLogic")
  13. local GuideLogic = require("guide.GuideLogic")
  14. local CombatExcel = require("excel.combat")
  15. local Json = require("common.Json")
  16. local HeroConfig = require("excel.hero").hero
  17. CMD1 = 1 -- 主线通关
  18. CMD2 = 2 -- 获得英雄
  19. CMD3 = 3 -- 通关通天塔
  20. CMD4 = 4 -- 等级
  21. FATHER2ID = nil
  22. HERO2ID = nil
  23. CMD2POS = nil
  24. JIBATEMP = nil
  25. local function getDB(human)
  26. human.db.jiban = human.db.jiban or {[1] = 1}
  27. return human.db.jiban
  28. end
  29. -- 获取全部设置的羁绊位置英雄ID
  30. local function getDB_AllJibanHeroID(human)
  31. human.db.jibanheroid = human.db.jibanheroid or {}
  32. return human.db.jibanheroid
  33. end
  34. -- 获取某个羁绊位置英雄ID
  35. local function getDB_JibanHeroIDByIndex(human, nIndex)
  36. local jibanheroid = getDB_AllJibanHeroID(human)
  37. return jibanheroid[nIndex] and jibanheroid[nIndex] or -1
  38. end
  39. -- 设置羁绊位置英雄ID
  40. local function setDB_JibanHeroID(human, nIndex, nHeroID)
  41. local jibanheroid = getDB_AllJibanHeroID(human)
  42. jibanheroid[nIndex] = nHeroID
  43. end
  44. local function fontJibanInfo(net,id)
  45. local conf = JibanExcel.jiban[id]
  46. net.id = id
  47. net.name = conf.name
  48. net.desc = conf.desc
  49. net.quality = conf.quality
  50. local len = 0
  51. for _,v in ipairs(conf.hero) do
  52. len = len + 1
  53. HeroGrid.makeHeroSimpleByID(net.heroList[len], v)
  54. end
  55. net.heroList[0] = len
  56. end
  57. function initAfterHot()
  58. -- 同一father下的羁绊互斥
  59. --[[
  60. FATHER2ID = {
  61. [jibanCfg.father] = {
  62. jibanCfg.id,
  63. } -- array
  64. }
  65. ]]
  66. FATHER2ID = {}
  67. HERO2ID = {}
  68. --[[
  69. temp = {
  70. {jibanCfg.quality,jibanCfg.id},
  71. } -- array
  72. ]]
  73. JIBATEMP = {}
  74. for k,v in ipairs(JibanExcel.jiban) do
  75. JIBATEMP[#JIBATEMP + 1] = {v.quality,k}
  76. for _,v1 in ipairs(v.hero) do
  77. HERO2ID[v1] = HERO2ID[v1] or {}
  78. HERO2ID[v1][#HERO2ID[v1] + 1] = k
  79. end
  80. end
  81. table.sort(JIBATEMP,function(a,b)
  82. if a[1] > b[1] then
  83. return true
  84. elseif a[1] == b[1] and a[2] < b[2] then
  85. return true
  86. else
  87. return false
  88. end
  89. end)
  90. local msgRet = Msg.gc.GC_JIBAN_PREVIEW
  91. local len = 0
  92. for k,v in ipairs(JIBATEMP) do
  93. local conf = JibanExcel.jiban[v[2]]
  94. FATHER2ID[conf.father] = FATHER2ID[conf.father] or {}
  95. FATHER2ID[conf.father][#FATHER2ID[conf.father] + 1] = v[2]
  96. -- len = len + 1
  97. -- local net = msgRet.list[len]
  98. -- fontJibanInfo(net,k)
  99. end
  100. -- msgRet.list[0] = len
  101. CMD2POS = {}
  102. for k,v in ipairs(JibanExcel.pos) do
  103. if v.cmd > 0 then
  104. CMD2POS[v.cmd] = k
  105. end
  106. end
  107. end
  108. function query(human,combatType,heroID)
  109. -- print("请求羁绊英雄数据================", combatType, heroID)
  110. local flag = RoleSystemLogic.isOpen(human,RoleSystemDefine.ROLE_SYS_ID_207)
  111. if flag ~= true then
  112. return
  113. end
  114. local msgRet = Msg.gc.GC_JIBAN_QUERY
  115. local len = 0
  116. if HERO2ID[heroID] then
  117. for k,v in ipairs(HERO2ID[heroID]) do
  118. len = len + 1
  119. local net = msgRet.jibanList[len]
  120. fontJibanInfo(net,v)
  121. end
  122. end
  123. msgRet.jibanList[0] = len
  124. len = 0
  125. local db = getDB(human)
  126. local combatHeroDB = CombatPosLogic.getCombatHeroDB(human,combatType)
  127. local jibanDB = combatHeroDB.jiban or {}
  128. for k,v in ipairs(JibanExcel.pos) do
  129. len = len + 1
  130. local net = msgRet.posList[len]
  131. net.id = k
  132. net.tip = v.tip
  133. net.isOpen = db[k] or 0
  134. net.sort = v.sort
  135. local heroGrid
  136. if jibanDB[k] and jibanDB[k] ~= "" and jibanDB[k] ~= "0" then
  137. heroGrid = HeroLogic.getHeroGridByUuid(human, jibanDB[k])
  138. end
  139. if not heroGrid then
  140. local nHeroID = getDB_JibanHeroIDByIndex(human, k)
  141. if -1 ~= nHeroID then
  142. local heroGridList = HeroLogic.getHeroListById(human, nHeroID)
  143. if nil ~= _G.next(heroGridList) then
  144. local nHeroIndex = heroGridList[1]
  145. heroGrid = HeroLogic.getHeroGrid(human, nHeroID, nHeroIndex)
  146. end
  147. end
  148. end
  149. local index = heroGrid and heroGrid.bagIndex or 0
  150. HeroGrid.makeHeroSimple(net.hero, heroGrid, index)
  151. end
  152. msgRet.posList[0] = len
  153. -- print("请求羁绊英雄数据结束================", msgRet.jibanList[0], msgRet.posList[0])
  154. Msg.send(msgRet,human.fd)
  155. end
  156. --
  157. function sendQuery(human,combatType, teamType)
  158. local msgRet = Msg.gc.GC_JIBAN_QUERY_ALL
  159. local len = 0
  160. local db = getDB(human)
  161. msgRet.type = teamType
  162. local combatHeroDB = CombatPosLogic.getCombatHeroDB(human,combatType)
  163. local jibanDB = combatHeroDB.jiban or {}
  164. for k,v in ipairs(JibanExcel.pos) do
  165. len = len + 1
  166. local net = msgRet.posList[len]
  167. net.id = k
  168. net.tip = v.tip
  169. net.isOpen = db[k] or 0
  170. net.sort = v.sort
  171. local heroGrid
  172. if jibanDB[k] and jibanDB[k] ~= "" and jibanDB[k] ~= "0" then
  173. heroGrid = HeroLogic.getHeroGridByUuid(human, jibanDB[k])
  174. end
  175. if not heroGrid then
  176. local nHeroID = getDB_JibanHeroIDByIndex(human, k)
  177. if -1 ~= nHeroID then
  178. local heroGridList = HeroLogic.getHeroListById(human, nHeroID)
  179. if nil ~= _G.next(heroGridList) then
  180. local nHeroIndex = heroGridList[1]
  181. heroGrid = HeroLogic.getHeroGrid(human, nHeroID, nHeroIndex)
  182. end
  183. end
  184. end
  185. local index = heroGrid and heroGrid.bagIndex or 0
  186. HeroGrid.makeHeroSimple(net.hero, heroGrid, index)
  187. end
  188. msgRet.posList[0] = len
  189. Msg.send(msgRet,human.fd)
  190. end
  191. function preview(human)
  192. local msgRet = Msg.gc.GC_JIBAN_PREVIEW
  193. msgRet.list[0] = 0
  194. msgRet.isend = 0
  195. local len = 0
  196. for k,v in ipairs(JIBATEMP) do
  197. len = len + 1
  198. local net = msgRet.list[len]
  199. fontJibanInfo(net,k)
  200. if len >=20 then
  201. msgRet.list[0] = len
  202. Msg.send(msgRet,human.fd)
  203. len = 0
  204. end
  205. end
  206. msgRet.list[0] = len
  207. msgRet.isend = 1
  208. Msg.send(msgRet,human.fd)
  209. end
  210. function getPosList(human)
  211. return getDB(human)
  212. end
  213. function onCallback(human,cmd,arg)
  214. local pos = CMD2POS[cmd]
  215. local db = getDB(human)
  216. if db[pos] then
  217. return
  218. end
  219. local conf = JibanExcel.pos[pos]
  220. if arg >= conf.arg then
  221. db[pos] = 1
  222. end
  223. end
  224. function getJiban(objList,jibanList)
  225. local objHero = {}
  226. local jibanHero = {}
  227. for i = 1,CombatDefine.COMBAT_HERO_CNT - 1 do
  228. local obj = objList[i]
  229. -- 不是玩家不计算羁绊
  230. if obj and obj.type == CombatDefine.COMBAT_OBJ_TYPE1 then
  231. -- print("上阵英雄ID================", obj.id)
  232. objHero[obj.id] = objHero[obj.id] or 0
  233. objHero[obj.id] = objHero[obj.id] + 1
  234. end
  235. end
  236. if jibanList then
  237. -- for k,v in pairs(jibanList) do
  238. -- if v > 0 then
  239. -- objHero[v] = objHero[v] or 0
  240. -- objHero[v] = objHero[v] + 1
  241. -- end
  242. -- end
  243. for _, heroInfo in pairs(jibanList) do
  244. local heroID = heroInfo.heroID
  245. if heroID > 0 then
  246. jibanHero[heroID] = heroInfo
  247. end
  248. end
  249. end
  250. -- local jiban = {}
  251. -- for _,v in pairs(FATHER2ID) do
  252. -- for _,v1 in ipairs(v) do
  253. -- local conf = JibanExcel.jiban[v1]
  254. -- local canUse = true
  255. -- for _,v2 in ipairs(conf.hero) do
  256. -- if not objHero[v2] then
  257. -- canUse = false
  258. -- break
  259. -- end
  260. -- end
  261. -- if canUse then
  262. -- jiban[v1] = 1
  263. -- break
  264. -- end
  265. -- end
  266. -- end
  267. -- return jiban
  268. local jiban = {}
  269. for _,v in pairs(FATHER2ID) do
  270. for _,v1 in ipairs(v) do
  271. local conf = JibanExcel.jiban[v1]
  272. local canUse = true
  273. local jbHeroList = {}
  274. for _,v2 in ipairs(conf.hero) do
  275. if not objHero[v2] and not jibanHero[v2] then
  276. canUse = false
  277. break
  278. end
  279. if jibanHero[v2] then
  280. jbHeroList[v2] = 1
  281. end
  282. end
  283. if canUse then
  284. jiban[v1] = {}
  285. for jbHeroID in pairs(jbHeroList) do
  286. jiban[v1][jbHeroID] = jibanHero[jbHeroID]
  287. end
  288. end
  289. end
  290. end
  291. return jiban
  292. end
  293. function getJibanHero(human,combatHeroDB)
  294. local jibanHero = {}
  295. -- print("开始获取羁绊英雄数据================", human.db.name, combatHeroDB.jiban and true or false)
  296. if combatHeroDB.jiban then
  297. -- for k, uuid in pairs(combatHeroDB.jiban) do
  298. -- if uuid ~= "0" and uuid ~= "" then
  299. -- local heroGrid = HeroLogic.getHeroGridByUuid(human, uuid)
  300. -- if heroGrid then
  301. -- jibanHero[k] = heroGrid.id
  302. -- else
  303. -- local nHeroID = getDB_JibanHeroIDByIndex(human, k)
  304. -- if -1 ~= nHeroID then
  305. -- jibanHero[k] = nHeroID
  306. -- end
  307. -- end
  308. -- end
  309. -- end
  310. for k, uuid in pairs(combatHeroDB.jiban) do
  311. -- print(string.format("===========羁绊英雄数据, 位置: %s, 英雄UUID: %s", k, uuid))
  312. if uuid ~= "0" and uuid ~= "" then
  313. local heroGrid = HeroLogic.getHeroGridByUuid(human, uuid)
  314. if heroGrid then
  315. local heroCfg = HeroConfig[heroGrid.id]
  316. jibanHero[k] = {
  317. heroID = heroGrid.id,
  318. icon = heroGrid.head or (heroCfg and heroCfg.head or 0),
  319. star = heroGrid.star or 1,
  320. camp = heroCfg and heroCfg.camp or 1,
  321. grade = heroGrid.grade or (heroCfg and heroCfg.grade or 1),
  322. }
  323. else
  324. local nHeroID = getDB_JibanHeroIDByIndex(human, k)
  325. if -1 ~= nHeroID then
  326. local heroCfg = HeroConfig[nHeroID]
  327. jibanHero[k] = {
  328. heroID = nHeroID,
  329. icon = heroCfg and heroCfg.head or 0,
  330. star = 1,
  331. camp = heroCfg and heroCfg.camp or 1,
  332. grade = heroCfg.grade or 1,
  333. }
  334. end
  335. end
  336. end
  337. end
  338. -- for k in pairs(jibanHero) do
  339. -- print("筛选出的羁绊英雄================", k)
  340. -- end
  341. end
  342. return jibanHero
  343. end
  344. function getDesc(jiban)
  345. -- local desc = {}
  346. -- local len = 0
  347. -- for k,v in pairs(jiban) do
  348. -- local conf = JibanExcel.jiban[k]
  349. -- if len > 0 then
  350. -- len = len + 1
  351. -- desc[len] = "|"
  352. -- end
  353. -- len = len + 1
  354. -- desc[len] = conf.name
  355. -- len = len + 1
  356. -- desc[len] = ","
  357. -- len = len + 1
  358. -- desc[len] = conf.desc
  359. -- len = len + 1
  360. -- desc[len] = ","
  361. -- len = len + 1
  362. -- desc[len] = conf.quality
  363. -- end
  364. -- local descStr = table.concat(desc)
  365. -- return descStr
  366. local len = 0
  367. local JiBanInfo = {}
  368. for k, jbHeroInfo in pairs(jiban) do
  369. local conf = JibanExcel.jiban[k]
  370. len = len + 1
  371. JiBanInfo[len] = {
  372. name = conf.name,
  373. desc = conf.desc,
  374. quality = conf.quality,
  375. hero = conf.hero,
  376. }
  377. if next(jbHeroInfo) then
  378. JiBanInfo[len].jbHeroInfo = {}
  379. local info = JiBanInfo[len].jbHeroInfo
  380. for jbHeroId, data in pairs(jbHeroInfo) do
  381. info[jbHeroId] = data
  382. end
  383. end
  384. end
  385. return Json.Encode(JiBanInfo)
  386. end
  387. function setBeSkill(objList,jiban)
  388. if not jiban then return end
  389. local skillList = {}
  390. for k in pairs(jiban) do
  391. local conf = JibanExcel.jiban[k]
  392. local skillID = conf.skill
  393. if skillID > 0 then
  394. for i = 1,CombatDefine.COMBAT_HERO_CNT - 1 do
  395. local obj = objList[i]
  396. if obj then
  397. BeSkill.setBeSkillID(obj,skillID)
  398. end
  399. end
  400. end
  401. end
  402. end
  403. function update(human,combatType,jibanListStr)
  404. -- print("更新羁绊英雄数据================", combatType,jibanListStr)
  405. local conf = CombatExcel.combat[combatType]
  406. if not conf then return end
  407. local posList = getPosList(human)
  408. local jibanList = Util.split(jibanListStr,",")
  409. local combatHeroDB = CombatPosLogic.getCombatHeroDB(human,combatType)
  410. for k,v in ipairs(jibanList) do
  411. local uuid = v or "0"
  412. if uuid ~= "" and uuid ~= "0" then
  413. --检测有没有再阵容上
  414. for _, combatUuid in ipairs(combatHeroDB.list) do
  415. if uuid == combatUuid then return end
  416. end
  417. if not posList[k] then return end
  418. local heroGrid = HeroLogic.getHeroGridByUuid(human, uuid)
  419. if not heroGrid then return end
  420. setDB_JibanHeroID(human, k, heroGrid.id)
  421. end
  422. end
  423. combatHeroDB.jiban = jibanList
  424. GuideLogic.setDoSpecialGuide(human, GuideLogic.SKIPTYPE_JUMP_JIBAN_GROUP)
  425. sendQuery(human,combatType, conf.teamType)
  426. end