UnionWarDBLogic.lua 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486
  1. local Config = require("Config")
  2. local LuaMongo = _G.lua_mongo
  3. local DB = require("common.DB")
  4. local Util = require("common.Util")
  5. local CommonDB = require("common.CommonDB")
  6. local MiddleManager = require("middle.MiddleManager")
  7. local InnerMsg = require("core.InnerMsg")
  8. local CombatLogic = require("combat.CombatLogic")
  9. local UnionWarLogic = require("union.UnionWarLogic")
  10. local RobotExcel = require("excel.unionWar").robot
  11. local UnionWarExcel = require("excel.unionWar")
  12. local CombatDefine = require("combat.CombatDefine")
  13. local RoleDefine = require("role.RoleDefine")
  14. db = db or {upTime = nil,status = nil,unionList = {},log = {},localData = {}}
  15. UNION_WAR_UPDATE_TIME = nil
  16. local QueryByUuid = {}
  17. local VideoQueryCond = {}
  18. local UNIONWAR_UUID = "UNION_WAR"
  19. function init()
  20. QueryByUuid.uuid = UNIONWAR_UUID
  21. LuaMongo.find(DB.db_union_war,QueryByUuid)
  22. if not LuaMongo.next(db) then
  23. clDB()
  24. end
  25. end
  26. function updateDB()
  27. QueryByUuid.uuid = UNIONWAR_UUID
  28. LuaMongo.update(DB.db_union_war, QueryByUuid, db)
  29. end
  30. function getDB()
  31. return db
  32. end
  33. function clDB()
  34. LuaMongo.remove(DB.db_union_war)
  35. LuaMongo.remove(DB.db_union_war_record)
  36. db = db or {localData = {}}
  37. db._id = nil
  38. db.isMatch = nil
  39. db.matchList = nil
  40. db.log = {}
  41. db.unionList = {}
  42. db.uuid = UNIONWAR_UUID
  43. LuaMongo.insert(DB.db_union_war, db)
  44. end
  45. function getLocalData()
  46. return db.localData
  47. end
  48. function addUnion(fd,msg)
  49. local svrIndex = MiddleManager.FD_2_SVRINDEX[fd]
  50. print(" midd addUnion ", svrIndex)
  51. local len = #db.unionList
  52. for k,v in ipairs(msg.list) do
  53. len = len + 1
  54. db.unionList[len] = Util.copyTable(v)
  55. db.unionList[len].svrIndex = svrIndex
  56. db.unionList[len].log = {}
  57. db.unionList[len].star = 0
  58. db.unionList[len].jifen = 0
  59. db.unionList[len].combat = {}
  60. db.unionList[len].video = {}
  61. end
  62. --updateDB()
  63. end
  64. function dismissUnion(uuid)
  65. if db.localData and db.localData[uuid] then
  66. db.localData[uuid] = nil
  67. end
  68. end
  69. function addUnionMember(fd,msg)
  70. print(" !!!!!!!!!! !addUnionMember !!!!!!!!!!")
  71. local unionUuid = msg.unionUuid
  72. local union
  73. local len = #db.unionList
  74. for i = len ,1 ,-1 do
  75. if db.unionList[i].unionUuid == unionUuid then
  76. union = db.unionList[i]
  77. break
  78. end
  79. end
  80. if union then
  81. local member
  82. for k,v in ipairs(msg.list) do
  83. union.member[v[1]] = 1
  84. member = Util.copyTable(v[2])
  85. member.uuid = v[1]
  86. LuaMongo.insert(DB.db_union_war, member)
  87. end
  88. if msg.isEnd and msg.isEnd == 1 then
  89. -- updateDB()
  90. end
  91. end
  92. end
  93. local function randomMonsterOutID(monsterOutIDList, index)
  94. local newID
  95. newID = index > 1 and monsterOutIDList[index - 1] or monsterOutIDList[index + 1]
  96. if newID and newID > 0 then
  97. return newID
  98. end
  99. return math.random(10001, 10010)
  100. end
  101. local function addRobot(data1,data2)
  102. local cnt1 = data2.memberCnt + 1
  103. local cnt2 = data1.memberCnt
  104. local monsterOutIDList = {}
  105. local thisMember
  106. for k in pairs(data1.member) do
  107. thisMember = getMember(k)
  108. monsterOutIDList[thisMember.index] = thisMember.battleMonsterOutID
  109. end
  110. local member = {}
  111. for i = cnt1,cnt2 do
  112. local monsterOutID = monsterOutIDList[i]
  113. if not monsterOutID then
  114. monsterOutID = randomMonsterOutID(monsterOutIDList, i)
  115. end
  116. local objList, helpList, rolebase,formation = CombatLogic.getMonsterObjList(monsterOutID)
  117. data2.member[data2.unionUuid .. i] = 1
  118. member = {}
  119. member.uuid = data2.unionUuid .. i
  120. member.index = i
  121. member.monsterOutID = monsterOutID
  122. member.objList = objList
  123. member.helpList = helpList
  124. member.formation = formation
  125. member.rolebase = rolebase
  126. member.name = RobotExcel[i].name
  127. member.attackStar = 0
  128. member.defendStar = 3
  129. member.attackCnt = 0
  130. member.defendCnt = 0
  131. member.log = {}
  132. LuaMongo.insert(DB.db_union_war, member)
  133. end
  134. end
  135. local function addRobotByGm(data1,data2)
  136. local monsterOutID = 1101
  137. local cnt1 = data2.memberCnt + 1
  138. local cnt2 = data1.memberCnt + 1
  139. for i = cnt1, 20 do
  140. local objList, helpList, rolebase,formation = CombatLogic.getMonsterObjList(monsterOutID)
  141. rolebase.uuid = data2.unionUuid .. i
  142. data2.member[data2.unionUuid .. i] = {index = i,monsterOutID = monsterOutID,objList = objList,helpList = helpList,formation = formation,rolebase = rolebase,name = RobotExcel[i].name, attackStar = 0,defendStar = 3,attackCnt = 0,defendCnt = 0,isRobot = 1,log = {}}
  143. end
  144. for i = cnt2, 20 do
  145. local objList, helpList, rolebase,formation = CombatLogic.getMonsterObjList(monsterOutID)
  146. rolebase.uuid = data1.unionUuid .. i
  147. data1.member[data1.unionUuid .. i] = {index = i,monsterOutID = monsterOutID,objList = objList,helpList = helpList,formation = formation,rolebase = rolebase,name = RobotExcel[i].name, attackStar = 0,defendStar = 3,attackCnt = 0,defendCnt = 0,isRobot = 1,log = {}}
  148. end
  149. end
  150. function match()
  151. if db.isMatch then
  152. return
  153. end
  154. table.sort(db.unionList,function(a,b)
  155. return a.zhandouli > b.zhandouli
  156. end )
  157. local tmp = {}
  158. local matchData = {}
  159. -- 匹配非本服对手
  160. for i = 1,#db.unionList do
  161. local data1 = db.unionList[i]
  162. if not data1.targetID then
  163. for j = i+1,#db.unionList do
  164. local data2 = db.unionList[j]
  165. if data1.svrIndex ~= data2.svrIndex and not data2.targetID then
  166. --if not data2.targetID then
  167. data1.targetID,data2.targetID = data2.unionUuid,data1.unionUuid
  168. if data1.memberCnt > data2.memberCnt then
  169. addRobot(data1,data2)
  170. elseif data1.memberCnt < data2.memberCnt then
  171. addRobot(data2,data1)
  172. end
  173. matchData[data1.unionUuid] = data2.unionUuid
  174. matchData[data2.unionUuid] = data1.unionUuid
  175. break
  176. end
  177. end
  178. end
  179. tmp[data1.unionUuid] = data1
  180. end
  181. -- 匹配剩下的 本服对手
  182. for i = 1,#db.unionList do
  183. local data1 = db.unionList[i]
  184. if not data1.targetID then
  185. for j = i+1,#db.unionList do
  186. local data2 = db.unionList[j]
  187. --if data1.svrIndex ~= data2.svrIndex and not data2.targetID then
  188. if not data2.targetID then
  189. data1.targetID,data2.targetID = data2.unionUuid,data1.unionUuid
  190. if data1.memberCnt > data2.memberCnt then
  191. addRobot(data1,data2)
  192. elseif data1.memberCnt < data2.memberCnt then
  193. addRobot(data2,data1)
  194. end
  195. matchData[data1.unionUuid] = data2.unionUuid
  196. matchData[data2.unionUuid] = data1.unionUuid
  197. break
  198. end
  199. end
  200. end
  201. tmp[data1.unionUuid] = data1
  202. end
  203. db.unionList = tmp
  204. db.isMatch = true
  205. updateDB()
  206. matchToServer(matchData)
  207. if not db.matchList then
  208. db.matchList = {}
  209. local matchTmp = {}
  210. for k,v in pairs(db.unionList) do
  211. if not matchTmp[k] and v.targetID and db.unionList[v.targetID] then
  212. matchTmp[k] = 1
  213. matchTmp[v.targetID] = 1
  214. db.matchList[#db.matchList + 1] = {k,v.targetID}
  215. end
  216. end
  217. end
  218. end
  219. -- 降匹配成功的 公会发送给单服
  220. function matchToServer(list)
  221. local msgRet = InnerMsg.wl.WL_UNION_WAR_MATCH_FINISH
  222. msgRet.list = Util.copyTable(list)
  223. for fd, _ in pairs(MiddleManager.FD_2_SVRINDEX) do
  224. InnerMsg.sendMsg(fd, msgRet)
  225. end
  226. end
  227. function getMember(uuid)
  228. local data = {}
  229. QueryByUuid.uuid = uuid
  230. LuaMongo.find(DB.db_union_war,QueryByUuid)
  231. if not LuaMongo.next(data) then
  232. return
  233. end
  234. return data
  235. end
  236. function updateMember(member)
  237. QueryByUuid.uuid = member.uuid
  238. LuaMongo.update(DB.db_union_war, QueryByUuid, member)
  239. end
  240. function addBuffLvByGm(unionUuid)
  241. local attackUnion = db.unionList[unionUuid]
  242. attackUnion.buffLv = attackUnion.buffLv or 0
  243. attackUnion.buffLv = attackUnion.buffLv + 1
  244. end
  245. -- 保存战斗记录
  246. function setWarRecord(tb)
  247. LuaMongo.insert(DB.db_union_war_record, tb)
  248. end
  249. local QueryUionRecordByUuid = {} --按uuid查询
  250. local QueryUionRecord = { atkUuid = nil, time = nil }
  251. function queryRecord(atkUuid, time)
  252. QueryUionRecord.atkUuid = atkUuid
  253. QueryUionRecord.upTime = time
  254. local data = {}
  255. LuaMongo.find(DB.db_union_war_record, QueryUionRecord)
  256. if not LuaMongo.next(data) then
  257. return nil
  258. end
  259. return data, data._id
  260. end
  261. function getRecordDB(uuid)
  262. QueryUionRecordByUuid._id = uuid
  263. local data = {}
  264. LuaMongo.find(DB.db_union_war_record, QueryUionRecordByUuid)
  265. return LuaMongo.next(data) and data, nil
  266. end
  267. --战斗结束回调
  268. --增加挑战次数,解锁防守对象,添加挑战日志,调整星数,积分,保存防守录像
  269. function onFightEnd(msg)
  270. local attackUnion = db.unionList[msg.unionUuid]
  271. local defendUnion = db.unionList[attackUnion.targetID]
  272. local result = msg.combatInfo.isWin
  273. local attackUuid = msg.uuid
  274. local attacker = getMember(attackUuid)
  275. local combat = attackUnion.combat[attackUuid]
  276. if not combat then
  277. return
  278. end
  279. local defendUuid = combat[1]
  280. local defender = getMember(defendUuid)
  281. local diff = combat[2]
  282. local robotConf = RobotExcel[defender.index]
  283. local isFeixu = defender.defendStar <= 0
  284. local rate,star,jifen = UnionWarLogic.getDiff(robotConf,diff,defender.monsterOutID, isFeixu)
  285. attackUnion.combat[attackUuid] = nil
  286. local now = os.time()
  287. local tb = {}
  288. tb.upTime = now
  289. tb.attackUuid = attackUuid
  290. tb.defUud = defendUuid
  291. tb.diff = diff
  292. tb.combatInfo = Util.copyTable(msg.combatInfo)
  293. setWarRecord(tb)
  294. local recordIndex = tb._id
  295. db.log[#db.log + 1] = {now,result,msg.unionUuid,attackUnion.targetID,attackUuid,defendUuid,star,jifen, msg.combatInfo.atkFormation , recordIndex}
  296. table.insert(attackUnion.log,1,#db.log)
  297. if #attackUnion.log > 150 then
  298. attackUnion.log[#attackUnion.log] = nil
  299. end
  300. table.insert(defendUnion.log,1,#db.log)
  301. if #defendUnion.log > 150 then
  302. defendUnion.log[#defendUnion.log] = nil
  303. end
  304. attacker.attackCnt = attacker.attackCnt + 1
  305. if msg.combatInfo.isWin then
  306. local oldOldStar = defender.defendStar
  307. star = star < oldOldStar and star or oldOldStar
  308. if star > oldOldStar then star = oldOldStar end
  309. attackUnion.star = attackUnion.star + star
  310. attackUnion.starUpTime = now
  311. defender.defendStar = defender.defendStar - star
  312. attacker.attackStar = attacker.attackStar + star
  313. attacker.jifen = attacker.jifen + jifen
  314. attackUnion.jifen = attackUnion.jifen + jifen
  315. db.log[#db.log][#db.log[#db.log] + 1 ] = attacker.attackStar
  316. if oldOldStar == 0 and isFeixu then
  317. attackUnion.buffLv = attackUnion.buffLv or 0
  318. if attackUnion.buffLv < #UnionWarExcel.buff then
  319. attackUnion.buffLv = attackUnion.buffLv + 1
  320. end
  321. defender.loseBuff = defender.loseBuff or 0
  322. defender.loseBuff = defender.loseBuff + 1
  323. -- 日志里 记录 攻击方 攻打废墟后 buffLV
  324. db.log[#db.log][12] = attackUnion.buffLv
  325. end
  326. attacker.winLog = attacker.winLog or {}
  327. table.insert(attacker.winLog,1,#db.log)
  328. if #attacker.winLog > 20 then
  329. attacker.winLog[#attacker.winLog] = nil
  330. end
  331. defender.winLog = defender.winLog or {}
  332. table.insert(defender.winLog,1,#db.log)
  333. if #defender.winLog > 20 then
  334. defender.winLog[#defender.winLog] = nil
  335. end
  336. else
  337. defender.defendCnt = defender.defendCnt + 1
  338. end
  339. table.insert(defender.log,1,recordIndex)
  340. if #defender.log > 3 then
  341. defender.log[#defender.log] = nil
  342. end
  343. updateDB()
  344. updateMember(attacker)
  345. updateMember(defender)
  346. return attackUnion,defender,attacker.attackCnt,isFeixu, star, diff
  347. end
  348. function getMatchList()
  349. if not db.matchList then
  350. if not db.isMatch then
  351. return
  352. end
  353. db.matchList = {}
  354. local tmp = {}
  355. for k,v in pairs(db.unionList) do
  356. if not tmp[k] and v.targetID and db.unionList[v.targetID] then
  357. tmp[k] = 1
  358. tmp[v.targetID] = 1
  359. db.matchList[#db.matchList + 1] = {k,v.targetID}
  360. end
  361. end
  362. end
  363. return db.matchList,db
  364. end
  365. function actFinish()
  366. print(" union war ! actFinish actFinish !!!!!!! ")
  367. local sortList = {}
  368. local finishList = {}
  369. for k,v in pairs(db.unionList) do
  370. if not finishList[k] then -- 防止重复 判定 同样的星级 0 0 时间下 俩个公会都会胜利
  371. local target = db.unionList[v.targetID]
  372. if target then
  373. local isWin = 1 -- 胜利
  374. local bWin = 2 -- 失败
  375. if target.star > v.star then
  376. isWin = 2
  377. bWin = 1
  378. elseif target.star == v.star then
  379. local aTime = v.starUpTime or 0
  380. local bTime = target.starUpTime or 0
  381. if bTime > 0 and bTime < aTime then
  382. isWin = 2
  383. bWin = 1
  384. end
  385. end
  386. finishList[k] = true
  387. finishList[v.targetID] = true
  388. sortList[#sortList + 1] = {k,v.star,isWin,v.svrIndex}
  389. sortList[#sortList + 1] = {v.targetID,target.star, bWin,target.svrIndex}
  390. end
  391. end
  392. end
  393. table.sort(sortList,function(a,b)
  394. return a[2] > b[2]
  395. end)
  396. local msgRet = InnerMsg.wl.WL_UNION_WAR_ACTFINISH
  397. msgRet.list = sortList
  398. for fd in pairs(MiddleManager.FD_2_SVRINDEX) do
  399. InnerMsg.sendMsg(fd, msgRet)
  400. end
  401. updateDB()
  402. end
  403. --跨服整点逻辑(确定,匹配,结算)
  404. function onHour(hour, isGm)
  405. if not Config.IS_MIDDLE then return end
  406. local state = UnionWarLogic.getState()
  407. if state == UnionWarLogic.STATE0 then
  408. return
  409. end
  410. if not (db.status and Util.isSameDay(db.upTime)) then
  411. if hour < UnionWarLogic.HOUR1[1] then
  412. db.status = 0
  413. elseif hour < UnionWarLogic.HOUR2[1] then
  414. db.status = 1
  415. elseif hour < UnionWarLogic.HOUR4[1] then
  416. db.status = 2
  417. else
  418. db.status = 4
  419. end
  420. db.upTime = os.time()
  421. updateDB()
  422. end
  423. -- 防止 指定整点 逻辑没有过
  424. if hour == UnionWarLogic.HOUR1[1] or (hour > UnionWarLogic.HOUR1[1] and db.status < 1) then
  425. clDB()
  426. db.upTime = os.time()
  427. db.status = 1
  428. local msgRet = InnerMsg.wl.WL_UNION_WAR_REFRESH
  429. for fd in pairs(MiddleManager.FD_2_SVRINDEX) do
  430. InnerMsg.sendMsg(fd, msgRet)
  431. end
  432. elseif hour >= UnionWarLogic.HOUR2[1] and db.status < 2 then
  433. db.upTime = os.time()
  434. db.status = 2
  435. match()
  436. elseif hour >= UnionWarLogic.HOUR4[1] and db.status < 4 then
  437. db.upTime = os.time()
  438. db.status = 4
  439. actFinish()
  440. end
  441. end