2097 lines
No EOL
68 KiB
Lua
2097 lines
No EOL
68 KiB
Lua
---@class XTheatre3Control : XControl
|
||
---@field _Model XTheatre3Model
|
||
local XTheatre3Control = XClass(XControl, "XTheatre3Control")
|
||
|
||
local RequestProto = {
|
||
Theatre3ActivationStrengthenTreeRequest = "Theatre3ActivationStrengthenTreeRequest", -- 激活天赋树
|
||
Theatre3GetBattlePassRewardRequest = "Theatre3GetBattlePassRewardRequest", -- 领取奖励
|
||
--Adventure
|
||
Theatre3SettleAdventureRequest = "Theatre3SettleAdventureRequest", -- 放弃冒险
|
||
Theatre3SelectDifficultyRequest = "Theatre3SelectDifficultyRequest", -- 进入冒险选择难度
|
||
Theatre3EndRecruitRequest = "Theatre3EndRecruitRequest", -- 结束开局编队
|
||
Theatre3SelectNodeRequest = "Theatre3SelectNodeRequest", -- 选择节点
|
||
Theatre3SelectItemRewardRequest = "Theatre3SelectItemRewardRequest", -- 选择开道具箱奖励,3选1
|
||
Theatre3NodeShopBuyItemRequest = "Theatre3NodeShopBuyItemRequest", -- 局内商店购买
|
||
Theatre3EndNodeRequest = "Theatre3EndNodeRequest", -- 结束节点,商店节点
|
||
Theatre3EventNodeNextStepRequest = "Theatre3EventNodeNextStepRequest", -- 事件,下一步,选择选项
|
||
Theatre3RecvFightRewardRequest = "Theatre3RecvFightRewardRequest", -- 战斗结束—打开战斗奖励选择界面—领取战斗奖励
|
||
Theatre3EndRecvFightRewardRequest = "Theatre3EndRecvFightRewardRequest", -- 战斗结束—打开战斗奖励选择界面—领取战斗奖励-结束领取
|
||
Theatre3SelectEquipRequest = "Theatre3SelectEquipRequest", -- 选择装备
|
||
Theatre3ChangeEquipPosRequest = "Theatre3ChangeEquipPosRequest", -- 装备换位置
|
||
Theatre3RecastEquipRequest = "Theatre3RecastEquipRequest", -- 重铸装备
|
||
Theatre3SetTeamRequest = "Theatre3SetTeamRequest", -- 设置队伍
|
||
Theatre3EndWorkShopRequest = "Theatre3EndWorkShopRequest", -- 事件—工坊—结束工坊—事件下一步
|
||
Theatre3EndEquipBoxRequest = "Theatre3EndEquipBoxRequest", -- 结束装备箱事件
|
||
}
|
||
|
||
function XTheatre3Control:OnInit()
|
||
--初始化内部变量
|
||
end
|
||
|
||
function XTheatre3Control:AddAgencyEvent()
|
||
--control在生命周期启动的时候需要对Agency及对外的Agency进行注册
|
||
|
||
end
|
||
|
||
function XTheatre3Control:RemoveAgencyEvent()
|
||
|
||
end
|
||
|
||
function XTheatre3Control:OnRelease()
|
||
-- 这里执行Control的释放
|
||
end
|
||
|
||
--region 活动相关
|
||
|
||
function XTheatre3Control:GetActivityName()
|
||
local config = self._Model:GetActivityConfig()
|
||
if not config then
|
||
return ""
|
||
end
|
||
return config.Name or ""
|
||
end
|
||
|
||
--endregion
|
||
|
||
--region BP奖励相关
|
||
|
||
function XTheatre3Control:GetBattlePassRewardId(id)
|
||
local config = self._Model:GetBattlePassConfig(id)
|
||
return config.RewardId or 0
|
||
end
|
||
|
||
function XTheatre3Control:GetBattlePassDisplay(id)
|
||
local config = self._Model:GetBattlePassConfig(id)
|
||
return config.Display or 0
|
||
end
|
||
|
||
-- 获取当前BP的等级
|
||
function XTheatre3Control:GetCurBattlePassLevel()
|
||
local totalExp = self._Model:GetBattlePassTotalExp()
|
||
return self:GetBattlePassLevelByExp(totalExp)
|
||
end
|
||
|
||
function XTheatre3Control:GetBattlePassLevelByExp(exp)
|
||
return self._Model:GetBattlePassLevelByExp(exp)
|
||
end
|
||
|
||
-- 获取下一个稀有奖励的等级
|
||
function XTheatre3Control:GetNextDisplayLevel(level)
|
||
local maxBattlePassLevel = self._Model:GetMaxBattlePassLevel()
|
||
if maxBattlePassLevel <= level then
|
||
return maxBattlePassLevel
|
||
end
|
||
--local configs = self._Model:GetBattlePassConfigs()
|
||
for i = level + 1, maxBattlePassLevel do
|
||
if self:CheckBattlePassDisplay(i) then
|
||
return i
|
||
end
|
||
end
|
||
return maxBattlePassLevel
|
||
end
|
||
|
||
-- 获取当前等级的经验
|
||
function XTheatre3Control:GetCurLevelExp(level)
|
||
local curTotalLevelExp = 0
|
||
for i = 1, level do
|
||
local needExp = self._Model:GetBattlePassNeedExp(i)
|
||
curTotalLevelExp = curTotalLevelExp + needExp
|
||
end
|
||
local totalExp = self._Model:GetBattlePassTotalExp()
|
||
local exp = totalExp - curTotalLevelExp
|
||
return math.max(0, exp)
|
||
end
|
||
|
||
-- 获取下一等级的经验
|
||
function XTheatre3Control:GetNextLevelExp(level)
|
||
local maxBattlePassLevel = self._Model:GetMaxBattlePassLevel()
|
||
if maxBattlePassLevel < level then
|
||
return 0
|
||
end
|
||
return self._Model:GetBattlePassNeedExp(level)
|
||
end
|
||
|
||
function XTheatre3Control:GetBattlePassIdList()
|
||
return self._Model:GetBattlePassIdList()
|
||
end
|
||
|
||
-- 检查当前是否是最大等级
|
||
function XTheatre3Control:CheckBattlePassMaxLevel(level)
|
||
local maxLevel = self._Model:GetMaxBattlePassLevel()
|
||
if level >= maxLevel then
|
||
return true
|
||
end
|
||
return false
|
||
end
|
||
|
||
-- 检查BP奖励是否已经领取
|
||
function XTheatre3Control:CheckRewardReceived(battlePassId)
|
||
return self._Model.ActivityData:CheckGetRewardId(battlePassId)
|
||
end
|
||
|
||
-- 奖励是否可以领取
|
||
function XTheatre3Control:CheckBattlePassAbleToReceive(battlePassId, curLevel)
|
||
local isReceive = self:CheckRewardReceived(battlePassId)
|
||
return curLevel >= battlePassId and not isReceive
|
||
end
|
||
|
||
function XTheatre3Control:GetCanReceiveBattlePassIds(curLevel)
|
||
local configs = self._Model:GetBattlePassConfigs()
|
||
local list = {}
|
||
for id, _ in pairs(configs) do
|
||
if self:CheckBattlePassAbleToReceive(id, curLevel) then
|
||
table.insert(list, id)
|
||
end
|
||
end
|
||
table.sort(list, function(a, b)
|
||
return a < b
|
||
end)
|
||
return list
|
||
end
|
||
|
||
-- 检查是否是稀有道具
|
||
function XTheatre3Control:CheckBattlePassDisplay(id)
|
||
local display = self:GetBattlePassDisplay(id)
|
||
return display == XEnumConst.THEATRE3.RewardDisplayType.Rare
|
||
end
|
||
|
||
-- 是否有可以领取的奖励
|
||
function XTheatre3Control:CheckIsHaveReward(curLevel)
|
||
local configs = self._Model:GetBattlePassConfigs()
|
||
for id, _ in pairs(configs) do
|
||
if not self:CheckRewardReceived(id) and id <= curLevel then
|
||
return true
|
||
end
|
||
end
|
||
return false
|
||
end
|
||
|
||
--endregion
|
||
|
||
--region Config表相关
|
||
|
||
function XTheatre3Control:GetShareConfig(key)
|
||
return self._Model:GetShareConfig(key)
|
||
end
|
||
|
||
function XTheatre3Control:GetClientConfig(key, index)
|
||
if not index then
|
||
index = 1
|
||
end
|
||
return self._Model:GetClientConfig(key, index)
|
||
end
|
||
|
||
--endregion
|
||
|
||
--region 任务相关
|
||
|
||
function XTheatre3Control:GetTaskConfigIds()
|
||
return self._Model:GetTaskConfigIdList()
|
||
end
|
||
|
||
function XTheatre3Control:GetTaskDatas(taskConfigId, isSort)
|
||
if isSort == nil then
|
||
isSort = true
|
||
end
|
||
local taskIdList = self._Model:GetTaskIdsById(taskConfigId)
|
||
local result = {}
|
||
for _, id in ipairs(taskIdList) do
|
||
table.insert(result, XDataCenter.TaskManager.GetTaskDataById(id))
|
||
end
|
||
if isSort then
|
||
XDataCenter.TaskManager.SortTaskList(result)
|
||
end
|
||
return result
|
||
end
|
||
|
||
-- 获得主界面显示的任务Id
|
||
function XTheatre3Control:GetMainShowTaskId()
|
||
local showIdList = self._Model:GetTaskMainShowIdList()
|
||
local mainShowTaskId = 0
|
||
for _, id in pairs(showIdList) do
|
||
local taskIds = self._Model:GetTaskIdsById(id)
|
||
for _, taskId in pairs(taskIds) do
|
||
if not XDataCenter.TaskManager.IsTaskFinished(taskId) then
|
||
return taskId
|
||
end
|
||
mainShowTaskId = taskId
|
||
end
|
||
end
|
||
return mainShowTaskId
|
||
end
|
||
|
||
function XTheatre3Control:GetTaskNameById(id)
|
||
local config = self._Model:GetTaskConfig(id)
|
||
return config.Name or ""
|
||
end
|
||
|
||
function XTheatre3Control:CheckTaskCanRewardByTaskId(taskConfigId)
|
||
local taskIdList = self._Model:GetTaskIdsById(taskConfigId)
|
||
for _, taskId in ipairs(taskIdList) do
|
||
if XDataCenter.TaskManager.CheckTaskAchieved(taskId) then
|
||
return true
|
||
end
|
||
end
|
||
return false
|
||
end
|
||
|
||
--endregion
|
||
|
||
--region 事件物品类型相关
|
||
|
||
function XTheatre3Control:GetEventStepItemName(itemId, itemType)
|
||
if itemType == XEnumConst.THEATRE3.EventStepItemType.OutSideItem then
|
||
local goodsShowParams = XGoodsCommonManager.GetGoodsShowParamsByTemplateId(itemId)
|
||
return goodsShowParams.RewardType == XArrangeConfigs.Types.Character and goodsShowParams.TradeName or goodsShowParams.Name
|
||
elseif itemType == XEnumConst.THEATRE3.EventStepItemType.InnerItem then
|
||
return self:GetItemConfigById(itemId).Name
|
||
elseif itemType == XEnumConst.THEATRE3.EventStepItemType.ItemBox then
|
||
return self._Model:GetItemBoxById(itemId).Name
|
||
elseif itemType == XEnumConst.THEATRE3.EventStepItemType.EquipBox then
|
||
return self._Model:GetEquipBoxById(itemId).Name
|
||
end
|
||
return ""
|
||
end
|
||
|
||
function XTheatre3Control:GetEventStepItemIcon(itemId, itemType)
|
||
if itemType == XEnumConst.THEATRE3.EventStepItemType.OutSideItem then
|
||
return XGoodsCommonManager.GetGoodsIcon(itemId)
|
||
elseif itemType == XEnumConst.THEATRE3.EventStepItemType.InnerItem then
|
||
return self:GetItemConfigById(itemId).Icon
|
||
elseif itemType == XEnumConst.THEATRE3.EventStepItemType.ItemBox then
|
||
return self._Model:GetItemBoxById(itemId).Icon
|
||
elseif itemType == XEnumConst.THEATRE3.EventStepItemType.EquipBox then
|
||
return self._Model:GetEquipBoxById(itemId).Icon
|
||
end
|
||
return nil
|
||
end
|
||
|
||
function XTheatre3Control:GetEventStepItemWorldDesc(itemId, itemType)
|
||
if itemType == XEnumConst.THEATRE3.EventStepItemType.OutSideItem then
|
||
return XGoodsCommonManager.GetGoodsWorldDesc(itemId)
|
||
elseif itemType == XEnumConst.THEATRE3.EventStepItemType.InnerItem then
|
||
return self:GetItemConfigById(itemId).WorldDesc
|
||
end
|
||
return ""
|
||
end
|
||
|
||
function XTheatre3Control:GetEventStepItemDesc(itemId, itemType)
|
||
if itemType == XEnumConst.THEATRE3.EventStepItemType.OutSideItem then
|
||
return XGoodsCommonManager.GetGoodsDescription(itemId)
|
||
elseif itemType == XEnumConst.THEATRE3.EventStepItemType.InnerItem then
|
||
return self:GetItemConfigById(itemId).Description
|
||
elseif itemType == XEnumConst.THEATRE3.EventStepItemType.ItemBox then
|
||
return self._Model:GetItemBoxById(itemId).Desc
|
||
elseif itemType == XEnumConst.THEATRE3.EventStepItemType.EquipBox then
|
||
return self._Model:GetEquipBoxById(itemId).Desc
|
||
end
|
||
return ""
|
||
end
|
||
|
||
function XTheatre3Control:GetEventStepItemQualityIcon(itemId, itemType)
|
||
if itemType == XEnumConst.THEATRE3.EventStepItemType.OutSideItem then
|
||
local goodsShowParams = XGoodsCommonManager.GetGoodsShowParamsByTemplateId(itemId)
|
||
return goodsShowParams.QualityIcon
|
||
else
|
||
local quality = self:GetEventStepItemQuality(itemId, itemType)
|
||
return quality and XArrangeConfigs.GeQualityPath(quality)
|
||
end
|
||
end
|
||
|
||
function XTheatre3Control:GetEventStepItemQuality(itemId, itemType)
|
||
if itemType == XEnumConst.THEATRE3.EventStepItemType.InnerItem then
|
||
return self:GetItemConfigById(itemId).Quality
|
||
elseif itemType == XEnumConst.THEATRE3.EventStepItemType.EquipBox then
|
||
return self._Model:GetEquipBoxById(itemId).Quality
|
||
end
|
||
return nil
|
||
end
|
||
|
||
--endregion
|
||
|
||
--region 装备相关
|
||
|
||
---@return XTableTheatre3Equip
|
||
function XTheatre3Control:GetEquipById(id)
|
||
return self._Model:GetEquipById(id)
|
||
end
|
||
|
||
---@return XTableTheatre3EquipSuit
|
||
function XTheatre3Control:GetSuitById(id)
|
||
return self._Model:GetSuitById(id)
|
||
end
|
||
|
||
---获得该装备所属套装下的所有装备
|
||
---@return XTableTheatre3Equip[]
|
||
function XTheatre3Control:GetSameSuitEquip(equipId)
|
||
local config = self:GetEquipById(equipId)
|
||
return self:GetAllSuitEquip(config.SuitId)
|
||
end
|
||
|
||
---@return XTableTheatre3Equip[]
|
||
function XTheatre3Control:GetAllSuitEquip(suitId)
|
||
return self._Model:GetSameSuitEquip(suitId)
|
||
end
|
||
|
||
function XTheatre3Control:GetAllSuitWearEquipId(suitId)
|
||
local equipIds = {}
|
||
local equips = self:GetAllSuitEquip(suitId)
|
||
for _, v in pairs(equips) do
|
||
if self:IsWearEquip(v.Id) then
|
||
table.insert(equipIds, v.Id)
|
||
end
|
||
end
|
||
return equipIds
|
||
end
|
||
|
||
---是否穿戴装备
|
||
function XTheatre3Control:IsWearEquip(equipId)
|
||
return self:GetEquipBelong(equipId) ~= -1
|
||
end
|
||
|
||
---是否穿戴套装
|
||
function XTheatre3Control:IsWearSuit(suitId)
|
||
local equips = self:GetAllSuitEquip(suitId)
|
||
for _, equip in pairs(equips) do
|
||
if self:IsWearEquip(equip.Id) then
|
||
return true
|
||
end
|
||
end
|
||
return false
|
||
end
|
||
|
||
---该套装是否全部收集完毕
|
||
function XTheatre3Control:IsSuitComplete(suitId)
|
||
local equips = self:GetAllSuitEquip(suitId)
|
||
for _, equip in pairs(equips) do
|
||
if not self:IsWearEquip(equip.Id) then
|
||
return false
|
||
end
|
||
end
|
||
return true
|
||
end
|
||
|
||
---穿戴该装备后套装是否能激活
|
||
function XTheatre3Control:CanSuitComplete(equipId)
|
||
local config = self:GetEquipById(equipId)
|
||
local equips = self:GetAllSuitEquip(config.SuitId)
|
||
for _, equip in pairs(equips) do
|
||
if equip.Id ~= equipId and not self:IsWearEquip(equip.Id) then
|
||
return false
|
||
end
|
||
end
|
||
return true
|
||
end
|
||
|
||
---槽位已用装备容量
|
||
function XTheatre3Control:GetSlotCapcity(slotId)
|
||
local list = self:GetSlotSuits(slotId)
|
||
return #list
|
||
end
|
||
|
||
---获得槽位上装备的套装
|
||
function XTheatre3Control:GetSlotSuits(slotId)
|
||
return self._Model.ActivityData:GetSuitListBySlot(slotId)
|
||
end
|
||
|
||
function XTheatre3Control:GetSlotMaxCapcity(slotId)
|
||
return self._Model.ActivityData:GetMaxCapacity(slotId)
|
||
end
|
||
|
||
function XTheatre3Control:IsSlotFull(slotId)
|
||
return self:GetSlotCapcity(slotId) >= self:GetSlotMaxCapcity(slotId)
|
||
end
|
||
|
||
function XTheatre3Control:GetToggleValue(key)
|
||
local value = XSaveTool.GetData(key) or 0
|
||
return value == 1
|
||
end
|
||
|
||
function XTheatre3Control:SaveToggleValue(key, value)
|
||
XSaveTool.SaveData(key, value and 1 or 0)
|
||
end
|
||
|
||
---检查某槽位是否能穿戴此装备
|
||
function XTheatre3Control:CheckCharacterEquip(slotId, equipId)
|
||
local belongId = -1
|
||
local equips = self:GetSameSuitEquip(equipId) -- 同个套装里的装备可以放在同个槽位上
|
||
for _, v in pairs(equips) do
|
||
belongId = self:GetEquipBelong(v.Id)
|
||
if belongId ~= -1 then
|
||
break
|
||
end
|
||
end
|
||
local hasSite = self:GetSlotCapcity(slotId) < self:GetSlotMaxCapcity(slotId)
|
||
return belongId == slotId or (belongId == -1 and hasSite)
|
||
end
|
||
|
||
---返回-1表示该装备还没被穿戴
|
||
function XTheatre3Control:GetEquipBelong(equipId)
|
||
for _, v in pairs(self._Model.ActivityData.Equips) do
|
||
if v.EquipIdsMap[equipId] then
|
||
return v.SlotId
|
||
end
|
||
end
|
||
return -1
|
||
end
|
||
|
||
function XTheatre3Control:GetSuitBelong(suitId)
|
||
local equips = self:GetAllSuitEquip(suitId)
|
||
for _, equip in pairs(equips) do
|
||
local slotId = self:GetEquipBelong(equip.Id)
|
||
if slotId ~= -1 then
|
||
return slotId
|
||
end
|
||
end
|
||
return -1
|
||
end
|
||
|
||
---获取槽位上绑定的角色
|
||
function XTheatre3Control:GetSlotCharacter(slotId)
|
||
-- 3个位置,位置上没角色则为0,有角色则为角色Id
|
||
local slotInfo = self:GetSlotInfo(slotId)
|
||
if slotInfo then
|
||
return slotInfo:GetCharacterId()
|
||
end
|
||
return 0
|
||
end
|
||
|
||
function XTheatre3Control:GetWorkshopCount()
|
||
local step = self:GetAdventureCurChapterDb():GetLastStep()
|
||
return step.WorkShopCurCount, step.WorkShopTotalCount
|
||
end
|
||
|
||
function XTheatre3Control:IsWorkshopHasTimes()
|
||
local step = self:GetAdventureCurChapterDb():GetLastStep()
|
||
return step.WorkShopCurCount < step.WorkShopTotalCount
|
||
end
|
||
|
||
function XTheatre3Control:WorkShopReduceTimes()
|
||
local step = self:GetAdventureCurChapterDb():GetLastStep()
|
||
step:UpdateWorkShopTimes(step.WorkShopCurCount + 1)
|
||
end
|
||
|
||
--- 返回true表示今天不需要显示
|
||
function XTheatre3Control:GetTodayDontShowValue(key)
|
||
local recordDay = XSaveTool.GetData(key) or -1
|
||
local curDay = XTime.GetSeverNextRefreshTime()
|
||
return recordDay >= curDay
|
||
end
|
||
|
||
function XTheatre3Control:SaveTodayDontShowValue(key, isClear)
|
||
local day = isClear and 0 or XTime.GetSeverNextRefreshTime()
|
||
XSaveTool.SaveData(key, day)
|
||
end
|
||
|
||
---显示装备Tip
|
||
---@param equipId number 装备Id
|
||
---@param btnTxt string 按钮文本,可为nil
|
||
---@param btnCallBack function 按钮回调,为nil则不显示按钮
|
||
---@param tipWorldPos UnityEngine.Vector3 tip位置,可为nil
|
||
---@param closeCallBack function 关闭回调,可为nil
|
||
function XTheatre3Control:OpenEquipmentTip(equipId, btnTxt, btnCallBack, tipWorldPos, closeCallBack)
|
||
local param = {
|
||
equipId = equipId,
|
||
btnTxt = btnTxt,
|
||
btnCallBack = btnCallBack,
|
||
tipWorldPos = tipWorldPos,
|
||
closeCallBack = closeCallBack,
|
||
}
|
||
XLuaUiManager.Open("UiTheatre3BubbleEquipment", param)
|
||
end
|
||
|
||
---显示装备Tip(可以设置居目标对象的左边还是右边)
|
||
function XTheatre3Control:OpenEquipmentTipByAlign(equipId, btnTxt, btnCallBack, closeCallBack, dimObj, align)
|
||
local param = {
|
||
equipId = equipId,
|
||
btnTxt = btnTxt,
|
||
btnCallBack = btnCallBack,
|
||
closeCallBack = closeCallBack,
|
||
DimObj = dimObj,
|
||
Align = align or XEnumConst.THEATRE3.TipAlign.Right,
|
||
}
|
||
XLuaUiManager.Open("UiTheatre3BubbleEquipment", param)
|
||
end
|
||
|
||
---显示套装Tip
|
||
---@param suitId number 套装Id
|
||
---@param btnTxt string 按钮文本,可为nil
|
||
---@param btnCallBack function 按钮回调,为nil则不显示按钮
|
||
---@param closeCallBack function 关闭回调,可为nil
|
||
---@param dimObj UnityEngine.Transform
|
||
function XTheatre3Control:OpenSuitTip(suitId, btnTxt, btnCallBack, closeCallBack, dimObj, align)
|
||
local param = {
|
||
suitId = suitId,
|
||
btnTxt = btnTxt,
|
||
btnCallBack = btnCallBack,
|
||
closeCallBack = closeCallBack,
|
||
DimObj = dimObj,
|
||
Align = align or XEnumConst.THEATRE3.TipAlign.Right,
|
||
}
|
||
XLuaUiManager.Open("UiTheatre3SuitTip", param)
|
||
end
|
||
|
||
---打开装备选择界面
|
||
---@param equipIds number[] 装备Id
|
||
---@param Inherit boolean 是否装备继承
|
||
function XTheatre3Control:OpenChooseEquipPanel(equipIds, Inherit)
|
||
XLuaUiManager.Open("UiTheatre3EquipmentChoose", equipIds, Inherit)
|
||
end
|
||
|
||
---打开交换套装界面
|
||
function XTheatre3Control:OpenExchangeSuitPanel()
|
||
XLuaUiManager.Open("UiTheatre3SetBag", { isChooseSuit = true })
|
||
end
|
||
|
||
---打开装备重铸界面
|
||
function XTheatre3Control:OpenRebuildEquipPanel()
|
||
XLuaUiManager.Open("UiTheatre3SetBag", { isChooseEquip = true })
|
||
end
|
||
|
||
---打开展示套装界面
|
||
function XTheatre3Control:OpenShowEquipPanel(suitId)
|
||
XLuaUiManager.Open("UiTheatre3SetBag", { isShowEquip = true, autoSelectSuitId = suitId })
|
||
end
|
||
|
||
--endregion
|
||
|
||
--region 结算相关
|
||
|
||
---@return XTableTheatre3Ending
|
||
function XTheatre3Control:GetEndingById(id)
|
||
return self._Model:GetEndingById(id)
|
||
end
|
||
|
||
---@return XTheatre3Settle
|
||
function XTheatre3Control:GetSettleData()
|
||
return self._Model.ActivityData:GetSettleData()
|
||
end
|
||
|
||
function XTheatre3Control:SignSettleTip()
|
||
self._Model.ActivityData:SignSettleTip()
|
||
end
|
||
|
||
function XTheatre3Control:ResetTeamDate()
|
||
self._Model.ActivityData:ResetTeam()
|
||
end
|
||
|
||
function XTheatre3Control:GetRewardBoxConfig(rewardType, id)
|
||
if rewardType == XEnumConst.THEATRE3.NodeRewardType.ItemBox then
|
||
return self._Model:GetItemBoxById(id)
|
||
elseif rewardType == XEnumConst.THEATRE3.NodeRewardType.EquipBox then
|
||
return self._Model:GetEquipBoxById(id)
|
||
elseif rewardType == XEnumConst.THEATRE3.NodeRewardType.Gold then
|
||
return self._Model:GetGoldBoxById(id)
|
||
end
|
||
return nil
|
||
end
|
||
|
||
---获取结算后返回主界面时需要显示的弹框
|
||
function XTheatre3Control:GetSettleTips()
|
||
local datas = {}
|
||
local settle = self:GetSettleData()
|
||
if not settle then
|
||
return datas
|
||
end
|
||
|
||
local oldBpExp = self._Model.ActivityData:GetOldBpExp()
|
||
-- 等级升级Tip
|
||
if oldBpExp then
|
||
local old = self:GetBattlePassLevelByExp(oldBpExp)
|
||
local now = self:GetCurBattlePassLevel()
|
||
if old < now then
|
||
local param = { old = old, now = now }
|
||
table.insert(datas, { uiName = "UiTheatre3LvTips", uiParam = param })
|
||
end
|
||
end
|
||
-- 解锁藏品Tip
|
||
local unlockItems = settle.CurUnlockItemId
|
||
if not XTool.IsTableEmpty(unlockItems) then
|
||
local param = { datas = unlockItems, isUnlockSettle = true }
|
||
table.insert(datas, { uiName = "UiTheatre3UnlockTips", uiParam = param })
|
||
end
|
||
-- 解锁装备Tip
|
||
local unlockEquips = settle.CurUnlockEquipId
|
||
if not XTool.IsTableEmpty(unlockEquips) then
|
||
local param = { datas = unlockEquips, isUnlockEquip = true }
|
||
table.insert(datas, { uiName = "UiTheatre3UnlockTips", uiParam = param })
|
||
end
|
||
|
||
return datas
|
||
end
|
||
|
||
--endregion
|
||
|
||
--region 成员相关
|
||
|
||
function XTheatre3Control:GetSettleFactorInfo()
|
||
local result = {}
|
||
local settle = self:GetSettleData()
|
||
local configs = self._Model:GetSettleFactor()
|
||
for i, v in ipairs(configs) do
|
||
local data = {}
|
||
data.name = v.Name
|
||
if i == 1 then
|
||
data.count = settle.NodeCount
|
||
data.score = settle.NodeCountScore
|
||
elseif i == 2 then
|
||
data.count = settle.FightNodeCount
|
||
data.score = settle.FightNodeCountScore
|
||
elseif i == 3 then
|
||
data.count = settle.ChapterCount
|
||
data.score = settle.ChapterCountScore
|
||
elseif i == 4 then
|
||
data.count = settle.TotalSuitCount
|
||
data.score = settle.TotalSuitCountScore
|
||
elseif i == 5 then
|
||
data.count = settle.TotalEquipCount
|
||
data.score = settle.TotalEquipCountScore
|
||
elseif i == 6 then
|
||
data.count = settle.TotalItemCount
|
||
data.score = settle.TotalItemCountScore
|
||
else
|
||
XLog.Error("undefind settle factor type:" .. v)
|
||
data.count = 0
|
||
data.score = 0
|
||
end
|
||
table.insert(result, data)
|
||
end
|
||
return result
|
||
end
|
||
|
||
--endregion
|
||
|
||
--region 精通-天赋
|
||
---@return number[]
|
||
function XTheatre3Control:GetStrengthenTreeIdList()
|
||
return self._Model:GetStrengthenTreeIdList()
|
||
end
|
||
|
||
---@return XTableTheatre3StrengthenTree
|
||
function XTheatre3Control:GetStrengthenTreeById(id)
|
||
return self._Model:GetStrengthenTreeConfigById(id)
|
||
end
|
||
|
||
function XTheatre3Control:GetStrengthenTreeNameById(id)
|
||
local config = self:GetStrengthenTreeById(id)
|
||
return config and config.Name or ""
|
||
end
|
||
|
||
function XTheatre3Control:GetStrengthenTreeIconById(id)
|
||
local config = self:GetStrengthenTreeById(id)
|
||
return config and config.Icon
|
||
end
|
||
|
||
function XTheatre3Control:GetStrengthenTreePointTypeById(id)
|
||
local config = self:GetStrengthenTreeById(id)
|
||
return config and config.PointType
|
||
end
|
||
|
||
function XTheatre3Control:GetStrengthenTreeDescById(id)
|
||
local config = self:GetStrengthenTreeById(id)
|
||
return config and config.Desc or ""
|
||
end
|
||
|
||
function XTheatre3Control:GetStrengthenTreeNeedPointById(id)
|
||
local config = self:GetStrengthenTreeById(id)
|
||
return config and config.NeedStrengthenPoint or 0
|
||
end
|
||
|
||
function XTheatre3Control:GetStrengthenTreePreIdById(id)
|
||
local config = self:GetStrengthenTreeById(id)
|
||
return config and config.PreId or {}
|
||
end
|
||
|
||
function XTheatre3Control:GetStrengthenTreeConditionById(id)
|
||
local config = self:GetStrengthenTreeById(id)
|
||
return config and config.Condition or 0
|
||
end
|
||
|
||
-- 检查天赋是否解锁
|
||
function XTheatre3Control:CheckStrengthTreeUnlock(id)
|
||
return self._Model.ActivityData:CheckUnlockStrengthTree(id)
|
||
end
|
||
|
||
-- 检查前置天赋是否有任意一个解锁
|
||
function XTheatre3Control:CheckAnyPreStrengthenTreeUnlock(id)
|
||
local preIds = self:GetStrengthenTreePreIdById(id)
|
||
if XTool.IsTableEmpty(preIds) then
|
||
return true
|
||
end
|
||
for _, preId in pairs(preIds) do
|
||
if self:CheckStrengthTreeUnlock(preId) then
|
||
return true
|
||
end
|
||
end
|
||
return false
|
||
end
|
||
|
||
-- 检查前置天赋是否全部解锁
|
||
function XTheatre3Control:CheckPreStrengthenTreeAllUnlock(id)
|
||
local preIds = self:GetStrengthenTreePreIdById(id)
|
||
if XTool.IsTableEmpty(preIds) then
|
||
return true
|
||
end
|
||
for _, preId in pairs(preIds) do
|
||
if not self:CheckStrengthTreeUnlock(preId) then
|
||
return false
|
||
end
|
||
end
|
||
return true
|
||
end
|
||
|
||
-- 检查天赋条件是否成立
|
||
function XTheatre3Control:CheckStrengthenTreeCondition(id)
|
||
local condition = self:GetStrengthenTreeConditionById(id)
|
||
if XTool.IsNumberValid(condition) then
|
||
return XConditionManager.CheckCondition(condition)
|
||
end
|
||
return true, ""
|
||
end
|
||
|
||
-- 检查天赋点货币是否充足
|
||
function XTheatre3Control:CheckStrengthenTreeNeedPointEnough(id)
|
||
local itemCount = XDataCenter.ItemManager.GetCount(XEnumConst.THEATRE3.Theatre3TalentPoint)
|
||
local needCount = self:GetStrengthenTreeNeedPointById(id)
|
||
return itemCount >= needCount
|
||
end
|
||
|
||
-- 检查天赋树红点
|
||
-- 满足前置条件且未激活且天赋点数量充足的天赋
|
||
function XTheatre3Control:CheckStrengthenTreeRedPoint(id)
|
||
local isOpen = self:CheckStrengthenTreeCondition(id)
|
||
if not isOpen then
|
||
return false
|
||
end
|
||
local isUnlock = self:CheckStrengthTreeUnlock(id)
|
||
if isUnlock then
|
||
return false
|
||
end
|
||
local isEnough = self:CheckStrengthenTreeNeedPointEnough(id)
|
||
if not isEnough then
|
||
return false
|
||
end
|
||
return self:CheckPreStrengthenTreeAllUnlock(id)
|
||
end
|
||
|
||
-- 检查所有天赋树红点
|
||
function XTheatre3Control:CheckAllStrengthenTreeRedPoint()
|
||
local strengthenTreeIdList = self:GetStrengthenTreeIdList()
|
||
for _, id in pairs(strengthenTreeIdList) do
|
||
if self:CheckStrengthenTreeRedPoint(id) then
|
||
return true
|
||
end
|
||
end
|
||
return false
|
||
end
|
||
--endregion
|
||
|
||
--region 精通-成员
|
||
function XTheatre3Control:GetCharacterGroupIdList()
|
||
local characterGroupIdList = self._Model:GetCharacterGroupIdList()
|
||
table.sort(characterGroupIdList, function(a, b)
|
||
local orderIdA = self:GetCharacterGroupOrderIdById(a)
|
||
local orderIdB = self:GetCharacterGroupOrderIdById(b)
|
||
if orderIdA ~= orderIdB then
|
||
return orderIdA < orderIdB
|
||
end
|
||
return a < b
|
||
end)
|
||
return characterGroupIdList
|
||
end
|
||
|
||
function XTheatre3Control:GetCharacterIdListByGroupId(groupId)
|
||
local characterIdList = self._Model:GetCharacterIdListByGroupId(groupId)
|
||
---@type XCharacterAgency
|
||
local characterAgency = XMVCA:GetAgency(ModuleId.XCharacter)
|
||
-- 排序 角色精通等级 > 当前精通等级经验 > 成员战力
|
||
table.sort(characterIdList, function(a, b)
|
||
-- 角色精通等级
|
||
local levelA = self:GetCharacterLv(a)
|
||
local levelB = self:GetCharacterLv(b)
|
||
if levelA ~= levelB then
|
||
return levelA > levelB
|
||
end
|
||
-- 当前精通等级经验
|
||
local expA = self:GetCharacterExp(a)
|
||
local expB = self:GetCharacterExp(b)
|
||
if expA ~= expB then
|
||
return expA > expB
|
||
end
|
||
-- 成员战力
|
||
local abilityA = characterAgency:GetCharacterAbilityById(a)
|
||
local abilityB = characterAgency:GetCharacterAbilityById(b)
|
||
if abilityA ~= abilityB then
|
||
return abilityA > abilityB
|
||
end
|
||
return a < b
|
||
end)
|
||
return characterIdList
|
||
end
|
||
|
||
function XTheatre3Control:GetCharacterLevelIdListByCharacterId(characterId)
|
||
return self._Model:GetCharacterLevelIdListByCharacterId(characterId)
|
||
end
|
||
|
||
function XTheatre3Control:GetCharacterEndingIdList(characterId)
|
||
return self._Model:GetCharacterEndingIdList(characterId)
|
||
end
|
||
|
||
---@return XTableTheatre3CharacterGroup
|
||
function XTheatre3Control:GetCharacterGroupById(id)
|
||
return self._Model:GetCharacterGroupById(id)
|
||
end
|
||
|
||
function XTheatre3Control:GetCharacterGroupOrderIdById(id)
|
||
local config = self:GetCharacterGroupById(id)
|
||
return config and config.OrderId or 0
|
||
end
|
||
|
||
---@return XTableTheatre3CharacterRecruit
|
||
function XTheatre3Control:GetCharacterRecruitById(recruitId)
|
||
return self._Model:GetCharacterRecruitConfigById(recruitId)
|
||
end
|
||
|
||
function XTheatre3Control:GetCharacterIdByRecruitId(recruitId)
|
||
local config = self:GetCharacterRecruitById(recruitId)
|
||
return config and config.CharacterId or 0
|
||
end
|
||
|
||
function XTheatre3Control:GetCharacterLevelByLevelId(levelId)
|
||
local config = self._Model:GetCharacterLevelConfigById(levelId)
|
||
return config and config.Level or 0
|
||
end
|
||
|
||
function XTheatre3Control:GetCharacterLevelStrengthenPoint(levelId)
|
||
local config = self._Model:GetCharacterLevelConfigById(levelId)
|
||
return config and config.StrengthenPoint or 0
|
||
end
|
||
|
||
function XTheatre3Control:GetCharacterLevelNeedExp(levelId)
|
||
local config = self._Model:GetCharacterLevelConfigById(levelId)
|
||
return config and config.NeedExp or 0
|
||
end
|
||
|
||
function XTheatre3Control:GetCharacterLevelDesc(levelId)
|
||
local config = self._Model:GetCharacterLevelConfigById(levelId)
|
||
return config and config.Desc or 0
|
||
end
|
||
|
||
function XTheatre3Control:GetCharacterEndingCondition(id)
|
||
local config = self._Model:GetCharacterEndingConfigById(id)
|
||
return config and config.ConditionId or 0
|
||
end
|
||
|
||
function XTheatre3Control:GetCharacterEndingCharacterId(id)
|
||
local config = self._Model:GetCharacterEndingConfigById(id)
|
||
return config and config.CharacterId or 0
|
||
end
|
||
|
||
function XTheatre3Control:GetCharacterEndingIcon(id)
|
||
local config = self._Model:GetCharacterEndingConfigById(id)
|
||
return config and config.Icon
|
||
end
|
||
|
||
function XTheatre3Control:GetCharacterEndingTitle(id)
|
||
local config = self._Model:GetCharacterEndingConfigById(id)
|
||
return config and config.Title or ""
|
||
end
|
||
|
||
function XTheatre3Control:GetCharacterEndingDesc(id)
|
||
local config = self._Model:GetCharacterEndingConfigById(id)
|
||
return config and config.Desc or ""
|
||
end
|
||
|
||
-- 获取角色升级需要的经验
|
||
function XTheatre3Control:GetCharacterLevelUpNeedExp(characterId, level)
|
||
local maxLevel = self._Model:GetCharacterMaxLevel(characterId)
|
||
if level > maxLevel then
|
||
return 0
|
||
end
|
||
local characterLevelId = self._Model:GetCharacterLevelId(characterId, level)
|
||
if not XTool.IsNumberValid(characterLevelId) then
|
||
return 0
|
||
end
|
||
return self:GetCharacterLevelNeedExp(characterLevelId)
|
||
end
|
||
|
||
function XTheatre3Control:CalculateCharacterLevel(characterId, curLevel, curExp, addExp)
|
||
local curNeedExp = self:GetCharacterLevelUpNeedExp(characterId, curLevel + 1)
|
||
local totalExp = curExp + addExp
|
||
if curNeedExp ~= 0 then
|
||
local bo = totalExp >= curNeedExp
|
||
while bo do
|
||
totalExp = totalExp - curNeedExp
|
||
curLevel = curLevel + 1
|
||
curNeedExp = self:GetCharacterLevelUpNeedExp(characterId, curLevel + 1)
|
||
if curNeedExp <= 0 then
|
||
bo = false
|
||
else
|
||
bo = totalExp >= curNeedExp
|
||
end
|
||
end
|
||
end
|
||
return curLevel, totalExp, curNeedExp
|
||
end
|
||
|
||
-- 检查当前等级是否是最大等级
|
||
function XTheatre3Control:CheckCharacterMaxLevel(characterId, level)
|
||
local maxLevel = self._Model:GetCharacterMaxLevel(characterId)
|
||
if level >= maxLevel then
|
||
return true
|
||
end
|
||
return false
|
||
end
|
||
|
||
function XTheatre3Control:CheckCharacterEnding(id)
|
||
local characterId = self:GetCharacterEndingCharacterId(id)
|
||
return self._Model.ActivityData:GetCharacterInfo(characterId):CheckEnding(id)
|
||
end
|
||
|
||
-- 服务端有同步角色结局通过数据改用上方法
|
||
function XTheatre3Control:CheckCharacterEndingCondition(id)
|
||
local condition = self:GetCharacterEndingCondition(id)
|
||
if XTool.IsNumberValid(condition) then
|
||
return XConditionManager.CheckCondition(condition)
|
||
end
|
||
return true, ""
|
||
end
|
||
|
||
--endregion
|
||
|
||
--region 编队相关
|
||
|
||
function XTheatre3Control:GetCharacterCost(id)
|
||
id = XEntityHelper.GetCharacterIdByEntityId(id)
|
||
return self._Model:GetCharacterCost(id)
|
||
end
|
||
|
||
function XTheatre3Control:GetCurEnergy()
|
||
local cost = 0
|
||
for slotId = 1, 3 do
|
||
local id = self:GetSlotCharacter(slotId)
|
||
if id ~= 0 then
|
||
cost = cost + self:GetCharacterCost(id)
|
||
end
|
||
end
|
||
return cost, self._Model.ActivityData:GetMaxEnergy()
|
||
end
|
||
|
||
---@return XTheatre3EquipPos
|
||
function XTheatre3Control:GetSlotInfo(posId)
|
||
return self._Model.ActivityData:GetSlotInfo(posId)
|
||
end
|
||
|
||
function XTheatre3Control:GetSlotOrder(posId)
|
||
return self._Model.ActivityData:GetSlotIndexByPos(posId)
|
||
end
|
||
|
||
function XTheatre3Control:UpdateEquipPosRoleId(roleId, slotId, isJoin)
|
||
self._Model.ActivityData:UpdateEquipPosRoleId(roleId, slotId, isJoin)
|
||
end
|
||
|
||
function XTheatre3Control:GetCharacterList(isOnlyRobot)
|
||
local configs = self._Model:GetCharacterRecruitConfig()
|
||
local characterList = {}
|
||
for _, config in pairs(configs) do
|
||
table.insert(characterList, config.RobotId)
|
||
if not isOnlyRobot then
|
||
if XCharacterConfigs.IsCharacterCanShow(config.CharacterId) then
|
||
table.insert(characterList, config.CharacterId)
|
||
end
|
||
end
|
||
end
|
||
return characterList
|
||
end
|
||
|
||
function XTheatre3Control:GetCharacterLv(id)
|
||
local info = self._Model.ActivityData:GetCharacterInfo(id)
|
||
return info and info.Level or 0
|
||
end
|
||
|
||
function XTheatre3Control:GetCharacterExp(characterId)
|
||
local info = self._Model.ActivityData:GetCharacterInfo(characterId)
|
||
return info and info.Exp or 0
|
||
end
|
||
|
||
function XTheatre3Control:IsCharacterRepeat(id)
|
||
if self:GetEntityIdIsInTeam(id) then
|
||
return false
|
||
end
|
||
local characterId = XEntityHelper.GetCharacterIdByEntityId(id)
|
||
local entityIds = self:GetTeamsEntityIds()
|
||
for _, entityId in pairs(entityIds) do
|
||
if characterId == XEntityHelper.GetCharacterIdByEntityId(entityId) then
|
||
return true
|
||
end
|
||
end
|
||
return false
|
||
end
|
||
|
||
function XTheatre3Control:GetFilterSortOverrideFunTable(slotId)
|
||
local cost, total = self:GetCurEnergy()
|
||
local cur = total - cost
|
||
if slotId then
|
||
local id = self:GetSlotCharacter(slotId)
|
||
if id ~= 0 then
|
||
cur = cur + self:GetCharacterCost(id)
|
||
end
|
||
end
|
||
|
||
return {
|
||
CheckFunList = {
|
||
[CharacterSortFunType.Custom1] = function(idA, idB)
|
||
local costA = self:GetCharacterCost(idA)
|
||
local costB = self:GetCharacterCost(idB)
|
||
if costA ~= costB then
|
||
return true
|
||
end
|
||
end,
|
||
[CharacterSortFunType.Custom2] = function(idA, idB)
|
||
if idA ~= idB then
|
||
return true
|
||
end
|
||
end
|
||
},
|
||
SortFunList = {
|
||
-- 消耗能量
|
||
[CharacterSortFunType.Custom1] = function(idA, idB)
|
||
local costA = self:GetCharacterCost(idA)
|
||
local costB = self:GetCharacterCost(idB)
|
||
local isACanjoin = cur >= costA
|
||
local isBCanjoin = cur >= costB
|
||
if isACanjoin ~= isBCanjoin then
|
||
return isACanjoin == true
|
||
end
|
||
if costA ~= costB then
|
||
return costA > costB
|
||
end
|
||
end,
|
||
-- Id
|
||
[CharacterSortFunType.Custom2] = function(idA, idB)
|
||
return idA > idB
|
||
end
|
||
}
|
||
}
|
||
end
|
||
|
||
---槽位上是否有上阵角色
|
||
function XTheatre3Control:CheckIsHaveCharacter(slotId)
|
||
local slotInfo = self:GetSlotInfo(slotId)
|
||
return slotInfo:CheckIsHaveCharacter()
|
||
end
|
||
|
||
function XTheatre3Control:CheckCaptainHasEntityId()
|
||
return self._Model.ActivityData:CheckCaptainHasEntityId()
|
||
end
|
||
|
||
function XTheatre3Control:CheckFirstFightHasEntityId()
|
||
return self._Model.ActivityData:CheckFirstFightHasEntityId()
|
||
end
|
||
|
||
function XTheatre3Control:CheckIsCaptainPos(pos)
|
||
local captainPos = self._Model.ActivityData:GetCaptainPos()
|
||
return captainPos == pos
|
||
end
|
||
|
||
function XTheatre3Control:CheckIsFirstFightPos(pos)
|
||
local firstFightPos = self._Model.ActivityData:GetFirstFightPos()
|
||
return firstFightPos == pos
|
||
end
|
||
|
||
function XTheatre3Control:GetEquipCaptainPos()
|
||
local captainPos = self._Model.ActivityData:GetCaptainPos()
|
||
return self._Model.ActivityData:GetSlotPosIdByColorId(captainPos)
|
||
end
|
||
|
||
function XTheatre3Control:GetEquipFirstFightPos()
|
||
local firstFightPos = self._Model.ActivityData:GetFirstFightPos()
|
||
return self._Model.ActivityData:GetSlotPosIdByColorId(firstFightPos)
|
||
end
|
||
|
||
function XTheatre3Control:GetTeamsEntityIds()
|
||
return self._Model.ActivityData:GetTeamsEntityIds()
|
||
end
|
||
|
||
function XTheatre3Control:GetEntityIdIsInTeam(entityId)
|
||
return self._Model.ActivityData:GetEntityIdIsInTeam(entityId)
|
||
end
|
||
|
||
function XTheatre3Control:UpdateEntityTeamPos(entityId, teamPos, isJoin)
|
||
self._Model.ActivityData:UpdateEntityTeamPos(entityId, teamPos, isJoin)
|
||
end
|
||
|
||
function XTheatre3Control:UpdateCaptainPosAndFirstFightPos(cPos, fPos)
|
||
self._Model.ActivityData:UpdateCaptainPosAndFirstFightPos(cPos, fPos)
|
||
end
|
||
|
||
function XTheatre3Control:GetEnergyUnusedDesc(count)
|
||
local desc = nil
|
||
local temp = nil
|
||
local configs = self._Model:GetEnergyUnusedConfig(count)
|
||
for _, v in pairs(configs) do
|
||
if v.UnusedCount <= count and (not temp or v.UnusedCount > temp) then
|
||
temp = v.UnusedCount
|
||
desc = v.Desc
|
||
end
|
||
end
|
||
return desc
|
||
end
|
||
|
||
--endregion
|
||
|
||
--region 图鉴-道具相关
|
||
|
||
function XTheatre3Control:GetItemTypeIdList()
|
||
return self._Model:GetItemTypeIdList()
|
||
end
|
||
|
||
function XTheatre3Control:GetItemIdListByTypeId(typeId)
|
||
return self._Model:GetItemIdListByTypeId(typeId)
|
||
end
|
||
|
||
---@return XTableTheatre3Item
|
||
function XTheatre3Control:GetItemConfigById(id)
|
||
return self._Model:GetItemConfigById(id)
|
||
end
|
||
|
||
function XTheatre3Control:GetItemTypeName(typeId)
|
||
local config = self._Model:GetItemTypeConfigByTypeId(typeId)
|
||
return config and config.Name or ""
|
||
end
|
||
|
||
function XTheatre3Control:GetItemUnlockConditionId(itemId)
|
||
local config = self:GetItemConfigById(itemId)
|
||
return config and config.UnlockConditionId or 0
|
||
end
|
||
|
||
-- 获取物品解锁进度
|
||
function XTheatre3Control:GetItemUnlockProgress()
|
||
local itemTypeIdList = self:GetItemTypeIdList()
|
||
local curCount = 0
|
||
local totalCount = 0
|
||
for _, typeId in pairs(itemTypeIdList) do
|
||
local itemIds = self:GetItemIdListByTypeId(typeId)
|
||
for _, itemId in pairs(itemIds) do
|
||
if self:CheckUnlockItemId(itemId) then
|
||
curCount = curCount + 1
|
||
end
|
||
end
|
||
totalCount = totalCount + #itemIds
|
||
end
|
||
return curCount, totalCount
|
||
end
|
||
|
||
-- 检查物品id是否解锁 用于图鉴
|
||
function XTheatre3Control:CheckUnlockItemId(itemId)
|
||
-- 如果没配置condition默认解锁
|
||
local unlockConditionId = self:GetItemUnlockConditionId(itemId)
|
||
if not XTool.IsNumberValid(unlockConditionId) then
|
||
return true
|
||
end
|
||
return self._Model.ActivityData:CheckUnlockItemId(itemId)
|
||
end
|
||
|
||
-- 检查物品是否有红点 首次获得时显示红点
|
||
function XTheatre3Control:CheckItemRedPoint(itemId)
|
||
-- 默认解锁无需红点
|
||
local unlockConditionId = self:GetItemUnlockConditionId(itemId)
|
||
if not XTool.IsNumberValid(unlockConditionId) then
|
||
return false
|
||
end
|
||
if not self:GetItemClickRedPoint(itemId) and self:CheckUnlockItemId(itemId) then
|
||
return true
|
||
end
|
||
return false
|
||
end
|
||
|
||
-- 检查所有的物品是否有红点
|
||
function XTheatre3Control:CheckAllItemRedPoint()
|
||
local itemTypeIdList = self:GetItemTypeIdList()
|
||
for _, typeId in pairs(itemTypeIdList) do
|
||
local itemIds = self:GetItemIdListByTypeId(typeId)
|
||
for _, itemId in pairs(itemIds) do
|
||
if self:CheckItemRedPoint(itemId) then
|
||
return true
|
||
end
|
||
end
|
||
end
|
||
return false
|
||
end
|
||
--endregion
|
||
|
||
--region 图鉴-套装相关
|
||
|
||
function XTheatre3Control:GetEquipSuitTypeIdList()
|
||
return self._Model:GetEquipSuitTypeIdList()
|
||
end
|
||
|
||
function XTheatre3Control:GetEquipSuitIdListByTypeId(typeId)
|
||
return self._Model:GetEquipSuitIdListByTypeId(typeId)
|
||
end
|
||
|
||
function XTheatre3Control:GetEquipSuitTypeName(typeId)
|
||
local config = self._Model:GetEquipSuitTypeConfigByTypeId(typeId)
|
||
return config and config.Name or ""
|
||
end
|
||
|
||
-- 获取套装解锁进度
|
||
function XTheatre3Control:GetEquipSuitUnlockProgress()
|
||
local equipSuitTypeIdList = self:GetEquipSuitTypeIdList()
|
||
local curCount = 0
|
||
local totalCount = 0
|
||
for _, typeId in pairs(equipSuitTypeIdList) do
|
||
local equipSuitIdList = self:GetEquipSuitIdListByTypeId(typeId)
|
||
for _, suitId in pairs(equipSuitIdList) do
|
||
if self:CheckAnyEquipIdUnlock(suitId) then
|
||
curCount = curCount + 1
|
||
end
|
||
end
|
||
totalCount = totalCount + #equipSuitIdList
|
||
end
|
||
return curCount, totalCount
|
||
end
|
||
|
||
-- 检查装备是否解锁 用于图鉴
|
||
function XTheatre3Control:CheckEquipIdUnlock(equipId)
|
||
return self._Model.ActivityData:CheckUnlockEquipId(equipId)
|
||
end
|
||
|
||
-- 检查套装下是否有任意一件装备解锁
|
||
function XTheatre3Control:CheckAnyEquipIdUnlock(suitId)
|
||
local equipConfigs = self._Model:GetSameSuitEquip(suitId)
|
||
if XTool.IsTableEmpty(equipConfigs) then
|
||
return true
|
||
end
|
||
for _, config in pairs(equipConfigs) do
|
||
if self:CheckEquipIdUnlock(config.Id) then
|
||
return true
|
||
end
|
||
end
|
||
return false
|
||
end
|
||
|
||
-- 检查装备是否有红点 首次获得时显示红点
|
||
function XTheatre3Control:CheckEquipRedPoint(equipId)
|
||
if not self:GetEquipClickRedPoint(equipId) and self:CheckEquipIdUnlock(equipId) then
|
||
return true
|
||
end
|
||
return false
|
||
end
|
||
|
||
-- 检查套装是否有红点
|
||
function XTheatre3Control:CheckEquipSuitRedPoint(suitId)
|
||
local equipConfigs = self._Model:GetSameSuitEquip(suitId)
|
||
if XTool.IsTableEmpty(equipConfigs) then
|
||
return false
|
||
end
|
||
for _, config in pairs(equipConfigs) do
|
||
if self:CheckEquipRedPoint(config.Id) then
|
||
return true
|
||
end
|
||
end
|
||
return false
|
||
end
|
||
|
||
-- 检查所有的套装是否有红点
|
||
function XTheatre3Control:CheckAllEquipSuitRedPoint()
|
||
local equipSuitTypeIdList = self:GetEquipSuitTypeIdList()
|
||
for _, typeId in pairs(equipSuitTypeIdList) do
|
||
local equipSuitIdList = self:GetEquipSuitIdListByTypeId(typeId)
|
||
for _, suitId in pairs(equipSuitIdList) do
|
||
if self:CheckEquipSuitRedPoint(suitId) then
|
||
return true
|
||
end
|
||
end
|
||
end
|
||
return false
|
||
end
|
||
|
||
--endregion
|
||
|
||
--region 音效相关
|
||
|
||
-- 播放奖励音效(1.道具箱 | 2.金币 | 3.装备箱)
|
||
function XTheatre3Control:PlayGetRewardSound(nodeRewardType)
|
||
local targetIndex
|
||
if nodeRewardType == XEnumConst.THEATRE3.NodeRewardType.ItemBox then
|
||
targetIndex = 1
|
||
elseif nodeRewardType == XEnumConst.THEATRE3.NodeRewardType.Gold then
|
||
targetIndex = 2
|
||
elseif nodeRewardType == XEnumConst.THEATRE3.NodeRewardType.EquipBox then
|
||
targetIndex = 3
|
||
end
|
||
local cueId = self:GetClientConfig("Theatre3GetRewardSound", targetIndex)
|
||
cueId = tonumber(cueId) or 0
|
||
if XTool.IsNumberValid(cueId) then
|
||
XSoundManager.PlaySoundByType(cueId, XSoundManager.SoundType.Sound)
|
||
end
|
||
end
|
||
|
||
--endregion
|
||
|
||
--region 本地数据相关
|
||
|
||
function XTheatre3Control:GetStrengthenTreeSelectIndexKey()
|
||
return string.format("Theatre3StrengthenTreeSelectIndex_%s_%s", XPlayer.Id, self._Model.ActivityData:GetCurActivityId())
|
||
end
|
||
|
||
function XTheatre3Control:GetStrengthenTreeSelectIndex()
|
||
local key = self:GetStrengthenTreeSelectIndexKey()
|
||
return XSaveTool.GetData(key) or 0
|
||
end
|
||
|
||
function XTheatre3Control:SaveStrengthenTreeSelectIndex(value)
|
||
local key = self:GetStrengthenTreeSelectIndexKey()
|
||
local data = XSaveTool.GetData(key) or 0
|
||
if data == value then
|
||
return
|
||
end
|
||
XSaveTool.SaveData(key, value)
|
||
end
|
||
|
||
-- 图鉴-道具红点点击缓存
|
||
function XTheatre3Control:GetItemClickRedPointKey(itemId)
|
||
return string.format("XTheatre3ItemClickRedPoint_%s_%s_%s", XPlayer.Id, self._Model.ActivityData:GetCurActivityId(), itemId)
|
||
end
|
||
|
||
function XTheatre3Control:GetItemClickRedPoint(itemId)
|
||
local key = self:GetItemClickRedPointKey(itemId)
|
||
return XSaveTool.GetData(key) or false
|
||
end
|
||
|
||
function XTheatre3Control:SaveItemClickRedPoint(itemId)
|
||
local key = self:GetItemClickRedPointKey(itemId)
|
||
local data = XSaveTool.GetData(key) or false
|
||
if data then
|
||
return
|
||
end
|
||
XSaveTool.SaveData(key, true)
|
||
end
|
||
|
||
-- 图鉴-装备红点点击缓存
|
||
function XTheatre3Control:GetEquipClickRedPointKey(equipId)
|
||
return string.format("XTheatre3EquipClickRedPoint_%s_%s_%s", XPlayer.Id, self._Model.ActivityData:GetCurActivityId(), equipId)
|
||
end
|
||
|
||
function XTheatre3Control:GetEquipClickRedPoint(equipId)
|
||
local key = self:GetEquipClickRedPointKey(equipId)
|
||
return XSaveTool.GetData(key) or false
|
||
end
|
||
|
||
function XTheatre3Control:SaveEquipClickRedPoint(equipId)
|
||
local key = self:GetEquipClickRedPointKey(equipId)
|
||
local data = XSaveTool.GetData(key) or false
|
||
if data then
|
||
return
|
||
end
|
||
XSaveTool.SaveData(key, true)
|
||
end
|
||
|
||
--endregion
|
||
|
||
--region 网络请求相关
|
||
-- 领取BP奖励
|
||
function XTheatre3Control:GetBattlePassRewardRequest(rewardType, id, cb)
|
||
local req = { GetRewardType = rewardType, Id = id }
|
||
XNetwork.CallWithAutoHandleErrorCode(RequestProto.Theatre3GetBattlePassRewardRequest, req, function(res)
|
||
XLuaUiManager.Open("UiTheatre3TipReward", res.RewardGoodsList)
|
||
self._Model:UpdateGetRewardId(rewardType, res.GetRewardIds, id)
|
||
if cb then
|
||
cb()
|
||
end
|
||
end)
|
||
end
|
||
|
||
-- 激活天赋树
|
||
function XTheatre3Control:ActivationStrengthenTreeRequest(id, cb)
|
||
local req = { Id = id }
|
||
XNetwork.CallWithAutoHandleErrorCode(RequestProto.Theatre3ActivationStrengthenTreeRequest, req, function(res)
|
||
-- 更新解锁天赋Id
|
||
self._Model.ActivityData:AddUnlockStrengthTreeId(id)
|
||
if cb then
|
||
cb()
|
||
end
|
||
end)
|
||
end
|
||
|
||
function XTheatre3Control:RequestSelectEquip(equipId, pos, cb)
|
||
local lastStep = self:GetAdventureLastStep()
|
||
XNetwork.Call(RequestProto.Theatre3SelectEquipRequest, { EquipId = equipId, Pos = pos }, function(res)
|
||
if res.Code ~= XCode.Success then
|
||
XUiManager.TipCode(res.Code)
|
||
return
|
||
end
|
||
local suitId = self:GetEquipById(equipId).SuitId
|
||
lastStep:SetIsOver()
|
||
self._Model.ActivityData:AddSlotEquip(pos, equipId, suitId)
|
||
if cb then
|
||
cb()
|
||
end
|
||
end)
|
||
end
|
||
|
||
function XTheatre3Control:RequestChangeSuitPos(srcSuitId, srcPos, dstSuitId, dstPos)
|
||
XNetwork.Call(RequestProto.Theatre3ChangeEquipPosRequest, { SrcSuitId = srcSuitId, SrcPos = srcPos, DstSuitId = dstSuitId, DstPos = dstPos }, function(res)
|
||
if res.Code ~= XCode.Success then
|
||
XUiManager.TipCode(res.Code)
|
||
return
|
||
end
|
||
local srcEquips = self:GetAllSuitWearEquipId(srcSuitId)
|
||
local dstEquips = self:GetAllSuitWearEquipId(dstSuitId)
|
||
self._Model.ActivityData:ExchangeSlotSuit(srcSuitId, srcPos, srcEquips, dstSuitId, dstPos, dstEquips)
|
||
self:WorkShopReduceTimes()
|
||
end)
|
||
end
|
||
|
||
function XTheatre3Control:RequestRebuildEquip(srcEquipId, dstSuitId, dstPos, cb)
|
||
XNetwork.Call(RequestProto.Theatre3RecastEquipRequest, { SrcEquipId = srcEquipId, DstSuitId = dstSuitId }, function(res)
|
||
if res.Code ~= XCode.Success then
|
||
XUiManager.TipCode(res.Code)
|
||
return
|
||
end
|
||
local srcSuitId = self:GetEquipById(srcEquipId).SuitId
|
||
local srcEquips = self:GetAllSuitWearEquipId(srcSuitId)
|
||
local srcPos = self:GetEquipBelong(srcEquipId)
|
||
local isSuitLost = #srcEquips <= 1 -- 如果套装里只有这一件装备 则套装也会一起失去
|
||
self._Model.ActivityData:RebuildSlotEquip(isSuitLost and srcSuitId or nil, srcPos, srcEquipId, dstSuitId, dstPos, res.DstEquipId)
|
||
self:WorkShopReduceTimes()
|
||
if cb then
|
||
cb(res)
|
||
end
|
||
end)
|
||
end
|
||
|
||
---设置编队
|
||
function XTheatre3Control:RequestSetTeam(callBack)
|
||
local teamData = {}
|
||
teamData.CardIds = self._Model.ActivityData:GetTeamsCharIds()
|
||
teamData.RobotIds = self._Model.ActivityData:GetTeamRobotIds()
|
||
teamData.CaptainPos = self._Model.ActivityData:GetCaptainPos()
|
||
teamData.FirstFightPos = self._Model.ActivityData:GetFirstFightPos()
|
||
|
||
local entityIds = self:GetTeamsEntityIds()
|
||
local equipPosInfos = {}
|
||
for i = 1, 3 do
|
||
local slotInfo = self:GetSlotInfo(i)
|
||
local posId = slotInfo:GetPos()
|
||
local colorId = slotInfo:GetColorId()
|
||
local cardId = slotInfo:GetCardId()
|
||
local robotId = slotInfo:GetRobotId()
|
||
local roleId = slotInfo:GetRoleId()
|
||
if roleId ~= entityIds[colorId] then
|
||
XLog.Error("槽位角色id和编队角色Id不一致", roleId, entityIds, posId, colorId)
|
||
end
|
||
table.insert(equipPosInfos, { Pos = posId, CardId = cardId, RobotId = robotId, ColorId = colorId })
|
||
end
|
||
|
||
XNetwork.Call(RequestProto.Theatre3SetTeamRequest, { EquipPosInfos = equipPosInfos, TeamData = teamData }, function(res)
|
||
if res.Code ~= XCode.Success then
|
||
XUiManager.TipCode(res.Code)
|
||
return
|
||
end
|
||
if callBack then
|
||
callBack()
|
||
end
|
||
end)
|
||
end
|
||
|
||
---结束冒险
|
||
function XTheatre3Control:RequestSettleAdventure(cb)
|
||
XNetwork.Call(RequestProto.Theatre3SettleAdventureRequest, nil, function(res)
|
||
if res.Code ~= XCode.Success then
|
||
XUiManager.TipCode(res.Code)
|
||
return
|
||
end
|
||
self._Model.ActivityData:UpdateSettle(res.SettleData)
|
||
if cb then
|
||
cb()
|
||
end
|
||
end)
|
||
end
|
||
|
||
-- 进入冒险选择难度
|
||
function XTheatre3Control:RequestAdventureSelectDifficulty(difficultyId, cb)
|
||
-- 初始化冒险数据
|
||
self:InitAdventureData()
|
||
self:InitAdventureSettleData()
|
||
self:ResetTeamDate()
|
||
local req = { Difficulty = difficultyId }
|
||
XNetwork.CallWithAutoHandleErrorCode(RequestProto.Theatre3SelectDifficultyRequest, req, function(res)
|
||
self._Model.ActivityData:UpdateDifficulty(res.DifficultyId)
|
||
self._Model.ActivityData:UpdateMaxEnergy(res.MaxEnergy)
|
||
self._Model.ActivityData:UpdateEquipPosData(res.EquipPos)
|
||
if cb then
|
||
cb()
|
||
end
|
||
end)
|
||
end
|
||
|
||
-- 结束开局编队
|
||
function XTheatre3Control:RequestAdventureEndRecruit(cb)
|
||
local lastStep = self:GetAdventureLastStep()
|
||
XNetwork.CallWithAutoHandleErrorCode(RequestProto.Theatre3EndRecruitRequest, nil, function(res)
|
||
lastStep:SetIsOver()
|
||
if cb then
|
||
cb()
|
||
end
|
||
end)
|
||
end
|
||
|
||
-- 选择节点
|
||
---@param nodeData XTheatre3Node
|
||
---@param nodeSlot XTheatre3NodeSlot
|
||
function XTheatre3Control:RequestAdventureSelectNode(nodeData, nodeSlot, cb)
|
||
local reqBody = {
|
||
NodeId = nodeData:GetNodeId(),
|
||
SlotId = nodeSlot:GetSlotId(),
|
||
}
|
||
XNetwork.CallWithAutoHandleErrorCode(RequestProto.Theatre3SelectNodeRequest, reqBody, function(res)
|
||
nodeData:SetSelect(nodeSlot)
|
||
XEventManager.DispatchEvent(XEventId.EVENT_THEATRE3_ADVENTURE_MAIN_SELECT_NODE, self._NodeSlot)
|
||
if cb then
|
||
cb()
|
||
end
|
||
end)
|
||
end
|
||
|
||
function XTheatre3Control:RequestAdventureSelectItemReward(itemId, cb)
|
||
local reqBody = {
|
||
InnerItemId = itemId,
|
||
}
|
||
local lastStep = self:GetAdventureLastStep()
|
||
XNetwork.CallWithAutoHandleErrorCode(RequestProto.Theatre3SelectItemRewardRequest, reqBody, function(res)
|
||
-- N选1,单独处理步骤结束
|
||
lastStep:SetIsOver()
|
||
self:SetAdventureStepSelectItem(res.InnerItemId)
|
||
XLuaUiManager.Open("UiTheatre3TipReward", nil, {res.InnerItemId}, cb)
|
||
end)
|
||
end
|
||
|
||
function XTheatre3Control:RequestAdventureShopBuyItem(shopItemUid, cb)
|
||
local reqBody = {
|
||
ShopItemUid = shopItemUid
|
||
}
|
||
XNetwork.CallWithAutoHandleErrorCode(RequestProto.Theatre3NodeShopBuyItemRequest, reqBody, function(res)
|
||
if cb then
|
||
cb()
|
||
end
|
||
if XTool.IsNumberValid(res.InnerItemId) then
|
||
XLuaUiManager.Open("UiTheatre3TipReward", nil, {res.InnerItemId})
|
||
end
|
||
if not XTool.IsTableEmpty(res.RewardGoodsList) then
|
||
XLuaUiManager.Open("UiTheatre3TipReward", res.RewardGoodsList)
|
||
end
|
||
end)
|
||
end
|
||
|
||
function XTheatre3Control:RequestAdventureEndNode(cb)
|
||
local lastStep = self:GetAdventureLastStep()
|
||
XNetwork.CallWithAutoHandleErrorCode(RequestProto.Theatre3EndNodeRequest, nil, function(res)
|
||
if lastStep then
|
||
lastStep:SetIsOver()
|
||
self:GetAdventureCurChapterDb():AddPassNode(lastStep:GetSelectNodeId())
|
||
end
|
||
if cb then
|
||
cb()
|
||
end
|
||
end)
|
||
end
|
||
|
||
function XTheatre3Control:RequestAdventureEventNodeNextStep(curEventStepId, optionId, cb)
|
||
local reqBody = {
|
||
CurEventStepId = curEventStepId,
|
||
OptionId = optionId,
|
||
}
|
||
local lastStep = self:GetAdventureLastStep()
|
||
XNetwork.CallWithAutoHandleErrorCode(RequestProto.Theatre3EventNodeNextStepRequest, reqBody, function(res)
|
||
local lastNodeSlot = self:GetAdventureLastNodeSlot()
|
||
if lastNodeSlot then
|
||
lastNodeSlot:AddPassedStepId(lastNodeSlot:GetCurStepId())
|
||
lastNodeSlot:SetCurStepId(res.NextEventStepId)
|
||
lastNodeSlot:SetFightTemplateId(res.FightTemplateId)
|
||
end
|
||
if lastStep and not XTool.IsNumberValid(res.NextEventStepId) then
|
||
lastStep:SetIsOver()
|
||
self:GetAdventureCurChapterDb():AddPassNode(lastStep:GetSelectNodeId())
|
||
end
|
||
|
||
if not XTool.IsTableEmpty(res.InnerItemIds) then
|
||
XLuaUiManager.Open("UiTheatre3TipReward", nil, res.InnerItemIds, function()
|
||
if cb then
|
||
cb(XTool.IsNumberValid(res.NextEventStepId))
|
||
end
|
||
end)
|
||
end
|
||
if not XTool.IsTableEmpty(res.RewardGoodsList) then
|
||
XLuaUiManager.Open("UiTheatre3TipReward", res.RewardGoodsList, nil, function()
|
||
if cb then
|
||
cb(XTool.IsNumberValid(res.NextEventStepId))
|
||
end
|
||
end)
|
||
end
|
||
if XTool.IsTableEmpty(res.InnerItemIds) and XTool.IsTableEmpty(res.RewardGoodsList) then
|
||
if cb then
|
||
cb(XTool.IsNumberValid(res.NextEventStepId))
|
||
end
|
||
end
|
||
end)
|
||
end
|
||
|
||
---领取战斗奖励
|
||
function XTheatre3Control:RequestAdventureRecvFightReward(rewardUid, cb)
|
||
local reqBody = {
|
||
Uid = rewardUid,
|
||
}
|
||
local rewards = self:GetAdventureStepSelectRewardList()
|
||
XNetwork.CallWithAutoHandleErrorCode(RequestProto.Theatre3RecvFightRewardRequest, reqBody, function(res)
|
||
if not XTool.IsTableEmpty(res.RewardGoodsList) then
|
||
XLuaUiManager.Open("UiTheatre3TipReward", res.RewardGoodsList)
|
||
end
|
||
local isEnd = true -- 是否已经领取全部奖励
|
||
for _, v in pairs(rewards) do
|
||
if v.Uid == rewardUid then
|
||
v.Received = true
|
||
end
|
||
if not v.Received then
|
||
isEnd = false
|
||
end
|
||
end
|
||
if cb then
|
||
cb(isEnd)
|
||
end
|
||
end)
|
||
end
|
||
|
||
---结束领取战斗奖励
|
||
function XTheatre3Control:RequestAdventureEndRecvFightReward(cb)
|
||
local reqBody = {}
|
||
local lastStep = self:GetAdventureLastStep()
|
||
XNetwork.CallWithAutoHandleErrorCode(RequestProto.Theatre3EndRecvFightRewardRequest, reqBody, function(res)
|
||
if lastStep then
|
||
lastStep:SetIsOver()
|
||
self:GetAdventureCurChapterDb():AddPassNode(lastStep:GetSelectNodeId())
|
||
end
|
||
if cb then
|
||
cb()
|
||
end
|
||
end)
|
||
end
|
||
|
||
---事件—工坊—结束工坊—事件下一步
|
||
function XTheatre3Control:RequestAdventure3EndWorkShop(cb)
|
||
local reqBody = {}
|
||
local lastStep = self:GetAdventureLastStep()
|
||
XNetwork.CallWithAutoHandleErrorCode(RequestProto.Theatre3EndWorkShopRequest, reqBody, function(res)
|
||
if lastStep then
|
||
lastStep:SetIsOver()
|
||
self:GetAdventureCurChapterDb():AddPassNode(lastStep:GetSelectNodeId())
|
||
end
|
||
if cb then
|
||
cb()
|
||
end
|
||
end)
|
||
end
|
||
|
||
function XTheatre3Control:RequestEndEquipBox(cb)
|
||
local lastStep = self:GetAdventureLastStep()
|
||
XNetwork.CallWithAutoHandleErrorCode(RequestProto.Theatre3EndEquipBoxRequest, nil, function(res)
|
||
lastStep:SetIsOver()
|
||
if cb then
|
||
cb()
|
||
end
|
||
end)
|
||
end
|
||
--endregion
|
||
|
||
--region Cfg - Difficulty
|
||
---@return number[]
|
||
function XTheatre3Control:GetDifficultyIdList()
|
||
local result = {}
|
||
local configs = self._Model:GetDifficultyConfigs()
|
||
if XTool.IsTableEmpty(configs) then
|
||
return result
|
||
end
|
||
if self:IsHavePassAdventure() then
|
||
for _, config in ipairs(configs) do
|
||
if not XTool.IsNumberValid(config.FirstPassFlag) then
|
||
result[#result + 1] = config.Id
|
||
end
|
||
end
|
||
else
|
||
local FirstDifficultyCount = 0
|
||
for _, config in ipairs(configs) do
|
||
if XTool.IsNumberValid(config.FirstPassFlag) then
|
||
result[#result + 1] = config.Id
|
||
FirstDifficultyCount = FirstDifficultyCount + 1
|
||
elseif not XTool.IsNumberValid(FirstDifficultyCount) then
|
||
result[#result + 1] = config.Id
|
||
else
|
||
FirstDifficultyCount = FirstDifficultyCount - 1
|
||
end
|
||
end
|
||
end
|
||
XTool.SortIdTable(result)
|
||
return result
|
||
end
|
||
|
||
---@return XTableTheatre3Difficulty
|
||
function XTheatre3Control:GetDifficultyById(id)
|
||
return self._Model:GetDifficultyById(id)
|
||
end
|
||
--endregion
|
||
|
||
--region Cfg - Chapter
|
||
---@return XTableTheatre3Chapter
|
||
function XTheatre3Control:GetChapterById(chapterId)
|
||
return self._Model:GetChapterCfgById(chapterId)
|
||
end
|
||
--endregion
|
||
|
||
--region Cfg - EventNode
|
||
function XTheatre3Control:GetEventCfgByIdAndStep(eventId, stepId)
|
||
for _, cfg in ipairs(self._Model:GetEventConfigs()) do
|
||
if cfg.EventId == eventId and cfg.StepId == stepId then
|
||
return cfg
|
||
end
|
||
end
|
||
return
|
||
end
|
||
|
||
function XTheatre3Control:GetEventNodeCfgById(eventId)
|
||
return self._Model:GetEventNodeCfgById(eventId)
|
||
end
|
||
|
||
---@return number[]
|
||
function XTheatre3Control:GetEventOptionIdListByGroup(optionGroupId)
|
||
local result = {}
|
||
local configs = self._Model:GetEventOptionGroupConfigs()
|
||
for _, config in ipairs(configs) do
|
||
if config.GroupId == optionGroupId then
|
||
result[#result + 1] = config.Id
|
||
end
|
||
end
|
||
XTool.SortIdTable(result)
|
||
return result
|
||
end
|
||
|
||
---@return XTableTheatre3EventOptionGroup
|
||
function XTheatre3Control:GetEventOptionCfgById(optionId)
|
||
return self._Model:GetEventOptionCfgById(optionId)
|
||
end
|
||
--endregion
|
||
|
||
--region Cfg - FightNode
|
||
function XTheatre3Control:GetFightStageTemplateStageId(id)
|
||
local cfg = self._Model:GetFightStageTemplateCfgById(id)
|
||
if cfg then
|
||
return cfg.StageId
|
||
end
|
||
end
|
||
|
||
function XTheatre3Control:GetFightNodeCfgById(fightNodeId)
|
||
return self._Model:GetFightNodeCfgById(fightNodeId)
|
||
end
|
||
--endregion
|
||
|
||
--region Cfg - ShopNode
|
||
function XTheatre3Control:GetShopNodeCfgById(id)
|
||
return self._Model:GetShopNodeCfgById(id)
|
||
end
|
||
--endregion
|
||
|
||
--region System - Adventure Logic
|
||
---@return boolean
|
||
function XTheatre3Control:CheckAndOpenAdventureNextStep(isPopOpen, isNotCheckNodeSlot)
|
||
local isOpen = true
|
||
---@type XTheatre3Agency
|
||
local theatre3Agency = XMVCA:GetAgency(ModuleId.XTheatre3)
|
||
if theatre3Agency:CheckAndOpenSettle() then
|
||
return false
|
||
end
|
||
local lostNodeSlot, lostNodeSlotStep = self:GetAdventureLastNodeSlot()
|
||
local step = self:GetAdventureLastStep()
|
||
if not isNotCheckNodeSlot and lostNodeSlotStep == step and self:CheckAndOpenAdventureNodeSlot(lostNodeSlot, isPopOpen) then
|
||
return isOpen
|
||
end
|
||
if not step then
|
||
XLog.Error("Error! CurStep is null!")
|
||
return false
|
||
end
|
||
self:AdventurePlayCurChapterBgm()
|
||
if step:CheckStepType(XEnumConst.THEATRE3.StepType.RecruitCharacter) then
|
||
self:_OpenAdventureUi(isPopOpen, "UiTheatre3RoleRoom", true, true)
|
||
elseif step:CheckStepType(XEnumConst.THEATRE3.StepType.Node) then
|
||
--新章节需要进入loading
|
||
if self:IsNewAdventureChapter() then
|
||
self._Model.ActivityData:GetCurChapterDb():SetOldChapter()
|
||
self:_OpenAdventureUi(isPopOpen, "UiTheatre3Loading", self:GetAdventureCurChapterDb():GetCurChapterId())
|
||
else
|
||
self:_OpenAdventureUi(isPopOpen, "UiTheatre3PlayMain")
|
||
end
|
||
elseif step:CheckStepType(XEnumConst.THEATRE3.StepType.FightReward) then
|
||
self:_OpenAdventureUi(isPopOpen, "UiTheatre3RewardChoose", false)
|
||
elseif step:CheckStepType(XEnumConst.THEATRE3.StepType.ItemReward) then
|
||
self:_OpenAdventureUi(isPopOpen, "UiTheatre3RewardChoose", true)
|
||
elseif step:CheckStepType(XEnumConst.THEATRE3.StepType.WorkShop) then
|
||
if step:CheckWorkShopType(XEnumConst.THEATRE3.WorkShopType.Recast) then
|
||
self:_OpenAdventureUi(isPopOpen, "UiTheatre3SetBag", { isChooseEquip = true })
|
||
elseif step:CheckWorkShopType(XEnumConst.THEATRE3.WorkShopType.Change) then
|
||
self:_OpenAdventureUi(isPopOpen, "UiTheatre3SetBag", { isChooseSuit = true })
|
||
end
|
||
elseif step:CheckStepType(XEnumConst.THEATRE3.StepType.EquipReward) then
|
||
self:_OpenAdventureUi(isPopOpen, "UiTheatre3EquipmentChoose", step:GetEquipIds())
|
||
elseif step:CheckStepType(XEnumConst.THEATRE3.StepType.EquipInherit) then
|
||
self:_OpenAdventureUi(isPopOpen, "UiTheatre3EquipmentChoose", step:GetEquipIds(), true)
|
||
else
|
||
isOpen = false
|
||
end
|
||
return isOpen
|
||
end
|
||
|
||
---@param nodeSlot XTheatre3NodeSlot
|
||
---@return boolean
|
||
function XTheatre3Control:CheckAndOpenAdventureNodeSlot(nodeSlot, isPopOpen)
|
||
local isOpen = true
|
||
local isFightPass = nodeSlot and nodeSlot:CheckIsFight() and nodeSlot:CheckStageIsPass(self:GetFightStageTemplateStageId(nodeSlot:GetFightTemplateId()))
|
||
if not nodeSlot or isFightPass then
|
||
isOpen = false
|
||
elseif nodeSlot:CheckType(XEnumConst.THEATRE3.NodeSlotType.Fight) then
|
||
self:_OpenAdventureUi(isPopOpen, "UiTheatre3RoleRoom", true, false)
|
||
elseif nodeSlot:CheckType(XEnumConst.THEATRE3.NodeSlotType.Event) then
|
||
if XTool.IsNumberValid(nodeSlot:GetFightTemplateId()) then
|
||
self:_OpenAdventureUi(isPopOpen, "UiTheatre3RoleRoom", true, false)
|
||
else
|
||
self:_OpenAdventureUi(isPopOpen, "UiTheatre3Outpost", nodeSlot)
|
||
end
|
||
elseif nodeSlot:CheckType(XEnumConst.THEATRE3.NodeSlotType.Shop) then
|
||
self:_OpenAdventureUi(isPopOpen, "UiTheatre3Outpost", nodeSlot)
|
||
else
|
||
isOpen = false
|
||
end
|
||
return isOpen
|
||
end
|
||
|
||
function XTheatre3Control:AdventurePlayCurChapterBgm()
|
||
local chapterId = self:GetAdventureCurChapterId()
|
||
if not XTool.IsNumberValid(chapterId) then
|
||
return
|
||
end
|
||
local chapter = self:GetChapterById(chapterId)
|
||
if chapter then
|
||
self:AdventurePlayBgm(chapter.BgmCueId)
|
||
end
|
||
end
|
||
|
||
function XTheatre3Control:AdventurePlayBgm(bgmCueId)
|
||
if not XTool.IsNumberValid(bgmCueId) then
|
||
return
|
||
end
|
||
if XSoundManager.GetCurrentBgmCueId() == bgmCueId then
|
||
return
|
||
end
|
||
XSoundManager.PlaySoundByType(bgmCueId, XSoundManager.SoundType.BGM)
|
||
end
|
||
|
||
function XTheatre3Control:AdventureStart()
|
||
self:_OpenAdventureSelectDifficulty()
|
||
end
|
||
|
||
function XTheatre3Control:AdventureContinue()
|
||
if not self:IsHaveAdventure() then
|
||
return
|
||
end
|
||
self:CheckAndOpenAdventureNextStep(false, true)
|
||
end
|
||
|
||
function XTheatre3Control:AdventureGiveUp(cb)
|
||
if not self:IsHaveAdventure() then
|
||
return
|
||
end
|
||
local title = XUiHelper.ReadTextWithNewLine("Theatre3GiveUpTitle")
|
||
local content = XUiHelper.ReadTextWithNewLine("Theatre3GiveUpContent")
|
||
self:OpenTextTip(function() self:RequestSettleAdventure(cb) end, title, content)
|
||
end
|
||
--endregion
|
||
|
||
--region System - Adventure Data
|
||
---结算结束更新角色精通经验
|
||
function XTheatre3Control:UpdateSettleRoleExp()
|
||
for _, characterInfo in pairs(self._Model.ActivityData:GetCharacterInfoList()) do
|
||
local nowLevel, nowExp, _ = self:CalculateCharacterLevel(characterInfo.CharacterId, characterInfo.Level, characterInfo.Exp, characterInfo.ExpTemp)
|
||
characterInfo:SetLevel(nowLevel)
|
||
characterInfo:SetExp(nowExp)
|
||
characterInfo:SetExpTemp(0)
|
||
end
|
||
end
|
||
|
||
function XTheatre3Control:InitAdventureData()
|
||
self._Model.ActivityData:InitAdventureData()
|
||
end
|
||
|
||
function XTheatre3Control:InitAdventureSettleData()
|
||
self._Model.ActivityData:InitAdventureSettleData()
|
||
end
|
||
|
||
---@return XTheatre3Step
|
||
function XTheatre3Control:GetAdventureLastStep()
|
||
local chapterDb = self:GetAdventureCurChapterDb()
|
||
return chapterDb:GetLastStep()
|
||
end
|
||
|
||
---@return XTheatre3NodeSlot, XTheatre3Step
|
||
function XTheatre3Control:GetAdventureLastNodeSlot()
|
||
local chapterDb = self:GetAdventureCurChapterDb()
|
||
return chapterDb:GetLastNodeSlot()
|
||
end
|
||
|
||
function XTheatre3Control:GetAdventureCurChapterDb()
|
||
return self._Model.ActivityData:GetCurChapterDb()
|
||
end
|
||
|
||
function XTheatre3Control:GetAdventureCurDifficultyId()
|
||
return self._Model.ActivityData:GetDifficultyId()
|
||
end
|
||
|
||
function XTheatre3Control:GetAdventureCurChapterId()
|
||
local chapterDb = self:GetAdventureCurChapterDb()
|
||
return chapterDb and chapterDb:GetCurChapterId()
|
||
end
|
||
|
||
function XTheatre3Control:GetAdventureCurItemList()
|
||
return self._Model.ActivityData:GetAdventureItemList()
|
||
end
|
||
|
||
function XTheatre3Control:GetAdventureCurEquipSuitCount()
|
||
local result = 0
|
||
for _, equip in pairs(self._Model.ActivityData.Equips) do
|
||
result = result + #equip.SuitIds
|
||
end
|
||
return result
|
||
end
|
||
|
||
function XTheatre3Control:GetAdventureStepSelectItemList()
|
||
local lastStep = self._Model.ActivityData:GetCurChapterDb():GetLastStep()
|
||
return lastStep and lastStep:GetItemIds() or {}
|
||
end
|
||
|
||
function XTheatre3Control:GetAdventureStepSelectEquipsList()
|
||
local lastStep = self._Model.ActivityData:GetCurChapterDb():GetLastStep()
|
||
return lastStep and lastStep:GetEquipIds() or {}
|
||
end
|
||
|
||
---@return XTheatre3NodeReward[]
|
||
function XTheatre3Control:GetAdventureStepSelectRewardList()
|
||
local lastStep = self._Model.ActivityData:GetCurChapterDb():GetLastStep()
|
||
if XTool.IsTableEmpty(lastStep) then
|
||
return {}
|
||
end
|
||
-- 以下所有均只是为了一个困难标签,因为此时修改为时已晚
|
||
-- 待下版本修改同步数据
|
||
local result = lastStep:GetFightRewards()
|
||
local stepRootUid = lastStep:GetRootUid()
|
||
local rootStep = self._Model.ActivityData:GetCurChapterDb():GetStepByUid(stepRootUid)
|
||
if rootStep then
|
||
local nodeSlot = rootStep:GetLastNodeSlot()
|
||
local fightId = nodeSlot and nodeSlot:GetFightId()
|
||
local fightNodeCfg = XTool.IsNumberValid(fightId) and self._Model:GetFightNodeCfgById(fightId)
|
||
if fightNodeCfg and fightNodeCfg.Difficulty == 2 then
|
||
for _, reward in ipairs(result) do
|
||
local isGold = reward:CheckType(XEnumConst.THEATRE3.NodeRewardType.Gold) and reward:GetConfigId() == fightNodeCfg.GoldId
|
||
local isItem = reward:CheckType(XEnumConst.THEATRE3.NodeRewardType.ItemBox) and reward:GetConfigId() == fightNodeCfg.ItemBoxId
|
||
reward:SetIsHard(isGold or isItem)
|
||
end
|
||
end
|
||
end
|
||
return result or {}
|
||
end
|
||
|
||
function XTheatre3Control:GetAdventureSlotDataList()
|
||
return self._Model.ActivityData:GetSlotInfoList()
|
||
end
|
||
|
||
function XTheatre3Control:GetAdventureItemCount(itemId)
|
||
return self._Model.ActivityData:GetAdventureItemCount(itemId)
|
||
end
|
||
|
||
function XTheatre3Control:SetAdventureStepSelectItem(id)
|
||
local lastStep = self._Model.ActivityData:GetCurChapterDb():GetLastStep()
|
||
if lastStep then
|
||
lastStep:UpdateItemSelectId(id)
|
||
end
|
||
end
|
||
|
||
function XTheatre3Control:SetAdventureStepSelectEquip(id)
|
||
local lastStep = self._Model.ActivityData:GetCurChapterDb():GetLastStep()
|
||
if lastStep then
|
||
lastStep:UpdateEquipSelectId(id)
|
||
end
|
||
end
|
||
--endregion
|
||
|
||
--region System - Adventure Checker
|
||
function XTheatre3Control:IsHavePassAdventure()
|
||
return self._Model.ActivityData:CheckHasFirstPassFlag()
|
||
end
|
||
|
||
function XTheatre3Control:IsHaveAdventure()
|
||
if XTool.IsNumberValid(self._Model.ActivityData:GetDifficultyId()) then
|
||
return true
|
||
end
|
||
if XTool.IsNumberValid(self._Model.ActivityData:GetCurChapterId()) then
|
||
return true
|
||
end
|
||
return false
|
||
end
|
||
|
||
function XTheatre3Control:IsNewAdventureChapter()
|
||
return self._Model.ActivityData:GetCurChapterDb():CheckIsNewChapterId()
|
||
end
|
||
|
||
function XTheatre3Control:IsAdventureHaveFightReward()
|
||
for _, reward in pairs(self:GetAdventureStepSelectRewardList()) do
|
||
if not reward:CheckIsReceived() then
|
||
return true
|
||
end
|
||
end
|
||
return false
|
||
end
|
||
|
||
function XTheatre3Control:IsDifficultyUnlock(difficultyId)
|
||
if not self._Model.ActivityData then
|
||
return false
|
||
end
|
||
return self._Model.ActivityData:CheckDifficultyIdUnlock(difficultyId)
|
||
end
|
||
--endregion
|
||
|
||
--region System - Adventure Ui Control
|
||
function XTheatre3Control:OpenAdventureProp()
|
||
XLuaUiManager.Open("UiTheatre3Prop")
|
||
end
|
||
|
||
function XTheatre3Control:OpenAdventureRoleRoom()
|
||
XLuaUiManager.Open("UiTheatre3RoleRoom", false)
|
||
end
|
||
|
||
function XTheatre3Control:_OpenAdventureSelectDifficulty()
|
||
XLuaUiManager.Open("UiTheatre3Difficulty")
|
||
end
|
||
|
||
function XTheatre3Control:_OpenAdventureUi(isPopOpen, uiName, ...)
|
||
if isPopOpen then
|
||
XLuaUiManager.PopThenOpen(uiName, ...)
|
||
else
|
||
XLuaUiManager.Open(uiName, ...)
|
||
end
|
||
end
|
||
--endregion
|
||
|
||
--region System - UiTip
|
||
function XTheatre3Control:OpenTextTip(sureCb, title, content, closeCb, key, exData)
|
||
XLuaUiManager.Open("UiTheatre3EndTips", sureCb, title, content, closeCb, key, exData)
|
||
end
|
||
|
||
--endregion
|
||
|
||
return XTheatre3Control |