local UIHeroBreak = UIViewClass() local EventSystem = require('Event/EventSystem') local resonance_info = require 'Proto/resonance_info_pb' local goldHeroFragmentItemID = 301 -- 金将万能碎片 local superGoldHeroFragmentItemID = 401 -- 彩金将万能碎片 function UIHeroBreak:OnOpened(context) self:RegistSystemEvent(EventID.UI_HeroShow_UpdateHeroShow, self.RefreshPanel) self:RegistSystemEvent(EventID.UI_HeroBreak_Breakthrough, self.PlayBreakEffect) self:RegistSystemEvent(EventID.BagItem_Update, self.RefreshPanel) self:RegistSystemEvent(EventID.UI_ResonanceChange_Refresh, self.RefreshResonanceLv) self:RegistSystemEvent(EventID.FunctionUnlockUpdate, self.UpdateAwakenEntry) self.parentView = context.parentView UIUtils.SetActive(self.parentView.currency_Info, false) self:RefreshResonanceLv() CTL.FormationResonance.SetSubResonanceImage(self.icon_Resonance, resonance_info.Hero_Break) --待优化 for i, v in ipairs(self.group_Stage) do self:RegistTriggerEvent(v.img_Stage, UIEventTriggerType.PointerDown) self:RegistTriggerEvent(v.img_Stage, UIEventTriggerType.PointerUp) end self.btn_Block:SetSizeDelta(2000, 2000) self:RefreshPanel() self:UpdateAwakenEntry() end function UIHeroBreak:UpdateAwakenEntry() UIUtils.SetActive(self.btn_Return, CTL.HeroAwaken.IsShowHeroAwakenEntry(MDL.HeroSelect.curSelectHeroID)) end function UIHeroBreak:OnClosed() UIUtils.SetActive(self.parentView.currency_Info, true) CTL.Currency.OpenCurrencyPanel(self.parentView.__viewClassPath, self.parentView.currency_Info) end function UIHeroBreak:RefreshResonanceLv() if MDL.Unlock.IsUnlock(MDL.Unlock.FunctionType.Resonance) then UIUtils.SetActive(self.btn_Resonance, true) else UIUtils.SetActive(self.btn_Resonance, false) end UIUtils.SetLabel(self.txt_ResonanceLv, string.FormatByIdsId(Const_IDS["IDS_Resonance_Level"], MDL.FormationResonance.GetSubResonanceLv(resonance_info.Hero_Break))) end function UIHeroBreak:PlayBreakEffect(heroId) local heroStage = MDL.HeroStar.GetHeroStageLevel(heroId) if CTL.HeroStar.IsGreatBreak(heroId) then self.effect_StarBreak:PlayUIEffect() self:StartRepeatFunc(self.OnUpdateFun, 1) UIUtils.SetActive(self.btn_Block.gameObject, true) else self.effect_Break.transform:SetParent(self.group_Stage[heroStage].gameObject.transform, false) self.effect_Break:PlayUIEffect() local maxStage = MDL.HeroStar.GetHeroMaxStageLevel(heroId) if maxStage == heroStage + 1 then CTL.Sound.PlayGameSound("UI_breakthrough_02") else CTL.Sound.PlayGameSound("UI_breakthrough_01") end end if CTL.HeroAwaken.IsShowHeroAwakenEntry(heroId) then self:OnUpdateFun() self:OnButtonClicked(self.btn_Return) end end function UIHeroBreak:OnUpdateFun(deltaTime, timeSinceUpdate) EventSystem.Dispatch(EventID.UI_HeroBreak_BreakSuccess, MDL.HeroSelect.curSelectHeroID) UIManager.OpenView(Const_UI_Lua.UIEnum.UIHeroBreakSuccess, {MDL.HeroSelect.curSelectHeroID}) self:StopRepeatFunc(self.OnUpdateFun) UIUtils.SetActive(self.btn_Block.gameObject, false) end function UIHeroBreak:RefreshPanel() local heroId = MDL.HeroSelect.curSelectHeroID local heroStar = MDL.HeroStar.GetHeroStarLevel(heroId) local heroStage = MDL.HeroStar.GetHeroStageLevel(heroId) self:RefreshTitle(heroId, heroStar) self:SetStageIcon(heroId, heroStage) self:RefreshStar(heroId, heroStar + 1) self:RefreshStageInfo(heroId, heroStage + 1) self:RefreshDevelopEffectInfo(heroId, heroStar + 1) self:RefreshCostMaterial(heroId) local isShowRp = CTL.HeroStar.IsHeroCanBreakthrough(heroId) if MDL.Player.HeroIsLineUp(heroId) then self.btn_Break:SetRedPoint(isShowRp) UIUtils.SetActive(self.img_YelPoint, false) else UIUtils.SetActive(self.img_YelPoint, isShowRp) self.btn_Break:SetRedPoint(false) end -- 万能碎片HUD local heroData = DataSheetManager.HeroNum:GetDataByID(heroId) if heroData.HeroQuality == LuaConst.QualityColor.Gold then UIUtils.SetActive(self.currency_Info, true) CTL.Currency.OpenCurrencyPanel(self.__viewClassPath, self.currency_Info, {goldHeroFragmentItemID}) elseif heroData.HeroQuality == LuaConst.QualityColor.DarkGold then UIUtils.SetActive(self.currency_Info, true) CTL.Currency.OpenCurrencyPanel(self.__viewClassPath, self.currency_Info, {superGoldHeroFragmentItemID}) else UIUtils.SetActive(self.currency_Info, false) end end function UIHeroBreak:RefreshTitle(heroId, heroStar) UIUtils.SetLabel(self.txt_OldStar, string.FormatByIdsId(Const_IDS.IDS_HeroStarLevel, heroStar)) UIUtils.SetLabel(self.txt_NewStar, string.FormatByIdsId(Const_IDS.IDS_HeroStarLevel, heroStar + 1)) if CTL.HeroStar.IsHeroReachMaxStar(heroId) then UIUtils.SetActive(self.txt_NewStar, false) UIUtils.SetActive(self.img_Arrow, false) else UIUtils.SetActive(self.txt_NewStar, true) UIUtils.SetActive(self.img_Arrow, true) end end function UIHeroBreak:SetStageIcon(heroId, heroStage) if CTL.HeroStar.IsHeroReachMaxStar(heroId) then heroStage = #self.group_Stage end for i, v in ipairs(self.group_Stage) do if i > heroStage then v.effect_Stage:StopUIEffect() else v.effect_Stage:PlayUIEffect() end if i == heroStage + 1 then self.group_StageTitle.transform:SetParent(self.group_Stage[i].gameObject.transform, false) end end end local AttrColor = "70c664" function UIHeroBreak:RefreshStageInfo(heroId, nextHeroStage) local maxStage = MDL.HeroStar.GetHeroMaxStageLevel(heroId) if CTL.HeroStar.IsHeroReachMaxStar(heroId) or nextHeroStage == maxStage then UIUtils.SetActive(self.effect_Star.gameObject, true) self.group_StageAttr.transform:SetParent(self.group_StageTitle, false) UIUtils.SetActive(self.group_StageTitle, false) elseif nextHeroStage < maxStage then UIUtils.SetActive(self.effect_Star.gameObject, false) self.group_StageAttr.transform:SetParent(self.group_Stage[nextHeroStage].gameObject.transform, false) local stageAttr = MDL.HeroStar.GetHeroSpecificStageUpAttr(heroId, nextHeroStage) UIUtils.SetLabel(self.txt_StageAttr, UIUtils.GetLocalizedTxt(Const_IDS[stageAttr.AttrName])..UTL.Color.FormatTextByColor(AttrColor, "+"..stageAttr.AttrNum)) UIUtils.SetActive(self.group_StageTitle, true) end end function UIHeroBreak:RefreshStar(heroId, nextHeroStar) if CTL.HeroStar.IsHeroReachMaxStar(heroId) then UIUtils.SetActive(self.group_StarTitle.gameObject, false) else UIUtils.SetActive(self.group_StarTitle.gameObject, true) UIUtils.SetLabel(self.txt_StarNum, string.FormatByIdsId(Const_IDS.IDS_HeroStarLevel, nextHeroStar)) end end function UIHeroBreak:RefreshDevelopEffectInfo(heroId, nextHeroStar) local maxStar = MDL.HeroStar.GetHeroMaxStarLevel(heroId) if nextHeroStar > maxStar then nextHeroStar = maxStar end local starData = DataSheetManager.HeroStar:GetDataByHeroID_Star(heroId, nextHeroStar) self.txt_TitleInfo01.text = string.FormatByIdsId(Const_IDS.IDS_Horse_Star_8, nextHeroStar) if starData.StarType == LuaConst.UIBreakStarType.Attrs then self.States:SetState(1) for i, comp in ipairs(self.State2) do local attrTxt = CTL.HeroStar.GetHeroBreakAttrText(heroId, nextHeroStar)[i] UIUtils.SetLabel(comp, attrTxt) end else self.States:SetState(0) self.developEffectID = starData.DevelopEffectID local developEffectData = DataSheetManager.DevelopEffectData:GetDataByID(self.developEffectID) local iconPath = ConstAssetPathConfig.skillPath.. developEffectData.Icon..".png" UIUtils.SetImageByAssetBundle(self.group_Skill.img_Skill, iconPath) local name, desc = MDL.HeroStar.GetTalentNameAndDesc(self.developEffectID) local level = MDL.HeroStar.GetHeroTalentLevel(heroId, self.developEffectID) UIUtils.SetLabel(self.txt_SkillName, name) if level > 1 then -- 天赋为待升级状态 UIUtils.SetLabelText(self.txt_BigSkill, Const_IDS["IDS_TalentSkill_HeroStarHint4"]) UIUtils.SetActive(self.txt_LevelUnlock, false) UIUtils.SetActive(self.group_Level, true) UIUtils.SetLabel(self.txt_Current, string.FormatByIdsId(Const_IDS["IDS_HeroBreakThough_From_Level"], level - 1)) UIUtils.SetLabel(self.txt_Next, string.FormatByIdsId(Const_IDS["IDS_HeroBreakThough_To_Level"], level)) else -- 天赋解锁 UIUtils.SetLabelText(self.txt_BigSkill, Const_IDS["IDS_TalentSkill_HeroStarHint3"]) UIUtils.SetActive(self.txt_LevelUnlock, true) UIUtils.SetActive(self.group_Level, false) UIUtils.SetLabel(self.txt_LevelUnlock, string.FormatByIdsId(Const_IDS["IDS_HeroBreakThough_From_Level"], level)) end end end function UIHeroBreak:RefreshCostMaterial(heroId) if CTL.HeroStar.IsHeroReachMaxStar(heroId) then self.obj_FullState:SetState(1) local heroNumData = DataSheetManager.HeroNum:GetDataByID(heroId) local count = MDL.Bag.GetItemCount(heroNumData.PieceItem) or 0 UTL.Item.SetItemCell(self.obj_fullItem, heroNumData.PieceItem, count) for i, v in ipairs(self.group_Item) do UIUtils.SetActive(v.gameObject, false) end else self.obj_FullState:SetState(0) local costItemInfo = MDL.HeroStar.GetHeroBreakthroughRequireItem(heroId) if costItemInfo then for i, v in ipairs(self.group_Item) do if not costItemInfo[i] then UIUtils.SetActive(v.gameObject, false) else UIUtils.SetActive(v.gameObject, true) local count = MDL.Bag.GetItemCount(costItemInfo[i].ItemID) or 0 if count >= costItemInfo[i].ItemNum then count = UTL.String.GetCountStr(count).."/"..UTL.String.GetCountStr(costItemInfo[i].ItemNum) else count = UTL.Color.FormatRedColor(UTL.String.GetCountStr(count)).."/"..UTL.String.GetCountStr(costItemInfo[i].ItemNum) end UTL.Item.SetItemCell(v.item, costItemInfo[i].ItemID, count) end end end end end function UIHeroBreak:OnButtonClicked(comp) local heroId = MDL.HeroSelect.curSelectHeroID if comp == self.btn_close then self:CloseView() elseif comp == self.btn_Break then if not CTL.HeroStar.IsBreakthroughMaterialEnough(heroId) then local heroData = DataSheetManager.HeroNum:GetDataByID(heroId) if heroData and (heroData.HeroQuality == LuaConst.QualityColor.Gold or heroData.HeroQuality == LuaConst.QualityColor.DarkGold) then local requireMaterial = MDL.HeroStar.GetHeroBreakthroughRequireItem(heroId) local bag1Count = MDL.Bag.GetItemCount(requireMaterial[1].ItemID) if bag1Count < requireMaterial[1].ItemNum then if requireMaterial[2] then local bag2Count = MDL.Bag.GetItemCount(requireMaterial[2].ItemID) if bag2Count >= requireMaterial[2].ItemNum then if self:OnHeroFragmentExchange(heroData, requireMaterial, bag1Count) then return end end else if self:OnHeroFragmentExchange(heroData, requireMaterial, bag1Count) then return end end end end CTL.Tips.AddTipsMsg(Const_IDS["IDS_HeroStar_NotEngouh"]) return end MDL.HeroStar.HeroBreakthroughRequest(heroId) elseif comp == self.btn_Enlarge then UIManager.OpenView(Const_UI_Lua.UIEnum.UIHeroBreakInfoView, {heroId = heroId}) elseif comp == self.btn_Info then UIManager.OpenView(Const_UI_Lua.UIEnum.UICommonNoteView, {id = LuaConst.NoteID.HeroStar}) elseif comp == self.group_Skill.btn_Skill then self.PassiveSkillTips:CloseAll() self.PassiveSkillTips:OpenView(GetViewClass(Const_UI_Lua.UIEnum.UIHeroBreakTalentSkillTips), {talentId = self.developEffectID, parentTf = self.PassiveSkillTips.transform, heroId = heroId, talentType = CTL.Tips.TalentType.HeroStarTalent}, "Common/UITalentSkillTips") elseif comp == self.btn_Resonance then UIManager.OpenView(Const_UI_Lua.UIEnum.UIResonanceInfo, {subResonanceID = resonance_info.Hero_Break, isShowGoto = false}) elseif comp == self.obj_fullItem.event_Click then local heroNumData = DataSheetManager.HeroNum:GetDataByID(heroId) UTL.ItemTips.ShowCommonTipsById(heroNumData.PieceItem) elseif comp == self.btn_Return then EventSystem.Dispatch(EventID.UI_HeroAwaken_ReturnBreak, false) elseif comp == self.btn_FullBreak then CTL.Reborn.OpenRecycleFragmentView() else for i, v in ipairs(self.group_Item) do if comp == v.item.event_Click then UTL.ItemTips.ShowCommonTipsById(MDL.HeroStar.GetHeroBreakthroughRequireItem(heroId)[i].ItemID) return end end end end --function UIHeroBreak:ShowMiddleAttr(index) -- if self.isMaxStar then -- --满突破时,读上一突破的属性 -- local starConfig = DataSheetManager.TreasureStar:GetDataByTreasureID_Star(self.treasureData.TreasureID, self.StarConfig.Star - 1) -- local attrStr = CTL.Treasure.GetAttrItemShow(starConfig, index) -- UIUtils.SetActive(self.group_StageTitle.gameObject, true) -- self.group_StageTitle.transform:SetParent(self.group_UnStage[index].transform, false) -- UIUtils.SetLabel(self.txt_StageAttr, attrStr) -- else -- local attrStr = CTL.Treasure.GetAttrItemShow(self.StarConfig, index) -- if index == #self.StarConfig.AttrRepeat then -- UIUtils.SetActive(self.group_StageTitle.gameObject, false) -- UIUtils.SetLabel(self.txt_StarNum, attrStr) -- else -- local activeInfo = MDL.Treasure.GetTreasureInfo(self.treasureData.TreasureID) -- UIUtils.SetLabel(self.txt_StarNum, UTL.Color.FormatTextByColor(Color_Break, string.FormatByIdsId(Const_IDS.IDS_Horse_Star_2, activeInfo.TreasureInfo.starLevel + 1))) -- UIUtils.SetActive(self.group_StageTitle.gameObject, true) -- self.group_StageTitle.transform:SetParent(self.group_UnStage[index].transform, false) -- UIUtils.SetLabel(self.txt_StageAttr, attrStr) -- end -- end --end ---一共有6个阶段,但是只能点击前5个阶段显示属性 function UIHeroBreak:OnPointerDown(comp, eventData) local heroId = MDL.HeroSelect.curSelectHeroID if CTL.HeroStar.IsHeroReachMaxStar(heroId) then return end local heroStage = MDL.HeroStar.GetHeroStageLevel(heroId) local maxStage = MDL.HeroStar.GetHeroMaxStageLevel(heroId) local index = nil for i, v in ipairs(self.group_Stage) do if v.img_Stage == comp then index = i --现在点到的是第几个球(阶段 break end end if CTL.HeroStar.IsHeroReachMaxStar(heroId) or heroStage + 1 == maxStage then --如果是第六个阶段,因为特效原因,需要做一些特殊处理 self.group_StageAttr.transform:SetParent(self.group_Stage[index].gameObject.transform, false) local stageAttr = MDL.HeroStar.GetHeroSpecificStageUpAttr(heroId, index) UIUtils.SetLabel(self.txt_StageAttr, UIUtils.GetLocalizedTxt(Const_IDS[stageAttr.AttrName])..UTL.Color.FormatTextByColor(AttrColor, "+"..stageAttr.AttrNum)) else self:RefreshStageInfo(heroId, index) end end function UIHeroBreak:OnPointerUp(comp, eventData) local heroId = MDL.HeroSelect.curSelectHeroID local heroStage = MDL.HeroStar.GetHeroStageLevel(heroId) self:RefreshStageInfo(heroId, heroStage + 1) end -- 万能碎片兑换 function UIHeroBreak:OnHeroFragmentExchange(heroData, requireMaterial, bag1Count) local fragmentItemID if heroData.HeroQuality == LuaConst.QualityColor.Gold then -- 金将万能碎片 fragmentItemID = goldHeroFragmentItemID elseif heroData.HeroQuality == LuaConst.QualityColor.DarkGold then -- 彩金将万能碎片 fragmentItemID = superGoldHeroFragmentItemID end if MDL.Bag.GetItemCount(fragmentItemID) > 0 then -- 兑换弹窗 UIManager.OpenView(Const_UI_Lua.UIEnum.UICommonExchange, {costItemId = fragmentItemID, giveItemId = requireMaterial[1].ItemID, needCount = requireMaterial[1].ItemNum - bag1Count}) return true end return false end return UIHeroBreak