ArenaDataManager.cs 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446
  1. using System;
  2. using System.Collections.Generic;
  3. using ET;
  4. using UnityEngine;
  5. using FairyGUI;
  6. namespace GFGGame
  7. {
  8. public class ArenaDataManager : SingletonBase<ArenaDataManager>
  9. {
  10. public long LastFightTime = 0;//上次战斗时间,时间为0,说明未战斗过,则没有段位奖励
  11. public List<int> ThemeList = new List<int>() { 1, 2, 3 };//本周主题列表
  12. public string Tag = "异域";//本周标签
  13. public int SeasonId = 1;// 赛季id
  14. public int Grade = 1;//本赛季段位
  15. public int Rank = 10000;//本赛季段位内排名
  16. public int HighestGrade = 1;//本赛季最高段位
  17. public int HighestRank = 10000; //本赛最高季段位内排名
  18. public List<FightData> DressupList = new List<FightData>();//我的搭配列表
  19. public List<ArenaTargetData> Targets = new List<ArenaTargetData>();//对手
  20. public ArenaTargetData SelfData;//自己的排行榜信息
  21. public ArenaTargetData SelfLastData;//自己的上赛季排行榜信息
  22. public Dictionary<int, List<ArenaTargetData>> RankDatasDic = new Dictionary<int, List<ArenaTargetData>>();//排行榜数据
  23. public List<ArenaHistoryData> HistoryDatas = new List<ArenaHistoryData>();//获取竞技场历史记录
  24. /*************************************************************************************************************************************/
  25. // public Dictionary<int, Texture2D> TextureDic = new Dictionary<int, Texture2D>();
  26. public List<int> roundTime = new List<int>();
  27. public List<int> targetRoundTime = new List<int>();
  28. //Dictionary<回合下标, Dictionary<partId, Dictionary<战斗节点, List<PassivitySkillLvlCfg>>>>
  29. public Dictionary<int, Dictionary<int, Dictionary<int, List<PassivitySkillLvlCfg>>>> vaildSkills = new Dictionary<int, Dictionary<int, Dictionary<int, List<PassivitySkillLvlCfg>>>>();
  30. public Dictionary<int, Dictionary<int, Dictionary<int, List<PassivitySkillLvlCfg>>>> targetVaildSkills = new Dictionary<int, Dictionary<int, Dictionary<int, List<PassivitySkillLvlCfg>>>>();
  31. public int SelectThemeIndex = 0;//当前选中换装主题(ThemeList)的下标
  32. public int SelectTargetIndex = -1;//当前选中挑战对象的下标
  33. public int CurFightIndex = 0;//当前挑战场次下标
  34. public List<long> myScore = new List<long>();//对战数据,三轮分数
  35. public List<long> targetScore = new List<long>();//对战数据,三轮分数
  36. public List<long> myFightPower = new List<long>();//对战数据,竞技场战力,搭配战力,卓越点击战力,卡牌战力
  37. public List<long> targetFightPower = new List<long>();//对战数据,对手竞技场战力,搭配战力,卓越点击战力,卡牌战力
  38. /*************************************************************************************************************************************/
  39. public int LastGrade;//战斗前段位
  40. public int LastRank;//战斗前排行
  41. public OtherRoleInfoData LastTargetInfo = new OtherRoleInfoData();//战斗对手角色信息
  42. public List<ArenaTargetData> LastTargets = new List<ArenaTargetData>();//对手
  43. public int RewardId;//段位提升奖励
  44. public List<ItemData> BonusList;//战斗结算奖励
  45. /*************************************************************************************************************************************/
  46. /// <summary>
  47. /// 是否快速挑战
  48. /// </summary>
  49. /// <value></value>
  50. public bool QuickFight
  51. {
  52. get
  53. {
  54. return StorageDataManager.Instance.GetStorageValue(ConstStorageId.ARENA_QUICK_FIGHT) == 1 ? true : false;
  55. }
  56. set
  57. {
  58. StorageSProxy.ReqSetClientValue(ConstStorageId.ARENA_QUICK_FIGHT, value == true ? 1 : 0).Coroutine();
  59. }
  60. }
  61. public void Clear()
  62. {
  63. ThemeList.Clear();
  64. DressupList.Clear();
  65. Targets.Clear();
  66. RankDatasDic.Clear();
  67. HistoryDatas.Clear();
  68. // TextureDic.Clear();
  69. myScore.Clear();
  70. targetScore.Clear();
  71. myFightPower.Clear();
  72. targetFightPower.Clear();
  73. roundTime.Clear();
  74. targetRoundTime.Clear();
  75. // LastTargetInfo = null;
  76. SelfData = null;
  77. SelfLastData = null;
  78. }
  79. /// <summary>
  80. /// 是否结算中
  81. /// </summary>
  82. /// <returns></returns>
  83. public bool IsArenaClearing
  84. {
  85. get
  86. {
  87. long curTime = TimeHelper.ServerNow();
  88. long startTime = TimeUtil.GetCurWeekTime(GlobalCfgArray.globalCfg.clearingStartWeekDay, GlobalCfgArray.globalCfg.clearingStartTime);
  89. long endTime = TimeUtil.GetCurWeekTime(GlobalCfgArray.globalCfg.clearingEndWeekDay, GlobalCfgArray.globalCfg.clearingEndTime);
  90. if (GlobalCfgArray.globalCfg.clearingEndWeekDay >= GlobalCfgArray.globalCfg.clearingStartWeekDay)
  91. {
  92. //结算时间开始到结束未跨周(例:本周六开始,本周日结束)
  93. return curTime >= startTime && curTime <= endTime;
  94. }
  95. else
  96. {
  97. //结算时间开始到结束跨周(例:本周六开始,下周一结束)
  98. return curTime <= endTime || curTime >= startTime;
  99. }
  100. }
  101. }
  102. /// <summary>
  103. /// 赛季是否开启
  104. /// </summary>
  105. /// <value></value>
  106. public bool IsSeasonOpen
  107. {
  108. get
  109. {
  110. ArenaOpenCfg cfg = ArenaOpenCfgArray.Instance.GetCfg(SeasonId);
  111. if (TimeUtil.IsBeforeCurTime(cfg.openTime) && TimeUtil.IsLaterCurTime(cfg.endTime))
  112. {
  113. return true;
  114. }
  115. return false;
  116. }
  117. }
  118. /// <summary>
  119. /// 试图更新最高段位、排行数据
  120. /// </summary>
  121. public void TryUpdateHighest()
  122. {
  123. HighestGrade = HighestGrade >= Grade ? HighestGrade : Grade;
  124. HighestRank = HighestRank >= Rank ? HighestRank : Rank;
  125. }
  126. //获取竞技场对手角色战斗数据
  127. public FightData GetArenaFightData(int index, ArenaTargetData arenaTarget)
  128. {
  129. return arenaTarget.FightDatas[index];
  130. }
  131. /// <summary>
  132. /// 获取推荐卡牌
  133. /// </summary>
  134. public int GetRecommentCardId(int scoreType, List<int> itemList)
  135. {
  136. float dressListAllAcore = FightDataManager.Instance.GetDressListAllScore(itemList, scoreType);
  137. List<CardData> cardDatas = FightDataManager.Instance.SortCardList(CardDataManager.GetCardListByRarity(0), dressListAllAcore, scoreType);
  138. if (cardDatas.Count == 0) return 0;
  139. return cardDatas[0].itemCfg.id;
  140. }
  141. /// <summary>
  142. /// 获取推荐列表
  143. /// </summary>
  144. /// <param name="scoreType"></param>
  145. /// <param name="tags"></param>
  146. /// <returns></returns>
  147. public List<int> GetRecommentItemList(int scoreType, string[] tags)
  148. {
  149. Dictionary<int, List<int>> itemListDic = new Dictionary<int, List<int>>();
  150. Dictionary<int, List<int>> itemDatasDic = DressUpMenuItemDataManager.ItemDatasBySubTypeDic;
  151. foreach (int subType in itemDatasDic.Keys)
  152. {
  153. int key = subType;
  154. if (itemDatasDic.Count == 0) continue;
  155. if (DressUpMenuItemCfg1Array.Instance.CheckIsSceneTypeBySubType(subType)) continue;
  156. List<int> dressList = SortDressList(itemDatasDic[subType], scoreType, tags);
  157. int max = subType == (int)ConstDressUpItemType.TE_SHU ? 3 : 1;
  158. max = Math.Min(max, dressList.Count);
  159. if (DressUpMenuItemCfg1Array.Instance.CheckIsOrnamentsTypeBySubType(subType))
  160. {
  161. key = ConstDressUpItemType.TE_SHU;//饰品全放在一个列表里
  162. }
  163. if (!itemListDic.ContainsKey(key))
  164. {
  165. itemListDic[key] = new List<int>();
  166. }
  167. itemListDic[key].AddRange(dressList.GetRange(0, max));
  168. }
  169. if (itemListDic.ContainsKey(ConstDressUpItemType.LIAN_YI_QUN) &&
  170. (!itemListDic.ContainsKey(ConstDressUpItemType.SHANG_YI) ||
  171. !itemListDic.ContainsKey(ConstDressUpItemType.XIA_ZHUANG) ||
  172. !itemListDic.ContainsKey(ConstDressUpItemType.NEI_DA)))
  173. {
  174. itemListDic.Remove(ConstDressUpItemType.SHANG_YI);
  175. itemListDic.Remove(ConstDressUpItemType.XIA_ZHUANG);
  176. itemListDic.Remove(ConstDressUpItemType.NEI_DA);
  177. }
  178. else if (!itemListDic.ContainsKey(ConstDressUpItemType.LIAN_YI_QUN) &&
  179. (itemListDic.ContainsKey(ConstDressUpItemType.SHANG_YI) &&
  180. itemListDic.ContainsKey(ConstDressUpItemType.XIA_ZHUANG) &&
  181. itemListDic.ContainsKey(ConstDressUpItemType.NEI_DA)))
  182. {
  183. itemListDic.Remove(ConstDressUpItemType.LIAN_YI_QUN);
  184. }
  185. if (itemListDic.ContainsKey(ConstDressUpItemType.LIAN_YI_QUN) && itemListDic.ContainsKey(ConstDressUpItemType.SHANG_YI) && itemListDic.ContainsKey(ConstDressUpItemType.XIA_ZHUANG) && itemListDic.ContainsKey(ConstDressUpItemType.NEI_DA))
  186. {
  187. bool hasTagLYQ = ItemDataManager.CheckItemTagsRight(itemListDic[ConstDressUpItemType.LIAN_YI_QUN][0], tags);
  188. bool hasTagSY = ItemDataManager.CheckItemTagsRight(itemListDic[ConstDressUpItemType.SHANG_YI][0], tags);
  189. bool hasTagXZ = ItemDataManager.CheckItemTagsRight(itemListDic[ConstDressUpItemType.XIA_ZHUANG][0], tags);
  190. bool hasTagND = ItemDataManager.CheckItemTagsRight(itemListDic[ConstDressUpItemType.NEI_DA][0], tags);
  191. if (hasTagLYQ && !hasTagSY && !hasTagXZ)
  192. {
  193. itemListDic.Remove(ConstDressUpItemType.SHANG_YI);
  194. itemListDic.Remove(ConstDressUpItemType.XIA_ZHUANG);
  195. itemListDic.Remove(ConstDressUpItemType.NEI_DA);
  196. }
  197. else if (!hasTagLYQ && (hasTagSY || hasTagXZ))
  198. {
  199. itemListDic.Remove(ConstDressUpItemType.LIAN_YI_QUN);
  200. }
  201. else
  202. {
  203. int scoreLYQ = ItemDataManager.GetItemAdditionScore(itemListDic[ConstDressUpItemType.LIAN_YI_QUN][0], scoreType, tags);
  204. int scoreSY = ItemDataManager.GetItemAdditionScore(itemListDic[ConstDressUpItemType.SHANG_YI][0], scoreType, tags);
  205. int scoreXZ = ItemDataManager.GetItemAdditionScore(itemListDic[ConstDressUpItemType.XIA_ZHUANG][0], scoreType, tags);
  206. int scoreND = ItemDataManager.GetItemAdditionScore(itemListDic[ConstDressUpItemType.NEI_DA][0], scoreType, tags);
  207. if (scoreLYQ > scoreSY + scoreXZ + scoreND)
  208. {
  209. itemListDic.Remove(ConstDressUpItemType.SHANG_YI);
  210. itemListDic.Remove(ConstDressUpItemType.XIA_ZHUANG);
  211. itemListDic.Remove(ConstDressUpItemType.NEI_DA);
  212. }
  213. else
  214. {
  215. itemListDic.Remove(ConstDressUpItemType.LIAN_YI_QUN);
  216. }
  217. }
  218. }
  219. List<int> itemList = new List<int>();
  220. foreach (int subType in itemListDic.Keys)
  221. {
  222. DressUpMenuItemDataManager.SortItemListByHighScore(itemListDic[subType]);
  223. if (subType == ConstDressUpItemType.TE_SHU)
  224. {
  225. int max = Math.Min(itemListDic[subType].Count, 5);
  226. itemList.AddRange(itemListDic[subType].GetRange(0, max));
  227. }
  228. else
  229. {
  230. itemList.AddRange(itemListDic[subType]);
  231. }
  232. }
  233. return itemList;
  234. }
  235. private List<int> SortDressList(List<int> dressList, int scoreType, string[] tags)
  236. {
  237. dressList.Sort((int a, int b) =>
  238. {
  239. ItemCfg cfgA = ItemCfgArray.Instance.GetCfg(a);
  240. ItemCfg cfgB = ItemCfgArray.Instance.GetCfg(b);
  241. bool isTagA = ItemDataManager.CheckItemTagsRight(a, tags);
  242. bool isTagB = ItemDataManager.CheckItemTagsRight(b, tags);
  243. if (isTagA && !isTagB) return -1;
  244. if (isTagB && !isTagA) return 1;
  245. int scoreA = ItemDataManager.GetItemAdditionScore(a, scoreType, tags);
  246. int scoreB = ItemDataManager.GetItemAdditionScore(b, scoreType, tags);
  247. if (scoreA > scoreB) return -1;
  248. if (scoreA < scoreB) return 1;
  249. return cfgA.id - cfgB.id;
  250. });
  251. return dressList;
  252. }
  253. /// <summary>
  254. /// 获取符合标签的服装总个数
  255. /// </summary>
  256. /// <param name="itemList">服装列表</param>
  257. /// <param name="tags">标签</param>
  258. /// <returns></returns>
  259. public int GetTagsCount(List<int> itemList, string[] tags)
  260. {
  261. int count = 0;
  262. for (int i = 0; i < itemList.Count; i++)
  263. {
  264. if (ItemDataManager.CheckItemTagsRight(itemList[i], tags))
  265. {
  266. if (ItemUtilCS.GetItemSubType(itemList[i]) == ConstDressUpItemType.LIAN_YI_QUN)
  267. {
  268. count += 3;
  269. }
  270. {
  271. count++;
  272. }
  273. }
  274. }
  275. return count;
  276. }
  277. /*********************************************************************************************************************/
  278. public void SetMineFightAttrs()
  279. {
  280. for (int i = 0; i < DressupList.Count; i++)
  281. {
  282. SetMineFightAttr(DressupList[i], ThemeList[i]);
  283. }
  284. }
  285. public void SetMineFightAttr(FightData fightData, int theme)
  286. {
  287. fightData.cardScore = ItemDataManager.GetItemAdditionScore(fightData.cardId, theme, fightData.tags);
  288. fightData.skillLvs = SkillDataManager.Instance.GetCardSkillLvs(fightData.cardId);
  289. FightDataManager.Instance.SetItemScoreList(fightData);
  290. }
  291. /// <summary>
  292. /// 获取三套服装总战力
  293. /// </summary>
  294. /// <param name="roleType"></param>
  295. /// <param name="roleDatas"></param>
  296. /// <param name="robotDatas"></param>
  297. /// <returns></returns>
  298. public long GetAllFightScore(List<long> fightScores)
  299. {
  300. long fightScore = 0;
  301. for (int i = 0; i < fightScores.Count; i++)
  302. {
  303. fightScore += fightScores[i];
  304. }
  305. return fightScore;
  306. }
  307. public long GetAllFightScore(List<FightData> roleDatas)
  308. {
  309. long fightScore = 0;
  310. List<long> fightScoreDatas = GetFightScoreList(roleDatas);
  311. for (int i = 0; i < fightScoreDatas.Count; i++)
  312. {
  313. fightScore += fightScoreDatas[i];
  314. }
  315. return fightScore;
  316. }
  317. /// <summary>
  318. /// index=0:搭配战力
  319. /// index=1:卓越点击战力
  320. /// index=2:卡牌战力/技能战力
  321. /// </summary>
  322. /// <param name="roleType"></param>
  323. /// <param name="fightDatas"></param>
  324. /// <param name="robotDatas"></param>
  325. /// <returns></returns>
  326. public List<long> GetFightScoreList(List<FightData> fightDatas)
  327. {
  328. List<long> fightScoreDatas = new List<long>();
  329. long itemSum = 0;
  330. double clickScore = 0;
  331. long skillScore = 0;
  332. for (int i = 0; i < ThemeList.Count; i++)
  333. {
  334. if (fightDatas[i].type == FightTargetType.PLAYER)
  335. {
  336. long itemsScore = GetItemScoreSum(fightDatas[i].itemScoreList);
  337. itemSum += itemsScore;
  338. clickScore += GetPerfectClickScore(fightDatas[i]);
  339. skillScore += FightDataManager.Instance.GetSkillFightScore(itemsScore, fightDatas[i].baseScore, fightDatas[i].leagueSkillScore, fightDatas[i].cardId, fightDatas[i].cardScore, fightDatas[i].skillLvs);
  340. }
  341. else
  342. {
  343. long itemsScore = GetItemScoreSum(fightDatas[i].itemScoreList);
  344. itemSum += itemsScore;
  345. clickScore += GetRobotPerfectClickScore(fightDatas[i]);
  346. skillScore += FightDataManager.Instance.GetSkillFightScore(itemsScore, fightDatas[i].baseScore, fightDatas[i].leagueSkillScore, fightDatas[i].cardId, fightDatas[i].cardScore, fightDatas[i].skillLvs);
  347. }
  348. }
  349. clickScore = clickScore / ConstScoreSystem.PART_SCORE;
  350. fightScoreDatas.Add(itemSum);
  351. fightScoreDatas.Add((long)Math.Ceiling(clickScore));
  352. fightScoreDatas.Add(skillScore);
  353. return fightScoreDatas;
  354. }
  355. /// <summary>
  356. /// 所有部件主属性和
  357. /// </summary>
  358. /// <returns></returns>
  359. public long GetItemScoreSum(List<float> itemScoreList)
  360. {
  361. long scoreSum = 0;
  362. for (int i = 0; i < itemScoreList.Count; i++)
  363. {
  364. scoreSum += (long)itemScoreList[i];
  365. }
  366. return scoreSum;
  367. }
  368. //玩家卓越点击战力
  369. private long GetPerfectClickScore(FightData roleData)
  370. {
  371. double clickScore = 0;
  372. foreach (int key in roleData.pardScoreListDic.Keys)
  373. {
  374. double partBaseScore = ScoreSystemData.Instance.GetPartBaseScore(roleData, key);
  375. double score = (partBaseScore + (roleData.baseScore + roleData.leagueSkillScore + roleData.cardScore) * ConstScoreSystem.PERFECT_SCORE) * ConstScoreSystem.CLICK_SCORE;
  376. clickScore += score;
  377. }
  378. return (long)Math.Ceiling(clickScore);
  379. }
  380. //机器人卓越点击战力
  381. private long GetRobotPerfectClickScore(FightData robotData)
  382. {
  383. long clickScore = 0;
  384. FightScoreCfg[] scoreCfg = FightScoreCfgArray.Instance.dataArray;
  385. for (int i = 0; i < scoreCfg.Length; i++)
  386. {
  387. clickScore += (long)ScoreSystemData.Instance.GetRobotPartScore(robotData, i + 1, ClickType.PREFACT_CLICK, 0);
  388. }
  389. return clickScore;
  390. }
  391. /************************************************************************************************************/
  392. public void AddCheckSeasonOpenTimer()
  393. {
  394. RemoveCheckSeasonOpenTimer();
  395. Timers.inst.Add(1, 0, OnTimeUpdate);
  396. }
  397. private void OnTimeUpdate(object param)
  398. {
  399. if (!IsSeasonOpen) return;
  400. if (ThemeList.Count == 0)
  401. {
  402. ReqArenaInfo();
  403. }
  404. RemoveCheckSeasonOpenTimer();
  405. }
  406. public async void ReqArenaInfo()
  407. {
  408. if (FunctionOpenDataManager.Instance.CheckIsFunOpenById(typeof(ArenaView).Name, false))
  409. {
  410. await ArenaSproxy.ReqArenaInfos();
  411. for (int i = 0; i < ArenaDataManager.Instance.Targets.Count; i++)
  412. {
  413. ArenaTargetData targetData = ArenaDataManager.Instance.Targets[i];
  414. if (targetData.Type == FightTargetType.PLAYER)
  415. {
  416. ArenaSproxy.ReqArenaFightAttr(targetData.RoleInfo.roleId, targetData.FightDatas).Coroutine();
  417. }
  418. }
  419. ArenaSproxy.ReqArenaHistory().Coroutine();
  420. }
  421. }
  422. private void RemoveCheckSeasonOpenTimer()
  423. {
  424. Timers.inst.Remove(OnTimeUpdate);
  425. }
  426. }
  427. }