local UIHorseEquipLevelUp = UIViewClass() local LevelUpGeneralItem, LevelUpGeneralItemExp = CTL.HorseEquip.GetGeneralMaterialItem() --唯一堆叠显示的物品 local DefaultEmptyNum = 10 local UpgradeEffectTime = 0.5 local LvStr1 = "%s/%s" local LvStr2 = "%s(+%s)/%s" function UIHorseEquipLevelUp:OnOpened(context) self:RegistSystemEvent(EventID.UI_HorseArmor_UpLv, self.PlayUpLvEffect) UIUtils.SetLabelText(self.UICommonPopUp.txt_Title, Const_IDS.IDS_HorseEquip_Hint_11) self.selectMaterialDict = {} --用来判断该物品是否被选为材料 k为id, v-数量 self.selectMaterialList = {} --被选材料id的列表,有序 self.horseData = context.horseData self.armorInfo = MDL.HorseEquip.GetArmorInfo(self.horseData.HorseID) self.arrivedLv = 0 self.sliderAni = self.slider_Exp.transform:GetComponent(typeof(SliderAnimation)) self.sliderAni.enabled = false self.CanClickUpLevelButton = true self:RefreshEquipSlot() self:RefreshMaterialGroup(false) self:RefreshMaterialScreen() self:RefreshSelectedMaterialtems(false) end function UIHorseEquipLevelUp:RefreshMaterialGroup(active) UIUtils.SetActive(self.group_Material, active) UIUtils.SetActive(self.btn_Bottom, active) if active then self:RefreshMaterialtems() end end function UIHorseEquipLevelUp:RefreshLevelInfo() self.curLvArmorCfg = DataSheetManager.HorseEquipEnhance:GetDataByEnhanceLevel(self.armorInfo.level) if self.armorInfo.level == CTL.HorseEquip.GetArmorMaxLv() then self.state_Info:SetState(2) self.txt_Level.text = string.FormatByIdsKey("IDS_HorseSoul_Button3", self.armorInfo.level) self.txt_Exp.text = "" self.slider_Exp.value = 1 else if self.arrivedLv > 0 then local str2 = string.FormatByIdsKey("IDS_HorseSoul_Button3", self.limitLv) self.txt_Level.text = string.format(LvStr2, self.armorInfo.level, self.arrivedLv - self.armorInfo.level , str2) if self.armorInfo.level == self.limitLv then self.txt_Exp.text = string.format(LvStr2, self.armorInfo.exp, self.curMaterialTotalExp, self.limitLvArmorCfg.Exp) self.slider_Exp.value = self.armorInfo.exp / self.limitLvArmorCfg.Exp self.state_Info:SetState(1) else local nextLvArmorCfg = DataSheetManager.HorseEquipEnhance:GetDataByEnhanceLevel(self.armorInfo.level + 1) self.txt_Exp.text = string.format(LvStr2, self.armorInfo.exp, self.curMaterialTotalExp, nextLvArmorCfg.Exp) self.slider_Exp.value = self.armorInfo.exp / nextLvArmorCfg.Exp self.state_Info:SetState(0) end else local str = string.format(LvStr1, self.armorInfo.level, self.limitLv) self.txt_Level.text = string.FormatByIdsKey("IDS_HorseSoul_Button3", str) if self.armorInfo.level == self.limitLv then self.txt_Exp.text = string.format(LvStr1, self.armorInfo.exp, self.limitLvArmorCfg.Exp) self.slider_Exp.value = self.armorInfo.exp / self.limitLvArmorCfg.Exp self.state_Info:SetState(1) else local nextLvArmorCfg = DataSheetManager.HorseEquipEnhance:GetDataByEnhanceLevel(self.armorInfo.level + 1) if self.curMaterialTotalExp > 0 then self.txt_Exp.text = string.format(LvStr2, self.armorInfo.exp, self.curMaterialTotalExp, nextLvArmorCfg.Exp) else self.txt_Exp.text = string.format(LvStr1, self.armorInfo.exp, nextLvArmorCfg.Exp) end self.slider_Exp.value = self.armorInfo.exp / nextLvArmorCfg.Exp self.state_Info:SetState(0) end end end self:RefreshExpAdd() end function UIHorseEquipLevelUp:RefreshExpAdd() UIUtils.SetActive(self.Fill_Head, self.curMaterialTotalExp == 0) UIUtils.SetActive(self.Add1, false) UIUtils.SetActive(self.Add2, false) if self.curMaterialTotalExp > 0 then local nextLvArmorCfg = DataSheetManager.HorseEquipEnhance:GetDataByEnhanceLevel(self.armorInfo.level + 1) local curExp = self.armorInfo.exp + self.curMaterialTotalExp local nextLevelExp = nextLvArmorCfg.Exp UIUtils.SetActive(self.Add1, true) UIUtils.SetActive(self.Add1_Head, curExp <= nextLevelExp) if curExp <= nextLevelExp then self.Add1.transform:SetSizeDelta(((self.armorInfo.exp + self.curMaterialTotalExp) / nextLevelExp) * 578, 12) else self.Add1.transform:SetSizeDelta(578, 12) if self.arrivedLv > self.armorInfo.level then curExp = CTL.HorseEquip.GetArmorArrivedLvLeftExp(self.armorInfo.level, self.arrivedLv, curExp) if self.arrivedLv < CTL.HorseEquip.GetArmorMaxLv() then local arriveNextLvArmorCfg = DataSheetManager.HorseEquipEnhance:GetDataByEnhanceLevel(self.arrivedLv + 1) self.Add2.transform:SetSizeDelta((curExp / arriveNextLvArmorCfg.Exp) * 578, 12) end end UIUtils.SetActive(self.Add2, curExp > 0) UIUtils.SetActive(self.Add2_Head, curExp > 0) end end end function UIHorseEquipLevelUp:RefreshEquipSlot() self.limitLv = 0 self.minEquipGs = {} for i, v in ipairs(self.group_Equipped) do UIUtils.SetActive(v.img_Selected, false) local equipInfo = MDL.HorseEquip.GetEquipSlotInfoByHorseId(self.horseData.HorseID,i) local equipInfo = MDL.HorseEquip.GetEquipInfoById(equipInfo.Id) UTL.Color.SetQualityImageByType(v.img_quality, equipInfo.itemData.Color, UTL.Color.QualityType.Circle) UTL.Item.OnlyItemIconWithoutBg(v.img_Equip, equipInfo.cfgId) v.txt_Armor.text = string.FormatByIdsId(Const_IDS.IDS_EquipData_StageShow, equipInfo.equipData.EquipStage) v.txt_Armor_lv.text = equipInfo.equipData.OfferLevel self.limitLv = self.limitLv + equipInfo.equipData.OfferLevel if i == 1 then self.selectedStage = equipInfo.equipData.EquipStage else if self.selectedStage > equipInfo.equipData.EquipStage then self.selectedStage = equipInfo.equipData.EquipStage end end local gs = CTL.HorseEquip.GetEquipGs(equipInfo.cfgId) self.minEquipGs[equipInfo.equipData.EquipType] = gs end self.txt_toplimit.text = string.FormatByIdsId(Const_IDS.IDS_HorseEquip_Hint_12, self.limitLv) if self.limitLv == CTL.HorseEquip.GetArmorMaxLv() then self.txt_CountDown.text = UIUtils.GetLocalizedTxt(Const_IDS["IDS_HorseEquip_Hint_16"]) UIUtils.SetActive(self.icon_high, true) else self.txt_CountDown.text = UIUtils.GetLocalizedTxt(Const_IDS["IDS_HorseEquip_Hint_14"]) UIUtils.SetActive(self.icon_high, false) end self.limitLvArmorCfg = DataSheetManager.HorseEquipEnhance:GetDataByEnhanceLevel(self.limitLv) UIUtils.SetImageByAssetBundle(self.img_Armor, self.limitLvArmorCfg.Icon) self.totalNeedExp = CTL.HorseEquip.GetArmorLimitLvUpNeedExp(self.armorInfo.level, self.limitLv) - self.armorInfo.exp end function UIHorseEquipLevelUp:RefreshAttrInfo(nextAttrTable) local nowAttrTable = self.curLvArmorCfg.Attr_Table 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 function UIHorseEquipLevelUp:RefreshMaterialScreen() UIUtils.SetActive(self.group_screen, true) local maxEquipStage = CTL.HorseEquip.GetMaxHorseNotWearingEquipStage() if self.selectedStage > maxEquipStage then self.selectedStage = maxEquipStage end self.lab_Choose.text = string.FormatByIdsId(Const_IDS.IDS_HorseEquip_Hint_15, self.selectedStage) local index = 0 for i = maxEquipStage, 1, -1 do if self.selectedStage == i then self.selectedStageIndex = index end index = index + 1 self.loop_screen:AddData(i, 0) end UIUtils.SetActive(self.group_screen, false) end function UIHorseEquipLevelUp:RefreshSelectedMaterialtems(isAutoSelect) self.curMaterialTotalExp = 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.curMaterialTotalExp = self.curMaterialTotalExp + LevelUpGeneralItemExp * self.selectMaterialDict[v] else self.curMaterialTotalExp = self.curMaterialTotalExp + MDL.HorseEquip.GetEquipInfoById(v).equipData.OfferExp end end self.loop_LevelUp:AddData({isGet = true}, 0) else table.insert(self.selectMaterialList, {isGet = true}) self.loop_LevelUp:ReloadAll(self.selectMaterialList) table.remove(self.selectMaterialList, #self.selectMaterialList) if self.loop_LevelUp.Count > DefaultEmptyNum then self.loop_LevelUp:MoveEnd() end for i, v in ipairs(self.selectMaterialList) do if v == LevelUpGeneralItem then self.curMaterialTotalExp = self.curMaterialTotalExp + LevelUpGeneralItemExp * self.selectMaterialDict[v] else self.curMaterialTotalExp = self.curMaterialTotalExp + MDL.HorseEquip.GetEquipInfoById(v).equipData.OfferExp end end end if self.loop_LevelUp.Count < DefaultEmptyNum then for i = DefaultEmptyNum, self.loop_LevelUp.Count + 1, -1 do self.loop_LevelUp:AddData({isEmpty = true}, 0) end end self:CalculateArrivedLv() end function UIHorseEquipLevelUp:CalculateArrivedLv() local totalExp = self.curMaterialTotalExp + self.armorInfo.exp self.arrivedLv = CTL.HorseEquip.GetArmorArrivedLv(self.armorInfo.level, self.limitLv, totalExp) if self.arrivedLv > self.armorInfo.level then local nextAttrTable = DataSheetManager.HorseEquipEnhance:GetDataByEnhanceLevel(self.arrivedLv).Attr_Table self:RefreshLevelInfo() self:RefreshAttrInfo(nextAttrTable) else self:RefreshLevelInfo() self:RefreshAttrInfo() end end function UIHorseEquipLevelUp:RefreshMaterialtems() 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.HorseEquip.GetEquipMaterialList()) do if not MDL.HorseEquip.JudgeIfEquip(v) then self.loop_Material:AddData(v, 0) end end UIUtils.SetActive(self.img_MaterialEmpty, self.loop_Material.Count == 0) end function UIHorseEquipLevelUp:OnButtonClicked(comp) if comp == self.btn_LevelUp then self:OnClickLevelUp() elseif comp == self.btn_Choose then self:OnClickAutoSelect() elseif comp == self.btn_screen then UIUtils.SetActive(self.group_screen, true) UIUtils.SetActive(self.btn_Bottom, true) self.loop_screen:RefreshCells() self.loop_screen:MoveIndex(self.selectedStageIndex) elseif comp == self.btn_Bottom then UIUtils.SetActive(self.group_screen, false) UIUtils.SetActive(self.btn_Bottom, false) UIUtils.SetActive(self.group_Material, false) elseif comp == self.UICommonPopUp.btn_Close then self:CloseView() end end function UIHorseEquipLevelUp:OnClickLevelUp() if not self.CanClickUpLevelButton then return end if #self.selectMaterialList <= 0 then CTL.Tips.AddTipsMsg(Const_IDS.IDS_HorseEquip_Hint_18) return end for i, v in ipairs(self.selectMaterialList) do if v ~= LevelUpGeneralItem then local equipInfo = MDL.HorseEquip.GetEquipInfoById(v) if CTL.HorseEquip.GetEquipGs(equipInfo.cfgId) > self.minEquipGs[equipInfo.equipData.EquipType] then UTL.MessageBox.ShowOKCancelBox(Const_IDS.IDS_Item_Confirm, Const_IDS.IDS_HorseEquip_Hint_19, function() self:ExecuteLevelUp() end) return end end end self:ExecuteLevelUp() end function UIHorseEquipLevelUp:ExecuteLevelUp() self.CanClickUpLevelButton = false MDL.HorseEquip.HorseEquipLevelUpReq(self.horseData.HorseID, self.selectMaterialList, self.selectMaterialDict[LevelUpGeneralItem]) end function UIHorseEquipLevelUp:OnClickAutoSelect() if self.curMaterialTotalExp >= self.totalNeedExp then CTL.Tips.AddTipsMsg(Const_IDS.IDS_HorseSoul_LevelHint15) return end if self.totalNeedExp > 0 then local _, list, dict = CTL.HorseEquip.AutoSelectMaterial(self.selectedStage, self.totalNeedExp) self.selectMaterialList, self.selectMaterialDict = list, dict self:RefreshSelectedMaterialtems(true) if #self.selectMaterialList == 0 then CTL.Tips.AddTipsMsg(Const_IDS.IDS_HorseEquip_Hint_17) end end end function UIHorseEquipLevelUp:OnCellInit(scrollRect, index, cellTable, data) if scrollRect == self.loop_LevelUp then self:InitSelectedMaterialCell(cellTable,data) elseif scrollRect == self.loop_Material then self:InitMaterialCell(cellTable,data) elseif scrollRect == self.loop_screen then cellTable.lab_Choose.text = string.FormatByIdsId(Const_IDS.IDS_HorseEquip_Hint_15, data) UIUtils.SetActive(cellTable.icon_select, self.selectedStage == data) end end function UIHorseEquipLevelUp:InitSelectedMaterialCell(cellTable, data) if type(data) ~= "number" and (data.isEmpty or data.isGet) then cellTable.state_Item:SetState(1) UIUtils.SetActive(cellTable.img_Add, data.isGet or false) else local equipInfo = MDL.HorseEquip.GetEquipInfoById(data) if equipInfo then cellTable.state_Item:SetState(0) UTL.Item.SetItemCell(cellTable.item, equipInfo.cfgId) cellTable.txt_Armor_lv.text = equipInfo.equipData.OfferLevel cellTable.txt_Armor.text = string.FormatByIdsId(Const_IDS.IDS_EquipData_StageShow, equipInfo.equipData.EquipStage) UIUtils.SetActive(cellTable.txt_Armor.gameObject, true) else cellTable.state_Item:SetState(2) UTL.Item.SetItemCell(cellTable.item, data, self.selectMaterialDict[data]) UIUtils.SetActive(cellTable.txt_Armor.gameObject, false) end end end function UIHorseEquipLevelUp:InitMaterialCell(cellTable, data) if data == LevelUpGeneralItem then 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 cellTable.lab_Num.text = (self.selectMaterialDict[data] or 0) .. "/" .. UTL.Item.GetItemStockCount(data) UIUtils.SetActive(cellTable.img_Armor, false) UIUtils.SetActive(cellTable.txt_Armor.gameObject, false) else local equipInfo = MDL.HorseEquip.GetEquipInfoById(data) cellTable.state:SetState(0) UTL.Item.SetItemCell(cellTable.item, equipInfo.cfgId) cellTable.txt_Armor.text = string.FormatByIdsId(Const_IDS.IDS_EquipData_StageShow, equipInfo.equipData.EquipStage) cellTable.txt_Armor_lv.text = equipInfo.equipData.OfferLevel cellTable.state_Mask:SetState(self.selectMaterialDict[data] and 1 or 0) UIUtils.SetActive(cellTable.img_Armor, true) UIUtils.SetActive(cellTable.txt_Armor.gameObject, true) end end function UIHorseEquipLevelUp: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:RefreshMaterialGroup(true) end elseif scrollRect == self.loop_Material then self:OnMaterialCellClicked(target, cellTable, data) elseif scrollRect == self.loop_screen then if target == cellTable.item then self.selectedStage = data self.lab_Choose.text = string.FormatByIdsId(Const_IDS.IDS_HorseEquip_Hint_15, self.selectedStage) self.selectedStageIndex = index UIUtils.SetActive(self.group_screen, false) UIUtils.SetActive(self.btn_Bottom, false) end end end function UIHorseEquipLevelUp:OnMaterialCellClicked(target, cellTable, data) local isChange = false if target == cellTable.item.event_Click then if self.curMaterialTotalExp >= 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:RefreshSelectedMaterialtems() end end function UIHorseEquipLevelUp:GetIndexById(equipId) for i, v in ipairs(self.selectMaterialList) do if v == equipId then return i end end end --升级成功动画特效 function UIHorseEquipLevelUp:PlayUpLvEffect(tempLevelData) UIUtils.SetActive(self.Add1, false) UIUtils.SetActive(self.Add2, false) self.armorInfo = MDL.HorseEquip.GetArmorInfo(tempLevelData.horseId) self.totalNeedExp = CTL.HorseEquip.GetArmorLimitLvUpNeedExp(self.armorInfo.level, self.limitLv) - self.armorInfo.exp local oldArmorLv = tempLevelData.oldArmorLv self:PlayExpAnimation(oldArmorLv) if self.armorInfo.level ~= oldArmorLv then self:StartRepeatFunc(function() UIManager.OpenView(Const_UI_Lua.UIEnum.UIHorseEquipLevelUpSuccess, {armorInfo = self.armorInfo, oldArmorLv = oldArmorLv, limitLv = self.limitLv}) self:RefreshAfterUpgrade() end, UpgradeEffectTime, 1) else self:StartRepeatFunc(self.RefreshAfterUpgrade, UpgradeEffectTime, 1) end end function UIHorseEquipLevelUp:PlayExpAnimation(oldLevel) self.sliderAni.enabled = true local diffLeveL = self.armorInfo.level - oldLevel > 10 and 10 or self.armorInfo.level - oldLevel if self.armorInfo.level ~= CTL.HorseEquip.GetArmorMaxLv() then local nextLvArmorCfg = DataSheetManager.HorseEquipEnhance:GetDataByEnhanceLevel(self.armorInfo.level + 1) self.sliderAni:Init(self.slider_Exp.value, diffLeveL, self.armorInfo.exp / nextLvArmorCfg.Exp) else self.sliderAni:Init(self.slider_Exp.value, diffLeveL, 1) end end function UIHorseEquipLevelUp:RefreshAfterUpgrade() self.selectMaterialDict = {} self.selectMaterialList = {} self:RefreshSelectedMaterialtems(false) self.CanClickUpLevelButton = true self.sliderAni.enabled = false end return UIHorseEquipLevelUp