AchieveManager.cs 16 KB

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