local UIHorseSoulLevelUp = UIViewClass() local HorseSoulLevelUpHintQuality = DataSheetManager.ConstData:GetDataByID("HorseSoulLevelUpHintQuality").IntValue local DefaultEmptyNum = 10 local UpgradeEffectTime = 0.5 local LevelUpGeneralItem, LevelUpGeneralItemExp = MDL.HorseSoul.GetGeneralMaterialItem() --唯一堆叠显示的物品 local LevelMaterialEmptyLoopData = {} function UIHorseSoulLevelUp:OnOpened(context) self:RegistSystemEvent(EventID.UI_Illustration_HorseLibrary_RefreshBase, self.RefreshLibraryAdd) self:RegistSystemEvent(EventID.BagItem_Update, self.RefreshBreakItem) self:RegistSystemEvent(EventID.UI_HorseSoul_Upgrade, self.PlayUpgradeEffect) self.state_Info:SetState(0) self.sliderAni = self.slider_Exp.transform:GetComponent(typeof(SliderAnimation)) self.sliderAni.enabled = false self.isInit = true self.CanClickUpLevelButton = true self.selectMaterialDict = {} --key为id,用来判断该物品是否被选为材料 self.selectMaterialList = {} --value为id,被选为材料的数组,用于展示并且查找删除 for i = 1, DefaultEmptyNum do LevelMaterialEmptyLoopData[i] = false end self:RefreshLibraryAdd() end function UIHorseSoulLevelUp:RefreshLibraryAdd() local level = MDL.HorseLibrary.GetLibraryLevelAndScore() self.lab_LibraryAdd.text = UIUtils.GetLocalizedTxt(Const_IDS.IDS_HorseSoul_Button2) .. string.FormatByIdsKey("IDS_HorseSoul_Button3", level) if level > 0 then self.txt_TotalAdd.text = "+" .. UTL.Attr.FormatNumberToPercentage(DataSheetManager.HorsePictorialScore:GetDataByLevelID(level).HorseSoulAddition, 1) self.txt_LibraryAdd.text = "+" .. UTL.Attr.FormatNumberToPercentage(DataSheetManager.HorsePictorialScore:GetDataByLevelID(level).HorseSoulAddition, 1) else self.txt_TotalAdd.text = "+" .. "0%" self.txt_LibraryAdd.text = "+" .. "0%" end end function UIHorseSoulLevelUp:ExecuteLevelUp() for i, v in ipairs(self.selectMaterialList) do local bagType if v == LevelUpGeneralItem then bagType = DataSheetManager.ItemData:GetDataByID(v).BagType else local soulInfo = MDL.HorseSoul.GetSoulInfoById(v) bagType = soulInfo.itemData.BagType end self.selectMaterialList[i] = {id = v, count = self.selectMaterialDict[v], bagTyp = bagType} end MDL.HorseSoul.HorseSoulOptReq(MDL.HorseSoul.HorseSoulOptType.LevelUp, self.soulInfo.id, self.selectMaterialList) self.selectMaterialList = {} end function UIHorseSoulLevelUp:OnButtonClicked(comp) if comp == self.btn_Choose then self:OnClickAutoSelect() elseif comp == self.btn_Bottom then self:ActiveMaterialGroup(false) elseif comp == self.btn_LevelUp then if #self.selectMaterialList > 0 then local isHasHighQuality = false for i, v in ipairs(self.selectMaterialList) do if v ~= LevelUpGeneralItem then local soulInfo = MDL.HorseSoul.GetSoulInfoById(v) if soulInfo.itemData.Color >= HorseSoulLevelUpHintQuality then isHasHighQuality = true break end end end if isHasHighQuality then UTL.MessageBox.ShowOKCancelBox(Const_IDS.IDS_Item_Confirm, Const_IDS.IDS_HorseSoul_LevelHint19, function() self:ExecuteLevelUp() end) else self:ExecuteLevelUp() end else CTL.Tips.AddTipsMsg(Const_IDS.IDS_HorseSoul_LevelHint13) end elseif comp == self.item_Break.event_Click then local levelAttrId = self.soulInfo.soulData.HorseSoulLevelAttrID local levelData = DataSheetManager.HorseSoulLevelData:GetDataByHorseSoulLevelAttrID_Level(levelAttrId, self.soulInfo.levelInfo.level) local breakData = DataSheetManager.HorseSoulBreakData:GetDataByBreakType(levelData.BreakType) UTL.ItemTips.ShowCommonTipsById(breakData.BreakGeneralItem) else if not self.CanClickUpLevelButton then return end if comp == self.btn_Break then if self.isCanBreak then MDL.HorseSoul.HorseSoulOptReq(MDL.HorseSoul.HorseSoulOptType.Break, self.soulInfo.id) self.CanClickUpLevelButton = false else CTL.Tips.AddTipsMsg(Const_IDS.IDS_HorseSoul_LevelHint18) end end end end function UIHorseSoulLevelUp:OnClickAutoSelect() if self.curTotalExp >= self.totalNeedExp then CTL.Tips.AddTipsMsg(Const_IDS.IDS_HorseSoul_LevelHint15) return end --自动选择方法有可能返回bool值false,需要判断 local isCanSelect, list, dict = CTL.HorseSoul.AutoSelectMaterial(self.soulInfo.id) if isCanSelect then self.selectMaterialList, self.selectMaterialDict = list, dict self:RefreshSelectLoop(true) if #self.selectMaterialList == 0 then CTL.Tips.AddTipsMsg(Const_IDS.IDS_HorseSoul_LevelHint12) end else CTL.Tips.AddTipsMsg(Const_IDS.IDS_HorseSoul_LevelHint12) end end function UIHorseSoulLevelUp:RefreshAfterUpgrade() self.selectMaterialDict = {} self.selectMaterialList = {} self.soulInfo = MDL.HorseSoul.GetSoulInfoById(self.soulInfo.id) UTL.Item.OnlyItemIconWithoutBg(self.img_Item, self.soulInfo.cfgId) self.txt_Name.text = UTL.Color.FormatQualityText(UIUtils.GetLocalizedTxt(Const_IDS[self.soulInfo.itemData.Name]), self.soulInfo.itemData.Color) self:RefreshUpgradeInfo() self:ActiveMaterialGroup(false) self.CanClickUpLevelButton = true end function UIHorseSoulLevelUp:RefreshSoulItem(soulId) self.soulInfo = MDL.HorseSoul.GetSoulInfoById(soulId) UTL.Item.OnlyItemIconWithoutBg(self.img_Item, self.soulInfo.cfgId) self.txt_Name.text = UTL.Color.FormatQualityText(UIUtils.GetLocalizedTxt(Const_IDS[self.soulInfo.itemData.Name]), self.soulInfo.itemData.Color) CTL.HorseSoul.SetPositionImage(self.img_Pos, self.soulInfo.soulData.HorseSoulPositionID) self.selectMaterialDict = {} self.selectMaterialList = {} self:RefreshUpgradeInfo() self:ActiveMaterialGroup(false) self.isInit = false end function UIHorseSoulLevelUp:RefreshUpgradeInfo() local levelInfo = self.soulInfo.levelInfo local level = levelInfo.level local levelData = DataSheetManager.HorseSoulLevelData:GetDataByHorseSoulLevelAttrID_Level(self.soulInfo.soulData.HorseSoulLevelAttrID, level) local _, nextLevelData = DataSheetManager.HorseSoulLevelData:TryGetDataByHorseSoulLevelAttrID_Level(self.soulInfo.soulData.HorseSoulLevelAttrID, level + 1) if nextLevelData then local breakType = levelData.BreakType if breakType == 0 or levelInfo.breakLevel >= level then self.state_Info:SetState(0) self:RefreshLevelInfo() self:RefreshSelectLoop() self:RefreshMaterialLoop() else self.state_Info:SetState(1) self:RefreshBreakInfo() end else self.state_Info:SetState(2) self:RefreshSelectLoop() self.txt_Level.text = string.FormatByIdsKey("IDS_HorseSoul_Button3", level) self.txt_Exp.text = levelData.LevelEXP .. "/" .. levelData.LevelEXP self.sliderAni.enabled = false self.slider_Exp.value = 1 end end function UIHorseSoulLevelUp:RefreshLevelInfo() local levelInfo = self.soulInfo.levelInfo local level = levelInfo.level local curLevelAttrTable = CTL.HorseSoul.GetSoulAttrTable(self.soulInfo.soulData.HorseSoulLevelAttrID, level, levelInfo.breakLevel) local nextLevelData = DataSheetManager.HorseSoulLevelData:GetDataByHorseSoulLevelAttrID_Level(self.soulInfo.soulData.HorseSoulLevelAttrID, level + 1) self.txt_Level.text = string.FormatByIdsKey("IDS_HorseSoul_Button3", level) self.txt_Exp.text = levelInfo.curExp .. "/" .. nextLevelData.LevelEXP self.sliderAni.enabled = false self.slider_Exp.value = levelInfo.curExp / nextLevelData.LevelEXP self:RefreshAttrInfo(curLevelAttrTable) self.totalNeedExp = CTL.HorseSoul.GetTotalNeedExp(self.soulInfo.id) end function UIHorseSoulLevelUp:RefreshSelectLoop(isAutoSelect) self.curTotalExp = 0 if isAutoSelect then if self.loop_LevelUp.Count > 0 then self.loop_LevelUp:ClearCells() end for i, v in ipairs(self.selectMaterialList) do self.loop_LevelUp:AddData(v, 0) if v == LevelUpGeneralItem then self.curTotalExp = self.curTotalExp + LevelUpGeneralItemExp * self.selectMaterialDict[v] else self.curTotalExp = self.curTotalExp + CTL.HorseSoul.GetSoulPearlTotalExp(MDL.HorseSoul.GetSoulInfoById(v)) end end self.loop_LevelUp:AddData({isGet = true}, 0) else --这么处理是因为在整行数加减的时候,同一帧执行ReloadAll和AddData会导致c#中index越界 table.insert(self.selectMaterialList, {isGet = true}) self.loop_LevelUp:ReloadAll(self.selectMaterialList) table.remove(self.selectMaterialList, #self.selectMaterialList) for i, v in ipairs(self.selectMaterialList) do if v == LevelUpGeneralItem then self.curTotalExp = self.curTotalExp + LevelUpGeneralItemExp * self.selectMaterialDict[v] else self.curTotalExp = self.curTotalExp + CTL.HorseSoul.GetSoulPearlTotalExp(MDL.HorseSoul.GetSoulInfoById(v)) end end end if self.loop_LevelUp.Count + 1 < DefaultEmptyNum then for i = DefaultEmptyNum, self.loop_LevelUp.Count + 1, -1 do self.loop_LevelUp:AddData({isEmpty = true}, 0) end end local levelInfo = self.soulInfo.levelInfo local level = levelInfo.level local _, nextLevelData = DataSheetManager.HorseSoulLevelData:TryGetDataByHorseSoulLevelAttrID_Level(self.soulInfo.soulData.HorseSoulLevelAttrID, level + 1) local arriveLevel = level local totalExp = self.curTotalExp + levelInfo.curExp for i, v in DataSheetManager.HorseSoulLevelData:GetDataByHorseSoulLevelAttrID_Level(self.soulInfo.soulData.HorseSoulLevelAttrID) do if v.Level > level then totalExp = totalExp - v.LevelEXP if totalExp < 0 then break end arriveLevel = v.Level end end UIUtils.SetActive(self.Fill_Head, self.curTotalExp == 0) UIUtils.SetActive(self.Add1, false) UIUtils.SetActive(self.Add2, false) if self.curTotalExp > 0 then self.txt_Exp.text = levelInfo.curExp .. UTL.Color.FormatGreenColor("(+" .. self.curTotalExp .. ")") .. "/" .. nextLevelData.LevelEXP UIUtils.SetActive(self.Add1, true) if (levelInfo.curExp + self.curTotalExp) <= nextLevelData.LevelEXP then UIUtils.SetActive(self.Add1_Head, true) self.Add1.transform:SetSizeDelta(((levelInfo.curExp + self.curTotalExp) / nextLevelData.LevelEXP) * 578, 12) else self.Add1.transform:SetSizeDelta(578, 12) UIUtils.SetActive(self.Add1_Head, false) local nextLevelExp = nextLevelData.LevelEXP local curExp = levelInfo.curExp + self.curTotalExp if arriveLevel > level then for i = level + 1, arriveLevel do curExp = curExp - DataSheetManager.HorseSoulLevelData:GetDataByHorseSoulLevelAttrID_Level(self.soulInfo.soulData.HorseSoulLevelAttrID, i).LevelEXP end local _, nextLevelData = DataSheetManager.HorseSoulLevelData:TryGetDataByHorseSoulLevelAttrID_Level(self.soulInfo.soulData.HorseSoulLevelAttrID, arriveLevel + 1) if nextLevelData then nextLevelExp = nextLevelData.LevelEXP self.Add2.transform:SetSizeDelta((curExp / nextLevelExp) * 578, 12) else nextLevelExp = curExp self.Add2.transform:SetSizeDelta(578, 12) end end UIUtils.SetActive(self.Add2, true) UIUtils.SetActive(self.Add2_Head, true) end else if nextLevelData then self.txt_Exp.text = levelInfo.curExp .. "/" .. nextLevelData.LevelEXP else local levelData = DataSheetManager.HorseSoulLevelData:GetDataByHorseSoulLevelAttrID_Level(self.soulInfo.soulData.HorseSoulLevelAttrID, level) self.txt_Exp.text = levelData.LevelEXP .. "/" .. levelData.LevelEXP end end local curLevelAttrTable = CTL.HorseSoul.GetSoulAttrTable(self.soulInfo.soulData.HorseSoulLevelAttrID, level, levelInfo.breakLevel) if arriveLevel > level then local arriveLevelAttrTable = CTL.HorseSoul.GetSoulAttrTable(self.soulInfo.soulData.HorseSoulLevelAttrID, arriveLevel, levelInfo.breakLevel) self.txt_AddLevel.text = "(+" .. (arriveLevel - level) .. ")" self:RefreshAttrInfo(curLevelAttrTable, arriveLevelAttrTable) else self.txt_AddLevel.text = "" self:RefreshAttrInfo(curLevelAttrTable) end end function UIHorseSoulLevelUp:RefreshBreakInfo() local levelInfo = self.soulInfo.levelInfo local level = levelInfo.level self.txt_LvBefore.text = string.FormatByIdsKey("IDS_HorseSoul_Button3", level) local levelAttrId = self.soulInfo.soulData.HorseSoulLevelAttrID local nextLevel for i, v in DataSheetManager.HorseSoulLevelData:GetDataByHorseSoulLevelAttrID_Level(levelAttrId) do if v.Level > level then if v.BreakType and v.BreakType > 0 then nextLevel = v.Level break end end end if not nextLevel then nextLevel = DataSheetManager.HorseSoulLevelData:GetDataLengthByHorseSoulLevelAttrID_Level(levelAttrId) UIUtils.SetActive(self.img_Max, true) else UIUtils.SetActive(self.img_Max, false) end self.txt_LvAfter.text = string.FormatByIdsKey("IDS_HorseSoul_Button3", nextLevel) local curLevelAttrTable = CTL.HorseSoul.GetSoulAttrTable(levelAttrId, level, levelInfo.breakLevel) local levelData = DataSheetManager.HorseSoulLevelData:GetDataByHorseSoulLevelAttrID_Level(levelAttrId, level) local breakData = DataSheetManager.HorseSoulBreakData:GetDataByBreakType(levelData.BreakType) self:RefreshAttrInfo(curLevelAttrTable, breakData.Attr_Table) self:RefreshBreakItem() end function UIHorseSoulLevelUp:RefreshBreakItem() local levelAttrId = self.soulInfo.soulData.HorseSoulLevelAttrID local levelData = DataSheetManager.HorseSoulLevelData:GetDataByHorseSoulLevelAttrID_Level(levelAttrId, self.soulInfo.levelInfo.level) if levelData.BreakType and levelData.BreakType > 0 then local breakData = DataSheetManager.HorseSoulBreakData:GetDataByBreakType(levelData.BreakType) local breakMaterialId = breakData.BreakGeneralItem local needNum = breakData.UseItemNum local hasNum = UTL.Item.GetItemStockCount(breakMaterialId) self.isCanBreak = hasNum >= needNum hasNum = self.isCanBreak and hasNum or UTL.Color.FormatRedColor(hasNum) UTL.Item.SetItemCell(self.item_Break, breakMaterialId, hasNum .. "/" .. needNum) end end function UIHorseSoulLevelUp:ActiveMaterialGroup(active) UIUtils.SetActive(self.group_Material, active) UIUtils.SetActive(self.btn_Bottom, active) if active then self:RefreshMaterialLoop() end end function UIHorseSoulLevelUp:RefreshMaterialLoop() if self.loop_Material.Count > 0 then self.loop_Material:ClearCells() end local generalItemCount = UTL.Item.GetItemStockCount(LevelUpGeneralItem) if generalItemCount > 0 then self.loop_Material:AddData(LevelUpGeneralItem, 0) end for i, v in ipairs(MDL.HorseSoul.GetSoulMaterialList()) do local soulInfo = MDL.HorseSoul.GetSoulInfoById(v) if soulInfo.id ~= self.soulInfo.id and soulInfo.itemData.Color < LuaConst.QualityColor.Gold and not MDL.HorseSoul.JudgeIfEquip(v) then self.loop_Material:AddData(v, 0) end end UIUtils.SetActive(self.img_MaterialEmpty, self.loop_Material.Count == 0) end function UIHorseSoulLevelUp:PlayUpgradeEffect(tempLevelData) UIUtils.SetActive(self.Add1, false) UIUtils.SetActive(self.Add2, false) local soulInfo = MDL.HorseSoul.GetSoulInfoById(tempLevelData.soulId) local levelInfo = soulInfo.levelInfo local tempInfo = tempLevelData.levelInfo self:PlayExpAnimation(tempInfo.level) if levelInfo.level ~= tempInfo.level or levelInfo.breakLevel ~= tempInfo.breakLevel then local isBreak = levelInfo.breakLevel > tempInfo.breakLevel if isBreak then self.effect_Break:PlayUIEffect() else self.effect_LevelUp:PlayUIEffect() end self:StartRepeatFunc(function() UIManager.OpenView(Const_UI_Lua.UIEnum.UIHorseSoulUpgradeSuccess, {soulInfo = soulInfo, oldLevelData = tempInfo}, Const_UI_Lua.UIEnum.UIHeroIllustratedLevelUpTip) if isBreak then CTL.Sound.PlayGameSound("UI_active_03") else CTL.Sound.PlayGameSound("UI_breakthrough_03") end self:RefreshAfterUpgrade() end, UpgradeEffectTime, 1) else self:StartRepeatFunc(self.RefreshAfterUpgrade, UpgradeEffectTime, 1) end end function UIHorseSoulLevelUp:PlayExpAnimation(oldLevel) local levelInfo = self.soulInfo.levelInfo local curLevelNum = levelInfo.curExp local newLevel = levelInfo.level local _, newLevelData = DataSheetManager.HorseSoulLevelData:TryGetDataByHorseSoulLevelAttrID_Level(self.soulInfo.soulData.HorseSoulLevelAttrID, newLevel + 1) self.sliderAni.enabled = true if newLevelData then self.sliderAni:Init(self.slider_Exp.value, newLevel - oldLevel, curLevelNum / newLevelData.LevelEXP) else self.sliderAni:Init(self.slider_Exp.value, newLevel - oldLevel, 1) end end function UIHorseSoulLevelUp:OnCellInit(scrollRect, index, cellTable, data) if scrollRect == self.loop_LevelUp then if type(data) ~= "number" and (data.isEmpty or data.isGet) then cellTable.state:SetState(1) UIUtils.SetActive(cellTable.img_Add, data.isGet or false) else local soulInfo = MDL.HorseSoul.GetSoulInfoById(data) if soulInfo then cellTable.state:SetState(0) UTL.Item.SetItemCell(cellTable.item, soulInfo.cfgId) cellTable.item.txt_Level.text = string.FormatByIdsKey("IDS_HorseSoul_Button3", soulInfo.levelInfo.level) CTL.HorseSoul.SetPositionImage(cellTable.item.img_Pos, soulInfo.soulData.HorseSoulPositionID) if soulInfo.itemData.Color >= LuaConst.QualityColor.Gold then CTL.HorseSoul.SetStarLevel(cellTable.item.group_Star, soulInfo.star) end else cellTable.state:SetState(2) UTL.Item.SetItemCell(cellTable.item, data, self.selectMaterialDict[data]) end end elseif scrollRect == self.loop_Material then local soulInfo = MDL.HorseSoul.GetSoulInfoById(data) if soulInfo then cellTable.state:SetState(0) UTL.Item.SetItemCell(cellTable.item, soulInfo.cfgId) cellTable.item.txt_Level.text = string.FormatByIdsKey("IDS_HorseSoul_Button3", soulInfo.levelInfo.level) CTL.HorseSoul.SetPositionImage(cellTable.item.img_Pos, soulInfo.soulData.HorseSoulPositionID) if soulInfo.itemData.Color >= LuaConst.QualityColor.Gold then CTL.HorseSoul.SetStarLevel(cellTable.item.group_Star, soulInfo.star) end cellTable.state_Mask:SetState(self.selectMaterialDict[data] and 1 or 0) UIUtils.SetActive(cellTable.lab_Num, false) else cellTable.state:SetState(1) UTL.Item.SetItemCell(cellTable.item, data) if self.selectMaterialDict[data] then cellTable.state_Mask:SetState(self.selectMaterialDict[data] == UTL.Item.GetItemStockCount(data) and 2 or 3) else cellTable.state_Mask:SetState(0) end UIUtils.SetActive(cellTable.lab_Num, true) cellTable.lab_Num.text = (self.selectMaterialDict[data] or 0) .. "/" .. UTL.Item.GetItemStockCount(data) end end end function UIHorseSoulLevelUp:OnCellClicked(scrollRect, index, cellTable, target, data) if scrollRect == self.loop_LevelUp then if target == cellTable.btn_Get or target == cellTable.item.event_Click then self:ActiveMaterialGroup(true) end elseif scrollRect == self.loop_Material then local isChange = false if target == cellTable.item.event_Click then if self.curTotalExp >= self.totalNeedExp then CTL.Tips.AddTipsMsg(Const_IDS.IDS_HorseSoul_LevelHint15) return end if data == LevelUpGeneralItem then local num = self.selectMaterialDict[data] if num then self.selectMaterialDict[data] = num + 1 if num + 1 > UTL.Item.GetItemStockCount(data) then self.selectMaterialDict[data] = UTL.Item.GetItemStockCount(data) end else self.selectMaterialDict[data] = 1 table.insert(self.selectMaterialList, data) end isChange = true else if not self.selectMaterialDict[data] then self.selectMaterialDict[data] = 1 table.insert(self.selectMaterialList, data) isChange = true end end elseif target == cellTable.btn_Reduce then if data == LevelUpGeneralItem then self.selectMaterialDict[data] = self.selectMaterialDict[data] - 1 if self.selectMaterialDict[data] == 0 then self.selectMaterialDict[data] = nil table.remove(self.selectMaterialList, self:GetIndexById(data)) end isChange = true else self.selectMaterialDict[data] = nil table.remove(self.selectMaterialList, self:GetIndexById(data)) isChange = true end end if isChange then if data ~= LevelUpGeneralItem then cellTable.state_Mask:SetState(self.selectMaterialDict[data] and 1 or 0) UIUtils.SetActive(cellTable.lab_Num, false) else UTL.Item.SetItemCell(cellTable.item, data) if self.selectMaterialDict[data] then cellTable.state_Mask:SetState(self.selectMaterialDict[data] == UTL.Item.GetItemStockCount(data) and 2 or 3) else cellTable.state_Mask:SetState(0) end UIUtils.SetActive(cellTable.lab_Num, true) cellTable.lab_Num.text = (self.selectMaterialDict[data] or 0) .. "/" .. UTL.Item.GetItemStockCount(data) end self:RefreshSelectLoop() end end end function UIHorseSoulLevelUp:GetIndexById(soulId) for i, v in ipairs(self.selectMaterialList) do if v == soulId then return i end end end function UIHorseSoulLevelUp:RefreshAttrInfo(nowAttrTable, nextAttrTable) for i, v in ipairs(self.group_Attr) do local attrData = nowAttrTable[i] local nextAttrData = nextAttrTable and nextAttrTable[i] or nil if attrData then UIUtils.SetActive(v.gameObject, true) local nowAttrNum = attrData.AttrNum UTL.Attr.SetAttrItemByCompName(v, attrData.AttrType, nowAttrNum, true) if nextAttrData then v.txt_Add.text = "(+" .. nextAttrData.AttrNum - nowAttrNum .. ")" else v.txt_Add.text = "" end else UIUtils.SetActive(v.gameObject, false) end end end return UIHorseSoulLevelUp