From 61b4ea4eb1d4d013fd3d47e174468664eaaf4e30 Mon Sep 17 00:00:00 2001 From: Sloth Date: Mon, 20 Feb 2012 09:48:20 +0000 Subject: [PATCH] - The AI can now use mana abilities that produce the chosen color. - Refactoring to prevent duplicate code in AbilityMana. - Commented out two unused functions in ComputerUtil. --- res/cardsfolder/p/paradise_plume.txt | 3 +-- res/cardsfolder/s/silhana_starfletcher.txt | 3 +-- src/main/java/forge/ComputerUtil.java | 18 +++++++------- .../abilityfactory/AbilityFactoryChoose.java | 3 +++ .../abilityfactory/AbilityFactoryMana.java | 8 +------ .../forge/card/spellability/AbilityMana.java | 24 ++++++++++++++++--- .../forge/game/limited/BoosterDraftAI.java | 3 +-- .../java/forge/game/limited/SealedDeck.java | 3 +-- 8 files changed, 38 insertions(+), 27 deletions(-) diff --git a/res/cardsfolder/p/paradise_plume.txt b/res/cardsfolder/p/paradise_plume.txt index 045d265bee7..ee2678d82e0 100644 --- a/res/cardsfolder/p/paradise_plume.txt +++ b/res/cardsfolder/p/paradise_plume.txt @@ -3,11 +3,10 @@ ManaCost:4 Types:Artifact Text:no text T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Static$ True | Execute$ TrigChooseColor | TriggerDescription$ As CARDNAME enters the battlefield, choose a color. -SVar:TrigChooseColor:AB$ ChooseColor | Cost$ 0 +SVar:TrigChooseColor:AB$ ChooseColor | Cost$ 0 | AILogic$ MostProminentInComputerDeck T:Mode$ SpellCast | ValidCard$ Card.ChosenColor | OptionalDecider$ You | Execute$ TrigGainLife | TriggerZones$ Battlefield | TriggerDescription$ Whenever a player casts a spell of the chosen color, you may gain 1 life. SVar:TrigGainLife:AB$ GainLife | Cost$ 0 | LifeAmount$ 1 A:AB$ Mana | Cost$ T | Produced$ Chosen | SpellDescription$ Add one mana of the chosen color to your mana pool. -SVar:RemAIDeck:True SVar:Rarity:Uncommon SVar:Picture:http://www.wizards.com/global/images/magic/general/paradise_plume.jpg SetInfo:TSP|Uncommon|http://magiccards.info/scans/en/ts/260.jpg diff --git a/res/cardsfolder/s/silhana_starfletcher.txt b/res/cardsfolder/s/silhana_starfletcher.txt index 95650de2e55..1100e3f45e5 100644 --- a/res/cardsfolder/s/silhana_starfletcher.txt +++ b/res/cardsfolder/s/silhana_starfletcher.txt @@ -5,9 +5,8 @@ Text:no text PT:1/3 K:Reach T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ ChooseColor | Static$ True | TriggerDescription$ As CARDNAME enters the battlefield, choose a color. -SVar:ChooseColor:DB$ ChooseColor | Defined$ You +SVar:ChooseColor:DB$ ChooseColor | Defined$ You | AILogic$ MostProminentInComputerDeck A:AB$ Mana | Cost$ T | Produced$ Chosen | SpellDescription$ Add one mana of the chosen color to your mana pool. -SVar:RemAIDeck:True SVar:Rarity:Common SVar:Picture:http://www.wizards.com/global/images/magic/general/silhana_starfletcher.jpg SetInfo:GPT|Common|http://magiccards.info/scans/en/gp/95.jpg diff --git a/src/main/java/forge/ComputerUtil.java b/src/main/java/forge/ComputerUtil.java index 2dae1d52d97..3d6e2bc25c3 100644 --- a/src/main/java/forge/ComputerUtil.java +++ b/src/main/java/forge/ComputerUtil.java @@ -920,7 +920,7 @@ public class ComputerUtil { * @return a {@link java.util.ArrayList} object. * @since 1.0.15 */ - public static ArrayList getProduceableColors(final AbilityMana m, final Player player) { + /*public static ArrayList getProduceableColors(final AbilityMana m, final Player player) { final ArrayList colors = new ArrayList(); // if the mana ability is not avaiable move to the next one @@ -949,7 +949,7 @@ public class ComputerUtil { } return colors; - } + }*/ /** *

@@ -1094,7 +1094,7 @@ public class ComputerUtil { * @return a {@link java.util.ArrayList} object. * @since 1.0.15 */ - public static ArrayList sortForNeeded(final ManaCost cost, final ArrayList manaAbilities, + /*public static ArrayList sortForNeeded(final ManaCost cost, final ArrayList manaAbilities, final Player player) { ArrayList colors; @@ -1145,7 +1145,7 @@ public class ComputerUtil { } return res; - } + }*/ /** *

@@ -1189,19 +1189,19 @@ public class ComputerUtil { colorlessSources.add(m); // find possible colors - if (m.canProduce("W") || m.isAnyMana()) { + if (m.canProduce("W")) { whiteSources.add(m); } - if (m.canProduce("U") || m.isAnyMana()) { + if (m.canProduce("U")) { blueSources.add(m); } - if (m.canProduce("B") || m.isAnyMana()) { + if (m.canProduce("B")) { blackSources.add(m); } - if (m.canProduce("R") || m.isAnyMana()) { + if (m.canProduce("R")) { redSources.add(m); } - if (m.canProduce("G") || m.isAnyMana()) { + if (m.canProduce("G")) { greenSources.add(m); } if (m.isSnow()) { diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryChoose.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryChoose.java index 5028c00c32c..9225a0b3735 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryChoose.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryChoose.java @@ -670,6 +670,9 @@ public final class AbilityFactoryChoose { if (logic.equals("MostProminentInHumanDeck")) { chosen = CardFactoryUtil.getMostProminentColor(AllZoneUtil.getCardsInGame().getController( AllZone.getHumanPlayer())); + } else if (logic.equals("MostProminentInComputerDeck")) { + chosen = CardFactoryUtil.getMostProminentColor(AllZoneUtil.getCardsInGame().getController( + AllZone.getComputerPlayer())); } else if (logic.equals("MostProminentInGame")) { chosen = CardFactoryUtil.getMostProminentColor(AllZoneUtil.getCardsInGame()); diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryMana.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryMana.java index 1924efcba35..e6fc353de26 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryMana.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryMana.java @@ -391,7 +391,6 @@ public class AbilityFactoryMana { private static String generatedMana(final AbilityMana abMana, final AbilityFactory af, final SpellAbility sa) { // Calculate generated mana here for stack description and resolving final HashMap params = af.getMapParams(); - final Card card = sa.getSourceCard(); int amount = params.containsKey("Amount") ? AbilityFactory.calculateAmount(af.getHostCard(), params.get("Amount"), sa) : 1; @@ -405,11 +404,6 @@ public class AbilityFactoryMana { baseMana = abMana.mana(); } - if (baseMana.equals("Chosen")) { - // this will only support 1 chosen color for now. - baseMana = InputPayManaCostUtil.getShortColorString(card.getChosenColor().get(0)); - } - if (params.containsKey("Bonus")) { // For mana abilities that get a bonus // Bonus currently MULTIPLIES the base amount. Base Amounts should @@ -769,7 +763,7 @@ public class AbilityFactoryMana { final ArrayList colors) { for (final String col : Constant.Color.ONLY_COLORS) { final String s = InputPayManaCostUtil.getShortColorString(col); - if ((ab.canProduce(s) || ab.isAnyMana()) && !colors.contains(col)) { + if (ab.canProduce(s) && !colors.contains(col)) { colors.add(col); } } diff --git a/src/main/java/forge/card/spellability/AbilityMana.java b/src/main/java/forge/card/spellability/AbilityMana.java index 3c7c012c81d..3fcadb13f34 100644 --- a/src/main/java/forge/card/spellability/AbilityMana.java +++ b/src/main/java/forge/card/spellability/AbilityMana.java @@ -25,6 +25,7 @@ import forge.Card; import forge.Player; import forge.card.cost.Cost; import forge.card.mana.ManaPool; +import forge.control.input.InputPayManaCostUtil; /** *

@@ -228,7 +229,7 @@ public abstract class AbilityMana extends AbilityActivated implements java.io.Se if (i != 0) { sb.append(" "); } - sb.append(this.origProduced); + sb.append(mana()); } } } @@ -243,6 +244,12 @@ public abstract class AbilityMana extends AbilityActivated implements java.io.Se * @return a {@link java.lang.String} object. */ public final String mana() { + if (this.origProduced.contains("Chosen")) { + if (this.getSourceCard() != null && !this.getSourceCard().getChosenColor().isEmpty()) { + return InputPayManaCostUtil.getShortColorString(this.getSourceCard() + .getChosenColor().get(0)); + } + } return this.origProduced; } @@ -367,7 +374,17 @@ public abstract class AbilityMana extends AbilityActivated implements java.io.Se * @return a boolean. */ public final boolean canProduce(final String s) { - //TODO: look at where this called from and take "Any" into account + if (isAnyMana()) { + return true; + } + + if (this.origProduced.contains("Chosen")) { + if (this.getSourceCard() != null && !this.getSourceCard().getChosenColor().isEmpty() + && InputPayManaCostUtil.getShortColorString(this.getSourceCard().getChosenColor().get(0)) + .contains(s)) { + return true; + } + } return this.origProduced.contains(s); } @@ -379,7 +396,8 @@ public abstract class AbilityMana extends AbilityActivated implements java.io.Se * @return a boolean. */ public final boolean isBasic() { - if (this.origProduced.length() != 1 && !this.origProduced.contains("Any")) { + if (this.origProduced.length() != 1 && !this.origProduced.contains("Any") + && !this.origProduced.contains("Chosen")) { return false; } diff --git a/src/main/java/forge/game/limited/BoosterDraftAI.java b/src/main/java/forge/game/limited/BoosterDraftAI.java index 8bca72ef62f..2a192e3ea4e 100644 --- a/src/main/java/forge/game/limited/BoosterDraftAI.java +++ b/src/main/java/forge/game/limited/BoosterDraftAI.java @@ -230,8 +230,7 @@ public class BoosterDraftAI { final ArrayList maList = typeList.get(i).getManaAbility(); for (int j = 0; j < maList.size(); j++) { if (maList.get(j).canProduce(this.playerColors.get(player).getMana1()) - || maList.get(j).canProduce(this.playerColors.get(player).getMana2()) - || maList.get(j).isAnyMana()) { + || maList.get(j).canProduce(this.playerColors.get(player).getMana2())) { wouldPick.add(typeList.get(i)); } } diff --git a/src/main/java/forge/game/limited/SealedDeck.java b/src/main/java/forge/game/limited/SealedDeck.java index 40db034078f..c79ff5a4eea 100644 --- a/src/main/java/forge/game/limited/SealedDeck.java +++ b/src/main/java/forge/game/limited/SealedDeck.java @@ -325,8 +325,7 @@ public class SealedDeck { public boolean addCard(final Card c) { final ArrayList maList = c.getManaAbility(); for (int j = 0; j < maList.size(); j++) { - if (maList.get(j).canProduce(aiDC.mana1) || maList.get(j).canProduce(aiDC.mana2) - || maList.get(j).isAnyMana()) { + if (maList.get(j).canProduce(aiDC.mana1) || maList.get(j).canProduce(aiDC.mana2)) { return true; } }