DeckBuildingRule.cs 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  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 != 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. foreach (CEntity_Base cEntity_Base in DistinctDeckCards1)
  58. {
  59. foreach (Restrictions restriction in ContinuousController.instance.BanList.Restrictions)
  60. {
  61. if (cEntity_Base.CardID == restriction.id)
  62. {
  63. while (cEntity_Base.SameCardIDCount(deckCards) > restriction.limit)
  64. {
  65. CEntity_Base removeCard = deckCards.Find(cEntity_Base1 => cEntity_Base1.CardID == cEntity_Base.CardID);
  66. if (removeCard != null)
  67. {
  68. deckCards.Remove(removeCard);
  69. }
  70. }
  71. }
  72. }
  73. foreach (Pair bannedPair in ContinuousController.instance.BanList.BannedPair)
  74. {
  75. if (cEntity_Base.CardID == bannedPair.id)
  76. {
  77. while (deckCards.Some(cEntity_Base1 => bannedPair.pairs.Contains(cEntity_Base1.CardID)))
  78. {
  79. CEntity_Base removeCard = deckCards.Find(cEntity_Base1 => bannedPair.pairs.Contains(cEntity_Base1.CardID));
  80. if (removeCard != null)
  81. {
  82. deckCards.Remove(removeCard);
  83. }
  84. }
  85. }
  86. if (bannedPair.pairs.Contains(cEntity_Base.CardID))
  87. {
  88. while (deckCards.Some(cEntity_Base1 => cEntity_Base1.CardID == bannedPair.id))
  89. {
  90. CEntity_Base removeCard = deckCards.Find(cEntity_Base1 => bannedPair.id.Contains(cEntity_Base1.CardID));
  91. if (removeCard != null)
  92. {
  93. deckCards.Remove(removeCard);
  94. }
  95. }
  96. }
  97. }
  98. }
  99. UnityEngine.Debug.Log($"Modified: {deckCards.Count}");
  100. return deckCards;
  101. }
  102. DeckData deckData1 = new DeckData(DeckData.GetDeckCode(deckData.DeckName, modifiedDeckCards, modifiedDigitamaDeckCards, deckData.KeyCard), deckData.DeckID);
  103. if (!deckData1.AllDeckCards().Contains(deckData1.KeyCard))
  104. {
  105. deckData1.KeyCardId = -1;
  106. }
  107. return deckData1;
  108. }
  109. #endregion
  110. public static int MaxCount_BanList(CEntity_Base cEntity_Base)
  111. {
  112. int count = cEntity_Base.MaxCountInDeck;
  113. foreach (Restrictions restriction in ContinuousController.instance.BanList.Restrictions)
  114. {
  115. if (cEntity_Base.CardID == restriction.id)
  116. {
  117. count = restriction.limit;
  118. break;
  119. }
  120. }
  121. return count;
  122. }
  123. public static bool CanAddCard(CEntity_Base cEntity_Base, DeckData deckData)
  124. {
  125. if (cEntity_Base.cardKind == CardKind.DigiEgg)
  126. {
  127. if (cEntity_Base.SameCardIDCount(deckData.DigitamaDeckCards()) >= cEntity_Base.MaxCountInDeck)
  128. {
  129. return false;
  130. }
  131. if (deckData.DigitamaDeckCards().Count >= 5)
  132. {
  133. return false;
  134. }
  135. }
  136. else
  137. {
  138. if (cEntity_Base.SameCardIDCount(deckData.DeckCards()) >= cEntity_Base.MaxCountInDeck)
  139. {
  140. return false;
  141. }
  142. }
  143. foreach (Restrictions restriction in ContinuousController.instance.BanList.Restrictions)
  144. {
  145. if (cEntity_Base.CardID == restriction.id)
  146. {
  147. if (cEntity_Base.SameCardIDCount(deckData.AllDeckCards()) >= restriction.limit)
  148. {
  149. return false;
  150. }
  151. }
  152. }
  153. foreach (Pair bannedPair in ContinuousController.instance.BanList.BannedPair)
  154. {
  155. if (cEntity_Base.CardID == bannedPair.id)
  156. {
  157. if (deckData.AllDeckCards().Some(cEntity_Base1 => bannedPair.pairs.Contains(cEntity_Base1.CardID)))
  158. {
  159. return false;
  160. }
  161. }
  162. if (bannedPair.pairs.Contains(cEntity_Base.CardID))
  163. {
  164. if (deckData.AllDeckCards().Some(cEntity_Base1 => cEntity_Base1.CardID == bannedPair.id))
  165. {
  166. return false;
  167. }
  168. }
  169. }
  170. return true;
  171. }
  172. }
  173. #region Banlist
  174. [Serializable]
  175. public class BanList
  176. {
  177. public List<Pair> BannedPair;
  178. public List<Restrictions> Restrictions;
  179. public BanList()
  180. {
  181. BannedPair = new List<Pair>();
  182. Restrictions = new List<Restrictions>();
  183. }
  184. public CardRestriction ConvertToCardRestriction()
  185. {
  186. List<CardLimitCount> CardLimit = new List<CardLimitCount>();
  187. List<BannedPair> BannedPairs = new List<BannedPair>();
  188. foreach (Pair pair in BannedPair)
  189. BannedPairs.Add(new BannedPair(pair.id, pair.pairs));
  190. foreach (Restrictions restrict in Restrictions)
  191. CardLimit.Add(new CardLimitCount(restrict.id, restrict.limit));
  192. return new CardRestriction(CardLimit, BannedPairs);
  193. }
  194. }
  195. [Serializable]
  196. public class Pair
  197. {
  198. public string id;
  199. public List<string> pairs;
  200. }
  201. [Serializable]
  202. public class Restrictions
  203. {
  204. public string id;
  205. public int limit;
  206. }
  207. #endregion
  208. public class CardRestriction
  209. {
  210. public CardRestriction(List<CardLimitCount> cardLimitCounts, List<BannedPair> bannedPairs)
  211. {
  212. CardLimitCounts = cardLimitCounts.Clone();
  213. BannedPairs = bannedPairs.Clone();
  214. }
  215. public List<CardLimitCount> CardLimitCounts { get; private set; } = new List<CardLimitCount>();
  216. public List<BannedPair> BannedPairs { get; private set; } = new List<BannedPair>();
  217. }
  218. public class CardLimitCount
  219. {
  220. public CardLimitCount(string cardID, int limitCount)
  221. {
  222. CardID = cardID;
  223. LimitCount = limitCount;
  224. }
  225. public string CardID { get; private set; } = "";
  226. public int LimitCount { get; private set; } = 4;
  227. }
  228. public class BannedPair
  229. {
  230. public BannedPair(string cardID_A, List<string> cardIDs_B)
  231. {
  232. CardID_A = cardID_A;
  233. CardIDs_B = cardIDs_B.Clone();
  234. }
  235. public string CardID_A { get; private set; } = "";
  236. public List<string> CardIDs_B { get; private set; } = new List<string>();
  237. }