From 747e4e5569a02c73a3052d81ddc2cc284544dca4 Mon Sep 17 00:00:00 2001 From: theelk801 Date: Sun, 22 Jun 2025 16:25:54 -0400 Subject: [PATCH] rework CreateTokenAttachSourceEffect to properly handle multiple tokens being created --- .../common/CreateTokenAttachSourceEffect.java | 64 ++++++++++++++----- 1 file changed, 49 insertions(+), 15 deletions(-) diff --git a/Mage/src/main/java/mage/abilities/effects/common/CreateTokenAttachSourceEffect.java b/Mage/src/main/java/mage/abilities/effects/common/CreateTokenAttachSourceEffect.java index 11d45ac59f1..03bb35f6cff 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/CreateTokenAttachSourceEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/CreateTokenAttachSourceEffect.java @@ -1,12 +1,20 @@ package mage.abilities.effects.common; +import mage.MageItem; import mage.abilities.Ability; import mage.constants.Outcome; +import mage.filter.FilterPermanent; +import mage.filter.predicate.Predicates; +import mage.filter.predicate.permanent.PermanentIdPredicate; import mage.game.Game; import mage.game.permanent.Permanent; import mage.game.permanent.token.Token; +import mage.players.Player; +import mage.target.TargetPermanent; -import java.util.Optional; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; /** * @author weirddan455 @@ -42,22 +50,48 @@ public class CreateTokenAttachSourceEffect extends CreateTokenEffect { @Override public boolean apply(Game game, Ability source) { super.apply(game, source); - Permanent token = this - .getLastAddedTokenIds() - .stream() - .findFirst() - .map(game::getPermanent) - .orElse(null); - if (token == null || optional - && !Optional - .ofNullable(game.getPlayer(source.getControllerId())) - .map(player -> player.chooseUse( - Outcome.BoostCreature, "Attach the equipment to the token?", source, game - )) - .orElse(false)) { + Player player = game.getPlayer(source.getControllerId()); + Permanent equipment = source.getSourcePermanentIfItStillExists(game); + if (player == null + || equipment == null + || optional + && !player.chooseUse( + Outcome.BoostCreature, "Attach " + + equipment.getLogName() + " to the token?", source, game + )) { return false; } - token.addAttachment(source.getSourceId(), source, game); + List permanents = this + .getLastAddedTokenIds() + .stream() + .map(game::getPermanent) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + Permanent token; + switch (permanents.size()) { + case 0: + return false; + case 1: + token = permanents.get(0); + break; + default: + FilterPermanent filter = new FilterPermanent("token"); + filter.add(Predicates.or( + permanents + .stream() + .map(MageItem::getId) + .map(PermanentIdPredicate::new) + .collect(Collectors.toSet()) + )); + TargetPermanent target = new TargetPermanent(filter); + target.withNotTarget(true); + target.withChooseHint("to attach to"); + player.choose(outcome, target, source, game); + token = game.getPermanent(target.getFirstTarget()); + } + if (token != null) { + token.addAttachment(source.getSourceId(), source, game); + } return true; } }