ArenaDataManager.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. using System;
  2. using System.Collections.Generic;
  3. using FairyGUI;
  4. namespace GFGGame
  5. {
  6. public class ArenaDataManager : SingletonBase<ArenaDataManager>
  7. {
  8. public List<int> ThemeList = new List<int>();//本周主题列表
  9. public string Tag;//本周标签
  10. public int SeasonId = 1;// 赛季id
  11. public int Grade = 1;//本赛季段位
  12. public int Rank = 10000;//本赛季段位内排名
  13. public int HighestGrade = 1;//本赛季最高段位
  14. public int HighestRank = 10000; //本赛最高季段位内排名
  15. public List<FightRoleData> DressupList = new List<FightRoleData>();//我的搭配列表
  16. public List<ArenaTargetData> Targets = new List<ArenaTargetData>();//对手
  17. public ArenaTargetData SelfData = new ArenaTargetData();//自己的排行榜信息
  18. public Dictionary<int, List<ArenaTargetData>> rankDatasDic = new Dictionary<int, List<ArenaTargetData>>();//排行榜数据
  19. public List<ArenaHistoryData> historyDatas = new List<ArenaHistoryData>();//获取竞技场历史记录
  20. public int SelectThemeIndex = 0;//当前选中换装主题(ThemeList)的下标
  21. public int SelectTargetIndex = 0;//当前选中挑战对象的下标
  22. public int CurFightIndex = 0;//当前挑战的为第几场
  23. /// <summary>
  24. /// 是否快速挑战
  25. /// </summary>
  26. /// <value></value>
  27. public bool QuickFight
  28. {
  29. get
  30. {
  31. return StorageDataManager.Instance.GetStorageValue(ConstStorageId.ARENA_QUICK_FIGHT) == 1 ? true : false;
  32. }
  33. set
  34. {
  35. StorageSProxy.ReqSetClientValue(ConstStorageId.ARENA_QUICK_FIGHT, value == true ? 1 : 0).Coroutine();
  36. }
  37. }
  38. public void Clear()
  39. {
  40. DressupList.Clear();
  41. Targets.Clear();
  42. }
  43. /// <summary>
  44. /// 试图更新最高段位、排行数据
  45. /// </summary>
  46. public void TryUpdateHighest()
  47. {
  48. HighestGrade = HighestGrade >= Grade ? HighestGrade : Grade;
  49. HighestRank = HighestRank >= Rank ? HighestRank : Rank;
  50. }
  51. //获取竞技场对手角色战斗数据
  52. public FightRoleData GetArenaRoleData(int index, ArenaTargetData arenaTarget)
  53. {
  54. return arenaTarget.RoleDressupList[index];
  55. }
  56. //获取竞技场机器人战斗数据
  57. public FightRobotData GetArenaRobotData(int index, ArenaTargetData arenaTarget)
  58. {
  59. return arenaTarget.RobotDressupList[index];
  60. }
  61. /// <summary>
  62. /// 获取推荐列表
  63. /// </summary>
  64. /// <param name="scoreType"></param>
  65. /// <param name="tags"></param>
  66. /// <returns></returns>
  67. public List<int> GetRecommentItemList(int scoreType, string[] tags)
  68. {
  69. Dictionary<int, List<int>> itemListDic = new Dictionary<int, List<int>>();
  70. Dictionary<int, List<int>> itemDatasDic = DressUpMenuItemDataManager.ItemDatasBySubTypeDic;
  71. foreach (int subType in itemDatasDic.Keys)
  72. {
  73. if (itemDatasDic.Count == 0) continue;
  74. List<int> dressList = SortDressList(itemDatasDic[subType], scoreType, tags);
  75. int max = subType == (int)ConstDressUpItemType.TE_SHU ? 3 : 1;
  76. max = Math.Min(max, dressList.Count);
  77. itemListDic[subType] = dressList.GetRange(0, max);
  78. }
  79. if (itemListDic.ContainsKey(ConstDressUpItemType.LIAN_YI_QUN) && itemListDic.ContainsKey(ConstDressUpItemType.SHANG_YI) && itemListDic.ContainsKey(ConstDressUpItemType.XIA_ZHUANG))
  80. {
  81. bool hasTagLYQ = ItemDataManager.CheckItemTagsRight(itemListDic[ConstDressUpItemType.LIAN_YI_QUN][0], tags);
  82. bool hasTagSY = ItemDataManager.CheckItemTagsRight(itemListDic[ConstDressUpItemType.SHANG_YI][0], tags);
  83. bool hasTagXZ = ItemDataManager.CheckItemTagsRight(itemListDic[ConstDressUpItemType.XIA_ZHUANG][0], tags);
  84. if (hasTagLYQ && !hasTagSY && !hasTagXZ)
  85. {
  86. itemListDic.Remove(ConstDressUpItemType.SHANG_YI);
  87. itemListDic.Remove(ConstDressUpItemType.XIA_ZHUANG);
  88. }
  89. else if (!hasTagLYQ && (hasTagSY || hasTagXZ))
  90. {
  91. itemListDic.Remove(ConstDressUpItemType.LIAN_YI_QUN);
  92. }
  93. else
  94. {
  95. int scoreLYQ = ItemDataManager.GetItemAdditionScore(itemListDic[ConstDressUpItemType.LIAN_YI_QUN][0], scoreType, tags);
  96. int scoreSY = ItemDataManager.GetItemAdditionScore(itemListDic[ConstDressUpItemType.SHANG_YI][0], scoreType, tags);
  97. int scoreXZ = ItemDataManager.GetItemAdditionScore(itemListDic[ConstDressUpItemType.XIA_ZHUANG][0], scoreType, tags);
  98. if (scoreLYQ > scoreSY + scoreXZ)
  99. {
  100. itemListDic.Remove(ConstDressUpItemType.SHANG_YI);
  101. itemListDic.Remove(ConstDressUpItemType.XIA_ZHUANG);
  102. }
  103. else
  104. {
  105. itemListDic.Remove(ConstDressUpItemType.LIAN_YI_QUN);
  106. }
  107. }
  108. }
  109. List<int> itemList = new List<int>();
  110. foreach (int subType in itemListDic.Keys)
  111. {
  112. itemList.AddRange(itemListDic[subType]);
  113. }
  114. return itemList;
  115. }
  116. private List<int> SortDressList(List<int> dressList, int scoreType, string[] tags)
  117. {
  118. dressList.Sort((int a, int b) =>
  119. {
  120. ItemCfg cfgA = ItemCfgArray.Instance.GetCfg(a);
  121. ItemCfg cfgB = ItemCfgArray.Instance.GetCfg(b);
  122. if (ItemDataManager.CheckItemTagsRight(a, tags) && !ItemDataManager.CheckItemTagsRight(b, tags)) return -1;
  123. if (ItemDataManager.CheckItemTagsRight(b, tags) && !ItemDataManager.CheckItemTagsRight(a, tags)) return 1;
  124. int scoreA = ItemDataManager.GetItemAdditionScore(a, scoreType, tags);
  125. int scoreB = ItemDataManager.GetItemAdditionScore(b, scoreType, tags);
  126. return scoreB - scoreA;
  127. });
  128. return dressList;
  129. }
  130. /*********************************************************************************************************************/
  131. /// <summary>
  132. /// 获取三套服装总战力
  133. /// </summary>
  134. /// <param name="roleType"></param>
  135. /// <param name="roleDatas"></param>
  136. /// <param name="robotDatas"></param>
  137. /// <returns></returns>
  138. public int GetAllFightScore(int roleType, List<FightRoleData> roleDatas, List<FightRobotData> robotDatas)
  139. {
  140. int fightScore = 0;
  141. for (int i = 0; i < ThemeList.Count; i++)
  142. {
  143. if (roleType == ArenaFightTargetType.PLAYER)
  144. {
  145. fightScore += GetArenaRoleFightScore(roleDatas[i]);
  146. }
  147. else
  148. {
  149. fightScore += GetArenaRobotFightScore(robotDatas[i]);
  150. }
  151. }
  152. return fightScore;
  153. }
  154. /// <summary>
  155. /// 获取玩家竞技场战力
  156. /// </summary>
  157. /// <returns></returns>
  158. public int GetArenaRoleFightScore(FightRoleData roleDatas)
  159. {
  160. //竞技场战力=搭配战力+卓越点击战力+卡牌战力
  161. //搭配战力=第1套搭配所有部件主属性和+第2套搭配所有部件主属性和+第3套搭配所有部件主属性和
  162. //卓越点击战力=卓越点击评分和/2.33
  163. //技能战力=(第1套搭配所有部件主属性和+卡牌主属性+人物基础分)*技能1当前等级对应的战力系数+(第1套搭配所有部件主属性和+卡牌主属性+人物基础分)*技能2当前等级对应的战力系数+(第1套搭配所有部件主属性和+卡牌主属性+人物基础分)*技能3当前等级对应的战力系数+(第2套搭配所有部件主属性和+卡牌主属性+人物基础分)*技能1当前等级对应的战力系数+(第2套搭配所有部件主属性和+卡牌主属性+人物基础分)*技能2当前等级对应的战力系数+(第2套搭配所有部件主属性和+卡牌主属性+人物基础分)*技能3当前等级对应的战力系数+(第3套搭配所有部件主属性和+卡牌主属性+人物基础分)*技能1当前等级对应的战力系数+(第3套搭配所有部件主属性和+卡牌主属性+人物基础分)*技能2当前等级对应的战力系数+(第3套搭配所有部件主属性和+卡牌主属性+人物基础分)*技能3当前等级对应的战力系数
  164. double fightScore = 0;
  165. FightRoleData roleData = FightDataManager.Instance.roleData;
  166. double itemSum = GetItemScoreSum(roleDatas.itemScoreList);
  167. double clickScore = GetPerfectClickScore(roleDatas) / ConstScoreSystem.PART_SCORE;
  168. double skillScore = FightDataManager.Instance.GetSkillFightScore(itemSum, roleData.baseScore, roleData.cardId, roleData.cardScore, roleData.skillLvs);
  169. fightScore = itemSum + clickScore + skillScore;
  170. return (int)Math.Ceiling(fightScore);
  171. }
  172. /// <summary>
  173. /// 获取竞技场机器人战力
  174. /// </summary>
  175. /// <returns></returns>
  176. public int GetArenaRobotFightScore(FightRobotData robotData)
  177. {
  178. double fightScore = 0;
  179. double itemSum = GetItemScoreSum(robotData.itemScoreList);
  180. double clickScore = GetRobotPerfectClickScore(robotData) / ConstScoreSystem.PART_SCORE;
  181. double skillScore = FightDataManager.Instance.GetSkillFightScore(itemSum, robotData.baseScore, robotData.cardId, robotData.cardScore, robotData.skillLvs);
  182. fightScore = itemSum + clickScore + skillScore;
  183. return (int)Math.Ceiling(fightScore);
  184. }
  185. /// <summary>
  186. /// 所有部件主属性和
  187. /// </summary>
  188. /// <returns></returns>
  189. public double GetItemScoreSum(List<int> itemScoreList)
  190. {
  191. double scoreSum = 0;
  192. for (int i = 0; i < itemScoreList.Count; i++)
  193. {
  194. scoreSum += itemScoreList[i];
  195. }
  196. return scoreSum;
  197. }
  198. //玩家卓越点击战力
  199. private double GetPerfectClickScore(FightRoleData roleData)
  200. {
  201. double clickScore = 0;
  202. foreach (int key in roleData.pardScoreListDic.Keys)
  203. {
  204. clickScore += ScoreSystemData.Instance.GetPartScore(roleData, key, ClickType.PREFACT_CLICK, 0);
  205. }
  206. return clickScore;
  207. }
  208. //机器人卓越点击战力
  209. private double GetRobotPerfectClickScore(FightRobotData robotData)
  210. {
  211. double clickScore = 0;
  212. FightScoreCfg[] scoreCfg = FightScoreCfgArray.Instance.dataArray;
  213. for (int i = 0; i < scoreCfg.Length; i++)
  214. {
  215. clickScore += ScoreSystemData.Instance.GetRobotPartScore(robotData, i + 1, ClickType.PREFACT_CLICK, 0);
  216. }
  217. return clickScore;
  218. }
  219. }
  220. }