local HeroSelect_Controller = {} local private = {} local EventSystem = require('Event/EventSystem') HeroSelect_Controller.HeroSelectRpEventId = { TownHome = "HeroSelect_TownHome", HeroSelf = "HeroSelect_HeroSelf", HeroUpgrade = "HeroSelect_HeroUpgrade", } HeroSelect_Controller.HeroUpgradeType = { LevelUp = 1, Advance = 2, Break = 3, Active = 4, HeroAppearance = 5, Strenthen = 6,-- 修炼 } local CountryImgPathTemplate = "zr_msz_%s.png" local heroAppearanceViewToHeroShow = false function HeroSelect_Controller.OnStartup() EventSystem.Regist(EventID.BagItem_Update, private.RefreshRedPoint) EventSystem.Regist(EventID.TeamLevelUpdate, private.RefreshRedPoint) EventSystem.Regist(EventID.AcquireSystemRedAfterUnlock, private.InitHeroSelectRedTree) EventSystem.Regist(EventID.UI_RefreshAdvancedInfo, private.RefreshRedPoint) EventSystem.Regist(EventID.UI_RefreshCurrency, private.RefreshRedPoint) EventSystem.Regist(EventID.UI_LightEffect_Refresh, private.RefreshRedPoint) EventSystem.Regist(EventID.UI_HeroAwaken_UpdateTaskInfo, private.RefreshRedPoint) EventSystem.Regist(EventID.UI_HeroAwaken_UpdateHeroSkillPoint, private.RefreshRedPoint) EventSystem.Regist(EventID.UI_HeroAwaken_NoticeEnableAwake, private.RefreshRedPoint) private.BagExp = 0 end function private.RefreshRedPoint() CTL.RedPoint.AddOneRedPointFunc(private.RealRefreshRedPoint) end function private.RealRefreshRedPoint() HeroSelect_Controller.RefreshFormationHeroRedPoint() HeroSelect_Controller.RefreshHeroSelectRedPoint() private.RefreshHeroSelectRedTree() end function HeroSelect_Controller.RefreshFormationHeroRedPoint() for i,v in ipairs(MDL.HeroSelect.GetSortedHeroData()) do if CTL.Formation.IsHeroInFormation(v.ID) and HeroSelect_Controller.IsHeroCanUpgradeByFormation(v.ID) then CTL.RedPoint.AddRedPoint(CTL.RedPoint.RedPointKey.Formation_Hero) return end end CTL.RedPoint.RemoveRedPoint(CTL.RedPoint.RedPointKey.Formation_Hero) end function HeroSelect_Controller.RefreshHeroSelectRedPoint() for i,v in ipairs(MDL.HeroSelect.GetSortedHeroData()) do if HeroSelect_Controller.IsHeroCanUpgrade(v.ID) and not HeroSelect_Controller.IsSkipHeroRedPoint(v.ID) then CTL.RedPoint.AddRedPoint(CTL.RedPoint.RedPointKey.HeroBtn_HeroSelect) return end end CTL.RedPoint.RemoveRedPoint(CTL.RedPoint.RedPointKey.HeroBtn_HeroSelect) end --region *************** 主界面武将按钮红点 **************** function private.InitHeroSelectRedTree() local townRoot = MDL.RedPoint.AddRootRpNode(HeroSelect_Controller.HeroSelectRpEventId.TownHome) for i, v in DataSheetManager.HeroNum:GetEnumerator() do local heroId = v.ID local heroNode = townRoot:AddChildRpNode(HeroSelect_Controller.HeroSelectRpEventId.HeroSelf, heroId, {heroId = heroId}) local isHasHero = MDL.HeroSelect.IsHasHero(heroId) ---武将突破 local isCanBreak = isHasHero and CTL.HeroStar.IsHeroCanBreakthrough(heroId) heroNode:AddChildRpNode(HeroSelect_Controller.HeroSelectRpEventId.HeroUpgrade, HeroSelect_Controller.HeroUpgradeType.Break, {heroId = heroId, type = HeroSelect_Controller.HeroUpgradeType.Break}, {heroId, HeroSelect_Controller.HeroUpgradeType.Break}, isCanBreak) ---武将激活 local isCanActive = MDL.HeroSelect.IsHeroCanActive(heroId) heroNode:AddChildRpNode(HeroSelect_Controller.HeroSelectRpEventId.HeroUpgrade, HeroSelect_Controller.HeroUpgradeType.Active, {heroId = heroId, type = HeroSelect_Controller.HeroUpgradeType.Active}, {heroId, HeroSelect_Controller.HeroUpgradeType.Active}, isCanActive) ---武将外观红点 local isAppearanceRP = isHasHero and (CTL.Appearance.IsShowAppearanceRedPoint(heroId) or CTL.LightEffect.IsShowLightEffectRedPoint(heroId)) -- 时装红点 -- 光效红点 heroNode:AddChildRpNode(HeroSelect_Controller.HeroSelectRpEventId.HeroUpgrade, HeroSelect_Controller.HeroUpgradeType.HeroAppearance, {heroId = heroId, type = HeroSelect_Controller.HeroUpgradeType.HeroAppearance}, {heroId, HeroSelect_Controller.HeroUpgradeType.HeroAppearance}, isAppearanceRP) -- 武将修炼红点 local isStrenthenRP = isHasHero and CTL.HeroStrenthen.CalculateAllRedPoint(heroId) heroNode:AddChildRpNode(HeroSelect_Controller.HeroSelectRpEventId.HeroUpgrade, HeroSelect_Controller.HeroUpgradeType.Strenthen, {heroId = heroId, type = HeroSelect_Controller.HeroUpgradeType.Strenthen}, {heroId, HeroSelect_Controller.HeroUpgradeType.Strenthen}, isStrenthenRP) end MDL.RedPoint.InitAllNodes(HeroSelect_Controller.HeroSelectRpEventId.TownHome) private.RefreshRedPoint() end -- 刷新武将红点 function private.RefreshHeroSelectRedTree() for i, v in DataSheetManager.HeroNum:GetEnumerator() do local heroId = v.ID local isHasHero = MDL.HeroSelect.IsHasHero(heroId) ---武将突破节点 local isCanBreak = isHasHero and CTL.HeroStar.IsHeroCanBreakthrough(heroId) MDL.RedPoint.UpdateNodeStateByLogicParams(isCanBreak, HeroSelect_Controller.HeroSelectRpEventId.TownHome, heroId, HeroSelect_Controller.HeroUpgradeType.Break) ---武将激活节点 local isCanActive = MDL.HeroSelect.IsHeroCanActive(heroId) MDL.RedPoint.UpdateNodeStateByLogicParams(isCanActive, HeroSelect_Controller.HeroSelectRpEventId.TownHome, heroId, HeroSelect_Controller.HeroUpgradeType.Active) ---武将外观节点 local isAppearanceRP = isHasHero and (CTL.Appearance.IsShowAppearanceRedPoint(heroId) or CTL.LightEffect.IsShowLightEffectRedPoint(heroId)) -- 时装红点 -- 光效红点 MDL.RedPoint.UpdateNodeStateByLogicParams(isAppearanceRP, HeroSelect_Controller.HeroSelectRpEventId.TownHome, heroId, HeroSelect_Controller.HeroUpgradeType.HeroAppearance) -- 武将修炼 local isStrenthenRP = isHasHero and CTL.HeroStrenthen.CalculateAllRedPoint(heroId) MDL.RedPoint.UpdateNodeStateByLogicParams(isStrenthenRP, HeroSelect_Controller.HeroSelectRpEventId.TownHome, heroId, HeroSelect_Controller.HeroUpgradeType.Strenthen) end end --endregion *************** 主界面武将按钮红点 **************** -- 养成按钮红点 function HeroSelect_Controller.IsHeroCanUpgradeByFormation(id) if MDL.HeroSelect.IsHasHero(id) then return CTL.HeroStar.IsHeroCanBreakthrough(id) or HeroSelect_Controller.IsBagExpEnoughLevelUp(id) or (MDL.Advanced.IsHeroCanAdvance(id) or MDL.Advanced.IsHeroCanGatherToAdvance(id)) or MDL.HeroSelect.IsCanRankUp(id) -- 进爵红点 or CTL.Appearance.IsShowAppearanceRedPoint(id) -- 时装红点 or CTL.LightEffect.IsShowLightEffectRedPoint(id) -- 光效红点 or CTL.HeroStrenthen.CalculateAllRedPoint(id) -- 修炼红点 or CTL.HeroAwaken.CheckAwakenRed(id) -- 觉醒红点 or CTL.HeroAwaken.CheckHeroSkillRed(id) -- 天资红点 end return false end function HeroSelect_Controller.IsHeroCanUpgrade(id) if MDL.HeroSelect.IsHasHero(id) then if CTL.HeroStar.IsHeroCanBreakthrough(id) then return true end -- 武将修炼 if CTL.HeroStrenthen.CalculateAllRedPoint(id) then return true end else if MDL.HeroSelect.IsHeroCanActive(id) then return true end end -- 武将外观红点(时装、光效) if CTL.Appearance.IsShowAppearanceRedPoint(id) or CTL.LightEffect.IsShowLightEffectRedPoint(id) then return true end return false end function HeroSelect_Controller.IsBagExpEnoughLevelUp(id) if MDL.Unlock.IsUnlock(MDL.Unlock.FunctionType.HeroLevelUp) then HeroSelect_Controller.CalculateTotalExpInBag() if not MDL.HeroSelect.IsHeroCanLevelUp(id) or not MDL.Player.HeroIsLineUp(id) then return false end local exp = MDL.HeroSelect.GetHeroExp(id) local nextLevelExp = MDL.HeroSelect.GetHeroNextLevelExp(id) if (nextLevelExp - exp) <= private.BagExp then return true end end return false end function HeroSelect_Controller.CalculateTotalExpInBag() local totalExp = 0 for _, itemData in DataSheetManager.HeroLevelMaterial:GetEnumerator() do local itemId = itemData.ItemID local itemCount = MDL.Bag.GetItemCount(itemId) totalExp = totalExp + (itemCount * itemData.ProvideExp) end private.BagExp = totalExp end function HeroSelect_Controller.GetHeroIdByFuJiangRelate(id) for k,v in DataSheetManager.HeroData:GetEnumerator() do if v.FuJiangRelate == id then return v.ID end end return id end function HeroSelect_Controller.CalculateHeroBasicGs(hp, atk, def) local gs = hp * DataSheetManager.AttrData:GetDataByID(LuaConst.AttrTypeId.hplmt).GSParam + atk * DataSheetManager.AttrData:GetDataByID(LuaConst.AttrTypeId.atk).GSParam + def * DataSheetManager.AttrData:GetDataByID(LuaConst.AttrTypeId.def).GSParam return math.ceil(gs) end function private.SortRule(a, b) local lev_a = MDL.HeroSelect.GetRelationLev(a.HeroID, a.ID) local lev_b = MDL.HeroSelect.GetRelationLev(b.HeroID, b.ID) if lev_a == lev_b then return a.ID < b.ID end return lev_a > lev_b end function HeroSelect_Controller.UpdateSortedRelationList(heroId, relationList) table.clearArray(relationList) for i, v in DataSheetManager.HeroRelation:GetEnumerator() do if v.Level == 1 and v.HeroID == heroId then local isAllRelationHeroOpen = true for _, activateHeroID in ipairs(v.Activation) do if not MDL.HideGolden.IsShowGoldenByID(LuaConst.ShowGoldenType.Hero, activateHeroID) then isAllRelationHeroOpen = false break end end if isAllRelationHeroOpen then table.insert(relationList, v) end end end table.sort(relationList, private.SortRule) end function HeroSelect_Controller.OpenRelationPopup(infos, titleIDS) local vo = { infoArray = infos, titleIDS = titleIDS } if UIManager.IsFocus(Const_UI_Lua.UIEnum.UITownHome) == false then --不在主界面触发,需要在抽卡、突破界面获取焦点时弹出 private.relationPopupInfo = vo CTL.HomeMain.AddTownHomeDelayFunc(HeroSelect_Controller.ForceOpenRelationPopup) else UIManager.OpenView(Const_UI_Lua.UIEnum.UIHeroRelationActivePopUp, vo) end end function HeroSelect_Controller.ForceOpenRelationPopup() if private.relationPopupInfo then UIManager.OpenView(Const_UI_Lua.UIEnum.UIHeroRelationActivePopUp, private.relationPopupInfo) private.relationPopupInfo = nil end end function HeroSelect_Controller.PlayHeroQualityEffect(effectComp, heroID, propertyName) local heroData = DataSheetManager.HeroNum:GetDataByID(heroID) UTL.Color.PlayQualityEffect(effectComp, heroData.EffectID, propertyName) end function HeroSelect_Controller.GetHeroNameQuality(heroId) if MDL.HeroAwaken.GetIsHeroAwaken(heroId) then return CTL.HeroAwaken.GetHeroQuality(heroId, true) end local appearanceWearID = MDL.HeroSelect.GetAttrAppearanceIDByHeroID(heroId) if appearanceWearID>0 then local appearanceData = DataSheetManager.HeroAppearance:GetDataByID(appearanceWearID) if appearanceData.HeroQuality>0 then return appearanceData.HeroQuality end end return DataSheetManager.HeroNum:GetDataByID(heroId).HeroQuality end --打开武将表现 function HeroSelect_Controller.ShowHeroExpression(heroId, appearanceId, callBack, callBackParam, isCanSkip) local context = { heroId = heroId, appearanceId = appearanceId, callBack = callBack, callBackParam = callBackParam, isCanSkip = isCanSkip or false, } UIManager.OpenAndPushAll(Const_UI_Lua.UIEnum.UIHeroExpression, context, Const_UI_Lua.UIEnum.UIGachaExpression) end --设置是否从武将皮肤激活界面到武将展示界面 function HeroSelect_Controller.SetIsHeroAppearanceViewToHeroShow(value) heroAppearanceViewToHeroShow = value end function HeroSelect_Controller.GetIsHeroAppearanceViewToHeroShow() return heroAppearanceViewToHeroShow end function HeroSelect_Controller.ShowCV(comp, heroId) local heroData = DataSheetManager.HeroNum:GetDataByID(heroId) local cv if GameAppInfo.IsChinesePackage() then cv = heroData.CVCN elseif GameAppInfo.IsJapanesePackage() then cv = heroData.CVJP end if not string.isNilOrEmpty(cv) then comp.text = string.FormatByIdsKey("IDS_CV_CV", UIUtils.GetLocalizedTxt(Const_IDS[cv])) UIUtils.SetActive(comp, true) else UIUtils.SetActive(comp, false) end end -- 设置武将国别 function HeroSelect_Controller.SetHeroCountry(heroId, uiTemplate) local heroData = DataSheetManager.HeroNum:GetDataByID(heroId) HeroSelect_Controller.SetCountry(heroData.Kingdom, uiTemplate) end function HeroSelect_Controller.SetCountry(Kingdom, uiTemplate) local countryData = DataSheetManager.HeroCountry:GetDataByID(Kingdom) UTL.Item.SetAtlasSprite(uiTemplate.img_Country, "UI_Formation", countryData.Uipath) if uiTemplate.loc_Country.CurState == 0 then UTL.Item.SetLocalizationImage(nil, uiTemplate.img_Country2, string.format(CountryImgPathTemplate, Kingdom)) else UTL.Item.SetLocalizationImage(nil, uiTemplate.img_Country3, string.format(CountryImgPathTemplate, Kingdom)) end end -- 设置属性 function HeroSelect_Controller.SetHeroProfession(heroId, uiTemplate, canClick) uiTemplate.btn_Profession.enabled = canClick local heroData = DataSheetManager.HeroNum:GetDataByID(heroId) local professionData = DataSheetManager.HeroProfession:GetDataByID(heroData.TypeID) UTL.Item.SetAtlasSprite(uiTemplate.img_Profession, "UI_Formation", professionData.IconPath) UTL.Item.SetLocalizationImage(nil, uiTemplate.img_ProfessionIcon, professionData.Icon) end function HeroSelect_Controller.IsSkipHeroRedPoint(heroId) if not MDL.Player.HeroIsLineUp(heroId) then local isActiveRed = CTL.Appearance.CanActiveAppearance(heroId) or CTL.LightEffect.IsShowLightEffectRedPoint(heroId) return not isActiveRed end return false end function HeroSelect_Controller.SetHeroName(heroId, name_local, img_Name, txt_Name) local heroData = DataSheetManager.HeroNum:GetDataByID(heroId) if name_local.CurState == 0 then UIUtils.SetLocalizationImage(img_Name, "UI_HeroName/" .. heroData.HeadImage .. ".png") else UIUtils.SetLabelText(txt_Name, Const_IDS[heroData.NameIDS]) end end function HeroSelect_Controller.GetHeroQualityName(heroId) local heroQuality = HeroSelect_Controller.GetHeroNameQuality(heroId) local heroData = DataSheetManager.HeroNum:GetDataByID(heroId) return UTL.Color.FormatQualityText(UIUtils.GetLocalizedTxt(Const_IDS[heroData.NameIDS]), heroQuality) end function HeroSelect_Controller.IsSuperGoldHero(heroCfgId) local _, heroNumCfg = DataSheetManager.HeroNum:TryGetDataByID(heroCfgId) if heroNumCfg then return heroNumCfg.HeroQuality >= LuaConst.QualityColor.DarkGold end return false end function HeroSelect_Controller.GetHeroIntelligence(heroId) local awakenExtra = CTL.HeroAwaken.GetHeroExtraIntelligence(heroId) local heroData = DataSheetManager.HeroNum:GetDataByID(heroId) local appearanceWearID = MDL.HeroSelect.GetAttrAppearanceIDByHeroID(heroId) if appearanceWearID > 0 then local intelligence = DataSheetManager.HeroAppearance:GetDataByID(appearanceWearID).Intelligence if intelligence > 0 then return intelligence + awakenExtra else return heroData.HeroIntelligence + awakenExtra end else return heroData.HeroIntelligence + awakenExtra end end function HeroSelect_Controller.GetWeaponAppearanceId(heroId, heroAppearanceId) local _, appearanceData = DataSheetManager.HeroAppearance:TryGetDataByID(heroAppearanceId) if appearanceData then return appearanceData.WeaponAppearanceID end return heroId end function HeroSelect_Controller.GetHeroSound(heroId, soundName) local heroWearAppearanceID = MDL.HeroSelect.GetAppearanceIDByHeroID(heroId) if heroWearAppearanceID > 0 then local appearanceData = DataSheetManager.HeroAppearance:GetDataByID(heroWearAppearanceID) if string.isNilOrEmpty(appearanceData[soundName]) == false then return appearanceData[soundName] end end local heroCfg = DataSheetManager.HeroNum:GetDataByID(heroId) return heroCfg[soundName] end return HeroSelect_Controller