JibanLogic.lua 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461
  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. local flag = RoleSystemLogic.isOpen(human,RoleSystemDefine.ROLE_SYS_ID_207)
  110. if flag ~= true then
  111. return
  112. end
  113. local msgRet = Msg.gc.GC_JIBAN_QUERY
  114. local len = 0
  115. if HERO2ID[heroID] then
  116. for k,v in ipairs(HERO2ID[heroID]) do
  117. len = len + 1
  118. local net = msgRet.jibanList[len]
  119. fontJibanInfo(net,v)
  120. end
  121. end
  122. msgRet.jibanList[0] = len
  123. len = 0
  124. local db = getDB(human)
  125. local combatHeroDB = CombatPosLogic.getCombatHeroDB(human,combatType)
  126. local jibanDB = combatHeroDB.jiban or {}
  127. for k,v in ipairs(JibanExcel.pos) do
  128. len = len + 1
  129. local net = msgRet.posList[len]
  130. net.id = k
  131. net.tip = v.tip
  132. net.isOpen = db[k] or 0
  133. net.sort = v.sort
  134. local heroGrid
  135. if jibanDB[k] and jibanDB[k] ~= "" and jibanDB[k] ~= "0" then
  136. heroGrid = HeroLogic.getHeroGridByUuid(human, jibanDB[k])
  137. end
  138. if not heroGrid then
  139. local nHeroID = getDB_JibanHeroIDByIndex(human, k)
  140. if -1 ~= nHeroID then
  141. local heroGridList = HeroLogic.getHeroListById(human, nHeroID)
  142. if nil ~= _G.next(heroGridList) then
  143. local nHeroIndex = heroGridList[1]
  144. heroGrid = HeroLogic.getHeroGrid(human, nHeroID, nHeroIndex)
  145. end
  146. end
  147. end
  148. local index = heroGrid and heroGrid.bagIndex or 0
  149. HeroGrid.makeHeroSimple(net.hero, heroGrid, index)
  150. end
  151. msgRet.posList[0] = len
  152. Msg.send(msgRet,human.fd)
  153. end
  154. --
  155. function sendQuery(human,combatType, teamType)
  156. local msgRet = Msg.gc.GC_JIBAN_QUERY_ALL
  157. local len = 0
  158. local db = getDB(human)
  159. msgRet.type = teamType
  160. local combatHeroDB = CombatPosLogic.getCombatHeroDB(human,combatType)
  161. local jibanDB = combatHeroDB.jiban or {}
  162. for k,v in ipairs(JibanExcel.pos) do
  163. len = len + 1
  164. local net = msgRet.posList[len]
  165. net.id = k
  166. net.tip = v.tip
  167. net.isOpen = db[k] or 0
  168. net.sort = v.sort
  169. local heroGrid
  170. if jibanDB[k] and jibanDB[k] ~= "" and jibanDB[k] ~= "0" then
  171. heroGrid = HeroLogic.getHeroGridByUuid(human, jibanDB[k])
  172. end
  173. if not heroGrid then
  174. local nHeroID = getDB_JibanHeroIDByIndex(human, k)
  175. if -1 ~= nHeroID then
  176. local heroGridList = HeroLogic.getHeroListById(human, nHeroID)
  177. if nil ~= _G.next(heroGridList) then
  178. local nHeroIndex = heroGridList[1]
  179. heroGrid = HeroLogic.getHeroGrid(human, nHeroID, nHeroIndex)
  180. end
  181. end
  182. end
  183. local index = heroGrid and heroGrid.bagIndex or 0
  184. HeroGrid.makeHeroSimple(net.hero, heroGrid, index)
  185. end
  186. msgRet.posList[0] = len
  187. Msg.send(msgRet,human.fd)
  188. end
  189. function preview(human)
  190. local msgRet = Msg.gc.GC_JIBAN_PREVIEW
  191. msgRet.list[0] = 0
  192. msgRet.isend = 0
  193. local len = 0
  194. for k,v in ipairs(JIBATEMP) do
  195. len = len + 1
  196. local net = msgRet.list[len]
  197. fontJibanInfo(net,k)
  198. if len >=20 then
  199. msgRet.list[0] = len
  200. Msg.send(msgRet,human.fd)
  201. len = 0
  202. end
  203. end
  204. msgRet.list[0] = len
  205. msgRet.isend = 1
  206. Msg.send(msgRet,human.fd)
  207. end
  208. function getPosList(human)
  209. return getDB(human)
  210. end
  211. function onCallback(human,cmd,arg)
  212. local pos = CMD2POS[cmd]
  213. local db = getDB(human)
  214. if db[pos] then
  215. return
  216. end
  217. local conf = JibanExcel.pos[pos]
  218. if arg >= conf.arg then
  219. db[pos] = 1
  220. end
  221. end
  222. function getJiban(objList,jibanList)
  223. local objHero = {}
  224. local jibanHero = {}
  225. for i = 1,CombatDefine.COMBAT_HERO_CNT - 1 do
  226. local obj = objList[i]
  227. -- 不是玩家不计算羁绊
  228. if obj and obj.type == CombatDefine.COMBAT_OBJ_TYPE1 then
  229. objHero[obj.id] = objHero[obj.id] or 0
  230. objHero[obj.id] = objHero[obj.id] + 1
  231. end
  232. end
  233. if jibanList then
  234. -- for k,v in pairs(jibanList) do
  235. -- if v > 0 then
  236. -- objHero[v] = objHero[v] or 0
  237. -- objHero[v] = objHero[v] + 1
  238. -- end
  239. -- end
  240. for _, heroInfo in pairs(jibanList) do
  241. local heroID = heroInfo.heroID
  242. if heroID > 0 then
  243. jibanHero[heroID] = heroInfo
  244. end
  245. end
  246. end
  247. -- local jiban = {}
  248. -- for _,v in pairs(FATHER2ID) do
  249. -- for _,v1 in ipairs(v) do
  250. -- local conf = JibanExcel.jiban[v1]
  251. -- local canUse = true
  252. -- for _,v2 in ipairs(conf.hero) do
  253. -- if not objHero[v2] then
  254. -- canUse = false
  255. -- break
  256. -- end
  257. -- end
  258. -- if canUse then
  259. -- jiban[v1] = 1
  260. -- break
  261. -- end
  262. -- end
  263. -- end
  264. -- return jiban
  265. local jiban = {}
  266. for _,v in pairs(FATHER2ID) do
  267. for _,v1 in ipairs(v) do
  268. local conf = JibanExcel.jiban[v1]
  269. local canUse = true
  270. local jbHeroList = {}
  271. for _,v2 in ipairs(conf.hero) do
  272. if not objHero[v2] and not jibanHero[v2] then
  273. canUse = false
  274. break
  275. end
  276. if jibanHero[v2] then
  277. jbHeroList[v2] = 1
  278. end
  279. end
  280. if canUse then
  281. jiban[v1] = {}
  282. for jbHeroID in pairs(jbHeroList) do
  283. jiban[v1][jbHeroID] = jibanHero[jbHeroID]
  284. end
  285. end
  286. end
  287. end
  288. return jiban
  289. end
  290. function getJibanHero(human,combatHeroDB)
  291. local jibanHero = {}
  292. if combatHeroDB.jiban then
  293. -- for k, uuid in pairs(combatHeroDB.jiban) do
  294. -- if uuid ~= "0" and uuid ~= "" then
  295. -- local heroGrid = HeroLogic.getHeroGridByUuid(human, uuid)
  296. -- if heroGrid then
  297. -- jibanHero[k] = heroGrid.id
  298. -- else
  299. -- local nHeroID = getDB_JibanHeroIDByIndex(human, k)
  300. -- if -1 ~= nHeroID then
  301. -- jibanHero[k] = nHeroID
  302. -- end
  303. -- end
  304. -- end
  305. -- end
  306. for k, uuid in pairs(combatHeroDB.jiban) do
  307. if uuid ~= "0" and uuid ~= "" then
  308. local heroGrid = HeroLogic.getHeroGridByUuid(human, uuid)
  309. if heroGrid then
  310. local heroCfg = HeroConfig[heroGrid.id]
  311. jibanHero[k] = {
  312. heroID = heroGrid.id,
  313. icon = heroGrid.head or (heroCfg and heroCfg.head or 0),
  314. star = heroGrid.star or 1,
  315. camp = heroCfg and heroCfg.camp or 1,
  316. grade = heroGrid.grade or (heroCfg and heroCfg.grade or 1),
  317. }
  318. else
  319. local nHeroID = getDB_JibanHeroIDByIndex(human, k)
  320. if -1 ~= nHeroID then
  321. local heroCfg = HeroConfig[nHeroID]
  322. jibanHero[k] = {
  323. heroID = nHeroID,
  324. icon = heroCfg and heroCfg.head or 0,
  325. star = 1,
  326. camp = heroCfg and heroCfg.camp or 1,
  327. grade = heroCfg.grade or 1,
  328. }
  329. end
  330. end
  331. end
  332. end
  333. end
  334. return jibanHero
  335. end
  336. function getDesc(jiban)
  337. -- local desc = {}
  338. -- local len = 0
  339. -- for k,v in pairs(jiban) do
  340. -- local conf = JibanExcel.jiban[k]
  341. -- if len > 0 then
  342. -- len = len + 1
  343. -- desc[len] = "|"
  344. -- end
  345. -- len = len + 1
  346. -- desc[len] = conf.name
  347. -- len = len + 1
  348. -- desc[len] = ","
  349. -- len = len + 1
  350. -- desc[len] = conf.desc
  351. -- len = len + 1
  352. -- desc[len] = ","
  353. -- len = len + 1
  354. -- desc[len] = conf.quality
  355. -- end
  356. -- local descStr = table.concat(desc)
  357. -- return descStr
  358. local len = 0
  359. local JiBanInfo = {}
  360. for k, jbHeroInfo in pairs(jiban) do
  361. local conf = JibanExcel.jiban[k]
  362. len = len + 1
  363. JiBanInfo[len] = {
  364. name = conf.name,
  365. desc = conf.desc,
  366. quality = conf.quality,
  367. hero = conf.hero,
  368. }
  369. if next(jbHeroInfo) then
  370. JiBanInfo[len].jbHeroInfo = {}
  371. local info = JiBanInfo[len].jbHeroInfo
  372. for jbHeroId, data in pairs(jbHeroInfo) do
  373. info[jbHeroId] = data
  374. end
  375. end
  376. end
  377. return Json.Encode(JiBanInfo)
  378. end
  379. function setBeSkill(objList,jiban)
  380. if not jiban then return end
  381. local skillList = {}
  382. for k in pairs(jiban) do
  383. local conf = JibanExcel.jiban[k]
  384. local skillID = conf.skill
  385. if skillID > 0 then
  386. for i = 1,CombatDefine.COMBAT_HERO_CNT - 1 do
  387. local obj = objList[i]
  388. if obj then
  389. BeSkill.setBeSkillID(obj,skillID)
  390. end
  391. end
  392. end
  393. end
  394. end
  395. function update(human,combatType,jibanListStr)
  396. local conf = CombatExcel.combat[combatType]
  397. if not conf then return end
  398. local posList = getPosList(human)
  399. local jibanList = Util.split(jibanListStr,",")
  400. local combatHeroDB = CombatPosLogic.getCombatHeroDB(human,combatType)
  401. for k,v in ipairs(jibanList) do
  402. local uuid = v or "0"
  403. if uuid ~= "" and uuid ~= "0" then
  404. --检测有没有再阵容上
  405. for _, combatUuid in ipairs(combatHeroDB.list) do
  406. if uuid == combatUuid then return end
  407. end
  408. if not posList[k] then return end
  409. local heroGrid = HeroLogic.getHeroGridByUuid(human, uuid)
  410. if not heroGrid then return end
  411. setDB_JibanHeroID(human, k, heroGrid.id)
  412. end
  413. end
  414. combatHeroDB.jiban = jibanList
  415. GuideLogic.setDoSpecialGuide(human, GuideLogic.SKIPTYPE_JUMP_JIBAN_GROUP)
  416. sendQuery(human,combatType, conf.teamType)
  417. end