AchieveManager.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657
  1. using UnityEngine;
  2. using UnityEngine.UI;
  3. using UnityEngine.Events;
  4. using System;
  5. using System.Xml;
  6. using System.Text;
  7. using System.Collections;
  8. using System.Collections.Generic;
  9. using Object = UnityEngine.Object;
  10. public enum AchieveType
  11. {
  12. TotalPerson,
  13. ElfLevel,
  14. GardenLevel,
  15. AdAmt,
  16. SkillAmt,
  17. SignAmt,
  18. CloseAmt,
  19. ShareAmt,
  20. FlowerAmt,
  21. MiniGameAmt,
  22. TotalCoin,
  23. FlowerCoin,
  24. CurrentCoin,
  25. CostDiamond,
  26. CreateRoomAmt,
  27. CreateChestAmt,
  28. CreateLuckyChestAmt,
  29. CreateGuessColorChestAmt,
  30. CreateGuessNumberChestAmt,
  31. GetChestAwardAmt,
  32. }
  33. public class Achieve
  34. {
  35. #region Config
  36. private static string IDPrefix = "Achieve";
  37. private string NameLanLabel
  38. {
  39. get { return LabelUtility.CombineLanguageLabel(LanguageLabel.AchieveName,FullID); }
  40. }
  41. private string DescLanLabel
  42. {
  43. get { return LabelUtility.CombineLanguageLabel(LanguageLabel.AchieveDesc, FullID); }
  44. }
  45. public string FullID
  46. {
  47. get
  48. {
  49. return IDPrefix + ID;
  50. }
  51. }
  52. public string Desc
  53. {
  54. get
  55. {
  56. return Language.GetStr(DescLanLabel);
  57. }
  58. }
  59. public string Name
  60. {
  61. get
  62. {
  63. return Language.GetStr(NameLanLabel);
  64. }
  65. }
  66. public Sprite Sprite
  67. {
  68. get { return ResourceManager.LoadSprite(SpriteName, Folder.UI); }
  69. }
  70. public double CurrentValue
  71. {
  72. get { return currentValue; }
  73. set
  74. {
  75. currentValue = value;
  76. Slider.value = (float)(currentValue / TargetValue);
  77. if (currentValue >= TargetValue)
  78. {
  79. ToComplete();
  80. }
  81. else
  82. {
  83. ToProcess(currentValue);
  84. }
  85. }
  86. }
  87. public double currentValue;
  88. public int ID;
  89. public string SpriteName;
  90. public int Index;
  91. public int Parent;
  92. public float Person;
  93. public float CoinPerson;
  94. public float DiamondOnce;
  95. public bool Lock = true;
  96. public bool Delete;
  97. public bool Complete;
  98. public double TargetValue;
  99. public Achieve PostAchieve;
  100. public AchieveType AchieveType;
  101. public Text Tit;
  102. public Text Lab;
  103. public Text BtnLab;
  104. public Slider Slider;
  105. public Image Image;
  106. public Button Button;
  107. public Transform AchieveItem;
  108. #endregion
  109. public Achieve(XmlAttributeCollection attribute)
  110. {
  111. SpriteName = attribute[11].Value;
  112. Delete = Auxiliary.StringToBool(attribute[7].Value, false);
  113. Parent = Auxiliary.StringToInt(attribute[6].Value, -1);
  114. AchieveType = TypeParse(attribute[4].Value);
  115. ID = int.Parse(attribute[0].Value);
  116. Index = int.Parse(attribute[1].Value) - 1;
  117. TargetValue = double.Parse(attribute[5].Value);
  118. Person = Auxiliary.StringToFloat(attribute[10].Value, 0);
  119. CoinPerson = Auxiliary.StringToFloat(attribute[9].Value, 0);
  120. DiamondOnce = Auxiliary.StringToFloat(attribute[8].Value, 0);
  121. AchieveManager.AchieveDic.Add(ID, this);
  122. if (Parent != -1)
  123. {
  124. AchieveManager.AchieveDic[Parent].PostAchieve = this;
  125. }
  126. }
  127. public void Init()
  128. {
  129. AchieveItem = ResourceManager.GetAchieveItem();
  130. Dictionary<string, Transform> dic = new Dictionary<string, Transform>();
  131. Auxiliary.CompileDic(AchieveItem, dic);
  132. Tit = dic["Tit"].GetComponent<Text>();
  133. Lab = dic["Lab"].GetComponent<Text>();
  134. Slider = dic["Slider"].GetComponent<Slider>();
  135. Image = dic["Icon"].GetComponent<Image>();
  136. Button = dic["Btn"].GetComponent<Button>();
  137. BtnLab = dic["BtnLab"].GetComponent<Text>();
  138. Lab.text = GetDescription(Desc, TargetValue);
  139. Image.sprite = Sprite;
  140. AchieveItem.SetSiblingIndex(Index);
  141. Button.onClick.RemoveAllListeners();
  142. Button.onClick.AddListener(GetAward);
  143. LanguageManager.Add(Tit, new MulLanStr(LabelUtility.CombineLanguageLabel(LanguageLabel.AchieveName, FullID)));
  144. if (Lock)
  145. {
  146. UpdateStatus();
  147. AchieveManager.DeleDic.Add(AchieveType, UpdateStatus);
  148. }
  149. else
  150. {
  151. ToFinish();
  152. }
  153. }
  154. public void GetAward()
  155. {
  156. Lock = false;
  157. Complete = false;
  158. AchieveManager.UpdateHint();
  159. Manager.AddDiamond(DiamondOnce, StaticsManager.ItemID.获得钻石, StaticsManager.ConsumeModule.Achieve);
  160. Manager.SkillPerson += Person;
  161. Manager.SkillCoinPerson += CoinPerson;
  162. AudioManager.PlayClip(Clip.CurrentClip);
  163. AchieveManager.DeleDic.Remove(AchieveType);
  164. if (Delete)
  165. {
  166. ResourceManager.Save(AchieveItem);
  167. AchieveItem = null;
  168. if (PostAchieve != null)
  169. {
  170. PostAchieve.Init();
  171. }
  172. }
  173. else
  174. {
  175. ToFinish();
  176. }
  177. }
  178. public void UpdateStatus()
  179. {
  180. if (AchieveType == AchieveType.TotalPerson)
  181. {
  182. UpdateStatus(Manager.TotalPerson);
  183. }
  184. else if (AchieveType == AchieveType.ElfLevel)
  185. {
  186. UpdateStatus(Manager.ElfLevel);
  187. }
  188. else if (AchieveType == AchieveType.GardenLevel)
  189. {
  190. UpdateStatus(Manager.Level);
  191. }
  192. else if (AchieveType == AchieveType.AdAmt)
  193. {
  194. UpdateStatus(Manager.AdAmt);
  195. }
  196. else if (AchieveType == AchieveType.SkillAmt)
  197. {
  198. UpdateStatus(Manager.SkillAmt);
  199. }
  200. else if (AchieveType == AchieveType.SignAmt)
  201. {
  202. UpdateStatus(Manager.SignAmt);
  203. }
  204. else if (AchieveType == AchieveType.ShareAmt)
  205. {
  206. UpdateStatus(Manager.ShareAmt);
  207. }
  208. else if (AchieveType == AchieveType.FlowerAmt)
  209. {
  210. UpdateStatus(GardenManager.MyFlower);
  211. }
  212. else if (AchieveType == AchieveType.MiniGameAmt)
  213. {
  214. UpdateStatus(Manager.MiniGameAmt);
  215. }
  216. else if (AchieveType == AchieveType.TotalCoin)
  217. {
  218. UpdateStatus(Manager.TotalCoin);
  219. }
  220. else if (AchieveType == AchieveType.FlowerCoin)
  221. {
  222. UpdateStatus(Manager.FlowerCoin);
  223. }
  224. else if (AchieveType == AchieveType.CurrentCoin)
  225. {
  226. UpdateStatus(Manager.Coin);
  227. }
  228. else if (AchieveType == AchieveType.CostDiamond)
  229. {
  230. UpdateStatus(Manager.CostDiamond);
  231. }
  232. else if (AchieveType == AchieveType.CloseAmt)
  233. {
  234. UpdateStatus(Manager.CloseAmt);
  235. }
  236. else if (AchieveType == AchieveType.CreateRoomAmt)
  237. {
  238. UpdateStatus(Manager.CreateRoomAmt);
  239. }
  240. else if (AchieveType == AchieveType.CreateChestAmt)
  241. {
  242. UpdateStatus(Manager.CreateChestAmt);
  243. }
  244. else if (AchieveType == AchieveType.CreateLuckyChestAmt)
  245. {
  246. UpdateStatus(Manager.CreateLuckyChestAmt);
  247. }
  248. else if (AchieveType == AchieveType.CreateGuessColorChestAmt)
  249. {
  250. UpdateStatus(Manager.CreateGuessColorChestAmt);
  251. }
  252. else if (AchieveType == AchieveType.CreateGuessNumberChestAmt)
  253. {
  254. UpdateStatus(Manager.CreateGuessNumberChestAmt);
  255. }
  256. else if (AchieveType == AchieveType.GetChestAwardAmt)
  257. {
  258. UpdateStatus(Manager.GetChestAwardAmt);
  259. }
  260. else
  261. {
  262. throw new Exception();
  263. }
  264. }
  265. public void UpdateStatus(double value)
  266. {
  267. CurrentValue = value;
  268. }
  269. public void ToFinish()
  270. {
  271. Slider.value = 1;
  272. Complete = false;
  273. Button.interactable = false;
  274. Button.image.material = null;
  275. LanguageManager.Add(BtnLab, new MulLanStr(LanguageLabel.Object__AchieveItem_BtnLab2));
  276. }
  277. public void ToProcess(double value)
  278. {
  279. Complete = false;
  280. Button.interactable = false;
  281. Button.image.material = Lib.GrayMat;
  282. AchieveManager.UpdateHint();
  283. List<object> objList = new List<object>();
  284. objList.Add(new MulLanStr(LanguageLabel.Object__AchieveItem_BtnLab0));
  285. objList.Add("\n");
  286. if (!DiamondOnce.Equal(0))
  287. {
  288. objList.Add(TransferLabel.DiamondSprite + DiamondOnce.ToString("0") + " ");
  289. }
  290. if (!CoinPerson.Equal(0))
  291. {
  292. objList.Add(new MulLanStr(LanguageLabel.Common__CoinPerson));
  293. objList.Add("+");
  294. objList.Add(CoinPerson.ToString("0") + " ");
  295. }
  296. if (!Person.Equal(0))
  297. {
  298. objList.Add(new MulLanStr(LanguageLabel.Common__Person));
  299. objList.Add("+");
  300. objList.Add(Person.ToString("0") + " ");
  301. }
  302. LanguageManager.Add(BtnLab, objList.ToArray());
  303. }
  304. public void ToComplete()
  305. {
  306. if (Complete)
  307. {
  308. return;
  309. }
  310. Complete = true;
  311. Button.interactable = true;
  312. Button.image.material = null;
  313. AchieveManager.UpdateHint();
  314. List<object> objList = new List<object>();
  315. objList.Add(new MulLanStr(LanguageLabel.Object__AchieveItem_BtnLab1));
  316. objList.Add("\n");
  317. if (!DiamondOnce.Equal(0))
  318. {
  319. objList.Add(TransferLabel.DiamondSprite + DiamondOnce.ToString("0") + " ");
  320. }
  321. if (!CoinPerson.Equal(0))
  322. {
  323. objList.Add(new MulLanStr(LanguageLabel.Common__CoinPerson));
  324. objList.Add("+");
  325. objList.Add(CoinPerson.ToString("0") + " ");
  326. }
  327. if (!Person.Equal(0))
  328. {
  329. objList.Add(new MulLanStr(LanguageLabel.Common__Person));
  330. objList.Add("+");
  331. objList.Add(Person.ToString("0") + " ");
  332. }
  333. LanguageManager.Add(BtnLab, objList.ToArray());
  334. }
  335. public AchieveType TypeParse(string str)
  336. {
  337. int integer = int.Parse(str);
  338. if (integer == 1)
  339. {
  340. return AchieveType.GardenLevel;
  341. }
  342. else if (integer == 2)
  343. {
  344. return AchieveType.CurrentCoin;
  345. }
  346. else if (integer == 3)
  347. {
  348. return AchieveType.TotalCoin;
  349. }
  350. else if (integer == 4)
  351. {
  352. return AchieveType.ElfLevel;
  353. }
  354. else if (integer == 5)
  355. {
  356. return AchieveType.FlowerAmt;
  357. }
  358. else if (integer == 6)
  359. {
  360. return AchieveType.TotalPerson;
  361. }
  362. else if (integer == 7)
  363. {
  364. return AchieveType.SkillAmt;
  365. }
  366. else if (integer == 8)
  367. {
  368. return AchieveType.AdAmt;
  369. }
  370. else if (integer == 9)
  371. {
  372. return AchieveType.SignAmt;
  373. }
  374. else if (integer == 10)
  375. {
  376. return AchieveType.ShareAmt;
  377. }
  378. else if (integer == 11)
  379. {
  380. return AchieveType.MiniGameAmt;
  381. }
  382. else if (integer == 12)
  383. {
  384. return AchieveType.FlowerCoin;
  385. }
  386. else if (integer == 13)
  387. {
  388. return AchieveType.CostDiamond;
  389. }
  390. else if (integer == 14)
  391. {
  392. return AchieveType.CloseAmt;
  393. }
  394. else if (integer == 15)
  395. {
  396. return AchieveType.CreateRoomAmt;
  397. }
  398. else if (integer == 16)
  399. {
  400. return AchieveType.CreateChestAmt;
  401. }
  402. else if (integer == 17)
  403. {
  404. return AchieveType.CreateLuckyChestAmt;
  405. }
  406. else if (integer == 18)
  407. {
  408. return AchieveType.CreateGuessColorChestAmt;
  409. }
  410. else if (integer == 19)
  411. {
  412. return AchieveType.CreateGuessNumberChestAmt;
  413. }
  414. else if (integer == 20)
  415. {
  416. return AchieveType.GetChestAwardAmt;
  417. }
  418. else
  419. {
  420. throw new Exception();
  421. }
  422. }
  423. public static string GetDescription(string desc, double value)
  424. {
  425. return desc.Replace(TransferLabel.Value, Auxiliary.ShrinkNumberStr(value, 0));
  426. }
  427. }
  428. public class AchieveManager : Regist
  429. {
  430. #region 变量
  431. public static Dictionary<int, Achieve> AchieveDic = new Dictionary<int, Achieve>();
  432. public static Dictionary<AchieveType, UnityAction<double>> DeleDic = new Dictionary<AchieveType, UnityAction<double>>();
  433. public static AchieveManager Instance;
  434. #endregion
  435. public override void FirstInit()
  436. {
  437. Instance = this;
  438. List<XmlAttributeCollection> attributeList = ConfigManager.GetAchieveConfig();
  439. for (int i = 0; i < attributeList.Count; i++)
  440. {
  441. new Achieve(attributeList[i]);
  442. }
  443. List<int> achieveList = ConfigManager.GetAchieveList();
  444. for (int i = 0; i < achieveList.Count; i++)
  445. {
  446. AchieveDic[achieveList[i]].Lock = false;
  447. }
  448. foreach (var kv in AchieveDic)
  449. {
  450. if (kv.Value.Lock)
  451. {
  452. if (kv.Value.Parent == -1 || !AchieveDic[kv.Value.Parent].Lock)
  453. {
  454. kv.Value.Init();
  455. }
  456. }
  457. else
  458. {
  459. if (!kv.Value.Delete)
  460. {
  461. kv.Value.Init();
  462. }
  463. }
  464. }
  465. }
  466. public override void SecondInit()
  467. {
  468. UpdateHint();
  469. }
  470. public static void UpdateHint()
  471. {
  472. if (TutorialManager.NewplayerTutorial)
  473. {
  474. return;
  475. }
  476. TweenOutline tween = ResourceManager.Get<Outline>(ObjectLabel.C_Achieve).GetTweenOutline();
  477. if (tween == null)
  478. {
  479. return;
  480. }
  481. foreach (var kv in AchieveDic)
  482. {
  483. if (kv.Value.Complete)
  484. {
  485. if (tween.InPause)
  486. {
  487. tween.Resume();
  488. tween.Target.enabled = true;
  489. }
  490. else
  491. {
  492. tween.StartForward();
  493. }
  494. return;
  495. }
  496. }
  497. tween.Target.enabled = false;
  498. tween.Pause();
  499. }
  500. public static void UpdateStatus(AchieveType type, double value)
  501. {
  502. UnityAction<double> action;
  503. if (DeleDic.TryGetValue(type, out action))
  504. {
  505. DeleDic[type].SafeInvoke(value);
  506. }
  507. }
  508. private static int MaxDisplayAmt = 4;
  509. public static void OpenAchievePanel()
  510. {
  511. TweenRoot tweenRoot = ResourceManager.Get(ObjectLabel.M_Achieve0).TweenForVec();
  512. AudioManager.PlayClip(Clip.BtnClip);
  513. Achieve completedAchieve = null;
  514. foreach (var achieve in AchieveDic.Values)
  515. {
  516. if (achieve.Complete)
  517. {
  518. completedAchieve = achieve;
  519. break;
  520. }
  521. }
  522. if (completedAchieve != null)
  523. {
  524. tweenRoot.AddEventOnetime
  525. (
  526. EventType.ForwardFinish,
  527. () =>
  528. {
  529. ScrollRect scrollRect = ResourceManager.Get<ScrollRect>(ObjectLabel.M_Scrr);
  530. int index = completedAchieve.AchieveItem.GetSiblingIndex();
  531. if (index < scrollRect.content.childCount - MaxDisplayAmt)
  532. {
  533. scrollRect.Locate(index, 0.25f, Curve.EaseOutQuad, LocatePos.Up);
  534. }
  535. else
  536. {
  537. scrollRect.Locate(scrollRect.content.childCount-1, 0.25f, Curve.EaseOutQuad, LocatePos.Down);
  538. }
  539. }
  540. );
  541. }
  542. }
  543. }