From f16251d046b89fcb3577c46d547bc9e1a00c531a Mon Sep 17 00:00:00 2001 From: Agetian Date: Mon, 9 Oct 2017 09:35:35 +0000 Subject: [PATCH] - A bit more Extraplanar Lens logic. --- .../src/main/java/forge/ai/SpecialCardAi.java | 40 +++++++++++++++++++ .../java/forge/ai/ability/ChangeZoneAi.java | 2 + .../res/cardsfolder/e/extraplanar_lens.txt | 4 +- 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/SpecialCardAi.java b/forge-ai/src/main/java/forge/ai/SpecialCardAi.java index 2906ea77da9..84e7d75897c 100644 --- a/forge-ai/src/main/java/forge/ai/SpecialCardAi.java +++ b/forge-ai/src/main/java/forge/ai/SpecialCardAi.java @@ -427,6 +427,46 @@ public class SpecialCardAi { } } + // Extraplanar Lens + public static class ExtraplanarLens { + public static boolean consider(final Player ai, final SpellAbility sa) { + Card bestBasic = null; + Card bestBasicSelfOnly = null; + + CardCollection aiLands = CardLists.filter(ai.getCardsIn(ZoneType.Battlefield), CardPredicates.Presets.LANDS_PRODUCING_MANA); + CardCollection oppLands = CardLists.filter(ai.getOpponents().getCardsIn(ZoneType.Battlefield), + CardPredicates.Presets.LANDS_PRODUCING_MANA); + + int bestCount = 0; + int bestSelfOnlyCount = 0; + for (String landType : MagicColor.Constant.BASIC_LANDS) { + CardCollection landsOfType = CardLists.filter(aiLands, CardPredicates.nameEquals(landType)); + CardCollection oppLandsOfType = CardLists.filter(oppLands, CardPredicates.nameEquals(landType)); + + int numCtrl = CardLists.filter(aiLands, CardPredicates.nameEquals(landType)).size(); + if (numCtrl > bestCount) { + bestCount = numCtrl; + bestBasic = ComputerUtilCard.getWorstLand(landsOfType); + } + if (numCtrl > bestSelfOnlyCount && numCtrl > 1 && oppLandsOfType.isEmpty() && bestBasicSelfOnly == null) { + bestSelfOnlyCount = numCtrl; + bestBasicSelfOnly = ComputerUtilCard.getWorstLand(landsOfType); + } + } + + sa.resetTargets(); + if (bestBasicSelfOnly != null) { + sa.getTargets().add(bestBasicSelfOnly); + return true; + } else if (bestBasic != null) { + sa.getTargets().add(bestBasic); + return true; + } + + return false; + } + } + // Force of Will public static class ForceOfWill { public static boolean consider(final Player ai, final SpellAbility sa) { diff --git a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java index 2a1ef1e84a2..e564ad1a49d 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java @@ -1373,6 +1373,8 @@ public class ChangeZoneAi extends SpellAbilityAi { private static boolean knownOriginTriggerAI(final Player ai, final SpellAbility sa, final boolean mandatory) { if ("DeathgorgeScavenger".equals(sa.getParam("AILogic"))) { return SpecialCardAi.DeathgorgeScavenger.consider(ai, sa); + } else if ("ExtraplanarLens".equals(sa.getParam("AILogic"))) { + return SpecialCardAi.ExtraplanarLens.consider(ai, sa); } if (sa.getTargetRestrictions() == null) { diff --git a/forge-gui/res/cardsfolder/e/extraplanar_lens.txt b/forge-gui/res/cardsfolder/e/extraplanar_lens.txt index ae919d9590f..e45311711a4 100644 --- a/forge-gui/res/cardsfolder/e/extraplanar_lens.txt +++ b/forge-gui/res/cardsfolder/e/extraplanar_lens.txt @@ -2,12 +2,12 @@ Name:Extraplanar Lens ManaCost:3 Types:Artifact T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigExile | OptionalDecider$ You | TriggerDescription$ Imprint — When CARDNAME enters the battlefield, you may exile target land you control. -SVar:TrigExile:DB$ ChangeZone | Imprint$ True | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Land.YouCtrl | TgtPrompt$ Select a target land you control | AILogic$ Always +SVar:TrigExile:DB$ ChangeZone | Imprint$ True | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Land.YouCtrl | TgtPrompt$ Select a target land you control | AILogic$ ExtraplanarLens T:Mode$ TapsForMana | ValidCard$ Land.sharesNameWith Imprinted | Execute$ TrigMana | TriggerZones$ Battlefield | Static$ True | TriggerDescription$ Whenever a land with the same name as the exiled card is tapped for mana, its controller adds one mana to his or her mana pool of any type that land produced. SVar:TrigMana:DB$ ManaReflected | Valid$ Defined.Triggered | ColorOrType$ Type | ReflectProperty$ Produced | Defined$ TriggeredPlayer T:Mode$ ChangesZone | Origin$ Battlefield | ValidCard$ Card.Self | Destination$ Any | Execute$ DBCleanup | Static$ True SVar:DBCleanup:DB$ Cleanup | ClearImprinted$ True -SVar:NeedsToPlay:Land.YouCtrl+canProduceMana +SVar:NeedsToPlay:Land.Basic+YouCtrl+canProduceMana SVar:RemRandomDeck:True SVar:Picture:http://www.wizards.com/global/images/magic/general/extraplanar_lens.jpg Oracle:Imprint — When Extraplanar Lens enters the battlefield, you may exile target land you control.\nWhenever a land with the same name as the exiled card is tapped for mana, its controller adds one mana to his or her mana pool of any type that land produced.