ArenaDataManager.cs 11 KB

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