InstanceZonesDataManager.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436
  1. using System;
  2. using System.Collections.Generic;
  3. using cfg.GfgCfg;
  4. using UnityEngine;
  5. namespace GFGGame
  6. {
  7. //本类为通用关卡数据类,特殊副本类型数据请写到各自的管理器里
  8. public class InstanceZonesDataManager
  9. {
  10. //所有副本关卡通用换装战斗是否使用推荐
  11. public static bool usedRecommend;
  12. //所有副本关卡通用
  13. public static int currentScoreType;
  14. //所有副本关卡通用
  15. public static int currentCardId = 0;
  16. //快速挑战挑战次数
  17. public static int FightTimes = 10;
  18. //是否速刷中
  19. public static bool isQuicklyFighting = false;
  20. //是否结算中
  21. public static bool isResultFighting = false;
  22. //战斗场景
  23. public static int FightScene;
  24. //战斗结算数据
  25. public static StoryFightResultData resultData;
  26. //是否战斗结算界面关闭
  27. public static bool isFightResultHide = false;
  28. public static List<string> currentFightTags;
  29. private static int _currentLevelCfgId;
  30. //所有副本关卡通用配置表的id
  31. public static int currentLevelCfgId
  32. {
  33. get
  34. {
  35. return _currentLevelCfgId;
  36. }
  37. set
  38. {
  39. _currentLevelCfgId = value;
  40. var levelCfg = CommonDataManager.Tables.TblStoryLevelCfg.GetOrDefault(_currentLevelCfgId);
  41. if (levelCfg.Type == ConstInstanceZonesType.Story)
  42. {
  43. MainStoryDataManager.currentLevelCfgId = _currentLevelCfgId;
  44. }
  45. if (string.IsNullOrEmpty(levelCfg.FightID))
  46. {
  47. currentFightTags = null;
  48. }
  49. else
  50. {
  51. StoryFightCfg storyFightCfg = CommonDataManager.Tables.TblStoryFightCfg.GetOrDefault(int.Parse(levelCfg.FightID));
  52. currentFightTags = storyFightCfg.NeedTags;
  53. }
  54. }
  55. }
  56. //所有副本关卡通用
  57. public static int currentLevelOrder
  58. {
  59. get
  60. {
  61. var levelCfg = CommonDataManager.Tables.TblStoryLevelCfg.GetOrDefault(_currentLevelCfgId);
  62. return levelCfg.Order;
  63. }
  64. }
  65. private static FightData _roleData = new FightData();
  66. public static FightData roleData
  67. {
  68. get
  69. {
  70. return GetMyFightRoleData();
  71. }
  72. }
  73. private static FightData _targetData = new FightData();
  74. public static FightData targetData
  75. {
  76. get
  77. {
  78. return GetFightTargetData();
  79. }
  80. }
  81. //获取玩家战斗数据
  82. private static FightData GetMyFightRoleData()
  83. {
  84. _roleData.name = RoleDataManager.roleName;
  85. _roleData.scoreType = InstanceZonesDataManager.currentScoreType;
  86. _roleData.baseScore = CommonDataManager.Tables.TblRoleLevelCfg.GetOrDefault(RoleDataManager.lvl).BaseScore;
  87. if(_roleData.scoreType != 0)
  88. _roleData.leagueSkillScore = LeagueDataManager.Instance.GetAllSkillScore(_roleData.scoreType);
  89. _roleData.cardId = InstanceZonesDataManager.currentCardId; ;//词牌id
  90. CardData cardData = CardDataManager.GetCardDataById(_roleData.cardId);
  91. _roleData.cardScore = _roleData.cardId <= 0 || cardData == null ? 0 : cardData.scores[_roleData.scoreType];//词牌对应主题的属性分数
  92. StoryLevelCfg levelCfg = CommonDataManager.Tables.TblStoryLevelCfg.GetOrDefault(InstanceZonesDataManager.currentLevelCfgId);
  93. if (levelCfg != null && !string.IsNullOrEmpty(levelCfg.FightID))
  94. {
  95. StoryFightCfg fightCfg = CommonDataManager.Tables.TblStoryFightCfg.GetOrDefault(int.Parse(levelCfg.FightID));
  96. _roleData.tags = fightCfg.NeedTags;////本次战斗要求的标签
  97. }
  98. if (_roleData.cardId > 0)
  99. {
  100. _roleData.skillLvs = SkillDataManager.Instance.GetCardSkillLvs(_roleData.cardId);
  101. }
  102. _roleData.type = FightTargetType.PLAYER;
  103. _roleData.headId = RoleDataManager.headId;
  104. _roleData.itemList = MyDressUpHelper.dressUpObj.itemList;
  105. FightDataManager.Instance.SetItemScoreList(_roleData);
  106. ScoreSystemData.Instance.SetEquipScoresWithPartId(_roleData);
  107. return _roleData;
  108. }
  109. //获取副本机器人战斗数据
  110. public static FightData GetFightTargetData()
  111. {
  112. StoryLevelCfg levelCfg = CommonDataManager.Tables.TblStoryLevelCfg.GetOrDefault(InstanceZonesDataManager.currentLevelCfgId);
  113. StoryFightCfg fightCfg = CommonDataManager.Tables.TblStoryFightCfg.GetOrDefault(int.Parse(levelCfg.FightID));
  114. _targetData.name = fightCfg.TargetName;
  115. _targetData.scoreType = InstanceZonesDataManager.currentScoreType; //本次战斗的主题
  116. _targetData.baseScore = fightCfg.TargetBaseScore;
  117. _targetData.leagueSkillScore = 0;
  118. _targetData.cardId = fightCfg.TargetCardId;
  119. _targetData.cardScore = fightCfg.TargetCardScore;
  120. _targetData.tags = fightCfg.NeedTags;
  121. List<PassivitySkillCfg> skillCfgs = CommonDataManager.Tables.TblPassivitySkillCfg.GetGroup1ByCardId(_targetData.cardId);
  122. _targetData.skillLvs.Clear();
  123. for (int i = 0; i < skillCfgs.Count; i++)
  124. {
  125. _targetData.skillLvs.Add(fightCfg.TargetSkillLvs);
  126. }
  127. _targetData.itemScoreList.Clear();
  128. for (int i = 0; i < fightCfg.TargetPartsScore.Count; i++)
  129. {
  130. _targetData.itemScoreList.Add(fightCfg.TargetPartsScore[i]);
  131. }
  132. _targetData.type = FightTargetType.ROBOT;
  133. _targetData.res = fightCfg.TargetRes;
  134. return _targetData;
  135. }
  136. //副本通关状态,key为CalculateHelper.GenerateInstanceZonesLevelStateKey,值为通到关卡编号
  137. private static Dictionary<int, int> _passLevelDic = new Dictionary<int, int>();
  138. //关卡最高分数记录
  139. private static Dictionary<int, int> _highestScoreDic = new Dictionary<int, int>();
  140. //关卡星数记录
  141. private static Dictionary<int, int> _starDic = new Dictionary<int, int>();
  142. public static void InitScoreList(List<int> ks, List<int> vs)
  143. {
  144. usedRecommend = false;
  145. _highestScoreDic.Clear();
  146. for (var i = 0; i < ks.Count; ++i)
  147. {
  148. _highestScoreDic.Add(ks[i], vs[i]);
  149. }
  150. }
  151. public static void InitStarList(List<int> ks, List<int> vs)
  152. {
  153. _starDic.Clear();
  154. for (var i = 0; i < ks.Count; ++i)
  155. {
  156. _starDic.Add(ks[i], vs[i]);
  157. }
  158. }
  159. //检查更新最高分
  160. public static void TryUpdateScore(int levelCfgId, int score)
  161. {
  162. _highestScoreDic.TryGetValue(levelCfgId, out var scoreHighest);
  163. if (score > scoreHighest)
  164. {
  165. _highestScoreDic[levelCfgId] = score;
  166. }
  167. }
  168. public static int GetScoreHighest(int levelID)
  169. {
  170. if (_highestScoreDic.ContainsKey(levelID))
  171. {
  172. return _highestScoreDic[levelID];
  173. }
  174. return 0;
  175. }
  176. //检查并更新关卡星数
  177. public static void TryUpdateLevelStar(int levelCfgId, int star)
  178. {
  179. _starDic.TryGetValue(levelCfgId, out var OldStar);
  180. if (star > OldStar)
  181. {
  182. _starDic[levelCfgId] = star;
  183. }
  184. }
  185. public static int GetStarCountHistory(int levelCfgId)
  186. {
  187. _starDic.TryGetValue(levelCfgId, out var star);
  188. return star;
  189. }
  190. public static int GetChapterStarCount(int chapterID, int type, int subType)
  191. {
  192. var star = 0;
  193. foreach (var item in _starDic)
  194. {
  195. var levelCfg = CommonDataManager.Tables.TblStoryLevelCfg.GetOrDefault(item.Key);
  196. if (levelCfg == null) continue;
  197. if (levelCfg.ChapterId == chapterID && levelCfg.Type == type && levelCfg.SubType == subType)
  198. {
  199. star += item.Value;
  200. }
  201. }
  202. return star;
  203. }
  204. public static void InitLevelPass(List<int> ks, List<int> vs)
  205. {
  206. _passLevelDic.Clear();
  207. for (var i = 0; i < ks.Count; ++i)
  208. {
  209. _passLevelDic[ks[i]] = vs[i];
  210. }
  211. }
  212. /// <summary>
  213. /// 设置某关卡通过,参数为关卡配置id
  214. /// </summary>
  215. /// <param name="levelCfgId"></param>
  216. public static void TrySetLevelPass(int levelCfgId)
  217. {
  218. if (!CheckLevelPass(levelCfgId))
  219. {
  220. var levelCfg = CommonDataManager.Tables.TblStoryLevelCfg.GetOrDefault(levelCfgId);
  221. var key = CalculateHelper.GenerateInstanceZonesLevelStateKey(levelCfg.Type, levelCfg.SubType, levelCfg.ChapterId);
  222. _passLevelDic[key] = levelCfgId;
  223. }
  224. }
  225. /// <summary>
  226. /// 获取副本通关关卡
  227. /// </summary>
  228. /// <param name="type" value="副本类型"></param>
  229. /// <param name="subType" value="章节id"></param>
  230. /// <returns></returns>
  231. public static int GetPassLevelCfgId(int type, int subType, int chapterId)
  232. {
  233. var key = CalculateHelper.GenerateInstanceZonesLevelStateKey(type, subType, chapterId);
  234. if (_passLevelDic.TryGetValue(key, out var value))
  235. {
  236. return value;
  237. }
  238. return 0;
  239. }
  240. /// <summary>
  241. /// 获取通关关卡的编号
  242. /// </summary>
  243. /// <param name="type"></param>
  244. /// <param name="subType"></param>
  245. /// <param name="chapterId"></param>
  246. /// <returns></returns>
  247. public static int GetPassLevelOrder(int type, int subType, int chapterId)
  248. {
  249. var levelCfgId = GetPassLevelCfgId(type, subType, chapterId);
  250. if (levelCfgId == 0)
  251. {
  252. return 0;
  253. }
  254. var levelCfg = CommonDataManager.Tables.TblStoryLevelCfg.GetOrDefault(levelCfgId);
  255. if (levelCfg != null)
  256. {
  257. return levelCfg.Order;
  258. }
  259. return 0;
  260. }
  261. /// <summary>
  262. /// 检查某关卡是否通过,参数为关卡配置id
  263. /// </summary>
  264. /// <param name="levelCfgId"></param>
  265. /// <returns></returns>
  266. public static bool CheckLevelPass(int levelCfgId)
  267. {
  268. var levelCfg = CommonDataManager.Tables.TblStoryLevelCfg.GetOrDefault(levelCfgId);
  269. if (levelCfg != null)
  270. {
  271. var passLevelOrder = GetPassLevelOrder(levelCfg.Type, levelCfg.SubType, levelCfg.ChapterId);
  272. return levelCfg.Order <= passLevelOrder;
  273. }
  274. return false;
  275. }
  276. /// <summary>
  277. /// 检查某章是否通关
  278. /// </summary>
  279. /// <param name="type"></param>
  280. /// <param name="subType"></param>
  281. /// <param name="chapterId"></param>
  282. /// <param name="levelCount"></param>
  283. /// <returns></returns>
  284. public static bool CheckChapterPass(int type, int subType, int chapterId, int levelCount)
  285. {
  286. var chapterCfg = CommonDataManager.Tables.TblStoryChapterCfg.GetOrDefault(chapterId);
  287. if (chapterCfg != null)
  288. {
  289. var passLevelOrder = InstanceZonesDataManager.GetPassLevelOrder(type, subType, chapterId);
  290. if (levelCount <= passLevelOrder)
  291. {
  292. return true;
  293. }
  294. }
  295. return false;
  296. }
  297. public static int GetResultStarCount(int score)
  298. {
  299. return CalculateHelper.GetStoryChapterStar(currentLevelCfgId, score);
  300. }
  301. public static bool GetFightResult(int score, out int npcScore)
  302. {
  303. npcScore = 0;
  304. bool equipedNeeded = MyDressUpHelper.CheckEquipedFightNeeded();
  305. if (!equipedNeeded)
  306. {
  307. PromptController.Instance.ShowFloatTextPrompt("未穿必需物品");
  308. return false;//没穿必需品
  309. }
  310. StoryLevelCfg levelCfg = CommonDataManager.Tables.TblStoryLevelCfg.GetOrDefault(currentLevelCfgId);
  311. StoryFightCfg fightCfg = CommonDataManager.Tables.TblStoryFightCfg.GetOrDefault(int.Parse(levelCfg.FightID));
  312. bool hasFightTarget = fightCfg.TargetName != null && fightCfg.TargetName.Length > 0;
  313. if (hasFightTarget)
  314. {
  315. npcScore = FightDataManager.Instance.npcTotalScore;
  316. if (score > npcScore)
  317. {
  318. return true;//分数低于对战对象
  319. }
  320. }
  321. else
  322. {
  323. int starCount = GetResultStarCount(score);
  324. if (starCount > 0)
  325. {
  326. return true;//低于一星
  327. }
  328. }
  329. return false;
  330. }
  331. public static void GetCanFightTime(int type, int subType, int levelCfgId, out int times, out string title)
  332. {
  333. var levelCfg = CommonDataManager.Tables.TblStoryLevelCfg.GetOrDefault(levelCfgId);
  334. //不需要消耗体力
  335. if (levelCfg.Power == 0)
  336. {
  337. times = GameConst.MAX_COUNT_FIGHT_QUICKLY;
  338. //神都宸游
  339. if (levelCfg.Type == ConstInstanceZonesType.PureFight) {
  340. var activityFightCfg = CommonDataManager.Tables.TblActivityFightCfg.GetOrDefault(levelCfg.ChapterId);
  341. RoleLimitData limitData = RoleLimitDataManager.GetLimitData(activityFightCfg.Limit);
  342. times = limitData.TotalPlayMax - limitData.PlayTimes;
  343. }
  344. }
  345. else
  346. {
  347. times = (int)Math.Floor((float)RoleDataManager.power / levelCfg.Power);//体力次数
  348. }
  349. times = Math.Min(GameConst.MAX_COUNT_FIGHT_QUICKLY, times);
  350. title = "";
  351. if (type == ConstInstanceZonesType.Studio)
  352. {
  353. var studioCfg = CommonDataManager.Tables.TblStudioCfg.GetOrDefault(levelCfg.ChapterId);
  354. var limitData = RoleLimitDataManager.GetLimitData(studioCfg.Limit);
  355. times = Math.Min(times, limitData.TotalPlayMax - limitData.PlayTimes);
  356. }
  357. else if(type == ConstInstanceZonesType.PureFight && subType == 1)
  358. {
  359. var zcjbFightCfg = CommonDataManager.Tables.TblActivityFightCfg.GetOrDefault(levelCfg.ChapterId);
  360. var limitData = RoleLimitDataManager.GetLimitData(zcjbFightCfg.Limit);
  361. times = Math.Min(times, 10);
  362. }
  363. else if (type == ConstInstanceZonesType.PureFight && subType == 2)
  364. {
  365. var activityFightCfg = CommonDataManager.Tables.TblActivityFightCfg.GetOrDefault(levelCfg.ChapterId);
  366. RoleLimitData limitData = RoleLimitDataManager.GetLimitData(activityFightCfg.Limit);
  367. int time = limitData.TotalPlayMax - limitData.PlayTimes;
  368. times = Math.Min(times, time);
  369. }
  370. else if(type == 1 && subType == 1)
  371. {
  372. //精英关卡特殊处理
  373. RoleLimitData limitData = RoleLimitDataManager.GetLimitData(50);
  374. int time = limitData.TotalPlayMax - limitData.PlayTimes;
  375. times = Math.Min(times, time);
  376. }
  377. title = string.Format("挑战{0}次", NumberUtil.GetChiniseNumberText(times));
  378. }
  379. public static void GetTotalProgress(out int count, out int totalCount)
  380. {
  381. List<StoryChapterCfg> storyChapters = CommonDataManager.Tables.TblStoryChapterCfg.GetGroup1BySubType(ConstInstanceZonesSubType.Normal);
  382. totalCount = storyChapters.Count;
  383. count = 0;
  384. for (int i = 0; i < storyChapters.Count; i++)
  385. {
  386. bool isPass = InstanceZonesDataManager.CheckChapterPass(storyChapters[i].Type, storyChapters[i].SubType, storyChapters[i].Id, storyChapters[i].LevelCount);
  387. if (isPass)
  388. {
  389. count++;
  390. }
  391. else
  392. {
  393. break;
  394. }
  395. }
  396. }
  397. }
  398. }