InstanceZonesDataManager.cs 14 KB

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