WarReportLogic.lua 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481
  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 not _G.is_middle 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(0,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. WarReportMiddle.LW_WARREPORT_GET_COMBATINFO(0,msgInner)
  307. end
  308. -- ս�����
  309. function sendFinish(human, combatInfo)
  310. if not combatInfo then return end
  311. local msgRet = Msg.gc.GC_WAR_REPROT_HARM
  312. if not CombatLogic.fontCombatFinish(msgRet.data, combatInfo) then
  313. return
  314. end
  315. Msg.send(msgRet,human.fd)
  316. end
  317. -- �ط�
  318. function playBack(human, type, id)
  319. -- �������������ķ�
  320. local msgInner = {} --InnerMsg.lw.LW_WARREPORT_GET_COMBATINFO
  321. msgInner.uuid = human.db._id
  322. msgInner.type = type
  323. msgInner.id = id
  324. msgInner.mode = WAR_COMBATINFO_PLAYBACK
  325. --InnerMsg.sendMsg(0, msgInner)
  326. WarReportMiddle.LW_WARREPORT_GET_COMBATINFO(0,msgInner)
  327. end
  328. -- �������
  329. function opResult(human, opType, id, result)
  330. local msgRet = Msg.gc.GC_WAR_REPORT_OP_RESULT
  331. msgRet.opType = opType
  332. msgRet.result = result
  333. msgRet.id = id
  334. Msg.send(msgRet,human.fd)
  335. end
  336. -- �ղ�
  337. function collect(human, type, id, op)
  338. if op ~= WAR_OP_CONFIRM and op ~= WAR_OP_CANCEL then
  339. return
  340. end
  341. local warReport = human.db.warReport
  342. if op == WAR_OP_CONFIRM then
  343. -- �Ѿ����ղ��б�
  344. if warReport[type] and warReport[type][id] then
  345. return
  346. end
  347. -- �ղ�����
  348. local collectCnt = 0
  349. for k, v in pairs(warReport) do
  350. for _, data in pairs(v) do
  351. collectCnt = collectCnt + 1
  352. end
  353. end
  354. if collectCnt >= WAR_COUNT_MAX1 then
  355. return Broadcast.sendErr(human, Lang.WAR_REPORT_COLLECT_CNT_ERR)
  356. end
  357. elseif op == WAR_OP_CANCEL then
  358. if not warReport[type] or not warReport[type][id] then
  359. return
  360. end
  361. end
  362. local msgInner = {} --InnerMsg.lw.LW_WARREPORT_COLLECT
  363. msgInner.uuid = human.db._id
  364. msgInner.type = type
  365. msgInner.id = id
  366. msgInner.op = op
  367. --InnerMsg.sendMsg(0, msgInner)
  368. WarReportMiddle.LW_WARREPORT_COLLECT(0,msgInner)
  369. end
  370. -- �ղػ���
  371. function collectHumanDo(human, type, id, op)
  372. if op ~= WAR_OP_CONFIRM and op ~= WAR_OP_CANCEL then
  373. return
  374. end
  375. local warReport = human.db.warReport
  376. warReport[type] = warReport[type] or {}
  377. if op == WAR_OP_CONFIRM then
  378. warReport[type][id] = 1
  379. elseif op == WAR_OP_CANCEL then
  380. warReport[type][id] = nil
  381. end
  382. opResult(human, WAP_OP_TYPE2, id, op)
  383. end
  384. -- ����
  385. function admire(human, type, id)
  386. if human.db.warAdmire == nil then
  387. return Broadcast.sendErr(human, Lang.WAR_REPORT_ADMIRE_NOT_ENOUGH)
  388. end
  389. human.db.warAdmire = human.db.warAdmire - 1
  390. if human.db.warAdmire <= 0 then
  391. human.db.warAdmire = nil
  392. end
  393. HeroGrowUp.onCallback(human, HeroGrowUp.TASKTYPE6, 1)
  394. local msgInner = {} --InnerMsg.lw.LW_WARREPORT_ADMIRE
  395. msgInner.uuid = human.db._id
  396. msgInner.id = id
  397. --InnerMsg.sendMsg(0, msgInner)
  398. WarReportMiddle.LW_WARREPORT_ADMIRE(0,msgInner)
  399. end
  400. -- ���޻���
  401. function admireDo(human, id)
  402. BagLogic.cleanMomentItemList()
  403. BagLogic.updateMomentItem(BagLogic.ADDITEM_TYPE_1, ItemDefine.ITEM_JINBI_ID, WAP_REWARD_GOD)
  404. BagLogic.addMomentItemList(human, "war_report")
  405. opResult(human, WAP_OP_TYPE1, id, WAR_OP_CONFIRM)
  406. end
  407. --
  408. function updateDaily(human)
  409. human.db.warAdmire = human.db.warAdmire or WAR_ADMIRE
  410. human.db.warDot = true
  411. end
  412. function isDot(human)
  413. return human.db.warDot
  414. end