From ac515a646167b8aa5dd7b2bc0c07bbc4b837b00e Mon Sep 17 00:00:00 2001 From: Sloth Date: Mon, 27 Aug 2012 20:30:03 +0000 Subject: [PATCH] - AF Discard AI will now also use discardNumTypeAI. - Improved discardNumTypeAI. --- .../AbilityFactoryZoneAffecting.java | 19 +++++++++-- .../java/forge/game/player/ComputerUtil.java | 34 ++++++++++++------- 2 files changed, 37 insertions(+), 16 deletions(-) diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryZoneAffecting.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryZoneAffecting.java index 8cdc4c1e4ca..1ff8ef8804a 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryZoneAffecting.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryZoneAffecting.java @@ -1373,8 +1373,9 @@ public class AbilityFactoryZoneAffecting { dPHand = AbilityFactoryReveal.getRevealedList(p, dPHand, amount); } CardList dPChHand = new CardList(dPHand); + String[] dValid = null; if (params.containsKey("DiscardValid")) { // Restrict card choices - final String[] dValid = params.get("DiscardValid").split(","); + dValid = params.get("DiscardValid").split(","); dPChHand = dPHand.getValidCards(dValid, source.getController(), source); } Player chooser = p; @@ -1386,12 +1387,24 @@ public class AbilityFactoryZoneAffecting { if (chooser.isComputer()) { // AI + if (p.isComputer()) { // discard AI cards + CardList list = ComputerUtil.discardNumTypeAI(numCards, dValid, sa); + if (mode.startsWith("Reveal")) { + GuiUtils.chooseOneOrNone("Computer has chosen", list.toArray()); + } + discarded.addAll(list); + for (Card card : list) { + p.discard(card, sa); + } + continue; + } + // discard human cards for (int i = 0; i < numCards; i++) { if (dPChHand.size() > 0) { final CardList dChoices = new CardList(); if (params.containsKey("DiscardValid")) { - final String dValid = params.get("DiscardValid"); - if (dValid.contains("Creature") && !dValid.contains("nonCreature")) { + final String validString = params.get("DiscardValid"); + if (validString.contains("Creature") && !validString.contains("nonCreature")) { final Card c = CardFactoryUtil.getBestCreatureAI(dPChHand); if (c != null) { dChoices.add(CardFactoryUtil.getBestCreatureAI(dPChHand)); diff --git a/src/main/java/forge/game/player/ComputerUtil.java b/src/main/java/forge/game/player/ComputerUtil.java index 94bea69b679..dc99aee2108 100644 --- a/src/main/java/forge/game/player/ComputerUtil.java +++ b/src/main/java/forge/game/player/ComputerUtil.java @@ -1536,23 +1536,31 @@ public class ComputerUtil { if (hand.size() <= 0) { continue; } - final CardList lands = AllZone.getComputerPlayer().getCardsIn(ZoneType.Battlefield).getType("Land"); + final int numLandsInPlay = AllZone.getComputerPlayer().getCardsIn(ZoneType.Battlefield).getType("Land").size(); final CardList landsInHand = hand.getType("Land"); - lands.addAll(landsInHand); - if (lands.size() > 5) { - if (landsInHand.size() > 0) { // discard lands - discardList.add(landsInHand.get(0)); - hand.remove(landsInHand.get(0)); - } else { // discard low costed stuff - CardListUtil.sortCMC(hand); - hand.reverse(); + final int numLandsInHand = landsInHand.size(); + + // Discard a land + if (numLandsInHand > 3 || (numLandsInHand > 2 && numLandsInPlay > 0) + || (numLandsInHand > 1 && numLandsInPlay > 2) + || (numLandsInHand > 0 && numLandsInPlay > 5)) { + discardList.add(landsInHand.get(0)); + hand.remove(landsInHand.get(0)); + } else { // Discard other stuff + CardListUtil.sortCMC(hand); + int numLandsAvailable = numLandsInPlay; + if (numLandsInHand > 0) { + numLandsAvailable++; + } + //Discard unplayable card + if (hand.get(0).getCMC() > numLandsAvailable) { discardList.add(hand.get(0)); hand.remove(hand.get(0)); + } else { //Discard worst card + Card worst = CardFactoryUtil.getWorstAI(hand); + discardList.add(worst); + hand.remove(worst); } - } else { // discard high costed stuff - CardListUtil.sortCMC(hand); - discardList.add(hand.get(0)); - hand.remove(hand.get(0)); } }