DecomposeDataManager.cs 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. using System.Collections.Generic;
  2. namespace GFGGame
  3. {
  4. public class DecomposeDataManager : SingletonBase<DecomposeDataManager>
  5. {
  6. Dictionary<int, List<int>> _decomposeData = new Dictionary<int, List<int>>();//所有数量大于1的换装部件数据
  7. Dictionary<int, List<int>> _suitSyntheticMaterials = new Dictionary<int, List<int>>();//materiasId,Lsit<suitId>
  8. List<int> _rewardList = new List<int>();
  9. public const int MaxCount = 999;
  10. public void Clear()
  11. {
  12. _decomposeData.Clear();
  13. _suitSyntheticMaterials.Clear();
  14. }
  15. public void Add(int itemId)
  16. {
  17. //初始化时禁止使用物品配置,会造成卡顿!!!
  18. int rarity = ItemDataManager.GetItemRarity(itemId);
  19. if (!_decomposeData.ContainsKey(rarity))
  20. {
  21. _decomposeData.Add(rarity, new List<int>());
  22. }
  23. long count = ItemCanDecomposeCount(itemId);
  24. if (_decomposeData[rarity].IndexOf(itemId) < 0 && count > 0)
  25. {
  26. _decomposeData[rarity].Add(itemId);
  27. }
  28. //套装拥有的时候需要让材料重新加进列表
  29. int[][] syntheticMateriarsArr = ItemDataManager.GetItemSyntheticSuitArr(itemId);
  30. if (syntheticMateriarsArr.Length > 0) {
  31. foreach (int[] materiars in syntheticMateriarsArr)
  32. {
  33. int materialId = materiars[0];
  34. int materialItemType = ItemDataManager.GetItemType(materialId);
  35. if (materialItemType == ConstItemType.DRESS_UP) {
  36. long materiarsCount = ItemCanDecomposeCount(materialId);
  37. if (materiarsCount> 0 && (materiarsCount + materiars[1] - DeductSynthesisNeedNum(materialId)) > 0)
  38. {
  39. rarity = ItemDataManager.GetItemRarity(materialId);
  40. if (_decomposeData[rarity].IndexOf(materialId) < 0)
  41. {
  42. _decomposeData[rarity].Add(materialId);
  43. }
  44. }
  45. }
  46. }
  47. }
  48. }
  49. public void Remove(int itemId)
  50. {
  51. int rarity = ItemCfgArray.Instance.GetCfg(itemId).rarity;
  52. long count = ItemCanDecomposeCount(itemId);
  53. if (_decomposeData.ContainsKey(rarity) && _decomposeData[rarity].IndexOf(itemId) >= 0 && count <= 0)
  54. {
  55. _decomposeData[rarity].Remove(itemId);
  56. }
  57. }
  58. //分解需要扣去合成需要的数量
  59. public int DeductSynthesisNeedNum(int itemId)
  60. {
  61. ItemCfg itemCfg = ItemCfgArray.Instance.GetCfg(itemId);
  62. if (itemCfg == null)
  63. return 0;
  64. int sum = 0;
  65. foreach (int syntheticId in itemCfg.syntheticSuitArr)
  66. {
  67. if (ItemDataManager.GetItemNum(syntheticId) <= 0) {
  68. ItemCfg syntheticItemCfg = ItemCfgArray.Instance.GetCfg(syntheticId);
  69. foreach (int[] MateriarsInfo in syntheticItemCfg.syntheticMateriarsArr)
  70. {
  71. if(MateriarsInfo[0] == itemId)
  72. sum += MateriarsInfo[1];
  73. }
  74. }
  75. }
  76. return sum;
  77. }
  78. public List<int> GetDecomposeDataByRarity(int rarity)
  79. {
  80. if (!_decomposeData.ContainsKey(rarity)) return null;
  81. return _decomposeData[rarity];
  82. }
  83. public List<int> GetRewardList()
  84. {
  85. if (_rewardList.Count == 0)
  86. {
  87. DecomposeCfg[] cfgs = DecomposeCfgArray.Instance.dataArray;
  88. for (int i = 0; i < cfgs.Length; i++)
  89. {
  90. for (int j = 0; j < cfgs[i].itemsArr.Length; j++)
  91. {
  92. if (_rewardList.IndexOf(cfgs[i].itemsArr[j][0]) < 0)
  93. {
  94. _rewardList.Add(cfgs[i].itemsArr[j][0]);
  95. }
  96. }
  97. }
  98. }
  99. return _rewardList;
  100. }
  101. //物品可分解的数量
  102. public long ItemCanDecomposeCount(int itemId)
  103. {
  104. //合成需要的数量
  105. int synthesisNum = DeductSynthesisNeedNum(itemId);
  106. return ItemDataManager.GetItemNum(itemId) - 1 - synthesisNum;
  107. }
  108. public void InitSuitSyntheticMaterias()
  109. {
  110. List<SuitCfg> suitCfgs = new List<SuitCfg>();
  111. suitCfgs.AddRange(new List<SuitCfg>(SuitCfgArray.Instance.GetCfgsBysyntheticType(1)));
  112. suitCfgs.AddRange(new List<SuitCfg>(SuitCfgArray.Instance.GetCfgsBysyntheticType(2)));
  113. suitCfgs.AddRange(new List<SuitCfg>(SuitCfgArray.Instance.GetCfgsBysyntheticType(3)));
  114. for (int i = 0; i < suitCfgs.Count; i++)
  115. {
  116. int suitId = suitCfgs[i].id;
  117. for (int j = 0; j < suitCfgs[i].partsArr.Length; j++)
  118. {
  119. ItemCfg itemCfg = ItemCfgArray.Instance.GetCfg(suitCfgs[i].partsArr[j]);
  120. for (int k = 0; k < itemCfg.syntheticMateriarsArr.Length; k++)
  121. {
  122. int materialId = itemCfg.syntheticMateriarsArr[k][0];
  123. if (!_suitSyntheticMaterials.ContainsKey(materialId))
  124. {
  125. _suitSyntheticMaterials[materialId] = new List<int>();
  126. }
  127. if (_suitSyntheticMaterials[materialId].IndexOf(suitId) < 0) _suitSyntheticMaterials[materialId].Add(suitId);
  128. }
  129. }
  130. }
  131. }
  132. /// <summary>
  133. /// 检测物品对应的套装是否全部合成
  134. /// </summary>
  135. /// <param name="itemId"></param>
  136. /// <returns></returns>
  137. public bool CheckIsItemForSuitSynthetic(int itemId)
  138. {
  139. if (!_suitSyntheticMaterials.ContainsKey(itemId)) return true;
  140. for (int i = 0; i < _suitSyntheticMaterials[itemId].Count; i++)
  141. {
  142. if (!DressUpMenuSuitDataManager.CheckHaveSuit(_suitSyntheticMaterials[itemId][i])) return false;
  143. }
  144. return true;
  145. }
  146. }
  147. }