HeroBreakthroughPanel.cs 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557
  1. using System.Collections.Generic;
  2. using Core.Language;
  3. using Excel2Json;
  4. using Fort23.Core;
  5. using Fort23.UTool;
  6. using GameLogic.Combat;
  7. using GameLogic.Hero;
  8. using UnityEngine;
  9. using UnityEngine.UI;
  10. namespace Fort23.Mono
  11. {
  12. [UIBinding(prefab = "HeroBreakthroughPanel")]
  13. public partial class HeroBreakthroughPanel : UIPanel
  14. {
  15. HeroPowerUpConfig heroPowerUpConfig;
  16. List<BreakthroughItemWidget> breakthroughItemWidgets = new List<BreakthroughItemWidget>();
  17. private HeroInfo nextHeroInfo = new HeroInfo();
  18. /// <summary>
  19. /// 1.正常渡劫 2.渡劫预览
  20. /// </summary>
  21. private int type;
  22. private void Init()
  23. {
  24. }
  25. protected override void AddEvent()
  26. {
  27. EventManager.Instance.AddEventListener(CustomEventType.RefenceBreakthrough, RefenceBreakthrough);
  28. }
  29. private void RefenceBreakthrough(IEventData e)
  30. {
  31. RefenceSuccessProbability(PlayerManager.Instance.myHero);
  32. }
  33. protected override void DelEvent()
  34. {
  35. EventManager.Instance.RemoveEventListener(CustomEventType.RefenceBreakthrough, RefenceBreakthrough);
  36. }
  37. public override void AddButtonEvent()
  38. {
  39. Btn_Close.onClick.AddListener(() => { UIManager.Instance.HideUIUIPanel(this); });
  40. Btn_Cancel.onClick.AddListener(() => { UIManager.Instance.HideUIUIPanel(this); });
  41. Btn_Affirm.onClick.AddListener(async () =>
  42. {
  43. if (type == 2)
  44. {
  45. TipMessagePanel.OpenTipMessagePanel("修为等级还未达到,暂不可预览");
  46. return;
  47. }
  48. if (PlayerManager.Instance.myHero.heroData.exp + HeroHerlp.GetHeroExp() < PlayerManager.Instance.myHero.powerUpConfig.levelUpExp)
  49. {
  50. return;
  51. }
  52. if (heroPowerUpConfig.DujieLevelbattleID != -1 && !PlayerManager.Instance.myHero.heroData.isCombat)
  53. {
  54. TipMessagePanel tipMessage = await TipMessagePanel.OpenTipMessagePanel("没有破除心魔");
  55. return;
  56. }
  57. for (var i = 0; i < PlayerManager.Instance.myHero.powerUpConfig.DujieMustItemIDs.Length; i++)
  58. {
  59. bool isHave = false;
  60. for (var i1 = 1; i1 < breakthroughItemWidgets.Count; i1++)
  61. {
  62. if (breakthroughItemWidgets[i1].itemInfo != null && PlayerManager.Instance.myHero.powerUpConfig.DujieMustItemIDs[i] == breakthroughItemWidgets[i1].itemInfo.itemID)
  63. {
  64. isHave = true;
  65. }
  66. }
  67. if (!isHave)
  68. {
  69. ItemConfig itemConfig = ConfigComponent.Instance.Get<ItemConfig>(PlayerManager.Instance.myHero.powerUpConfig.DujieMustItemIDs[i]);
  70. string tips = "缺少" + LanguageManager.Instance.Text(itemConfig.itemName);
  71. TipMessagePanel tipMessage = await TipMessagePanel.OpenTipMessagePanel(tips);
  72. return;
  73. }
  74. }
  75. //扣除道具
  76. foreach (var breakthroughItemWidget in breakthroughItemWidgets)
  77. {
  78. if (breakthroughItemWidget.itemInfo != null)
  79. {
  80. if (!PlayerManager.Instance.BagController.DeductItem(breakthroughItemWidget.itemInfo.itemID, 1))
  81. {
  82. TipMessagePanel tipMessage = await TipMessagePanel.OpenTipMessagePanel("道具不足!");
  83. return;
  84. }
  85. }
  86. }
  87. var list = GetBl();
  88. int ramdomValue = Random.Range(1, 101);
  89. //突破成功
  90. if (ramdomValue < list[0])
  91. {
  92. bool isTuPoSuccess = true;
  93. if (PlayerManager.Instance.myHero.powerUpConfig.jingjie1 != nextHeroInfo.powerUpConfig.jingjie1)
  94. {
  95. if (PlayerManager.Instance.myHero.powerUpConfig.LeijieDamages != null && PlayerManager.Instance.myHero.powerUpConfig.LeijieDamages.Length > 1)
  96. {
  97. ramdomValue = Random.Range(PlayerManager.Instance.myHero.powerUpConfig.LeijieDamages[0], PlayerManager.Instance.myHero.powerUpConfig.LeijieDamages[1]);
  98. //渡劫失败
  99. if (ramdomValue >= PlayerManager.Instance.myHero.hp.Value)
  100. {
  101. isTuPoSuccess = false;
  102. RemoveHeroItem(list[1]);
  103. TipMessagePanel tipMessage = await TipMessagePanel.OpenTipMessagePanel("雷劫失败");
  104. await tipMessage.UIClosed();
  105. }
  106. }
  107. }
  108. if (isTuPoSuccess)
  109. {
  110. await UpHero();
  111. }
  112. }
  113. //失败
  114. else
  115. {
  116. RemoveHeroItem(list[1]);
  117. TipMessagePanel tipMessage = await TipMessagePanel.OpenTipMessagePanel("突破失败");
  118. await tipMessage.UIClosed();
  119. }
  120. UIManager.Instance.HideUIUIPanel(this);
  121. });
  122. Btn_StartCombat.onClick.AddListener(() =>
  123. {
  124. if (type == 2)
  125. return;
  126. if (PlayerManager.Instance.myHero.heroData.isCombat)
  127. return;
  128. UIManager.Instance.HindCurrAllShowPanel();
  129. CombatDrive.Instance.LoadLevelBattleCombat(heroPowerUpConfig.DujieLevelbattleID,
  130. delegate(bool isWin)
  131. {
  132. LogTool.Log("战斗完成" + isWin);
  133. if (isWin)
  134. {
  135. PlayerManager.Instance.myHero.heroData.isCombat = true;
  136. AccountFileInfo.Instance.SavePlayerData();
  137. Btn_StartCombat.gameObject.SetActive(false);
  138. CombatTrue.gameObject.SetActive(true);
  139. RefenceSuccessProbability(PlayerManager.Instance.myHero);
  140. UIManager.Instance.ShowLastHindAllShowPanel();
  141. }
  142. });
  143. });
  144. }
  145. private void RemoveHeroItem(int failBl)
  146. {
  147. //扣除失败后的经验
  148. float failbl = failBl == 0 ? PlayerManager.Instance.myHero.powerUpConfig.FailureExpReduce : (float)(PlayerManager.Instance.myHero.powerUpConfig.FailureExpReduce * failBl * 0.01f);
  149. int failXw = (int)(PlayerManager.Instance.myHero.powerUpConfig.levelUpExp * failbl * 0.01f);
  150. int allexp = HeroHerlp.GetHeroExp();
  151. PlayerManager.Instance.myHero.heroData.exp += allexp;
  152. PlayerManager.Instance.myHero.heroData.exp -= failXw;
  153. PlayerManager.Instance.myHero.heroData.upTime = TimeHelper.ClientNow();
  154. PlayerManager.Instance.myHero.heroData.isCombat = false;
  155. AccountFileInfo.Instance.SavePlayerData();
  156. }
  157. private async CTask UpHero()
  158. {
  159. var heroAttributData = HeroHerlp.GetHeroChageHeroAttributeData(PlayerManager.Instance.myHero, nextHeroInfo);
  160. PlayerManager.Instance.myHero.Upgrade();
  161. HeroBreakthroughSuccessPanel heroBreakthroughSuccessPanel = await HeroBreakthroughSuccessPanel.OpenPanel(heroAttributData);
  162. await heroBreakthroughSuccessPanel.UIClosed();
  163. }
  164. public async CTask CustomInit()
  165. {
  166. type = 1;
  167. heroPowerUpConfig = PlayerManager.Instance.myHero.powerUpConfig;
  168. nextHeroInfo.InitHero(PlayerManager.Instance.myHero.heroData.heroModelId, PlayerManager.Instance.myHero.heroData.heroPowerId + 1);
  169. Text_CurrrentJIngjie.text = LanguageManager.Instance.Text(heroPowerUpConfig.jingjieLanIDs[0]) +
  170. LanguageManager.Instance.Text(heroPowerUpConfig.jingjieLanIDs[1]) +
  171. LanguageManager.Instance.Text(heroPowerUpConfig.jingjieLanIDs[2]);
  172. Text_NextJinfjie.text = LanguageManager.Instance.Text(nextHeroInfo.powerUpConfig.jingjieLanIDs[0]) +
  173. LanguageManager.Instance.Text(nextHeroInfo.powerUpConfig.jingjieLanIDs[1]) +
  174. LanguageManager.Instance.Text(nextHeroInfo.powerUpConfig.jingjieLanIDs[2]);
  175. if (heroPowerUpConfig.jingjie1 != nextHeroInfo.powerUpConfig.jingjie1)
  176. {
  177. Text_TitleName.text = "渡劫";
  178. Text_Affirm.text = "逆天而行";
  179. Text_AffirmTips.text = "是否确认渡劫";
  180. if (heroPowerUpConfig.LeijieDamages != null && heroPowerUpConfig.LeijieDamages.Length > 1)
  181. {
  182. LeiJieRooot.gameObject.SetActive(true);
  183. Text_LeiJieHarm.text = $"{heroPowerUpConfig.LeijieDamages[0]}-{heroPowerUpConfig.LeijieDamages[1]}";
  184. Text_HeroHp.text = PlayerManager.Instance.myHero.hp.Value.ToString();
  185. if (PlayerManager.Instance.myHero.hp.Value < heroPowerUpConfig.LeijieDamages[0])
  186. {
  187. Text_HeroHp.color = Color.red;
  188. }
  189. else
  190. {
  191. Text_HeroHp.color = Color.black;
  192. }
  193. }
  194. else
  195. {
  196. LeiJieRooot.gameObject.SetActive(false);
  197. }
  198. }
  199. else
  200. {
  201. Text_AffirmTips.text = "是否确认突破";
  202. Text_Affirm.text = "突破";
  203. Text_TitleName.text = "突破";
  204. LeiJieRooot.gameObject.SetActive(false);
  205. }
  206. if (heroPowerUpConfig.DujieLevelbattleID != -1)
  207. {
  208. CombatRoot.gameObject.SetActive(true);
  209. if (PlayerManager.Instance.myHero.heroData.isCombat)
  210. {
  211. Btn_StartCombat.gameObject.SetActive(false);
  212. CombatTrue.gameObject.SetActive(true);
  213. }
  214. else
  215. {
  216. Btn_StartCombat.gameObject.SetActive(true);
  217. CombatTrue.gameObject.SetActive(false);
  218. }
  219. }
  220. else
  221. {
  222. CombatRoot.gameObject.SetActive(false);
  223. }
  224. RefenceSuccessProbability(PlayerManager.Instance.myHero);
  225. Btn_Affirm.transform.RecoverColor();
  226. using (CTaskAwaitBuffer<BreakthroughItemWidget> cTaskAwaitBuffer = new CTaskAwaitBuffer<BreakthroughItemWidget>())
  227. {
  228. for (int i = 0; i < 1 + heroPowerUpConfig.DujieMustItemIDs.Length + heroPowerUpConfig.DujieItemIDs.Length; i++)
  229. {
  230. cTaskAwaitBuffer.AddTask(UIManager.Instance.CreateGComponent<BreakthroughItemWidget>(null, Content));
  231. }
  232. breakthroughItemWidgets = await cTaskAwaitBuffer.WaitAll();
  233. breakthroughItemWidgets[0].CustomInit(1, 0);
  234. //必选道具
  235. for (var i = 0; i < heroPowerUpConfig.DujieMustItemIDs.Length; i++)
  236. {
  237. breakthroughItemWidgets[i + 1].CustomInit(2, heroPowerUpConfig.DujieMustItemIDs[i]);
  238. }
  239. //可选道具
  240. for (var i = 0; i < heroPowerUpConfig.DujieItemIDs.Length; i++)
  241. {
  242. breakthroughItemWidgets[i + heroPowerUpConfig.DujieMustItemIDs.Length + 1].CustomInit(2, heroPowerUpConfig.DujieItemIDs[i]);
  243. }
  244. for (var i = 0; i < breakthroughItemWidgets.Count; i++)
  245. {
  246. breakthroughItemWidgets[i].transform.anchoredPosition = new Vector2((breakthroughItemWidgets[i].transform.sizeDelta.x + 48) * i, 0);
  247. }
  248. Content.sizeDelta = new Vector2((breakthroughItemWidgets[0].transform.sizeDelta.x + 48) * breakthroughItemWidgets.Count, 200);
  249. }
  250. }
  251. private void RefenceSuccessProbability(HeroInfo hero)
  252. {
  253. bool isCan = true;
  254. if (heroPowerUpConfig.DujieLevelbattleID != -1 && !hero.heroData.isCombat)
  255. {
  256. isCan = false;
  257. }
  258. for (var i = 0; i < hero.powerUpConfig.DujieMustItemIDs.Length; i++)
  259. {
  260. bool isHave = false;
  261. for (var i1 = 1; i1 < breakthroughItemWidgets.Count; i1++)
  262. {
  263. if (breakthroughItemWidgets[i1].itemInfo != null && hero.powerUpConfig.DujieMustItemIDs[i] == breakthroughItemWidgets[i1].itemInfo.itemID)
  264. {
  265. isHave = true;
  266. }
  267. }
  268. if (!isHave)
  269. {
  270. isCan = false;
  271. break;
  272. }
  273. }
  274. int failXw = 0;
  275. float failbl = 0;
  276. int successBl = 0;
  277. var list = GetBl();
  278. failbl = list[1] == 0 ? hero.powerUpConfig.FailureExpReduce : (float)(hero.powerUpConfig.FailureExpReduce * list[1] * 0.01f);
  279. successBl = list[0];
  280. if (isCan)
  281. {
  282. // var list = GetBl();
  283. //
  284. // failbl = list[1] == 0 ? PlayerManager.Instance.myHero.powerUpConfig.FailureExpReduce : (float)(PlayerManager.Instance.myHero.powerUpConfig.FailureExpReduce * list[1] * 0.01f);
  285. // successBl = list[0];
  286. if (hero.powerUpConfig.jingjie1 != nextHeroInfo.powerUpConfig.jingjie1)
  287. {
  288. Text_AffirmTips.text = "是否确认渡劫";
  289. }
  290. else
  291. {
  292. Text_AffirmTips.text = "是否确认突破";
  293. }
  294. }
  295. else
  296. {
  297. //提示需要什么道具
  298. string tips = "需要 破除心魔 ";
  299. foreach (var dujieMustItemID in hero.powerUpConfig.DujieMustItemIDs)
  300. {
  301. ItemConfig itemConfig = ConfigComponent.Instance.Get<ItemConfig>(dujieMustItemID);
  302. tips += " " + LanguageManager.Instance.Text(itemConfig.itemName);
  303. }
  304. if (hero.powerUpConfig.jingjie1 != nextHeroInfo.powerUpConfig.jingjie1)
  305. {
  306. Text_AffirmTips.text = tips;
  307. }
  308. else
  309. {
  310. Text_AffirmTips.text = tips;
  311. }
  312. //
  313. // failbl = PlayerManager.Instance.myHero.powerUpConfig.FailureExpReduce;
  314. // successBl = 0;
  315. }
  316. failXw = (int)(hero.powerUpConfig.levelUpExp * failbl * 0.01f);
  317. Text_FailDesc.text = $"失败损失修为:{failXw}修为";
  318. Text_SucceedDesc.text = $"成功几率:{successBl}%";
  319. LayoutRebuilder.ForceRebuildLayoutImmediate(Text_AffirmTips.GetComponent<RectTransform>());
  320. LayoutRebuilder.ForceRebuildLayoutImmediate(Text_AffirmTips.transform.parent.GetComponent<RectTransform>());
  321. }
  322. private List<int> GetBl()
  323. {
  324. int succesAllBl = 0;
  325. int failAllBl = 0;
  326. if (heroPowerUpConfig.DujieLevelbattleID != -1 && PlayerManager.Instance.myHero.heroData.isCombat)
  327. {
  328. succesAllBl += heroPowerUpConfig.DujieRateviaBattle;
  329. }
  330. foreach (var breakthroughItemWidget in breakthroughItemWidgets)
  331. {
  332. if (breakthroughItemWidget.itemInfo != null)
  333. {
  334. if (breakthroughItemWidget.itemInfo.config.itemTag == 3)
  335. {
  336. succesAllBl += breakthroughItemWidget.itemInfo.config.associateVlaue[2];
  337. failAllBl += breakthroughItemWidget.itemInfo.config.associateVlaue[3];
  338. }
  339. else
  340. {
  341. succesAllBl += breakthroughItemWidget.itemInfo.config.associateVlaue[2];
  342. }
  343. }
  344. }
  345. return new List<int> { succesAllBl, failAllBl };
  346. }
  347. public async static CTask<HeroBreakthroughPanel> OpenPanel()
  348. {
  349. HeroBreakthroughPanel heroBreakthroughPanel = await UIManager.Instance.LoadAndOpenPanel<HeroBreakthroughPanel>(null);
  350. heroBreakthroughPanel.CustomInit();
  351. return heroBreakthroughPanel;
  352. }
  353. //渡劫预览
  354. public async static CTask<HeroBreakthroughPanel> OpenPanel1(HeroInfo heroInfo1)
  355. {
  356. HeroBreakthroughPanel heroBreakthroughPanel = await UIManager.Instance.LoadAndOpenPanel<HeroBreakthroughPanel>(null);
  357. heroBreakthroughPanel.CustomInit(heroInfo1);
  358. return heroBreakthroughPanel;
  359. }
  360. public async CTask CustomInit(HeroInfo heroInfo1)
  361. {
  362. type = 2;
  363. heroPowerUpConfig = heroInfo1.powerUpConfig;
  364. nextHeroInfo.InitHero(PlayerManager.Instance.myHero.heroData.heroModelId, heroInfo1.heroData.heroPowerId + 1);
  365. Text_CurrrentJIngjie.text = LanguageManager.Instance.Text(heroPowerUpConfig.jingjieLanIDs[0]) +
  366. LanguageManager.Instance.Text(heroPowerUpConfig.jingjieLanIDs[1]) +
  367. LanguageManager.Instance.Text(heroPowerUpConfig.jingjieLanIDs[2]);
  368. Text_NextJinfjie.text = LanguageManager.Instance.Text(nextHeroInfo.powerUpConfig.jingjieLanIDs[0]) +
  369. LanguageManager.Instance.Text(nextHeroInfo.powerUpConfig.jingjieLanIDs[1]) +
  370. LanguageManager.Instance.Text(nextHeroInfo.powerUpConfig.jingjieLanIDs[2]);
  371. if (heroPowerUpConfig.jingjie1 != nextHeroInfo.powerUpConfig.jingjie1)
  372. {
  373. Text_TitleName.text = "渡劫预览";
  374. Text_Affirm.text = "逆天而行";
  375. Text_AffirmTips.text = "是否确认渡劫";
  376. if (heroPowerUpConfig.LeijieDamages != null && heroPowerUpConfig.LeijieDamages.Length > 1)
  377. {
  378. LeiJieRooot.gameObject.SetActive(true);
  379. Text_LeiJieHarm.text = $"{heroPowerUpConfig.LeijieDamages[0]}-{heroPowerUpConfig.LeijieDamages[1]}";
  380. Text_HeroHp.text = PlayerManager.Instance.myHero.hp.Value.ToString();
  381. if (PlayerManager.Instance.myHero.hp.Value < heroPowerUpConfig.LeijieDamages[0])
  382. {
  383. Text_HeroHp.color = Color.red;
  384. }
  385. else
  386. {
  387. Text_HeroHp.color = Color.black;
  388. }
  389. }
  390. else
  391. {
  392. LeiJieRooot.gameObject.SetActive(false);
  393. }
  394. }
  395. else
  396. {
  397. Text_AffirmTips.text = "是否确认突破";
  398. Text_Affirm.text = "突破";
  399. Text_TitleName.text = "突破";
  400. LeiJieRooot.gameObject.SetActive(false);
  401. }
  402. if (heroPowerUpConfig.DujieLevelbattleID != -1)
  403. {
  404. CombatRoot.gameObject.SetActive(true);
  405. if (heroInfo1.heroData.isCombat)
  406. {
  407. Btn_StartCombat.gameObject.SetActive(false);
  408. CombatTrue.gameObject.SetActive(true);
  409. }
  410. else
  411. {
  412. Btn_StartCombat.gameObject.SetActive(true);
  413. CombatTrue.gameObject.SetActive(false);
  414. }
  415. }
  416. else
  417. {
  418. CombatRoot.gameObject.SetActive(false);
  419. }
  420. RefenceSuccessProbability(heroInfo1);
  421. Btn_Affirm.transform.Gray(false);
  422. using (CTaskAwaitBuffer<BreakthroughItemWidget> cTaskAwaitBuffer = new CTaskAwaitBuffer<BreakthroughItemWidget>())
  423. {
  424. for (int i = 0; i < 1 + heroPowerUpConfig.DujieMustItemIDs.Length + heroPowerUpConfig.DujieItemIDs.Length; i++)
  425. {
  426. cTaskAwaitBuffer.AddTask(UIManager.Instance.CreateGComponent<BreakthroughItemWidget>(null, Content));
  427. }
  428. breakthroughItemWidgets = await cTaskAwaitBuffer.WaitAll();
  429. breakthroughItemWidgets[0].CustomInit(1, 0);
  430. //必选道具
  431. for (var i = 0; i < heroPowerUpConfig.DujieMustItemIDs.Length; i++)
  432. {
  433. breakthroughItemWidgets[i + 1].CustomInit(2, heroPowerUpConfig.DujieMustItemIDs[i]);
  434. }
  435. //可选道具
  436. for (var i = 0; i < heroPowerUpConfig.DujieItemIDs.Length; i++)
  437. {
  438. breakthroughItemWidgets[i + heroPowerUpConfig.DujieMustItemIDs.Length + 1].CustomInit(2, heroPowerUpConfig.DujieItemIDs[i]);
  439. }
  440. for (var i = 0; i < breakthroughItemWidgets.Count; i++)
  441. {
  442. breakthroughItemWidgets[i].transform.anchoredPosition = new Vector2((breakthroughItemWidgets[i].transform.sizeDelta.x + 48) * i, 0);
  443. }
  444. Content.sizeDelta = new Vector2((breakthroughItemWidgets[0].transform.sizeDelta.x + 48) * breakthroughItemWidgets.Count, 200);
  445. }
  446. }
  447. public override void Close()
  448. {
  449. foreach (var breakthroughItemWidget in breakthroughItemWidgets)
  450. {
  451. UIManager.Instance.DormancyGComponent(breakthroughItemWidget);
  452. }
  453. breakthroughItemWidgets.Clear();
  454. heroPowerUpConfig = default;
  455. type = 0;
  456. base.Close();
  457. }
  458. }
  459. }