ArenaDataManager.cs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390
  1. using System;
  2. using System.Collections.Generic;
  3. using ET;
  4. using FairyGUI;
  5. namespace GFGGame
  6. {
  7. public class ArenaDataManager : SingletonBase<ArenaDataManager>
  8. {
  9. public List<int> ThemeList = new List<int>() { 1, 2, 3 };//本周主题列表
  10. public string Tag = "未央";//本周标签
  11. public int SeasonId = 1;// 赛季id
  12. public int Grade = 1;//本赛季段位
  13. public int Rank = 10000;//本赛季段位内排名
  14. public int HighestGrade = 1;//本赛季最高段位
  15. public int HighestRank = 10000; //本赛最高季段位内排名
  16. public List<FightRoleData> DressupList = new List<FightRoleData>();//我的搭配列表
  17. public List<ArenaTargetData> Targets = new List<ArenaTargetData>();//对手
  18. public ArenaTargetData SelfData = new ArenaTargetData();//自己的排行榜信息
  19. public Dictionary<int, List<ArenaTargetData>> RankDatasDic = new Dictionary<int, List<ArenaTargetData>>();//排行榜数据
  20. public List<ArenaHistoryData> HistoryDatas = new List<ArenaHistoryData>();//获取竞技场历史记录
  21. /*************************************************************************************************************************************/
  22. public int SelectThemeIndex = 0;//当前选中换装主题(ThemeList)的下标
  23. public int SelectTargetIndex = -1;//当前选中挑战对象的下标
  24. public int CurFightIndex = 0;//当前挑战场次下标
  25. public List<long> myScore = new List<long>();//对战数据,三轮分数
  26. public List<long> targetScore = new List<long>();//对战数据,三轮分数
  27. public List<long> myFightScore = new List<long>();//对战数据,竞技场战力,搭配战力,卓越点击战力,卡牌战力
  28. public List<long> targetFightScore = new List<long>();//对战数据,对手竞技场战力,搭配战力,卓越点击战力,卡牌战力
  29. /*************************************************************************************************************************************/
  30. /// <summary>
  31. /// 是否快速挑战
  32. /// </summary>
  33. /// <value></value>
  34. public bool QuickFight
  35. {
  36. get
  37. {
  38. return StorageDataManager.Instance.GetStorageValue(ConstStorageId.ARENA_QUICK_FIGHT) == 1 ? true : false;
  39. }
  40. set
  41. {
  42. StorageSProxy.ReqSetClientValue(ConstStorageId.ARENA_QUICK_FIGHT, value == true ? 1 : 0).Coroutine();
  43. }
  44. }
  45. public void Clear()
  46. {
  47. DressupList.Clear();
  48. Targets.Clear();
  49. RankDatasDic.Clear();
  50. HistoryDatas.Clear();
  51. HistoryDatas = null;
  52. }
  53. /// <summary>
  54. /// 试图更新最高段位、排行数据
  55. /// </summary>
  56. public void TryUpdateHighest()
  57. {
  58. HighestGrade = HighestGrade >= Grade ? HighestGrade : Grade;
  59. HighestRank = HighestRank >= Rank ? HighestRank : Rank;
  60. }
  61. //获取竞技场对手角色战斗数据
  62. public FightRoleData GetArenaRoleData(int index, ArenaTargetData arenaTarget)
  63. {
  64. return arenaTarget.RoleDressupList[index];
  65. }
  66. //获取竞技场机器人战斗数据
  67. public FightRobotData GetArenaRobotData(int index, ArenaTargetData arenaTarget)
  68. {
  69. return arenaTarget.RobotDressupList[index];
  70. }
  71. /// <summary>
  72. /// 获取推荐列表
  73. /// </summary>
  74. /// <param name="scoreType"></param>
  75. /// <param name="tags"></param>
  76. /// <returns></returns>
  77. public List<int> GetRecommentItemList(int scoreType, string[] tags)
  78. {
  79. Dictionary<int, List<int>> itemListDic = new Dictionary<int, List<int>>();
  80. Dictionary<int, List<int>> itemDatasDic = DressUpMenuItemDataManager.ItemDatasBySubTypeDic;
  81. foreach (int subType in itemDatasDic.Keys)
  82. {
  83. int key = subType;
  84. if (itemDatasDic.Count == 0) continue;
  85. if (DressUpMenuItemCfg1Array.Instance.CheckIsSceneTypeBySubType(subType)) continue;
  86. List<int> dressList = SortDressList(itemDatasDic[subType], scoreType, tags);
  87. int max = subType == (int)ConstDressUpItemType.TE_SHU ? 3 : 1;
  88. max = Math.Min(max, dressList.Count);
  89. if (DressUpMenuItemCfg1Array.Instance.CheckIsOrnamentsTypeBySubType(subType))
  90. {
  91. key = ConstDressUpItemType.TE_SHU;//饰品全放在一个列表里
  92. }
  93. if (!itemListDic.ContainsKey(key))
  94. {
  95. itemListDic[key] = new List<int>();
  96. }
  97. itemListDic[key].AddRange(dressList.GetRange(0, max));
  98. }
  99. if (itemListDic.ContainsKey(ConstDressUpItemType.LIAN_YI_QUN) &&
  100. (!itemListDic.ContainsKey(ConstDressUpItemType.SHANG_YI) ||
  101. !itemListDic.ContainsKey(ConstDressUpItemType.XIA_ZHUANG) ||
  102. !itemListDic.ContainsKey(ConstDressUpItemType.NEI_DA)))
  103. {
  104. itemListDic.Remove(ConstDressUpItemType.SHANG_YI);
  105. itemListDic.Remove(ConstDressUpItemType.XIA_ZHUANG);
  106. itemListDic.Remove(ConstDressUpItemType.NEI_DA);
  107. }
  108. else if (!itemListDic.ContainsKey(ConstDressUpItemType.LIAN_YI_QUN) &&
  109. (itemListDic.ContainsKey(ConstDressUpItemType.SHANG_YI) &&
  110. itemListDic.ContainsKey(ConstDressUpItemType.XIA_ZHUANG) &&
  111. itemListDic.ContainsKey(ConstDressUpItemType.NEI_DA)))
  112. {
  113. itemListDic.Remove(ConstDressUpItemType.LIAN_YI_QUN);
  114. }
  115. if (itemListDic.ContainsKey(ConstDressUpItemType.LIAN_YI_QUN) && itemListDic.ContainsKey(ConstDressUpItemType.SHANG_YI) && itemListDic.ContainsKey(ConstDressUpItemType.XIA_ZHUANG) && itemListDic.ContainsKey(ConstDressUpItemType.NEI_DA))
  116. {
  117. bool hasTagLYQ = ItemDataManager.CheckItemTagsRight(itemListDic[ConstDressUpItemType.LIAN_YI_QUN][0], tags);
  118. bool hasTagSY = ItemDataManager.CheckItemTagsRight(itemListDic[ConstDressUpItemType.SHANG_YI][0], tags);
  119. bool hasTagXZ = ItemDataManager.CheckItemTagsRight(itemListDic[ConstDressUpItemType.XIA_ZHUANG][0], tags);
  120. bool hasTagND = ItemDataManager.CheckItemTagsRight(itemListDic[ConstDressUpItemType.NEI_DA][0], tags);
  121. if (hasTagLYQ && !hasTagSY && !hasTagXZ)
  122. {
  123. itemListDic.Remove(ConstDressUpItemType.SHANG_YI);
  124. itemListDic.Remove(ConstDressUpItemType.XIA_ZHUANG);
  125. itemListDic.Remove(ConstDressUpItemType.NEI_DA);
  126. }
  127. else if (!hasTagLYQ && (hasTagSY || hasTagXZ))
  128. {
  129. itemListDic.Remove(ConstDressUpItemType.LIAN_YI_QUN);
  130. }
  131. else
  132. {
  133. int scoreLYQ = ItemDataManager.GetItemAdditionScore(itemListDic[ConstDressUpItemType.LIAN_YI_QUN][0], scoreType, tags);
  134. int scoreSY = ItemDataManager.GetItemAdditionScore(itemListDic[ConstDressUpItemType.SHANG_YI][0], scoreType, tags);
  135. int scoreXZ = ItemDataManager.GetItemAdditionScore(itemListDic[ConstDressUpItemType.XIA_ZHUANG][0], scoreType, tags);
  136. int scoreND = ItemDataManager.GetItemAdditionScore(itemListDic[ConstDressUpItemType.NEI_DA][0], scoreType, tags);
  137. if (scoreLYQ > scoreSY + scoreXZ + scoreND)
  138. {
  139. itemListDic.Remove(ConstDressUpItemType.SHANG_YI);
  140. itemListDic.Remove(ConstDressUpItemType.XIA_ZHUANG);
  141. itemListDic.Remove(ConstDressUpItemType.NEI_DA);
  142. }
  143. else
  144. {
  145. itemListDic.Remove(ConstDressUpItemType.LIAN_YI_QUN);
  146. }
  147. }
  148. }
  149. ET.Log.Debug("scoreType:" + scoreType);
  150. List<int> itemList = new List<int>();
  151. foreach (int subType in itemListDic.Keys)
  152. {
  153. ET.Log.Debug("subType:" + subType + " item:" + itemListDic[subType]);
  154. DressUpMenuItemDataManager.SortItemListByHighScore(itemListDic[subType]);
  155. if (subType == ConstDressUpItemType.TE_SHU)
  156. {
  157. int max = Math.Min(itemListDic[subType].Count, 5);
  158. itemList.AddRange(itemListDic[subType].GetRange(0, max));
  159. }
  160. else
  161. {
  162. itemList.AddRange(itemListDic[subType]);
  163. }
  164. }
  165. // ET.Log.Debug("itemList:" + itemList);
  166. return itemList;
  167. }
  168. private List<int> SortDressList(List<int> dressList, int scoreType, string[] tags)
  169. {
  170. dressList.Sort((int a, int b) =>
  171. {
  172. ItemCfg cfgA = ItemCfgArray.Instance.GetCfg(a);
  173. ItemCfg cfgB = ItemCfgArray.Instance.GetCfg(b);
  174. if (ItemDataManager.CheckItemTagsRight(a, tags) && !ItemDataManager.CheckItemTagsRight(b, tags)) return -1;
  175. if (ItemDataManager.CheckItemTagsRight(b, tags) && !ItemDataManager.CheckItemTagsRight(a, tags)) return 1;
  176. int scoreA = ItemDataManager.GetItemAdditionScore(a, scoreType, tags);
  177. int scoreB = ItemDataManager.GetItemAdditionScore(b, scoreType, tags);
  178. return scoreB - scoreA;
  179. });
  180. return dressList;
  181. }
  182. /// <summary>
  183. /// 获取符合标签的服装总个数
  184. /// </summary>
  185. /// <param name="itemList">服装列表</param>
  186. /// <param name="tags">标签</param>
  187. /// <returns></returns>
  188. public int GetTagsCount(List<int> itemList, string[] tags)
  189. {
  190. int count = 0;
  191. for (int i = 0; i < itemList.Count; i++)
  192. {
  193. if (ItemDataManager.CheckItemTagsRight(itemList[i], tags))
  194. {
  195. if (ItemUtilCS.GetItemSubType(itemList[i]) == ConstDressUpItemType.LIAN_YI_QUN)
  196. {
  197. count += 3;
  198. }
  199. {
  200. count++;
  201. }
  202. }
  203. }
  204. return count;
  205. }
  206. /*********************************************************************************************************************/
  207. /// <summary>
  208. /// 获取三套服装总战力
  209. /// </summary>
  210. /// <param name="roleType"></param>
  211. /// <param name="roleDatas"></param>
  212. /// <param name="robotDatas"></param>
  213. /// <returns></returns>
  214. public long GetAllFightScore(int roleType, List<FightRoleData> roleDatas, List<FightRobotData> robotDatas)
  215. {
  216. long fightScore = 0;
  217. List<long> fightScoreDatas = GetFightScoreList(roleType, roleDatas, robotDatas);
  218. for (int i = 0; i < fightScoreDatas.Count; i++)
  219. {
  220. fightScore += fightScoreDatas[i];
  221. }
  222. return fightScore;
  223. }
  224. /// <summary>
  225. /// index=0:搭配战力
  226. /// index=1:卓越点击战力
  227. /// index=2:卡牌战力/技能战力
  228. /// </summary>
  229. /// <param name="roleType"></param>
  230. /// <param name="roleDatas"></param>
  231. /// <param name="robotDatas"></param>
  232. /// <returns></returns>
  233. public List<long> GetFightScoreList(int roleType, List<FightRoleData> roleDatas, List<FightRobotData> robotDatas)
  234. {
  235. List<long> fightScoreDatas = new List<long>();
  236. long itemSum = 0;
  237. long clickScore = 0;
  238. long skillScore = 0;
  239. for (int i = 0; i < ThemeList.Count; i++)
  240. {
  241. if (roleType == ArenaFightTargetType.PLAYER)
  242. {
  243. itemSum += GetItemScoreSum(roleDatas[i].itemScoreList);
  244. clickScore += GetPerfectClickScore(roleDatas[i]) / (long)ConstScoreSystem.PART_SCORE;
  245. skillScore += FightDataManager.Instance.GetSkillFightScore(itemSum, roleDatas[i].baseScore, roleDatas[i].cardId, roleDatas[i].cardScore, roleDatas[i].skillLvs);
  246. }
  247. else
  248. {
  249. itemSum += GetItemScoreSum(robotDatas[i].itemScoreList);
  250. clickScore += GetRobotPerfectClickScore(robotDatas[i]) / (long)ConstScoreSystem.PART_SCORE;
  251. skillScore += FightDataManager.Instance.GetSkillFightScore(itemSum, robotDatas[i].baseScore, robotDatas[i].cardId, robotDatas[i].cardScore, robotDatas[i].skillLvs);
  252. }
  253. }
  254. fightScoreDatas.Add(itemSum);
  255. fightScoreDatas.Add(clickScore);
  256. fightScoreDatas.Add(skillScore);
  257. return fightScoreDatas;
  258. }
  259. /// <summary>
  260. /// 所有部件主属性和
  261. /// </summary>
  262. /// <returns></returns>
  263. public long GetItemScoreSum(List<int> itemScoreList)
  264. {
  265. long scoreSum = 0;
  266. for (int i = 0; i < itemScoreList.Count; i++)
  267. {
  268. scoreSum += (long)itemScoreList[i];
  269. }
  270. return scoreSum;
  271. }
  272. //玩家卓越点击战力
  273. private long GetPerfectClickScore(FightRoleData roleData)
  274. {
  275. long clickScore = 0;
  276. foreach (int key in roleData.pardScoreListDic.Keys)
  277. {
  278. clickScore += (long)ScoreSystemData.Instance.GetPartScore(roleData, key, ClickType.PREFACT_CLICK, 0);
  279. }
  280. return clickScore;
  281. }
  282. //机器人卓越点击战力
  283. private long GetRobotPerfectClickScore(FightRobotData robotData)
  284. {
  285. long clickScore = 0;
  286. FightScoreCfg[] scoreCfg = FightScoreCfgArray.Instance.dataArray;
  287. for (int i = 0; i < scoreCfg.Length; i++)
  288. {
  289. clickScore += (long)ScoreSystemData.Instance.GetRobotPartScore(robotData, i + 1, ClickType.PREFACT_CLICK, 0);
  290. }
  291. return clickScore;
  292. }
  293. /************************************************************************************************************/
  294. public void SetTestInfo()
  295. {
  296. Targets.Add(ArenaSproxy.GetArenaTargetData(GetArenaTargetProto()));
  297. Targets[0].RoleDressupList[0].cardId = 2000009;
  298. Targets[0].RoleDressupList[0].cardScore = 100;
  299. Targets[0].RoleDressupList[0].skillLvs = new List<int>() { 1, 1, 1 };
  300. Targets[0].RoleDressupList[0].itemScoreList = new List<int>() { 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100 };
  301. Targets[0].RoleDressupList[1].cardId = 2000009;
  302. Targets[0].RoleDressupList[1].cardScore = 100;
  303. Targets[0].RoleDressupList[1].skillLvs = new List<int>() { 1, 1, 1 };
  304. Targets[0].RoleDressupList[1].itemScoreList = new List<int>() { 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100 }; Targets[0].RoleDressupList[2].cardId = 2000009;
  305. Targets[0].RoleDressupList[2].cardScore = 100;
  306. Targets[0].RoleDressupList[2].skillLvs = new List<int>() { 1, 1, 1 };
  307. Targets[0].RoleDressupList[2].itemScoreList = new List<int>() { 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100 };
  308. Targets.Add(ArenaSproxy.GetArenaTargetData(GetArenaTargetProto()));
  309. Targets[1].RoleDressupList[0].cardId = 2000009;
  310. Targets[1].RoleDressupList[0].cardScore = 100;
  311. Targets[1].RoleDressupList[0].skillLvs = new List<int>() { 1, 1, 1 };
  312. Targets[1].RoleDressupList[0].itemScoreList = new List<int>() { 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100 };
  313. Targets[1].RoleDressupList[1].cardId = 2000009;
  314. Targets[1].RoleDressupList[1].cardScore = 100;
  315. Targets[1].RoleDressupList[1].skillLvs = new List<int>() { 1, 1, 1 };
  316. Targets[1].RoleDressupList[1].itemScoreList = new List<int>() { 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100 }; Targets[1].RoleDressupList[2].cardId = 2000009;
  317. Targets[1].RoleDressupList[2].cardScore = 100;
  318. Targets[1].RoleDressupList[2].skillLvs = new List<int>() { 1, 1, 1 };
  319. Targets[1].RoleDressupList[2].itemScoreList = new List<int>() { 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100 };
  320. Targets.Add(ArenaSproxy.GetArenaTargetData(GetArenaTargetProto1()));
  321. Targets[2].RobotDressupList[0] = ArenaSproxy.GetFightRobotData(GetArenaTargetProto1().RobotDressupInfo, 0);
  322. Targets[2].RobotDressupList[1] = ArenaSproxy.GetFightRobotData(GetArenaTargetProto1().RobotDressupInfo, 0);
  323. Targets[2].RobotDressupList[2] = ArenaSproxy.GetFightRobotData(GetArenaTargetProto1().RobotDressupInfo, 0);
  324. DressupList.Add(new FightRoleData());
  325. DressupList[0].tags = new string[] { Tag };
  326. DressupList.Add(new FightRoleData());
  327. DressupList.Add(new FightRoleData());
  328. // DressupList[0].skillLvs = new List<int>() { 1, 1, 1 };
  329. // DressupList[1].skillLvs = new List<int>() { 1, 1, 1 };
  330. // DressupList[2].skillLvs = new List<int>() { 1, 1, 1 };
  331. }
  332. private ArenaTargetProto GetArenaTargetProto()
  333. {
  334. ArenaTargetProto proto = new ArenaTargetProto();
  335. proto.Grade = 1;
  336. proto.RankInGrade = 10000;
  337. proto.Type = ArenaFightTargetType.PLAYER;
  338. proto.RoleInfo = new OtherRoleInfoProto();
  339. proto.RoleInfo.RoleName = "玩家";
  340. proto.RoleInfo.HeadItemId = 5000002;
  341. proto.RoleInfo.RoleLvl = 10;
  342. ArenaDressupProto dressupProto0 = new ArenaDressupProto();
  343. dressupProto0.CardId = 2000009;
  344. dressupProto0.EquipIds = new List<int>(SuitCfgArray.Instance.GetCfg(201005).partsArr);
  345. proto.PlayerDressupList.Add(dressupProto0);
  346. ArenaDressupProto dressupProto1 = new ArenaDressupProto();
  347. dressupProto1.CardId = 2000010;
  348. dressupProto1.EquipIds = new List<int>(SuitCfgArray.Instance.GetCfg(201006).partsArr);
  349. proto.PlayerDressupList.Add(dressupProto1);
  350. ArenaDressupProto dressupProto2 = new ArenaDressupProto();
  351. dressupProto2.CardId = 2000011;
  352. dressupProto2.EquipIds = new List<int>(SuitCfgArray.Instance.GetCfg(201007).partsArr);
  353. proto.PlayerDressupList.Add(dressupProto2);
  354. return proto;
  355. }
  356. private ArenaTargetProto GetArenaTargetProto1()
  357. {
  358. ArenaTargetProto proto = new ArenaTargetProto();
  359. proto.Grade = 1;
  360. proto.RankInGrade = 10000;
  361. proto.Type = ArenaFightTargetType.ROBOT;
  362. proto.RoleInfo = new OtherRoleInfoProto();
  363. proto.RoleInfo.RoleName = "机器人";
  364. ArenaRobotProto robotProto = new ArenaRobotProto();
  365. robotProto.RobotId = 5;
  366. robotProto.Random = 9000;
  367. robotProto.CardIdList = new List<int>() { 2000009, 2000010, 20000011 };
  368. robotProto.SuitList = new List<int>() { 201011, 201012, 201013 };
  369. proto.RobotDressupInfo = robotProto;
  370. return proto;
  371. }
  372. }
  373. }