using System;
|
using System.Collections;
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
public partial class HeroUIManager : GameSystemManager<HeroUIManager>
|
{
|
|
|
#region 布阵界面
|
public List<string> heroOnTeamSortList { get; private set; } = new List<string>(); //不同上阵的列表排序
|
|
private TeamType m_SelectTeamType = TeamType.Story; //当前选中的是哪个阵容, 布阵相关逻辑使用
|
public TeamType selectTeamType
|
{
|
get { return m_SelectTeamType; }
|
set
|
{
|
if (m_SelectTeamType == value)
|
return;
|
//上一个阵容需要恢复到原状态
|
if (m_SelectTeamType != TeamType.None)
|
{
|
TeamManager.Instance.GetTeam(m_SelectTeamType).RestoreTeam();
|
}
|
|
m_SelectTeamType = value;
|
}
|
}
|
|
public int selectTeamPosJob = 0; //布阵界面 筛选职业
|
public int selectTeamPosCountry = 0; //布阵界面 筛选国家
|
|
public const float clickFlyPosTime = 0.5f; //点击列表中的武将图标时, 飞入布阵的时间
|
|
public event Action<List<int>, int, Vector3> OnTeamPosChangeEvent; //布阵变化 位置,列表的起飞索引,起飞坐标
|
|
|
// 【阵容属性】 - 该阵容所有武将有效
|
// 初始加成 lineupInitAddPer
|
// 升级加成 lineupLVAddPer
|
// 突破加成 lineupBreakLVAddPer
|
// 吞噬加成 lineupStarAddPer
|
// 阵容光环 lineupHaloValue 、 lineupHaloPer
|
|
/// <summary>
|
/// 按队伍汇总上阵属性
|
/// </summary>
|
/// <param name="type"></param>
|
/// <param name="isPreview">true 客户端预览阵容,默认false 服务器阵容</param>
|
/// <returns></returns>
|
public Dictionary<string, int> GetLineupPer(TeamType type, bool isPreview = false)
|
{
|
Dictionary<string, int> lineUPPer = new Dictionary<string, int>()
|
{
|
{"lineupInitAddPer", 0},
|
{"lineupLVAddPer", 0},
|
{"lineupBreakLVAddPer", 0},
|
{"lineupStarAddPer", 0},
|
};
|
|
var team = TeamManager.Instance.GetTeam(type);
|
if (team == null)
|
{
|
return lineUPPer;
|
}
|
TeamHero[] teamHeroes = isPreview ? team.tempHeroes : team.serverHeroes;
|
|
foreach (var teamHero in teamHeroes)
|
{
|
if (teamHero == null)
|
{
|
continue;
|
}
|
var config = HeroQualityConfig.Get(HeroConfig.Get(teamHero.heroId).Quality);
|
lineUPPer["lineupInitAddPer"] += config.InitAddPer;
|
|
HeroInfo hero = HeroManager.Instance.GetHero(teamHero.guid);
|
if (hero == null) continue;
|
lineUPPer["lineupLVAddPer"] += hero.GetLineupLVAddPer();
|
lineUPPer["lineupBreakLVAddPer"] += hero.GetLineupBreakLVAddPer();
|
lineUPPer["lineupStarAddPer"] += hero.GetLineupStarAddPer();
|
|
}
|
return lineUPPer;
|
}
|
|
/// <summary>
|
/// 按队伍获得阵型(国家光环)属性
|
/// </summary>
|
/// <param name="teamType"></param>
|
/// <param name="isPreview">true 客户端预览阵容,默认false 服务器阵容</param>
|
/// <returns></returns>
|
public Dictionary<int, int> GetCountryAttrs(TeamType teamType, bool isPreview = false)
|
{
|
Dictionary<int, int> countryAttrs = new Dictionary<int, int>();
|
Int2 result = GetMaxCountHeroCountry(teamType, isPreview);
|
var lineupconfig = HeroLineupHaloConfig.GetConfig(result.x, result.y);
|
if (lineupconfig != null)
|
{
|
for (int i = 0; i < lineupconfig.AttrIDList.Length; i++)
|
{
|
countryAttrs[lineupconfig.AttrIDList[i]] = lineupconfig.AttrValueList[i];
|
}
|
}
|
|
return countryAttrs;
|
}
|
|
public void SortHeroOnTeamList()
|
{
|
heroOnTeamSortList = HeroManager.Instance.GetHeroGuidList(selectTeamPosJob, selectTeamPosCountry);
|
heroOnTeamSortList.Sort(CmpHeroByTeamType);
|
}
|
|
|
int CmpHeroByTeamType(string guidA, string guidB)
|
{
|
HeroInfo heroA = HeroManager.Instance.GetHero(guidA);
|
HeroInfo heroB = HeroManager.Instance.GetHero(guidB);
|
if (heroA == null || heroB == null)
|
{
|
return 0;
|
}
|
|
var team = TeamManager.Instance.GetTeam(selectTeamType);
|
// 排序规则:上阵>武将等级>突破等级>武将觉醒阶级>武将品质>武将吞噬星级>武将ID
|
bool isInTeamA = team.HasHeroInServer(guidA);
|
bool isInTeamB = team.HasHeroInServer(guidB);
|
if (isInTeamA != isInTeamB)
|
{
|
return isInTeamA ? -1 : 1;
|
}
|
if (heroA.heroLevel != heroB.heroLevel)
|
{
|
return heroA.heroLevel > heroB.heroLevel ? -1 : 1;
|
}
|
if (heroA.breakLevel != heroB.breakLevel)
|
{
|
return heroA.breakLevel > heroB.breakLevel ? -1 : 1;
|
}
|
if (heroA.awakeLevel != heroB.awakeLevel)
|
{
|
return heroA.awakeLevel > heroB.awakeLevel ? -1 : 1;
|
}
|
if (heroA.Quality != heroB.Quality)
|
{
|
return heroA.Quality > heroB.Quality ? -1 : 1;
|
}
|
if (heroA.heroStar != heroB.heroStar)
|
{
|
return heroA.heroStar > heroB.heroStar ? -1 : 1;
|
}
|
|
return heroA.heroId.CompareTo(heroB.heroId);
|
}
|
|
|
|
|
/// <summary>
|
/// 上阵队伍中各个国家的武将数量
|
/// </summary>
|
/// <param name="teamType"></param>
|
/// <param name="isPreview">true 客户端预览阵容,默认false 服务器阵容</param>
|
/// <returns></returns>
|
public Dictionary<HeroCountry, int> GetCountryHeroCountByTeamType(TeamType teamType, bool isPreview = false)
|
{
|
Dictionary<HeroCountry, int> heroCountryCount = new Dictionary<HeroCountry, int>();
|
|
var team = TeamManager.Instance.GetTeam(teamType);
|
if (team == null)
|
{
|
return heroCountryCount;
|
}
|
TeamHero[] teamHeroes = isPreview ? team.tempHeroes : team.serverHeroes;
|
|
for (int i = 0; i < teamHeroes.Length; i++)
|
{
|
if (teamHeroes[i] == null)
|
continue;
|
var country = teamHeroes[i].Country;
|
|
if (!heroCountryCount.ContainsKey(country))
|
{
|
heroCountryCount.Add(country, 1);
|
}
|
else
|
{
|
heroCountryCount[country] += 1;
|
}
|
|
}
|
|
|
return heroCountryCount;
|
}
|
|
/// <summary>
|
/// 获得上阵中武将数量最大的国家和数量
|
/// </summary>
|
/// <param name="teamType"></param>
|
/// <param name="isPreview">true 客户端预览阵容,默认false 服务器阵容</param>
|
/// <returns></returns>
|
public Int2 GetMaxCountHeroCountry(TeamType teamType, bool isPreview = false)
|
{
|
var countryCountDict = GetCountryHeroCountByTeamType(teamType, isPreview);
|
//找到最大的国家和数量
|
HeroCountry country = HeroCountry.None;
|
int maxValue = 0;
|
foreach (var data in countryCountDict)
|
{
|
if (data.Value > maxValue)
|
{
|
country = data.Key;
|
maxValue = data.Value;
|
}
|
}
|
return new Int2((int)country, maxValue);
|
}
|
|
//在不同页签下选AttackType 0 攻击阵容 1 防守阵容
|
public int GetSelectTeamTypeByAttackType(int AttackType)
|
{
|
if (selectTeamType == TeamType.Arena || selectTeamType == TeamType.ArenaDefense)
|
{
|
return AttackType == 0 ? (int)TeamType.Arena : (int)TeamType.ArenaDefense;
|
}
|
|
|
return (int)TeamType.Story;
|
}
|
|
|
public void NotifyOnTeamPosChangeEvent(List<int> posList, int flyIndex, Vector3 startPos)
|
{
|
OnTeamPosChangeEvent?.Invoke(posList, flyIndex, startPos);
|
}
|
|
//推荐阵容
|
public List<string> SelectRecommend()
|
{
|
//推荐阵容的算法逻辑
|
//自动选择优先级:武将等级>突破等级>武将觉醒阶级>武将品质>武将吞噬星级>武将ID
|
var tmpList = HeroManager.Instance.GetHeroGuidList();
|
tmpList.Sort(CmpHeroRecommend);
|
|
|
//推荐最多6个,存在相同heroid,则跳过
|
List<string> selectHeroList = new List<string>();
|
List<int> selectHeroIDList = new List<int>();
|
for (int i = 0; i < tmpList.Count; i++)
|
{
|
if (selectHeroList.Count >= TeamConst.MaxTeamHeroCount)
|
break;
|
|
string guid = tmpList[i];
|
HeroInfo heroInfo = HeroManager.Instance.GetHero(guid);
|
if (selectHeroIDList.Contains(heroInfo.heroId))
|
continue;
|
//如果重复了,跳过
|
if (selectHeroList.Contains(guid))
|
continue;
|
selectHeroList.Add(guid);
|
selectHeroIDList.Add(heroInfo.heroId);
|
}
|
return selectHeroList;
|
}
|
|
|
int CmpHeroRecommend(string guidA, string guidB)
|
{
|
HeroInfo heroA = HeroManager.Instance.GetHero(guidA);
|
HeroInfo heroB = HeroManager.Instance.GetHero(guidB);
|
if (heroA == null || heroB == null)
|
{
|
return 0;
|
}
|
|
// 排序规则:武将等级>突破等级>武将觉醒阶级>武将品质>武将吞噬星级>武将ID
|
if (heroA.heroLevel != heroB.heroLevel)
|
{
|
return heroA.heroLevel > heroB.heroLevel ? -1 : 1;
|
}
|
if (heroA.breakLevel != heroB.breakLevel)
|
{
|
return heroA.breakLevel > heroB.breakLevel ? -1 : 1;
|
}
|
if (heroA.awakeLevel != heroB.awakeLevel)
|
{
|
return heroA.awakeLevel > heroB.awakeLevel ? -1 : 1;
|
}
|
if (heroA.Quality != heroB.Quality)
|
{
|
return heroA.Quality > heroB.Quality ? -1 : 1;
|
}
|
if (heroA.heroStar != heroB.heroStar)
|
{
|
return heroA.heroStar > heroB.heroStar ? -1 : 1;
|
}
|
|
return heroA.heroId.CompareTo(heroB.heroId);
|
}
|
|
|
#endregion
|
|
|
}
|