WarReportLogic.lua 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482
  1. -------------------------------------------------------
  2. -- ս��
  3. --
  4. -------------------------------------------------------
  5. local LuaMongo = _G.lua_mongo
  6. local Util = require("common.Util")
  7. local Lang = require("common.Lang")
  8. local Msg = require("core.Msg")
  9. local ObjHuman = require("core.ObjHuman")
  10. local Grid = require("bag.Grid")
  11. local BagLogic = require("bag.BagLogic")
  12. local Broadcast = require("broadcast.Broadcast")
  13. local HeroLogic = require("hero.HeroLogic")
  14. local RoleLogic = require("role.RoleLogic")
  15. local CombatDefine = require("combat.CombatDefine")
  16. local HeroGrid = require("hero.HeroGrid")
  17. local CombatExcel = require("excel.combat").combat
  18. local CombatLogic = require("combat.CombatLogic")
  19. local InnerMsg = require("core.InnerMsg")
  20. local ChatHandler = require("chat.Handler")
  21. local Broadcast = require("broadcast.Broadcast")
  22. local Json = require("common.Json")
  23. local DB = require("common.DB")
  24. local ChatLogic = require("chat.ChatLogic")
  25. local WarReportMiddle = require("warReport.WarReportMiddle")
  26. local RoleSystemLogic = require("roleSystem.RoleSystemLogic")
  27. local RoleSystemDefine = require("roleSystem.RoleSystemDefine")
  28. local ItemDefine = require("bag.ItemDefine")
  29. local HeroGrowUp = require("absAct.HeroGrowUp")
  30. WAR_REPORT_1 = 1 -- �ھ�����
  31. WAR_REPORT_2 = 2 -- ��������
  32. WAR_REPORT_3 = 3 -- ����
  33. WAR_REPORT_4 = 4 -- �д�
  34. WAR_COUNT_MAX = 30
  35. WAR_COUNT_MAX1 = 20
  36. WAR_JJC_RANK = 20
  37. WAR_FRIEND_RANK = 30
  38. WAR_ADMIRE = 3 -- ���޴���
  39. WAR_COMBATINFO_PLAYBACK = 1 -- ����ս���������ڻط�
  40. WAR_COMBATINFO_HARM = 2 -- ����ս�����������˺��б�
  41. WAR_OP_CONFIRM = 1 --ȷ��
  42. WAR_OP_CANCEL = 0 --ȡ��
  43. WAP_OP_TYPE1 = 1 --����
  44. WAP_OP_TYPE2 = 2 --�ղ�
  45. WAP_REWARD_GOD = 3000
  46. local war_report_count = {
  47. [WAR_REPORT_1] = 1,
  48. [WAR_REPORT_2] = 1,
  49. [WAR_REPORT_3] = 1,
  50. [WAR_REPORT_4] = 1,
  51. }
  52. local function makeReportNet(net, war_data)
  53. net.atkRole = war_data.combatInfo.attacker
  54. net.defRole = war_data.combatInfo.defender
  55. net.atkHeros = {}
  56. net.defHeros = {}
  57. net.time = war_data.time
  58. net.type = war_data.type
  59. net.admire = war_data.admire or 0
  60. net.collect = war_data.collect or 0
  61. net.atkRank = war_data.atkRank or 0
  62. net.defRank = war_data.defRank or 0
  63. net.id = war_data._id
  64. net.type = war_data.type
  65. net.admireList = war_data.admireList
  66. local combatInfo = war_data.combatInfo
  67. local result = combatInfo.result
  68. local frameCnt = result.frames and #result.frames or 0
  69. local lastFrame = result.frames and result.frames[frameCnt] or nil
  70. net.result = combatInfo.isWin and 1 or 2
  71. net.round = lastFrame and lastFrame.round or 0
  72. net.roundMax = combatInfo.maxRound
  73. for i = 1,CombatDefine.COMBAT_HERO_CNT do
  74. local atkPos = CombatLogic.getPos(CombatDefine.ATTACK_SIDE, i)
  75. local atkObj = combatInfo.objList[atkPos]
  76. net.atkHeros[i] = {}
  77. if atkObj then
  78. net.atkHeros[i].id = atkObj.id
  79. net.atkHeros[i].lv = atkObj.lv
  80. net.atkHeros[i].star = atkObj.star
  81. else
  82. net.atkHeros[i].id = 0
  83. end
  84. local defPos = CombatLogic.getPos(CombatDefine.DEFEND_SIDE, i)
  85. local defObj = combatInfo.objList[defPos]
  86. net.defHeros[i] = {}
  87. if defObj then
  88. net.defHeros[i].id = defObj.id
  89. net.defHeros[i].lv = defObj.lv
  90. net.defHeros[i].star = defObj.star
  91. else
  92. net.defHeros[i].id = 0
  93. end
  94. end
  95. net.atkFormation = combatInfo.atkFormation
  96. net.defFormation = combatInfo.defFormation
  97. end
  98. function initAfterStart()
  99. -- ���������
  100. if _G.is_middle ~= true then
  101. --return
  102. end
  103. -- ���Ӽ�¼����
  104. local war_count_data = {}
  105. local war_count_query = { war = 1 }
  106. LuaMongo.find(DB.db_war_report, war_count_query)
  107. if LuaMongo.next(war_count_data) then
  108. return
  109. end
  110. local warReport = {}
  111. warReport.war = 1
  112. warReport.war_report_count = war_report_count
  113. LuaMongo.insert(DB.db_war_report, warReport)
  114. end
  115. -- db_war_report
  116. -- ���Ӽ�¼ ���м�¼�����ķ�
  117. function add(type, combatInfo, atkRank, defRank)
  118. -- �Ż�֡���� ����
  119. CombatLogic.killFrames(combatInfo)
  120. if not _G.is_middle then
  121. WarReportMiddle.LW_WARREPORT_ADD(type, combatInfo, atkRank, defRank)
  122. return
  123. end
  124. local msgInner = InnerMsg.lw.LW_WARREPORT_ADD
  125. msgInner.type = type
  126. msgInner.combatInfo = combatInfo
  127. msgInner.atkRank = atkRank
  128. msgInner.defRank = defRank
  129. InnerMsg.sendMsg(0, msgInner)
  130. end
  131. -- ��ѯ
  132. function query(human, type, questType)
  133. if RoleSystemLogic.isOpen(human, RoleSystemDefine.ROLE_SYS_ID_202) ~= true then
  134. return
  135. end
  136. -- �������������ķ� ���� �����ղ� ��ȥ���ķ�������
  137. --[[local msgInner = InnerMsg.lw.LW_WARREPORT_QUERY
  138. local msgInner = {}
  139. msgInner.uuid = human.db._id
  140. msgInner.type = type
  141. msgInner.questType = questType
  142. msgInner.warReport = human.db.warReport
  143. InnerMsg.sendMsg(0, msgInner)]]
  144. WarReportMiddle.LW_WARREPORT_QUERY(0,type,human.db._id,human.db.warReport,questType)
  145. human.db.warDot = nil
  146. RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_202)
  147. end
  148. -- ���ս���б�
  149. local makeReportQuery = {war_index = { ["$exists"] = 1}}
  150. function makeReport(type)
  151. local len = 0
  152. makeReportQuery.type = type
  153. LuaMongo.find(DB.db_war_report, makeReportQuery)
  154. local war_data_list = {}
  155. while true do
  156. local war_data = {}
  157. if not LuaMongo.next(war_data) then
  158. break
  159. end
  160. if len >= WAR_COUNT_MAX then
  161. break
  162. end
  163. len = len + 1
  164. war_data_list[len] = {}
  165. local net = war_data_list[len]
  166. makeReportNet(net, war_data)
  167. end
  168. return war_data_list
  169. end
  170. -- ����ղ�
  171. local makeCollectReportQuery = {_id = nil}
  172. function makeCollectReport(collect)
  173. local war_data_list = {}
  174. local len = 0
  175. for _, list in pairs(collect) do
  176. for _id , v in pairs(list) do
  177. makeCollectReportQuery._id = _id
  178. LuaMongo.find(DB.db_war_report, makeCollectReportQuery)
  179. local war_data = {}
  180. if LuaMongo.next(war_data) then
  181. if len >= WAR_COUNT_MAX then
  182. break
  183. end
  184. len = len + 1
  185. war_data_list[len] = {}
  186. local net = war_data_list[len]
  187. makeReportNet(net, war_data)
  188. end
  189. end
  190. end
  191. return war_data_list
  192. end
  193. -- ����ҵ�ս��
  194. local makeMyReportQuery = {}
  195. function makeMyReport(uuid)
  196. local len = 0
  197. makeMyReportQuery = {["$or"] = {{defUuid=uuid}, {atkUuid=uuid}}}
  198. LuaMongo.find(DB.db_war_report, makeMyReportQuery)
  199. local war_data_list = {}
  200. while true do
  201. local war_data = {}
  202. if not LuaMongo.next(war_data) then
  203. break
  204. end
  205. if len >= WAR_COUNT_MAX then
  206. break
  207. end
  208. len = len + 1
  209. war_data_list[len] = {}
  210. local net = war_data_list[len]
  211. makeReportNet(net, war_data)
  212. end
  213. return war_data_list
  214. end
  215. -- ����ս���б�
  216. local heroOther = {}
  217. function sendReport(human, war_data_list, questType)
  218. local len = #war_data_list
  219. local msgRet = Msg.gc.GC_WAR_REPORT_QUERY
  220. msgRet.admireCnt = human.db.warAdmire or 0
  221. msgRet.admireMax = WAR_ADMIRE
  222. msgRet.questType = questType
  223. msgRet.isEnd = 0
  224. local sendLen = 0
  225. -- ˢ���ղ�
  226. if questType == WAP_OP_TYPE2 then
  227. human.db.warReport = {}
  228. end
  229. local warReport = human.db.warReport
  230. for i = 1, len do
  231. sendLen = sendLen + 1
  232. local net = msgRet.warReportList[sendLen]
  233. local war = war_data_list[i]
  234. local heroLen = 0
  235. net.round = war.round
  236. net.roundMax = war.roundMax
  237. net.atkFormation = war.atkFormation
  238. net.defFormation = war.defFormation or 0
  239. net.time = war.time
  240. net.admire = war.admire
  241. net.collect = war.collect
  242. net.atkRank = war.atkRank
  243. net.defRank = war.defRank
  244. RoleLogic.makeRoleBase(war.atkRole, net.atkRole)
  245. RoleLogic.makeRoleBase(war.defRole, net.defRole)
  246. net.result = war.result
  247. net.type = war.type
  248. net.id = war.id
  249. net.isCollect = 0
  250. net.isAdmire = 0
  251. -- �����ղ��б�
  252. if questType == WAP_OP_TYPE2 then
  253. warReport[net.type] = warReport[net.type] or {}
  254. warReport[net.type][net.id] = 1
  255. end
  256. -- �Ƿ��ѵ���
  257. if war.admireList and war.admireList[human.db._id] then
  258. net.isAdmire = 1
  259. end
  260. -- �Ƿ����ղ�
  261. for _, list in pairs(warReport) do
  262. if list[net.id] then
  263. net.isCollect = 1
  264. break
  265. end
  266. end
  267. heroLen = 0
  268. for k, v in pairs(war.atkHeros) do
  269. if v.id ~= 0 then
  270. heroLen = heroLen + 1
  271. heroOther.lv = v.lv or 0
  272. heroOther.star = v.star or 0
  273. HeroGrid.makeHeroOrMonster(net.atkHeros[heroLen], v.id, nil, heroOther)
  274. end
  275. end
  276. net.atkHeros[0] = heroLen
  277. heroLen = 0
  278. for k, v in pairs(war.defHeros) do
  279. if v.id ~= 0 then
  280. heroLen = heroLen + 1
  281. heroOther.lv = v.lv or 0
  282. heroOther.star = v.star or 0
  283. HeroGrid.makeHeroOrMonster(net.defHeros[heroLen], v.id, nil, heroOther)
  284. end
  285. end
  286. net.defHeros[0] = heroLen
  287. msgRet.isEnd = 0
  288. if sendLen >= 5 then
  289. msgRet.warReportList[0] = sendLen
  290. Msg.send(msgRet, human.fd)
  291. sendLen = 0
  292. end
  293. end
  294. msgRet.warReportList[0] = sendLen
  295. msgRet.isEnd = 1
  296. Msg.send(msgRet, human.fd)
  297. end
  298. -- �˺���¼
  299. function harm(human, type, id)
  300. -- �������������ķ�
  301. local msgInner = {} --InnerMsg.lw.LW_WARREPORT_GET_COMBATINFO
  302. msgInner.uuid = human.db._id
  303. msgInner.type = type
  304. msgInner.id = id
  305. msgInner.mode = WAR_COMBATINFO_HARM
  306. --InnerMsg.sendMsg(0, msgInner)
  307. WarReportMiddle.LW_WARREPORT_GET_COMBATINFO(0,msgInner)
  308. end
  309. -- ս�����
  310. function sendFinish(human, combatInfo)
  311. if not combatInfo then return end
  312. local msgRet = Msg.gc.GC_WAR_REPROT_HARM
  313. if not CombatLogic.fontCombatFinish(msgRet.data, combatInfo) then
  314. return
  315. end
  316. Msg.send(msgRet,human.fd)
  317. end
  318. -- �ط�
  319. function playBack(human, type, id)
  320. -- �������������ķ�
  321. local msgInner = {} --InnerMsg.lw.LW_WARREPORT_GET_COMBATINFO
  322. msgInner.uuid = human.db._id
  323. msgInner.type = type
  324. msgInner.id = id
  325. msgInner.mode = WAR_COMBATINFO_PLAYBACK
  326. --InnerMsg.sendMsg(0, msgInner)
  327. WarReportMiddle.LW_WARREPORT_GET_COMBATINFO(0,msgInner)
  328. end
  329. -- �������
  330. function opResult(human, opType, id, result)
  331. local msgRet = Msg.gc.GC_WAR_REPORT_OP_RESULT
  332. msgRet.opType = opType
  333. msgRet.result = result
  334. msgRet.id = id
  335. Msg.send(msgRet,human.fd)
  336. end
  337. -- �ղ�
  338. function collect(human, type, id, op)
  339. if op ~= WAR_OP_CONFIRM and op ~= WAR_OP_CANCEL then
  340. return
  341. end
  342. local warReport = human.db.warReport
  343. if op == WAR_OP_CONFIRM then
  344. -- �Ѿ����ղ��б�
  345. if warReport[type] and warReport[type][id] then
  346. return
  347. end
  348. -- �ղ�����
  349. local collectCnt = 0
  350. for k, v in pairs(warReport) do
  351. for _, data in pairs(v) do
  352. collectCnt = collectCnt + 1
  353. end
  354. end
  355. if collectCnt >= WAR_COUNT_MAX1 then
  356. return Broadcast.sendErr(human, Lang.WAR_REPORT_COLLECT_CNT_ERR)
  357. end
  358. elseif op == WAR_OP_CANCEL then
  359. if not warReport[type] or not warReport[type][id] then
  360. return
  361. end
  362. end
  363. local msgInner = {} --InnerMsg.lw.LW_WARREPORT_COLLECT
  364. msgInner.uuid = human.db._id
  365. msgInner.type = type
  366. msgInner.id = id
  367. msgInner.op = op
  368. --InnerMsg.sendMsg(0, msgInner)
  369. WarReportMiddle.LW_WARREPORT_COLLECT(0,msgInner)
  370. end
  371. -- �ղػ���
  372. function collectHumanDo(human, type, id, op)
  373. if op ~= WAR_OP_CONFIRM and op ~= WAR_OP_CANCEL then
  374. return
  375. end
  376. local warReport = human.db.warReport
  377. warReport[type] = warReport[type] or {}
  378. if op == WAR_OP_CONFIRM then
  379. warReport[type][id] = 1
  380. elseif op == WAR_OP_CANCEL then
  381. warReport[type][id] = nil
  382. end
  383. opResult(human, WAP_OP_TYPE2, id, op)
  384. end
  385. -- ����
  386. function admire(human, type, id)
  387. if human.db.warAdmire == nil then
  388. return Broadcast.sendErr(human, Lang.WAR_REPORT_ADMIRE_NOT_ENOUGH)
  389. end
  390. human.db.warAdmire = human.db.warAdmire - 1
  391. if human.db.warAdmire <= 0 then
  392. human.db.warAdmire = nil
  393. end
  394. HeroGrowUp.onCallback(human, HeroGrowUp.TASKTYPE6, 1)
  395. local msgInner = {} --InnerMsg.lw.LW_WARREPORT_ADMIRE
  396. msgInner.uuid = human.db._id
  397. msgInner.id = id
  398. --InnerMsg.sendMsg(0, msgInner)
  399. WarReportMiddle.LW_WARREPORT_ADMIRE(0,msgInner)
  400. end
  401. -- ���޻���
  402. function admireDo(human, id)
  403. BagLogic.cleanMomentItemList()
  404. BagLogic.updateMomentItem(BagLogic.ADDITEM_TYPE_1, ItemDefine.ITEM_JINBI_ID, WAP_REWARD_GOD)
  405. BagLogic.addMomentItemList(human, "war_report")
  406. opResult(human, WAP_OP_TYPE1, id, WAR_OP_CONFIRM)
  407. end
  408. --
  409. function updateDaily(human)
  410. human.db.warAdmire = human.db.warAdmire or WAR_ADMIRE
  411. human.db.warDot = true
  412. end
  413. function isDot(human)
  414. return human.db.warDot
  415. end