3384 lines
117 KiB
Lua
3384 lines
117 KiB
Lua
|
local XStrongholdMineRecord = require("XEntity/XStronghold/XStrongholdMineRecord")
|
|||
|
local XStrongholdGroupInfo = require("XEntity/XStronghold/XStrongholdGroupInfo")
|
|||
|
local XStrongholdTeam = require("XEntity/XStronghold/XStrongholdTeam")
|
|||
|
local XStrongholdAssistantRecord = require("XEntity/XStronghold/XStrongholdAssistantRecord")
|
|||
|
local _ActivityTimer
|
|||
|
|
|||
|
XStrongholdManagerCreator = function()
|
|||
|
local tableInsert = table.insert
|
|||
|
local tableSort = table.sort
|
|||
|
local tableRemove = table.remove
|
|||
|
local tonumber = tonumber
|
|||
|
local mathFloor = math.floor
|
|||
|
local mathMax = math.max
|
|||
|
local mathCeil = math.ceil
|
|||
|
local ipairs = ipairs
|
|||
|
local pairs = pairs
|
|||
|
local CsXTextManagerGetText = CsXTextManagerGetText
|
|||
|
local stringFormat = string.format
|
|||
|
local stringIsNilOrEmpty = string.IsNilOrEmpty
|
|||
|
local IsNumberValid = XTool.IsNumberValid
|
|||
|
local IsTableEmpty = XTool.IsTableEmpty
|
|||
|
local Clone = XTool.Clone
|
|||
|
|
|||
|
local XStrongholdManager = {}
|
|||
|
-----------------功能入口 begin----------------
|
|||
|
local ACTIVITY_STATUS = {
|
|||
|
DEFAULT = 0, --未开启
|
|||
|
ACTIVITY_BEGIN = 1, --开启中
|
|||
|
FIGHT_BEGIN = 2, --战斗开启
|
|||
|
FIGHT_END = 3, --战斗结束
|
|||
|
ACTIVITY_END = 4 --已结束
|
|||
|
}
|
|||
|
|
|||
|
local _ActivityStatus = ACTIVITY_STATUS.DEFAULT --活动状态
|
|||
|
local _ActivityId = 0 --活动期数
|
|||
|
local _BeginTime = 0 --活动开启时间
|
|||
|
local _FightBeginTime = 0 --挑战开启时间
|
|||
|
local _FightAutoBeginTime = 0 --挑战自动开启时间
|
|||
|
local _FightEndTime = 0 --挑战结束时间
|
|||
|
local _EndTime = 0 --活动结束时间
|
|||
|
local _CurDay = 0 --当前天数(挑战开始后)
|
|||
|
local _TotalDay = 0 --挑战总天数(挑战开始后)
|
|||
|
local _ActivityEnd = false --活动是否重置
|
|||
|
|
|||
|
local function ClearActivityTimer()
|
|||
|
if _ActivityTimer then
|
|||
|
XScheduleManager.UnSchedule(_ActivityTimer)
|
|||
|
_ActivityTimer = nil
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
local UpdateActivityStatus
|
|||
|
UpdateActivityStatus = function()
|
|||
|
local leftTime = 0 --距离下一阶段剩余时间
|
|||
|
XCountDown.RemoveTimer(XCountDown.GTimerName.Stronghold)
|
|||
|
|
|||
|
--活动未开启
|
|||
|
if not IsNumberValid(_BeginTime) or not IsNumberValid(_ActivityId) then
|
|||
|
_ActivityStatus = ACTIVITY_STATUS.DEFAULT
|
|||
|
leftTime = 0
|
|||
|
end
|
|||
|
|
|||
|
local nowTime = XTime.GetServerNowTimestamp()
|
|||
|
|
|||
|
if not IsNumberValid(_FightBeginTime) then
|
|||
|
--活动开启中,等待挑战开始(手动第一次战斗后记录开启挑战时间)
|
|||
|
local lastTime = XStrongholdConfigs.GetActivityFightAutoBeginSeconds(_ActivityId)
|
|||
|
_FightAutoBeginTime = _BeginTime + lastTime
|
|||
|
|
|||
|
leftTime = _FightAutoBeginTime - nowTime
|
|||
|
if leftTime > 0 then
|
|||
|
_ActivityStatus = ACTIVITY_STATUS.ACTIVITY_BEGIN
|
|||
|
else
|
|||
|
_ActivityStatus = ACTIVITY_STATUS.ACTIVITY_END
|
|||
|
end
|
|||
|
else
|
|||
|
local lastTime = XStrongholdConfigs.GetActivityFightContinueSeconds(_ActivityId)
|
|||
|
_FightEndTime = _FightBeginTime + lastTime
|
|||
|
if nowTime < _FightEndTime then
|
|||
|
--挑战开启中
|
|||
|
_ActivityStatus = ACTIVITY_STATUS.FIGHT_BEGIN
|
|||
|
leftTime = _FightEndTime - nowTime
|
|||
|
elseif nowTime < _EndTime then
|
|||
|
--挑战已结束
|
|||
|
_ActivityStatus = ACTIVITY_STATUS.FIGHT_END
|
|||
|
leftTime = _EndTime - nowTime
|
|||
|
else
|
|||
|
--活动已结束
|
|||
|
leftTime = 0
|
|||
|
_ActivityStatus = ACTIVITY_STATUS.ACTIVITY_END
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
XCountDown.RemoveTimer(XCountDown.GTimerName.Stronghold)
|
|||
|
XCountDown.CreateTimer(XCountDown.GTimerName.Stronghold, leftTime)
|
|||
|
|
|||
|
ClearActivityTimer()
|
|||
|
|
|||
|
if leftTime > 0 then
|
|||
|
_ActivityTimer =
|
|||
|
XScheduleManager.ScheduleOnce(
|
|||
|
function()
|
|||
|
UpdateActivityStatus()
|
|||
|
end,
|
|||
|
leftTime * XScheduleManager.SECOND
|
|||
|
)
|
|||
|
end
|
|||
|
|
|||
|
CsXGameEventManager.Instance:Notify(XEventId.EVENT_STRONGHOLD_ACTIVITY_STATUS_CHANGE)
|
|||
|
XEventManager.DispatchEvent(XEventId.EVENT_STRONGHOLD_ACTIVITY_STATUS_CHANGE)
|
|||
|
end
|
|||
|
|
|||
|
local function UpdateActivityInfo(activityId, beginTime, fightBeginTime)
|
|||
|
_ActivityId = activityId
|
|||
|
_BeginTime = beginTime
|
|||
|
_FightBeginTime = fightBeginTime
|
|||
|
_EndTime = _BeginTime + XStrongholdConfigs.GetActivityOneCycleSeconds(_ActivityId)
|
|||
|
_TotalDay = XStrongholdConfigs.GetActivityFightTotalDay(activityId)
|
|||
|
end
|
|||
|
|
|||
|
local function UpdateCurDay(data, fightBeginTime)
|
|||
|
if not data then
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
local totalDay = XStrongholdManager.GetTotalDay()
|
|||
|
_CurDay = data <= totalDay and data or _CurDay
|
|||
|
_FightBeginTime = fightBeginTime or _FightBeginTime
|
|||
|
|
|||
|
UpdateActivityStatus()
|
|||
|
|
|||
|
CsXGameEventManager.Instance:Notify(XEventId.EVENT_STRONGHOLD_CUR_DAY_CHANGE)
|
|||
|
end
|
|||
|
|
|||
|
local function CheckActivityReset(activityId)
|
|||
|
return IsNumberValid(_ActivityId) and _ActivityId ~= activityId
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.ClearActivityEnd()
|
|||
|
_ActivityEnd = nil
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.OnActivityEnd()
|
|||
|
if not _ActivityEnd then
|
|||
|
return false
|
|||
|
end
|
|||
|
|
|||
|
if CS.XFight.IsRunning or XLuaUiManager.IsUiLoad("UiLoading") then
|
|||
|
return false
|
|||
|
end
|
|||
|
|
|||
|
--延迟是为了防止打断UI动画
|
|||
|
XScheduleManager.ScheduleOnce(
|
|||
|
function()
|
|||
|
XLuaUiManager.RunMain()
|
|||
|
XUiManager.TipText("ActivityBranchOver")
|
|||
|
end,
|
|||
|
1000
|
|||
|
)
|
|||
|
|
|||
|
XStrongholdManager.ClearActivityEnd()
|
|||
|
|
|||
|
return true
|
|||
|
end
|
|||
|
|
|||
|
--活动开启
|
|||
|
function XStrongholdManager.IsOpen()
|
|||
|
return _ActivityStatus ~= ACTIVITY_STATUS.DEFAULT and _ActivityStatus ~= ACTIVITY_STATUS.ACTIVITY_END
|
|||
|
end
|
|||
|
|
|||
|
--挑战开始前
|
|||
|
function XStrongholdManager.IsActivityBegin()
|
|||
|
return _ActivityStatus == ACTIVITY_STATUS.ACTIVITY_BEGIN
|
|||
|
end
|
|||
|
|
|||
|
--挑战开始
|
|||
|
function XStrongholdManager.IsFightBegin()
|
|||
|
return _ActivityStatus == ACTIVITY_STATUS.FIGHT_BEGIN
|
|||
|
end
|
|||
|
|
|||
|
--挑战结束
|
|||
|
function XStrongholdManager.IsFightEnd()
|
|||
|
return _ActivityStatus == ACTIVITY_STATUS.FIGHT_END
|
|||
|
end
|
|||
|
|
|||
|
--活动结束
|
|||
|
function XStrongholdManager.IsEnd()
|
|||
|
return not XStrongholdManager.IsOpen()
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.CheckActivityStatus(status)
|
|||
|
return IsNumberValid(status) and status == _ActivityStatus
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetStartTime()
|
|||
|
if not IsNumberValid(_BeginTime) then
|
|||
|
return XStrongholdConfigs.GetActivityDefaultOpenTime()
|
|||
|
end
|
|||
|
|
|||
|
return _BeginTime
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetEndTime()
|
|||
|
if not IsNumberValid(_BeginTime) then
|
|||
|
return XStrongholdConfigs.GetActivityDefaultEndTime()
|
|||
|
end
|
|||
|
|
|||
|
return _EndTime
|
|||
|
end
|
|||
|
|
|||
|
--获取挑战时间
|
|||
|
function XStrongholdManager.GetFightTime()
|
|||
|
return _FightBeginTime, _FightEndTime
|
|||
|
end
|
|||
|
|
|||
|
--获取挑战开启时长
|
|||
|
function XStrongholdManager.GetFightPassingTime()
|
|||
|
if not XTool.IsNumberValid(_FightBeginTime) then
|
|||
|
return 0
|
|||
|
end
|
|||
|
local now = XTime.GetServerNowTimestamp()
|
|||
|
return now - _FightBeginTime
|
|||
|
end
|
|||
|
|
|||
|
--获取挑战自动开启时间
|
|||
|
function XStrongholdManager.GetFightAutoBeginTime()
|
|||
|
return _FightAutoBeginTime
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetCurDay()
|
|||
|
return _CurDay
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetTotalDay()
|
|||
|
return _TotalDay
|
|||
|
end
|
|||
|
|
|||
|
--获取每日结算时间 HH:mm
|
|||
|
function XStrongholdManager.GetCountTimeStr()
|
|||
|
local fightBeginTime = XStrongholdManager.GetFightTime()
|
|||
|
if not IsNumberValid(fightBeginTime) then
|
|||
|
return ""
|
|||
|
end
|
|||
|
return XTime.TimestampToGameDateTimeString(fightBeginTime, "HH:mm")
|
|||
|
end
|
|||
|
|
|||
|
--获取延后结算时间 X月X日HH:mm
|
|||
|
function XStrongholdManager.GetDelayCountTimeStr()
|
|||
|
local fightBeginTime = XStrongholdManager.GetFightTime()
|
|||
|
local countDay = XStrongholdManager.GetCurDay() + XStrongholdManager.GetDelayDays()
|
|||
|
local countTime = fightBeginTime + countDay * 3600 * 24
|
|||
|
return XTime.TimestampToGameDateTimeString(countTime, CsXTextManagerGetText("StrongholdTimeFormat"))
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.EnterUiMain(beforeOpenUiCb)
|
|||
|
if not XFunctionManager.DetectionFunction(XFunctionManager.FunctionName.Stronghold) then
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
if not XStrongholdManager.IsOpen() then
|
|||
|
XUiManager.TipText("StrongholdActivityNotOpen")
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
local callFunc = function()
|
|||
|
if beforeOpenUiCb then
|
|||
|
beforeOpenUiCb(
|
|||
|
function()
|
|||
|
XLuaUiManager.Open("UiStrongholdMain")
|
|||
|
end
|
|||
|
)
|
|||
|
else
|
|||
|
XLuaUiManager.Open("UiStrongholdMain")
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
if not XStrongholdManager.IsSelectedLevelId() then
|
|||
|
XLuaUiManager.Open("UiStrongholdChooseLevelType", callFunc)
|
|||
|
else
|
|||
|
callFunc()
|
|||
|
end
|
|||
|
end
|
|||
|
-----------------功能入口 end------------------
|
|||
|
-----------------矿场相关 begin------------------
|
|||
|
local _TotalMineral = 0 --历史累计矿石数量
|
|||
|
local _MineralLeft = 0 --可领矿石
|
|||
|
local _MinerItemId = 0 --矿工物品Id
|
|||
|
local _MineralItemId = 0 --矿石物品Id
|
|||
|
local _MinerEfficiency = 0 --矿工效率
|
|||
|
local _MinerGrowRate = 0 --矿工增殖百分比
|
|||
|
local _MineRecords = {} --产出记录
|
|||
|
local _MineRecordSynDic = {} --产出历史记录(服务端同步)
|
|||
|
local _OldMineralItemCount = 0 --缓存旧的矿石物品数量
|
|||
|
local _OldTotalMineralCount = 0 --缓存旧的预期总产出
|
|||
|
local _BatteryItemId = 0 --电池道具Id
|
|||
|
|
|||
|
local function InitMine()
|
|||
|
_MinerItemId = XStrongholdConfigs.GetCommonConfig("MinerId")
|
|||
|
_MineralItemId = XStrongholdConfigs.GetCommonConfig("MineralId")
|
|||
|
_MinerEfficiency = XStrongholdConfigs.GetCommonConfig("MinerEfficiency")
|
|||
|
_MinerGrowRate = XStrongholdConfigs.GetCommonConfig("MinerGrowRate")
|
|||
|
_BatteryItemId = XStrongholdConfigs.GetCommonConfig("BatteryItemId")
|
|||
|
end
|
|||
|
|
|||
|
local function UpdateTotalMineral(data)
|
|||
|
if not data then
|
|||
|
return
|
|||
|
end
|
|||
|
_TotalMineral = data
|
|||
|
end
|
|||
|
|
|||
|
local function UpdateMineralLeft(data)
|
|||
|
if not data then
|
|||
|
return
|
|||
|
end
|
|||
|
_MineralLeft = data
|
|||
|
|
|||
|
CsXGameEventManager.Instance:Notify(XEventId.EVENT_STRONGHOLD_MINERAL_LEFT_CHANGE)
|
|||
|
end
|
|||
|
|
|||
|
local function GetMineRecord(day)
|
|||
|
local record = _MineRecords[day]
|
|||
|
if not record then
|
|||
|
record = XStrongholdMineRecord.New(day)
|
|||
|
_MineRecords[day] = record
|
|||
|
end
|
|||
|
return record
|
|||
|
end
|
|||
|
|
|||
|
local function CalcMineRecords()
|
|||
|
local totalMineralCount = 0
|
|||
|
local totalDay = XStrongholdManager.GetTotalDay()
|
|||
|
for day = 1, totalDay do
|
|||
|
local minerCount, mineralCount = 0, 0
|
|||
|
|
|||
|
local synRecord = _MineRecordSynDic[day]
|
|||
|
if synRecord then
|
|||
|
minerCount = synRecord.MinerCount
|
|||
|
mineralCount = synRecord.MineralCount
|
|||
|
else
|
|||
|
minerCount = XStrongholdManager.GetPredictMinerCount(day)
|
|||
|
mineralCount = XStrongholdManager.GetPredictMineralCount(day)
|
|||
|
end
|
|||
|
|
|||
|
totalMineralCount = totalMineralCount + mineralCount
|
|||
|
|
|||
|
local record = GetMineRecord(day)
|
|||
|
record:UpdateData(minerCount, mineralCount, totalMineralCount)
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
local function UpdateMineRecords(data)
|
|||
|
_MineRecordSynDic = {}
|
|||
|
for _, synRecord in pairs(data or {}) do
|
|||
|
local synDay = synRecord.Day
|
|||
|
_MineRecordSynDic[synDay] = synRecord
|
|||
|
end
|
|||
|
|
|||
|
CalcMineRecords()
|
|||
|
CsXGameEventManager.Instance:Notify(XEventId.EVENT_STRONGHOLD_MINERAL_RECORD_CHANGE)
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.HasMineralLeft()
|
|||
|
if not XStrongholdManager.IsOpen() or XStrongholdManager.IsFightEnd() then
|
|||
|
return false
|
|||
|
end
|
|||
|
|
|||
|
return _MineralLeft > 0
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.EnterUiMine()
|
|||
|
XLuaUiManager.Open("UiStrongholdMining")
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetMinerItemId()
|
|||
|
return _MinerItemId
|
|||
|
end
|
|||
|
|
|||
|
--获取当前矿工人数
|
|||
|
function XStrongholdManager.GetMinerCount()
|
|||
|
return XDataCenter.ItemManager.GetCount(_MinerItemId)
|
|||
|
end
|
|||
|
|
|||
|
--预期矿工人数 = 当前矿工人数 + 当前矿工人数 * 增殖百分比
|
|||
|
function XStrongholdManager.GetPredictMinerCount(day)
|
|||
|
local predictMinerCount = XStrongholdManager.GetMinerCount()
|
|||
|
|
|||
|
local curDay = XStrongholdManager.GetCurDay()
|
|||
|
day = day or curDay
|
|||
|
|
|||
|
--修改为由矿产日志最后一次记录开始推算
|
|||
|
local lastRecordDay = curDay
|
|||
|
for i = 1, day do
|
|||
|
if not _MineRecordSynDic[i] then
|
|||
|
lastRecordDay = i
|
|||
|
break
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
for i = lastRecordDay, day - 1 do
|
|||
|
predictMinerCount = mathCeil(predictMinerCount + predictMinerCount * _MinerGrowRate * 0.01)
|
|||
|
end
|
|||
|
|
|||
|
return predictMinerCount
|
|||
|
end
|
|||
|
|
|||
|
--预期矿产数
|
|||
|
function XStrongholdManager.GetPredictMineralCount(day)
|
|||
|
day = day or XStrongholdManager.GetCurDay()
|
|||
|
local predictMinerCount = XStrongholdManager.GetPredictMinerCount(day)
|
|||
|
return XStrongholdManager.GetMineralOutput(predictMinerCount)
|
|||
|
end
|
|||
|
|
|||
|
--获取上一次查看的矿工人数
|
|||
|
function XStrongholdManager.GetCookieMinerCount()
|
|||
|
local key = XStrongholdManager.GetMinerCountCookieKey()
|
|||
|
return XSaveTool.GetData(key) or 0
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.SetCookieMinerCount(count)
|
|||
|
local key = XStrongholdManager.GetMinerCountCookieKey()
|
|||
|
XSaveTool.SaveData(key, count)
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.ClearCookieMinerCount()
|
|||
|
local key = XStrongholdManager.GetMinerCountCookieKey()
|
|||
|
XSaveTool.RemoveData(key)
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetMinerCountCookieKey()
|
|||
|
if not IsNumberValid(_ActivityId) then
|
|||
|
return
|
|||
|
end
|
|||
|
return XPlayer.Id .. _ActivityId .. "_XStrongholdManager_CookieMinerCount"
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetMineralItemId()
|
|||
|
return _MineralItemId
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetMineralCount()
|
|||
|
return XDataCenter.ItemManager.GetCount(_MinerItemId)
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetTotalMineralCount()
|
|||
|
return _TotalMineral or 0
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetTotalMinerEfficiency()
|
|||
|
return _MinerEfficiency or 0
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetTotalMinerGrowRate()
|
|||
|
return _MinerGrowRate or 0
|
|||
|
end
|
|||
|
|
|||
|
--产出矿石 = 矿工数量 * 矿工效率(向上取整)
|
|||
|
function XStrongholdManager.GetMineralOutput(minerCount)
|
|||
|
minerCount = minerCount or XStrongholdManager.GetMinerCount()
|
|||
|
return mathCeil(minerCount * _MinerEfficiency)
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetMineRecordsForShow()
|
|||
|
local showRecords = {}
|
|||
|
CalcMineRecords()
|
|||
|
--修改为获取时实时计算
|
|||
|
|
|||
|
for _, record in ipairs(_MineRecords) do
|
|||
|
local showRecord = {}
|
|||
|
showRecord.Day = record:GetDay()
|
|||
|
showRecord.MinerCount = record:GetMinerCount()
|
|||
|
showRecord.MineralCount = record:GetMineralCount()
|
|||
|
showRecord.TotalMineralCount = record:GetTotalMineralCount()
|
|||
|
|
|||
|
tableInsert(showRecords, showRecord)
|
|||
|
end
|
|||
|
|
|||
|
return showRecords
|
|||
|
end
|
|||
|
|
|||
|
--预期总产出 = 矿产记录最后一天总产出
|
|||
|
function XStrongholdManager.GetPredictTotalMineralCount()
|
|||
|
CalcMineRecords()
|
|||
|
--修改为获取时实时计算
|
|||
|
local totalDay = XStrongholdManager.GetTotalDay()
|
|||
|
local record = GetMineRecord(totalDay)
|
|||
|
return record:GetTotalMineralCount()
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.NotifyStrongholdTotalMineral(data)
|
|||
|
UpdateTotalMineral(data.TotalMineral)
|
|||
|
end
|
|||
|
|
|||
|
--领取矿石
|
|||
|
function XStrongholdManager.GetStrongholdMineralRequest(cb)
|
|||
|
XNetwork.Call(
|
|||
|
"GetStrongholdMineralRequest",
|
|||
|
nil,
|
|||
|
function(res)
|
|||
|
if res.Code ~= XCode.Success then
|
|||
|
XUiManager.TipCode(res.Code)
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
UpdateMineralLeft(0)
|
|||
|
|
|||
|
local mineralCount = res.MineralCount
|
|||
|
if cb then
|
|||
|
cb(mineralCount)
|
|||
|
end
|
|||
|
end
|
|||
|
)
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.CatchOldMineralItemCount(itemCount)
|
|||
|
_OldMineralItemCount = itemCount
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetOldItemCount()
|
|||
|
return _OldMineralItemCount
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.CatchOldTotalMineralCount()
|
|||
|
_OldTotalMineralCount = XStrongholdManager.GetPredictTotalMineralCount()
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetOldTotalMineralCount()
|
|||
|
return _OldTotalMineralCount
|
|||
|
end
|
|||
|
-----------------矿场相关 end------------------
|
|||
|
-----------------电场相关 begin------------------
|
|||
|
local _MaxElectricEnergy = 0 --电能上限
|
|||
|
local _ElectricTeamMaxCharacterNum = 0 --电能队伍最大人数
|
|||
|
local _ElectricCharacterIdDic = {} --电能队伍
|
|||
|
|
|||
|
local function InitElectric()
|
|||
|
_ElectricTeamMaxCharacterNum = XStrongholdConfigs.GetCommonConfig("MaxElectricTeamMemberCount")
|
|||
|
end
|
|||
|
|
|||
|
local function UpdateMaxElectricEnergy(data)
|
|||
|
_MaxElectricEnergy = data or _MaxElectricEnergy
|
|||
|
|
|||
|
CsXGameEventManager.Instance:Notify(XEventId.EVENT_STRONGHOLD_MAX_ELECTRIC_CHANGE)
|
|||
|
end
|
|||
|
|
|||
|
local function UpdateElectricCharacters(data)
|
|||
|
_ElectricCharacterIdDic = {}
|
|||
|
|
|||
|
local count = 0
|
|||
|
for _, characterId in ipairs(data or {}) do
|
|||
|
if count > _ElectricTeamMaxCharacterNum then
|
|||
|
XLog.Error(
|
|||
|
"XStrongholdManager UpdateElectricCharacters error: 同步电能队伍数据出错,超出最大队伍人数上限: " ..
|
|||
|
_ElectricTeamMaxCharacterNum .. ", data: ",
|
|||
|
data
|
|||
|
)
|
|||
|
break
|
|||
|
end
|
|||
|
|
|||
|
if characterId > 0 then
|
|||
|
_ElectricCharacterIdDic[characterId] = characterId
|
|||
|
count = count + 1
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
CsXGameEventManager.Instance:Notify(XEventId.EVENT_STRONGHOLD_MAX_ELECTRIC_CHANGE)
|
|||
|
CsXGameEventManager.Instance:Notify(XEventId.EVENT_STRONGHOLD_ELECTRIC_CHARACTER_CHANGE)
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetMaxElectricEnergy()
|
|||
|
return _MaxElectricEnergy
|
|||
|
end
|
|||
|
|
|||
|
--电能队伍战力达到要求后会额外增加电能上限
|
|||
|
function XStrongholdManager.GetExtraElectricEnergy()
|
|||
|
local totalAbility = XStrongholdManager.GetElectricCharactersTotalAbility()
|
|||
|
return XStrongholdConfigs.GetTeamAbilityToExtraElectric(totalAbility)
|
|||
|
end
|
|||
|
|
|||
|
--总电能上限
|
|||
|
function XStrongholdManager.GetTotalElectricEnergy()
|
|||
|
return _MaxElectricEnergy + XStrongholdManager.GetExtraElectricEnergy()
|
|||
|
end
|
|||
|
|
|||
|
--根据GroupId获得章节限制使用电能上限
|
|||
|
function XStrongholdManager.GetChapterMaxElectricUseByGroupId(groupId)
|
|||
|
if not XTool.IsNumberValid(groupId) then
|
|||
|
return 0
|
|||
|
end
|
|||
|
local chapterId = XStrongholdConfigs.GetChapterIdByGroupId(groupId)
|
|||
|
if not XTool.IsNumberValid(chapterId) then
|
|||
|
return 0
|
|||
|
end
|
|||
|
return XStrongholdConfigs.GetChapterMaxElectricUse(chapterId)
|
|||
|
end
|
|||
|
|
|||
|
--当前章节可使用总电能上限
|
|||
|
function XStrongholdManager.GetTotalCanUseElectricEnergy(groupId)
|
|||
|
local totalElectric = XStrongholdManager.GetTotalElectricEnergy()
|
|||
|
if not XTool.IsNumberValid(groupId) then
|
|||
|
return totalElectric
|
|||
|
end
|
|||
|
local limitElectric = XStrongholdManager.GetChapterMaxElectricUseByGroupId(groupId)
|
|||
|
if not XTool.IsNumberValid(limitElectric) then
|
|||
|
return totalElectric
|
|||
|
end
|
|||
|
return XMath.Clamp(totalElectric, totalElectric, limitElectric)
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetAddElectricEnergy()
|
|||
|
local day = XStrongholdManager.GetCurDay()
|
|||
|
local levelId = XStrongholdManager.GetLevelId()
|
|||
|
|
|||
|
if XStrongholdManager.IsAnyDayPaused() then
|
|||
|
--暂停时获取电能上限累积
|
|||
|
local totalCount = 0
|
|||
|
local totalDay = XStrongholdManager.GetTotalDay()
|
|||
|
local isContinuePaused = false
|
|||
|
for countDay = 1, totalDay do
|
|||
|
if XStrongholdManager.IsDayPaused(countDay) then
|
|||
|
isContinuePaused = true
|
|||
|
totalCount = totalCount + XStrongholdConfigs.GetElectricAdd(countDay, levelId)
|
|||
|
else
|
|||
|
if isContinuePaused then
|
|||
|
isContinuePaused = false
|
|||
|
totalCount = totalCount + XStrongholdConfigs.GetElectricAdd(countDay, levelId)
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
return totalCount
|
|||
|
else
|
|||
|
return XStrongholdConfigs.GetElectricAdd(day, levelId)
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
--检查已使用电能是否溢出
|
|||
|
function XStrongholdManager.CheckElectricOverLimit(cancelCharacterId, teamList, groupId)
|
|||
|
local totalElectric = 0
|
|||
|
if IsNumberValid(cancelCharacterId) then
|
|||
|
--撤回电能支援队员时电力减少值
|
|||
|
local ability = XDataCenter.CharacterManager.GetCharacterAbilityById(cancelCharacterId)
|
|||
|
local totalAbility = XStrongholdManager.GetElectricCharactersTotalAbility() - ability
|
|||
|
totalElectric = XStrongholdConfigs.GetTeamAbilityToExtraElectric(totalAbility) + _MaxElectricEnergy
|
|||
|
else
|
|||
|
totalElectric = XStrongholdManager.GetTotalCanUseElectricEnergy(groupId)
|
|||
|
end
|
|||
|
|
|||
|
local useElectric = XStrongholdManager.GetTotalUseElectricEnergy(teamList)
|
|||
|
return useElectric > totalElectric
|
|||
|
end
|
|||
|
|
|||
|
--获取电能队伍总战力
|
|||
|
function XStrongholdManager.GetElectricCharactersTotalAbility()
|
|||
|
local totalAbility = 0
|
|||
|
for _, characterId in pairs(_ElectricCharacterIdDic) do
|
|||
|
local ability = XDataCenter.CharacterManager.GetCharacterAbilityById(characterId)
|
|||
|
totalAbility = totalAbility + ability
|
|||
|
end
|
|||
|
return totalAbility
|
|||
|
end
|
|||
|
|
|||
|
--获取可上阵电能支援角色
|
|||
|
function XStrongholdManager.GetCanElectricCharacters(characterType)
|
|||
|
local characterList = XDataCenter.CharacterManager.GetOwnCharacterList(characterType)
|
|||
|
tableSort(
|
|||
|
characterList,
|
|||
|
function(a, b)
|
|||
|
--电能支援
|
|||
|
local aIsElectric = XStrongholdManager.CheckInElectricTeam(a.Id)
|
|||
|
local bIsElectric = XStrongholdManager.CheckInElectricTeam(b.Id)
|
|||
|
if aIsElectric ~= bIsElectric then
|
|||
|
return aIsElectric
|
|||
|
end
|
|||
|
|
|||
|
--已经上阵
|
|||
|
local aIsInTeam = XStrongholdManager.CheckInTeamList(a.Id)
|
|||
|
local bIsInTeam = XStrongholdManager.CheckInTeamList(b.Id)
|
|||
|
if aIsInTeam ~= bIsInTeam then
|
|||
|
return not aIsInTeam
|
|||
|
end
|
|||
|
|
|||
|
return false
|
|||
|
end
|
|||
|
)
|
|||
|
|
|||
|
return characterList
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetCookieElectricEnergy()
|
|||
|
local key = XStrongholdManager.GetElectricEnergyCookieKey()
|
|||
|
return XSaveTool.GetData(key) or 0
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.SetCookieElectricEnergy(count)
|
|||
|
local key = XStrongholdManager.GetElectricEnergyCookieKey()
|
|||
|
XSaveTool.SaveData(key, count)
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.ClearCookieElectricEnergy()
|
|||
|
local key = XStrongholdManager.GetElectricEnergyCookieKey()
|
|||
|
XSaveTool.RemoveData(key)
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetElectricEnergyCookieKey()
|
|||
|
if not IsNumberValid(_ActivityId) then
|
|||
|
return
|
|||
|
end
|
|||
|
return XPlayer.Id .. _ActivityId .. "_XStrongholdManager_MaxElectricEnergy"
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetElectricCharacterIds()
|
|||
|
local characterIds = {}
|
|||
|
for _, characterId in pairs(_ElectricCharacterIdDic) do
|
|||
|
tableInsert(characterIds, characterId)
|
|||
|
end
|
|||
|
return characterIds
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetElectricTeamMaxCharacterNum()
|
|||
|
return _ElectricTeamMaxCharacterNum
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.CheckInElectricTeam(characterId)
|
|||
|
return _ElectricCharacterIdDic[characterId] and true or false
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.CheckElectricMaxNum()
|
|||
|
local curNum = 0
|
|||
|
for _, characterId in pairs(_ElectricCharacterIdDic) do
|
|||
|
if characterId > 0 then
|
|||
|
curNum = curNum + 1
|
|||
|
end
|
|||
|
end
|
|||
|
local maxNum = XStrongholdManager.GetElectricTeamMaxCharacterNum()
|
|||
|
return curNum >= maxNum
|
|||
|
end
|
|||
|
|
|||
|
--设置电能队伍
|
|||
|
function XStrongholdManager.SetStrongholdElectricTeamRequest(characterIds, cb)
|
|||
|
local req = {CharacterIds = characterIds}
|
|||
|
XNetwork.Call(
|
|||
|
"SetStrongholdElectricTeamRequest",
|
|||
|
req,
|
|||
|
function(res)
|
|||
|
if res.Code ~= XCode.Success then
|
|||
|
XUiManager.TipCode(res.Code)
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
UpdateElectricCharacters(characterIds)
|
|||
|
|
|||
|
if cb then
|
|||
|
cb()
|
|||
|
end
|
|||
|
end
|
|||
|
)
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetBatteryItemId()
|
|||
|
return _BatteryItemId
|
|||
|
end
|
|||
|
-----------------电场相关 end------------------
|
|||
|
-----------------耐力相关 begin------------------
|
|||
|
local _Endurance = 0 --耐力值
|
|||
|
|
|||
|
local function UpdateEndurance(data)
|
|||
|
_Endurance = data or 0
|
|||
|
|
|||
|
CsXGameEventManager.Instance:Notify(XEventId.EVENT_STRONGHOLD_ENDURANCE_CHANGE)
|
|||
|
end
|
|||
|
|
|||
|
--当据点为章节关底时,消耗耐力应为之前未通关的关卡数之和
|
|||
|
function XStrongholdManager.GetGroupCostEndurance(groupId)
|
|||
|
if XStrongholdManager.IsGroupFinished(groupId) or XStrongholdManager.CheckGroupHasFinishedStage(groupId) then
|
|||
|
return 0
|
|||
|
end
|
|||
|
|
|||
|
local costEndurance = XStrongholdConfigs.GetGroupCostEndurance(groupId)
|
|||
|
|
|||
|
local allGroupIds = {}
|
|||
|
|
|||
|
local recurFunc
|
|||
|
recurFunc = function(tb)
|
|||
|
if IsTableEmpty(tb) then
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
for _, toFinisheGroupId in pairs(tb) do
|
|||
|
if not XStrongholdManager.IsGroupFinished(toFinisheGroupId) then
|
|||
|
allGroupIds[toFinisheGroupId] = toFinisheGroupId
|
|||
|
end
|
|||
|
|
|||
|
local toFinishGroupIds = XStrongholdConfigs.GetGroupFinishRelatedId(toFinisheGroupId)
|
|||
|
recurFunc(toFinishGroupIds)
|
|||
|
end
|
|||
|
end
|
|||
|
local toFinishGroupIds = XStrongholdConfigs.GetGroupFinishRelatedId(groupId)
|
|||
|
recurFunc(toFinishGroupIds)
|
|||
|
|
|||
|
for _, groupId in pairs(allGroupIds) do
|
|||
|
costEndurance = costEndurance + XStrongholdConfigs.GetGroupCostEndurance(groupId)
|
|||
|
end
|
|||
|
|
|||
|
return costEndurance
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetMaxEndurance()
|
|||
|
local curDay = XStrongholdManager.GetCurDay()
|
|||
|
local levelId = XStrongholdManager.GetLevelId()
|
|||
|
return XStrongholdConfigs.GetMaxEndurance(curDay - 1, levelId) +
|
|||
|
XStrongholdConfigs.GetLevelInitEndurance(levelId)
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetMaxLimitEndurance()
|
|||
|
local totalDay = XStrongholdManager.GetTotalDay()
|
|||
|
local levelId = XStrongholdManager.GetLevelId()
|
|||
|
return XStrongholdConfigs.GetMaxEndurance(totalDay, levelId) + XStrongholdConfigs.GetLevelInitEndurance(levelId)
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetCurEndurance()
|
|||
|
return _Endurance
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.NotifyStrongholdEnduranceData(data)
|
|||
|
UpdateEndurance(data.Endurance)
|
|||
|
end
|
|||
|
-----------------耐力相关 end------------------
|
|||
|
-----------------据点相关 begin------------------
|
|||
|
local _FinishGroupIdDic = {}
|
|||
|
--已完成据点Id字典
|
|||
|
local _NewFinishGroupIds = {}
|
|||
|
--最新完成据点Id列表
|
|||
|
local _GroupInfos = {}
|
|||
|
--据点信息
|
|||
|
local _CurrentSelectGroupId = 0 --当前选择的据点Id,用于检查队伍是否符合条件
|
|||
|
local _DelayTipChapterId = 0 --已通关前置据点,但未满足解锁条件的章节Id(通过条件后弹出解锁提示)
|
|||
|
|
|||
|
local function InitGroupInfos()
|
|||
|
local groupIds = XStrongholdConfigs.GetAllGroupIds()
|
|||
|
|
|||
|
for _, groupId in pairs(groupIds) do
|
|||
|
local groupInfo = XStrongholdGroupInfo.New(groupId)
|
|||
|
_GroupInfos[groupId] = groupInfo
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
local function GetGroupInfo(groupId)
|
|||
|
local groupInfo = _GroupInfos[groupId]
|
|||
|
if not groupInfo then
|
|||
|
XLog.Error(
|
|||
|
"XStrongholdManager GetGroupInfo error, groupId与服务端数据不对应, groupId: ",
|
|||
|
groupId .. ", _GroupInfos: ",
|
|||
|
_GroupInfos
|
|||
|
)
|
|||
|
return
|
|||
|
end
|
|||
|
return groupInfo
|
|||
|
end
|
|||
|
|
|||
|
local function ResetGroupInfo(groupId, stageId)
|
|||
|
if not IsNumberValid(groupId) then
|
|||
|
return
|
|||
|
end
|
|||
|
local groupInfo = GetGroupInfo(groupId)
|
|||
|
|
|||
|
if XTool.IsNumberValid(stageId) then
|
|||
|
groupInfo:ResetFinishStage(stageId)
|
|||
|
else
|
|||
|
groupInfo:ResetFinishStages()
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
local function UpdateGroupStageDatas(data)
|
|||
|
if IsTableEmpty(data) then
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
for _, stageData in pairs(data) do
|
|||
|
local groupId = stageData.Id
|
|||
|
if not IsNumberValid(groupId) then
|
|||
|
XLog.Error("XStrongholdManager UpdateGroupStageDatas error, groupId非法, data: ", data)
|
|||
|
end
|
|||
|
|
|||
|
local stageIds = stageData.StageIds
|
|||
|
local stageBuffIdDic = stageData.StageBuffId
|
|||
|
local supportId = stageData.SupportId
|
|||
|
local groupInfo = GetGroupInfo(groupId, true)
|
|||
|
|
|||
|
if groupInfo then
|
|||
|
groupInfo:InitStageData(stageIds, stageBuffIdDic, supportId)
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
XStrongholdManager.InitStageInfo()
|
|||
|
end
|
|||
|
|
|||
|
local function UpdateGroupInfos(data)
|
|||
|
if IsTableEmpty(data) then
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
for _, groupData in pairs(data) do
|
|||
|
local groupId = groupData.Id
|
|||
|
local finishStageIds = groupData.FinishStageIds
|
|||
|
local groupInfo = GetGroupInfo(groupId)
|
|||
|
groupInfo:UpdateFinishStages(finishStageIds)
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
local function UpdateFinishGroupIds(data)
|
|||
|
_FinishGroupIdDic = {}
|
|||
|
for _, groupId in pairs(data) do
|
|||
|
if XTool.IsNumberValid(groupId) then
|
|||
|
_FinishGroupIdDic[groupId] = groupId
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
--触发新手引导
|
|||
|
XDataCenter.GuideManager.CheckGuideOpen()
|
|||
|
|
|||
|
CsXGameEventManager.Instance:Notify(XEventId.EVENT_STRONGHOLD_FINISH_GROUP_CHANGE)
|
|||
|
end
|
|||
|
|
|||
|
local function UpdateFinishGroupUseElectricEnergy(data)
|
|||
|
for _, groupInfo in pairs(data or {}) do
|
|||
|
local groupId = groupInfo.Id
|
|||
|
if XTool.IsNumberValid(groupId) then
|
|||
|
GetGroupInfo(groupId):UpdatePassUseElectric(groupInfo.UsedElectricEnergy)
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
CsXGameEventManager.Instance:Notify(XEventId.EVENT_STRONGHOLD_FINISH_GROUP_USE_ELECTRIC_CHANGE)
|
|||
|
end
|
|||
|
|
|||
|
local function UpdateNewFinishGroupIds(data)
|
|||
|
if IsTableEmpty(data) then
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
_NewFinishGroupIds = {}
|
|||
|
for _, groupId in pairs(data) do
|
|||
|
if groupId > 0 and not _FinishGroupIdDic[groupId] then
|
|||
|
tableInsert(_NewFinishGroupIds, groupId)
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
--据点进度变更时章节界面检查
|
|||
|
function XStrongholdManager.CheckNewFinishGroupIds()
|
|||
|
--有需要延迟检查条件是否通过的章节
|
|||
|
if XTool.IsNumberValid(_DelayTipChapterId) then
|
|||
|
if XDataCenter.StrongholdManager.CheckChapterUnlock(_DelayTipChapterId) then
|
|||
|
local chapterName = XStrongholdConfigs.GetChapterName(_DelayTipChapterId)
|
|||
|
local msg = CsXTextManagerGetText("StrongholdtipNewChapter", chapterName)
|
|||
|
XUiManager.TipMsg(msg)
|
|||
|
_DelayTipChapterId = 0
|
|||
|
return
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
if IsTableEmpty(_NewFinishGroupIds) then
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
local tipChapterId
|
|||
|
local tipLastGroupDebuff = false
|
|||
|
--配置了StageBuff字段且非关底的据点通过时提示关底被削弱
|
|||
|
local tipNewChapter = false
|
|||
|
--通过关底据点时提示解锁新章节(此条弹出时忽略上一条提示)
|
|||
|
for _, groupId in pairs(_NewFinishGroupIds) do
|
|||
|
local chapterId = XStrongholdConfigs.GetChapterIdByGroupId(groupId)
|
|||
|
if XStrongholdConfigs.IsChapterLastGroupId(groupId) then
|
|||
|
local nextChapterId = XStrongholdConfigs.GetNextChapterId(chapterId)
|
|||
|
if XStrongholdManager.CheckChapterUnlock(nextChapterId) then
|
|||
|
tipNewChapter = true
|
|||
|
tipChapterId = nextChapterId
|
|||
|
break
|
|||
|
else
|
|||
|
_DelayTipChapterId = nextChapterId
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
if XStrongholdConfigs.CheckHasGroupBossBuffId(groupId, _ActivityId) then
|
|||
|
tipLastGroupDebuff = true
|
|||
|
tipChapterId = chapterId
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
if XTool.IsNumberValid(tipChapterId) then
|
|||
|
--新章节开启提示
|
|||
|
if tipNewChapter then
|
|||
|
local chapterName = XStrongholdConfigs.GetChapterName(tipChapterId)
|
|||
|
local msg = CsXTextManagerGetText("StrongholdtipNewChapter", chapterName)
|
|||
|
XUiManager.TipMsg(msg)
|
|||
|
elseif tipLastGroupDebuff then
|
|||
|
--关底BUFF削弱提示
|
|||
|
local lastGroupId = XStrongholdConfigs.GetChapterLastGroupId(tipChapterId)
|
|||
|
local groupOrder = XStrongholdConfigs.GetGroupOrder(lastGroupId)
|
|||
|
local msg = CsXTextManagerGetText("StrongholdTipLastGroupDebuff", groupOrder)
|
|||
|
XUiManager.TipMsg(msg)
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
_NewFinishGroupIds = {}
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetGroupStageIds(groupId)
|
|||
|
local groupInfo = GetGroupInfo(groupId)
|
|||
|
return groupInfo and groupInfo:GetStageIds() or {}
|
|||
|
end
|
|||
|
|
|||
|
--检查通关指定据点时使用的电量是否小于等于指定值
|
|||
|
function XStrongholdManager.CheckGroupPassUseElectric(groupId, requireUseElectric)
|
|||
|
if not XTool.IsNumberValid(groupId) then
|
|||
|
return false
|
|||
|
end
|
|||
|
|
|||
|
if not XStrongholdManager.IsGroupFinished(groupId) then
|
|||
|
return false
|
|||
|
end
|
|||
|
|
|||
|
local groupInfo = GetGroupInfo(groupId)
|
|||
|
if not groupInfo then
|
|||
|
return false
|
|||
|
end
|
|||
|
|
|||
|
local passUseElectric = groupInfo:GetPassUseElectric()
|
|||
|
return passUseElectric <= requireUseElectric
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetAllGroupStageIds()
|
|||
|
local allStageIds = {}
|
|||
|
for groupId in pairs(_GroupInfos) do
|
|||
|
local stageIds = XStrongholdManager.GetGroupStageIds(groupId)
|
|||
|
for _, stageId in pairs(stageIds) do
|
|||
|
tableInsert(allStageIds, stageId)
|
|||
|
end
|
|||
|
end
|
|||
|
return allStageIds
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetGroupStageId(groupId, stageIndex)
|
|||
|
local groupInfo = GetGroupInfo(groupId)
|
|||
|
return groupInfo and groupInfo:GetStageId(stageIndex) or 0
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetGroupStageName(groupId, stageIndex)
|
|||
|
local stageId = XStrongholdManager.GetGroupStageId(groupId, stageIndex)
|
|||
|
return stageId ~= 0 and XDataCenter.FubenManager.GetStageName(stageId) or ""
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetGroupStageBuffDesc(groupId, stageIndex)
|
|||
|
local groupInfo = GetGroupInfo(groupId)
|
|||
|
local buffId = groupInfo:GetStageBuffId(stageIndex)
|
|||
|
return buffId > 0 and XStrongholdConfigs.GetBuffDesc(buffId) or ""
|
|||
|
end
|
|||
|
|
|||
|
--获取据点BaseBuff
|
|||
|
function XStrongholdManager.GetGroupBaseBuffIds(groupId)
|
|||
|
return XStrongholdConfigs.GetGroupBaseBuffIds(groupId, _ActivityId)
|
|||
|
end
|
|||
|
|
|||
|
--获取据点BossBuff
|
|||
|
function XStrongholdManager.GetGroupBossBuffIds(groupId)
|
|||
|
return XStrongholdConfigs.GetGroupBossBuffIds(groupId, _ActivityId)
|
|||
|
end
|
|||
|
|
|||
|
--获取据点首通奖励Id
|
|||
|
function XStrongholdManager.GetGroupRewardId(groupId)
|
|||
|
local levelId = XStrongholdManager.GetLevelId()
|
|||
|
return XStrongholdConfigs.GetGroupRewardId(groupId, levelId)
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.CheckAnyGroupHasFinishedStage()
|
|||
|
for groupId, groupInfo in pairs(_GroupInfos) do
|
|||
|
if groupInfo:CheckHasStageFinished() then
|
|||
|
return groupId
|
|||
|
end
|
|||
|
end
|
|||
|
return false
|
|||
|
end
|
|||
|
|
|||
|
--检查据点是否有挑战中的关卡进度
|
|||
|
function XStrongholdManager.CheckGroupHasFinishedStage(groupId)
|
|||
|
local groupInfo = GetGroupInfo(groupId)
|
|||
|
return groupInfo and groupInfo:CheckHasStageFinished() or false
|
|||
|
end
|
|||
|
|
|||
|
--检查章节是否有挑战中的关卡进度
|
|||
|
function XStrongholdManager.CheckChapterHasFinishedStage(chapterId)
|
|||
|
local groupIds = XStrongholdConfigs.GetGroupIds(chapterId)
|
|||
|
for _, groupId in pairs(groupIds) do
|
|||
|
if XStrongholdManager.CheckGroupHasFinishedStage(groupId) then
|
|||
|
return true
|
|||
|
end
|
|||
|
end
|
|||
|
return false
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.IsGroupStageFinished(groupId, stageIndex)
|
|||
|
if not IsNumberValid(groupId) or not IsNumberValid(stageIndex) then
|
|||
|
return false
|
|||
|
end
|
|||
|
|
|||
|
local requireTeamMemberDic = XStrongholdManager.GetGroupRequireTeamMemberDic(groupId)
|
|||
|
if not requireTeamMemberDic[stageIndex] then
|
|||
|
return false
|
|||
|
end
|
|||
|
|
|||
|
local groupInfo = GetGroupInfo(groupId)
|
|||
|
return groupInfo and groupInfo:IsStageFinished(stageIndex) or false
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetGroupNextFightStageIndex(groupId)
|
|||
|
local groupInfo = GetGroupInfo(groupId)
|
|||
|
return groupInfo and groupInfo:GetNextFightStageIndex() or 0
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetGroupStageNum(groupId)
|
|||
|
return #XStrongholdManager.GetGroupStageIds(groupId)
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetGroupSupportId(groupId)
|
|||
|
local groupInfo = GetGroupInfo(groupId)
|
|||
|
return groupInfo and groupInfo:GetSupportId() or 0
|
|||
|
end
|
|||
|
|
|||
|
--获取据点要求梯队数量
|
|||
|
function XStrongholdManager.GetGroupRequireTeamNum(groupId)
|
|||
|
local groupInfo = GetGroupInfo(groupId)
|
|||
|
return groupInfo and groupInfo:GetRequireTeamNum() or 0
|
|||
|
end
|
|||
|
|
|||
|
--获取据点要求梯队数量
|
|||
|
function XStrongholdManager.GetGroupRequireTeamIds(groupId)
|
|||
|
local requireTeamIds = {}
|
|||
|
|
|||
|
if not groupId then
|
|||
|
--预设模式下返回默认最大数量
|
|||
|
local maxTeamNum = XStrongholdConfigs.GetMaxTeamNum()
|
|||
|
for teamId = 1, maxTeamNum do
|
|||
|
tableInsert(requireTeamIds, teamId)
|
|||
|
end
|
|||
|
else
|
|||
|
--读取战斗关卡要求队伍成员数量
|
|||
|
local requireTeamNum = XStrongholdManager.GetGroupRequireTeamNum(groupId)
|
|||
|
for teamId = 1, requireTeamNum do
|
|||
|
tableInsert(requireTeamIds, teamId)
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
return requireTeamIds
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetGroupRequireTeamMemberDic(groupId)
|
|||
|
local requireTeamMemberDic = {}
|
|||
|
local requireTeamNum = XStrongholdManager.GetGroupRequireTeamNum(groupId)
|
|||
|
for teamId = 1, requireTeamNum do
|
|||
|
local requireCount = XStrongholdConfigs.GetGroupRequireTeamMemberNum(groupId, teamId)
|
|||
|
if requireCount > 0 then
|
|||
|
requireTeamMemberDic[teamId] = requireCount
|
|||
|
end
|
|||
|
end
|
|||
|
return requireTeamMemberDic
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetGroupRequireAbility(groupId)
|
|||
|
if not IsNumberValid(groupId) then
|
|||
|
return 0
|
|||
|
end
|
|||
|
local supportId = XStrongholdManager.GetGroupSupportId(groupId)
|
|||
|
return supportId > 0 and XStrongholdConfigs.GetSupportRequireAbility(supportId) or 0
|
|||
|
end
|
|||
|
|
|||
|
--检查完美战术是否激活
|
|||
|
function XStrongholdManager.CheckSupportActive(supportId, teamList)
|
|||
|
if not XTool.IsNumberValid(supportId) then
|
|||
|
return false
|
|||
|
end
|
|||
|
local conditionIds = XStrongholdConfigs.GetSupportConditionIds(supportId)
|
|||
|
for _, conditionId in pairs(conditionIds) do
|
|||
|
if not XConditionManager.CheckCondition(conditionId, teamList) then
|
|||
|
return false
|
|||
|
end
|
|||
|
end
|
|||
|
return true
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.CheckGroupSupportAcitve(groupId, teamList)
|
|||
|
local supportId = XStrongholdManager.GetGroupSupportId(groupId)
|
|||
|
return XStrongholdManager.CheckSupportActive(supportId, teamList)
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.OpenUiSupport(groupId, teamList)
|
|||
|
local supportId = XStrongholdManager.GetGroupSupportId(groupId)
|
|||
|
if not IsNumberValid(supportId) then
|
|||
|
XLog.Error("XUiStrongholdDetail:OnClickBtnAssitantBuff error: 支援方案Id未配置, groupId: ", groupId)
|
|||
|
return
|
|||
|
end
|
|||
|
XLuaUiManager.Open("UiStrongholdSupportTips", supportId, teamList)
|
|||
|
end
|
|||
|
|
|||
|
--获取据点章节类型
|
|||
|
function XStrongholdManager.GetGroupChapterType(groupId)
|
|||
|
local groupInfo = GetGroupInfo(groupId)
|
|||
|
return groupInfo and groupInfo:GetChapterType() or XStrongholdConfigs.ChapterType.Normal
|
|||
|
end
|
|||
|
|
|||
|
--困难章节是否可显示
|
|||
|
function XStrongholdManager.IsChapterHardCanShow()
|
|||
|
local conditionId = XStrongholdConfigs.GetCommonConfig("MaintainChapterCondition")
|
|||
|
if not XTool.IsNumberValid(conditionId) then
|
|||
|
return true
|
|||
|
end
|
|||
|
return XConditionManager.CheckCondition(conditionId)
|
|||
|
end
|
|||
|
|
|||
|
--困难章节是否可显示,且普通章节全部通关
|
|||
|
function XStrongholdManager.IsChapterHardCanFight()
|
|||
|
if not XStrongholdManager.IsChapterHardCanShow() then
|
|||
|
return false
|
|||
|
end
|
|||
|
local finishCount = XStrongholdManager.GetFinishGroupCount(XStrongholdConfigs.ChapterType.Normal)
|
|||
|
local totalCount = XStrongholdManager.GetAllGroupCount(XStrongholdConfigs.ChapterType.Normal)
|
|||
|
return finishCount >= totalCount
|
|||
|
end
|
|||
|
|
|||
|
--获取据点进度
|
|||
|
function XStrongholdManager.GetGroupProgress()
|
|||
|
local finishCount, totalCount = 0, 0
|
|||
|
|
|||
|
finishCount = XStrongholdManager.GetFinishGroupCount(XStrongholdConfigs.ChapterType.Normal)
|
|||
|
totalCount = XStrongholdManager.GetAllGroupCount(XStrongholdConfigs.ChapterType.Normal)
|
|||
|
--普通章节全部通关,困难章节满足显示条件时,显示困难章节进度
|
|||
|
--否则显示普通章节进度
|
|||
|
if finishCount == totalCount and XStrongholdManager.IsChapterHardCanShow() then
|
|||
|
finishCount = XStrongholdManager.GetFinishGroupCount(XStrongholdConfigs.ChapterType.Hard)
|
|||
|
totalCount = XStrongholdManager.GetAllGroupCount(XStrongholdConfigs.ChapterType.Hard)
|
|||
|
end
|
|||
|
|
|||
|
return finishCount, totalCount
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetAllGroupCount(chapterType)
|
|||
|
local count = 0
|
|||
|
for _, groupInfo in pairs(_GroupInfos) do
|
|||
|
if not chapterType or groupInfo:GetChapterType() == chapterType then
|
|||
|
count = count + 1
|
|||
|
end
|
|||
|
end
|
|||
|
return count
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetFinishGroupCount(chapterType)
|
|||
|
local count = 0
|
|||
|
for groupId in pairs(_FinishGroupIdDic) do
|
|||
|
if groupId > 0 and (not chapterType or XStrongholdManager.GetGroupChapterType(groupId) == chapterType) then
|
|||
|
count = count + 1
|
|||
|
end
|
|||
|
end
|
|||
|
return count
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.IsGroupFinished(groupId)
|
|||
|
return _FinishGroupIdDic[groupId] and true or false
|
|||
|
end
|
|||
|
|
|||
|
--据点解锁条件为前置据点是否通关
|
|||
|
function XStrongholdManager.IsGroupUnlock(groupId)
|
|||
|
local preGroupId = XStrongholdConfigs.GetGroupPreGroupId(groupId)
|
|||
|
if not IsNumberValid(preGroupId) then
|
|||
|
return true
|
|||
|
end
|
|||
|
return XStrongholdManager.IsGroupFinished(preGroupId)
|
|||
|
end
|
|||
|
|
|||
|
--章节是否解锁
|
|||
|
function XStrongholdManager.CheckChapterUnlock(chapterId)
|
|||
|
local isUnlock, conditionDes = false, ""
|
|||
|
|
|||
|
if not XTool.IsNumberValid(chapterId) then
|
|||
|
return false
|
|||
|
end
|
|||
|
|
|||
|
--检查条件Id
|
|||
|
local conditionId = XStrongholdConfigs.GetChapterUnlockCondition(chapterId)
|
|||
|
if XTool.IsNumberValid(conditionId) then
|
|||
|
isUnlock, conditionDes = XConditionManager.CheckCondition(conditionId)
|
|||
|
if not isUnlock then
|
|||
|
return isUnlock, conditionDes
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
--检查章节的第一个据点的前置据点是否通关
|
|||
|
local firstGroupId = XStrongholdConfigs.GetChapterFirstGroupId(chapterId)
|
|||
|
isUnlock = XStrongholdManager.IsGroupUnlock(firstGroupId)
|
|||
|
local preGroupId = XStrongholdConfigs.GetGroupPreGroupId(firstGroupId)
|
|||
|
if IsNumberValid(preGroupId) then
|
|||
|
local groupName = XStrongholdConfigs.GetGroupOrder(preGroupId)
|
|||
|
conditionDes = CsXTextManagerGetText("StrongholdChapterUnlockCondition", groupName)
|
|||
|
end
|
|||
|
|
|||
|
return isUnlock, conditionDes
|
|||
|
end
|
|||
|
|
|||
|
--获取单章节进度
|
|||
|
function XStrongholdManager.GetChapterGroupProgress(chapterId)
|
|||
|
local finishCount, totalCount = 0, 0
|
|||
|
|
|||
|
local groupIds = XStrongholdConfigs.GetGroupIds(chapterId)
|
|||
|
totalCount = #groupIds
|
|||
|
for _, groupId in pairs(groupIds) do
|
|||
|
if XStrongholdManager.IsGroupFinished(groupId) then
|
|||
|
finishCount = finishCount + 1
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
return finishCount, totalCount
|
|||
|
end
|
|||
|
|
|||
|
--检查词缀是否激活
|
|||
|
function XStrongholdManager.CheckBuffActive(buffId, isBossBuff)
|
|||
|
local ret, desc = true, ""
|
|||
|
local conditionId = XStrongholdConfigs.GetBuffConditionId(buffId)
|
|||
|
if IsNumberValid(conditionId) then
|
|||
|
ret, desc = XConditionManager.CheckCondition(conditionId)
|
|||
|
end
|
|||
|
return ret, desc
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetCurrentSelectGroupId()
|
|||
|
return _CurrentSelectGroupId
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.SetCurrentSelectGroupId(groupId)
|
|||
|
_CurrentSelectGroupId = groupId or 0
|
|||
|
end
|
|||
|
|
|||
|
--检查是否有未完成的据点,并有足够耐力挑战
|
|||
|
function XStrongholdManager.CheckHasUnFinishedCanFightGroup()
|
|||
|
--当日首次登陆,且困难章节有可挑战据点
|
|||
|
if XStrongholdManager.CheckHardChapterCanFight() then
|
|||
|
return true
|
|||
|
end
|
|||
|
|
|||
|
local groupIds = XStrongholdConfigs.GetAllGroupIds(XStrongholdConfigs.ChapterType.Normal)
|
|||
|
for _, groupId in pairs(groupIds) do
|
|||
|
if not XStrongholdManager.IsGroupFinished(groupId) then
|
|||
|
local costEndurance = XStrongholdManager.GetGroupCostEndurance(groupId)
|
|||
|
local curEndurance = XStrongholdManager.GetCurEndurance()
|
|||
|
return costEndurance <= curEndurance
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
return false
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.SetCookieChapterHard()
|
|||
|
local key = XStrongholdManager.GetChapterHardCookieKey()
|
|||
|
XSaveTool.SaveData(key, 1)
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetCookieChapterHard()
|
|||
|
local key = XStrongholdManager.GetChapterHardCookieKey()
|
|||
|
return XSaveTool.GetData(key)
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetChapterHardCookieKey()
|
|||
|
if not IsNumberValid(_ActivityId) then
|
|||
|
return ""
|
|||
|
end
|
|||
|
local refreshTime = XTime.GetSeverNextRefreshTime()
|
|||
|
return string.format("XStrongholdManager_ChapterHard_%d_%d_%d", XPlayer.Id, _ActivityId, refreshTime)
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.SetCookieChapterHardFirstOpen()
|
|||
|
local key = XStrongholdManager.GetChapterHardFirstOpenCookieKey()
|
|||
|
XSaveTool.SaveData(key, 1)
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetCookieChapterHardFirstOpen()
|
|||
|
local key = XStrongholdManager.GetChapterHardFirstOpenCookieKey()
|
|||
|
return XSaveTool.GetData(key)
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetChapterHardFirstOpenCookieKey()
|
|||
|
if not IsNumberValid(_ActivityId) then
|
|||
|
return ""
|
|||
|
end
|
|||
|
return string.format("XStrongholdManager_ChapterHard_%d_%d", XPlayer.Id, _ActivityId)
|
|||
|
end
|
|||
|
|
|||
|
--困难章节首次开启
|
|||
|
function XStrongholdManager.CheckHardChapterFirstOpen()
|
|||
|
if not XStrongholdManager.IsChapterHardCanShow() then
|
|||
|
return false
|
|||
|
end
|
|||
|
|
|||
|
if XStrongholdManager.GetCookieChapterHardFirstOpen() then
|
|||
|
return false
|
|||
|
end
|
|||
|
|
|||
|
XUiManager.TipText("StrongholdActivityChapterHardFirstOpen")
|
|||
|
XStrongholdManager.SetCookieChapterHardFirstOpen()
|
|||
|
end
|
|||
|
|
|||
|
--当日首次登陆,且困难章节有可挑战据点
|
|||
|
function XStrongholdManager.CheckHardChapterCanFight()
|
|||
|
if not XStrongholdManager.IsChapterHardCanShow() then
|
|||
|
return false
|
|||
|
end
|
|||
|
|
|||
|
if XStrongholdManager.GetCookieChapterHard() then
|
|||
|
return false
|
|||
|
end
|
|||
|
|
|||
|
local chapterIds = XStrongholdConfigs.GetAllChapterIds(XStrongholdConfigs.ChapterType.Hard)
|
|||
|
for _, chapterId in pairs(chapterIds) do
|
|||
|
if XStrongholdManager.CheckChapterUnlock(chapterId) then
|
|||
|
local groupIds = XStrongholdConfigs.GetAllGroupIds(XStrongholdConfigs.ChapterType.Hard)
|
|||
|
for _, groupId in pairs(groupIds) do
|
|||
|
if not XStrongholdManager.IsGroupFinished(groupId) then
|
|||
|
return true
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
return false
|
|||
|
end
|
|||
|
|
|||
|
--重置据点进度
|
|||
|
function XStrongholdManager.ResetStrongholdGroupRequest(groupId, cb)
|
|||
|
local req = {Id = groupId}
|
|||
|
XNetwork.Call(
|
|||
|
"ResetStrongholdGroupRequest",
|
|||
|
req,
|
|||
|
function(res)
|
|||
|
if res.Code ~= XCode.Success then
|
|||
|
XUiManager.TipCode(res.Code)
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
ResetGroupInfo(groupId)
|
|||
|
XStrongholdManager.KickOutInvalidMembersInTeamList()
|
|||
|
--队伍信息中的援助角色也已经失效,需要清理
|
|||
|
XStrongholdManager.ResetCurFightInfo()
|
|||
|
|
|||
|
CsXGameEventManager.Instance:Notify(XEventId.EVENT_STRONGHOLD_FINISH_GROUP_CHANGE)
|
|||
|
|
|||
|
if cb then
|
|||
|
cb()
|
|||
|
end
|
|||
|
end
|
|||
|
)
|
|||
|
end
|
|||
|
|
|||
|
--重置关卡进度
|
|||
|
function XStrongholdManager.ResetStrongholdStageRequest(groupId, stageId, cb)
|
|||
|
local req = {GroupId = groupId, StageId = stageId}
|
|||
|
XNetwork.Call(
|
|||
|
"ResetStrongholdStageRequest",
|
|||
|
req,
|
|||
|
function(res)
|
|||
|
if res.Code ~= XCode.Success then
|
|||
|
XUiManager.TipCode(res.Code)
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
ResetGroupInfo(groupId, stageId)
|
|||
|
XStrongholdManager.KickOutInvalidMembersInTeamList()
|
|||
|
--队伍信息中的援助角色也已经失效,需要清理
|
|||
|
XStrongholdManager.ResetCurFightInfo()
|
|||
|
|
|||
|
CsXGameEventManager.Instance:Notify(XEventId.EVENT_STRONGHOLD_FINISH_GROUP_CHANGE)
|
|||
|
|
|||
|
if cb then
|
|||
|
cb()
|
|||
|
end
|
|||
|
end
|
|||
|
)
|
|||
|
end
|
|||
|
|
|||
|
--更新完成过的据点列表
|
|||
|
function XStrongholdManager.NotifyStrongholdFinishGroupId(data)
|
|||
|
UpdateNewFinishGroupIds(data.FinishGroupIds)
|
|||
|
UpdateFinishGroupIds(data.FinishGroupIds)
|
|||
|
UpdateMaxElectricEnergy(data.ElectricEnergy)
|
|||
|
UpdateFinishGroupUseElectricEnergy(data.FinishGroupInfos)
|
|||
|
end
|
|||
|
|
|||
|
--更新复刷据点使用的电量
|
|||
|
function XStrongholdManager.NotifyStrongholdFinishGroupInfo(data)
|
|||
|
UpdateFinishGroupUseElectricEnergy(data.FinishGroupInfos)
|
|||
|
end
|
|||
|
|
|||
|
--更新据点信息
|
|||
|
function XStrongholdManager.NotifyUpdateStrongholdGroupData(data)
|
|||
|
UpdateGroupInfos({data.GroupInfo})
|
|||
|
end
|
|||
|
|
|||
|
--删除据点信息
|
|||
|
function XStrongholdManager.NotifyDeleteStrongholdGroupData(data)
|
|||
|
ResetGroupInfo(data.Id)
|
|||
|
end
|
|||
|
-----------------据点相关 end------------------
|
|||
|
-----------------队伍相关 begin------------------
|
|||
|
local _TeamList = {} --队伍列表
|
|||
|
local _MaxTeamNum = 0 --最大队伍数量
|
|||
|
|
|||
|
local function InitTeamList()
|
|||
|
_MaxTeamNum = XStrongholdConfigs.GetMaxTeamNum()
|
|||
|
|
|||
|
for teamId = 1, _MaxTeamNum do
|
|||
|
local team = XStrongholdTeam.New(teamId)
|
|||
|
_TeamList[teamId] = team
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
local function GetTeam(teamId)
|
|||
|
local team = _TeamList[teamId]
|
|||
|
if not team then
|
|||
|
XLog.Error("XStrongholdManager GetTeam error, 找不到队伍数据, teamId: ", teamId .. ", _TeamList: ", _TeamList)
|
|||
|
return
|
|||
|
end
|
|||
|
return team
|
|||
|
end
|
|||
|
|
|||
|
local function ClearTeamList()
|
|||
|
for teamId, team in pairs(_TeamList) do
|
|||
|
team:Reset()
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
--原始需求:
|
|||
|
--战斗队伍的修改要同步到预设队伍
|
|||
|
--战斗队伍的修改不能影响到预设队伍其他未使用梯队
|
|||
|
--需求冲突:
|
|||
|
--无法保证被部分修改后的预设队伍合法性
|
|||
|
local function UpdateTeamList(data)
|
|||
|
ClearTeamList()
|
|||
|
if IsTableEmpty(data) then
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
-- local synedTeamIdCheckDic = {}
|
|||
|
--从服务端同步的真实队伍信息
|
|||
|
for _, teamInfo in pairs(data) do
|
|||
|
local teamId = teamInfo.Id
|
|||
|
-- synedTeamIdCheckDic[teamId] = teamId
|
|||
|
local team = GetTeam(teamId)
|
|||
|
team:Reset()
|
|||
|
team:SetCaptainPos(teamInfo.CaptainPos)
|
|||
|
team:SetFirstPos(teamInfo.FirstPos)
|
|||
|
team:SetRune(teamInfo.RuneId, teamInfo.SubRuneId)
|
|||
|
|
|||
|
for _, memberInfo in pairs(teamInfo.CharacterInfos) do
|
|||
|
team:SetMember(
|
|||
|
memberInfo.Pos,
|
|||
|
memberInfo.Id,
|
|||
|
memberInfo.PlayerId,
|
|||
|
memberInfo.RobotId,
|
|||
|
memberInfo.Ability
|
|||
|
)
|
|||
|
end
|
|||
|
|
|||
|
for _, pluginInfo in pairs(teamInfo.PluginInfos) do
|
|||
|
team:SetPlugin(pluginInfo.Id, pluginInfo.Count)
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
-- --同步完毕后对本地缓存队伍进行队员重复性检查
|
|||
|
-- for teamId, team in pairs(_TeamList) do
|
|||
|
-- if not synedTeamIdCheckDic[teamId] then
|
|||
|
-- end
|
|||
|
-- end
|
|||
|
CsXGameEventManager.Instance:Notify(XEventId.EVENT_STRONGHOLD_TEAMLIST_CHANGE)
|
|||
|
end
|
|||
|
|
|||
|
--从队伍列表生成原始服务端队伍数据
|
|||
|
local function GenerateOriginalTeamInfos(teamList)
|
|||
|
local teamInfos = {}
|
|||
|
|
|||
|
for _, team in pairs(teamList) do
|
|||
|
local teamInfo = {}
|
|||
|
|
|||
|
teamInfo.Id = team:GetId()
|
|||
|
teamInfo.CaptainPos = team:GetCaptainPos()
|
|||
|
teamInfo.FirstPos = team:GetFirstPos()
|
|||
|
teamInfo.RuneId, teamInfo.SubRuneId = team:GetRune()
|
|||
|
|
|||
|
teamInfo.CharacterInfos = {}
|
|||
|
local members = team:GetAllMembers()
|
|||
|
|
|||
|
--一队固定3角色
|
|||
|
for i = 1, 3 do
|
|||
|
local member = members[i]
|
|||
|
local characterInfo = {}
|
|||
|
characterInfo.Pos = member and member:GetPos() or i
|
|||
|
local robotId = member and member:GetRobotId() or 0
|
|||
|
characterInfo.RobotId = robotId
|
|||
|
local characterId = member and member:GetCharacterId() or 0
|
|||
|
characterInfo.Id = IsNumberValid(characterId) and characterId or XRobotManager.GetCharacterId(robotId)
|
|||
|
--服务端他一定要kt.
|
|||
|
characterInfo.PlayerId = member and member:GetPlayerId() or 0
|
|||
|
characterInfo.Ability = member and member:GetAbility() or 0
|
|||
|
tableInsert(teamInfo.CharacterInfos, characterInfo)
|
|||
|
end
|
|||
|
|
|||
|
teamInfo.PluginInfos = {}
|
|||
|
local plugins = team:GetAllPlugins()
|
|||
|
for _, plugin in pairs(plugins) do
|
|||
|
local pluginInfo = {}
|
|||
|
pluginInfo.Id = plugin:GetId()
|
|||
|
pluginInfo.Count = plugin:GetCount()
|
|||
|
tableInsert(teamInfo.PluginInfos, pluginInfo)
|
|||
|
end
|
|||
|
|
|||
|
tableInsert(teamInfos, teamInfo)
|
|||
|
end
|
|||
|
|
|||
|
return teamInfos
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetTeamListTemp()
|
|||
|
return Clone(_TeamList)
|
|||
|
end
|
|||
|
|
|||
|
--获取根据据点人数要求裁剪后的队伍列表Clone(bad performance cause GC)
|
|||
|
function XStrongholdManager.GetTeamListClipTemp(groupId, teamList)
|
|||
|
local teamList = teamList and Clone(teamList) or Clone(_TeamList)
|
|||
|
|
|||
|
local isPrefab = not IsNumberValid(groupId)
|
|||
|
|
|||
|
if not isPrefab then
|
|||
|
--战斗编队模式下按照关卡队伍要求修整队伍
|
|||
|
local requireTeamMemberDic = XStrongholdManager.GetGroupRequireTeamMemberDic(groupId)
|
|||
|
|
|||
|
--剔除不在配置的队伍要求人数字典中的队伍
|
|||
|
for teamId in pairs(teamList) do
|
|||
|
if not requireTeamMemberDic[teamId] then
|
|||
|
teamList[teamId] = nil
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
--按照队伍要求人数裁剪每个队伍中多余的队员
|
|||
|
for teamId, requireTeamMember in pairs(requireTeamMemberDic) do
|
|||
|
local team = teamList[teamId]
|
|||
|
team:ClipMembers(requireTeamMember)
|
|||
|
end
|
|||
|
else
|
|||
|
--预设模式下剔除掉自己拥有的角色以外的队伍成员
|
|||
|
for _, team in pairs(teamList) do
|
|||
|
team:KickOutOtherMembers()
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
XStrongholdManager.KickOutInvalidMembersInTeamList(teamList, groupId)
|
|||
|
|
|||
|
return teamList
|
|||
|
end
|
|||
|
|
|||
|
--剔除队伍列表中已经失效的援助角色
|
|||
|
function XStrongholdManager.KickOutInvalidMembersInTeamList(teamList, groupId)
|
|||
|
teamList = teamList or _TeamList
|
|||
|
for stageIndex, team in pairs(teamList) do
|
|||
|
--有关卡挑战进度的援助角色不清
|
|||
|
if not XStrongholdManager.IsGroupStageFinished(groupId, stageIndex) then
|
|||
|
team:KickOutInvalidMembers()
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
--重置队伍列表
|
|||
|
function XStrongholdManager.ClearTeamList(teamList)
|
|||
|
teamList = teamList or _TeamList
|
|||
|
for _, team in pairs(teamList) do
|
|||
|
team:Clear()
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
--自动编队
|
|||
|
--依照玩家拥有的角色进行填充,自队伍1至队伍5
|
|||
|
--填充时先按照最后一个关卡组中的每个关卡对应的优势属性,优先上阵推荐属性的角色
|
|||
|
--然后按照玩家拥有角色的战力高低进行填充
|
|||
|
--支援和试用角色不会自动上阵
|
|||
|
--未设置符文的梯队自左至右,按照符文表的ID依次填充,全部使用第一个子符文
|
|||
|
function XStrongholdManager.AutoTeam(teamList)
|
|||
|
teamList = teamList or _TeamList
|
|||
|
|
|||
|
XStrongholdManager.ClearTeamList(teamList)
|
|||
|
|
|||
|
local lastGroupId = XStrongholdManager.GetLastGroupId()
|
|||
|
local stageIdList = XStrongholdManager.GetGroupStageIds(lastGroupId)
|
|||
|
|
|||
|
--自动编队仅上阵已拥有构造体
|
|||
|
local ownCharacters = XDataCenter.CharacterManager.GetOwnCharacterList()
|
|||
|
tableSort(
|
|||
|
ownCharacters,
|
|||
|
function(a, b)
|
|||
|
return a.Ability > b.Ability
|
|||
|
end
|
|||
|
)
|
|||
|
|
|||
|
local waitCharacterIds = {}
|
|||
|
for _, character in ipairs(ownCharacters) do
|
|||
|
local characterId = character.Id
|
|||
|
--不能在电能支援队伍中
|
|||
|
if not XStrongholdManager.CheckInElectricTeam(characterId) then
|
|||
|
tableInsert(waitCharacterIds, characterId)
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
local requireTeamIds = XStrongholdManager.GetGroupRequireTeamIds()
|
|||
|
|
|||
|
--每支队伍先上阵推荐属性的角色
|
|||
|
for _, teamId in ipairs(requireTeamIds) do
|
|||
|
local team = teamList[teamId]
|
|||
|
local stageId = stageIdList[teamId]
|
|||
|
local memberNum = XStrongholdConfigs.GetMaxTeamMemberNum()
|
|||
|
for pos = 1, memberNum do
|
|||
|
if stageId then
|
|||
|
for index, characterId in ipairs(waitCharacterIds) do
|
|||
|
if XFubenConfigs.IsStageRecommendCharacterType(stageId, characterId) then
|
|||
|
local member = team:GetMember(pos)
|
|||
|
member:SetCharacterId(characterId)
|
|||
|
tableRemove(waitCharacterIds, index)
|
|||
|
break
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
for _, teamId in ipairs(requireTeamIds) do
|
|||
|
local team = teamList[teamId]
|
|||
|
local memberNum = XStrongholdConfigs.GetMaxTeamMemberNum()
|
|||
|
for pos = 1, memberNum do
|
|||
|
local member = team:GetMember(pos)
|
|||
|
if member:IsEmpty() then
|
|||
|
for index, characterId in ipairs(waitCharacterIds) do
|
|||
|
local characterType = XCharacterConfigs.GetCharacterType(characterId)
|
|||
|
if not team:ExistDifferentCharacterType(characterType) then
|
|||
|
member:SetCharacterId(characterId)
|
|||
|
tableRemove(waitCharacterIds, index)
|
|||
|
break
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
XStrongholdManager.AutoRune(teamList)
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetLastGroupId()
|
|||
|
local allChapterIds = XStrongholdConfigs.GetAllChapterIds()
|
|||
|
local lastChapter = allChapterIds[#allChapterIds]
|
|||
|
local groupIds = XStrongholdConfigs.GetGroupIds(lastChapter)
|
|||
|
return groupIds[#groupIds]
|
|||
|
end
|
|||
|
|
|||
|
--获取已使用电能总和
|
|||
|
function XStrongholdManager.GetTotalUseElectricEnergy(teamList)
|
|||
|
local useElectric = 0
|
|||
|
|
|||
|
teamList = teamList or _TeamList
|
|||
|
for _, team in pairs(teamList) do
|
|||
|
useElectric = useElectric + team:GetUseElectricEnergy()
|
|||
|
end
|
|||
|
|
|||
|
return useElectric
|
|||
|
end
|
|||
|
|
|||
|
--检查队伍是否符合当前挑战的关卡中的队伍人数要求
|
|||
|
function XStrongholdManager.CheckCurGroupTeamFull(teamList)
|
|||
|
local groupId = XStrongholdManager.GetCurrentSelectGroupId()
|
|||
|
if not IsNumberValid(groupId) then
|
|||
|
return false
|
|||
|
end
|
|||
|
|
|||
|
teamList = teamList or _TeamList
|
|||
|
local requireTeamMemberDic = XStrongholdManager.GetGroupRequireTeamMemberDic(groupId)
|
|||
|
for teamId, requireTeamMemberNum in pairs(requireTeamMemberDic) do
|
|||
|
local team = teamList[teamId]
|
|||
|
for pos = 1, requireTeamMemberNum do
|
|||
|
local member = team:GetMember(pos)
|
|||
|
if not member or member:IsEmpty() then
|
|||
|
return false
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
return true
|
|||
|
end
|
|||
|
|
|||
|
--获取队伍列表战力总和
|
|||
|
function XStrongholdManager.GetTeamListTotalAbility(teamList)
|
|||
|
local totalAbility = 0
|
|||
|
teamList = teamList or _TeamList
|
|||
|
for _, team in pairs(teamList) do
|
|||
|
local ability = team:GetTeamAbility()
|
|||
|
totalAbility = totalAbility + ability
|
|||
|
end
|
|||
|
return totalAbility
|
|||
|
end
|
|||
|
|
|||
|
--检查队伍列表平均战力是否符合要求
|
|||
|
function XStrongholdManager.CheckTeamListAverageAbility(requireAbility, teamList)
|
|||
|
local groupId = XStrongholdManager.GetCurrentSelectGroupId()
|
|||
|
if not IsNumberValid(groupId) then
|
|||
|
return false
|
|||
|
end
|
|||
|
|
|||
|
local totalAbility, memberCount = 0, 0
|
|||
|
|
|||
|
teamList = teamList or _TeamList
|
|||
|
local requireTeamNum = XStrongholdManager.GetGroupRequireTeamNum(groupId)
|
|||
|
for teamId = 1, requireTeamNum do
|
|||
|
local team = teamList[teamId]
|
|||
|
local requireTeamMemberNum = XStrongholdConfigs.GetGroupRequireTeamMemberNum(groupId, teamId)
|
|||
|
for pos = 1, requireTeamMemberNum do
|
|||
|
if not team:CheckPosEmpty(pos) then
|
|||
|
totalAbility = totalAbility + team:GetTeamMemberAbility(pos)
|
|||
|
memberCount = memberCount + 1
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
local averageAbility = memberCount > 0 and totalAbility / memberCount or 0
|
|||
|
return averageAbility >= requireAbility, averageAbility
|
|||
|
end
|
|||
|
|
|||
|
--检查队伍列表内的队伍中每名成员是否符合战力要求
|
|||
|
function XStrongholdManager.CheckTeamListEveryMemberAbility(requireAbility, teamList)
|
|||
|
local groupId = XStrongholdManager.GetCurrentSelectGroupId()
|
|||
|
if not IsNumberValid(groupId) then
|
|||
|
return false
|
|||
|
end
|
|||
|
|
|||
|
teamList = teamList or _TeamList
|
|||
|
local requireTeamNum = XStrongholdManager.GetGroupRequireTeamNum(groupId)
|
|||
|
for teamId = 1, requireTeamNum do
|
|||
|
local team = teamList[teamId]
|
|||
|
local requireTeamMemberNum = XStrongholdConfigs.GetGroupRequireTeamMemberNum(groupId, teamId)
|
|||
|
if not team:CheckTeamEveryMemberAbility(requireAbility, requireTeamMemberNum) then
|
|||
|
return false
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
return true
|
|||
|
end
|
|||
|
|
|||
|
--检查角色是否在队伍列表中
|
|||
|
function XStrongholdManager.CheckInTeamList(characterId, teamList, playerId, notCheckTeamId)
|
|||
|
if not IsNumberValid(characterId) then
|
|||
|
return false
|
|||
|
end
|
|||
|
teamList = teamList or _TeamList
|
|||
|
for _, team in pairs(teamList) do
|
|||
|
if team:GetId() ~= notCheckTeamId and team:CheckInTeam(characterId, playerId) then
|
|||
|
return true
|
|||
|
end
|
|||
|
end
|
|||
|
return false
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetCharacterInTeamId(characterId, teamList, playerId)
|
|||
|
if not IsNumberValid(characterId) then
|
|||
|
return 0
|
|||
|
end
|
|||
|
teamList = teamList or _TeamList
|
|||
|
local isInTeam, pos
|
|||
|
for teamId, team in pairs(teamList) do
|
|||
|
isInTeam, pos = team:CheckInTeam(characterId, playerId)
|
|||
|
if isInTeam then
|
|||
|
return teamId, pos
|
|||
|
end
|
|||
|
end
|
|||
|
return 0, 0
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetTeamCaptinPosAndFirstPos(teamId, teamList)
|
|||
|
local team = teamList and teamList[teamId] or GetTeam(teamId)
|
|||
|
return team:GetCaptainPos(), team:GetFirstPos()
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetTeamShowCharacterIds(teamId, teamList)
|
|||
|
local team = teamList and teamList[teamId] or GetTeam(teamId)
|
|||
|
return team:GetShowCharacterIds()
|
|||
|
end
|
|||
|
|
|||
|
--检查角色是否在队伍列表中并存在通关记录
|
|||
|
function XStrongholdManager.CheckInTeamListLock(groupId, characterId, teamList, playerId)
|
|||
|
if not IsNumberValid(groupId) then
|
|||
|
return false
|
|||
|
end
|
|||
|
local stageIndex = XStrongholdManager.GetCharacterInTeamId(characterId, teamList, playerId)
|
|||
|
if not IsNumberValid(stageIndex) then
|
|||
|
return false
|
|||
|
end
|
|||
|
return XStrongholdManager.IsGroupStageFinished(groupId, stageIndex)
|
|||
|
end
|
|||
|
|
|||
|
--检查队伍列表中是否已上阵相同型号角色
|
|||
|
function XStrongholdManager.CheckTeamListExistSameCharacter(
|
|||
|
waitCharacterId,
|
|||
|
teamList,
|
|||
|
playerId,
|
|||
|
selectTeamId,
|
|||
|
selectMemberIndex)
|
|||
|
if not IsNumberValid(waitCharacterId) then
|
|||
|
return false
|
|||
|
end
|
|||
|
teamList = teamList or _TeamList
|
|||
|
|
|||
|
local count = 1
|
|||
|
|
|||
|
--在队伍中找到的相同型号角色的位置
|
|||
|
local findTeamId, findMemberIndex = 0, 0
|
|||
|
for teamId, team in pairs(teamList) do
|
|||
|
findMemberIndex = team:GetSameCharacterPos(waitCharacterId)
|
|||
|
if IsNumberValid(findMemberIndex) then
|
|||
|
findTeamId = teamId
|
|||
|
break
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
--存在相同型号角色
|
|||
|
local existSameCharacter = IsNumberValid(findTeamId) and IsNumberValid(findMemberIndex)
|
|||
|
if existSameCharacter then
|
|||
|
count = count + 1
|
|||
|
|
|||
|
--找到的角色位置即将被替换掉
|
|||
|
if selectTeamId == findTeamId and selectMemberIndex == findMemberIndex then
|
|||
|
count = count - 1
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
--在队伍中找到的待操作角色的位置
|
|||
|
local waitTeamId, waitMemberIndex = 0, 0
|
|||
|
for teamId, team in pairs(teamList) do
|
|||
|
waitMemberIndex = team:GetInTeamMemberIndex(waitCharacterId, playerId)
|
|||
|
if IsNumberValid(waitMemberIndex) then
|
|||
|
waitTeamId = teamId
|
|||
|
break
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
--待操作角色已经在队伍中
|
|||
|
local waitCharacterInTeam = IsNumberValid(waitTeamId) and IsNumberValid(waitMemberIndex)
|
|||
|
if waitCharacterInTeam then
|
|||
|
--找到的位置和待操作角色的位置相同
|
|||
|
local samePos = findTeamId == waitTeamId and findMemberIndex == waitMemberIndex
|
|||
|
if samePos then
|
|||
|
count = count - 1
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
return count > 1
|
|||
|
end
|
|||
|
|
|||
|
--检查队伍列表中是否已上阵支援角色(只能上阵一个)
|
|||
|
function XStrongholdManager.CheckTeamListExistAssitantCharacter(teamList)
|
|||
|
teamList = teamList or _TeamList
|
|||
|
for teamId, team in pairs(teamList) do
|
|||
|
if team:CheckExistAssitantCharacter() then
|
|||
|
return true
|
|||
|
end
|
|||
|
end
|
|||
|
return false
|
|||
|
end
|
|||
|
|
|||
|
--检查队伍列表是否为空
|
|||
|
function XStrongholdManager.CheckTeamListEmpty(teamList, groupId)
|
|||
|
teamList = teamList or _TeamList
|
|||
|
for teamId, team in pairs(teamList) do
|
|||
|
local requireTeamMemberNum = XStrongholdConfigs.GetGroupRequireTeamMemberNum(groupId, teamId)
|
|||
|
for pos = 1, requireTeamMemberNum do
|
|||
|
if not team:CheckPosEmpty(pos) then
|
|||
|
return false
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
return true
|
|||
|
end
|
|||
|
|
|||
|
--检查队伍列表中所有队伍是否均有队长/首发
|
|||
|
function XStrongholdManager.CheckTeamListAllHasCaptainAndFirstPos(groupId, teamList)
|
|||
|
local allHasCaptain, allHasFirstPos = true, true
|
|||
|
|
|||
|
local requireTeamNum = XStrongholdManager.GetGroupRequireTeamNum(groupId)
|
|||
|
teamList = teamList or _TeamList
|
|||
|
for teamId = 1, requireTeamNum do
|
|||
|
local team = teamList[teamId]
|
|||
|
if not team then
|
|||
|
return false, false
|
|||
|
end
|
|||
|
|
|||
|
if not team:CheckHasCaptain() then
|
|||
|
allHasCaptain = false
|
|||
|
end
|
|||
|
if not team:CheckHasFirstPos() then
|
|||
|
allHasFirstPos = false
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
return allHasCaptain, allHasFirstPos
|
|||
|
end
|
|||
|
|
|||
|
--获取可上阵已拥有角色/机器人
|
|||
|
function XStrongholdManager.GetCanUseCharacterOrRobotIds(groupId, stageIndex, characterType, teamList)
|
|||
|
local isPrefab = not IsNumberValid(groupId)
|
|||
|
local levelId = XStrongholdManager.GetLevelId()
|
|||
|
local ids = not isPrefab and XStrongholdConfigs.GetGroupCanUseRobotIds(groupId, characterType, levelId) or {}
|
|||
|
|
|||
|
local characterList = XDataCenter.CharacterManager.GetOwnCharacterList(characterType)
|
|||
|
for _, character in pairs(characterList) do
|
|||
|
tableInsert(ids, character.Id)
|
|||
|
end
|
|||
|
|
|||
|
local stageId = groupId and XStrongholdManager.GetGroupStageId(groupId, stageIndex) or nil
|
|||
|
teamList = teamList or _TeamList
|
|||
|
tableSort(
|
|||
|
ids,
|
|||
|
function(aId, bId)
|
|||
|
--电能支援
|
|||
|
local aIsElectric = XStrongholdManager.CheckInElectricTeam(aId)
|
|||
|
local bIsElectric = XStrongholdManager.CheckInElectricTeam(bId)
|
|||
|
if aIsElectric ~= bIsElectric then
|
|||
|
return not aIsElectric
|
|||
|
end
|
|||
|
|
|||
|
--已经上阵
|
|||
|
local aIsInTeam = XStrongholdManager.CheckInTeamList(aId, teamList)
|
|||
|
local bIsInTeam = XStrongholdManager.CheckInTeamList(bId, teamList)
|
|||
|
if aIsInTeam ~= bIsInTeam then
|
|||
|
return not aIsInTeam
|
|||
|
end
|
|||
|
|
|||
|
--关卡推荐排序
|
|||
|
if stageId then
|
|||
|
local aIsStageRecomend = XFubenConfigs.IsStageRecommendCharacterType(stageId, aId)
|
|||
|
local bIsStageRecomend = XFubenConfigs.IsStageRecommendCharacterType(stageId, bId)
|
|||
|
if aIsStageRecomend ~= bIsStageRecomend then
|
|||
|
return aIsStageRecomend
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
--自己战力比试玩推荐角色高的优先
|
|||
|
if stageId then
|
|||
|
local aIsMediumRecommend = XStrongholdManager.CheckIsMediumRecommend(aId, stageId)
|
|||
|
local bIsMediumRecommend = XStrongholdManager.CheckIsMediumRecommend(bId, stageId)
|
|||
|
if aIsMediumRecommend ~= bIsMediumRecommend then
|
|||
|
return aIsMediumRecommend
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
--试玩角色
|
|||
|
local aIsRobot = XRobotManager.CheckIsRobotId(aId)
|
|||
|
local bIsRobot = XRobotManager.CheckIsRobotId(bId)
|
|||
|
if aIsRobot ~= bIsRobot then
|
|||
|
return aIsRobot
|
|||
|
end
|
|||
|
|
|||
|
--战力排序
|
|||
|
local aAbility =
|
|||
|
aIsRobot and XRobotManager.GetRobotAbility(aId) or
|
|||
|
XDataCenter.CharacterManager.GetCharacterAbilityById(aId)
|
|||
|
local bAbility =
|
|||
|
bIsRobot and XRobotManager.GetRobotAbility(bId) or
|
|||
|
XDataCenter.CharacterManager.GetCharacterAbilityById(bId)
|
|||
|
if aAbility ~= bAbility then
|
|||
|
return aAbility > bAbility
|
|||
|
end
|
|||
|
|
|||
|
return false
|
|||
|
end
|
|||
|
)
|
|||
|
|
|||
|
return ids
|
|||
|
end
|
|||
|
|
|||
|
--检查是否中等推荐
|
|||
|
function XStrongholdManager.CheckIsMediumRecommend(charId, stageId)
|
|||
|
if not stageId then
|
|||
|
return false
|
|||
|
end
|
|||
|
|
|||
|
local isStageRecomend = XFubenConfigs.IsStageRecommendCharacterType(stageId, charId)
|
|||
|
if not isStageRecomend then
|
|||
|
return false
|
|||
|
end
|
|||
|
|
|||
|
local isRobot = XRobotManager.CheckIsRobotId(charId)
|
|||
|
if not isRobot then
|
|||
|
return true
|
|||
|
end
|
|||
|
|
|||
|
local notRobotCharacterId = XRobotManager.GetCharacterId(charId)
|
|||
|
local notRobotCharAbility = XDataCenter.CharacterManager.GetCharacterAbilityById(notRobotCharacterId)
|
|||
|
local robotCharAbility = XRobotManager.GetRobotAbility(charId)
|
|||
|
return robotCharAbility > notRobotCharAbility
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.CompareTeamLists(teamList1, teamList2)
|
|||
|
if IsTableEmpty(teamList1) and IsTableEmpty(teamList2) then
|
|||
|
return true
|
|||
|
end
|
|||
|
|
|||
|
if not teamList1 then
|
|||
|
return false
|
|||
|
end
|
|||
|
if not teamList2 then
|
|||
|
return false
|
|||
|
end
|
|||
|
|
|||
|
for teamId, team1 in pairs(teamList1) do
|
|||
|
local team2 = teamList2[teamId]
|
|||
|
if not team1:Compare(team2) then
|
|||
|
return false
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
return true
|
|||
|
end
|
|||
|
|
|||
|
--设置预设队伍
|
|||
|
function XStrongholdManager.SetStrongholdTeamRequest(teamList, isOwn, cb)
|
|||
|
if not XStrongholdManager.IsOpen() then
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
local teamInfos = GenerateOriginalTeamInfos(teamList)
|
|||
|
if isOwn == nil then
|
|||
|
isOwn = false
|
|||
|
--是否仅保存自己拥有的角色
|
|||
|
end
|
|||
|
|
|||
|
--队伍数据未变动时不同步服务端
|
|||
|
if XStrongholdManager.CompareTeamLists(teamList, _TeamList) then
|
|||
|
UpdateTeamList(teamInfos)
|
|||
|
if cb then
|
|||
|
cb()
|
|||
|
end
|
|||
|
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
local req = {TeamInfos = teamInfos, Own = isOwn}
|
|||
|
XNetwork.Call(
|
|||
|
"SetStrongholdTeamRequest",
|
|||
|
req,
|
|||
|
function(res)
|
|||
|
if res.Code ~= XCode.Success then
|
|||
|
XUiManager.TipCode(res.Code)
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
UpdateTeamList(teamInfos)
|
|||
|
|
|||
|
if cb then
|
|||
|
cb()
|
|||
|
end
|
|||
|
end
|
|||
|
)
|
|||
|
end
|
|||
|
|
|||
|
--设置战斗队伍
|
|||
|
function XStrongholdManager.SetStrongholdFightTeamRequest(groupId, teamList, cb, ignoreRepeatCheck)
|
|||
|
if not XStrongholdManager.IsOpen() then
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
--检查耐力
|
|||
|
local costEndurance = XStrongholdManager.GetGroupCostEndurance(groupId)
|
|||
|
local curEndurance = XStrongholdManager.GetCurEndurance()
|
|||
|
if costEndurance > curEndurance then
|
|||
|
XUiManager.TipText("StrongholdEnterFightEnduranceLack")
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
--检查电能是否溢出
|
|||
|
if XStrongholdManager.CheckElectricOverLimit(nil, teamList, groupId) then
|
|||
|
XUiManager.TipText("StrongholdEnterFightElectricOver")
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
--检查队伍列表中所有需要的队伍是否均有队长/首发
|
|||
|
local allHasCaptain, allHasFirstPos =
|
|||
|
XStrongholdManager.CheckTeamListAllHasCaptainAndFirstPos(groupId, teamList)
|
|||
|
if not allHasCaptain then
|
|||
|
XUiManager.TipText("StrongholdEnterFightTeamListNoCaptain")
|
|||
|
return
|
|||
|
end
|
|||
|
if not allHasFirstPos then
|
|||
|
XUiManager.TipText("StrongholdEnterFightTeamListNoFirstPos")
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
--使用了支援角色
|
|||
|
if XStrongholdManager.CheckTeamListExistAssitantCharacter(teamList) then
|
|||
|
--支援次数不足
|
|||
|
local times = XStrongholdManager.GetBorrowCount()
|
|||
|
local maxTimes = XStrongholdConfigs.GetBorrowMaxTimes()
|
|||
|
if times >= maxTimes then
|
|||
|
XUiManager.TipText("StrongholdBorrowMaxTimes")
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
--支援消耗不足
|
|||
|
local itemId, count = XStrongholdConfigs.GetBorrowCostItemInfo(times)
|
|||
|
if not XDataCenter.ItemManager.CheckItemCountById(itemId, count) then
|
|||
|
XUiManager.TipText("StrongholdBorrowCostLack")
|
|||
|
return
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
local teamInfos = GenerateOriginalTeamInfos(teamList)
|
|||
|
--队伍数据未变动时不同步服务端
|
|||
|
if not ignoreRepeatCheck and XStrongholdManager.CompareTeamLists(teamList, _TeamList) then
|
|||
|
UpdateTeamList(teamInfos)
|
|||
|
if cb then
|
|||
|
cb()
|
|||
|
end
|
|||
|
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
local req = {Id = groupId, TeamInfos = teamInfos}
|
|||
|
XNetwork.Call(
|
|||
|
"SetStrongholdFightTeamRequest",
|
|||
|
req,
|
|||
|
function(res)
|
|||
|
if res.Code ~= XCode.Success then
|
|||
|
XUiManager.TipCode(res.Code)
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
local itemId = XStrongholdManager.GetMineralItemId()
|
|||
|
local itemCount = XDataCenter.ItemManager.GetCount(itemId)
|
|||
|
local minerCount = XStrongholdManager.GetMinerCount()
|
|||
|
XStrongholdManager.CatchOldMineralItemCount(itemCount)
|
|||
|
XStrongholdManager.CatchOldTotalMineralCount()
|
|||
|
XStrongholdManager.SetCookieMinerCount(minerCount)
|
|||
|
|
|||
|
if cb then
|
|||
|
cb()
|
|||
|
end
|
|||
|
end
|
|||
|
)
|
|||
|
end
|
|||
|
-----------------队伍相关 end------------------
|
|||
|
-----------------援助角色(来自于其他玩家) begin------------------
|
|||
|
local _BorrowCount = 0 --援助次数
|
|||
|
local _AssistantCharacters = {} --援助角色列表(来自于其他玩家)
|
|||
|
|
|||
|
local function UpdateBorrowCount(data)
|
|||
|
_BorrowCount = data or _BorrowCount
|
|||
|
|
|||
|
CsXGameEventManager.Instance:Notify(XEventId.EVENT_STRONGHOLD_BORROW_COUNT_CHANGE)
|
|||
|
end
|
|||
|
|
|||
|
--[[ // 援助角色详情
|
|||
|
[MessagePackObject(keyAsPropertyName: true)]
|
|||
|
public class StrongholdAssistCharacterDetail
|
|||
|
{
|
|||
|
public int Id;
|
|||
|
public string Name;
|
|||
|
public XCharacterData Character;
|
|||
|
public List<XEquipData> Equips = new List<XEquipData>();
|
|||
|
}
|
|||
|
]]
|
|||
|
local function UpdateAssistantCharacters(data)
|
|||
|
_AssistantCharacters = {}
|
|||
|
for _, info in pairs(data) do
|
|||
|
local id = info.Id
|
|||
|
_AssistantCharacters[id] = info
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
local function GetAssistantInfo(playerId)
|
|||
|
if not IsNumberValid(playerId) then
|
|||
|
return
|
|||
|
end
|
|||
|
return _AssistantCharacters[playerId]
|
|||
|
end
|
|||
|
XStrongholdManager.GetAssistantInfo = GetAssistantInfo
|
|||
|
|
|||
|
function XStrongholdManager.GetBorrowCount()
|
|||
|
return _BorrowCount
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetAssistantPlayerIds(groupId, stageIndex, teamList)
|
|||
|
local playerIds = {}
|
|||
|
for playerId in pairs(_AssistantCharacters) do
|
|||
|
tableInsert(playerIds, playerId)
|
|||
|
end
|
|||
|
|
|||
|
teamList = teamList or _TeamList
|
|||
|
local stageId = groupId and XStrongholdManager.GetGroupStageId(groupId, stageIndex) or nil
|
|||
|
tableSort(
|
|||
|
playerIds,
|
|||
|
function(aPlayerId, bPlayerId)
|
|||
|
local aId = XStrongholdManager.GetAssistantPlayerCharacterId(aPlayerId)
|
|||
|
local bId = XStrongholdManager.GetAssistantPlayerCharacterId(bPlayerId)
|
|||
|
|
|||
|
--已经上阵
|
|||
|
local aIsInTeam = XStrongholdManager.CheckInTeamList(aId, teamList, aPlayerId)
|
|||
|
local bIsInTeam = XStrongholdManager.CheckInTeamList(bId, teamList, bPlayerId)
|
|||
|
if aIsInTeam ~= bIsInTeam then
|
|||
|
return not aIsInTeam
|
|||
|
end
|
|||
|
|
|||
|
--关卡推荐排序
|
|||
|
if stageId then
|
|||
|
local aIsStageRecomend = XFubenConfigs.IsStageRecommendCharacterType(stageId, aId)
|
|||
|
local bIsStageRecomend = XFubenConfigs.IsStageRecommendCharacterType(stageId, bId)
|
|||
|
if aIsStageRecomend ~= bIsStageRecomend then
|
|||
|
return aIsStageRecomend
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
--战力排序
|
|||
|
local aAbility = XStrongholdManager.GetAssistantPlayerAbiility(aPlayerId)
|
|||
|
local bAbility = XStrongholdManager.GetAssistantPlayerAbiility(bPlayerId)
|
|||
|
if aAbility ~= bAbility then
|
|||
|
return aAbility > bAbility
|
|||
|
end
|
|||
|
|
|||
|
return false
|
|||
|
end
|
|||
|
)
|
|||
|
|
|||
|
return playerIds
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetAssistantPlayerCharacterId(playerId)
|
|||
|
local info = GetAssistantInfo(playerId)
|
|||
|
return info and info.Character.Id or 0
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetAssistantPlayerFashionId(playerId)
|
|||
|
local info = GetAssistantInfo(playerId)
|
|||
|
return info and info.Character.FashionId or 0
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetAssistantPlayerLiberateLv(playerId)
|
|||
|
local info = GetAssistantInfo(playerId)
|
|||
|
return info and info.Character.LiberateLv or 0
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetAssistantPlayerAbiility(playerId)
|
|||
|
local info = GetAssistantInfo(playerId)
|
|||
|
return info and info.Character and info.Character.Ability or 0
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.CheckAssitantValid(playerId, characterId)
|
|||
|
local info = GetAssistantInfo(playerId)
|
|||
|
if IsTableEmpty(info) then
|
|||
|
return false
|
|||
|
end
|
|||
|
return IsNumberValid(characterId) and XStrongholdManager.GetAssistantPlayerCharacterId(playerId) == characterId
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.CheckAssitantListWaitInit()
|
|||
|
return IsTableEmpty(_AssistantCharacters) and XStrongholdManager.CheckAssitantRefreshCD()
|
|||
|
end
|
|||
|
|
|||
|
local _LastTimeGetStrongholdAssistCharacterListRequest = 0
|
|||
|
local _CDGetStrongholdAssistCharacterListRequest =
|
|||
|
XStrongholdConfigs.GetCommonConfig("RefreshAssistCharacterInterval")
|
|||
|
function XStrongholdManager.CheckAssitantRefreshCD()
|
|||
|
local now = XTime.GetServerNowTimestamp()
|
|||
|
local lastCd =
|
|||
|
mathCeil(
|
|||
|
_LastTimeGetStrongholdAssistCharacterListRequest + _CDGetStrongholdAssistCharacterListRequest - now
|
|||
|
)
|
|||
|
if lastCd > 0 then
|
|||
|
local desc = CS.XTextManager.GetText("StrongholdRefershAssistCharacterInCD", lastCd)
|
|||
|
return false, desc
|
|||
|
end
|
|||
|
return true, ""
|
|||
|
end
|
|||
|
|
|||
|
--请求援助角色列表
|
|||
|
function XStrongholdManager.GetStrongholdAssistCharacterListRequest(cb)
|
|||
|
local now = XTime.GetServerNowTimestamp()
|
|||
|
local isRefreshCd, desc = XStrongholdManager.CheckAssitantRefreshCD()
|
|||
|
if not isRefreshCd then
|
|||
|
XUiManager.TipMsg(desc)
|
|||
|
return
|
|||
|
end
|
|||
|
_LastTimeGetStrongholdAssistCharacterListRequest = XTime.GetServerNowTimestamp()
|
|||
|
|
|||
|
XNetwork.Call(
|
|||
|
"GetStrongholdAssistCharacterListRequest",
|
|||
|
nil,
|
|||
|
function(res)
|
|||
|
if res.Code ~= XCode.Success then
|
|||
|
XUiManager.TipCode(res.Code)
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
UpdateAssistantCharacters(res.CharacterDetails)
|
|||
|
|
|||
|
if cb then
|
|||
|
cb()
|
|||
|
end
|
|||
|
end
|
|||
|
)
|
|||
|
end
|
|||
|
|
|||
|
--通知借用次数
|
|||
|
function XStrongholdManager.NotifyStrongholdBorrowCount(data)
|
|||
|
UpdateBorrowCount(data.BorrowCount)
|
|||
|
end
|
|||
|
-----------------援助角色(来自于其他玩家) end------------------
|
|||
|
-----------------支援相关(共享角色) begin------------------
|
|||
|
local _AssistantCharacterId = 0 --共享角色Id
|
|||
|
local _AssistantRecords = {} --支援记录
|
|||
|
|
|||
|
local function UpdateShareCharacterId(data)
|
|||
|
if not IsNumberValid(data) then
|
|||
|
return
|
|||
|
end
|
|||
|
_AssistantCharacterId = data
|
|||
|
|
|||
|
CsXGameEventManager.Instance:Notify(XEventId.EVENT_STRONGHOLD_SHARE_CHARACTER_CHANGE)
|
|||
|
end
|
|||
|
|
|||
|
local function ClearAssitantRecords()
|
|||
|
_AssistantRecords = {}
|
|||
|
end
|
|||
|
|
|||
|
local function UpdateAssistantRecords(data)
|
|||
|
ClearAssitantRecords()
|
|||
|
|
|||
|
if not IsNumberValid(data) then
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
for _, recordInfo in pairs(data) do
|
|||
|
local day = recordInfo.Id
|
|||
|
local record = XStrongholdAssistantRecord.New(day)
|
|||
|
record:UpdateData(recordInfo)
|
|||
|
_AssistantRecords[day] = record
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
local function CheckHaveAssistantRecord()
|
|||
|
return not IsTableEmpty(_AssistantRecords)
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetAssitantRecordStrList()
|
|||
|
local recordStrList = {}
|
|||
|
|
|||
|
local recordStr, record = ""
|
|||
|
local totalDay = XStrongholdManager.GetTotalDay()
|
|||
|
for day = 1, totalDay do
|
|||
|
record = _AssistantRecords[day]
|
|||
|
if record then
|
|||
|
if record:IsPause() then
|
|||
|
recordStr = record:GetDelayRecordString()
|
|||
|
if not stringIsNilOrEmpty(recordStr) then
|
|||
|
tableInsert(recordStrList, recordStr)
|
|||
|
end
|
|||
|
else
|
|||
|
recordStr = record:GetDurationRewardRecordString()
|
|||
|
if not stringIsNilOrEmpty(recordStr) then
|
|||
|
tableInsert(recordStrList, recordStr)
|
|||
|
end
|
|||
|
|
|||
|
recordStr = record:GetLendRewardRecordString()
|
|||
|
if not stringIsNilOrEmpty(recordStr) then
|
|||
|
tableInsert(recordStrList, recordStr)
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
return recordStrList
|
|||
|
end
|
|||
|
|
|||
|
--援助开启
|
|||
|
function XStrongholdManager.CheckAssistantOpen()
|
|||
|
local conditionId = XStrongholdConfigs.GetCommonConfig("SetAssistCharacterCondition")
|
|||
|
return XConditionManager.CheckCondition(conditionId)
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.CheckCookieAssistantFirstOpen()
|
|||
|
if not XStrongholdManager.CheckAssistantOpen() then
|
|||
|
return
|
|||
|
end
|
|||
|
if XStrongholdManager.GetCookieAssistantFirstOpen() then
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
XUiManager.TipText("StrongholdAssistantFirstOpen")
|
|||
|
XStrongholdManager.SetCookieAssistantFirstOpen()
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.SetCookieAssistantFirstOpen()
|
|||
|
local key = XStrongholdManager.GetAssistantFirstOpenCookieKey()
|
|||
|
XSaveTool.SaveData(key, true)
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetCookieAssistantFirstOpen()
|
|||
|
local key = XStrongholdManager.GetAssistantFirstOpenCookieKey()
|
|||
|
return XSaveTool.GetData(key) and true or false
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetAssistantFirstOpenCookieKey()
|
|||
|
if not IsNumberValid(_ActivityId) then
|
|||
|
return
|
|||
|
end
|
|||
|
return XPlayer.Id .. _ActivityId .. "_XStrongholdManager_CookieAssistantFirstOpen"
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.IsHaveAssistantCharacter()
|
|||
|
return _AssistantCharacterId > 0
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetAssistantCharacterId()
|
|||
|
return _AssistantCharacterId
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.CheckIsAssistantCharacter(characterId)
|
|||
|
return IsNumberValid(characterId) and _AssistantCharacterId == characterId
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.EnterUiAssistant()
|
|||
|
if not XStrongholdManager.CheckAssistantOpen() then
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
--未拥有支援角色时直接打开UI
|
|||
|
if not XStrongholdManager.IsHaveAssistantCharacter() then
|
|||
|
XLuaUiManager.Open("UiStrongholdHelp")
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
--拥有支援角色记录时直接打开UI
|
|||
|
if CheckHaveAssistantRecord() then
|
|||
|
XLuaUiManager.Open("UiStrongholdHelp")
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
--未拥有支援角色记录时先请求记录
|
|||
|
local cb = function()
|
|||
|
XLuaUiManager.Open("UiStrongholdHelp")
|
|||
|
end
|
|||
|
XStrongholdManager.GetStrongholdLendDetailRequest(cb)
|
|||
|
end
|
|||
|
|
|||
|
--设置共享角色
|
|||
|
local _LastTimeSetStrongholdAssistCharacterRequest = 0
|
|||
|
local _CDSetStrongholdAssistCharacterRequest = XStrongholdConfigs.GetCommonConfig("SetAssistCharacterInterval")
|
|||
|
function XStrongholdManager.SetStrongholdAssistCharacterRequest(characterId, cb)
|
|||
|
local now = XTime.GetServerNowTimestamp()
|
|||
|
local lastCd =
|
|||
|
mathCeil(_LastTimeSetStrongholdAssistCharacterRequest + _CDSetStrongholdAssistCharacterRequest - now)
|
|||
|
if lastCd > 0 then
|
|||
|
local desc = CS.XTextManager.GetText("StrongholdSetAssistCharacterInCD", lastCd)
|
|||
|
XUiManager.TipMsg(desc)
|
|||
|
return
|
|||
|
end
|
|||
|
_LastTimeSetStrongholdAssistCharacterRequest = now
|
|||
|
|
|||
|
local req = {CharacterId = characterId}
|
|||
|
XNetwork.Call(
|
|||
|
"SetStrongholdAssistCharacterRequest",
|
|||
|
req,
|
|||
|
function(res)
|
|||
|
if res.Code ~= XCode.Success then
|
|||
|
XUiManager.TipCode(res.Code)
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
UpdateShareCharacterId(characterId)
|
|||
|
|
|||
|
CsXGameEventManager.Instance:Notify(
|
|||
|
XEventId.EVENT_STRONGHOLD_ASSISTANT_CHARACTER_SET_CHANGE,
|
|||
|
characterId
|
|||
|
)
|
|||
|
|
|||
|
if cb then
|
|||
|
cb()
|
|||
|
end
|
|||
|
end
|
|||
|
)
|
|||
|
end
|
|||
|
|
|||
|
--查询借出奖励记录
|
|||
|
function XStrongholdManager.GetStrongholdLendDetailRequest(cb)
|
|||
|
XNetwork.Call(
|
|||
|
"GetStrongholdLendDetailRequest",
|
|||
|
nil,
|
|||
|
function(res)
|
|||
|
if res.Code ~= XCode.Success then
|
|||
|
XUiManager.TipCode(res.Code)
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
UpdateAssistantRecords(res.LendDayInfos)
|
|||
|
|
|||
|
if cb then
|
|||
|
cb()
|
|||
|
end
|
|||
|
end
|
|||
|
)
|
|||
|
end
|
|||
|
-----------------支援相关(共享角色) end------------------
|
|||
|
-----------------奖励(任务) begin------------------
|
|||
|
local _FinishedRewardIdDic = {}
|
|||
|
--已领取奖励Id字典
|
|||
|
|
|||
|
local function UpdateFinishedRewardIds(data)
|
|||
|
if IsTableEmpty(data) then
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
for _, rewardId in pairs(data) do
|
|||
|
if rewardId and rewardId > 0 then
|
|||
|
_FinishedRewardIdDic[rewardId] = rewardId
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
CsXGameEventManager.Instance:Notify(XEventId.EVENT_STRONGHOLD_FINISH_REWARDS_CHANGE)
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetAllRewardIds(levelId)
|
|||
|
levelId = levelId or XStrongholdManager.GetLevelId()
|
|||
|
local rewardIds = XStrongholdConfigs.GetAllRewardIds(levelId)
|
|||
|
|
|||
|
tableSort(
|
|||
|
rewardIds,
|
|||
|
function(aId, bId)
|
|||
|
local aCanGet = XStrongholdManager.IsRewardCanGet(aId)
|
|||
|
local bCanGet = XStrongholdManager.IsRewardCanGet(bId)
|
|||
|
if aCanGet ~= bCanGet then
|
|||
|
return aCanGet
|
|||
|
end
|
|||
|
|
|||
|
local aIsFinished = XStrongholdManager.IsRewardFinished(aId)
|
|||
|
local bIsFinished = XStrongholdManager.IsRewardFinished(bId)
|
|||
|
if aIsFinished ~= bIsFinished then
|
|||
|
return not aIsFinished
|
|||
|
end
|
|||
|
|
|||
|
return aId < bId
|
|||
|
end
|
|||
|
)
|
|||
|
|
|||
|
return rewardIds
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.IsRewardFinished(rewardId)
|
|||
|
return _FinishedRewardIdDic[rewardId]
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.IsRewardCanGet(rewardId)
|
|||
|
if not XStrongholdManager.IsOpen() or XStrongholdManager.IsFightEnd() then
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
local conditionId = XStrongholdConfigs.GetRewardConditionId(rewardId)
|
|||
|
local ret, des, haveCount, requireCount = XConditionManager.CheckCondition(conditionId)
|
|||
|
return ret and not XStrongholdManager.IsRewardFinished(rewardId)
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.IsAnyRewardCanGet()
|
|||
|
if not XStrongholdManager.IsOpen() then
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
local rewardIds = XStrongholdManager.GetAllRewardIds()
|
|||
|
for _, rewardId in pairs(rewardIds) do
|
|||
|
if XStrongholdManager.IsRewardCanGet(rewardId) then
|
|||
|
return true
|
|||
|
end
|
|||
|
end
|
|||
|
return false
|
|||
|
end
|
|||
|
|
|||
|
--领取奖励
|
|||
|
function XStrongholdManager.GetStrongholdRewardRequest(rewardId, cb)
|
|||
|
local req = {Id = rewardId}
|
|||
|
XNetwork.Call(
|
|||
|
"GetStrongholdRewardRequest",
|
|||
|
req,
|
|||
|
function(res)
|
|||
|
if res.Code ~= XCode.Success then
|
|||
|
XUiManager.TipCode(res.Code)
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
UpdateFinishedRewardIds({rewardId})
|
|||
|
|
|||
|
local rewardGoods = res.RewardGoodsList
|
|||
|
if cb then
|
|||
|
cb(rewardGoods)
|
|||
|
end
|
|||
|
end
|
|||
|
)
|
|||
|
end
|
|||
|
-----------------奖励(任务) end------------------
|
|||
|
-----------------上期战报 begin------------------
|
|||
|
local _LastActivityId = 0 --活动id
|
|||
|
local _LastMinerCount = 0 --矿工数量
|
|||
|
local _LastMineralCount = 0 --矿石数量
|
|||
|
local _LastAssistCount = 0 --支援次数
|
|||
|
local _LastAssistRewardValue = 0 --支援奖励
|
|||
|
local _LastFinishCount = 0 --完成据点数量
|
|||
|
|
|||
|
local function UpdateLastAcitivityRecord(data)
|
|||
|
if IsTableEmpty(data) then
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
_LastActivityId = data.Id or 0
|
|||
|
_LastMinerCount = data.MinerCount or 0
|
|||
|
_LastMineralCount = data.MineralCount or 0
|
|||
|
_LastAssistCount = data.AssistCount or 0
|
|||
|
_LastAssistRewardValue = data.AssistRewardValue or 0
|
|||
|
_LastFinishCount = data.FinishCount or 0
|
|||
|
|
|||
|
CsXGameEventManager.Instance:Notify(XEventId.EVENT_STRONGHOLD_ACTIVITY_RESULT_CHANGE)
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.CheckShowLastActivityRecord()
|
|||
|
if not IsNumberValid(_LastActivityId) then
|
|||
|
return false
|
|||
|
end
|
|||
|
if XStrongholdManager.GetCookieLastActivityRecord() ~= 0 then
|
|||
|
return false
|
|||
|
end
|
|||
|
if _LastActivityId ~= _ActivityId then
|
|||
|
return true
|
|||
|
end
|
|||
|
return false
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetCookieLastActivityRecord()
|
|||
|
local key = XStrongholdManager.GetLastActivityRecordCookieKey()
|
|||
|
return XSaveTool.GetData(key) or 0
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.SetCookieGetCookieLastActivityRecord()
|
|||
|
local key = XStrongholdManager.GetLastActivityRecordCookieKey()
|
|||
|
XSaveTool.SaveData(key, 1)
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetLastActivityRecordCookieKey()
|
|||
|
if not IsNumberValid(_LastActivityId) then
|
|||
|
return
|
|||
|
end
|
|||
|
return XPlayer.Id .. _LastActivityId .. "_XStrongholdManager_CookieLastActivityRecord"
|
|||
|
end
|
|||
|
|
|||
|
--获取当期/上期进度
|
|||
|
function XStrongholdManager.GetLastAcitivityFinishProgress()
|
|||
|
local finishCount, totalCount = 0, 0
|
|||
|
finishCount = _LastFinishCount or 0
|
|||
|
totalCount = XStrongholdManager.GetAllGroupCount(XStrongholdConfigs.ChapterType.Normal)
|
|||
|
return finishCount, totalCount
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetLastMinerCount()
|
|||
|
return _LastMinerCount or 0
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetLastMineralCount()
|
|||
|
return _LastMineralCount or 0
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetLastAssistCount()
|
|||
|
return _LastAssistCount or 0
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetLastAssistRewardValue()
|
|||
|
return _LastAssistRewardValue or 0
|
|||
|
end
|
|||
|
|
|||
|
--通知战报信息
|
|||
|
function XStrongholdManager.NotifyStrongholdResultRecord(data)
|
|||
|
UpdateLastAcitivityRecord(data.Record)
|
|||
|
end
|
|||
|
-----------------上期战报 end------------------
|
|||
|
-----------------副本相关 begin------------------
|
|||
|
local _CurFightGroupId = 0
|
|||
|
local _CurFightStageIndex = 0
|
|||
|
local _SingleFight = false --是否挑战单关卡
|
|||
|
|
|||
|
local function InitStageType(stageId)
|
|||
|
stageId = tonumber(stageId)
|
|||
|
local stageInfo = XDataCenter.FubenManager.GetStageInfo(stageId)
|
|||
|
if stageInfo then
|
|||
|
stageInfo.Type = XDataCenter.FubenManager.StageType.Stronghold
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.InitStageInfo()
|
|||
|
local stageIds = XStrongholdManager.GetAllGroupStageIds()
|
|||
|
for _, stageId in pairs(stageIds) do
|
|||
|
InitStageType(stageId)
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.ResetCurFightInfo()
|
|||
|
_CurFightGroupId = 0
|
|||
|
_CurFightStageIndex = 0
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.OpenFightLoading(stageId)
|
|||
|
if _SingleFight then
|
|||
|
XDataCenter.FubenManager.OpenFightLoading(stageId)
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
local groupId = _CurFightGroupId
|
|||
|
local stageIndex = _CurFightStageIndex
|
|||
|
if stageIndex == 1 and XStrongholdConfigs.IsChapterLastGroupId(groupId) then
|
|||
|
return
|
|||
|
end
|
|||
|
XLuaUiManager.Open("UiStrongholdInfo", groupId, stageIndex)
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.CloseFightLoading(stageId)
|
|||
|
if _SingleFight then
|
|||
|
XDataCenter.FubenManager.CloseFightLoading(stageId)
|
|||
|
else
|
|||
|
XLuaUiManager.Remove("UiStrongholdInfo")
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.ShowReward(winData)
|
|||
|
local groupId = _CurFightGroupId
|
|||
|
local stageCount = XStrongholdManager.GetGroupStageNum(groupId)
|
|||
|
local stageIndex = _CurFightStageIndex
|
|||
|
local allFinished = winData.SettleData.StrongholdFightResult.AllFinished --当前据点所有关卡是否都挑战通过
|
|||
|
|
|||
|
if _SingleFight then
|
|||
|
--单关卡挑战
|
|||
|
_SingleFight = false
|
|||
|
else
|
|||
|
--多波连续挑战
|
|||
|
if not allFinished and stageIndex < stageCount then
|
|||
|
_CurFightStageIndex = stageIndex + 1
|
|||
|
XStrongholdManager.EnterFight(groupId, nil, nil, true)
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
if allFinished then
|
|||
|
XStrongholdManager.ResetCurFightInfo()
|
|||
|
XLuaUiManager.Remove("UiStrongholdDeploy")
|
|||
|
XLuaUiManager.Open("UiStrongholdFightSettleWin", winData)
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.ChallengeLose()
|
|||
|
XStrongholdManager.ResetCurFightInfo()
|
|||
|
_SingleFight = false
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.TryEnterFight(groupId, teamId, oTeamList)
|
|||
|
local callFunc = function()
|
|||
|
local teamList = XStrongholdManager.GetTeamListClipTemp(groupId, oTeamList)
|
|||
|
|
|||
|
local enterFunc = function()
|
|||
|
local cb = function()
|
|||
|
XStrongholdManager.EnterFight(groupId, teamList, teamId)
|
|||
|
end
|
|||
|
local setStrongholdTeamCb = function()
|
|||
|
local ignoreRepeatCheck = true
|
|||
|
XStrongholdManager.SetStrongholdFightTeamRequest(groupId, teamList, cb, ignoreRepeatCheck)
|
|||
|
end
|
|||
|
XStrongholdManager.SetStrongholdTeamRequest(oTeamList, nil, setStrongholdTeamCb)
|
|||
|
end
|
|||
|
|
|||
|
local notRune = false
|
|||
|
if XTool.IsNumberValid(teamId) then
|
|||
|
--单梯队作战
|
|||
|
local team = teamList[teamId]
|
|||
|
notRune = not team:HasRune()
|
|||
|
else
|
|||
|
for _, team in pairs(teamList) do
|
|||
|
if not team:HasRune() then
|
|||
|
notRune = true
|
|||
|
break
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
if notRune then
|
|||
|
--符文配置不全提示
|
|||
|
local title = CSXTextManagerGetText("StrongholdTeamAutoRuneConfirmTitle")
|
|||
|
local content = CSXTextManagerGetText("StrongholdTeamAutoRuneConfirmContent")
|
|||
|
local setRuneFunc = function()
|
|||
|
XStrongholdManager.AutoRune(teamList)
|
|||
|
|
|||
|
--拷贝符文到队伍预设
|
|||
|
for teamId, team in pairs(teamList) do
|
|||
|
local oTeam = oTeamList[teamId]
|
|||
|
if not XTool.IsTableEmpty(oTeam) then
|
|||
|
local runeId, subRuneId = team:GetRune()
|
|||
|
oTeam:SetRune(runeId, subRuneId)
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
enterFunc()
|
|||
|
end
|
|||
|
XUiManager.DialogTip(title, content, XUiManager.DialogType.Normal, nil, setRuneFunc)
|
|||
|
else
|
|||
|
enterFunc()
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
if XStrongholdManager.IsFightBegin() then
|
|||
|
callFunc()
|
|||
|
else
|
|||
|
--首次进入玩法战斗提示
|
|||
|
local title = CSXTextManagerGetText("StrongholdFirstFightConfirmTitle")
|
|||
|
local fightAutoBeginTime = XStrongholdManager.GetFightAutoBeginTime()
|
|||
|
local timeStr =
|
|||
|
XUiHelper.GetTime(
|
|||
|
fightAutoBeginTime - XTime.GetServerNowTimestamp(),
|
|||
|
XUiHelper.TimeFormatType.STRONGHOLD
|
|||
|
)
|
|||
|
local content = CSXTextManagerGetText("StrongholdFirstFightConfirmContent", timeStr)
|
|||
|
XUiManager.DialogTip(title, content, XUiManager.DialogType.Normal, nil, callFunc)
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.EnterFight(groupId, teamList, stageIndex, isContinueFight)
|
|||
|
local teamList = XStrongholdManager.GetTeamListClipTemp(groupId, teamList)
|
|||
|
|
|||
|
--单队挑战单关卡
|
|||
|
if XTool.IsNumberValid(stageIndex) then
|
|||
|
_SingleFight = true
|
|||
|
end
|
|||
|
|
|||
|
_CurFightGroupId = groupId
|
|||
|
|
|||
|
stageIndex = stageIndex or _CurFightStageIndex
|
|||
|
if not IsNumberValid(stageIndex) or XStrongholdManager.IsGroupStageFinished(groupId, stageIndex) then
|
|||
|
stageIndex = XStrongholdManager.GetGroupNextFightStageIndex(groupId)
|
|||
|
end
|
|||
|
_CurFightStageIndex = stageIndex
|
|||
|
|
|||
|
local stageId = XStrongholdManager.GetGroupStageId(groupId, stageIndex)
|
|||
|
local enterFight = function()
|
|||
|
local teamId = stageIndex
|
|||
|
local captainPos, firstFightPos = XStrongholdManager.GetTeamCaptinPosAndFirstPos(teamId, teamList)
|
|||
|
local characterIds = XStrongholdManager.GetTeamShowCharacterIds(teamId, teamList)
|
|||
|
XDataCenter.FubenManager.EnterStrongholdFight(stageId, characterIds, captainPos, firstFightPos)
|
|||
|
end
|
|||
|
|
|||
|
if XStrongholdConfigs.IsChapterLastGroupId(groupId) then
|
|||
|
if not _SingleFight then
|
|||
|
XLuaUiManager.Open("UiStrongholdInfo", groupId, stageIndex)
|
|||
|
end
|
|||
|
|
|||
|
--连续挑战不显示词缀界面
|
|||
|
if isContinueFight then
|
|||
|
enterFight()
|
|||
|
else
|
|||
|
XLuaUiManager.Open("UiStrongholdAnimation", groupId, enterFight)
|
|||
|
end
|
|||
|
else
|
|||
|
enterFight()
|
|||
|
end
|
|||
|
end
|
|||
|
-----------------副本相关 end------------------
|
|||
|
-----------------等级分区 begin------------------
|
|||
|
local _LevelId = 0
|
|||
|
--当前选择的分区
|
|||
|
|
|||
|
function XStrongholdManager.GetLevelId()
|
|||
|
return _LevelId
|
|||
|
end
|
|||
|
|
|||
|
local function UpdateLevelId(levelId)
|
|||
|
_LevelId = levelId or _LevelId
|
|||
|
|
|||
|
InitGroupInfos()
|
|||
|
--根据分区初始化关卡信息
|
|||
|
end
|
|||
|
|
|||
|
--是否已经选择过分区
|
|||
|
function XStrongholdManager.IsSelectedLevelId()
|
|||
|
return IsNumberValid(_LevelId)
|
|||
|
end
|
|||
|
|
|||
|
--选择等级分区
|
|||
|
function XStrongholdManager.SelectStrongholdLevelRequest(levelId, cb)
|
|||
|
if XStrongholdManager.IsSelectedLevelId() then
|
|||
|
XUiManager.tiptext("StrongholdAlreadySelectLevel")
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
local req = {LevelId = levelId}
|
|||
|
XNetwork.Call(
|
|||
|
"SelectStrongholdLevelRequest",
|
|||
|
req,
|
|||
|
function(res)
|
|||
|
if res.Code ~= XCode.Success then
|
|||
|
XUiManager.TipCode(res.Code)
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
UpdateLevelId(levelId)
|
|||
|
UpdateGroupStageDatas(res.GroupStageDatas)
|
|||
|
UpdateMaxElectricEnergy(res.ElectricEnergy)
|
|||
|
UpdateEndurance(res.Endurance)
|
|||
|
|
|||
|
if cb then
|
|||
|
cb()
|
|||
|
end
|
|||
|
end
|
|||
|
)
|
|||
|
end
|
|||
|
-----------------等级分区 end------------------
|
|||
|
-----------------暂停结算 begin------------------
|
|||
|
local _PauseDays = {}
|
|||
|
--暂停结算的天数(下次结算后清除)
|
|||
|
|
|||
|
local function InitPauseDays()
|
|||
|
_PauseDays = {}
|
|||
|
local totalDay = XStrongholdManager.GetTotalDay()
|
|||
|
for day = 1, totalDay do
|
|||
|
_PauseDays[day] = false
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
local function UpdatePauseDays(days)
|
|||
|
InitPauseDays()
|
|||
|
|
|||
|
for _, day in pairs(days or {}) do
|
|||
|
_PauseDays[day] = true
|
|||
|
end
|
|||
|
|
|||
|
CsXGameEventManager.Instance:Notify(XEventId.EVENT_STRONGHOLD_PAUSE_DAY_CHANGE)
|
|||
|
end
|
|||
|
|
|||
|
--该天数是否暂停了结算
|
|||
|
function XStrongholdManager.IsDayPaused(day)
|
|||
|
day = day or XStrongholdManager.GetCurDay()
|
|||
|
return _PauseDays[day] and true or false
|
|||
|
end
|
|||
|
|
|||
|
--是否有处于暂停中的天数(昨天/前天/...)
|
|||
|
function XStrongholdManager.IsAnyDayPaused()
|
|||
|
for _, isPause in pairs(_PauseDays) do
|
|||
|
if isPause then
|
|||
|
return true
|
|||
|
end
|
|||
|
end
|
|||
|
return false
|
|||
|
end
|
|||
|
|
|||
|
--获取暂停天数(from curDay)
|
|||
|
function XStrongholdManager.GetDelayDays()
|
|||
|
local delayDays = 0
|
|||
|
|
|||
|
local curDay = XStrongholdManager.GetCurDay()
|
|||
|
local totalDay = XStrongholdManager.GetTotalDay()
|
|||
|
for day = curDay, totalDay do
|
|||
|
if not XStrongholdManager.IsDayPaused(day) then
|
|||
|
break
|
|||
|
end
|
|||
|
delayDays = delayDays + 1
|
|||
|
end
|
|||
|
|
|||
|
return delayDays
|
|||
|
end
|
|||
|
|
|||
|
--挑战开始后48小时不可设置暂停
|
|||
|
local PAUSE_DELAY_AFTER_FIGHT_BEGIN = 48 * 3600
|
|||
|
function XStrongholdManager.CheckPauseTimeAfterFightBegin()
|
|||
|
local nowTime = XTime.GetServerNowTimestamp()
|
|||
|
local fightBeginTime = XStrongholdManager.GetFightTime()
|
|||
|
return nowTime - fightBeginTime >= PAUSE_DELAY_AFTER_FIGHT_BEGIN
|
|||
|
end
|
|||
|
|
|||
|
--挑战结束前24小时不可设置暂停
|
|||
|
local PAUSE_DELAY_BEFORE_FIGHT_END = 24 * 3600
|
|||
|
function XStrongholdManager.CheckPauseTimeBeforeFightEnd()
|
|||
|
local nowTime = XTime.GetServerNowTimestamp()
|
|||
|
local delayDays = XStrongholdManager.GetDelayDays()
|
|||
|
local _, fightEndTime = XStrongholdManager.GetFightTime()
|
|||
|
return fightEndTime - nowTime - delayDays * 24 * 3600 >= PAUSE_DELAY_BEFORE_FIGHT_END
|
|||
|
end
|
|||
|
|
|||
|
--是否可以暂停结算
|
|||
|
function XStrongholdManager.IsCanPaused()
|
|||
|
return XStrongholdManager.IsFightBegin() and --作战期开始
|
|||
|
XStrongholdManager.CheckPauseTimeAfterFightBegin() and
|
|||
|
XStrongholdManager.CheckPauseTimeBeforeFightEnd()
|
|||
|
end
|
|||
|
|
|||
|
local _LastTimeSetStrongholdStayRequest = 0
|
|||
|
local _CDSetStrongholdStayRequest = 3
|
|||
|
function XStrongholdManager.CheckSetStrongholdStayRequestCD()
|
|||
|
local now = XTime.GetServerNowTimestamp()
|
|||
|
local lastCd = _LastTimeSetStrongholdStayRequest + _CDSetStrongholdStayRequest - now
|
|||
|
if lastCd > 0 then
|
|||
|
return false
|
|||
|
end
|
|||
|
return true
|
|||
|
end
|
|||
|
|
|||
|
--设置暂停
|
|||
|
function XStrongholdManager.SetStrongholdStayRequest(cb)
|
|||
|
if not XStrongholdManager.IsCanPaused() then
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
if not XStrongholdManager.CheckSetStrongholdStayRequestCD() then
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
XNetwork.Call(
|
|||
|
"SetStrongholdStayRequest",
|
|||
|
nil,
|
|||
|
function(res)
|
|||
|
if res.Code ~= XCode.Success then
|
|||
|
XUiManager.TipCode(res.Code)
|
|||
|
return
|
|||
|
end
|
|||
|
_LastTimeSetStrongholdStayRequest = XTime.GetServerNowTimestamp()
|
|||
|
|
|||
|
UpdatePauseDays(res.StayDays)
|
|||
|
|
|||
|
if cb then
|
|||
|
cb()
|
|||
|
end
|
|||
|
end
|
|||
|
)
|
|||
|
end
|
|||
|
-----------------暂停结算 end------------------
|
|||
|
-----------------符文 begin------------------
|
|||
|
local _RuneIdList = {} --本期符文Id列表
|
|||
|
local _UsingRuneIdDic = {} --使用中符文Id字典
|
|||
|
local _UsingSubRuneIdDic = {} --使用中子符文Id字典
|
|||
|
|
|||
|
local function UpdateRuneIds(data)
|
|||
|
_RuneIdList = {}
|
|||
|
for _, runeId in pairs(data or {}) do
|
|||
|
if XTool.IsNumberValid(runeId) then
|
|||
|
tableInsert(_RuneIdList, runeId)
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
tableSort(
|
|||
|
_RuneIdList,
|
|||
|
function(a, b)
|
|||
|
return a < b
|
|||
|
end
|
|||
|
)
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetAllRuneIds()
|
|||
|
return XTool.Clone(_RuneIdList)
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.UseRune(runeId, subRuneId, teamId)
|
|||
|
if XTool.IsNumberValid(runeId) then
|
|||
|
_UsingRuneIdDic[runeId] = teamId
|
|||
|
end
|
|||
|
if XTool.IsNumberValid(subRuneId) then
|
|||
|
_UsingSubRuneIdDic[subRuneId] = teamId
|
|||
|
end
|
|||
|
|
|||
|
CsXGameEventManager.Instance:Notify(XEventId.EVENT_STRONGHOLD_RUNE_CHANGE)
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.TakeOffRune(runeId, subRuneId)
|
|||
|
if XTool.IsNumberValid(runeId) then
|
|||
|
_UsingRuneIdDic[runeId] = nil
|
|||
|
end
|
|||
|
if XTool.IsNumberValid(subRuneId) then
|
|||
|
_UsingSubRuneIdDic[subRuneId] = nil
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetRuneUsingTeamId(runeId)
|
|||
|
return _UsingRuneIdDic[runeId]
|
|||
|
end
|
|||
|
|
|||
|
--符文是否锁定(被有通关记录的队伍使用)
|
|||
|
function XStrongholdManager.IsRuneLock(runeId, groupId, subRuneId)
|
|||
|
if not XTool.IsNumberValid(groupId) then
|
|||
|
return false
|
|||
|
end
|
|||
|
|
|||
|
if XTool.IsNumberValid(subRuneId) and not XStrongholdManager.IsSubRuneUsing(subRuneId) then
|
|||
|
return false
|
|||
|
end
|
|||
|
|
|||
|
local usingTeamId = XStrongholdManager.GetRuneUsingTeamId(runeId)
|
|||
|
if not XTool.IsNumberValid(usingTeamId) then
|
|||
|
return false
|
|||
|
end
|
|||
|
return XStrongholdManager.IsGroupStageFinished(groupId, usingTeamId)
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.IsRuneUsing(runeId)
|
|||
|
return _UsingRuneIdDic[runeId] and true or false
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.IsSubRuneUsing(subRuneId)
|
|||
|
return _UsingSubRuneIdDic[subRuneId] and true or false
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.GetNextCanUseRuneId()
|
|||
|
for _, runeId in ipairs(_RuneIdList) do
|
|||
|
if not XStrongholdManager.IsRuneUsing(runeId) then
|
|||
|
return runeId
|
|||
|
end
|
|||
|
end
|
|||
|
return 0
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.AutoRune(teamList)
|
|||
|
teamList = teamList or _TeamList
|
|||
|
|
|||
|
for _, team in pairs(teamList) do
|
|||
|
if not team:HasRune() then
|
|||
|
local runeId = XStrongholdManager.GetNextCanUseRuneId()
|
|||
|
if XTool.IsNumberValid(runeId) then
|
|||
|
local subRuneId = XStrongholdConfigs.GetSubRuneIds(runeId)[1]
|
|||
|
team:SetRune(runeId, subRuneId)
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
-----------------符文 end------------------
|
|||
|
--登录通知
|
|||
|
function XStrongholdManager.NotifyStrongholdLoginData(data)
|
|||
|
if CheckActivityReset(data.Id) then
|
|||
|
XStrongholdManager.Reset()
|
|||
|
end
|
|||
|
|
|||
|
XStrongholdManager.Init()
|
|||
|
|
|||
|
UpdateActivityInfo(data.Id, data.BeginTime, data.FightBeginTime)
|
|||
|
UpdateLevelId(data.LevelId)
|
|||
|
UpdatePauseDays(data.StayDays)
|
|||
|
UpdateCurDay(data.CurDay, data.FightBeginTime)
|
|||
|
UpdateTotalMineral(data.TotalMineral)
|
|||
|
UpdateMineralLeft(data.MineralLeft)
|
|||
|
UpdateEndurance(data.Endurance)
|
|||
|
UpdateMaxElectricEnergy(data.ElectricEnergy)
|
|||
|
UpdateElectricCharacters(data.ElectricCharacterIds)
|
|||
|
UpdateBorrowCount(data.BorrowCount)
|
|||
|
UpdateFinishGroupIds(data.FinishGroupIds)
|
|||
|
UpdateFinishGroupUseElectricEnergy(data.FinishGroupInfos)
|
|||
|
UpdateFinishedRewardIds(data.RewardIds)
|
|||
|
UpdateMineRecords(data.MineRecords)
|
|||
|
UpdateGroupStageDatas(data.GroupStageDatas)
|
|||
|
UpdateGroupInfos(data.GroupInfos)
|
|||
|
UpdateLastAcitivityRecord(data.LastResultRecord)
|
|||
|
UpdateTeamList(data.TeamInfos)
|
|||
|
UpdateShareCharacterId(data.AssistCharacterId)
|
|||
|
UpdateRuneIds(data.RuneList)
|
|||
|
end
|
|||
|
|
|||
|
--活动结束
|
|||
|
function XStrongholdManager.NotifyStrongholdEnd()
|
|||
|
XStrongholdManager.Reset()
|
|||
|
end
|
|||
|
|
|||
|
--通知天数改变
|
|||
|
function XStrongholdManager.NotifyStrongholdChangeDay(data)
|
|||
|
UpdateCurDay(data.CurDay, data.FightBeginTime)
|
|||
|
UpdatePauseDays(data.StayDays)
|
|||
|
UpdateMineralLeft(data.MineralLeft)
|
|||
|
UpdateEndurance(data.Endurance)
|
|||
|
UpdateMaxElectricEnergy(data.ElectricEnergy)
|
|||
|
UpdateMineRecords(data.MineRecords)
|
|||
|
UpdateBorrowCount(data.BorrowCount)
|
|||
|
ClearAssitantRecords()
|
|||
|
end
|
|||
|
|
|||
|
--在线重置
|
|||
|
function XStrongholdManager.Reset()
|
|||
|
_ActivityStatus = ACTIVITY_STATUS.DEFAULT --活动状态
|
|||
|
_ActivityId = 0 --活动期数
|
|||
|
_BeginTime = 0 --活动开启时间
|
|||
|
_FightBeginTime = 0 --挑战开启时间
|
|||
|
_FightAutoBeginTime = 0 --挑战自动开启时间
|
|||
|
_FightEndTime = 0 --挑战结束时间
|
|||
|
_EndTime = 0 --活动结束时间
|
|||
|
_CurDay = 0 --当前天数(挑战开始后)
|
|||
|
_TotalDay = 0 --挑战总天数(挑战开始后)
|
|||
|
_TotalMineral = 0 --历史累计矿石数量
|
|||
|
_MineralLeft = 0 --可领矿石
|
|||
|
_MineRecords = {} --产出记录
|
|||
|
_MineRecordSynDic = {} --产出历史记录(服务端同步)
|
|||
|
_Endurance = 0 --耐力值
|
|||
|
_MaxElectricEnergy = 0 --电能上限
|
|||
|
_BorrowCount = 0 --援助次数
|
|||
|
_FinishGroupIdDic = {}
|
|||
|
--已完成据点Id字典
|
|||
|
_NewFinishGroupIds = {}
|
|||
|
--最新完成据点Id列表
|
|||
|
_FinishedRewardIdDic = {}
|
|||
|
--已领取奖励Id字典
|
|||
|
_GroupInfos = {}
|
|||
|
--据点信息
|
|||
|
_TeamList = {}
|
|||
|
--队伍列表
|
|||
|
_AssistantCharacters = {} --援助角色列表(来自于其他玩家)
|
|||
|
_AssistantCharacterId = 0 --共享角色Id
|
|||
|
_PauseDays = {}
|
|||
|
--暂停结算的天数
|
|||
|
_LevelId = 0
|
|||
|
--当前选择的分区
|
|||
|
_RuneIdList = {} --本期符文Id列表
|
|||
|
_UsingRuneIdDic = {} --使用中符文Id字典
|
|||
|
_UsingSubRuneIdDic = {} --使用中子符文Id字典
|
|||
|
|
|||
|
_ActivityEnd = true
|
|||
|
CsXGameEventManager.Instance:Notify(XEventId.EVENT_STRONGHOLD_ACTIVITY_END)
|
|||
|
end
|
|||
|
|
|||
|
function XStrongholdManager.Init()
|
|||
|
InitMine()
|
|||
|
InitTeamList()
|
|||
|
InitElectric()
|
|||
|
InitPauseDays()
|
|||
|
|
|||
|
XEventManager.AddEventListener(XEventId.EVENT_FIGHT_FINISH_LOSEUI_CLOSE, XStrongholdManager.ChallengeLose)
|
|||
|
end
|
|||
|
|
|||
|
return XStrongholdManager
|
|||
|
end
|
|||
|
---------------------(服务器推送)begin------------------
|
|||
|
XRpc.NotifyStrongholdLoginData = function(data)
|
|||
|
XDataCenter.StrongholdManager.NotifyStrongholdLoginData(data)
|
|||
|
end
|
|||
|
|
|||
|
XRpc.NotifyStrongholdChangeDay = function(data)
|
|||
|
XDataCenter.StrongholdManager.NotifyStrongholdChangeDay(data)
|
|||
|
end
|
|||
|
|
|||
|
XRpc.NotifyStrongholdTotalMineral = function(data)
|
|||
|
XDataCenter.StrongholdManager.NotifyStrongholdTotalMineral(data)
|
|||
|
end
|
|||
|
|
|||
|
XRpc.NotifyStrongholdResultRecord = function(data)
|
|||
|
XDataCenter.StrongholdManager.NotifyStrongholdResultRecord(data)
|
|||
|
end
|
|||
|
|
|||
|
XRpc.NotifyStrongholdBorrowCount = function(data)
|
|||
|
XDataCenter.StrongholdManager.NotifyStrongholdBorrowCount(data)
|
|||
|
end
|
|||
|
|
|||
|
XRpc.NotifyStrongholdFinishGroupId = function(data)
|
|||
|
XDataCenter.StrongholdManager.NotifyStrongholdFinishGroupId(data)
|
|||
|
end
|
|||
|
|
|||
|
XRpc.NotifyStrongholdFinishGroupInfo = function(data)
|
|||
|
XDataCenter.StrongholdManager.NotifyStrongholdFinishGroupInfo(data)
|
|||
|
end
|
|||
|
|
|||
|
XRpc.NotifyUpdateStrongholdGroupData = function(data)
|
|||
|
XDataCenter.StrongholdManager.NotifyUpdateStrongholdGroupData(data)
|
|||
|
end
|
|||
|
|
|||
|
XRpc.NotifyDeleteStrongholdGroupData = function(data)
|
|||
|
XDataCenter.StrongholdManager.NotifyDeleteStrongholdGroupData(data)
|
|||
|
end
|
|||
|
|
|||
|
XRpc.NotifyStrongholdEnduranceData = function(data)
|
|||
|
XDataCenter.StrongholdManager.NotifyStrongholdEnduranceData(data)
|
|||
|
end
|
|||
|
|
|||
|
XRpc.NotifyStrongholdEnd = function(data)
|
|||
|
XDataCenter.StrongholdManager.NotifyStrongholdEnd(data)
|
|||
|
end
|
|||
|
---------------------(服务器推送)end------------------
|