| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861 |
- --------------------------------------------------------------
- -- 荣耀峡谷(龙族战场)跨服逻辑
- --------------------------------------------------------------
- local LuaMongo = _G.lua_mongo
- local DB = require("common.DB")
- local Lang = require("common.Lang")
- local Util = require("common.Util")
- local InnerMsg = require("core.InnerMsg")
- local CombatDefine = require("combat.CombatDefine")
- local MiddleLogic = require("middle.MiddleLogic")
- local MiddleManager = require("middle.MiddleManager")
- local RoleLogic = require("role.RoleLogic")
- local ValleyLogic = require("valley.ValleyLogic")
- local QueryByUuid = {_id = nil}
- local FieldsRoleBase = {rolebase = 1}
- local FilldsCombatLog = {attacker = 1, defender = 1, isWin = 1, time = 1, tili1 = 1, tili2 = 1}
- local DBUpdateField = {}
- local MAX_BOARD_LEN = 50
- -- 获取活动服基础信息
- function getMainInfo(svrIndex)
- if not svrIndex then return end
- local commonDB = ValleyLogic.getCommonDB()
- if not commonDB.mainInfos then
- return
- end
- return commonDB.mainInfos[svrIndex]
- end
- -- 保存活动服基础信息
- function saveMainInfo(svrIndex, data)
- local commonDB = ValleyLogic.getCommonDB()
- commonDB.mainInfos = commonDB.mainInfos or {}
- commonDB.mainInfos[svrIndex] = Util.copyTable(data)
- ValleyLogic.saveCommonDB(commonDB)
- end
- -- 获取参赛者信息
- function getPlayerData(uuid, fields)
- if not uuid then return end
- QueryByUuid._id = uuid
- LuaMongo.find(DB.db_valley, QueryByUuid, fields)
- local playerData = {}
- return LuaMongo.next(playerData) and playerData
- end
- -- 保存/更新参赛者信息
- function updatePlayerData(playerData)
- local oldData = getPlayerData(playerData._id)
- if not oldData then
- -- 首次收到,插入数据
- LuaMongo.insert(DB.db_jjcLadder, playerData)
- return true
- else
- -- 非首次,更新数据
- QueryByUuid._id = playerData._id
- LuaMongo.update(DB.db_jjcLadder, QueryByUuid, playerData)
- end
- end
- -- 刷新部分数据
- function upsetPlayerData(playerData)
- if not playerData._id then return end
- QueryByUuid._id = playerData._id
- DBUpdateField["$set"] = playerData
- LuaMongo.update(DB.db_jjcLadder, QueryByUuid, DBUpdateField)
- end
- -- 获取鼓舞选择的选项
- function getInspireIndex(mainInfo, uuid)
- if not mainInfo then return end
- if not mainInfo.inspireList then return end
- return mainInfo.inspireList[uuid]
- end
- -- 设置鼓舞选择的选项
- function setInspireIndex(mainInfo, uuid, index)
- if not mainInfo then return end
- mainInfo.inspireList = mainInfo.inspireList or {}
- mainInfo.inspireList[uuid] = index
- mainInfo.inspireCnt = (mainInfo.inspireCnt or 0) + 1
- ValleyLogic.saveCommonDB(ValleyLogic.getCommonDB())
- end
- -- 是否有日志红点
- function hasLogRed(mainInfo, uuid)
- if not mainInfo then return end
- if not mainInfo.logs or #mainInfo.logs < 1 then
- return
- end
- return (not mainInfo.logReads[uuid])
- end
- -- 记录已读
- function setLogRead(mainInfo, uuid)
- if not mainInfo then return end
- if mainInfo.logReads[uuid] then
- return
- end
- mainInfo.logReads[uuid] = true
- return true
- end
- -- 获取战斗记录
- function getCombatInfo(videoUuid, field)
- if not videoUuid then return end
- QueryByUuid._id = videoUuid
- LuaMongo.find(DB.db_valley_record, QueryByUuid, field)
- local combatInfo = {}
- return LuaMongo.next(combatInfo) and combatInfo
- end
- -- 添加记录
- function addLog(combatInfo, mainInfo1, mainInfo2)
- LuaMongo.insert(DB.db_valley_record, combatInfo)
- end
- -- 处理日志
- function solveLog(camp, mainInfo, combatInfo, playerData)
- mainInfo.logReads = {}
- table.insert(mainInfo.logs, 1, combatInfo._id)
- local isWin = combatInfo.isWin
- if camp == CombatDefine.ATTACK_SIDE then
- isWin = not combatInfo.isWin
- end
- if isWin then
- mainInfo.fightWinCnt = mainInfo.fightWinCnt + 1
- end
- if isWin ~= true or playerData.rolebase.tili < 1 then
- mainInfo.fightIndexChange = mainInfo.fightIndexChange or {}
- mainInfo.fightIndexChange[combatInfo.roadIndex] = true
- end
- mainInfo.fightResult = mainInfo.fightResult or {}
- mainInfo.fightResult[combatInfo.roadIndex] = isWin
- mainInfo.fightVideo = mainInfo.fightVideo or {}
- mainInfo.fightVideo[combatInfo.roadIndex] = combatInfo._id
- end
- -- 获取已行军时间
- function getMoveTime()
- local _, roundState, roundStateEndTime = ValleyLogic.getRound()
- if roundState ~= ValleyLogic.STATE_FIGHT_MOVE then
- return 0
- end
- return ValleyLogic.roundMoveTime - (roundStateEndTime - os.time())
- end
- -- 获取x路第y个移动中角色的uuid
- function getMovePlayerUuid(mainInfo, roadIndex, index)
- if not mainInfo then return end
- local roadList = mainInfo.roadList[roadIndex]
- if not roadList then return end
- local fightIndexStart = mainInfo.fightIndexList[roadIndex] or 1
- local fightIndex = fightIndexStart + index - 1
- local uuid = roadList[fightIndex]
- return uuid
- end
- -- 目标点
- function getMoveToPos(index)
- return ValleyLogic.ROAD_POINT_CNT - index + 1
- end
- -- 获取移动中的对象结构体
- function getMovePlayer(mainInfo, camp, roadIndex, index)
- local uuid = getMovePlayerUuid(mainInfo, roadIndex, index)
- local playerData = getPlayerData(uuid, FieldsRoleBase)
- if not playerData then return end
- local movePlayer = {}
- movePlayer.camp = camp
- movePlayer.roadIndex = roadIndex
- movePlayer.startPos = mainInfo.moveList[uuid] or 0
- movePlayer.moveToPos = getMoveToPos(index)
- movePlayer.moveTime = getMoveTime()
- movePlayer.moveTimeMax = ValleyLogic.roundMoveTime
- movePlayer.name = playerData.rolebase.name
- movePlayer.body = playerData.rolebase.body
- return movePlayer
- end
- -- 是否所有战斗都结束了
- function isAllFightEnd(mainInfo)
- if not mainInfo then return true end
-
- for roadIndex = 1, ValleyLogic.ROAD_MAX_CNT do
- if getMovePlayerUuid(mainInfo, roadIndex, 1) then
- return
- end
- end
- return true
- end
- -- 复制发送到logic的mainInfo
- function copyWLMainInfo(mainInfo)
- if not mainInfo then return end
- local tMainInfo = {}
- tMainInfo.svrIndex = mainInfo.svrIndex
- tMainInfo.svrName = mainInfo.svrName
- tMainInfo.inspireCnt = mainInfo.inspireCnt
- tMainInfo.fightIndexList = mainInfo.fightIndexList
- tMainInfo.roadList = mainInfo.roadList
- return tMainInfo
- end
- -------------------------------------- middle -------------------------------------------
- -- 接收活动服基础信息
- function LW_VALLEY_MAIN_INFO(fd, data)
- local svrIndex = MiddleManager.FD_2_SVRINDEX[fd]
- if not svrIndex then return end
- saveMainInfo(svrIndex, data)
- end
- -- 接收玩家信息
- function LW_VALLEY_ROAD_PLAYER(fd, playerData)
- local svrIndex = MiddleManager.FD_2_SVRINDEX[fd]
- if not svrIndex then return end
-
- local data = getMainInfo(svrIndex)
- if not data then return end
- local roadIndex = playerData.roadIndex
- local isFirst = updatePlayerData(playerData)
- if isFirst then
- data.roadList = data.roadList or {}
- data.roadList[roadIndex] = data.roadList[roadIndex] or {}
- local len = #data.roadList[roadIndex]
- data.roadList[roadIndex][len + 1] = playerData._id
- saveMainInfo(svrIndex, data)
- end
- end
- -- 查询主界面信息
- function LW_VALLEY_QUERY(fd, uuid)
- local svrIndex1 = MiddleManager.FD_2_SVRINDEX[fd]
- if not svrIndex1 then return end
- local state, leftTime = ValleyLogic.getState()
- local msgInner = InnerMsg.wl.WL_VALLEY_QUERY
- msgInner.uuid = uuid
- local data = {}
- if state == ValleyLogic.STATE_ACT_FIGHT then
- local mainInfo1 = getMainInfo(svrIndex1)
- local svrIndex2 = mainInfo1 and mainInfo1.targetSvrIndex
- local mainInfo2 = getMainInfo(svrIndex2)
- local round, roundState, roundStateEndTime = ValleyLogic.getRound()
- if isAllFightEnd(mainInfo1) or isAllFightEnd(mainInfo2) then -- 战斗提前结束
- roundState = STATE_FIGHT_END
- end
- data.mainInfo1 = copyWLMainInfo(mainInfo1)
- data.mainInfo2 = copyWLMainInfo(mainInfo2)
- data.round = round
- data.roundState = roundState
- data.roundStateEndTime = roundStateEndTime
- data.logRed = hasLogRed(mainInfo1, uuid)
- -- 移动中的对象
- data.players = {}
- for roadIndex = 1, ValleyLogic.ROAD_MAX_CNT do
- for i = 1, ValleyLogic.ROAD_POINT_CNT do
- local movePlayer1 = getMovePlayer(mainInfo1, CombatDefine.ATTACK_SIDE, roadIndex, index)
- data.players[#data.players + 1] = movePlayer1
- local movePlayer2 = getMovePlayer(mainInfo2, CombatDefine.DEFEND_SIDE, roadIndex, index)
- data.players[#data.players + 1] = movePlayer2
- end
- end
- else
- data.state = state
- data.leftTime = leftTime
- end
- msgInner.data = data
- InnerMsg.sendMsg(fd, msgInner)
- end
- function fontRoadPlayer(uuid)
- local playerData = getPlayerData(uuid)
- if not playerData then return end
- local net = {}
- net.uuid = uuid
- net.name = playerData.rolebase.name
- net.tili = playerData.rolebase.tili
- net.zhandouli = playerData.rolebase.zhandouli
- net.heroList = {[0] = 0}
- for index, obj in pairs(playerData.objList) do
- net.heroList[0] = net.heroList[0] + 1
- local heroNet = net.heroList[net.heroList[0]]
- HeroGrid.makeHeroSimple(heroNet, obj, index)
- end
- return net
- end
- -- 营地查看
- function LW_VALLEY_ROAD_QUERY(fd, uuid, camp, roadIndex)
- local svrIndex1 = MiddleManager.FD_2_SVRINDEX[fd]
- if not svrIndex1 then return end
- local mainInfo1 = getMainInfo(svrIndex1)
- local svrIndex2 = mainInfo1 and mainInfo1.targetSvrIndex
- local mainInfo2 = getMainInfo(svrIndex2)
- local roadList = nil
- if camp == CombatDefine.ATTACK_SIDE then
- roadList = mainInfo1 and mainInfo1.roadList[roadIndex]
- else
- roadList = mainInfo2 and mainInfo2.roadList[roadIndex]
- end
- local roadListLen = roadList and #roadList or 0
- local msgInner = InnerMsg.wl.WL_VALLEY_ROAD_QUERY
- msgInner.uuid = uuid
- msgInner.camp = camp
- msgInner.roadIndex = roadIndex
- msgInner.playerList = {}
- for i = 1, roadListLen do
- local tuuid = roadList[i]
- msgInner.playerList[#msgInner.playerList + 1] = fontRoadPlayer(tuuid)
- end
- msgInner.myData = fontRoadPlayer(uuid) or {}
- InnerMsg.sendMsg(fd, msgInner)
- end
- -- 封装鼓舞信息
- function fontInspireData(dataNet, round, mainInfo1, mainInfo2, uuid)
- dataNet.round = round
- dataNet.mainInfo1 = copyWLMainInfo(mainInfo1)
- dataNet.mainInfo2 = copyWLMainInfo(mainInfo2)
- dataNet.selectIndex = getInspireIndex(mainInfo1, uuid)
- end
- -- 鼓舞查询
- function LW_VALLEY_INSPIRE_QUERY(fd, uuid)
- local state = ValleyLogic.getState()
- if state ~= ValleyLogic.STATE_ACT_FIGHT then
- return MiddleLogic.sendWLBroadcast(fd, uuid, Lang.VALLEY_INSPIRE_ERR_TIME)
- end
- local round, roundState = ValleyLogic.getRound()
- if roundState ~= ValleyLogic.STATE_FIGHT_READY then
- return MiddleLogic.sendWLBroadcast(fd, uuid, Lang.VALLEY_INSPIRE_ERR_TIME)
- end
- local mainInfo1 = getMainInfo(svrIndex1)
- local svrIndex2 = mainInfo1 and mainInfo1.targetSvrIndex
- local mainInfo2 = getMainInfo(svrIndex2)
- -- 战斗提前结束
- if isAllFightEnd(mainInfo1) or isAllFightEnd(mainInfo2) then
- return MiddleLogic.sendWLBroadcast(fd, uuid, Lang.VALLEY_ERR_FINISH)
- end
- local msgInner = InnerMsg.wl.WL_VALLEY_INSPIRE_QUERY
- msgInner.uuid = uuid
- msgInner.data = msgInner.data or {}
- Util.cleanTable(msgInner.data)
- fontInspireData(msgInner.data, round, mainInfo1, mainInfo2, uuid)
- InnerMsg.sendMsg(fd, msgInner)
- end
- -- 鼓舞
- function LW_VALLEY_INSPIRE(fd, uuid, selectIndex)
- local state = ValleyLogic.getState()
- if state ~= ValleyLogic.STATE_ACT_FIGHT then
- return MiddleLogic.sendWLBroadcast(fd, uuid, Lang.VALLEY_INSPIRE_ERR_TIME)
- end
- local round, roundState = ValleyLogic.getRound()
- if roundState ~= ValleyLogic.STATE_FIGHT_READY then
- return MiddleLogic.sendWLBroadcast(fd, uuid, Lang.VALLEY_INSPIRE_ERR_TIME)
- end
- local mainInfo1 = getMainInfo(svrIndex1)
- local svrIndex2 = mainInfo1 and mainInfo1.targetSvrIndex
- local mainInfo2 = getMainInfo(svrIndex2)
- -- 战斗提前结束
- if isAllFightEnd(mainInfo1) or isAllFightEnd(mainInfo2) then
- return MiddleLogic.sendWLBroadcast(fd, uuid, Lang.VALLEY_ERR_FINISH)
- end
- -- 是否进行过鼓舞
- if getInspireIndex(mainInfo1, uuid) then
- return MiddleLogic.sendWLBroadcast(fd, uuid, Lang.VALLEY_INSPIRE_ERR_HAD)
- end
- setInspireIndex(mainInfo1, uuid, selectIndex)
- LW_VALLEY_INSPIRE_QUERY(fd, uuid)
- end
- -- 封装观战界面-玩家信息
- function fontFightPlayerNet(playerData1, playerData2, isWin)
- if not playerData1 or not playerData2 then return end
- local fightPlayer = {}
- fightPlayer.roleBase = {}
- RoleLogic.makeRoleBase(playerData1.rolebase, fightPlayer.roleBase)
- local inspireCnt1 = playerData1.rolebase.inspireCnt
- local inspireCnt2 = playerData2.rolebase.inspireCnt
- fightPlayer.attrsUp = getAttrsUp(inspireCnt1, inspireCnt2, CombatDefine.ATTACK_SIDE)
- fightPlayer.attrsUp = fightPlayer.attrsUp or {}
- fightPlayer.attrsUp[0] = #fightPlayer.attrsUp
- fightPlayer.tili = playerData1.rolebase.tili
- fightPlayer.isWin = isWin and 1 or 0
- fightPlayer.heroList = {[0] = 0}
- for index, obj in pairs(playerData1.objList) do
- fightPlayer.heroList[0] = fightPlayer.heroList[0] + 1
- local heroNet = fightPlayer.heroList[fightPlayer.heroList[0]]
- HeroGrid.makeHeroSimple(heroNet, obj, index)
- end
- return fightPlayer
- end
- -- 封装双方基础信息
- function fontFightBaseNet(mainInfo, roadIndex)
- if not mainInfo then return end
- local fightBase = {}
- local fightIndex = mainInfo.fightIndexList[roadIndex] or 1
- fightBase.svrName = mainInfo.svrName
- fightBase.maxCnt = #mainInfo.roadList
- fightBase.leftCnt = fightBase.maxCnt - fightIndex + 1
- return fightBase
- end
- -- 观战界面
- function LW_VALLEY_FIGHT_QUERY(fd, uuid, roadIndex)
- local state = ValleyLogic.getState()
- if state ~= ValleyLogic.STATE_ACT_FIGHT then
- return MiddleLogic.sendWLBroadcast(fd, uuid, Lang.VALLEY_FIGHT_ERR_TIME)
- end
- local round, roundState = ValleyLogic.getRound()
- if roundState ~= ValleyLogic.STATE_FIGHT_FIGHT then
- return MiddleLogic.sendWLBroadcast(fd, uuid, Lang.VALLEY_FIGHT_ERR_TIME)
- end
- local mainInfo1 = getMainInfo(svrIndex1)
- local svrIndex2 = mainInfo1 and mainInfo1.targetSvrIndex
- local mainInfo2 = getMainInfo(svrIndex2)
- -- 战斗提前结束
- if isAllFightEnd(mainInfo1) or isAllFightEnd(mainInfo2) then
- return MiddleLogic.sendWLBroadcast(fd, uuid, Lang.VALLEY_ERR_FINISH)
- end
- local msgInner = InnerMsg.wl.WL_VALLEY_FIGHT_QUERY
- msgInner.uuid = uuid
- msgInner.data = msgInner.data or {}
- Util.cleanTable(msgInner.data)
- fontInspireData(msgInner.data, round, mainInfo1, mainInfo2, uuid)
- local uuid1 = getMovePlayerUuid(mainInfo1, roadIndex, 1)
- local uuid2 = getMovePlayerUuid(mainInfo2, roadIndex, 1)
- local isWin1 = mainInfo1.fightResult and mainInfo1.fightResult[roadIndex]
- local isWin2 = mainInfo2.fightResult and mainInfo2.fightResult[roadIndex]
- local playerData1 = getPlayerData(uuid1)
- local playerData2 = getPlayerData(uuid2)
- local fightPlayer1 = fontFightPlayerNet(playerData1, playerData2, isWin1)
- local fightPlayer2 = fontFightPlayerNet(playerData2, playerData1, isWin2)
- if fightPlayer1 and fightPlayer2 then
- msgInner.data.fightPlayers = {[0] = 2}
- msgInner.data.fightPlayers[1] = fightPlayer1
- msgInner.data.fightPlayers[2] = fightPlayer2
- end
- local videoUuid = mainInfo1.fightVideo and mainInfo1.fightVideo[roadIndex]
- msgInner.data.fightState = videoUuid and 1 or 0 --战斗结果出来了
- msgInner.data.videoUuid = videoUuid
- msgInner.data.fightBase[0] = 2
- msgInner.data.fightBase[1] = fontFightBaseNet(mainInfo1, roadIndex)
- msgInner.data.fightBase[2] = fontFightBaseNet(mainInfo2, roadIndex)
- InnerMsg.sendMsg(fd, msgInner)
- end
- -- 观战
- function LW_VALLEY_PLAY_FIGHT(fd, uuid, videoUuid)
- local combatInfo = getCombatInfo(videoUuid)
- if not combatInfo then
- return MiddleLogic.sendWLBroadcast(fd, uuid, Lang.COMBAT_ERR_NOT_VIDEO)
- end
- local msgInner = InnerMsg.wl.WL_VALLEY_PLAY_FIGHT
- msgInner.uuid = uuid
- msgInner.combatInfo = combatInfo
- InnerMsg.sendMsg(fd, msgInner)
- end
- -- 比较胜利次数
- local function cmpWinCnt(a, b)
- if a.winCnt ~= b.winCnt then
- return a.winCnt > b.winCnt
- end
- return a.time < b.time
- end
- -- 刷新排行榜
- function sortBoard(mainInfo)
- if not mainInfo then return end
- local list = {}
- for _, list in pairs(mainInfo.roadList) do
- for _, uuid in ipairs(list) do
- local playerData = getPlayerData(uuid, FieldsRoleBase)
- if playerData then
- list[#list + 1] = playerData.rolebase
- end
- end
- end
- if #list > 1 then
- table.sort(list, cmpWinCnt)
- end
- mainInfo.board = {}
- for i = 1, #list do
- mainInfo.board[i] = list[i].uuid
- end
- end
- -- 战斗结果
- function LW_VALLEY_COMBATINFO(fd, svrIndex1, combatInfo)
- local mainInfo1 = getMainInfo(svrIndex1)
- local svrIndex2 = mainInfo1 and mainInfo1.targetSvrIndex
- local mainInfo2 = getMainInfo(svrIndex2)
- if not mainInfo1 or not mainInfo2 then
- return -- 不可能哦,不过加一下预防
- end
- local uuid1 = combatInfo.attacker.uuid
- local uuid2 = combatInfo.defender.uuid
- local playerData1 = getPlayerData(uuid1, FieldsRoleBase)
- local playerData2 = getPlayerData(uuid2, FieldsRoleBase)
- if not playerData1 or not not playerData2 then
- return
- end
- -- 保存战斗结果
- combatInfo.svrIndex1 = svrIndex1
- combatInfo.svrIndex2 = svrIndex2
- combatInfo.tili1 = playerData1.rolebase.tili
- combatInfo.tili2 = playerData2.rolebase.tili
- -- 修改胜利场次 体力 剩余血量等信息
- if combatInfo.isWin then
- playerData1.rolebase.winCnt = playerData1.rolebase.winCnt + 1
- else
- playerData2.rolebase.winCnt = playerData2.rolebase.winCnt + 1
- end
- playerData1.hpRateList = combatInfo.hpRateListAtk
- playerData2.hpRateList = combatInfo.hpRateListDef
- playerData1.rolebase.tili = playerData1.rolebase.tili - 1
- playerData1.rolebase.time = os.time()
- playerData2.rolebase.tili = playerData2.rolebase.tili - 1
- playerData2.rolebase.time = os.time()
- upsetPlayerData(playerData1)
- upsetPlayerData(playerData2)
- -- 记录到日志中
- addLog(combatInfo, mainInfo1, mainInfo2)
- solveLog(CombatDefine.ATTACK_SIDE, mainInfo1, combatInfo, playerData1)
- solveLog(CombatDefine.DEFEND_SIDE, mainInfo2, combatInfo, playerData2)
- -- 刷新排行榜
- sortBoard(mainInfo1)
- sortBoard(mainInfo2)
- ValleyLogic.saveCommonDB(ValleyLogic.getCommonDB())
- end
- -- 日志
- function LW_VALLEY_LOG_QUERY(fd, uuid, roadIndex)
- local svrIndex = MiddleManager.FD_2_SVRINDEX[fd]
- if not svrIndex then return end
- local mainInfo = getMainInfo(svrIndex)
- local logsLen = mainInfo and #mainInfo.logs or 0
- local msgInner = InnerMsg.wl.WL_VALLEY_LOG_QUERY
- msgInner.uuid = uuid
- msgInner.roadIndex = roadIndex
- msgInner.logs = msgInner.logs or {}
- Util.cleanTable(msgInner.logs)
- for i = 1, logsLen do
- local videoUuid = mainInfo.logs[i]
- local combatInfo = getCombatInfo(videoUuid, FilldsCombatLog)
- if combatInfo then
- if (roadIndex == 0 and (-- 自己的
- combatInfo.attacker.uuid == uuid or
- combatInfo.defender.uuid == uuid)) or
- (roadIndex > 0 and -- 某路的
- combatInfo.roadIndex == roadIndex) then
- local log = {}
- log.time = combatInfo.time
- log.roleBase1 = combatInfo.attacker
- log.roleBase2 = combatInfo.defender
- log.tili1 = combatInfo.tili1
- log.tili2 = combatInfo.tili2
- log.isWin = combatInfo.isWin and 1 or 0
- msgInner.logs[#msgInner.logs + 1] = log
- end
- end
- end
- InnerMsg.sendMsg(fd, msgInner)
- end
- -- 获取排行榜名次
- function getRank(mainInfo, uuid)
- if not mainInfo then return end
- for rank, tuuid in ipairs(mainInfo.board) do
- if tuuid == uuid then
- return rank
- end
- end
- end
- -- 封装排行榜结构体
- function fontBoardNet(uuid, rank)
- local playerData = getPlayerData(uuid, FieldsRoleBase)
- local net = {}
- net.rank = rank or 0
- if playerData then
- net.killCnt = playerData.rolebase.winCnt or 0
- net.roleBase = {}
- RoleLogic.makeRoleBase(playerData.rolebase, net.roleBase)
- end
- return net
- end
- -- 排行榜
- function LW_VALLEY_BOARD_QUERY(fd, uuid, camp)
- local svrIndex1 = MiddleManager.FD_2_SVRINDEX[fd]
- if not svrIndex1 then return end
- local mainInfo1 = getMainInfo(svrIndex1)
- local svrIndex2 = mainInfo1 and mainInfo1.targetSvrIndex
- local mainInfo2 = getMainInfo(svrIndex2)
- local mainInfo = mainInfo1
- if camp ~= CombatDefine.ATTACK_SIDE then
- mainInfo = mainInfo2
- end
- local boardLen = mainInfo and #mainInfo.board or 0
- local msgInner = InnerMsg.wl.WL_VALLEY_BOARD_QUERY
- msgInner.uuid = uuid
- msgInner.camp = camp
- msgInner.list = msgInner.list or {}
- Util.cleanTable(msgInner.list)
- for i = 1, boardLen do
- if #msgInner.list >= MAX_BOARD_LEN then
- break
- end
- local tuuid = mainInfo.board[i]
- msgInner.list[#msgInner.list + 1] = fontBoardNet(tuuid, i)
- end
- local myRank = getRank(mainInfo1, uuid)
- msgInner.myData = fontBoardNet(uuid, myRank)
- InnerMsg.sendMsg(fd, msgInner)
- end
- ------------------------------------- 活动状态变化 ------------------------------------------
- -- 按照战力排序
- local function cmpZDL(a, b)
- if a.zhandouli ~= b.zhandouli then
- return a.zhandouli > b.zhandouli
- end
- return a.svrIndex < b.svrIndex
- end
- -- 初始匹配组信息
- local function createMatchData(svrIndex1, svrIndex2)
- if (not svrIndex1) and (not svrIndex2) then return end
- local matchData = {}
- matchData.svrIndex1 = svrIndex1 or 0
- matchData.svrIndex2 = svrIndex2 or 0
- return matchData
- end
- -- 匹配对手 按战力排序(从高到低下) 两两匹配
- function matchMainInfo()
- local list = {}
- local commonDB = ValleyLogic.getCommonDB()
- if commonDB.mainInfos then
- for _, data in pairs(commonDB.mainInfos) do
- list[#list + 1] = data
- end
- end
- if #list > 1 then
- table.sort(list, cmpZDL)
- end
- commonDB.matchList = {}
- for i = 1, #list, 2 do
- local data1 = list[i]
- local data2 = list[i + 1]
- if data1 then
- data1.targetSvrIndex = data2 and data2.svrIndex or 0
- end
- if data2 then
- data2.targetSvrIndex = data1 and data1.svrIndex or 0
- end
- local matchData = createMatchData(data1 and data1.svrIndex, data2 and data2.svrIndex)
- commonDB.matchList[#commonDB.matchList + 1] = matchData
- end
- ValleyLogic.saveCommonDB(commonDB)
- end
- -- 侦查开始/匹配结束
- function onActExplore()
- matchMainInfo()
- end
- -- 发送破营+杀敌奖励
- function sendWLFinalResult(mainInfo, winCnt, failCnt)
- local fd = MiddleManager.getFDBySvrIndex(mainInfo.svrIndex)
- if not fd then return end
- local msgInner = InnerMsg.wl.WL_VALLEY_FINAL_RESULT
- msgInner.winCnt = winCnt
- msgInner.failCnt = failCnt
- msgInner.tieCnt = ValleyLogic.ROAD_MAX_CNT - winCnt - failCnt
- msgInner.killList = {}
- for _, list in pairs(mainInfo.roadList) do
- for _, uuid in ipairs(list) do
- local playerData = getPlayerData(uuid, FieldsRoleBase)
- if playerData then
- msgInner.killList[uuid] = playerData.rolebase.winCnt
- end
- end
- end
- InnerMsg.sendMsg(fd, msgInner)
- end
- -- 活动结束
- function onActEnd()
- -- 发送破营+杀敌奖励
- local commonDB = ValleyLogic.getCommonDB()
- if commonDB.matchList then
- for _, matchData in ipairs(commonDB.matchList) do
- local svrIndex1 = matchData.svrIndex1
- local svrIndex2 = matchData.svrIndex2
- local mainInfo1 = getMainInfo(svrIndex1)
- local mainInfo2 = getMainInfo(svrIndex2)
- local star1 = ValleyLogic.getMainStar(mainInfo1, mainInfo2)
- local star2 = ValleyLogic.getMainStar(mainInfo2, mainInfo1)
- sendWLFinalResult(mainInfo1, star1, star2)
- sendWLFinalResult(mainInfo2, star2, star1)
- end
- end
- ValleyLogic.cleanDB()
- end
- -- 活动开始
- function onActStart()
- ValleyLogic.cleanDB()
- end
- -- 发送鼓舞结果
- function sendWLInspireResult(mainInfo)
- local fd = MiddleManager.getFDBySvrIndex(mainInfo.svrIndex)
- if not fd then return end
- if not mainInfo.inspireList then return end
- local msgInner = InnerMsg.wl.WL_VALLEY_INSPIRE_RESULT
- msgInner.winCnt = mainInfo.fightWinCnt
- msgInner.failCnt = mainInfo.fightFailCnt
- msgInner.inspireList = mainInfo.inspireList
- InnerMsg.sendMsg(fd, msgInner)
- end
- -- 行军开始/前一轮结束
- function onRoundEnd()
- local commonDB = ValleyLogic.getCommonDB()
- if not commonDB.mainInfos then return end
- for _, mainInfo in pairs(commonDB.mainInfos) do
- -- 退场 失败或者体力为0
- local fightIndexChange = mainInfo.fightIndexChange
- mainInfo.fightIndexChange = nil
- if fightIndexChange then
- for roadIndex in pairs(fightIndexChange) do
- local oldFightIndex = mainInfo.fightIndexList[roadIndex] or 1
- mainInfo.fightIndexList[roadIndex] = oldFightIndex + 1
- end
- end
- -- 发送鼓舞奖励
- sendWLInspireResult(mainInfo)
- -- 重置鼓舞信息+本轮胜场
- mainInfo.fightWinCnt = 0
- mainInfo.fightFailCnt = 0
- mainInfo.inspireCnt = nil
- mainInfo.inspireList = nil
- mainInfo.fightResult = nil
- mainInfo.fightVideo = nil
- end
- ValleyLogic.saveCommonDB(ValleyLogic.getCommonDB())
- end
- -- 行军结束
- function onMoveEnd()
- local commonDB = ValleyLogic.getCommonDB()
- if not commonDB.mainInfos then return end
- -- 移动到目标点
- for _, mainInfo in pairs(commonDB.mainInfos) do
- for roadIndex = 1, ValleyLogic.ROAD_MAX_CNT do
- for index = 1, ValleyLogic.ROAD_POINT_CNT do
- local uuid = getMovePlayerUuid(mainInfo, roadIndex, index)
- if uuid then
- mainInfo.moveList[uuid] = getMoveToPos(index)
- end
- end
- end
- end
- ValleyLogic.saveCommonDB(ValleyLogic.getCommonDB())
- end
- -- 发送战斗开打
- function sendWLCombatBegin(round, roadIndex, mainInfo1, mainInfo2, playerData1, playerData2)
- if not playerData1 or not playerData2 then
- return
- end
- local fd = MiddleManager.getFDBySvrIndex(mainInfo1.svrIndex)
- fd = fd or MiddleManager.getFDBySvrIndex(mainInfo2.svrIndex)
- if not fd then return end
- local msgInner = InnerMsg.wl.WL_VALLEY_COMBAT_BEGIN
- msgInner.svrIndex = mainInfo1.svrIndex
- msgInner.roadIndex = roadIndex
- msgInner.round = round
- msgInner.inspireCnt1 = mainInfo1.inspireCnt or 0
- msgInner.inspireCnt2 = mainInfo2.inspireCnt or 0
- msgInner.playerData1 = playerData1
- msgInner.playerData2 = playerData2
- InnerMsg.sendMsg(fd, msgInner)
- end
- -- 开始战斗
- function onFightBegin(round)
- local commonDB = ValleyLogic.getCommonDB()
- if not commonDB.matchList then return end
- for _, matchData in ipairs(commonDB.matchList) do
- local svrIndex1 = matchData.svrIndex1
- local svrIndex2 = matchData.svrIndex2
- local mainInfo1 = getMainInfo(svrIndex1)
- local mainInfo2 = getMainInfo(svrIndex2)
- for roadIndex = 1, ValleyLogic.ROAD_MAX_CNT do
- local uuid1 = getMovePlayerUuid(mainInfo1, roadIndex, 1)
- local playerData1 = getPlayerData(uuid1)
- local uuid2 = getMovePlayerUuid(mainInfo2, roadIndex, 1)
- local playerData2 = getPlayerData(uuid2)
- sendWLCombatBegin(round, roadIndex, mainInfo1, mainInfo2, playerData1, playerData2)
- end
- end
- end
- -- 切换战斗轮次状态
- function onActRound(round, roundState)
- if roundState == ValleyLogic.STATE_FIGHT_MOVE then
- -- 行军开始/前一轮结束
- onRoundEnd()
- elseif roundState == ValleyLogic.STATE_FIGHT_READY then
- -- 鼓舞开始/行军结束
- onMoveEnd()
- elseif roundState == ValleyLogic.STATE_FIGHT_FIGHT then
- -- 开打!!
- onFightBegin(round)
- end
- end
|