JibanLogic.lua 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475
  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. print("最终羁绊英雄====================", heroID)
  247. jibanHero[heroID] = heroInfo
  248. end
  249. end
  250. end
  251. -- local jiban = {}
  252. -- for _,v in pairs(FATHER2ID) do
  253. -- for _,v1 in ipairs(v) do
  254. -- local conf = JibanExcel.jiban[v1]
  255. -- local canUse = true
  256. -- for _,v2 in ipairs(conf.hero) do
  257. -- if not objHero[v2] then
  258. -- canUse = false
  259. -- break
  260. -- end
  261. -- end
  262. -- if canUse then
  263. -- jiban[v1] = 1
  264. -- break
  265. -- end
  266. -- end
  267. -- end
  268. -- return jiban
  269. local jiban = {}
  270. for _,v in pairs(FATHER2ID) do
  271. for _,v1 in ipairs(v) do
  272. local conf = JibanExcel.jiban[v1]
  273. local canUse = true
  274. local jbHeroList = {}
  275. for _,v2 in ipairs(conf.hero) do
  276. if not objHero[v2] and not jibanHero[v2] then
  277. canUse = false
  278. break
  279. end
  280. if jibanHero[v2] then
  281. jbHeroList[v2] = 1
  282. end
  283. end
  284. if canUse then
  285. jiban[v1] = {}
  286. print("拥有的羁绊==================", v1)
  287. for jbHeroID in pairs(jbHeroList) do
  288. jiban[v1][jbHeroID] = jibanHero[jbHeroID]
  289. end
  290. end
  291. end
  292. end
  293. return jiban
  294. end
  295. function getJibanHero(human,combatHeroDB)
  296. local jibanHero = {}
  297. -- print("开始获取羁绊英雄数据================", human.db.name, combatHeroDB.jiban and true or false)
  298. if combatHeroDB.jiban then
  299. -- for k, uuid in pairs(combatHeroDB.jiban) do
  300. -- if uuid ~= "0" and uuid ~= "" then
  301. -- local heroGrid = HeroLogic.getHeroGridByUuid(human, uuid)
  302. -- if heroGrid then
  303. -- jibanHero[k] = heroGrid.id
  304. -- else
  305. -- local nHeroID = getDB_JibanHeroIDByIndex(human, k)
  306. -- if -1 ~= nHeroID then
  307. -- jibanHero[k] = nHeroID
  308. -- end
  309. -- end
  310. -- end
  311. -- end
  312. for k, uuid in pairs(combatHeroDB.jiban) do
  313. -- print(string.format("===========羁绊英雄数据, 位置: %s, 英雄UUID: %s", k, uuid))
  314. if uuid ~= "0" and uuid ~= "" then
  315. local heroGrid = HeroLogic.getHeroGridByUuid(human, uuid)
  316. if heroGrid then
  317. local heroCfg = HeroConfig[heroGrid.id]
  318. jibanHero[k] = {
  319. heroID = heroGrid.id,
  320. icon = heroGrid.head or (heroCfg and heroCfg.head or 0),
  321. star = heroGrid.star or 1,
  322. camp = heroCfg and heroCfg.camp or 1,
  323. grade = heroGrid.grade or (heroCfg and heroCfg.grade or 1),
  324. }
  325. else
  326. local nHeroID = getDB_JibanHeroIDByIndex(human, k)
  327. if -1 ~= nHeroID then
  328. local heroCfg = HeroConfig[nHeroID]
  329. jibanHero[k] = {
  330. heroID = nHeroID,
  331. icon = heroCfg and heroCfg.head or 0,
  332. star = 1,
  333. camp = heroCfg and heroCfg.camp or 1,
  334. grade = heroCfg.grade or 1,
  335. }
  336. end
  337. end
  338. end
  339. end
  340. -- for k in pairs(jibanHero) do
  341. -- print("筛选出的羁绊英雄================", k)
  342. -- end
  343. end
  344. return jibanHero
  345. end
  346. function getDesc(jiban)
  347. -- local desc = {}
  348. -- local len = 0
  349. -- for k,v in pairs(jiban) do
  350. -- local conf = JibanExcel.jiban[k]
  351. -- if len > 0 then
  352. -- len = len + 1
  353. -- desc[len] = "|"
  354. -- end
  355. -- len = len + 1
  356. -- desc[len] = conf.name
  357. -- len = len + 1
  358. -- desc[len] = ","
  359. -- len = len + 1
  360. -- desc[len] = conf.desc
  361. -- len = len + 1
  362. -- desc[len] = ","
  363. -- len = len + 1
  364. -- desc[len] = conf.quality
  365. -- end
  366. -- local descStr = table.concat(desc)
  367. -- return descStr
  368. local len = 0
  369. local JiBanInfo = {}
  370. for k, jbHeroInfo in pairs(jiban) do
  371. local conf = JibanExcel.jiban[k]
  372. len = len + 1
  373. JiBanInfo[len] = {
  374. name = conf.name,
  375. desc = conf.desc,
  376. quality = conf.quality,
  377. hero = conf.hero,
  378. }
  379. if next(jbHeroInfo) then
  380. JiBanInfo[len].jbHeroInfo = {}
  381. local info = JiBanInfo[len].jbHeroInfo
  382. for jbHeroId, data in pairs(jbHeroInfo) do
  383. info[jbHeroId] = data
  384. end
  385. end
  386. end
  387. return Json.Encode(JiBanInfo)
  388. end
  389. function setBeSkill(objList,jiban)
  390. if not jiban then return end
  391. local skillList = {}
  392. for k in pairs(jiban) do
  393. local conf = JibanExcel.jiban[k]
  394. local skillID = conf.skill
  395. if skillID > 0 then
  396. for i = 1,CombatDefine.COMBAT_HERO_CNT - 1 do
  397. local obj = objList[i]
  398. if obj then
  399. BeSkill.setBeSkillID(obj,skillID)
  400. end
  401. end
  402. end
  403. end
  404. end
  405. function update(human,combatType,jibanListStr)
  406. -- print("更新羁绊英雄数据================", combatType,jibanListStr)
  407. local conf = CombatExcel.combat[combatType]
  408. if not conf then return end
  409. local posList = getPosList(human)
  410. local jibanList = Util.split(jibanListStr,",")
  411. local combatHeroDB = CombatPosLogic.getCombatHeroDB(human,combatType)
  412. for k,v in ipairs(jibanList) do
  413. local uuid = v or "0"
  414. if uuid ~= "" and uuid ~= "0" then
  415. --检测有没有再阵容上
  416. for _, combatUuid in ipairs(combatHeroDB.list) do
  417. if uuid == combatUuid then return end
  418. end
  419. if not posList[k] then return end
  420. local heroGrid = HeroLogic.getHeroGridByUuid(human, uuid)
  421. if not heroGrid then return end
  422. setDB_JibanHeroID(human, k, heroGrid.id)
  423. end
  424. end
  425. combatHeroDB.jiban = jibanList
  426. GuideLogic.setDoSpecialGuide(human, GuideLogic.SKIPTYPE_JUMP_JIBAN_GROUP)
  427. sendQuery(human,combatType, conf.teamType)
  428. end