JibanLogic.lua 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575
  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. local AnotherWorldBattleNS
  18. local HeroBook
  19. CMD1 = 1 -- 主线通关
  20. CMD2 = 2 -- 获得英雄
  21. CMD3 = 3 -- 通关通天塔
  22. CMD4 = 4 -- 等级
  23. FATHER2ID = nil
  24. HERO2ID = nil
  25. CMD2POS = nil
  26. JIBATEMP = nil
  27. local function getDB(human)
  28. human.db.jiban = human.db.jiban or {[1] = 1}
  29. return human.db.jiban
  30. end
  31. -- 获取全部设置的羁绊位置英雄ID
  32. local function getDB_AllJibanHeroID(human)
  33. human.db.jibanheroid = human.db.jibanheroid or {}
  34. return human.db.jibanheroid
  35. end
  36. -- 获取某个羁绊位置英雄ID
  37. local function getDB_JibanHeroIDByIndex(human, nIndex)
  38. local jibanheroid = getDB_AllJibanHeroID(human)
  39. return jibanheroid[nIndex] and jibanheroid[nIndex] or -1
  40. end
  41. -- 设置羁绊位置英雄ID
  42. local function setDB_JibanHeroID(human, nIndex, nHeroID)
  43. local jibanheroid = getDB_AllJibanHeroID(human)
  44. jibanheroid[nIndex] = nHeroID
  45. end
  46. -- -- 通过阵容类型获取羁绊英雄数据
  47. -- local function getJibanHeroData(human, combatType)
  48. -- human.db.jibanHeroData = human.db.jibanHeroData or {}
  49. -- human.db.jibanHeroData[combatType] = human.db.jibanHeroData[combatType] or {}
  50. -- return human.db.jibanHeroData[combatType]
  51. -- end
  52. -- -- 获取某个阵容羁绊英雄Id
  53. -- local function getJibanHeroId(human, combatType, heroIdx)
  54. -- local singleJibanHeroData = getJibanHeroData(human, combatType)
  55. -- return singleJibanHeroData[heroIdx] and singleJibanHeroData[heroIdx] or -1
  56. -- end
  57. -- -- 设置羁绊位置英雄ID
  58. -- local function setJiBanHero(human, combatType, heroIdx, heroId)
  59. -- local singleJibanHeroData = getJibanHeroData(human, combatType)
  60. -- singleJibanHeroData[heroIdx] = heroId
  61. -- end
  62. local function fontJibanInfo(net,id)
  63. local conf = JibanExcel.jiban[id]
  64. net.id = id
  65. net.name = conf.name
  66. net.desc = conf.desc
  67. net.quality = conf.quality
  68. local len = 0
  69. for _,v in ipairs(conf.hero) do
  70. len = len + 1
  71. HeroGrid.makeHeroSimpleByID(net.heroList[len], v)
  72. end
  73. net.heroList[0] = len
  74. end
  75. function initAfterHot()
  76. -- 同一father下的羁绊互斥
  77. --[[
  78. FATHER2ID = {
  79. [jibanCfg.father] = {
  80. jibanCfg.id,
  81. } -- array
  82. }
  83. ]]
  84. FATHER2ID = {}
  85. HERO2ID = {}
  86. --[[
  87. temp = {
  88. {jibanCfg.quality,jibanCfg.id},
  89. } -- array
  90. ]]
  91. JIBATEMP = {}
  92. for k,v in ipairs(JibanExcel.jiban) do
  93. JIBATEMP[#JIBATEMP + 1] = {v.quality,k}
  94. for _,v1 in ipairs(v.hero) do
  95. HERO2ID[v1] = HERO2ID[v1] or {}
  96. HERO2ID[v1][#HERO2ID[v1] + 1] = k
  97. end
  98. end
  99. table.sort(JIBATEMP,function(a,b)
  100. if a[1] > b[1] then
  101. return true
  102. elseif a[1] == b[1] and a[2] < b[2] then
  103. return true
  104. else
  105. return false
  106. end
  107. end)
  108. local msgRet = Msg.gc.GC_JIBAN_PREVIEW
  109. local len = 0
  110. for k,v in ipairs(JIBATEMP) do
  111. local conf = JibanExcel.jiban[v[2]]
  112. FATHER2ID[conf.father] = FATHER2ID[conf.father] or {}
  113. FATHER2ID[conf.father][#FATHER2ID[conf.father] + 1] = v[2]
  114. -- len = len + 1
  115. -- local net = msgRet.list[len]
  116. -- fontJibanInfo(net,k)
  117. end
  118. -- msgRet.list[0] = len
  119. CMD2POS = {}
  120. for k,v in ipairs(JibanExcel.pos) do
  121. if v.cmd > 0 then
  122. CMD2POS[v.cmd] = k
  123. end
  124. end
  125. end
  126. function query(human,combatType,heroID, extraArgs)
  127. local flag = RoleSystemLogic.isOpen(human,RoleSystemDefine.ROLE_SYS_ID_207)
  128. if flag ~= true then
  129. return
  130. end
  131. local msgRet = Msg.gc.GC_JIBAN_QUERY
  132. local len = 0
  133. if HERO2ID[heroID] then
  134. for k,v in ipairs(HERO2ID[heroID]) do
  135. len = len + 1
  136. local net = msgRet.jibanList[len]
  137. fontJibanInfo(net,v)
  138. end
  139. end
  140. msgRet.jibanList[0] = len
  141. len = 0
  142. local db = getDB(human)
  143. local combatHeroDB
  144. if combatType == CombatDefine.COMBAT_TYPE36 and extraArgs then
  145. AnotherWorldBattleNS = AnotherWorldBattleNS or require("anotherWorldBattle.AnotherWorldBattleNS")
  146. local v1,v2, v3
  147. v1, v2, v3, combatHeroDB = AnotherWorldBattleNS.getCombatHeros(human, combatType, extraArgs)
  148. combatHeroDB = combatHeroDB or {}
  149. else
  150. combatHeroDB = CombatPosLogic.getCombatHeroDB(human,combatType)
  151. end
  152. local jibanDB = combatHeroDB.jiban or {}
  153. for k,v in ipairs(JibanExcel.pos) do
  154. len = len + 1
  155. local net = msgRet.posList[len]
  156. net.id = k
  157. net.tip = v.tip
  158. net.isOpen = db[k] or 0
  159. net.sort = v.sort
  160. local heroGrid
  161. -- if jibanDB[k] and jibanDB[k] ~= "" and jibanDB[k] ~= "0" then
  162. -- heroGrid = HeroLogic.getHeroGridByUuid(human, jibanDB[k])
  163. -- end
  164. -- if not heroGrid then
  165. -- local nHeroID = getDB_JibanHeroIDByIndex(human, k)
  166. -- if -1 ~= nHeroID then
  167. -- local heroGridList = HeroLogic.getHeroListById(human, nHeroID)
  168. -- if nil ~= _G.next(heroGridList) then
  169. -- local nHeroIndex = heroGridList[1]
  170. -- heroGrid = HeroLogic.getHeroGrid(human, nHeroID, nHeroIndex)
  171. -- end
  172. -- end
  173. -- end
  174. if jibanDB[k] and jibanDB[k] ~= "" and jibanDB[k] ~= "0" and jibanDB[k] ~= 0 then
  175. -- len = len + 1
  176. -- local net = msgRet.posList[len]
  177. -- net.id = k
  178. -- net.tip = v.tip
  179. -- net.isOpen = db[k] or 0
  180. -- net.sort = v.sort
  181. -- local heroGrid
  182. -- 之前阵容数据的羁绊数据里保存的是英雄的uuid, 最新改成保存英雄id
  183. local heroId = tonumber(jibanDB[k])
  184. if heroId then
  185. heroGrid = {id = heroId }
  186. else
  187. heroGrid = HeroLogic.getHeroGridByUuid(human, jibanDB[k])
  188. end
  189. end
  190. local index = heroGrid and heroGrid.bagIndex or 0
  191. HeroGrid.makeHeroSimple(net.hero, heroGrid, index)
  192. end
  193. msgRet.posList[0] = len
  194. Msg.send(msgRet,human.fd)
  195. end
  196. --
  197. function sendQuery(human,combatType, teamType)
  198. local msgRet = Msg.gc.GC_JIBAN_QUERY_ALL
  199. local len = 0
  200. local db = getDB(human)
  201. msgRet.type = teamType
  202. local combatHeroDB = CombatPosLogic.getCombatHeroDB(human,combatType)
  203. local jibanDB = combatHeroDB.jiban or {}
  204. for k,v in ipairs(JibanExcel.pos) do
  205. len = len + 1
  206. local net = msgRet.posList[len]
  207. net.id = k
  208. net.tip = v.tip
  209. net.isOpen = db[k] or 0
  210. net.sort = v.sort
  211. local heroGrid
  212. -- if jibanDB[k] and jibanDB[k] ~= "" and jibanDB[k] ~= "0" then
  213. -- heroGrid = HeroLogic.getHeroGridByUuid(human, jibanDB[k])
  214. -- end
  215. -- if not heroGrid then
  216. -- local nHeroID = getDB_JibanHeroIDByIndex(human, k)
  217. -- if -1 ~= nHeroID then
  218. -- local heroGridList = HeroLogic.getHeroListById(human, nHeroID)
  219. -- if nil ~= _G.next(heroGridList) then
  220. -- local nHeroIndex = heroGridList[1]
  221. -- heroGrid = HeroLogic.getHeroGrid(human, nHeroID, nHeroIndex)
  222. -- end
  223. -- end
  224. -- end
  225. if jibanDB[k] and jibanDB[k] ~= "" and jibanDB[k] ~= "0" and jibanDB[k] ~= 0 then
  226. -- 之前阵容数据的羁绊数据里保存的是英雄的uuid, 最新改成保存英雄id
  227. local heroId = tonumber(jibanDB[k])
  228. if heroId then
  229. heroGrid = {id = heroId }
  230. else
  231. heroGrid = HeroLogic.getHeroGridByUuid(human, jibanDB[k])
  232. end
  233. end
  234. local index = heroGrid and heroGrid.bagIndex or 0
  235. HeroGrid.makeHeroSimple(net.hero, heroGrid, index)
  236. end
  237. msgRet.posList[0] = len
  238. Msg.send(msgRet,human.fd)
  239. end
  240. function preview(human)
  241. local msgRet = Msg.gc.GC_JIBAN_PREVIEW
  242. msgRet.list[0] = 0
  243. msgRet.isend = 0
  244. local len = 0
  245. for k,v in ipairs(JIBATEMP) do
  246. len = len + 1
  247. local net = msgRet.list[len]
  248. fontJibanInfo(net,k)
  249. if len >=20 then
  250. msgRet.list[0] = len
  251. Msg.send(msgRet,human.fd)
  252. len = 0
  253. end
  254. end
  255. msgRet.list[0] = len
  256. msgRet.isend = 1
  257. Msg.send(msgRet,human.fd)
  258. end
  259. function getPosList(human)
  260. return getDB(human)
  261. end
  262. function onCallback(human,cmd,arg)
  263. local pos = CMD2POS[cmd]
  264. local db = getDB(human)
  265. if db[pos] then
  266. return
  267. end
  268. local conf = JibanExcel.pos[pos]
  269. if arg >= conf.arg then
  270. db[pos] = 1
  271. end
  272. end
  273. function getJiban(objList,jibanList)
  274. local objHero = {}
  275. local jibanHero = {}
  276. for i = 1,CombatDefine.COMBAT_HERO_CNT - 1 do
  277. local obj = objList[i]
  278. -- 不是玩家不计算羁绊
  279. if obj and obj.type == CombatDefine.COMBAT_OBJ_TYPE1 then
  280. objHero[obj.id] = objHero[obj.id] or 0
  281. objHero[obj.id] = objHero[obj.id] + 1
  282. end
  283. end
  284. if jibanList then
  285. -- for k,v in pairs(jibanList) do
  286. -- if v > 0 then
  287. -- objHero[v] = objHero[v] or 0
  288. -- objHero[v] = objHero[v] + 1
  289. -- end
  290. -- end
  291. for _, heroInfo in pairs(jibanList) do
  292. local heroID = heroInfo.heroID
  293. if heroID > 0 then
  294. jibanHero[heroID] = heroInfo
  295. end
  296. end
  297. end
  298. -- local jiban = {}
  299. -- for _,v in pairs(FATHER2ID) do
  300. -- for _,v1 in ipairs(v) do
  301. -- local conf = JibanExcel.jiban[v1]
  302. -- local canUse = true
  303. -- for _,v2 in ipairs(conf.hero) do
  304. -- if not objHero[v2] then
  305. -- canUse = false
  306. -- break
  307. -- end
  308. -- end
  309. -- if canUse then
  310. -- jiban[v1] = 1
  311. -- break
  312. -- end
  313. -- end
  314. -- end
  315. -- return jiban
  316. local jiban = {}
  317. for _,v in pairs(FATHER2ID) do
  318. for _,v1 in ipairs(v) do
  319. local conf = JibanExcel.jiban[v1]
  320. local canUse = true
  321. local jbHeroList = {}
  322. for _,v2 in ipairs(conf.hero) do
  323. if not objHero[v2] and not jibanHero[v2] then
  324. canUse = false
  325. break
  326. end
  327. if jibanHero[v2] then
  328. jbHeroList[v2] = 1
  329. end
  330. end
  331. if canUse then
  332. jiban[v1] = {}
  333. for jbHeroID in pairs(jbHeroList) do
  334. jiban[v1][jbHeroID] = jibanHero[jbHeroID]
  335. end
  336. end
  337. end
  338. end
  339. return jiban
  340. end
  341. function getJibanHero(human,combatHeroDB)
  342. local jibanHero = {}
  343. -- local jibanheroid = getDB_AllJibanHeroID(human)
  344. if combatHeroDB.jiban then
  345. -- for k, uuid in pairs(combatHeroDB.jiban) do
  346. -- if uuid ~= "0" and uuid ~= "" then
  347. -- local heroGrid = HeroLogic.getHeroGridByUuid(human, uuid)
  348. -- if heroGrid then
  349. -- jibanHero[k] = heroGrid.id
  350. -- else
  351. -- local nHeroID = getDB_JibanHeroIDByIndex(human, k)
  352. -- if -1 ~= nHeroID then
  353. -- jibanHero[k] = nHeroID
  354. -- end
  355. -- end
  356. -- end
  357. -- end
  358. for k, uuid in pairs(combatHeroDB.jiban) do
  359. if uuid ~= "0" and uuid ~= "" and uuid ~= 0 then
  360. local finalId = tonumber(uuid)
  361. if finalId then
  362. local heroCfg = HeroConfig[finalId]
  363. jibanHero[k] = {
  364. heroID = finalId,
  365. icon = heroCfg and heroCfg.head or 0,
  366. star = 1,
  367. camp = heroCfg and heroCfg.camp or 1,
  368. grade = heroCfg.grade or 1,
  369. }
  370. else
  371. local heroGrid = HeroLogic.getHeroGridByUuid(human, uuid)
  372. if heroGrid then
  373. local heroCfg = HeroConfig[heroGrid.id]
  374. jibanHero[k] = {
  375. heroID = heroGrid.id,
  376. icon = heroGrid.head or (heroCfg and heroCfg.head or 0),
  377. star = heroGrid.star or 1,
  378. camp = heroCfg and heroCfg.camp or 1,
  379. grade = heroGrid.grade or (heroCfg and heroCfg.grade or 1),
  380. }
  381. end
  382. end
  383. end
  384. -- if heroGrid then
  385. -- local heroCfg = HeroConfig[heroGrid.id]
  386. -- jibanHero[k] = {
  387. -- heroID = heroGrid.id,
  388. -- icon = heroGrid.head or (heroCfg and heroCfg.head or 0),
  389. -- star = heroGrid.star or 1,
  390. -- camp = heroCfg and heroCfg.camp or 1,
  391. -- grade = heroGrid.grade or (heroCfg and heroCfg.grade or 1),
  392. -- }
  393. -- else
  394. -- local nHeroID = getDB_JibanHeroIDByIndex(human, k)
  395. -- if -1 ~= nHeroID then
  396. -- local heroCfg = HeroConfig[nHeroID]
  397. -- jibanHero[k] = {
  398. -- heroID = nHeroID,
  399. -- icon = heroCfg and heroCfg.head or 0,
  400. -- star = 1,
  401. -- camp = heroCfg and heroCfg.camp or 1,
  402. -- grade = heroCfg.grade or 1,
  403. -- }
  404. -- end
  405. -- end
  406. end
  407. end
  408. return jibanHero
  409. end
  410. function getDesc(jiban)
  411. -- local desc = {}
  412. -- local len = 0
  413. -- for k,v in pairs(jiban) do
  414. -- local conf = JibanExcel.jiban[k]
  415. -- if len > 0 then
  416. -- len = len + 1
  417. -- desc[len] = "|"
  418. -- end
  419. -- len = len + 1
  420. -- desc[len] = conf.name
  421. -- len = len + 1
  422. -- desc[len] = ","
  423. -- len = len + 1
  424. -- desc[len] = conf.desc
  425. -- len = len + 1
  426. -- desc[len] = ","
  427. -- len = len + 1
  428. -- desc[len] = conf.quality
  429. -- end
  430. -- local descStr = table.concat(desc)
  431. -- return descStr
  432. local len = 0
  433. local JiBanInfo = {}
  434. for k, jbHeroInfo in pairs(jiban) do
  435. local conf = JibanExcel.jiban[k]
  436. len = len + 1
  437. JiBanInfo[len] = {
  438. name = conf.name,
  439. desc = conf.desc,
  440. quality = conf.quality,
  441. hero = conf.hero,
  442. }
  443. if next(jbHeroInfo) then
  444. JiBanInfo[len].jbHeroInfo = {}
  445. local info = JiBanInfo[len].jbHeroInfo
  446. for jbHeroId, data in pairs(jbHeroInfo) do
  447. info[jbHeroId] = data
  448. end
  449. end
  450. end
  451. return Json.Encode(JiBanInfo)
  452. end
  453. function setBeSkill(objList,jiban)
  454. if not jiban then return end
  455. local skillList = {}
  456. for k in pairs(jiban) do
  457. local conf = JibanExcel.jiban[k]
  458. local skillID = conf.skill
  459. if skillID > 0 then
  460. for i = 1,CombatDefine.COMBAT_HERO_CNT - 1 do
  461. local obj = objList[i]
  462. if obj then
  463. BeSkill.setBeSkillID(obj,skillID)
  464. end
  465. end
  466. end
  467. end
  468. end
  469. -- 更新羁绊
  470. function update(human,combatType,jibanListStr, heroIdStr, extraArgs)
  471. local conf = CombatExcel.combat[combatType]
  472. if not conf then return end
  473. local posList = getPosList(human)
  474. local jibanList = Util.split(jibanListStr,",")
  475. local jibanHeroIdArr = Util.split(heroIdStr,",", true)
  476. local combatHeroDB
  477. if combatType == CombatDefine.COMBAT_TYPE36 and extraArgs then
  478. AnotherWorldBattleNS = AnotherWorldBattleNS or require("anotherWorldBattle.AnotherWorldBattleNS")
  479. local v1,v2, v3
  480. v1, v2, v3, combatHeroDB = AnotherWorldBattleNS.getCombatHeros(human, combatType, extraArgs)
  481. if not combatHeroDB then
  482. return
  483. end
  484. else
  485. combatHeroDB = CombatPosLogic.getCombatHeroDB(human,combatType)
  486. end
  487. HeroBook = HeroBook or require("hero.HeroBook")
  488. for k,v in ipairs(jibanList) do
  489. local uuid = v or "0"
  490. local heroId = jibanHeroIdArr[k] or 0
  491. if uuid ~= "" and uuid ~= "0" and heroId ~= 0 then
  492. --检测有没有再阵容上
  493. for _, combatUuid in ipairs(combatHeroDB.list) do
  494. if uuid == combatUuid then return end
  495. end
  496. if not posList[k] then return end
  497. -- local heroGrid = HeroLogic.getHeroGridByUuid(human, uuid)
  498. -- if not heroGrid then return end
  499. -- setDB_JibanHeroID(human, k, heroGrid.id)
  500. local res = HeroBook.isGetHero(human, heroId)
  501. if not res or res == HeroBook.LIEZHUAN_REWARD_NO then
  502. return
  503. end
  504. -- setDB_JibanHeroID(human, k, heroId)
  505. end
  506. end
  507. combatHeroDB.jiban = jibanHeroIdArr
  508. if combatType == CombatDefine.COMBAT_TYPE36 and extraArgs then
  509. return query(human, combatType, 0, extraArgs)
  510. end
  511. GuideLogic.setDoSpecialGuide(human, GuideLogic.SKIPTYPE_JUMP_JIBAN_GROUP)
  512. sendQuery(human,combatType, conf.teamType)
  513. end