406 lines
14 KiB
Lua
406 lines
14 KiB
Lua
|
|
||
|
--[[
|
||
|
regionData = XPivotCombatRegionData
|
||
|
|
||
|
class XPivotCombatRegionData
|
||
|
{
|
||
|
// 区域id
|
||
|
int RegionId;
|
||
|
// 供能等级
|
||
|
int SupplyEnergyLevel;
|
||
|
// 通关关卡数据列表
|
||
|
List<XPivotCombatStageData> StageDataList = new List<XPivotCombatStageData>();
|
||
|
}
|
||
|
|
||
|
class XPivotCombatStageData
|
||
|
{
|
||
|
// 关卡数据
|
||
|
public int StageId;
|
||
|
// 关卡历史最高积分(中心区域关卡 > 0, 次级区域关卡 = 0)
|
||
|
public int Score;
|
||
|
// 参战角色列表
|
||
|
public List<int> CharacterIds = new List<int>();
|
||
|
}
|
||
|
]]
|
||
|
|
||
|
|
||
|
|
||
|
local XPivotCombatRegionItem = XClass(nil, "XPivotCombatRegionItem")
|
||
|
local XPivotCombatStageItem = require("XEntity/XPivotCombat/XPivotCombatStageItem")
|
||
|
|
||
|
function XPivotCombatRegionItem:Ctor(regionId)
|
||
|
self.RegionId = regionId
|
||
|
end
|
||
|
|
||
|
--===========================================================================
|
||
|
---@desc 根据配置表初始化数据
|
||
|
--===========================================================================
|
||
|
function XPivotCombatRegionItem:InitData(regionConfig)
|
||
|
--最大可提供能源
|
||
|
self.MaxSupplyEnergy = 0
|
||
|
--当前提供的能源
|
||
|
self.CurSupplyEnergy = 0
|
||
|
--小图标路径
|
||
|
self.SmallIcon = regionConfig.SmallIcon
|
||
|
--特效库id
|
||
|
self.EffectLibId = regionConfig.EffectLibId
|
||
|
--关卡库Id
|
||
|
self.StageLibId = regionConfig.StageLibId
|
||
|
--名称
|
||
|
self.RegionName = regionConfig.RegionName
|
||
|
--开放时间
|
||
|
self.OpenTime = regionConfig.OpenTime
|
||
|
--区域难度
|
||
|
self.Difficulty = regionConfig.Difficulty
|
||
|
--任务组
|
||
|
self.TaskGroupId = regionConfig.TaskGroupId
|
||
|
--区域下标
|
||
|
self.SecondaryRegionIndex = regionConfig.SecondaryRegionIndex
|
||
|
--区域背景
|
||
|
self.SecondaryRegionBackground = regionConfig.SecondaryRegionBackground
|
||
|
--区域开放能量限制
|
||
|
self.TotalSupplyEnergyLevelLimit = regionConfig.TotalSupplyEnergyLevelLimit
|
||
|
--当前区域下的关卡
|
||
|
self.StageDict = {}
|
||
|
|
||
|
self:InitStageDict()
|
||
|
end
|
||
|
|
||
|
--===========================================================================
|
||
|
---@desc 初始化该区域下的关卡配置
|
||
|
--===========================================================================
|
||
|
function XPivotCombatRegionItem:InitStageDict()
|
||
|
--当前区域下的关卡库配置,已经排好序
|
||
|
local libConfig = XDataCenter.PivotCombatManager.GetStageConfigs(self.StageLibId)
|
||
|
for _, config in ipairs(libConfig) do
|
||
|
local stageId = config.StageId
|
||
|
local item = XPivotCombatStageItem.New(stageId, config.StageLibId)
|
||
|
item:InitData(config)
|
||
|
self.StageDict[stageId] = item
|
||
|
XDataCenter.PivotCombatManager.RefreshStageInfo(stageId, item)
|
||
|
end
|
||
|
|
||
|
for _, stage in pairs(self.StageDict) do
|
||
|
self.MaxSupplyEnergy = self.MaxSupplyEnergy + stage:GetSupplyEnergyLevel()
|
||
|
end
|
||
|
end
|
||
|
|
||
|
--===========================================================================
|
||
|
---@desc 通关后更新区域供能情况
|
||
|
---@param {regionData} class XPivotCombatRegionData
|
||
|
--===========================================================================
|
||
|
function XPivotCombatRegionItem:RefreshRegionData(regionData)
|
||
|
--当前提供的能源
|
||
|
self.CurSupplyEnergy = regionData.SupplyEnergyLevel
|
||
|
local stageDataList = regionData.StageDataList
|
||
|
for _, stageData in ipairs(stageDataList or {}) do
|
||
|
local stageId = stageData.StageId
|
||
|
local item = self.StageDict[stageId]
|
||
|
if item then
|
||
|
item:RefreshStageData(stageData)
|
||
|
XDataCenter.PivotCombatManager.RefreshStageInfo(stageId, item)
|
||
|
else
|
||
|
XLog.Error("Can`t Found the Stage Where StageId = ", stageId)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
--===========================================================================
|
||
|
---@desc 刷新单个关卡
|
||
|
--===========================================================================
|
||
|
function XPivotCombatRegionItem:RefreshSingleStage(regionData)
|
||
|
--
|
||
|
self.CurSupplyEnergy = regionData.SupplyEnergyLevel
|
||
|
local stageData = regionData.StageData
|
||
|
local stageId = stageData.StageId
|
||
|
local stage = self.StageDict[stageId]
|
||
|
if stage then
|
||
|
stage:RefreshStageData(stageData)
|
||
|
XDataCenter.PivotCombatManager.RefreshStageInfo(stageId, stage)
|
||
|
else
|
||
|
XLog.Error("Can`t Found the Stage Where StageId = ", stageId)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
--===========================================================================
|
||
|
---@desc 取消角色锁定
|
||
|
--===========================================================================
|
||
|
function XPivotCombatRegionItem:CancelLockCharacter(supplyEnergyLevel, stageId)
|
||
|
self.CurSupplyEnergy = supplyEnergyLevel
|
||
|
local stage = self.StageDict[stageId]
|
||
|
if stage then
|
||
|
stage:CancelLockCharacter()
|
||
|
XDataCenter.PivotCombatManager.RefreshStageInfo(stageId, stage)
|
||
|
|
||
|
else
|
||
|
XLog.Error("Can`t Found the Stage Where StageId = ", stageId)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
--===========================================================================
|
||
|
---@desc 特效库Id
|
||
|
--===========================================================================
|
||
|
function XPivotCombatRegionItem:GetEffectId()
|
||
|
return self.EffectLibId or 0
|
||
|
end
|
||
|
|
||
|
--===========================================================================
|
||
|
---@desc 区域名
|
||
|
--===========================================================================
|
||
|
function XPivotCombatRegionItem:GetRegionName()
|
||
|
return self.RegionName
|
||
|
end
|
||
|
|
||
|
--===========================================================================
|
||
|
---@desc 获取区域距离开放的时间 : xxx天
|
||
|
--===========================================================================
|
||
|
function XPivotCombatRegionItem:GetRegionOpenTime()
|
||
|
if not self.OpenTime then
|
||
|
return ""
|
||
|
end
|
||
|
local timeOfNow = XTime.GetServerNowTimestamp()
|
||
|
--local timeOfBgn = XFunctionManager.GetStartTimeByTimeId(self.OpenTime)
|
||
|
local timeOfBgn = XDataCenter.PivotCombatManager.GetActivityBeginTime()
|
||
|
return XUiHelper.GetTime(timeOfBgn + self.OpenTime - timeOfNow, XUiHelper.TimeFormatType.PIVOT_COMBAT)
|
||
|
end
|
||
|
|
||
|
--===========================================================================
|
||
|
---@desc 获取区域距离关闭剩下的时间
|
||
|
--===========================================================================
|
||
|
function XPivotCombatRegionItem:GetRegionLeftTime()
|
||
|
if not self.OpenTime then
|
||
|
return ""
|
||
|
end
|
||
|
local timeOfNow = XTime.GetServerNowTimestamp()
|
||
|
--local timeOfEnd = XFunctionManager.GetEndTimeByTimeId(self.OpenTime)
|
||
|
local timeOfEnd = XDataCenter.PivotCombatManager.GetActivityEndTime()
|
||
|
return XUiHelper.GetTime(timeOfEnd - timeOfNow, XUiHelper.TimeFormatType.PIVOT_COMBAT)
|
||
|
end
|
||
|
|
||
|
--===========================================================================
|
||
|
---@desc 区域是否开放,如果未开放,同时返回未开放的描述
|
||
|
--===========================================================================
|
||
|
function XPivotCombatRegionItem:IsOpen()
|
||
|
--活动未开放
|
||
|
if not XDataCenter.PivotCombatManager.IsOpen() then
|
||
|
return false, CSXTextManagerGetText("CommonActivityNotStart")
|
||
|
end
|
||
|
|
||
|
if not self.OpenTime then
|
||
|
return false, CSXTextManagerGetText("CommonActivityNotStart")
|
||
|
end
|
||
|
|
||
|
--时间是否满足
|
||
|
local timeOfNow = XTime.GetServerNowTimestamp()
|
||
|
local timeOfBgn = XDataCenter.PivotCombatManager.GetActivityBeginTime()
|
||
|
local timeOfEnd = XDataCenter.PivotCombatManager.GetActivityEndTime()
|
||
|
|
||
|
--区域未开放
|
||
|
if timeOfNow < timeOfBgn + self.OpenTime then
|
||
|
return false, CSXTextManagerGetText("ActivityRepeatChallengeChapterLock", self:GetRegionOpenTime())
|
||
|
end
|
||
|
--活动已结束
|
||
|
if timeOfNow > timeOfEnd then
|
||
|
return false, CSXTextManagerGetText("CommonActivityEnd")
|
||
|
end
|
||
|
|
||
|
local isEnergyEnough = true
|
||
|
--该区域开放需供能
|
||
|
if self.TotalSupplyEnergyLevelLimit > 0 then
|
||
|
isEnergyEnough = XDataCenter.PivotCombatManager.IsSecondaryEnergySupplyEnough()
|
||
|
end
|
||
|
--供能不满足
|
||
|
if not isEnergyEnough then
|
||
|
return false, CSXTextManagerGetText("PivotCombatAreaEnergyNotEnough")
|
||
|
end
|
||
|
|
||
|
return true
|
||
|
end
|
||
|
|
||
|
--===========================================================================
|
||
|
---@desc 区域id
|
||
|
--===========================================================================
|
||
|
function XPivotCombatRegionItem:GetRegionId()
|
||
|
return self.RegionId
|
||
|
end
|
||
|
|
||
|
--===========================================================================
|
||
|
---@desc 根据供能需求判断是否是中枢区域
|
||
|
--===========================================================================
|
||
|
function XPivotCombatRegionItem:IsCenterRegion()
|
||
|
return self.TotalSupplyEnergyLevelLimit > 0
|
||
|
end
|
||
|
|
||
|
--===========================================================================
|
||
|
---@desc 关卡库Id
|
||
|
--===========================================================================
|
||
|
function XPivotCombatRegionItem:GetStageLibId()
|
||
|
return self.StageLibId
|
||
|
end
|
||
|
|
||
|
--===========================================================================
|
||
|
---@desc 当前供能
|
||
|
--===========================================================================
|
||
|
function XPivotCombatRegionItem:GetCurSupplyEnergy()
|
||
|
return self.CurSupplyEnergy
|
||
|
end
|
||
|
|
||
|
--===========================================================================
|
||
|
---@desc 最大可提供能源
|
||
|
--===========================================================================
|
||
|
function XPivotCombatRegionItem:GetMaxSupplyEnergy()
|
||
|
return self.MaxSupplyEnergy
|
||
|
end
|
||
|
|
||
|
--===========================================================================
|
||
|
---@desc 获取区域图标
|
||
|
---@return {string} 图标路径
|
||
|
--===========================================================================
|
||
|
function XPivotCombatRegionItem:GetIcon()
|
||
|
return self.SmallIcon
|
||
|
end
|
||
|
|
||
|
--===========================================================================
|
||
|
---@desc 获取区域难度
|
||
|
--===========================================================================
|
||
|
function XPivotCombatRegionItem:GetDifficulty()
|
||
|
return self.Difficulty
|
||
|
end
|
||
|
|
||
|
--===========================================================================
|
||
|
---@desc 根据供能等级获取buff描述
|
||
|
---@param {level} 供能等级
|
||
|
--===========================================================================
|
||
|
function XPivotCombatRegionItem:GetBuffDesc(level)
|
||
|
--还未提供能量
|
||
|
if level <= 0 then
|
||
|
return CSXTextManagerGetText("PivotCombatAreaEnergyNotActive")
|
||
|
end
|
||
|
--供能大于最大供能等级
|
||
|
if level > self.MaxSupplyEnergy then
|
||
|
level = self.MaxSupplyEnergy
|
||
|
end
|
||
|
local effectCfg = XPivotCombatConfigs.GetEffectConfig(self.EffectLibId, level)
|
||
|
local buffDesc = ""
|
||
|
if effectCfg then
|
||
|
--buffDesc = XRoomSingleManager.GetEvenDesc(effectCfg.FightEventId)
|
||
|
buffDesc = effectCfg.BuffDesc
|
||
|
end
|
||
|
return buffDesc
|
||
|
end
|
||
|
|
||
|
--===========================================================================
|
||
|
---@desc 获取当前区域的积分加成
|
||
|
--===========================================================================
|
||
|
function XPivotCombatRegionItem:GetScoreAddition()
|
||
|
if self.CurSupplyEnergy <= 0 then
|
||
|
return 0
|
||
|
end
|
||
|
|
||
|
if self.CurSupplyEnergy > self.MaxSupplyEnergy then
|
||
|
self.CurSupplyEnergy = self.MaxSupplyEnergy
|
||
|
end
|
||
|
|
||
|
local effectCfg = XPivotCombatConfigs.GetEffectConfig(self.EffectLibId, self.CurSupplyEnergy)
|
||
|
if effectCfg then
|
||
|
return effectCfg.ScoreAddition
|
||
|
end
|
||
|
return 0
|
||
|
end
|
||
|
|
||
|
--===========================================================================
|
||
|
---@desc 计算当前供能与区域总供能比值
|
||
|
---@return {float}
|
||
|
--===========================================================================
|
||
|
function XPivotCombatRegionItem:GetPercentEnergy()
|
||
|
if self.MaxSupplyEnergy <= 0 then
|
||
|
XLog.Error("XPivotCombat Region:"..self.RegionId.."MaxSupplyEnergy Calculate Error:", self.MaxSupplyEnergy)
|
||
|
return "0/0"
|
||
|
end
|
||
|
|
||
|
if self.CurSupplyEnergy > self.MaxSupplyEnergy then
|
||
|
self.CurSupplyEnergy = self.MaxSupplyEnergy
|
||
|
end
|
||
|
return self.CurSupplyEnergy / self.MaxSupplyEnergy
|
||
|
end
|
||
|
|
||
|
--===========================================================================
|
||
|
---@desc 获取区域的关卡数据
|
||
|
--===========================================================================
|
||
|
function XPivotCombatRegionItem:GetStageList()
|
||
|
local stageList = {}
|
||
|
for _, stage in pairs(self.StageDict) do
|
||
|
table.insert(stageList, stage)
|
||
|
end
|
||
|
|
||
|
table.sort(stageList, function(a, b)
|
||
|
return a:GetIndex() < b:GetIndex()
|
||
|
end)
|
||
|
return stageList
|
||
|
end
|
||
|
|
||
|
--===========================================================================
|
||
|
---@desc 获取中枢关卡配置,中枢关卡只有一个,如果有多个默认拿到第一个
|
||
|
--===========================================================================
|
||
|
function XPivotCombatRegionItem:GetCenterStage()
|
||
|
if not self:IsCenterRegion() then
|
||
|
XLog.Error("This Region is Not Center Region, Do Not Call This Function")
|
||
|
return {}
|
||
|
end
|
||
|
for stageId, stage in pairs(self.StageDict) do
|
||
|
if stage then
|
||
|
return stage
|
||
|
end
|
||
|
end
|
||
|
return {}
|
||
|
end
|
||
|
|
||
|
--===========================================================================
|
||
|
---@desc 获取次级区域锁角色的关卡
|
||
|
--===========================================================================
|
||
|
function XPivotCombatRegionItem:GetLockCharacterStage()
|
||
|
if not self.LockCharacterStage then
|
||
|
for _, stage in pairs(self.StageDict) do
|
||
|
if stage:CheckIsLockCharacterStage() then
|
||
|
self.LockCharacterStage = stage
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
return self.LockCharacterStage
|
||
|
end
|
||
|
|
||
|
--===========================================================================
|
||
|
---@desc 是否是相同的次级区域
|
||
|
--===========================================================================
|
||
|
function XPivotCombatRegionItem:IsSameRegion(region)
|
||
|
if not region then
|
||
|
return false
|
||
|
end
|
||
|
return self.RegionId == region:GetRegionId()
|
||
|
end
|
||
|
|
||
|
--==============================
|
||
|
---@desc 区域类型
|
||
|
---@return number
|
||
|
--==============================
|
||
|
function XPivotCombatRegionItem:GetSecondaryRegionIndex()
|
||
|
return self.SecondaryRegionIndex
|
||
|
end
|
||
|
|
||
|
--==============================
|
||
|
---@desc 区域背景
|
||
|
---@return string
|
||
|
--==============================
|
||
|
function XPivotCombatRegionItem:GetSecondaryRegionBg()
|
||
|
return self.SecondaryRegionBackground
|
||
|
end
|
||
|
|
||
|
--==============================
|
||
|
---@desc 任务组
|
||
|
---@return number
|
||
|
--==============================
|
||
|
function XPivotCombatRegionItem:GetTaskGroupId()
|
||
|
return self.TaskGroupId
|
||
|
end
|
||
|
|
||
|
return XPivotCombatRegionItem
|