DeckBuildingRule.cs 8.8 KB

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