From 6568f75b987797983c33ba765d4cecc5b973e246 Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Sat, 25 Mar 2023 14:10:37 +0400 Subject: [PATCH] * First Come, First Served - fixed game error with tokens usage --- .../mage/cards/f/FirstComeFirstServed.java | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/Mage.Sets/src/mage/cards/f/FirstComeFirstServed.java b/Mage.Sets/src/mage/cards/f/FirstComeFirstServed.java index 8341e2905d4..d8ea30122af 100644 --- a/Mage.Sets/src/mage/cards/f/FirstComeFirstServed.java +++ b/Mage.Sets/src/mage/cards/f/FirstComeFirstServed.java @@ -1,9 +1,5 @@ - package mage.cards.f; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import java.util.UUID; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.continuous.GainAbilityAllEffect; import mage.abilities.keyword.FirstStrikeAbility; @@ -18,8 +14,11 @@ import mage.game.Game; import mage.game.permanent.Permanent; import mage.game.permanent.PermanentCard; +import java.util.UUID; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + /** - * * @author L_J */ public final class FirstComeFirstServed extends CardImpl { @@ -31,7 +30,7 @@ public final class FirstComeFirstServed extends CardImpl { } public FirstComeFirstServed(UUID ownerId, CardSetInfo setInfo) { - super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{1}{W}"); + super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}"); // Each attacking or blocking creature with the lowest collector number among attacking or blocking creatures has first strike. GainAbilityAllEffect gainEffect = new GainAbilityAllEffect(FirstStrikeAbility.getInstance(), Duration.WhileOnBattlefield, filter, false); @@ -51,14 +50,15 @@ public final class FirstComeFirstServed extends CardImpl { class FirstComeFirstServedPredicate implements Predicate { private static final Pattern partNumberPattern = Pattern.compile("\\d+"); - + @Override public boolean apply(Permanent input, Game game) { if (input instanceof PermanentCard) { int lowestNumber = Integer.MAX_VALUE; for (Permanent permanent : game.getBattlefield().getAllActivePermanents(new FilterAttackingOrBlockingCreature(), game)) { + // token don't have card number int number = parseCardNumber(permanent); - if (lowestNumber > number) { + if (number > 0 && lowestNumber > number) { lowestNumber = number; } } @@ -66,9 +66,13 @@ class FirstComeFirstServedPredicate implements Predicate { } return false; } - + public int parseCardNumber(Permanent input) { String str = input.getCardNumber(); + if (str == null || str.isEmpty()) { + // token don't have card number + return 0; + } Matcher matcher = partNumberPattern.matcher(str); if (matcher.find()) { return Integer.parseInt(matcher.group());