WarReportLogic.lua 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477
  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. LuaMongo.find(DB.db_war_report, war_count_query)
  106. if LuaMongo.next(war_count_data) then
  107. return
  108. end
  109. local warReport = {}
  110. warReport.war = 1
  111. warReport.war_report_count = war_report_count
  112. LuaMongo.insert(DB.db_war_report, warReport)
  113. end
  114. -- db_war_report
  115. -- ���Ӽ�¼ ���м�¼�����ķ�
  116. function add(type, combatInfo, atkRank, defRank)
  117. -- �Ż�֡���� ����
  118. CombatLogic.killFrames(combatInfo)
  119. if _G.is_middle == true then
  120. WarReportMiddle.LW_WARREPORT_ADD(type, combatInfo, atkRank, defRank)
  121. return
  122. end
  123. local msgInner = InnerMsg.lw.LW_WARREPORT_ADD
  124. msgInner.type = type
  125. msgInner.combatInfo = combatInfo
  126. msgInner.atkRank = atkRank
  127. msgInner.defRank = defRank
  128. InnerMsg.sendMsg(0, msgInner)
  129. end
  130. -- ��ѯ
  131. function query(human, type, questType)
  132. if RoleSystemLogic.isOpen(human, RoleSystemDefine.ROLE_SYS_ID_202) ~= true then
  133. return
  134. end
  135. -- �������������ķ� ���� �����ղ� ��ȥ���ķ�������
  136. --[[local msgInner = InnerMsg.lw.LW_WARREPORT_QUERY
  137. local msgInner = {}
  138. msgInner.uuid = human.db._id
  139. msgInner.type = type
  140. msgInner.questType = questType
  141. msgInner.warReport = human.db.warReport
  142. InnerMsg.sendMsg(0, msgInner)]]
  143. WarReportMiddle.LW_WARREPORT_QUERY(_,type,human.db._id,human.db.warReport,questType)
  144. human.db.warDot = nil
  145. RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_202)
  146. end
  147. -- ���ս���б�
  148. local makeReportQuery = {war_index = { ["$exists"] = 1}}
  149. function makeReport(type)
  150. local len = 0
  151. makeReportQuery.type = type
  152. LuaMongo.find(DB.db_war_report, makeReportQuery)
  153. local war_data_list = {}
  154. while true do
  155. local war_data = {}
  156. if not LuaMongo.next(war_data) then
  157. break
  158. end
  159. if len >= WAR_COUNT_MAX then
  160. break
  161. end
  162. len = len + 1
  163. war_data_list[len] = {}
  164. local net = war_data_list[len]
  165. makeReportNet(net, war_data)
  166. end
  167. return war_data_list
  168. end
  169. -- ����ղ�
  170. local makeCollectReportQuery = {_id = nil}
  171. function makeCollectReport(collect)
  172. local war_data_list = {}
  173. local len = 0
  174. for _, list in pairs(collect) do
  175. for _id , v in pairs(list) do
  176. makeCollectReportQuery._id = _id
  177. LuaMongo.find(DB.db_war_report, makeCollectReportQuery)
  178. local war_data = {}
  179. if LuaMongo.next(war_data) then
  180. if len >= WAR_COUNT_MAX then
  181. break
  182. end
  183. len = len + 1
  184. war_data_list[len] = {}
  185. local net = war_data_list[len]
  186. makeReportNet(net, war_data)
  187. end
  188. end
  189. end
  190. return war_data_list
  191. end
  192. -- ����ҵ�ս��
  193. local makeMyReportQuery = {}
  194. function makeMyReport(uuid)
  195. local len = 0
  196. makeMyReportQuery = {["$or"] = {{defUuid=uuid}, {atkUuid=uuid}}}
  197. LuaMongo.find(DB.db_war_report, makeMyReportQuery)
  198. local war_data_list = {}
  199. while true do
  200. local war_data = {}
  201. if not LuaMongo.next(war_data) then
  202. break
  203. end
  204. if len >= WAR_COUNT_MAX then
  205. break
  206. end
  207. len = len + 1
  208. war_data_list[len] = {}
  209. local net = war_data_list[len]
  210. makeReportNet(net, war_data)
  211. end
  212. return war_data_list
  213. end
  214. -- ����ս���б�
  215. local heroOther = {}
  216. function sendReport(human, war_data_list, questType)
  217. local len = #war_data_list
  218. local msgRet = Msg.gc.GC_WAR_REPORT_QUERY
  219. msgRet.admireCnt = human.db.warAdmire or 0
  220. msgRet.admireMax = WAR_ADMIRE
  221. msgRet.questType = questType
  222. msgRet.isEnd = 0
  223. local sendLen = 0
  224. -- ˢ���ղ�
  225. if questType == WAP_OP_TYPE2 then
  226. human.db.warReport = {}
  227. end
  228. local warReport = human.db.warReport
  229. for i = 1, len do
  230. sendLen = sendLen + 1
  231. local net = msgRet.warReportList[sendLen]
  232. local war = war_data_list[i]
  233. local heroLen = 0
  234. net.round = war.round
  235. net.roundMax = war.roundMax
  236. net.atkFormation = war.atkFormation
  237. net.defFormation = war.defFormation or 0
  238. net.time = war.time
  239. net.admire = war.admire
  240. net.collect = war.collect
  241. net.atkRank = war.atkRank
  242. net.defRank = war.defRank
  243. RoleLogic.makeRoleBase(war.atkRole, net.atkRole)
  244. RoleLogic.makeRoleBase(war.defRole, net.defRole)
  245. net.result = war.result
  246. net.type = war.type
  247. net.id = war.id
  248. net.isCollect = 0
  249. net.isAdmire = 0
  250. -- �����ղ��б�
  251. if questType == WAP_OP_TYPE2 then
  252. warReport[net.type] = warReport[net.type] or {}
  253. warReport[net.type][net.id] = 1
  254. end
  255. -- �Ƿ��ѵ���
  256. if war.admireList and war.admireList[human.db._id] then
  257. net.isAdmire = 1
  258. end
  259. -- �Ƿ����ղ�
  260. for _, list in pairs(warReport) do
  261. if list[net.id] then
  262. net.isCollect = 1
  263. break
  264. end
  265. end
  266. heroLen = 0
  267. for k, v in pairs(war.atkHeros) do
  268. if v.id ~= 0 then
  269. heroLen = heroLen + 1
  270. heroOther.lv = v.lv or 0
  271. heroOther.star = v.star or 0
  272. HeroGrid.makeHeroOrMonster(net.atkHeros[heroLen], v.id, nil, heroOther)
  273. end
  274. end
  275. net.atkHeros[0] = heroLen
  276. heroLen = 0
  277. for k, v in pairs(war.defHeros) do
  278. if v.id ~= 0 then
  279. heroLen = heroLen + 1
  280. heroOther.lv = v.lv or 0
  281. heroOther.star = v.star or 0
  282. HeroGrid.makeHeroOrMonster(net.defHeros[heroLen], v.id, nil, heroOther)
  283. end
  284. end
  285. net.defHeros[0] = heroLen
  286. msgRet.isEnd = 0
  287. if sendLen >= 5 then
  288. msgRet.warReportList[0] = sendLen
  289. Msg.send(msgRet, human.fd)
  290. sendLen = 0
  291. end
  292. end
  293. msgRet.warReportList[0] = sendLen
  294. msgRet.isEnd = 1
  295. Msg.send(msgRet, human.fd)
  296. end
  297. -- �˺���¼
  298. function harm(human, type, id)
  299. -- �������������ķ�
  300. local msgInner = InnerMsg.lw.LW_WARREPORT_GET_COMBATINFO
  301. msgInner.uuid = human.db._id
  302. msgInner.type = type
  303. msgInner.id = id
  304. msgInner.mode = WAR_COMBATINFO_HARM
  305. InnerMsg.sendMsg(0, msgInner)
  306. end
  307. -- ս�����
  308. function sendFinish(human, combatInfo)
  309. if not combatInfo then return end
  310. local msgRet = Msg.gc.GC_WAR_REPROT_HARM
  311. if not CombatLogic.fontCombatFinish(msgRet.data, combatInfo) then
  312. return
  313. end
  314. Msg.send(msgRet,human.fd)
  315. end
  316. -- �ط�
  317. function playBack(human, type, id)
  318. -- �������������ķ�
  319. local msgInner = InnerMsg.lw.LW_WARREPORT_GET_COMBATINFO
  320. msgInner.uuid = human.db._id
  321. msgInner.type = type
  322. msgInner.id = id
  323. msgInner.mode = WAR_COMBATINFO_PLAYBACK
  324. InnerMsg.sendMsg(0, msgInner)
  325. end
  326. -- �������
  327. function opResult(human, opType, id, result)
  328. local msgRet = Msg.gc.GC_WAR_REPORT_OP_RESULT
  329. msgRet.opType = opType
  330. msgRet.result = result
  331. msgRet.id = id
  332. Msg.send(msgRet,human.fd)
  333. end
  334. -- �ղ�
  335. function collect(human, type, id, op)
  336. if op ~= WAR_OP_CONFIRM and op ~= WAR_OP_CANCEL then
  337. return
  338. end
  339. local warReport = human.db.warReport
  340. if op == WAR_OP_CONFIRM then
  341. -- �Ѿ����ղ��б�
  342. if warReport[type] and warReport[type][id] then
  343. return
  344. end
  345. -- �ղ�����
  346. local collectCnt = 0
  347. for k, v in pairs(warReport) do
  348. for _, data in pairs(v) do
  349. collectCnt = collectCnt + 1
  350. end
  351. end
  352. if collectCnt >= WAR_COUNT_MAX1 then
  353. return Broadcast.sendErr(human, Lang.WAR_REPORT_COLLECT_CNT_ERR)
  354. end
  355. elseif op == WAR_OP_CANCEL then
  356. if not warReport[type] or not warReport[type][id] then
  357. return
  358. end
  359. end
  360. local msgInner = InnerMsg.lw.LW_WARREPORT_COLLECT
  361. msgInner.uuid = human.db._id
  362. msgInner.type = type
  363. msgInner.id = id
  364. msgInner.op = op
  365. InnerMsg.sendMsg(0, msgInner)
  366. end
  367. -- �ղػ���
  368. function collectHumanDo(human, type, id, op)
  369. if op ~= WAR_OP_CONFIRM and op ~= WAR_OP_CANCEL then
  370. return
  371. end
  372. local warReport = human.db.warReport
  373. warReport[type] = warReport[type] or {}
  374. if op == WAR_OP_CONFIRM then
  375. warReport[type][id] = 1
  376. elseif op == WAR_OP_CANCEL then
  377. warReport[type][id] = nil
  378. end
  379. opResult(human, WAP_OP_TYPE2, id, op)
  380. end
  381. -- ����
  382. function admire(human, type, id)
  383. if human.db.warAdmire == nil then
  384. return Broadcast.sendErr(human, Lang.WAR_REPORT_ADMIRE_NOT_ENOUGH)
  385. end
  386. human.db.warAdmire = human.db.warAdmire - 1
  387. if human.db.warAdmire <= 0 then
  388. human.db.warAdmire = nil
  389. end
  390. HeroGrowUp.onCallback(human, HeroGrowUp.TASKTYPE6, 1)
  391. local msgInner = InnerMsg.lw.LW_WARREPORT_ADMIRE
  392. msgInner.uuid = human.db._id
  393. msgInner.id = id
  394. InnerMsg.sendMsg(0, msgInner)
  395. end
  396. -- ���޻���
  397. function admireDo(human, id)
  398. BagLogic.cleanMomentItemList()
  399. BagLogic.updateMomentItem(BagLogic.ADDITEM_TYPE_1, ItemDefine.ITEM_JINBI_ID, WAP_REWARD_GOD)
  400. BagLogic.addMomentItemList(human, "war_report")
  401. opResult(human, WAP_OP_TYPE1, id, WAR_OP_CONFIRM)
  402. end
  403. --
  404. function updateDaily(human)
  405. human.db.warAdmire = human.db.warAdmire or WAR_ADMIRE
  406. human.db.warDot = true
  407. end
  408. function isDot(human)
  409. return human.db.warDot
  410. end