ArenaDataManager.cs 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using ET;
  5. using UnityEngine;
  6. using FairyGUI;
  7. namespace GFGGame
  8. {
  9. public class ArenaDataManager : SingletonBase<ArenaDataManager>
  10. {
  11. public long LastFightTime = 0; //上次战斗时间,时间为0,说明未战斗过,则没有段位奖励
  12. public List<int> ThemeList = new List<int>() { 1, 2, 3 }; //本周主题列表
  13. public string Tag = "异域"; //本周标签
  14. public int SeasonId = 1; // 赛季id
  15. public int Grade = 1; //本赛季段位
  16. public int Rank = 10000; //本赛季段位内排名
  17. public int HighestGrade = 1; //本赛季最高段位
  18. public int HighestRank = 10000; //本赛最高季段位内排名
  19. public List<FightData> DressupList = new List<FightData>(); //我的搭配列表
  20. public List<ArenaTargetData> Targets = new List<ArenaTargetData>(); //对手
  21. public ArenaTargetData SelfData; //自己的排行榜信息
  22. public ArenaTargetData SelfLastData; //自己的上赛季排行榜信息
  23. public Dictionary<int, List<ArenaTargetData>>
  24. RankDatasDic = new Dictionary<int, List<ArenaTargetData>>(); //排行榜数据
  25. public List<ArenaHistoryData> HistoryDatas = new List<ArenaHistoryData>(); //获取竞技场历史记录
  26. public Dictionary<int,int> GradeRewardStateDic = new Dictionary<int, int>(); //段位奖励数据
  27. /*************************************************************************************************************************************/
  28. // public Dictionary<int, Texture2D> TextureDic = new Dictionary<int, Texture2D>();
  29. public List<int> roundTime = new List<int>();
  30. public List<int> targetRoundTime = new List<int>();
  31. //Dictionary<回合下标, Dictionary<partId, Dictionary<战斗节点, List<PassivitySkillLvlCfg>>>>
  32. public Dictionary<int, Dictionary<int, Dictionary<int, List<PassivitySkillLvlCfg>>>> vaildSkills =
  33. new Dictionary<int, Dictionary<int, Dictionary<int, List<PassivitySkillLvlCfg>>>>();
  34. public Dictionary<int, Dictionary<int, Dictionary<int, List<PassivitySkillLvlCfg>>>> targetVaildSkills =
  35. new Dictionary<int, Dictionary<int, Dictionary<int, List<PassivitySkillLvlCfg>>>>();
  36. public int SelectThemeIndex = 0; //当前选中换装主题(ThemeList)的下标
  37. public int SelectTargetIndex = -1; //当前选中挑战对象的下标
  38. public int CurFightIndex = 0; //当前挑战场次下标
  39. public List<long> myScore = new List<long>(); //对战数据,三轮分数
  40. public List<long> targetScore = new List<long>(); //对战数据,三轮分数
  41. public List<long> myFightPower = new List<long>(); //对战数据,竞技场战力,搭配战力,卓越点击战力,词牌战力
  42. public List<long> targetFightPower = new List<long>(); //对战数据,对手竞技场战力,搭配战力,卓越点击战力,词牌战力
  43. /*************************************************************************************************************************************/
  44. public int LastGrade; //战斗前段位
  45. public int LastRank; //战斗前排行
  46. public OtherRoleInfoData LastTargetInfo = new OtherRoleInfoData(); //战斗对手角色信息
  47. public List<ArenaTargetData> LastTargets = new List<ArenaTargetData>(); //对手
  48. public int RewardId; //段位提升奖励
  49. public List<ItemData> BonusList; //战斗结算奖励
  50. /*************************************************************************************************************************************/
  51. /// <summary>
  52. /// 是否快速挑战
  53. /// </summary>
  54. /// <value></value>
  55. public bool QuickFight
  56. {
  57. get
  58. {
  59. return StorageDataManager.Instance.GetStorageValue(ConstStorageId.ARENA_QUICK_FIGHT) == 1
  60. ? true
  61. : false;
  62. }
  63. set
  64. {
  65. StorageSProxy.ReqSetClientValue(ConstStorageId.ARENA_QUICK_FIGHT, value == true ? 1 : 0).Coroutine();
  66. }
  67. }
  68. public void Clear()
  69. {
  70. ThemeList.Clear();
  71. DressupList.Clear();
  72. Targets.Clear();
  73. RankDatasDic.Clear();
  74. HistoryDatas.Clear();
  75. // TextureDic.Clear();
  76. myScore.Clear();
  77. targetScore.Clear();
  78. myFightPower.Clear();
  79. targetFightPower.Clear();
  80. roundTime.Clear();
  81. targetRoundTime.Clear();
  82. // LastTargetInfo = null;
  83. SelfData = null;
  84. SelfLastData = null;
  85. }
  86. /// <summary>
  87. /// 是否结算中
  88. /// </summary>
  89. /// <returns></returns>
  90. public bool IsArenaClearing
  91. {
  92. get
  93. {
  94. long curTime = TimeHelper.ServerNow();
  95. long startTime = TimeUtil.GetCurWeekTime(GlobalCfgArray.globalCfg.clearingStartWeekDay,
  96. GlobalCfgArray.globalCfg.clearingStartTime);
  97. long endTime = TimeUtil.GetCurWeekTime(GlobalCfgArray.globalCfg.clearingEndWeekDay,
  98. GlobalCfgArray.globalCfg.clearingEndTime);
  99. if (GlobalCfgArray.globalCfg.clearingEndWeekDay >= GlobalCfgArray.globalCfg.clearingStartWeekDay)
  100. {
  101. //结算时间开始到结束未跨周(例:本周六开始,本周日结束)
  102. return curTime >= startTime && curTime <= endTime;
  103. }
  104. else
  105. {
  106. //结算时间开始到结束跨周(例:本周六开始,下周一结束)
  107. return curTime <= endTime || curTime >= startTime;
  108. }
  109. }
  110. }
  111. /// <summary>
  112. /// 赛季是否开启
  113. /// </summary>
  114. /// <value></value>
  115. public bool IsSeasonOpen
  116. {
  117. get
  118. {
  119. ArenaOpenCfg cfg = ArenaOpenCfgArray.Instance.GetCfg(SeasonId);
  120. if (TimeUtil.IsBeforeCurTime(cfg.openTime) && TimeUtil.IsLaterCurTime(cfg.endTime))
  121. {
  122. return true;
  123. }
  124. return false;
  125. }
  126. }
  127. /// <summary>
  128. /// 试图更新最高段位、排行数据
  129. /// </summary>
  130. public void TryUpdateHighest()
  131. {
  132. HighestGrade = HighestGrade >= Grade ? HighestGrade : Grade;
  133. HighestRank = HighestRank >= Rank ? HighestRank : Rank;
  134. }
  135. //获取竞技场对手角色战斗数据
  136. public FightData GetArenaFightData(int index, ArenaTargetData arenaTarget)
  137. {
  138. return arenaTarget.FightDatas[index];
  139. }
  140. /// <summary>
  141. /// 获取推荐词牌
  142. /// </summary>
  143. public int GetRecommentCardId(int scoreType, List<int> itemList, List<int> wearCardIds)
  144. {
  145. float dressListAllAcore = FightDataManager.Instance.GetDressListAllScore(itemList, scoreType);
  146. List<CardData> cardDatas = new List<CardData>();// = FightDataManager.Instance.SortCardList(CardDataManager.GetCardListByRoleType(0),dressListAllAcore, scoreType);
  147. if (InstanceZonesDataManager.FightScene == ConstInstanceZonesType.FieldWork)
  148. {
  149. cardDatas = CardDataManager.GetCardListByRoleType(0).ToList();
  150. int limitTims = CimbingTowerCfgArray.Instance.dataArray[0].UseLimit;
  151. foreach (var item in FieldWorkDataManager.Instance.CardAbrasionInfoList)
  152. {
  153. if (item.UseNum >= limitTims)
  154. {
  155. for(int i = 0;i< cardDatas.Count;i++)
  156. {
  157. if(cardDatas[i].id == item.Card)
  158. {
  159. cardDatas.RemoveAt(i);
  160. break;
  161. }
  162. }
  163. }
  164. }
  165. cardDatas = FightDataManager.Instance.SortCardList(cardDatas,dressListAllAcore, scoreType).ToList();
  166. }
  167. else
  168. {
  169. cardDatas = FightDataManager.Instance.SortCardList(CardDataManager.GetCardListByRoleType(0),
  170. dressListAllAcore, scoreType);
  171. }
  172. cardDatas = cardDatas.Where(a => !wearCardIds.Contains(a.id)).ToList();
  173. if (cardDatas.Count == 0) return 0;
  174. wearCardIds.Add(cardDatas[0].itemCfg.id);
  175. return cardDatas[0].itemCfg.id;
  176. }
  177. /// <summary>
  178. /// 获取推荐列表
  179. /// </summary>
  180. /// <param name="scoreType"></param>
  181. /// <param name="tags"></param>
  182. /// <returns></returns>
  183. public List<int> GetRecommentItemList(int scoreType, string[] tags)
  184. {
  185. Dictionary<int, List<int>> itemListDic = new Dictionary<int, List<int>>();
  186. Dictionary<int, List<int>> itemDatasDic = DressUpMenuItemDataManager.ItemDatasBySubTypeDic;
  187. foreach (int subType in itemDatasDic.Keys)
  188. {
  189. int key = subType;
  190. if (itemDatasDic.Count == 0) continue;
  191. if (DressUpMenuItemCfg1Array.Instance.CheckIsSceneTypeBySubType(subType)) continue;
  192. List<int> dressList = new List<int>();//= SortDressList(itemDatasDic[subType], scoreType, tags);
  193. if (InstanceZonesDataManager.FightScene == ConstInstanceZonesType.FieldWork)
  194. {
  195. dressList = SortDressList(itemDatasDic[subType], scoreType, tags).ToList();
  196. foreach(var item in FieldWorkDataManager.Instance.HistoryDressupList)
  197. {
  198. dressList.Remove(item);
  199. }
  200. }
  201. else
  202. {
  203. dressList = SortDressList(itemDatasDic[subType], scoreType, tags).ToList();
  204. }
  205. int max = subType == (int)ConstDressUpItemType.TE_SHU ? 3 : 1;
  206. max = Math.Min(max, dressList.Count);
  207. if (DressUpMenuItemCfg1Array.Instance.CheckIsOrnamentsTypeBySubType(subType))
  208. {
  209. key = ConstDressUpItemType.TE_SHU; //饰品全放在一个列表里
  210. }
  211. if (!itemListDic.ContainsKey(key))
  212. {
  213. itemListDic[key] = new List<int>();
  214. }
  215. itemListDic[key].AddRange(dressList.GetRange(0, max));
  216. }
  217. bool isHasLYQ = itemListDic.ContainsKey(ConstDressUpItemType.LIAN_YI_QUN);
  218. bool isHasSY = itemListDic.ContainsKey(ConstDressUpItemType.SHANG_YI);
  219. bool isHasXZ = itemListDic.ContainsKey(ConstDressUpItemType.XIA_ZHUANG);
  220. bool isHasND = itemListDic.ContainsKey(ConstDressUpItemType.NEI_DA);
  221. int countTagLYQ =
  222. isHasLYQ && ItemDataManager.CheckItemTagsRight(itemListDic[ConstDressUpItemType.LIAN_YI_QUN][0], tags)
  223. ? 1
  224. : 0;
  225. int countTagSY =
  226. isHasSY && ItemDataManager.CheckItemTagsRight(itemListDic[ConstDressUpItemType.SHANG_YI][0], tags)
  227. ? 1
  228. : 0;
  229. int countTagXZ =
  230. isHasXZ && ItemDataManager.CheckItemTagsRight(itemListDic[ConstDressUpItemType.XIA_ZHUANG][0], tags)
  231. ? 1
  232. : 0;
  233. int countTagND =
  234. isHasND && ItemDataManager.CheckItemTagsRight(itemListDic[ConstDressUpItemType.NEI_DA][0], tags)
  235. ? 1
  236. : 0;
  237. if (countTagLYQ > countTagSY + countTagXZ + countTagND)
  238. {
  239. itemListDic.Remove(ConstDressUpItemType.NEI_DA);
  240. itemListDic.Remove(ConstDressUpItemType.SHANG_YI);
  241. itemListDic.Remove(ConstDressUpItemType.XIA_ZHUANG);
  242. }
  243. else if (countTagLYQ < countTagSY + countTagXZ + countTagND)
  244. {
  245. itemListDic.Remove(ConstDressUpItemType.LIAN_YI_QUN);
  246. }
  247. else
  248. {
  249. int scoreLYQ = !isHasLYQ
  250. ? 0
  251. : ItemDataManager.GetItemAdditionScore(itemListDic[ConstDressUpItemType.LIAN_YI_QUN][0], scoreType,
  252. tags);
  253. int scoreSY = !isHasSY
  254. ? 0
  255. : ItemDataManager.GetItemAdditionScore(itemListDic[ConstDressUpItemType.SHANG_YI][0], scoreType,
  256. tags);
  257. int scoreXZ = !isHasXZ
  258. ? 0
  259. : ItemDataManager.GetItemAdditionScore(itemListDic[ConstDressUpItemType.XIA_ZHUANG][0], scoreType,
  260. tags);
  261. int scoreND = !isHasND
  262. ? 0
  263. : ItemDataManager.GetItemAdditionScore(itemListDic[ConstDressUpItemType.NEI_DA][0], scoreType,
  264. tags);
  265. if (scoreLYQ > scoreSY + scoreXZ + scoreND)
  266. {
  267. itemListDic.Remove(ConstDressUpItemType.SHANG_YI);
  268. itemListDic.Remove(ConstDressUpItemType.XIA_ZHUANG);
  269. itemListDic.Remove(ConstDressUpItemType.NEI_DA);
  270. }
  271. else
  272. {
  273. itemListDic.Remove(ConstDressUpItemType.LIAN_YI_QUN);
  274. }
  275. }
  276. List<int> itemList = new List<int>();
  277. foreach (int subType in itemListDic.Keys)
  278. {
  279. //DressUpMenuItemDataManager.SortItemListByHighScore(itemListDic[subType]);
  280. if (subType == ConstDressUpItemType.TE_SHU)
  281. {
  282. int max = Math.Min(itemListDic[subType].Count, 5);
  283. itemList.AddRange(itemListDic[subType].GetRange(0, max));
  284. }
  285. else
  286. {
  287. itemList.AddRange(itemListDic[subType]);
  288. }
  289. }
  290. return itemList;
  291. }
  292. /// <summary>
  293. /// 爬塔获取推荐列表
  294. /// </summary>
  295. /// <param name="scoreType"></param>
  296. /// <param name="tags"></param>
  297. /// <returns></returns>
  298. public List<int> GetFieldRecommentItemList(int scoreType, string[] tags)
  299. {
  300. Dictionary<int, List<int>> itemListDic = new Dictionary<int, List<int>>();
  301. Dictionary<int, List<int>> itemDatasDic = DressUpMenuItemDataManager.ItemDatasBySubTypeDic;
  302. foreach (int subType in itemDatasDic.Keys)
  303. {
  304. int key = subType;
  305. if (itemDatasDic.Count == 0) continue;
  306. if (DressUpMenuItemCfg1Array.Instance.CheckIsSceneTypeBySubType(subType)) continue;
  307. List<int> dressList = new List<int>();//= SortDressList(itemDatasDic[subType], scoreType, tags);
  308. if (InstanceZonesDataManager.FightScene == ConstInstanceZonesType.FieldWork)
  309. {
  310. dressList = SortDressList(itemDatasDic[subType], scoreType, tags).ToList();
  311. foreach (var item in FieldWorkDataManager.Instance.HistoryDressupList)
  312. {
  313. dressList.Remove(item);
  314. }
  315. }
  316. else
  317. {
  318. dressList = SortDressList(itemDatasDic[subType], scoreType, tags).ToList();
  319. }
  320. int max = subType == (int)ConstDressUpItemType.TE_SHU ? 3 : 1;
  321. max = Math.Min(max, dressList.Count);
  322. if (DressUpMenuItemCfg1Array.Instance.CheckIsOrnamentsTypeBySubType(subType))
  323. {
  324. key = ConstDressUpItemType.TE_SHU; //饰品全放在一个列表里
  325. }
  326. if (!itemListDic.ContainsKey(key))
  327. {
  328. itemListDic[key] = new List<int>();
  329. }
  330. itemListDic[key].AddRange(dressList.GetRange(0, max));
  331. }
  332. bool isHasLYQ = itemListDic.ContainsKey(ConstDressUpItemType.LIAN_YI_QUN) && itemListDic[ConstDressUpItemType.LIAN_YI_QUN].Count >0;
  333. bool isHasSY = itemListDic.ContainsKey(ConstDressUpItemType.SHANG_YI) && itemListDic[ConstDressUpItemType.SHANG_YI].Count > 0; ;
  334. bool isHasXZ = itemListDic.ContainsKey(ConstDressUpItemType.XIA_ZHUANG) && itemListDic[ConstDressUpItemType.XIA_ZHUANG].Count > 0; ;
  335. bool isHasND = itemListDic.ContainsKey(ConstDressUpItemType.NEI_DA) && itemListDic[ConstDressUpItemType.NEI_DA].Count > 0; ;
  336. int countTagLYQ =
  337. isHasLYQ && ItemDataManager.CheckItemTagsRight(itemListDic[ConstDressUpItemType.LIAN_YI_QUN][0], tags)
  338. ? 1
  339. : 0;
  340. int countTagSY =
  341. isHasSY && ItemDataManager.CheckItemTagsRight(itemListDic[ConstDressUpItemType.SHANG_YI][0], tags)
  342. ? 1
  343. : 0;
  344. int countTagXZ =
  345. isHasXZ && ItemDataManager.CheckItemTagsRight(itemListDic[ConstDressUpItemType.XIA_ZHUANG][0], tags)
  346. ? 1
  347. : 0;
  348. int countTagND =
  349. isHasND && ItemDataManager.CheckItemTagsRight(itemListDic[ConstDressUpItemType.NEI_DA][0], tags)
  350. ? 1
  351. : 0;
  352. if (countTagLYQ > countTagSY + countTagXZ + countTagND)
  353. {
  354. itemListDic.Remove(ConstDressUpItemType.NEI_DA);
  355. itemListDic.Remove(ConstDressUpItemType.SHANG_YI);
  356. itemListDic.Remove(ConstDressUpItemType.XIA_ZHUANG);
  357. }
  358. else if (countTagLYQ < countTagSY + countTagXZ + countTagND)
  359. {
  360. itemListDic.Remove(ConstDressUpItemType.LIAN_YI_QUN);
  361. }
  362. else
  363. {
  364. int scoreLYQ = !isHasLYQ
  365. ? 0
  366. : ItemDataManager.GetItemAdditionScore(itemListDic[ConstDressUpItemType.LIAN_YI_QUN][0], scoreType,
  367. tags);
  368. int scoreSY = !isHasSY
  369. ? 0
  370. : ItemDataManager.GetItemAdditionScore(itemListDic[ConstDressUpItemType.SHANG_YI][0], scoreType,
  371. tags);
  372. int scoreXZ = !isHasXZ
  373. ? 0
  374. : ItemDataManager.GetItemAdditionScore(itemListDic[ConstDressUpItemType.XIA_ZHUANG][0], scoreType,
  375. tags);
  376. int scoreND = !isHasND
  377. ? 0
  378. : ItemDataManager.GetItemAdditionScore(itemListDic[ConstDressUpItemType.NEI_DA][0], scoreType,
  379. tags);
  380. if (scoreLYQ > scoreSY + scoreXZ + scoreND)
  381. {
  382. itemListDic.Remove(ConstDressUpItemType.SHANG_YI);
  383. itemListDic.Remove(ConstDressUpItemType.XIA_ZHUANG);
  384. itemListDic.Remove(ConstDressUpItemType.NEI_DA);
  385. }
  386. else
  387. {
  388. itemListDic.Remove(ConstDressUpItemType.LIAN_YI_QUN);
  389. }
  390. }
  391. List<int> itemList = new List<int>();
  392. foreach (int subType in itemListDic.Keys)
  393. {
  394. //DressUpMenuItemDataManager.SortItemListByHighScore(itemListDic[subType]);
  395. if (subType == ConstDressUpItemType.TE_SHU)
  396. {
  397. int max = Math.Min(itemListDic[subType].Count, 5);
  398. itemList.AddRange(itemListDic[subType].GetRange(0, max));
  399. }
  400. else
  401. {
  402. itemList.AddRange(itemListDic[subType]);
  403. }
  404. }
  405. return itemList;
  406. }
  407. private List<int> SortDressList(List<int> dressList, int scoreType, string[] tags)
  408. {
  409. dressList.Sort((int a, int b) =>
  410. {
  411. ItemCfg cfgA = ItemCfgArray.Instance.GetCfg(a);
  412. ItemCfg cfgB = ItemCfgArray.Instance.GetCfg(b);
  413. bool isTagA = ItemDataManager.CheckItemTagsRight(a, tags);
  414. bool isTagB = ItemDataManager.CheckItemTagsRight(b, tags);
  415. if (isTagA && !isTagB) return -1;
  416. if (isTagB && !isTagA) return 1;
  417. int scoreA = ItemDataManager.GetItemAdditionScore(a, scoreType, tags);
  418. int scoreB = ItemDataManager.GetItemAdditionScore(b, scoreType, tags);
  419. if (scoreA > scoreB) return -1;
  420. if (scoreA < scoreB) return 1;
  421. return cfgA.id - cfgB.id;
  422. });
  423. return dressList;
  424. }
  425. /// <summary>
  426. /// 获取符合标签的服装总个数
  427. /// </summary>
  428. /// <param name="itemList">服装列表</param>
  429. /// <param name="tags">标签</param>
  430. /// <returns></returns>
  431. public int GetTagsCount(List<int> itemList, string[] tags)
  432. {
  433. int count = 0;
  434. for (int i = 0; i < itemList.Count; i++)
  435. {
  436. if (ItemDataManager.CheckItemTagsRight(itemList[i], tags))
  437. {
  438. if (ItemUtilCS.GetItemSubType(itemList[i]) == ConstDressUpItemType.LIAN_YI_QUN)
  439. {
  440. count += 3;
  441. }
  442. else
  443. {
  444. count++;
  445. }
  446. }
  447. }
  448. return count;
  449. }
  450. /*********************************************************************************************************************/
  451. public void SetMineFightAttrs()
  452. {
  453. for (int i = 0; i < DressupList.Count; i++)
  454. {
  455. SetMineFightAttr(DressupList[i], ThemeList[i]);
  456. }
  457. }
  458. public void SetMineFightAttr(FightData fightData, int theme)
  459. {
  460. fightData.cardScore = ItemDataManager.GetItemAdditionScore(fightData.cardId, theme, fightData.tags);
  461. fightData.skillLvs = SkillDataManager.Instance.GetCardSkillLvs(fightData.cardId);
  462. FightDataManager.Instance.SetItemScoreList(fightData);
  463. }
  464. /// <summary>
  465. /// 获取三套服装总战力
  466. /// </summary>
  467. /// <param name="roleType"></param>
  468. /// <param name="roleDatas"></param>
  469. /// <param name="robotDatas"></param>
  470. /// <returns></returns>
  471. public long GetAllFightScore(List<long> fightScores)
  472. {
  473. long fightScore = 0;
  474. for (int i = 0; i < fightScores.Count; i++)
  475. {
  476. fightScore += fightScores[i];
  477. }
  478. return fightScore;
  479. }
  480. public long GetAllFightScore(List<FightData> roleDatas)
  481. {
  482. long fightScore = 0;
  483. List<long> fightScoreDatas = GetFightScoreList(roleDatas);
  484. for (int i = 0; i < fightScoreDatas.Count; i++)
  485. {
  486. fightScore += fightScoreDatas[i];
  487. }
  488. return fightScore;
  489. }
  490. /// <summary>
  491. /// index=0:搭配战力
  492. /// index=1:最高点击战力分 = (卓越点击战力+登峰造极额外加分) / 服装部件评分系数2.33 原来:卓越点击战力
  493. /// index=2:词牌战力/技能战力
  494. /// </summary>
  495. /// <param name="fightDatas"></param>
  496. /// <returns></returns>
  497. public List<long> GetFightScoreList(List<FightData> fightDatas)
  498. {
  499. List<long> fightScoreDatas = new List<long>();
  500. long itemSum = 0;
  501. double clickScore = 0;
  502. long skillScore = 0;
  503. //登峰造极额外加分
  504. double maxScore = 0;
  505. for (int i = 0; i < ThemeList.Count; i++)
  506. {
  507. var fightData = fightDatas[i];
  508. if (fightData.type == FightTargetType.PLAYER)
  509. {
  510. long itemsScore = FightDataManager.Instance.GetScore(fightData);
  511. itemSum += itemsScore;
  512. clickScore += GetPerfectClickScore(fightData);
  513. skillScore += FightDataManager.Instance.GetSkillFightScore(itemsScore, fightData.baseScore,
  514. fightData.leagueSkillScore, fightData.cardId, fightData.cardScore,
  515. fightData.skillLvs);
  516. }
  517. else
  518. {
  519. long itemsScore = FightDataManager.Instance.GetScore(fightData);
  520. itemSum += itemsScore;
  521. clickScore += GetRobotPerfectClickScore(fightData);
  522. skillScore += FightDataManager.Instance.GetSkillFightScore(itemsScore, fightData.baseScore,
  523. fightData.leagueSkillScore, fightData.cardId, fightData.cardScore,
  524. fightData.skillLvs);
  525. }
  526. //总主属性分
  527. double mainScore = ScoreSystemData.Instance.GetMainScore(fightData);
  528. maxScore += ScoreSystemData.Instance.GetAllCircleAddScore(fightData);
  529. }
  530. //A:(部件基础评分+(角色等级分数+角色雅集技能分+词牌对应主题的属性分数)*点击完美附加评分系数0.2) * 点击系数2.22
  531. //A/服装部件评分系数2.33
  532. clickScore = clickScore / ConstScoreSystem.PART_SCORE;
  533. fightScoreDatas.Add(itemSum);
  534. // fightScoreDatas.Add((long)Math.Ceiling(clickScore));
  535. //最高点击战力分 = (卓越点击战力+登峰造极额外加分) / 服装部件评分系数2.33
  536. maxScore = maxScore / ConstScoreSystem.PART_SCORE;
  537. long maxClickScore = (long)Math.Ceiling(clickScore) + (long)Math.Ceiling(maxScore);
  538. fightScoreDatas.Add(maxClickScore);
  539. fightScoreDatas.Add(skillScore);
  540. return fightScoreDatas;
  541. }
  542. /// <summary>
  543. /// 所有部件主属性和
  544. /// </summary>
  545. /// <returns></returns>
  546. public long GetItemScoreSum(List<float> itemScoreList)
  547. {
  548. long scoreSum = 0;
  549. for (int i = 0; i < itemScoreList.Count; i++)
  550. {
  551. scoreSum += (long)itemScoreList[i];
  552. }
  553. return scoreSum;
  554. }
  555. //玩家卓越点击战力
  556. private long GetPerfectClickScore(FightData roleData)
  557. {
  558. double clickScore = 0;
  559. foreach (int key in roleData.partScoreListDic.Keys)
  560. {
  561. double partBaseScore = ScoreSystemData.Instance.GetroundBaseScore(roleData, key);
  562. //start------------------------------------------------------
  563. //本段注释为上个版本的计算公式,留做备份参考
  564. //(部件基础分+(人物基础分+雅集技能分数+卡牌属性分数)*卓越点击系数)*点击系数
  565. //double score =
  566. // (partBaseScore + (roleData.baseScore + roleData.leagueSkillScore + roleData.cardScore) *
  567. // ConstScoreSystem.PERFECT_SCORE) * ConstScoreSystem.CLICK_SCORE;
  568. //end--------------------------------------------------------
  569. //改为 点击评分 =(部件基础分+人物基础分)*点击系数
  570. double score = (partBaseScore + roleData.baseScore)* ConstScoreSystem.PERFECT_SCORE;
  571. clickScore += score;
  572. }
  573. return (long)Math.Ceiling(clickScore);
  574. }
  575. //机器人卓越点击战力
  576. private long GetRobotPerfectClickScore(FightData robotData)
  577. {
  578. long clickScore = 0;
  579. FightScoreCfg[] scoreCfg = FightScoreCfgArray.Instance.dataArray;
  580. for (int i = 0; i < scoreCfg.Length; i++)
  581. {
  582. clickScore +=
  583. (long)ScoreSystemData.Instance.GetRobotRoundScore(robotData, i + 1, ClickType.PERFECT_CLICK, 0);
  584. }
  585. return clickScore;
  586. }
  587. /************************************************************************************************************/
  588. public void AddCheckSeasonOpenTimer()
  589. {
  590. RemoveCheckSeasonOpenTimer();
  591. Timers.inst.Add(1, 0, OnTimeUpdate);
  592. }
  593. private void OnTimeUpdate(object param)
  594. {
  595. if (!IsSeasonOpen) return;
  596. if (ThemeList.Count == 0)
  597. {
  598. ReqArenaInfo();
  599. }
  600. RemoveCheckSeasonOpenTimer();
  601. }
  602. public async void ReqArenaInfo()
  603. {
  604. if (FunctionOpenDataManager.Instance.CheckIsFunOpenById(typeof(ArenaView).Name, false))
  605. {
  606. await ArenaSproxy.ReqArenaInfos();
  607. for (int i = 0; i < ArenaDataManager.Instance.Targets.Count; i++)
  608. {
  609. ArenaTargetData targetData = ArenaDataManager.Instance.Targets[i];
  610. if (targetData.Type == FightTargetType.PLAYER)
  611. {
  612. ArenaSproxy.ReqArenaFightAttr(targetData.RoleInfo.roleId, targetData.FightDatas).Coroutine();
  613. }
  614. }
  615. ArenaSproxy.ReqArenaHistory().Coroutine();
  616. }
  617. }
  618. private void RemoveCheckSeasonOpenTimer()
  619. {
  620. Timers.inst.Remove(OnTimeUpdate);
  621. }
  622. public int GetItemAdditionScore(int itemId, int scoreType, string[] tags = null)
  623. {
  624. ItemCfg itemdate = ItemCfgArray.Instance.GetCfg(itemId);
  625. ItemData itemDate = new ItemData() { };
  626. if (itemdate != null)
  627. {
  628. itemDate.id = itemdate.id;
  629. int scroe = 0;
  630. if (tags != null)
  631. {
  632. scroe += ItemDataManager.GetItemTagScore(itemId, tags);
  633. }
  634. scroe += itemDate.GetScore(scoreType);
  635. return scroe;
  636. }
  637. return 0;
  638. }
  639. public void SetItemScoreList(FightData _roleData, ArenaDressupAttrProto arreProto = null)
  640. {
  641. _roleData.itemScoreList.Clear();
  642. _roleData.itemScoreDic.Clear();
  643. for (int i = 0; i < _roleData.itemList.Count; i++)
  644. {
  645. int score = GetItemAdditionScore(_roleData.itemList[i], _roleData.scoreType);
  646. if(arreProto != null && arreProto.SuitScore.Count == _roleData.itemList.Count)
  647. {
  648. score = arreProto.SuitScore[i];
  649. }
  650. _roleData.itemScoreList.Add(score);
  651. _roleData.itemScoreDic[_roleData.itemList[i]] = score;
  652. }
  653. }
  654. }
  655. }