/// <summary> /// Called when the AI has to tribute for a synchro monster or ritual monster. /// </summary> /// <param name="cards">Available cards.</param> /// <param name="sum">Result of the operation.</param> /// <param name="min">Minimum cards.</param> /// <param name="max">Maximum cards.</param> /// <param name="mode">True for exact equal.</param> /// <returns></returns> public IList <ClientCard> OnSelectSum(IList <ClientCard> cards, int sum, int min, int max, long hint, bool mode) { const long HINTMSG_RELEASE = 500; const long HINTMSG_SMATERIAL = 512; IList <ClientCard> selected = Executor.OnSelectSum(cards, sum, min, max, hint, mode); if (selected != null) { return(selected); } if (hint == HINTMSG_RELEASE || hint == HINTMSG_SMATERIAL) { if (m_materialSelector != null) { selected = m_materialSelector.Select(cards, min, max); } else { switch (hint) { case HINTMSG_SMATERIAL: selected = Executor.OnSelectSynchroMaterial(cards, sum, min, max); break; case HINTMSG_RELEASE: selected = Executor.OnSelectRitualTribute(cards, sum, min, max); break; } } if (selected != null) { int s1 = 0, s2 = 0; foreach (ClientCard card in selected) { s1 += card.OpParam1; s2 += (card.OpParam2 != 0) ? card.OpParam2 : card.OpParam1; } if ((mode && (s1 == sum || s2 == sum)) || (!mode && (s1 >= sum || s2 >= sum))) { return(selected); } } } if (mode) { // equal if (sum == 0 && min == 0) { return(new List <ClientCard>()); } if (min <= 1) { // try special level first foreach (ClientCard card in cards) { if (card.OpParam2 == sum) { return(new[] { card }); } } // try level equal foreach (ClientCard card in cards) { if (card.OpParam1 == sum) { return(new[] { card }); } } } // try all int s1 = 0, s2 = 0; foreach (ClientCard card in cards) { s1 += card.OpParam1; s2 += (card.OpParam2 != 0) ? card.OpParam2 : card.OpParam1; } if (s1 == sum || s2 == sum) { return(cards); } // try all combinations int i = (min <= 1) ? 2 : min; while (i <= max && i <= cards.Count) { IEnumerable <IEnumerable <ClientCard> > combos = CardContainer.GetCombinations(cards, i); foreach (IEnumerable <ClientCard> combo in combos) { Log(LogLevel.Debug, "--"); s1 = 0; s2 = 0; foreach (ClientCard card in combo) { s1 += card.OpParam1; s2 += (card.OpParam2 != 0) ? card.OpParam2 : card.OpParam1; } if (s1 == sum || s2 == sum) { return(combo.ToList()); } } i++; } } else { // larger if (min <= 1) { // try special level first foreach (ClientCard card in cards) { if (card.OpParam2 >= sum) { return(new[] { card }); } } // try level equal foreach (ClientCard card in cards) { if (card.OpParam1 >= sum) { return(new[] { card }); } } } // try all combinations int i = (min <= 1) ? 2 : min; while (i <= max && i <= cards.Count) { IEnumerable <IEnumerable <ClientCard> > combos = CardContainer.GetCombinations(cards, i); foreach (IEnumerable <ClientCard> combo in combos) { Log(LogLevel.Debug, "----"); int s1 = 0, s2 = 0; foreach (ClientCard card in combo) { s1 += card.OpParam1; s2 += (card.OpParam2 != 0) ? card.OpParam2 : card.OpParam1; } if (s1 >= sum || s2 >= sum) { return(combo.ToList()); } } i++; } } Log(LogLevel.Error, "Fail to select sum."); return(new List <ClientCard>()); }
/// <summary> /// Called when the AI has to tribute for a synchro monster. /// </summary> /// <param name="cards">Available cards.</param> /// <param name="sum">Result of the operation.</param> /// <param name="min">Minimum cards.</param> /// <param name="max">Maximum cards.</param> /// <param name="mode">True for equal.</param> /// <returns></returns> public IList <ClientCard> OnSelectSum(IList <ClientCard> cards, int sum, int min, int max, bool mode) { IList <ClientCard> selected = Executor.OnSelectSum(cards, sum, min, max, mode); if (selected != null) { return(selected); } if (mode) { // equal if (min <= 1) { // try special level first foreach (ClientCard card in cards) { if (card.OpParam2 == sum) { return(new[] { card }); } } // try level equal foreach (ClientCard card in cards) { if (card.OpParam1 == sum) { return(new[] { card }); } } } // try all int s1 = 0, s2 = 0; foreach (ClientCard card in cards) { s1 += card.OpParam1; s2 += (card.OpParam2 != 0) ? card.OpParam2 : card.OpParam1; } if (s1 == sum || s2 == sum) { return(cards); } // try all combinations int i = (min <= 1) ? 2 : min; while (i <= max && i <= cards.Count) { IEnumerable <IEnumerable <ClientCard> > combos = CardContainer.GetCombinations(cards, i); foreach (IEnumerable <ClientCard> combo in combos) { Logger.DebugWriteLine("--"); s1 = 0; s2 = 0; foreach (ClientCard card in combo) { s1 += card.OpParam1; s2 += (card.OpParam2 != 0) ? card.OpParam2 : card.OpParam1; } if (s1 == sum || s2 == sum) { return(combo.ToList()); } } i++; } } else { // larger if (min <= 1) { // try special level first foreach (ClientCard card in cards) { if (card.OpParam2 >= sum) { return(new[] { card }); } } // try level equal foreach (ClientCard card in cards) { if (card.OpParam1 >= sum) { return(new[] { card }); } } } // try all combinations int i = (min <= 1) ? 2 : min; while (i <= max && i <= cards.Count) { IEnumerable <IEnumerable <ClientCard> > combos = CardContainer.GetCombinations(cards, i); foreach (IEnumerable <ClientCard> combo in combos) { Logger.DebugWriteLine("----"); int s1 = 0, s2 = 0; foreach (ClientCard card in combo) { s1 += card.OpParam1; s2 += (card.OpParam2 != 0) ? card.OpParam2 : card.OpParam1; } if (s1 >= sum || s2 >= sum) { return(combo.ToList()); } } i++; } } Logger.WriteErrorLine("Fail to select sum."); return(new List <ClientCard>()); }