local HeroStrenthen_Controller = {} local private = {} local EventSystem = require('Event/EventSystem') function HeroStrenthen_Controller.OnStartup() end function HeroStrenthen_Controller.JumpToHeroStrenthen() local rightHeroId = 0 MDL.HeroSelect.SortHeroOrder() local heroList = MDL.HeroSelect.GetSortedHeroData() for _, heroData in ipairs(heroList) do if MDL.HeroSelect.IsHasHero(heroData.ID) then if CTL.HeroStrenthen.CalculateAllRedPoint(heroData.ID) then rightHeroId = heroData.ID break end end end if rightHeroId == 0 then for _, heroData in ipairs(heroList) do if MDL.HeroSelect.IsHasHero(heroData.ID) then rightHeroId = heroData.ID break end end end MDL.HeroSelect.curSelectHeroID = rightHeroId UIManager.OpenAndPushAll(Const_UI_Lua.UIEnum.UIHeroShowPanel, {subViewName = MDL.HeroSelect.ToggleViewNameList.Strenthen}) end function HeroStrenthen_Controller.GetCurAndMaxAttrNum(heroId, nurturingType) local nurturingNum = MDL.HeroStrenthen.GetStrenthenNurturingNum(heroId, nurturingType) local curLevel = MDL.HeroStrenthen.GetStrengthenLevel(heroId) local curData = MDL.HeroStrenthen.GetStrenthenNurturingData(heroId, nurturingType, curLevel) local lastData = MDL.HeroStrenthen.GetStrenthenNurturingData(heroId, nurturingType, curLevel - 1) local attrNum, attrTotalNum = 0, 0 if curData then attrNum = curData.AttrAddNum * nurturingNum attrTotalNum = curData.AttrTotalNum end -- 当前阶段 加上上一阶段的最大值 if lastData then attrNum = attrNum + lastData.AttrTotalNum end return attrNum, attrTotalNum end function HeroStrenthen_Controller.GetReachMaxAttrNum(heroId) local num = 0 for _, nurturingType in pairs(MDL.HeroStrenthen.NurturingType) do local attrNum, attrTotalNum = CTL.HeroStrenthen.GetCurAndMaxAttrNum(heroId, nurturingType) if attrNum >= attrTotalNum then num = num + 1 end end return num end function HeroStrenthen_Controller.GetRebornMaterialList(heroId) local materialList = {} local curLevel = MDL.HeroStrenthen.GetStrengthenLevel(heroId) if curLevel and curLevel > 0 then -- 先计算当前等级的消耗 for _, nurturingType in pairs(MDL.HeroStrenthen.NurturingType) do local nurturingNum = MDL.HeroStrenthen.GetStrenthenNurturingNum(heroId, nurturingType) local curData = MDL.HeroStrenthen.GetStrenthenNurturingData(heroId, nurturingType, curLevel) for _, item in ipairs(curData.Item_Table) do private.SetMaterialList(materialList, item.ItemID, item.ItemNum * nurturingNum) end end -- 再计算之前等级的消耗 for i = curLevel - 1, 0, -1 do local heroStrenthenData = MDL.HeroStrenthen.GetHeroStrenthenData(heroId, i) -- 力消耗 local success, strenthenAttrData = DataSheetManager.StrenthenAttr:TryGetDataByID(heroStrenthenData.StrenthenAttrID1) if success then local lastAttrTotalNum = 0 local lastNurturingData = MDL.HeroStrenthen.GetStrenthenNurturingData(heroId, MDL.HeroStrenthen.NurturingType.Power, i - 1) if lastNurturingData then lastAttrTotalNum = lastNurturingData.AttrTotalNum end local num = (strenthenAttrData.AttrTotalNum - lastAttrTotalNum) / strenthenAttrData.AttrAddNum for _, item in ipairs(strenthenAttrData.Item_Table) do private.SetMaterialList(materialList, item.ItemID, item.ItemNum * num) end end -- 体消耗 success, strenthenAttrData = DataSheetManager.StrenthenAttr:TryGetDataByID(heroStrenthenData.StrenthenAttrID2) if success then local lastAttrTotalNum = 0 local lastNurturingData = MDL.HeroStrenthen.GetStrenthenNurturingData(heroId, MDL.HeroStrenthen.NurturingType.Physical, i - 1) if lastNurturingData then lastAttrTotalNum = lastNurturingData.AttrTotalNum end local num = (strenthenAttrData.AttrTotalNum - lastAttrTotalNum) / strenthenAttrData.AttrAddNum for _, item in ipairs(strenthenAttrData.Item_Table) do private.SetMaterialList(materialList, item.ItemID, item.ItemNum * num) end end -- 技消耗 success, strenthenAttrData = DataSheetManager.StrenthenAttr:TryGetDataByID(heroStrenthenData.StrenthenAttrID3) if strenthenAttrData then local lastAttrTotalNum = 0 local lastNurturingData = MDL.HeroStrenthen.GetStrenthenNurturingData(heroId, MDL.HeroStrenthen.NurturingType.Skill, i - 1) if lastNurturingData then lastAttrTotalNum = lastNurturingData.AttrTotalNum end local num = (strenthenAttrData.AttrTotalNum - lastAttrTotalNum) / strenthenAttrData.AttrAddNum for _, item in ipairs(strenthenAttrData.Item_Table) do private.SetMaterialList(materialList, item.ItemID, item.ItemNum * num) end end -- 本身消耗 for _, item in ipairs(heroStrenthenData.Item_Table) do private.SetMaterialList(materialList, item.ItemID, item.ItemNum) end end end return materialList end function HeroStrenthen_Controller.CalculateAllRedPoint(heroId) -- 未解锁不显示红点 if not MDL.Unlock.IsUnlock(MDL.Unlock.FunctionType.HeroStrenthen) then return false end local isRedPoint = CTL.HeroStrenthen.CalculateStrenthenRedPoint(heroId) if not isRedPoint then for _, nurturingType in pairs(MDL.HeroStrenthen.NurturingType) do if HeroStrenthen_Controller.CalculateNurturingRedPoint(heroId, nurturingType) then isRedPoint = true break end end end return isRedPoint end -- 魂是否有红点 function HeroStrenthen_Controller.CalculateStrenthenRedPoint(heroId) if MDL.HeroStrenthen.IsReachMaxStrengthenLevel(heroId) then return false else local reachMaxAttrNum = HeroStrenthen_Controller.GetReachMaxAttrNum(heroId) local allNurturingNum = table.getDictCount(MDL.HeroStrenthen.NurturingType) if reachMaxAttrNum == allNurturingNum then local curLevel = MDL.HeroStrenthen.GetStrengthenLevel(heroId) local nextStrenthenData = MDL.HeroStrenthen.GetHeroStrenthenData(heroId, curLevel + 1) if MDL.HeroStar.GetHeroStarLevel(heroId) < nextStrenthenData.HeroStarLimit then return false else local curStrenthenData = MDL.HeroStrenthen.GetHeroStrenthenData(heroId, curLevel) for _, item in ipairs(curStrenthenData.Item_Table) do local count = MDL.Bag.GetItemCount(item.ItemID) if count < item.ItemNum then return false end end return true end else return false end end end -- 对应type的力、体、技是否有红点 function HeroStrenthen_Controller.CalculateNurturingRedPoint(heroId, nurturingType) if MDL.HeroStrenthen.IsReachMaxStrengthenLevel(heroId) then return false else local attrNum, attrTotalNum = HeroStrenthen_Controller.GetCurAndMaxAttrNum(heroId, nurturingType) if attrNum == attrTotalNum then return false else local curLevel = MDL.HeroStrenthen.GetStrengthenLevel(heroId) local nurturingData = MDL.HeroStrenthen.GetStrenthenNurturingData(heroId, nurturingType, curLevel) if not nurturingData then return false end for _, item in ipairs(nurturingData.Item_Table) do local count = MDL.Bag.GetItemCount(item.ItemID) if count < item.ItemNum then return false end end return true end end end function private.SetMaterialList(materialList, itemId, itemCount) local materialData = nil for _, data in ipairs(materialList) do if data.ItemID == itemId then materialData = data end end if materialData then materialData.ItemNum = materialData.ItemNum + itemCount else table.insert(materialList, {ItemID = itemId, ItemNum = itemCount}) end end return HeroStrenthen_Controller