DeckBuildingRule.cs 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. using DCGO.CardEntities;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using UnityEngine;
  6. public class DeckBuildingRule : MonoBehaviour
  7. {
  8. public static bool IsValidDeck(DeckData deckData)
  9. {
  10. if (ContinuousController.instance != null)
  11. {
  12. foreach (CEntity_Base cEntity_Base in deckData.DeckCards())
  13. {
  14. if (!cEntity_Base.IsStandardValid)
  15. {
  16. return false;
  17. }
  18. }
  19. }
  20. return true;
  21. }
  22. #region インポートしたデッキデータを修正
  23. public static DeckData ModifiedDeckData(DeckData deckData)
  24. {
  25. List<CEntity_Base> modifiedDeck = modifiedList(deckData.AllDeckCards());
  26. List<CEntity_Base> modifiedDeckCards = new List<CEntity_Base>();
  27. List<CEntity_Base> modifiedDigitamaDeckCards = new List<CEntity_Base>();
  28. foreach (CEntity_Base cEntity_Base in modifiedDeck)
  29. {
  30. if (!cEntity_Base.cardKind.Contains(CardKind.DigiEgg))
  31. {
  32. modifiedDeckCards.Add(cEntity_Base);
  33. }
  34. else
  35. {
  36. modifiedDigitamaDeckCards.Add(cEntity_Base);
  37. }
  38. }
  39. List<CEntity_Base> modifiedList(List<CEntity_Base> cEntity_Bases)
  40. {
  41. //カードリストを重複なしのリストにする
  42. List<CEntity_Base> DistinctDeckCards = cEntity_Bases.Distinct().ToList();
  43. List<CEntity_Base> DistinctDeckCards1 = new List<CEntity_Base>();
  44. foreach (CEntity_Base cEntity_Base in DistinctDeckCards)
  45. {
  46. if (DistinctDeckCards1.Count((cEntity_Base1) => cEntity_Base.CardID == cEntity_Base1.CardID) == 0)
  47. {
  48. DistinctDeckCards1.Add(cEntity_Base);
  49. }
  50. }
  51. List<CEntity_Base> deckCards = new List<CEntity_Base>();
  52. foreach (CEntity_Base cEntity_Base in cEntity_Bases)
  53. {
  54. deckCards.Add(cEntity_Base);
  55. }
  56. //規定枚数以上のカードを抜く
  57. if (!ContinuousController.instance.useBanlist)
  58. return deckCards;
  59. foreach (CEntity_Base cEntity_Base in DistinctDeckCards1)
  60. {
  61. foreach (Restrictions restriction in ContinuousController.instance.BanList.Restrictions)
  62. {
  63. if (cEntity_Base.CardID == restriction.id)
  64. {
  65. while (cEntity_Base.SameCardIDCount(deckCards) > restriction.limit)
  66. {
  67. CEntity_Base removeCard = deckCards.Find(cEntity_Base1 => cEntity_Base1.CardID == cEntity_Base.CardID);
  68. if (removeCard != null)
  69. {
  70. deckCards.Remove(removeCard);
  71. }
  72. }
  73. }
  74. }
  75. foreach (Pair bannedPair in ContinuousController.instance.BanList.BannedPair)
  76. {
  77. if (cEntity_Base.CardID == bannedPair.id)
  78. {
  79. while (deckCards.Some(cEntity_Base1 => bannedPair.pairs.Contains(cEntity_Base1.CardID)))
  80. {
  81. CEntity_Base removeCard = deckCards.Find(cEntity_Base1 => bannedPair.pairs.Contains(cEntity_Base1.CardID));
  82. if (removeCard != null)
  83. {
  84. deckCards.Remove(removeCard);
  85. }
  86. }
  87. }
  88. if (bannedPair.pairs.Contains(cEntity_Base.CardID))
  89. {
  90. while (deckCards.Some(cEntity_Base1 => cEntity_Base1.CardID == bannedPair.id))
  91. {
  92. CEntity_Base removeCard = deckCards.Find(cEntity_Base1 => bannedPair.id.Contains(cEntity_Base1.CardID));
  93. if (removeCard != null)
  94. {
  95. deckCards.Remove(removeCard);
  96. }
  97. }
  98. }
  99. }
  100. }
  101. UnityEngine.Debug.Log($"Modified: {deckCards.Count}");
  102. return deckCards;
  103. }
  104. DeckData deckData1 = new DeckData(DeckData.GetDeckCode(deckData.DeckName, modifiedDeckCards, modifiedDigitamaDeckCards, deckData.KeyCard), deckData.DeckID);
  105. if (!deckData1.AllDeckCards().Contains(deckData1.KeyCard))
  106. {
  107. deckData1.KeyCardId = -1;
  108. }
  109. return deckData1;
  110. }
  111. #endregion
  112. public static int MaxCount_BanList(CEntity_Base cEntity_Base)
  113. {
  114. int count = cEntity_Base.MaxCountInDeck;
  115. if (!ContinuousController.instance.useBanlist)
  116. return count;
  117. foreach (Restrictions restriction in ContinuousController.instance.BanList.Restrictions)
  118. {
  119. if (cEntity_Base.CardID == restriction.id)
  120. {
  121. count = restriction.limit;
  122. break;
  123. }
  124. }
  125. return count;
  126. }
  127. public static bool CanAddCard(CEntity_Base cEntity_Base, DeckData deckData)
  128. {
  129. if (cEntity_Base.cardKind.Contains(CardKind.DigiEgg))
  130. {
  131. if (cEntity_Base.SameCardIDCount(deckData.DigitamaDeckCards()) >= cEntity_Base.MaxCountInDeck)
  132. {
  133. return false;
  134. }
  135. if (deckData.DigitamaDeckCards().Count >= 5)
  136. {
  137. return false;
  138. }
  139. }
  140. else
  141. {
  142. if (cEntity_Base.SameCardIDCount(deckData.DeckCards()) >= cEntity_Base.MaxCountInDeck)
  143. {
  144. return false;
  145. }
  146. }
  147. if (!ContinuousController.instance.useBanlist)
  148. return true;
  149. foreach (Restrictions restriction in ContinuousController.instance.BanList.Restrictions)
  150. {
  151. if (cEntity_Base.CardID == restriction.id)
  152. {
  153. if (cEntity_Base.SameCardIDCount(deckData.AllDeckCards()) >= restriction.limit)
  154. {
  155. return false;
  156. }
  157. }
  158. }
  159. foreach (Pair bannedPair in ContinuousController.instance.BanList.BannedPair)
  160. {
  161. if (cEntity_Base.CardID == bannedPair.id)
  162. {
  163. if (deckData.AllDeckCards().Some(cEntity_Base1 => bannedPair.pairs.Contains(cEntity_Base1.CardID)))
  164. {
  165. return false;
  166. }
  167. }
  168. if (bannedPair.pairs.Contains(cEntity_Base.CardID))
  169. {
  170. if (deckData.AllDeckCards().Some(cEntity_Base1 => cEntity_Base1.CardID == bannedPair.id))
  171. {
  172. return false;
  173. }
  174. }
  175. }
  176. return true;
  177. }
  178. }
  179. #region Banlist
  180. [Serializable]
  181. public class BanList
  182. {
  183. public List<Pair> BannedPair;
  184. public List<Restrictions> Restrictions;
  185. public BanList()
  186. {
  187. BannedPair = new List<Pair>();
  188. Restrictions = new List<Restrictions>();
  189. }
  190. public CardRestriction ConvertToCardRestriction()
  191. {
  192. List<CardLimitCount> CardLimit = new List<CardLimitCount>();
  193. List<BannedPair> BannedPairs = new List<BannedPair>();
  194. foreach (Pair pair in BannedPair)
  195. BannedPairs.Add(new BannedPair(pair.id, pair.pairs));
  196. foreach (Restrictions restrict in Restrictions)
  197. CardLimit.Add(new CardLimitCount(restrict.id, restrict.limit));
  198. return new CardRestriction(CardLimit, BannedPairs);
  199. }
  200. }
  201. [Serializable]
  202. public class Pair
  203. {
  204. public string id;
  205. public List<string> pairs;
  206. }
  207. [Serializable]
  208. public class Restrictions
  209. {
  210. public string id;
  211. public int limit;
  212. }
  213. #endregion
  214. public class CardRestriction
  215. {
  216. public CardRestriction(List<CardLimitCount> cardLimitCounts, List<BannedPair> bannedPairs)
  217. {
  218. CardLimitCounts = cardLimitCounts.Clone();
  219. BannedPairs = bannedPairs.Clone();
  220. }
  221. public List<CardLimitCount> CardLimitCounts { get; private set; } = new List<CardLimitCount>();
  222. public List<BannedPair> BannedPairs { get; private set; } = new List<BannedPair>();
  223. }
  224. public class CardLimitCount
  225. {
  226. public CardLimitCount(string cardID, int limitCount)
  227. {
  228. CardID = cardID;
  229. LimitCount = limitCount;
  230. }
  231. public string CardID { get; private set; } = "";
  232. public int LimitCount { get; private set; } = 4;
  233. }
  234. public class BannedPair
  235. {
  236. public BannedPair(string cardID_A, List<string> cardIDs_B)
  237. {
  238. CardID_A = cardID_A;
  239. CardIDs_B = cardIDs_B.Clone();
  240. }
  241. public string CardID_A { get; private set; } = "";
  242. public List<string> CardIDs_B { get; private set; } = new List<string>();
  243. }