local Reborn_Controller = {} local private = {} local ChooseSmeltEquipMaxNum = DataSheetManager.ConstData:GetDataByID("OneKeyChooseMaxNum").IntValue local EventSystem = require('Event/EventSystem') --默认为蓝色,对应ItemData.Color字段的2 local DefaultFilterSetup = {2} function Reborn_Controller.OnStartup() private.filterSetup = nil end function Reborn_Controller.OnShutdown() private.filterSetup = nil end --region 熔炼装备相关 function Reborn_Controller.OpenRebornView(toggleIndex, subViewContext) if toggleIndex then UIManager.OpenAndPushAll(Const_UI_Lua.UIEnum.UIRebornMain, {toggleIndex = toggleIndex, subViewContext = subViewContext}) else UIManager.OpenAndPushAll(Const_UI_Lua.UIEnum.UIRebornMain) end end local RebornSmeltFilterKey = "RebornSmeltFilterKey" function Reborn_Controller.SaveSmeltFilterSetting(filterSetupDict) private.filterSetup = {} for quality, v in pairs(filterSetupDict) do table.insert(private.filterSetup, quality) end logging.log(LTAG.LOG, "RebornSmelt SaveSmeltFilterSetting", private.filterSetup) PersistentData.PlayerData:Set(RebornSmeltFilterKey, table.concat(private.filterSetup, "|"), true) end function Reborn_Controller.LoadSmeltFilterSetting() if not private.filterSetup then --CTL模块中用list的形式,方便读取和存储 local str = PersistentData.PlayerData:Get(RebornSmeltFilterKey) if not string.isNilOrEmpty(str) then private.filterSetup = {} for i, v in ipairs(string.split(str, "|")) do table.insert(private.filterSetup, tonumber(v)) end else private.filterSetup = DefaultFilterSetup end end --对表进行一次深复制,否则界面获得引用直接操作数据会引起问题 local filterSetupDict = {} --返回界面使用时转成字典方便使用 for index, quality in ipairs(private.filterSetup) do filterSetupDict[quality] = true end if not next(filterSetupDict) then --logging.error(LTAG.ERROR, "玩家ACID为:", BattleDataGetter.GetAcID(), " 的熔炼筛选设置数据为:", private.filterSetup, " !!!导出后列表为空,请程序检查!!!") private.filterSetup = DefaultFilterSetup for index, quality in ipairs(private.filterSetup) do filterSetupDict[quality] = true end end return filterSetupDict end function Reborn_Controller.SelectEquipsBySmeltFilter(allInfoList, selectIdDict) if not private.filterSetup then for k, v in pairs(Reborn_Controller.LoadSmeltFilterSetting()) do table.insert(private.filterSetup, k) end end local ifHasSelect = false for i, v in ipairs(allInfoList) do local id = v.ID if not selectIdDict[id] then if v.SmeltFlag == CTL.Equipment.EquipActionFlag.None or v.SmeltFlag == CTL.Equipment.EquipActionFlag.ReplaceRefine then if table.containValue(private.filterSetup, v.ItemData.Color) then selectIdDict[id] = 1 ifHasSelect = true end end end if table.getDictCount(selectIdDict) >= ChooseSmeltEquipMaxNum then return ifHasSelect end end return ifHasSelect end function Reborn_Controller.IfHasRareEquipment(equipDict) local rareEquips = {} for id, v in pairs(equipDict) do local data = MDL.Equipment.GetEquipmentInfoByID(id) if data.EquipData.IsRareEquip then table.insert(rareEquips, data) end end if #rareEquips > 0 then table.sort(rareEquips, private.SortByEquipItemId) return rareEquips else return false end end function private.SortByEquipItemId(a, b) local qualityA = a.ItemData.Color local qualityB = b.ItemData.Color if qualityA ~= qualityB then return qualityA > qualityB else local equipLevelA = a.EquipData.EquipLevel local equipLevelB = b.EquipData.EquipLevel if equipLevelA ~= equipLevelB then return equipLevelA > equipLevelB else return a.ItemData.ID < b.ItemData.ID end end end --endregion ------------------ Start 纳灵相关 Start ------------------ -- 打开纳灵界面 function Reborn_Controller.OpenRecycleFragmentView() if MDL.Reborn.GetRecycleFragmentIsOpen() then UIManager.OpenAndPushAll(Const_UI_Lua.UIEnum.UIRebornMain, {toggleIndex = MDL.Reborn.RebornToggleIndex.RecycleFragment}) else CTL.Tips.AddTipsMsg(Const_IDS.IDS_Formation_RelationShip_Closed) end end -- 获取对应 type、level的全部升级所需经验,如果node不为空,则获取到对应node为止(不包含node) function Reborn_Controller.GetAllExpByCurLevel(rfType, level, node) local allExp = 0 local suc, data = DataSheetManager.RecycleFragmentArea:TryGetDataByRFAreaType_RFAreaLevel_RFAreaLevelPoint(rfType, level, 0) if not suc then -- 判断是否有当前等级 return allExp end for i, v in DataSheetManager.RecycleFragmentArea:GetDataByRFAreaType_RFAreaLevel_RFAreaLevelPoint(rfType, level) do if node then if v.RFAreaLevelPoint < node then allExp = allExp + v.RFAreaLevelEXP end else allExp = allExp + v.RFAreaLevelEXP end end return allExp end -- 获取当前type的灵区升到最高等级所需经验 function Reborn_Controller.GetDistanceCanReachMaxLevelExpByType(rfType) local info = MDL.Reborn.GetRFAreaInfoByType(rfType) if info then local curExp = Reborn_Controller.GetAllExpByCurLevel(rfType, info.Level, info.Node) + info.CurExp local canReachMaxLevel = Reborn_Controller.GetCanReachMaxLevelByType(rfType) local allExp = 0 for i = info.Level, canReachMaxLevel - 1 do -- 最高等级的经验不能算 allExp = allExp + Reborn_Controller.GetAllExpByCurLevel(rfType, i) end return allExp - curExp end return 0 end -- 计算纳灵系统总战力 function Reborn_Controller.GetRecycleFragmentAllPower() local curLevel = MDL.Reborn.GetRecycleFragmentLevel() local curLevelData = DataSheetManager.RecycleFragmentLevel:GetDataByRecycleFragmentLevel(curLevel) local allPower = 0 -- 计算人之灵战力 local info = MDL.Reborn.GetRFAreaInfoByType(MDL.Reborn.RecycleFragmentType.Man) if info and curLevelData.RFAreaLevelLimit_1 > 0 then local data = DataSheetManager.RecycleFragmentArea:GetDataByRFAreaType_RFAreaLevel_RFAreaLevelPoint(MDL.Reborn.RecycleFragmentType.Man, info.Level, info.Node) for _, v in ipairs(data.Attr_Table) do allPower = allPower + UTL.Attr.CalculateSingleFight(v.AttrType, v.AttrNum) end end -- 计算地之灵战力 info = MDL.Reborn.GetRFAreaInfoByType(MDL.Reborn.RecycleFragmentType.Earth) if info and curLevelData.RFAreaLevelLimit_2 > 0 then local data = DataSheetManager.RecycleFragmentArea:GetDataByRFAreaType_RFAreaLevel_RFAreaLevelPoint(MDL.Reborn.RecycleFragmentType.Earth, info.Level, info.Node) for _, v in ipairs(data.Attr_Table) do allPower = allPower + UTL.Attr.CalculateSingleFight(v.AttrType, v.AttrNum) end end -- 计算天之灵战力 info = MDL.Reborn.GetRFAreaInfoByType(MDL.Reborn.RecycleFragmentType.Heaven) if info and curLevelData.RFAreaLevelLimit_3 > 0 then local data = DataSheetManager.RecycleFragmentArea:GetDataByRFAreaType_RFAreaLevel_RFAreaLevelPoint(MDL.Reborn.RecycleFragmentType.Heaven, info.Level, info.Node) for _, v in ipairs(data.Attr_Table) do allPower = allPower + UTL.Attr.CalculateSingleFight(v.AttrType, v.AttrNum) end end -- 天地人的属性给所有已经上阵的生效 所以战力需要 * 上阵武将数量 local count = 0 for _, id in ipairs(MDL.Formation.GetSlotHeroIds()) do if id > 0 then count = count + 1 end end allPower = allPower * count -- 计算纳灵等级战力 local data = DataSheetManager.RecycleFragmentLevel:GetDataByRecycleFragmentLevel(MDL.Reborn.GetRecycleFragmentLevel()) for _, v in ipairs(data.Attr_Table) do allPower = allPower + UTL.Attr.CalculateSingleFight(v.AttrType, v.AttrNum) end allPower = allPower + data.RecycleFragmentLevelPower return math.floor(allPower + 0.5) end -- 计算材料table中全部经验 function Reborn_Controller.GetChooseMaterialExp(chooseMaterialDic) local allExp = 0 for id, count in pairs(chooseMaterialDic) do local materialData = MDL.Reborn.GetMaterialDataById(id) if materialData then allExp = allExp + materialData.itemExp * count end end return allExp end -- 计算剩余可选择的最大碎片数量 function Reborn_Controller.GetCanChooseMaterialCount(rfType, chooseMaterialDic, data) local needExp = CTL.Reborn.GetDistanceCanReachMaxLevelExpByType(rfType) local chooseExp = Reborn_Controller.GetChooseMaterialExp(chooseMaterialDic) return math.min(math.ceil((needExp - chooseExp) / data.itemExp), data.itemCount) end -- 根据Type获取灵区名字 function Reborn_Controller.GetNameByRFType(rfType) if rfType == MDL.Reborn.RecycleFragmentType.Man then return UIUtils.GetLocalizedTxt(Const_IDS.IDS_RFArea1_Name) elseif rfType == MDL.Reborn.RecycleFragmentType.Earth then return UIUtils.GetLocalizedTxt(Const_IDS.IDS_RFArea2_Name) elseif rfType == MDL.Reborn.RecycleFragmentType.Heaven then return UIUtils.GetLocalizedTxt(Const_IDS.IDS_RFArea3_Name) end end -- 根据灵区Type 获取灵区的最大上限 function Reborn_Controller.GetMaxLevelByType(rfType) local maxLevel = 0 for _, v in DataSheetManager.RecycleFragmentLevel:GetEnumerator() do if rfType == MDL.Reborn.RecycleFragmentType.Man then if v.RFAreaLevelLimit_1 > maxLevel then maxLevel = v.RFAreaLevelLimit_1 end elseif rfType == MDL.Reborn.RecycleFragmentType.Earth then if v.RFAreaLevelLimit_2 > maxLevel then maxLevel = v.RFAreaLevelLimit_2 end elseif rfType == MDL.Reborn.RecycleFragmentType.Heaven then if v.RFAreaLevelLimit_3 > maxLevel then maxLevel = v.RFAreaLevelLimit_3 end end end return maxLevel end -- 根据灵区Type、当前灵区数据、选中经验,计算目标灵区 和 剩余经验 function Reborn_Controller.GetTargetRFAreaData(rfType, info, chooseExp) if not info then return nil, 0 end local targetExp = chooseExp + info.CurExp --目标经验(选中经验+当前经验) local curIndex = 0 for i, v in DataSheetManager.RecycleFragmentArea:GetDataByRFAreaType_RFAreaLevel_RFAreaLevelPoint(rfType) do if v.RFAreaLevel == info.Level and v.RFAreaLevelPoint == info.Node then curIndex = i break end end for i, v in DataSheetManager.RecycleFragmentArea:GetDataByRFAreaType_RFAreaLevel_RFAreaLevelPoint(rfType) do if i >= curIndex then if v.RFAreaLevelEXP == 0 or targetExp < v.RFAreaLevelEXP then return v, targetExp end targetExp = targetExp - v.RFAreaLevelEXP end end return nil, 0 end -- 获取灵区type对应灵区可升到的最高等级 function Reborn_Controller.GetCanReachMaxLevelByType(rfType) local rfLevelData = DataSheetManager.RecycleFragmentLevel:GetDataByRecycleFragmentLevel(MDL.Reborn.GetRecycleFragmentLevel()) if rfType == MDL.Reborn.RecycleFragmentType.Man then return rfLevelData.RFAreaLevelLimit_1 elseif rfType == MDL.Reborn.RecycleFragmentType.Earth then return rfLevelData.RFAreaLevelLimit_2 elseif rfType == MDL.Reborn.RecycleFragmentType.Heaven then return rfLevelData.RFAreaLevelLimit_3 end return 0 end -- 打开纳灵等级升级界面 function Reborn_Controller.OpenUIRFLevelUpSuccess() if UIManager.IsViewOpened(Const_UI_Lua.UIEnum.UIRecycleFragmentLevelUpSuccess) then EventSystem.Dispatch(EventID.RecycleFragment_RFLevelUpSuccess) else UIManager.OpenView(Const_UI_Lua.UIEnum.UIRecycleFragmentLevelUpSuccess, nil, "Common/UICommonBreakSuccess") end end -- 刷新纳灵红点 function Reborn_Controller.CalculateRFRedPoint() if MDL.Reborn.GetRFMaterialListCount() > 0 then local rfLevelData = DataSheetManager.RecycleFragmentLevel:GetDataByRecycleFragmentLevel(MDL.Reborn.GetRecycleFragmentLevel()) if private.CalculateRFAreaExp(rfLevelData.RFAreaLevelLimit_1, MDL.Reborn.RecycleFragmentType.Man) then CTL.RedPoint.AddRedPoint(CTL.RedPoint.RedPointKey.Reborn_RecycleFragment_Man) else CTL.RedPoint.RemoveRedPoint(CTL.RedPoint.RedPointKey.Reborn_RecycleFragment_Man) end if private.CalculateRFAreaExp(rfLevelData.RFAreaLevelLimit_2, MDL.Reborn.RecycleFragmentType.Earth) then CTL.RedPoint.AddRedPoint(CTL.RedPoint.RedPointKey.Reborn_RecycleFragment_Earth) else CTL.RedPoint.RemoveRedPoint(CTL.RedPoint.RedPointKey.Reborn_RecycleFragment_Earth) end if private.CalculateRFAreaExp(rfLevelData.RFAreaLevelLimit_3, MDL.Reborn.RecycleFragmentType.Heaven) then CTL.RedPoint.AddRedPoint(CTL.RedPoint.RedPointKey.Reborn_RecycleFragment_Heaven) else CTL.RedPoint.RemoveRedPoint(CTL.RedPoint.RedPointKey.Reborn_RecycleFragment_Heaven) end else CTL.RedPoint.RemoveRedPoint(CTL.RedPoint.RedPointKey.Reborn_RecycleFragment_Man) CTL.RedPoint.RemoveRedPoint(CTL.RedPoint.RedPointKey.Reborn_RecycleFragment_Earth) CTL.RedPoint.RemoveRedPoint(CTL.RedPoint.RedPointKey.Reborn_RecycleFragment_Heaven) end end function private.CalculateRFAreaExp(limitLevel, rfType) if limitLevel == 0 then return false end -- 如果限制等级为0 表示该灵区未解锁 local info = MDL.Reborn.GetRFAreaInfoByType(rfType) if not info then return false end if info.Level == limitLevel then return false end -- 如果灵区已经达到上限不显示红点 local rfAreaData = DataSheetManager.RecycleFragmentArea:GetDataByRFAreaType_RFAreaLevel_RFAreaLevelPoint(rfType, info.Level, info.Node) local needExp = rfAreaData.RFAreaLevelEXP - info.CurExp local rfTypeData = DataSheetManager.RecycleFragmentType:GetDataByID(rfType) local rfQualityDic = {} for _, quality in ipairs(rfTypeData.RFQuality) do rfQualityDic[quality] = 1 -- 占位作用 end for _, v in MDL.Reborn.GetRFMaterialIterator(rfQualityDic, true) do needExp = needExp - (v.itemExp * v.itemCount) if needExp <= 0 then return true end end return false end -------------------- End 纳灵相关 End -------------------- return Reborn_Controller