From df39503a0b98b3b9789dee81c025deb3c7352ca3 Mon Sep 17 00:00:00 2001 From: Alex Vasile <48962821+Alex-Vasile@users.noreply.github.com> Date: Tue, 12 Jul 2022 21:16:55 -0400 Subject: [PATCH] Reduce CPU cost of BecomesAllBasicsControlledEffect. (#9263) --- .../BecomesAllBasicsControlledEffect.java | 46 +++++++++++-------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesAllBasicsControlledEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesAllBasicsControlledEffect.java index 1ec7aa0389d..3952a1ef9fd 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesAllBasicsControlledEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/BecomesAllBasicsControlledEffect.java @@ -8,6 +8,9 @@ import mage.filter.StaticFilters; import mage.game.Game; import mage.game.permanent.Permanent; +import java.util.ArrayList; +import java.util.List; + /** * @author TheElk801 */ @@ -36,27 +39,32 @@ public class BecomesAllBasicsControlledEffect extends ContinuousEffectImpl { public boolean apply(Game game, Ability source) { for (Permanent permanent : game.getBattlefield().getActivePermanents( StaticFilters.FILTER_CONTROLLED_PERMANENT_LAND, source.getControllerId(), game)) { - permanent.addSubType(game, - SubType.PLAINS, - SubType.ISLAND, - SubType.SWAMP, - SubType.MOUNTAIN, + permanent.addSubType(game, + SubType.PLAINS, + SubType.ISLAND, + SubType.SWAMP, + SubType.MOUNTAIN, SubType.FOREST); - - if (!permanent.getAbilities().containsRule(new WhiteManaAbility())) { - permanent.addAbility(new WhiteManaAbility(), source.getSourceId(), game); + // Optimization. + // Remove basic mana abilities since they are redundant with AnyColorManaAbility + // and keeping them will only produce too many combinations inside ManaOptions + Ability[] basicManaAbilities = new Ability[]{ + new WhiteManaAbility(), + new BlueManaAbility(), + new BlackManaAbility(), + new RedManaAbility(), + new GreenManaAbility() + }; + for (Ability basicManaAbility : basicManaAbilities) { + if (permanent.getAbilities(game).containsRule(basicManaAbility)) { + permanent.removeAbility(basicManaAbility, source.getSourceId(), game); + } } - if (!permanent.getAbilities().containsRule(new BlueManaAbility())) { - permanent.addAbility(new BlueManaAbility(), source.getSourceId(), game); - } - if (!permanent.getAbilities().containsRule(new BlackManaAbility())) { - permanent.addAbility(new BlackManaAbility(), source.getSourceId(), game); - } - if (!permanent.getAbilities().containsRule(new RedManaAbility())) { - permanent.addAbility(new RedManaAbility(), source.getSourceId(), game); - } - if (!permanent.getAbilities().containsRule(new GreenManaAbility())) { - permanent.addAbility(new GreenManaAbility(), source.getSourceId(), game); + // Add the {T}: Add one mana of any color ability + // This is functionally equivalent to having five "{T}: Add {COLOR}" for each COLOR in {W}{U}{B}{R}{G} + AnyColorManaAbility ability = new AnyColorManaAbility(); + if (!permanent.getAbilities(game).containsRule(ability)) { + permanent.addAbility(ability, source.getSourceId(), game); } } return true;