ArenaDataManager.cs 31 KB

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